{
  "version": 3,
  "sources": ["../../src/web/components/Separator.styles.ts", "../../src/web/components/Separator.tsx", "../../src/document/components/chrome/siteSettings/Plans/Stripe/api/subscriptions.ts", "../../src/document/components/chrome/siteSettings/Plans/Stripe/api/errors/overEditorLimitError.ts", "../../src/document/components/chrome/siteSettings/Plans/Stripe/api/errors/cantMoveAddOnError.ts", "../../src/document/components/chrome/siteSettings/Plans/Stripe/api/errors/invalidPromotionCodeError.ts", "../../src/document/components/chrome/siteSettings/Plans/Stripe/api/errors/teamStripeSubscriptionMissingError.ts", "../../src/document/components/chrome/siteSettings/Plans/Stripe/api/checkoutPreview.ts", "../../src/document/components/chrome/siteSettings/SettingSection.tsx", "../../src/document/components/chrome/siteSettings/SettingSection.styles.ts", "../../src/document/components/chrome/analytics/components/AnalyticsTable.tsx", "../../src/document/components/chrome/analytics/components/AnalyticsTable.styles.ts", "../../src/document/components/chrome/siteSettings/Plans/utils/formatPrice.ts", "../../src/web/components/PriceItemRow.styles.ts", "../../src/web/components/PriceItemRow.tsx", "../../src/document/components/chrome/siteSettings/Plans/Stripe/showPaymentErrorToast.ts", "../../src/document/components/chrome/siteSettings/Plans/Stripe/components/InlinePaymentError.styles.ts", "../../src/document/components/chrome/siteSettings/Plans/Stripe/components/InlineError.tsx", "../../src/document/components/chrome/siteSettings/Plans/Stripe/components/InlinePaymentError.tsx", "../../src/document/components/chrome/shared/UpsellModal/EnterpriseUpsellModal.tsx", "../../src/document/components/chrome/shared/UpsellModal/EnterpriseUpsellModal.styles.ts", "../../src/document/components/chrome/siteSettings/Plans/Stripe/api/projectSubscription.ts"],
  "sourcesContent": ["import \"Separator.styles_15unbwy.wyw.css\"; export const separator = \"separator_s1b648c0\";", "import * as styles from \"./Separator.styles.ts\"\n\ninterface Props {\n\theight: number\n}\n\nexport function Separator({ height }: Props) {\n\treturn (\n\t\t<div\n\t\t\tclassName={styles.separator}\n\t\t\tstyle={{\n\t\t\t\theight,\n\t\t\t\ttop: -((height - 1) / 2),\n\t\t\t}}\n\t\t/>\n\t)\n}\n", "import type { AddOnLicenseType, ProjectLicensePeriod } from \"@framerjs/app-shared\"\nimport { delay, getServiceMap } from \"@framerjs/shared\"\nimport { apiFetcher } from \"web/lib/apiFetcher.ts\"\nimport type { PollTeamSubscriptionProps } from \"./teamSubscription.ts\"\n\n/**\n * \uD83D\uDD34 This file is also used by Dashboard components. Please do not import the engine here.\n */\n\nexport enum SubscriptionStatus {\n\tActive = \"active\",\n\tPastDue = \"past_due\",\n\tPaused = \"paused\",\n\tCancelled = \"cancelled\",\n\tCancelledAndRefunded = \"cancelled_and_refunded\",\n}\n\nexport interface CurrentSiteSubscription {\n\tperiod: ProjectLicensePeriod\n\tcurrency: string\n\tnextBillDate: Date\n\tstatus: SubscriptionStatus\n}\n\nexport interface CurrentAddOn {\n\tplan: string\n\tlicenseType: AddOnLicenseType\n\tquantity: number\n}\n\nexport interface SiteSubscriptionResponse {\n\tcurrentSubscription: CurrentSiteSubscription | null\n\tcurrentAddOns: CurrentAddOn[]\n}\n\nexport async function getSiteSubscription(projectId: string): Promise<SiteSubscriptionResponse> {\n\tconst res = await apiFetcher.get(`/web/v2/projects/${projectId}/subscription`)\n\tif (res.currentSubscription) res.currentSubscription.nextBillDate = new Date(res.currentSubscription.nextBillDate)\n\treturn res\n}\n\nexport interface PollSiteSubscriptionProps {\n\tany?: true\n\tperiod?: ProjectLicensePeriod\n\tstatus?: SubscriptionStatus\n}\n\nexport interface PollUpdateProps {\n\tsite?: PollSiteSubscriptionProps\n\tteam?: PollTeamSubscriptionProps\n}\n\nconst attempts = 10\nconst interval = 3000\n\nconst siteStopCondition = (newSubscription: PollSiteSubscriptionProps, latest: CurrentSiteSubscription | null) => {\n\tconst matchesAny = latest !== null\n\tconst matchesPeriod = !newSubscription.period || newSubscription.period === latest?.period\n\tconst matchesStatus = !newSubscription.status || newSubscription.status === latest?.status\n\treturn matchesAny && matchesPeriod && matchesStatus\n}\n\nexport async function pollSiteSubscription(\n\tprojectId: string,\n\tonPollComplete: (updatedSubscription: SiteSubscriptionResponse) => void,\n\tnewSubscription: PollSiteSubscriptionProps,\n): Promise<void> {\n\tfor (let i = 0; i < attempts; ++i) {\n\t\tconst res = await getSiteSubscription(projectId)\n\t\tif (siteStopCondition(newSubscription, res.currentSubscription)) {\n\t\t\tonPollComplete(res)\n\t\t\treturn\n\t\t}\n\t\tawait delay(interval)\n\t}\n\tthrow new Error(\"pollSiteSubscription exceeded the number of attempts\")\n}\n\nexport function getBillingPortalUrl(teamId: string): string {\n\treturn `${getServiceMap().api}/web/teams/${teamId}/access-customer-portal?source=web`\n}\n", "import { ApiError } from \"@framerjs/app-shared\"\n\n/**\n * PaymentsService responds with this error on post-checkout preview or updating subscription,\n * when the change would lower the workspace editor limit below the current number of workspace editors.\n */\ninterface OverEditorLimitError extends ApiError {\n\tstatus: 400\n\tdata: {\n\t\treason: \"over_editor_limit\"\n\t\t/** What the limit would be if plan update was successful */\n\t\tlimit: number\n\t\tcurrent: number\n\t}\n}\n\n/**\n * PaymentsService responds with this error when the change would lower the project editor limit\n * below the current number of editors on the project.\n */\ninterface OverProjectEditorLimitError extends ApiError {\n\tstatus: 400\n\tdata: {\n\t\treason: \"project_editor_limit_exceeded\"\n\t\tlimit: number\n\t\tcurrent: number\n\t}\n}\n\nexport function isOverEditorLimitError(error: unknown): error is OverEditorLimitError {\n\tif (!(error instanceof ApiError)) return false\n\tif (error.status !== 400) return false\n\tif (error.data.reason !== \"over_editor_limit\") return false\n\tif (typeof error.data.limit !== \"number\") return false\n\tif (typeof error.data.current !== \"number\") return false\n\treturn true\n}\n\nexport function isOverProjectEditorLimitError(error: unknown): error is OverProjectEditorLimitError {\n\tif (!(error instanceof ApiError)) return false\n\tif (error.status !== 400) return false\n\tif (error.data.reason !== \"project_editor_limit_exceeded\") return false\n\tif (typeof error.data.limit !== \"number\") return false\n\tif (typeof error.data.current !== \"number\") return false\n\treturn true\n}\n", "import { ApiError, isValidAddOnLicense } from \"@framerjs/app-shared\"\nimport type { AddOnLicenseType } from \"@framerjs/app-shared\"\n\n/**\n * PaymentsService responds with this error on post-checkout preview or updating subscription,\n * when an add-on can not be moved to a lower level plan as they might not allow the related add-on.\n */\ninterface CantMoveAddOnError extends ApiError {\n\tstatus: 400\n\tdata: {\n\t\treason: \"cannot_move_add_on\"\n\t\taddOnLicenseType: AddOnLicenseType\n\t}\n}\nexport function isCantMoveAddOnError(error: unknown): error is CantMoveAddOnError {\n\tif (!(error instanceof ApiError)) return false\n\tif (error.status !== 400) return false\n\tif (error.data.reason !== \"cannot_move_add_on\") return false\n\tif (!isValidAddOnLicense(error.data.addOnLicenseType as string | undefined)) return false\n\treturn true\n}\n", "import { ApiError } from \"@framerjs/app-shared\"\n\ninterface InvalidPromotionCodeError extends ApiError {\n\tstatus: 400\n\tdata: {\n\t\treason: \"invalid_or_expired_promotion_code\" | \"invalid_or_ineligible_promotion_code\"\n\t}\n}\n\nexport function isInvalidPromotionCodeError(error: unknown): error is InvalidPromotionCodeError {\n\tif (!(error instanceof ApiError)) return false\n\tif (error.status !== 400) return false\n\tif (\n\t\terror.data.reason !== \"invalid_or_expired_promotion_code\" &&\n\t\terror.data.reason !== \"invalid_or_ineligible_promotion_code\"\n\t) {\n\t\treturn false\n\t}\n\treturn true\n}\n", "import { ApiError } from \"@framerjs/app-shared\"\n\n/**\n PaymentsService responds with this error on post-checkout preview or updating subscription,\n when there's not a single ongoing Stripe subscription for the team, so we should instead have the user\n go through the Stripe checkout.\n */\ninterface StripeSubscriptionMissingError extends ApiError {\n\tstatus: 409\n\tdata: {\n\t\treason: \"no_ongoing_stripe_subscription_for_team\"\n\t}\n}\nexport function isStripeSubscriptionMissingError(error: unknown): error is StripeSubscriptionMissingError {\n\tif (!(error instanceof ApiError)) return false\n\tif (error.status !== 409) return false\n\tif (error.data.reason !== \"no_ongoing_stripe_subscription_for_team\") return false\n\treturn true\n}\n", "import type { ProjectLicenseType, TeamLicenseType, AddOnLicenseType, TeamAddOnLicenseType } from \"@framerjs/app-shared\"\nimport {\n\tApiError,\n\tHTTP_ERROR_CODES,\n\tProjectLicensePeriod,\n\tisValidAddOnLicense,\n\tisValidProjectLicense,\n\tisValidTeamAddOnLicense,\n\tisValidTeamLicense,\n} from \"@framerjs/app-shared\"\nimport { getLogger } from \"@framerjs/shared\"\nimport { isAbortError } from \"web/lib/Fetcher.ts\"\nimport { apiFetcher } from \"web/lib/apiFetcher.ts\"\nimport { isCantMoveAddOnError } from \"./errors/cantMoveAddOnError.ts\"\nimport { isInvalidPromotionCodeError } from \"./errors/invalidPromotionCodeError.ts\"\nimport { isOverEditorLimitError, isOverProjectEditorLimitError } from \"./errors/overEditorLimitError.ts\"\nimport { isStripeSubscriptionMissingError } from \"./errors/teamStripeSubscriptionMissingError.ts\"\n\nconst log = getLogger(\"checkoutPreview\")\n\ninterface CheckoutPreviewItemApiResponse {\n\tquantity: number\n\tamountWithoutProration: string\n\tproration?: string\n\tunitAmount: string\n\tlicenseType: TeamLicenseType | ProjectLicenseType | AddOnLicenseType | TeamAddOnLicenseType\n\tunitsPerQuantity?: number\n}\n\ninterface CheckoutPreviewApiResponse<D = string, T = string> {\n\ttotal: T\n\tsubtotal: T\n\ttax: T | null\n\tcredit: T // E.g. \"-18.15\"\n\ttotalWithCredit: T\n\tdiscount?: T\n\titems: CheckoutPreviewItemApiResponse[]\n\tnextBillDate: D\n\tcurrency: string\n\tperiod: ProjectLicensePeriod\n}\n\ntype CheckoutPreviewItem = CheckoutPreviewItemApiResponse & { totalAmount: number }\n\nexport interface CheckoutPreview extends Omit<CheckoutPreviewApiResponse<Date, number>, \"items\"> {\n\tplanId: string\n\tproration: number\n\tappliedCredit: number\n\tcreditedAmount: number\n\tdiscount: number\n\titems: TransformedItemList\n}\n\nenum GroupLicenseKeys {\n\tplan = \"plan\",\n\teditor = \"editor\",\n\taddons = \"addons\",\n\tteamAddons = \"teamAddons\",\n}\n\ninterface TransformedItemList {\n\t[GroupLicenseKeys.plan]: ProjectItem | null\n\t[GroupLicenseKeys.editor]: TeamItem | null\n\t[GroupLicenseKeys.addons]: AddOnItem[] | null\n\t[GroupLicenseKeys.teamAddons]: TeamAddOnItem[] | null\n}\n\ntype ProjectItem = CheckoutPreviewItem & { licenseType: ProjectLicenseType }\ntype TeamItem = CheckoutPreviewItem & { licenseType: TeamLicenseType; proration?: string }\ntype AddOnItem = CheckoutPreviewItem & { licenseType: AddOnLicenseType }\ntype TeamAddOnItem = CheckoutPreviewItem & { licenseType: TeamAddOnLicenseType }\nexport enum CheckoutPreviewStatus {\n\tSuccess,\n\tInvalidPromotionCode,\n\tOverEditorLimitError,\n\tOverProjectEditorLimitError,\n\tCantMoveAddOnError,\n\tStripeSubscriptionMissingError,\n\tUnauthorizedError,\n\tUnhandledError,\n\tAborted,\n}\n\ninterface CheckoutPreviewRequest {\n\tprojectId: string\n\tplanId?: string\n\tperiod: ProjectLicensePeriod\n\taddOns?: { plan: string; quantity: number }[]\n\tisBillingV3: boolean\n\tpromotionCode?: string\n}\n\ntype CheckoutPreviewResponse =\n\t| {\n\t\t\tstatus: CheckoutPreviewStatus.Success\n\t\t\t[ProjectLicensePeriod.Month]?: CheckoutPreview\n\t\t\t[ProjectLicensePeriod.Year]?: CheckoutPreview\n\t  }\n\t| { status: CheckoutPreviewStatus.InvalidPromotionCode }\n\t| {\n\t\t\tstatus: CheckoutPreviewStatus.OverEditorLimitError\n\t\t\t/** What the limit would be if previewed plan update was successful */\n\t\t\tnewLimit: number\n\t\t\tcurrentEditorCount: number\n\t  }\n\t| {\n\t\t\tstatus: CheckoutPreviewStatus.OverProjectEditorLimitError\n\t\t\tnewLimit: number\n\t\t\tcurrentEditorCount: number\n\t  }\n\t| {\n\t\t\tstatus: CheckoutPreviewStatus.CantMoveAddOnError\n\t\t\taddOnLicenseType: AddOnLicenseType\n\t  }\n\t| { status: CheckoutPreviewStatus.StripeSubscriptionMissingError }\n\t| { status: CheckoutPreviewStatus.UnauthorizedError }\n\t| { status: CheckoutPreviewStatus.UnhandledError }\n\t| { status: CheckoutPreviewStatus.Aborted }\n\nfunction isEditorItem(item: CheckoutPreviewItemApiResponse): item is TeamItem {\n\treturn isValidTeamLicense(item.licenseType)\n}\n\nfunction isPlanItem(item: CheckoutPreviewItemApiResponse): item is ProjectItem {\n\treturn isValidProjectLicense(item.licenseType)\n}\n\nfunction isAddOnItem(item: CheckoutPreviewItemApiResponse): item is AddOnItem {\n\treturn isValidAddOnLicense(item.licenseType)\n}\n\nfunction isTeamAddOnItem(item: CheckoutPreviewItemApiResponse): item is TeamAddOnItem {\n\treturn isValidTeamAddOnLicense(item.licenseType)\n}\n\nexport function transformPreviewResponseBody(\n\tres: CheckoutPreviewApiResponse,\n\t{\n\t\tomitFirstEditorFromCalculation = true,\n\t}: {\n\t\tomitFirstEditorFromCalculation?: boolean\n\t} = {},\n): Omit<CheckoutPreview, \"planId\"> {\n\tconst transformedItems: TransformedItemList = {\n\t\t[GroupLicenseKeys.editor]: null,\n\t\t[GroupLicenseKeys.addons]: null,\n\t\t[GroupLicenseKeys.plan]: null,\n\t\t// ** Team level add-ons supported by billing v3 */\n\t\t[GroupLicenseKeys.teamAddons]: null,\n\t}\n\n\tlet lineItemTotalPrice = 0\n\n\tfor (const item of res.items) {\n\t\t// We need to deduct the quantity of the editors because the first one is free but even being free and counting it will increase the totalAmount + unitAmount of the item that is free.\n\t\tconst quantityUsedForCalculateTotalAmount =\n\t\t\tisValidTeamLicense(item.licenseType) && item.quantity >= 1 && omitFirstEditorFromCalculation\n\t\t\t\t? item.quantity - 1\n\t\t\t\t: item.quantity\n\n\t\tconst totalAmount = parseFloat(item.unitAmount) * quantityUsedForCalculateTotalAmount\n\n\t\tconst transformedItem = {\n\t\t\t...item,\n\t\t\ttotalAmount,\n\t\t}\n\n\t\tif (isAddOnItem(transformedItem)) {\n\t\t\ttransformedItems.addons = [...(transformedItems.addons || []), transformedItem]\n\t\t}\n\n\t\tif (isTeamAddOnItem(transformedItem)) {\n\t\t\ttransformedItems.teamAddons = [...(transformedItems.teamAddons || []), transformedItem]\n\t\t}\n\n\t\tif (isPlanItem(transformedItem)) {\n\t\t\ttransformedItems.plan = transformedItem\n\t\t}\n\n\t\tif (isEditorItem(transformedItem)) {\n\t\t\ttransformedItems.editor = transformedItem\n\t\t}\n\n\t\t// Calculate the total price\n\t\tlineItemTotalPrice += totalAmount\n\t}\n\n\treturn {\n\t\t...res,\n\t\titems: transformedItems,\n\t\tnextBillDate: new Date(res.nextBillDate),\n\t\ttotal: parseFloat(res.total),\n\t\tsubtotal: parseFloat(res.subtotal),\n\t\ttax: res.tax ? parseFloat(res.tax) : null,\n\t\tproration:\n\t\t\tparseFloat(res.total) < 0 || lineItemTotalPrice === 0 ? 0 : parseFloat(res.subtotal) - lineItemTotalPrice,\n\t\tcredit: parseFloat(res.credit),\n\t\tdiscount: res.discount ? parseFloat(res.discount) : 0,\n\t\tappliedCredit: parseFloat(res.totalWithCredit) - parseFloat(res.total),\n\t\ttotalWithCredit: parseFloat(res.totalWithCredit),\n\t\tcreditedAmount: parseFloat(res.total) < 0 ? -parseFloat(res.total) : 0,\n\t}\n}\n\nasync function postCheckoutPreview(req: CheckoutPreviewRequest, signal?: AbortSignal): Promise<CheckoutPreview> {\n\tconst { projectId, planId, addOns, isBillingV3, promotionCode } = req\n\tconst url = isBillingV3\n\t\t? `/web/v4/projects/${projectId}/subscription/preview`\n\t\t: `/web/v3/projects/${projectId}/subscription/preview`\n\tconst body: Record<string, unknown> = {}\n\tif (planId) body.plan = planId\n\tif (addOns && addOns.length > 0) body.addOns = addOns\n\tif (promotionCode) body.promotionCode = promotionCode\n\tconst res: CheckoutPreviewApiResponse = await apiFetcher.post(url, body, signal)\n\n\treturn {\n\t\tplanId: req.planId ?? \"\",\n\t\t...transformPreviewResponseBody(res),\n\t}\n}\n\n/**\n * This function is used to post multiple checkout previews at once depending on if we need to show the monthly or yearly preview tabs on the preview state.\n */\nexport async function postCheckoutPreviews(\n\treq: CheckoutPreviewRequest[],\n\tsignal?: AbortSignal,\n): Promise<CheckoutPreviewResponse> {\n\ttry {\n\t\tconst res = await Promise.all(req.map(r => postCheckoutPreview(r, signal)))\n\n\t\treturn {\n\t\t\tstatus: CheckoutPreviewStatus.Success,\n\t\t\t[ProjectLicensePeriod.Month]: res.find(value => value.period === ProjectLicensePeriod.Month),\n\t\t\t[ProjectLicensePeriod.Year]: res.find(value => value.period === ProjectLicensePeriod.Year),\n\t\t}\n\t} catch (error) {\n\t\tif (error instanceof ApiError && error.status === HTTP_ERROR_CODES.Forbidden) {\n\t\t\treturn { status: CheckoutPreviewStatus.UnauthorizedError }\n\t\t}\n\t\tif (isOverEditorLimitError(error)) {\n\t\t\treturn {\n\t\t\t\tstatus: CheckoutPreviewStatus.OverEditorLimitError,\n\t\t\t\tnewLimit: error.data.limit,\n\t\t\t\tcurrentEditorCount: error.data.current,\n\t\t\t}\n\t\t}\n\t\tif (isOverProjectEditorLimitError(error)) {\n\t\t\treturn {\n\t\t\t\tstatus: CheckoutPreviewStatus.OverProjectEditorLimitError,\n\t\t\t\tnewLimit: error.data.limit,\n\t\t\t\tcurrentEditorCount: error.data.current,\n\t\t\t}\n\t\t}\n\t\tif (isCantMoveAddOnError(error)) {\n\t\t\treturn {\n\t\t\t\tstatus: CheckoutPreviewStatus.CantMoveAddOnError,\n\t\t\t\taddOnLicenseType: error.data.addOnLicenseType,\n\t\t\t}\n\t\t}\n\t\tif (isStripeSubscriptionMissingError(error)) {\n\t\t\treturn {\n\t\t\t\tstatus: CheckoutPreviewStatus.StripeSubscriptionMissingError,\n\t\t\t}\n\t\t}\n\t\tif (isInvalidPromotionCodeError(error)) {\n\t\t\treturn { status: CheckoutPreviewStatus.InvalidPromotionCode }\n\t\t}\n\t\tif (isAbortError(error)) {\n\t\t\treturn { status: CheckoutPreviewStatus.Aborted }\n\t\t}\n\t\tlog.reportError(error)\n\t\treturn { status: CheckoutPreviewStatus.UnhandledError }\n\t}\n}\n", "import { HandleClickOnClick } from \"@framerjs/app-shared/src/PreferMouseDown.tsx\"\nimport { Button, Stack, Translatable as T, Text } from \"@framerjs/fresco\"\nimport { cx } from \"@linaria/core\"\nimport type React from \"react\"\nimport { forwardRef } from \"react\"\nimport * as styles from \"./SettingSection.styles.ts\"\n\ninterface HeaderProps {\n\tbadge?: React.ReactNode\n\ttitle?: string\n\ttitleBadge?: React.ReactNode\n\t/** divider between the header and the body, automatically shown in the `compact` mode */\n\tdivider?: boolean\n\t/** action components in the header, by default this would be a save button that can be controlled by saveEnabled and onSave. If you don't want to render anything, pass in null.  */\n\taction?: React.ReactNode\n\tdescription?: React.ReactNode\n\tsaveEnabled?: boolean\n\t/** when `true`, adds the 30 padding and shows the divider. */\n\tcompact?: boolean\n\t/** when `true`, adds the 30 bottom padding. */\n\tempty?: boolean\n\tonSave?: () => void\n}\n\ninterface Props extends HeaderProps {\n\t/** Overrides the gap between children, ignoring the gap set by the `compact` prop */\n\tgap?: number\n\t/** when `true`, removes the padding and the gap between children, that are set to 30px by default.\n    Adds 30px padding and the divider to the header. */\n\tcompact?: boolean\n\tclassName?: string\n\tchildren?: React.ReactNode\n\t\"data-scroll-target\"?: string\n}\n\n/** Displays a section of elements with a header */\nexport const SettingSection = forwardRef<HTMLDivElement, Props>(function SettingsSection(props, ref) {\n\tconst {\n\t\ttitle,\n\t\ttitleBadge,\n\t\tgap,\n\t\tdivider,\n\t\taction,\n\t\tdescription,\n\t\tchildren,\n\t\tsaveEnabled,\n\t\tclassName,\n\t\tonSave,\n\t\tcompact,\n\t\tbadge,\n\t\tempty,\n\t\t\"data-scroll-target\": dataScrollTarget,\n\t} = props\n\tconst gapValue = gap ?? (compact ? 0 : 30)\n\tconst nonEmptyHeader = Boolean(title || action || description)\n\treturn (\n\t\t<SettingSectionContainer compact={compact} className={className} data-scroll-target={dataScrollTarget}>\n\t\t\t{nonEmptyHeader && (\n\t\t\t\t<SettingSectionHeader\n\t\t\t\t\tcompact={compact}\n\t\t\t\t\tdivider={divider}\n\t\t\t\t\tbadge={badge}\n\t\t\t\t\ttitle={title}\n\t\t\t\t\ttitleBadge={titleBadge}\n\t\t\t\t\taction={action}\n\t\t\t\t\tsaveEnabled={saveEnabled}\n\t\t\t\t\tonSave={onSave}\n\t\t\t\t\tdescription={description}\n\t\t\t\t\tempty={empty}\n\t\t\t\t\tref={ref}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{children && <Stack gap={gapValue}>{children}</Stack>}\n\t\t</SettingSectionContainer>\n\t)\n})\n\ninterface ContainerProps {\n\tclassName?: string\n\t/** when `true`, removes the padding and the gap between children, that are set to 30 by default */\n\tcompact?: boolean\n\t\"data-scroll-target\"?: string\n}\n\nexport function SettingSectionContainer({\n\tclassName,\n\tcompact,\n\tchildren,\n\t\"data-scroll-target\": dataScrollTarget,\n}: React.PropsWithChildren<ContainerProps>) {\n\treturn (\n\t\t<Stack\n\t\t\tgap={compact ? 0 : 30}\n\t\t\tpadding={compact ? 0 : 30}\n\t\t\tclassName={cx(styles.container, className)}\n\t\t\tdata-scroll-target={dataScrollTarget}\n\t\t>\n\t\t\t{children}\n\t\t</Stack>\n\t)\n}\n\nconst getPaddingBottom = (paddingBottom = 30, hasPadding?: boolean, usePaddingBottom?: boolean) => {\n\t// due to a bug in React?, we need to make sure paddingBottom is `undefined` when `padding` is set,\n\t// as otherwise during a re-render, the paddingBottom will disappear even when setting to `30` explicitly.\n\n\t// Let the parent padding shorthand provide the bottom padding in this case.\n\tif (hasPadding && usePaddingBottom) return undefined\n\n\t// if we have a divider, or if empty and does not have padding, we need to set paddingBottom\n\tif (usePaddingBottom) return paddingBottom\n\n\treturn 0\n}\n\nexport const SettingSectionHeader = forwardRef<HTMLDivElement, HeaderProps>(function SettingsSectionHeader(props, ref) {\n\tconst { compact, divider, badge, title, titleBadge, action, saveEnabled, onSave, description, empty } = props\n\tconst showDivider = empty ? false : (divider ?? compact)\n\treturn (\n\t\t<Stack\n\t\t\tgap={15}\n\t\t\tpadding={compact ? 30 : undefined}\n\t\t\tpaddingBottom={getPaddingBottom(30, compact, showDivider || empty)}\n\t\t\tclassName={cx(showDivider && styles.headerWithDivider, compact && styles.headerCompact)}\n\t\t\tref={ref}\n\t\t>\n\t\t\t{badge}\n\t\t\t<Stack\n\t\t\t\tgap={0}\n\t\t\t\tdirection=\"row\"\n\t\t\t\tjustifyContent=\"space-between\"\n\t\t\t\talignItems=\"center\"\n\t\t\t\tclassName={cx(styles.headerTitle)}\n\t\t\t>\n\t\t\t\t{title && (\n\t\t\t\t\t<Stack direction=\"row\">\n\t\t\t\t\t\t<Text size={22} lineHeight={1.2} className={styles.title}>\n\t\t\t\t\t\t\t<T>{title}</T>\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t{titleBadge ? <div className={styles.titleBadge}>{titleBadge}</div> : null}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t\t{action === undefined ? (\n\t\t\t\t\t<HandleClickOnClick>\n\t\t\t\t\t\t<Button enabled={saveEnabled} onClick={onSave} bold className={styles.saveButton}>\n\t\t\t\t\t\t\t<T>Save</T>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</HandleClickOnClick>\n\t\t\t\t) : (\n\t\t\t\t\taction\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t\t{description && <div className={styles.description}>{description}</div>}\n\t\t</Stack>\n\t)\n})\n", "import \"SettingSection.styles_134daa.wyw.css\"; export const container = \"container_cvonk4f\";\nexport const headerTitle = \"headerTitle_ht6drtp\";\nexport const title = \"title_t1m35wmk\";\nexport const titleBadge = \"titleBadge_tum3hl1\";\nexport const headerWithDivider = \"headerWithDivider_h1lxfjb\";\nexport const headerCompact = \"headerCompact_h15duhcu\";\nexport const saveButton = \"saveButton_s1gyikt4\";\nexport const description = \"description_dicxzp3\";", "import { ScrollWithGradient, Stack, truncateWithEllipsis } from \"@framerjs/fresco\"\nimport { colors } from \"@framerjs/fresco/tokens\"\nimport { cx } from \"@linaria/core\"\nimport { tabularNumbers } from \"app/styles/typography.styles.ts\"\nimport type { UsageFilterOption } from \"document/components/chrome/siteSettings/Usage/types.ts\"\nimport { AnimatePresence, MotionConfig, motion } from \"framer-motion\"\nimport React from \"react\"\nimport { IconLinkFilledArrow } from \"../icons.tsx\"\nimport type { AnalyticsSectionFilterOption, AnalyticsTableData } from \"../types.ts\"\nimport { formatNumberCompactNotation } from \"../utils/formatUtils.ts\"\nimport { max } from \"../utils/max.ts\"\nimport * as styles from \"./AnalyticsTable.styles.ts\"\n\nexport enum AnalyticsTableKind {\n\tAnalytics = \"analytics\",\n\tUsage = \"usage\",\n}\n\ninterface BaseProps {\n\ttitle: string\n\tisLoading: boolean\n\tdisabled?: true\n\tdata: readonly AnalyticsTableData[]\n\taction?: React.ReactNode\n\tButtonOnHover?: React.ComponentType<{ value: string }>\n\tgradientColor?: string\n\tcountFormatter?: (value: number) => string\n}\n\ninterface AnalyticsProps extends BaseProps {\n\tkind: AnalyticsTableKind.Analytics\n\tsectionFilter: AnalyticsSectionFilterOption\n\tonClickRow: (filterKey: AnalyticsSectionFilterOption, filterValue: string, filterLabel: string) => void\n}\n\ninterface UsageProps extends BaseProps {\n\tkind: AnalyticsTableKind.Usage\n\tsectionFilter: UsageFilterOption\n\tonClickRow: (filterKey: UsageFilterOption, filterValue: string, filterLabel: string) => void\n}\n\n// Don't show the bar when it's smaller than 2%\nconst MINIMUM_PERCENTAGE = 2\n\nexport function AnalyticsTable({\n\ttitle,\n\tisLoading,\n\tdata,\n\tdisabled,\n\taction,\n\tsectionFilter,\n\tkind,\n\tonClickRow,\n\tButtonOnHover,\n\tcountFormatter,\n\t// Matches the default gradient color from ScrollWithGradient\n\tgradientColor = colors.panelBackground,\n}: AnalyticsProps | UsageProps) {\n\tconst [showPercentages, onHover] = React.useState(false)\n\tconst [hoveredRowIndex, setHoveredRowIndex] = React.useState<number | null>(null)\n\n\tconst maxCount = max(data, item => item.count ?? 1)\n\n\tconst content =\n\t\t!isLoading && data.length === 0 ? (\n\t\t\t<motion.div\n\t\t\t\tkey=\"emptyState\"\n\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\tclassName={styles.emptyState}\n\t\t\t>\n\t\t\t\tNo data available for the\n\t\t\t\t<br />\n\t\t\t\tselected filter or time period.\n\t\t\t</motion.div>\n\t\t) : (\n\t\t\t<table className={styles.table}>\n\t\t\t\t<tbody>\n\t\t\t\t\t{/* This enables an exit animation (bar shrinks to 0) for the rows */}\n\t\t\t\t\t<AnimatePresence>\n\t\t\t\t\t\t{data.map((tableData, i) => (\n\t\t\t\t\t\t\t<TableRow\n\t\t\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: we want this for animation purposes\n\t\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\ttableData={tableData}\n\t\t\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\t\t\tmaxCount={maxCount}\n\t\t\t\t\t\t\t\tsectionFilter={sectionFilter}\n\t\t\t\t\t\t\t\tonClick={onClickRow}\n\t\t\t\t\t\t\t\tshowPercentages={showPercentages}\n\t\t\t\t\t\t\t\tonVisitorCountHover={onHover}\n\t\t\t\t\t\t\t\tButtonOnHover={ButtonOnHover}\n\t\t\t\t\t\t\t\tisRowHovered={hoveredRowIndex === i}\n\t\t\t\t\t\t\t\tonRowHover={hovered => setHoveredRowIndex(hovered ? i : null)}\n\t\t\t\t\t\t\t\tkind={kind}\n\t\t\t\t\t\t\t\tcountFormatter={countFormatter ?? formatNumberCompactNotation}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</AnimatePresence>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t)\n\n\tconst tableWrapperClassName = kind === AnalyticsTableKind.Usage ? styles.usageTableWrapper : undefined\n\tconst tableSectionClassName = kind === AnalyticsTableKind.Usage ? styles.usageTableSection : undefined\n\n\treturn (\n\t\t<MotionConfig transition={{ type: \"spring\", stiffness: 100, damping: 30, mass: 1 }}>\n\t\t\t<Stack gap={10} direction=\"column\" className={cx(styles.tableSection, tableSectionClassName)}>\n\t\t\t\t{title !== \"\" && <TableHeader title={title} action={action} />}\n\t\t\t\t<ScrollWithGradient\n\t\t\t\t\tclassName={cx(styles.tableWrapper, tableWrapperClassName)}\n\t\t\t\t\tdirection=\"both\"\n\t\t\t\t\tgradientColor={gradientColor}\n\t\t\t\t>\n\t\t\t\t\t<AnimatePresence mode=\"popLayout\">{content}</AnimatePresence>\n\t\t\t\t</ScrollWithGradient>\n\t\t\t</Stack>\n\t\t</MotionConfig>\n\t)\n}\n\nfunction TableHeader({ title, action }: { title: string; action?: React.ReactNode }) {\n\treturn (\n\t\t<Stack gap={15} direction=\"row\" justifyContent=\"space-between\" alignItems=\"center\" className={styles.tableHeader}>\n\t\t\t<span className={styles.tableRowHeading}>{title}</span>\n\t\t\t{action}\n\t\t</Stack>\n\t)\n}\n\nfunction TableRow({\n\ttableData,\n\tisLoading,\n\tmaxCount,\n\tdisabled,\n\tsectionFilter,\n\tonClick,\n\tshowPercentages,\n\tonVisitorCountHover,\n\tButtonOnHover,\n\tisRowHovered,\n\tonRowHover,\n\tkind: _kind,\n\tcountFormatter,\n}: {\n\ttableData: AnalyticsTableData\n\tisLoading: boolean\n\tmaxCount: number\n\tdisabled?: true\n\tsectionFilter: AnalyticsSectionFilterOption | UsageFilterOption\n\tonClick: (\n\t\tfilterKey: AnalyticsSectionFilterOption | UsageFilterOption,\n\t\tfilterValue: string,\n\t\tfilterLabel: string,\n\t) => void\n\tshowPercentages: boolean\n\tonVisitorCountHover: (show: boolean) => void\n\tButtonOnHover?: React.ComponentType<{ value: string }>\n\tisRowHovered: boolean\n\tonRowHover: (hovered: boolean) => void\n\tkind: AnalyticsTableKind\n\tcountFormatter: (value: number) => string\n}) {\n\tconst { name, href, count = 0, percentage = 0, icon, filterValue, tooltip } = tableData\n\tconst barPercentageFilled = (count / maxCount) * 100\n\tconst hasFilter = !isLoading && count && !disabled\n\n\tconst buttonOnHover = ButtonOnHover ? <ButtonOnHover value={filterValue} /> : undefined\n\n\treturn (\n\t\t<tr\n\t\t\ttitle={tooltip ?? name}\n\t\t\tclassName={cx(styles.tableRow, styles.tableRowWithBar, hasFilter && styles.tableRowWithFilter)}\n\t\t\tonClick={() => hasFilter && onClick(sectionFilter, filterValue, name)}\n\t\t\tonMouseEnter={() => onRowHover(true)}\n\t\t\tonMouseLeave={() => onRowHover(false)}\n\t\t>\n\t\t\t<td className={cx(styles.tableRowLeft, truncateWithEllipsis)}>\n\t\t\t\t<BarContent\n\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\tisRowHovered={isRowHovered}\n\t\t\t\t\tname={name}\n\t\t\t\t\ticon={icon}\n\t\t\t\t\thref={href}\n\t\t\t\t\tbarPercentageFilled={barPercentageFilled}\n\t\t\t\t/>\n\t\t\t</td>\n\t\t\t<td\n\t\t\t\tclassName={ButtonOnHover ? styles.tableRowAction : styles.tableRowRight}\n\t\t\t\tonMouseEnter={() => onVisitorCountHover(true)}\n\t\t\t\tonMouseLeave={() => onVisitorCountHover(false)}\n\t\t\t>\n\t\t\t\t{!isLoading &&\n\t\t\t\t\t(isRowHovered && buttonOnHover ? (\n\t\t\t\t\t\tbuttonOnHover\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<VisitorCount\n\t\t\t\t\t\t\tcount={count}\n\t\t\t\t\t\t\tpercentage={percentage}\n\t\t\t\t\t\t\tshowPercentages={!ButtonOnHover && showPercentages}\n\t\t\t\t\t\t\tcountFormatter={countFormatter}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t</td>\n\t\t</tr>\n\t)\n}\n\nfunction BarContent({\n\tisLoading,\n\tisRowHovered,\n\tname,\n\tbarPercentageFilled,\n\ticon,\n\thref,\n}: {\n\tisLoading: boolean\n\tisRowHovered: boolean\n\tname: string\n\tbarPercentageFilled: number\n\ticon?: React.ReactElement\n\thref?: string\n}) {\n\tconst opacity = isLoading ? 0 : 1\n\treturn (\n\t\t<Stack gap={0} className={styles.bar} justifyContent=\"center\">\n\t\t\t<motion.span\n\t\t\t\tclassName={styles.barFill}\n\t\t\t\tanimate={{\n\t\t\t\t\twidth: `${barPercentageFilled > MINIMUM_PERCENTAGE ? barPercentageFilled : 0}%`,\n\t\t\t\t}}\n\t\t\t\texit={{ width: 0 }}\n\t\t\t/>\n\t\t\t<Stack gap={0} direction=\"row\" alignItems=\"center\" className={styles.barContent}>\n\t\t\t\t{icon && (\n\t\t\t\t\t<motion.div initial={{ opacity: 0 }} animate={{ opacity }} className={styles.barContentIcon}>\n\t\t\t\t\t\t{icon}\n\t\t\t\t\t</motion.div>\n\t\t\t\t)}\n\t\t\t\t<motion.div\n\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\tanimate={{ opacity }}\n\t\t\t\t\tclassName={cx(styles.barContentText, truncateWithEllipsis)}\n\t\t\t\t>\n\t\t\t\t\t{name}\n\t\t\t\t</motion.div>\n\t\t\t\t{!isLoading && href && isRowHovered && (\n\t\t\t\t\t<a href={href} target=\"_blank\" className={styles.barContentLink} onClick={e => e.stopPropagation()}>\n\t\t\t\t\t\t<IconLinkFilledArrow />\n\t\t\t\t\t</a>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</Stack>\n\t)\n}\n\nfunction VisitorCount({\n\tcount,\n\tpercentage,\n\tshowPercentages,\n\tcountFormatter,\n}: {\n\tcount: number\n\tpercentage: number\n\tshowPercentages: boolean\n\tcountFormatter: (count: number) => string\n}) {\n\tconst formattedCount = count ? countFormatter(count) : \"-\"\n\tconst formattedPercentage = `${Number.isInteger(percentage) ? percentage : percentage.toFixed(1)}%`\n\n\treturn (\n\t\t<span className={cx(styles.tableVisitorCountWrapper, tabularNumbers)}>\n\t\t\t{showPercentages ? formattedPercentage : formattedCount}\n\t\t</span>\n\t)\n}\n", "import \"AnalyticsTable.styles_j8s7vf.wyw.css\"; export const tableSection = \"tableSection_t9x89dm\";\nexport const usageTableSection = \"usageTableSection_u5jt7f8\";\nexport const usageTableWrapper = \"usageTableWrapper_u4zat4\";\nexport const tableRowLeft = \"tableRowLeft_t1178ulr\";\nexport const tableRowRight = \"tableRowRight_t1rgdanf\";\nexport const tableRowAction = \"tableRowAction_ttazdte\";\nexport const tableVisitorCountWrapper = \"tableVisitorCountWrapper_t167vmq2\";\nexport const emptyState = \"emptyState_ek9poq0\";\nexport const tableWrapper = \"tableWrapper_t1umf1mh\";\nexport const table = \"table_tiny8ov\";\nexport const tableHeader = \"tableHeader_t1mwyeqk\";\nexport const tableRow = \"tableRow_t1kdcp4b\";\nexport const tableRowWithBar = \"tableRowWithBar_t6glc2e\";\nexport const tableRowWithFilter = \"tableRowWithFilter_t1kbwtxh\";\nexport const tableRowHeading = \"tableRowHeading_tpc2gwb\";\nexport const bar = \"bar_b1pu4y5h\";\nexport const barFill = \"barFill_b1s05nnh\";\nexport const barContent = \"barContent_b1r6k4jn\";\nexport const barContentIcon = \"barContentIcon_bzbtob7\";\nexport const barContentText = \"barContentText_b1js1m0g\";\nexport const barContentLink = \"barContentLink_bqncu8i\";", "/**\n * Returns price with correct currency in a human-readable format\n * @param amount\n * @param currency\n * @param round Determines whether the number should be shown with cents or rounded to an integer\n */\n\nexport function formatPrice(amount: number, currency: string, round: boolean = false) {\n\tconst priceFormatter = new Intl.NumberFormat(\"en-US\", {\n\t\tstyle: \"currency\",\n\t\tcurrency,\n\t\tminimumFractionDigits: round ? 0 : 2,\n\t\tmaximumFractionDigits: round ? 0 : 2,\n\t})\n\n\treturn priceFormatter.format(amount)\n}\n", "import \"PriceItemRow.styles_1q7t3o0.wyw.css\"; export const summaryContainer = \"summaryContainer_s12mx184\";\nexport const itemContainer = \"itemContainer_i5bp38w\";\nexport const bold = \"bold_bnc1zu3\";\nexport const price = \"price_p1k1vxpm\";\nexport const loadingPrice = \"loadingPrice_lsgnfgh\";\nexport const boldPrice = \"boldPrice_b1imejpn\";\nexport const loading = \"loading_l1qgk1he\";\nexport const disabledPriceRows = \"disabledPriceRows_d13bjapa\";", "import { Stack, T } from \"@framerjs/fresco\"\nimport { cx } from \"@linaria/core\"\nimport { tabularNumbers } from \"app/styles/typography.styles.ts\"\nimport { formatPrice } from \"document/components/chrome/siteSettings/Plans/utils/formatPrice.ts\"\nimport type { ReactNode } from \"react\"\nimport { isString } from \"../../../../runtime/src/utils/typeChecks.ts\"\nimport * as styles from \"./PriceItemRow.styles.ts\"\n\ntype PriceItemRowProps = { title: string | React.ReactElement; bold?: boolean } & (\n\t| {\n\t\t\tprice?: null\n\t\t\tcurrency?: string\n\t  }\n\t| {\n\t\t\tprice: number\n\t\t\tcurrency: string\n\t  }\n)\n\nexport function PriceItemRow(props: PriceItemRowProps) {\n\tconst displayPrice = typeof props.price === \"number\" ? formatPrice(props.price, props.currency) : \"\u2014\"\n\n\treturn (\n\t\t<Stack direction=\"row\" justifyContent=\"space-between\">\n\t\t\t{isString(props.title) ? (\n\t\t\t\t<T className={props.bold ? styles.bold : undefined}>{props.title}</T>\n\t\t\t) : (\n\t\t\t\t<span className={props.bold ? styles.bold : undefined}>{props.title}</span>\n\t\t\t)}\n\t\t\t<div\n\t\t\t\tclassName={cx(\n\t\t\t\t\tstyles.price,\n\t\t\t\t\ttabularNumbers,\n\t\t\t\t\tprops.bold && styles.boldPrice,\n\t\t\t\t\tdisplayPrice === \"\u2014\" && styles.loadingPrice,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{displayPrice}\n\t\t\t</div>\n\t\t</Stack>\n\t)\n}\n\ninterface PriceItemListProps {\n\tisLoading?: boolean\n\tdisabled?: boolean\n\tchildren: ReactNode\n}\n\nexport function PriceItemList({ isLoading, disabled, children }: PriceItemListProps) {\n\treturn (\n\t\t<Stack\n\t\t\tgap={10}\n\t\t\tclassName={cx(styles.itemContainer, isLoading && styles.loading, disabled && styles.disabledPriceRows)}\n\t\t>\n\t\t\t{children}\n\t\t</Stack>\n\t)\n}\n", "import { openNewTab } from \"@framerjs/app-shared\"\nimport { assertNever } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { contactSupportURL } from \"utils/staticURLs.ts\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport { type Pages, UIInteraction, record } from \"web/lib/tracker.ts\"\nimport { type PaymentError, PaymentErrorStatus } from \"./api/errors/paymentError.ts\"\nimport { getBillingPortalUrl } from \"./api/subscriptions.ts\"\n\nconst toastKey = \"payment-error\"\n\ninterface PaymentErrorToastConfig {\n\tteamId: string\n\t/** Tracking page per error variant. Pass a constant if the modal tracks at a single page level. */\n\tgetPage: (error: PaymentError) => Pages\n\t/** Used in a distinct \"Try Again\" toast that calls `retry`. */\n\tretry: () => void\n}\n\nexport function showPaymentErrorToast(error: PaymentError, config: PaymentErrorToastConfig) {\n\tconst page = config.getPage(error)\n\tconst base = { type: \"add\", variant: \"error\", key: toastKey, duration: 5000 } as const\n\tconst updateAction = {\n\t\ttitle: Dictionary.Update,\n\t\tonClick: () => {\n\t\t\trecord(\"ui_interaction\", { page, id: UIInteraction.openBillingPortal })\n\t\t\topenNewTab(getBillingPortalUrl(config.teamId))\n\t\t},\n\t}\n\trecord(\"ui_impression\", { page })\n\tswitch (error.status) {\n\t\tcase PaymentErrorStatus.Unauthorized:\n\t\t\treturn toast({\n\t\t\t\t...base,\n\t\t\t\tprimaryText: \"Unauthorized.\",\n\t\t\t\tsecondaryText: \"Contact your admin\",\n\t\t\t\taction: {\n\t\t\t\t\ttitle: Dictionary.Dismiss,\n\t\t\t\t\tonClick: () => record(\"ui_interaction\", { page, id: UIInteraction.dismiss }),\n\t\t\t\t},\n\t\t\t})\n\t\tcase PaymentErrorStatus.PaymentDeclined:\n\t\t\treturn toast({\n\t\t\t\t...base,\n\t\t\t\tprimaryText: \"Payment declined.\",\n\t\t\t\tsecondaryText: error.message,\n\t\t\t\taction: updateAction,\n\t\t\t})\n\t\tcase PaymentErrorStatus.ActionRequiredError: {\n\t\t\treturn toast({\n\t\t\t\t...base,\n\t\t\t\tprimaryText: \"Payment declined.\",\n\t\t\t\tsecondaryText: \"Authentication failed\",\n\t\t\t\taction: {\n\t\t\t\t\ttitle: Dictionary.TryAgain,\n\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\trecord(\"ui_interaction\", { page, id: UIInteraction.tryAgain })\n\t\t\t\t\t\tconfig.retry()\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\tcase PaymentErrorStatus.TaxLocationInvalid:\n\t\t\treturn toast({\n\t\t\t\t...base,\n\t\t\t\tprimaryText: \"Payment declined.\",\n\t\t\t\tsecondaryText: \"Update your address\",\n\t\t\t\taction: updateAction,\n\t\t\t})\n\t\tcase PaymentErrorStatus.UnhandledError:\n\t\t\treturn showUnhandledToast(page)\n\t\tdefault:\n\t\t\tassertNever(error)\n\t}\n}\n\nfunction showUnhandledToast(page: Pages) {\n\treturn toast({\n\t\ttype: \"add\",\n\t\tvariant: \"error\",\n\t\tkey: toastKey,\n\t\tduration: 5000,\n\t\tprimaryText: \"Payment failed.\",\n\t\taction: {\n\t\t\ttitle: \"Contact Support\",\n\t\t\tonClick: () => {\n\t\t\t\trecord(\"ui_interaction\", { page, id: UIInteraction.contactSupport })\n\t\t\t\topenNewTab(contactSupportURL)\n\t\t\t},\n\t\t},\n\t})\n}\n", "import \"InlinePaymentError.styles_10a0g0z.wyw.css\"; export const container = \"container_c1b99tiv\";\nexport const errorMessage = \"errorMessage_e1g909vc\";", "import { Button, Stack } from \"@framerjs/fresco\"\nimport type { ReactNode } from \"react\"\nimport * as styles from \"./InlinePaymentError.styles.ts\"\n\ninterface InlineErrorPrimaryAction {\n\tlabel: ReactNode\n\tonClick: () => void\n}\n\ninterface InlineErrorProps {\n\tmessage: string\n\tdismissLabel: ReactNode\n\tonDismiss: () => void\n\tprimaryAction?: InlineErrorPrimaryAction\n}\n\nexport function InlineError({ message, dismissLabel, onDismiss, primaryAction }: InlineErrorProps) {\n\treturn (\n\t\t<Stack direction=\"column\" className={styles.container}>\n\t\t\t<p className={styles.errorMessage} role=\"alert\">\n\t\t\t\t{message}\n\t\t\t</p>\n\t\t\t<Stack direction=\"row\" gap={10}>\n\t\t\t\t<Button onClick={onDismiss}>{dismissLabel}</Button>\n\t\t\t\t{primaryAction && (\n\t\t\t\t\t<Button variant=\"destructiveSecondary\" onClick={primaryAction.onClick}>\n\t\t\t\t\t\t{primaryAction.label}\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</Stack>\n\t)\n}\n", "import { openNewTab } from \"@framerjs/app-shared\"\nimport { assertNever } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { contactSupportURL } from \"utils/staticURLs.ts\"\nimport { useRecordEffect } from \"utils/useRecordEffect.ts\"\nimport { type Pages, UIInteraction, record } from \"web/lib/tracker.ts\"\nimport { type PaymentError, PaymentErrorStatus } from \"../api/errors/paymentError.ts\"\nimport { getBillingPortalUrl } from \"../api/subscriptions.ts\"\nimport { InlineError } from \"./InlineError.tsx\"\n\ninterface InlinePaymentErrorProps {\n\terror: PaymentError\n\tteamId: string\n\tpage: Pages\n\terrorPage: Pages\n\tonDismiss: () => void\n\tonRetry: () => void\n}\n\nfunction getErrorMessage(error: PaymentError): string {\n\tswitch (error.status) {\n\t\tcase PaymentErrorStatus.PaymentDeclined:\n\t\t\treturn `Payment declined. ${error.message}`\n\t\tcase PaymentErrorStatus.TaxLocationInvalid:\n\t\t\treturn \"Payment declined. Update your address.\"\n\t\tcase PaymentErrorStatus.ActionRequiredError:\n\t\t\treturn \"Payment declined. Authentication failed.\"\n\t\tcase PaymentErrorStatus.Unauthorized:\n\t\tcase PaymentErrorStatus.UnhandledError:\n\t\t\treturn \"Something went wrong.\"\n\t\tdefault:\n\t\t\tassertNever(error)\n\t}\n}\n\nfunction getPrimaryAction(error: PaymentError): \"update\" | \"retry\" | \"contact-support\" {\n\tswitch (error.status) {\n\t\tcase PaymentErrorStatus.PaymentDeclined:\n\t\tcase PaymentErrorStatus.TaxLocationInvalid:\n\t\t\treturn \"update\"\n\t\tcase PaymentErrorStatus.ActionRequiredError:\n\t\tcase PaymentErrorStatus.Unauthorized:\n\t\t\treturn \"retry\"\n\t\tcase PaymentErrorStatus.UnhandledError:\n\t\t\treturn \"contact-support\"\n\t\tdefault:\n\t\t\tassertNever(error)\n\t}\n}\n\nexport function InlinePaymentError({ error, teamId, page, errorPage, onDismiss, onRetry }: InlinePaymentErrorProps) {\n\tconst message = getErrorMessage(error)\n\tconst primaryAction = getPrimaryAction(error)\n\n\tuseRecordEffect(\"ui_impression\", { page: errorPage })\n\n\tconst handleUpdate = () => {\n\t\trecord(\"ui_interaction\", { page, id: UIInteraction.openBillingPortal })\n\t\topenNewTab(getBillingPortalUrl(teamId))\n\t}\n\n\tconst handleRetry = () => {\n\t\trecord(\"ui_interaction\", { page, id: UIInteraction.tryAgain })\n\t\tonRetry()\n\t}\n\n\tconst handleContactSupport = () => {\n\t\trecord(\"ui_interaction\", { page, id: UIInteraction.contactSupport })\n\t\topenNewTab(contactSupportURL)\n\t}\n\n\tconst handleDismiss = () => {\n\t\trecord(\"ui_interaction\", { page, id: UIInteraction.dismiss })\n\t\tonDismiss()\n\t}\n\n\tconst inlinePrimaryAction = (() => {\n\t\tswitch (primaryAction) {\n\t\t\tcase \"update\":\n\t\t\t\treturn { label: Dictionary.Update, onClick: handleUpdate }\n\t\t\tcase \"retry\":\n\t\t\t\treturn { label: Dictionary.TryAgain, onClick: handleRetry }\n\t\t\tcase \"contact-support\":\n\t\t\t\treturn { label: Dictionary.ContactUs, onClick: handleContactSupport }\n\t\t\tdefault:\n\t\t\t\tassertNever(primaryAction)\n\t\t}\n\t})()\n\n\treturn (\n\t\t<InlineError\n\t\t\tmessage={message}\n\t\t\tdismissLabel={Dictionary.Dismiss}\n\t\t\tonDismiss={handleDismiss}\n\t\t\tprimaryAction={inlinePrimaryAction}\n\t\t/>\n\t)\n}\n", "import {\n\tButton,\n\tCheckBox,\n\tCustomModal,\n\tIconFramerLogo,\n\tStack,\n\tTranslatable as T,\n\tText,\n\tThemeOverride,\n} from \"@framerjs/fresco\"\nimport type { ModalThemeProps } from \"@framerjs/fresco/components/CustomModal\"\nimport { noop } from \"@framerjs/shared/src/noop.ts\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport React from \"react\"\nimport * as styles from \"./EnterpriseUpsellModal.styles.ts\"\n\n/**\n * \uD83D\uDD34 This file is also used by Dashboard components. Please do not import the engine here.\n */\n\nconst mode = \"enterpriseUpsellModal\"\n\ntype EnterpriseUpsellModalProps = ModalThemeProps & {\n\tdescription: string\n\tonConfirm: () => void\n\tonCancel: () => void\n\tupsellFeatures: string[]\n}\n\nexport function EnterpriseUpsellModal({\n\tdescription,\n\tonConfirm,\n\tonCancel,\n\tupsellFeatures,\n\t...modalThemeProps\n}: EnterpriseUpsellModalProps) {\n\tconst handleSubmit = React.useCallback(\n\t\t(event: React.FormEvent) => {\n\t\t\tevent.preventDefault()\n\t\t\tonConfirm()\n\t\t},\n\t\t[onConfirm],\n\t)\n\n\tconst handleKeydown = React.useCallback(\n\t\t(event: React.KeyboardEvent) => {\n\t\t\tif (event.key !== \"Enter\") return\n\t\t\tevent.preventDefault()\n\t\t\tonConfirm()\n\t\t},\n\t\t[onConfirm],\n\t)\n\n\treturn (\n\t\t<CustomModal visible onDismiss={onCancel} className={styles.container} hasBackdrop {...modalThemeProps}>\n\t\t\t<Stack justifyContent=\"space-between\" alignItems=\"flex-start\" padding={30} className={styles.image}>\n\t\t\t\t<IconFramerLogo width={19} height={28} />\n\t\t\t\t<EnterprisePlanLogo />\n\t\t\t</Stack>\n\t\t\t<form onSubmit={handleSubmit}>\n\t\t\t\t<Stack gap={30} padding={30} className={styles.content}>\n\t\t\t\t\t<Stack gap={10}>\n\t\t\t\t\t\t<T className={styles.title}>Upgrade to Enterprise</T>\n\t\t\t\t\t\t<ThemeOverride mode={mode} className={styles.description}>\n\t\t\t\t\t\t\t<T>{description}</T>\n\t\t\t\t\t\t</ThemeOverride>\n\t\t\t\t\t</Stack>\n\t\t\t\t\t<Stack gap={12}>\n\t\t\t\t\t\t<ThemeOverride mode={mode}>\n\t\t\t\t\t\t\t{upsellFeatures.map((feature, i) => (\n\t\t\t\t\t\t\t\t<Stack key={i} direction=\"row\" gap={10} alignItems=\"center\" className={styles.featureItem}>\n\t\t\t\t\t\t\t\t\t<CheckBox value onChange={noop} className={styles.featureCheckbox} />\n\t\t\t\t\t\t\t\t\t<Text size={12} lineHeight={1.2}>\n\t\t\t\t\t\t\t\t\t\t<T>{feature}</T>\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ThemeOverride>\n\t\t\t\t\t</Stack>\n\t\t\t\t\t<Stack direction=\"row\" gap={15} className={styles.buttonsContainer}>\n\t\t\t\t\t\t<Button title={Dictionary.MaybeLater} onClick={onCancel} className={styles.button}>\n\t\t\t\t\t\t\t<T>{Dictionary.MaybeLater}</T>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<ThemeOverride mode={mode}>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t\t\ttitle={Dictionary.ContactUs}\n\t\t\t\t\t\t\t\tonKeyDown={handleKeydown}\n\t\t\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<T>{Dictionary.ContactUs}</T>\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</ThemeOverride>\n\t\t\t\t\t</Stack>\n\t\t\t\t</Stack>\n\t\t\t</form>\n\t\t</CustomModal>\n\t)\n}\n\nfunction EnterprisePlanLogo() {\n\treturn (\n\t\t<svg width=\"112\" height=\"23\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t<path\n\t\t\t\td=\"M10.904 18H.632V1.2h10.272v3.12H4.52v3.816h6.384v3.048H4.52v3.696h6.384V18Zm2.512 0V6.432h3.672v1.68a3.404 3.404 0 0 1 1.464-1.464c.64-.352 1.4-.528 2.28-.528 2.816 0 4.224 1.576 4.224 4.728V18H21.36v-5.952c0-.992-.16-1.712-.48-2.16-.304-.448-.824-.672-1.56-.672-.736 0-1.296.232-1.68.696-.368.464-.552 1.144-.552 2.04V18h-3.672Zm20.007-2.856c.512 0 .936-.024 1.272-.072V18c-.704.128-1.52.192-2.448.192-1.168 0-2.144-.28-2.928-.84-.784-.56-1.176-1.696-1.176-3.408V9.336H26.32V6.432h1.824V3h3.672v3.432h2.616v2.904h-2.616v3.84c0 .784.136 1.312.408 1.584.272.256.672.384 1.2.384Zm14.317-3.528c0 .496-.032 1.032-.096 1.608H39.1c.032.752.288 1.328.768 1.728.48.4 1.128.6 1.944.6 1.136 0 1.856-.344 2.16-1.032h3.6c-.176 1.136-.8 2.056-1.872 2.76-1.056.688-2.352 1.032-3.888 1.032-1.984 0-3.544-.536-4.68-1.608-1.12-1.072-1.68-2.568-1.68-4.488 0-1.248.256-2.328.768-3.24a5.06 5.06 0 0 1 2.184-2.112c.944-.496 2.04-.744 3.288-.744 1.184 0 2.232.232 3.144.696.928.464 1.64 1.112 2.136 1.944.512.832.768 1.784.768 2.856Zm-3.624-.672c-.016-.768-.232-1.352-.648-1.752-.416-.4-1.016-.6-1.8-.6s-1.408.216-1.872.648c-.448.416-.68.984-.696 1.704h5.016ZM49.41 18V6.432h3.672v2.424c.192-.832.584-1.472 1.176-1.92a3.246 3.246 0 0 1 2.016-.696c.384 0 .704.032.96.096v3.408c-.432-.048-.8-.072-1.104-.072-1.008 0-1.768.328-2.28.984-.512.64-.768 1.6-.768 2.88V18h-3.672ZM66.214 6.12c1.04 0 1.96.256 2.76.768.816.512 1.448 1.232 1.896 2.16.448.912.672 1.968.672 3.168 0 1.2-.232 2.264-.696 3.192a5.075 5.075 0 0 1-1.92 2.136c-.816.512-1.752.768-2.808.768a4.57 4.57 0 0 1-2.232-.552c-.656-.368-1.144-.832-1.464-1.392V22.8h-3.648V6.432h3.648v1.656c.32-.576.824-1.048 1.512-1.416a4.757 4.757 0 0 1 2.28-.552Zm-1.152 9.144c.8 0 1.456-.28 1.968-.84.512-.576.768-1.312.768-2.208 0-.896-.256-1.624-.768-2.184s-1.168-.84-1.968-.84c-.832 0-1.504.28-2.016.84-.512.56-.768 1.288-.768 2.184 0 .912.256 1.648.768 2.208.528.56 1.2.84 2.016.84ZM73.318 18V6.432h3.672v2.424c.192-.832.584-1.472 1.176-1.92a3.246 3.246 0 0 1 2.016-.696c.384 0 .704.032.96.096v3.408c-.432-.048-.8-.072-1.104-.072-1.008 0-1.768.328-2.28.984-.512.64-.768 1.6-.768 2.88V18h-3.672Zm11.19-12.576c-.657 0-1.2-.216-1.633-.648-.416-.432-.624-.96-.624-1.584 0-.64.208-1.176.624-1.608.432-.432.976-.648 1.632-.648.656 0 1.2.224 1.632.672.432.432.648.96.648 1.584 0 .624-.216 1.152-.648 1.584-.432.432-.976.648-1.632.648ZM86.33 18h-3.648V6.432h3.648V18Zm7.255.312c-1.088 0-2.048-.16-2.88-.48-.816-.32-1.456-.76-1.92-1.32a3.154 3.154 0 0 1-.672-1.992h3.648c0 .4.176.728.528.984.352.24.808.36 1.368.36.4 0 .72-.088.96-.264a.936.936 0 0 0 .384-.792c0-.272-.088-.488-.264-.648-.176-.176-.504-.32-.984-.432l-2.424-.6c-.928-.224-1.648-.624-2.16-1.2-.496-.592-.744-1.32-.744-2.184 0-1.088.448-1.96 1.344-2.616.912-.672 2.112-1.008 3.6-1.008 1.632 0 2.896.312 3.792.936.912.608 1.368 1.488 1.368 2.64h-3.624c0-.4-.144-.704-.432-.912-.272-.224-.656-.336-1.152-.336-.4 0-.72.088-.96.264-.24.176-.36.4-.36.672s.096.496.288.672c.192.176.52.32.984.432l2.448.672c.928.24 1.648.64 2.16 1.2.512.56.768 1.272.768 2.136 0 1.184-.456 2.12-1.368 2.808-.912.672-2.144 1.008-3.696 1.008Zm18.359-6.696c0 .496-.032 1.032-.096 1.608h-8.544c.032.752.288 1.328.768 1.728.48.4 1.128.6 1.944.6 1.136 0 1.856-.344 2.16-1.032h3.6c-.176 1.136-.8 2.056-1.872 2.76-1.056.688-2.352 1.032-3.888 1.032-1.984 0-3.544-.536-4.68-1.608-1.12-1.072-1.68-2.568-1.68-4.488 0-1.248.256-2.328.768-3.24a5.06 5.06 0 0 1 2.184-2.112c.944-.496 2.04-.744 3.288-.744 1.184 0 2.232.232 3.144.696.928.464 1.64 1.112 2.136 1.944.512.832.768 1.784.768 2.856Zm-3.624-.672c-.016-.768-.232-1.352-.648-1.752-.416-.4-1.016-.6-1.8-.6s-1.408.216-1.872.648c-.448.416-.68.984-.696 1.704h5.016Z\"\n\t\t\t\tfill=\"#fff\"\n\t\t\t/>\n\t\t</svg>\n\t)\n}\n", "import \"EnterpriseUpsellModal.styles_1nzxr8i.wyw.css\"; export const container = \"container_ca11fxb\";\nexport const image = \"image_inardf1\";\nexport const content = \"content_cwtotpa\";\nexport const title = \"title_tr9jggb\";\nexport const description = \"description_dj215go\";\nexport const featureItem = \"featureItem_f1h99tp8\";\nexport const featureCheckbox = \"featureCheckbox_fkkz3js\";\nexport const buttonsContainer = \"buttonsContainer_bhgn2b7\";\nexport const button = \"button_b1lal8rx\";\nexport const link = \"link_lwwglro\";", "import { assertNever, getLogger } from \"@framerjs/shared\"\nimport { apiFetcher } from \"web/lib/apiFetcher.ts\"\nimport { isInvalidPromotionCodeError } from \"./errors/invalidPromotionCodeError.ts\"\nimport { isOverEditorLimitError, isOverProjectEditorLimitError } from \"./errors/overEditorLimitError.ts\"\nimport {\n\tPaymentErrorStatus,\n\tclassifyPaymentError,\n\thandleRequiredAction,\n\ttype PaymentError,\n\ttype PutSubscriptionResponseAction,\n} from \"./errors/paymentError.ts\"\n\nconst log = getLogger(\"projectSubscription\")\n\ntype PutSubscriptionApiResponse =\n\t| { result: \"success\" }\n\t| { result: \"action_required\"; action: PutSubscriptionResponseAction }\n\nexport enum PutProjectSubscriptionStatus {\n\tSuccess,\n\tInvalidPromotionCode,\n\tOverEditorLimitError,\n\tOverProjectEditorLimitError,\n\tPaymentError,\n}\n\ninterface PutProjectSubscriptionRequest {\n\tprojectId: string\n\tplanId?: string\n\taddOns?: { plan: string; quantity: number }[]\n\tisBillingV3: boolean\n\tpromotionCode?: string\n}\n\ntype PutProjectSubscriptionResponse =\n\t| { status: PutProjectSubscriptionStatus.InvalidPromotionCode }\n\t| { status: PutProjectSubscriptionStatus.Success }\n\t| { status: PutProjectSubscriptionStatus.OverEditorLimitError; newLimit: number; currentEditorCount: number }\n\t| { status: PutProjectSubscriptionStatus.OverProjectEditorLimitError; newLimit: number; currentEditorCount: number }\n\t| { status: PutProjectSubscriptionStatus.PaymentError; error: PaymentError }\n\nexport async function putProjectSubscription({\n\tprojectId,\n\tplanId,\n\taddOns,\n\tisBillingV3,\n\tpromotionCode,\n}: PutProjectSubscriptionRequest): Promise<PutProjectSubscriptionResponse> {\n\ttry {\n\t\tconst url = isBillingV3\n\t\t\t? `/web/v4/projects/${projectId}/subscription`\n\t\t\t: `/web/v3/projects/${projectId}/subscription`\n\t\tconst body: Record<string, unknown> = {}\n\t\tif (planId) body.plan = planId\n\t\tif (addOns && addOns.length > 0) body.addOns = addOns\n\t\tif (promotionCode) body.promotionCode = promotionCode\n\t\tconst response: PutSubscriptionApiResponse = await apiFetcher.put(url, body)\n\t\tswitch (response.result) {\n\t\t\tcase \"success\":\n\t\t\t\treturn { status: PutProjectSubscriptionStatus.Success }\n\t\t\tcase \"action_required\": {\n\t\t\t\tconst error = await handleRequiredAction(response.action)\n\t\t\t\treturn error\n\t\t\t\t\t? { status: PutProjectSubscriptionStatus.PaymentError, error }\n\t\t\t\t\t: { status: PutProjectSubscriptionStatus.Success }\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tassertNever(response, \"Unexpected response\")\n\t\t}\n\t} catch (error) {\n\t\tif (isInvalidPromotionCodeError(error)) {\n\t\t\treturn { status: PutProjectSubscriptionStatus.InvalidPromotionCode }\n\t\t}\n\t\tif (isOverEditorLimitError(error)) {\n\t\t\treturn {\n\t\t\t\tstatus: PutProjectSubscriptionStatus.OverEditorLimitError,\n\t\t\t\tnewLimit: error.data.limit,\n\t\t\t\tcurrentEditorCount: error.data.current,\n\t\t\t}\n\t\t}\n\t\tif (isOverProjectEditorLimitError(error)) {\n\t\t\treturn {\n\t\t\t\tstatus: PutProjectSubscriptionStatus.OverProjectEditorLimitError,\n\t\t\t\tnewLimit: error.data.limit,\n\t\t\t\tcurrentEditorCount: error.data.current,\n\t\t\t}\n\t\t}\n\t\tconst paymentError = classifyPaymentError(error)\n\t\tif (paymentError) return { status: PutProjectSubscriptionStatus.PaymentError, error: paymentError }\n\t\tlog.reportError(error)\n\t\treturn {\n\t\t\tstatus: PutProjectSubscriptionStatus.PaymentError,\n\t\t\terror: { status: PaymentErrorStatus.UnhandledError },\n\t\t}\n\t}\n}\n"],
  "mappings": "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",
  "names": ["import_jsx_runtime", "title", "titleBadge", "description", "import_react", "import_jsx_runtime", "title", "React", "content", "import_jsx_runtime", "container", "import_jsx_runtime", "container", "import_jsx_runtime", "import_react", "container", "title", "description", "import_jsx_runtime", "description", "React", "container", "title", "log", "log"]
}
