{
  "version": 3,
  "sources": ["../../src/web/pages/projects/components/Domains/DomainsPage.tsx", "../../src/web/pages/projects/DashboardProjectStores.tsx", "../../src/web/pages/projects/DashboardAnalyticsStore.ts", "../../src/web/pages/projects/DashboardDomainSearchStore.ts", "../../src/web/pages/projects/DashboardModalStore.ts", "../../src/web/pages/projects/components/Domains/Rewrites/getRewriteFramerOrigins.ts", "../../src/web/pages/projects/components/Domains/fetchProject.ts", "../../src/web/pages/projects/components/Domains/fetchProjectAccessRequests.ts", "../../src/web/pages/projects/components/Domains/requestProjectAccess.ts", "../../src/web/pages/projects/DashboardProjectStore.ts", "../../src/web/pages/projects/DashboardRewriteSyncStore.ts", "../../src/web/pages/projects/DashboardTreeStore.ts", "../../src/web/pages/projects/DashboardUndoRedoManager.ts", "../../src/web/pages/projects/components/Domains/SelectedDomainTab.tsx", "../../src/web/pages/projects/components/Domains/index.styles.ts", "../../src/web/pages/projects/components/Domains/TabHeaderDescription.tsx", "../../src/web/pages/projects/components/Domains/DomainPageEmptyStates.styles.ts", "../../src/web/pages/projects/components/Domains/DomainPageEmptyStates.tsx", "../../src/web/pages/projects/DashboardRequestProjectAccessModal.tsx", "../../src/web/pages/projects/components/Domains/CustomHeaders/CustomHeaderModal.tsx", "../../src/web/pages/projects/components/Domains/validation/ensureHeaderLimits.ts", "../../src/web/pages/projects/components/Domains/DashboardAquireAddOnModal.tsx", "../../src/web/pages/projects/components/Domains/DashboardUnsupportedFileTypeModal.tsx", "../../src/web/pages/projects/components/Domains/Files/FilesModal.tsx", "../../src/web/pages/projects/components/Domains/validation/ensureProxyLimits.ts", "../../src/web/pages/projects/components/Domains/Files/showFileTooLargeUpsellModal.tsx", "../../src/web/pages/projects/components/Domains/Redirects/RedirectModal.tsx", "../../src/web/pages/projects/components/Domains/Rewrites/RewriteModal.tsx", "../../src/web/pages/projects/components/Domains/validation/rewritePathVariableKeys.ts", "../../src/web/pages/projects/components/Domains/validation/ensureRewriteLimits.ts", "../../src/web/pages/projects/components/Domains/validation/validateRewrite.ts", "../../src/web/pages/projects/components/Domains/Rewrites/getFramerOriginByUrl.ts", "../../src/web/pages/projects/DomainModalRenderer.tsx", "../../src/web/pages/projects/components/Domains/CustomHeaders/CustomHeaders.tsx", "../../src/web/pages/projects/components/Domains/DomainPageLayoutVirtualized.tsx", "../../src/web/pages/projects/components/Domains/DomainPageSubHeader.tsx", "../../src/web/pages/projects/components/Domains/DomainPageRow.tsx", "../../src/utils/useUnmountSignal.ts", "../../src/web/pages/projects/components/Domains/DomainPageRow.styles.ts", "../../src/web/pages/projects/components/Domains/DomainPageTableHeader.tsx", "../../src/web/pages/projects/components/Domains/DomainsPageHeader.tsx", "../../src/web/pages/projects/components/Domains/Files/Files.tsx", "../../src/web/pages/projects/components/Domains/Overview/Overview.tsx", "../../src/web/pages/projects/components/Domains/UpgradeProjectInNewTab.tsx", "../../src/web/pages/projects/components/Domains/DomainPageLayout.tsx", "../../src/web/pages/projects/components/Domains/Overview/Analytics.tsx", "../../src/web/pages/projects/components/Domains/Overview/Analytics.styles.ts", "../../src/web/pages/projects/components/Domains/Overview/AnalyticsPagesSection.tsx", "../../src/web/pages/projects/components/Domains/Overview/Overview.styles.ts", "../../src/web/pages/projects/components/Domains/Redirects/AccessDenied.tsx", "../../src/web/pages/projects/components/Domains/Redirects/AccessDenied.styles.ts", "../../src/web/pages/projects/components/Domains/Redirects/Redirects.tsx", "../../src/web/pages/projects/components/Domains/Rewrites/Rewrites.tsx", "../../src/web/pages/projects/components/Domains/useDomainsPageWindowEventListeners.ts", "../../src/web/pages/projects/components/Domains/useRequestAccessToast.ts"],
  "sourcesContent": ["import { ReadOnlyContext, ThemeOverride } from \"@framerjs/fresco\"\nimport { assertNever } from \"@framerjs/shared\"\nimport { startTransition, useEffect } from \"react\"\nimport { useHistory, useParams } from \"react-router-dom\"\nimport { DomainPageEmptyStateNoDomain } from \"web/pages/projects/components/Domains/DomainPageEmptyStates.tsx\"\nimport { DashboardProjectStoresProvider, useDashboardProjectStores } from \"../../DashboardProjectStores.tsx\"\nimport { DomainModalRenderer } from \"../../DomainModalRenderer.tsx\"\nimport type { CurrentDashboardTeam, DashboardState, DashboardTeam } from \"../../lib/dashboard/useDashboard.tsx\"\nimport { CustomHeaders } from \"./CustomHeaders/CustomHeaders.tsx\"\nimport { Files } from \"./Files/Files.tsx\"\nimport { Overview } from \"./Overview/Overview.tsx\"\nimport { AccessDenied } from \"./Redirects/AccessDenied.tsx\"\nimport { Redirects } from \"./Redirects/Redirects.tsx\"\nimport { Rewrites } from \"./Rewrites/Rewrites.tsx\"\nimport { SelectedDomainTabProvider, useSelectedDomainTab } from \"./SelectedDomainTab.tsx\"\nimport { useDomainsPageWindowEventListeners } from \"./useDomainsPageWindowEventListeners.ts\"\nimport { useRequestAccessToast } from \"./useRequestAccessToast.ts\"\n\ninterface Props {\n\tcurrentUserId: string\n\tdashboardState: DashboardState\n\tdashboardTeams: DashboardTeam[]\n}\n\n// biome-ignore lint/style/noDefaultExport: Default export is required for React.lazy\nexport default function DomainsPage({ currentUserId, dashboardState, dashboardTeams }: Props) {\n\t// pathname will be /domains/:id\n\tconst { id: projectId } = useParams<{ id: string }>()\n\n\tif (!projectId) {\n\t\treturn <div>No project id</div>\n\t}\n\n\treturn (\n\t\t<ThemeOverride mode=\"darkOnDarkModal\">\n\t\t\t<SelectedDomainTabProvider projectId={projectId}>\n\t\t\t\t<DashboardProjectStoresProvider\n\t\t\t\t\tprojectId={projectId}\n\t\t\t\t\tcurrentUserId={currentUserId}\n\t\t\t\t\tdashboardTeams={dashboardTeams}\n\t\t\t\t>\n\t\t\t\t\t<DomainsPageInner currentTeam={dashboardState.dashboard?.team} />\n\t\t\t\t</DashboardProjectStoresProvider>\n\t\t\t</SelectedDomainTabProvider>\n\t\t</ThemeOverride>\n\t)\n}\n\nfunction DomainsPageInner({ currentTeam }: { currentTeam?: CurrentDashboardTeam }) {\n\tconst { projectStore } = useDashboardProjectStores()\n\tconst {\n\t\tisProjectMember,\n\t\tisTeamMember,\n\t\tcanEdit,\n\t\tprojectDataStatus,\n\t\tcustomDomain,\n\t\tisLoadingHostnameData,\n\t\tprojectTeamId,\n\t} = projectStore.useState()\n\n\tuseRequestAccessToast()\n\tuseDomainsPageWindowEventListeners()\n\n\tconst history = useHistory()\n\n\t// Redirect to correct team if project belongs to a different team than the currently loaded dashboard team\n\tuseEffect(() => {\n\t\tif (projectDataStatus !== \"success\" || !projectTeamId) return\n\t\tif (!currentTeam?.id) return\n\n\t\tif (currentTeam.id !== projectTeamId) {\n\t\t\tconst url = new URL(window.location.href)\n\t\t\turl.searchParams.set(\"teamId\", projectTeamId)\n\t\t\tstartTransition(() => {\n\t\t\t\thistory.replace(url.pathname + url.search + url.hash)\n\t\t\t})\n\t\t}\n\t}, [projectDataStatus, projectTeamId, currentTeam?.id, history])\n\n\tif (projectDataStatus === \"error\" || (!isProjectMember && !isTeamMember)) {\n\t\t// User is not a member of the team or the project, show AccessDenied\n\t\t// TODO: disambiguate between access denied and other errors (see DashboardProjectStore onDisconnect)\n\t\t// TODO: decide if we want to use errors from loading the project data or from loading the project (or both)\n\t\treturn <AccessDenied />\n\t}\n\n\tif (projectDataStatus === \"success\" && !isLoadingHostnameData && !customDomain) {\n\t\treturn <DomainPageEmptyStateNoDomain projectId={projectStore.projectId} />\n\t}\n\n\treturn (\n\t\t<ReadOnlyContext.Provider value={!canEdit}>\n\t\t\t<TabContent />\n\t\t\t<DomainModalRenderer />\n\t\t</ReadOnlyContext.Provider>\n\t)\n}\n\nfunction TabContent() {\n\tconst selectedTab = useSelectedDomainTab()\n\n\tswitch (selectedTab) {\n\t\tcase \"overview\":\n\t\t\treturn <Overview />\n\t\tcase \"multi-site\":\n\t\t\treturn <Rewrites />\n\t\tcase \"headers\":\n\t\t\treturn <CustomHeaders />\n\t\tcase \"redirects\":\n\t\t\treturn <Redirects />\n\t\tcase \"files\":\n\t\t\treturn <Files />\n\t\tdefault:\n\t\t\tassertNever(selectedTab)\n\t}\n}\n", "import { ComponentLoader } from \"@framerjs/framer-runtime\"\nimport { assert } from \"@framerjs/shared\"\nimport type { CanvasTree } from \"document/models/CanvasTree/index.ts\"\nimport { createContext, memo, useContext, useEffect, useState } from \"react\"\nimport { DashboardAnalyticsStore } from \"./DashboardAnalyticsStore.ts\"\nimport { DashboardDomainSearchStore } from \"./DashboardDomainSearchStore.ts\"\nimport { DashboardDomainModalStore } from \"./DashboardModalStore.ts\"\nimport { DashboardProjectStore } from \"./DashboardProjectStore.ts\"\nimport { DashboardRewriteSyncStore } from \"./DashboardRewriteSyncStore.ts\"\nimport type { LocalTreeEditSource } from \"./DashboardTreeStore.ts\"\nimport { DashboardTreeStore } from \"./DashboardTreeStore.ts\"\nimport { DashboardUndoRedoManager } from \"./DashboardUndoRedoManager.ts\"\nimport type { DashboardTeam } from \"./lib/dashboard/useDashboard.tsx\"\n\nclass DashboardProjectStores {\n\tprivate readonly abortController = new AbortController()\n\n\tprivate readonly componentLoader = new ComponentLoader()\n\n\treadonly projectId: string\n\n\treadonly undoRedoManager: DashboardUndoRedoManager\n\treadonly treeStore: DashboardTreeStore\n\treadonly modalStore: DashboardDomainModalStore\n\treadonly searchStore: DashboardDomainSearchStore\n\treadonly analyticsStore: DashboardAnalyticsStore\n\treadonly projectStore: DashboardProjectStore\n\treadonly rewriteSyncStore: DashboardRewriteSyncStore\n\n\tconstructor({\n\t\tprojectId,\n\t\tcurrentUserId,\n\t\tdashboardTeams,\n\t}: {\n\t\tprojectId: string\n\t\tcurrentUserId: string\n\t\tdashboardTeams: DashboardTeam[]\n\t}) {\n\t\tthis.projectId = projectId\n\n\t\tthis.undoRedoManager = new DashboardUndoRedoManager()\n\t\tthis.treeStore = new DashboardTreeStore(this.componentLoader, this.undoRedoManager)\n\t\tthis.modalStore = new DashboardDomainModalStore()\n\t\tthis.searchStore = new DashboardDomainSearchStore()\n\t\tthis.analyticsStore = new DashboardAnalyticsStore(projectId, this.abortController.signal)\n\t\tthis.projectStore = new DashboardProjectStore(\n\t\t\tprojectId,\n\t\t\tcurrentUserId,\n\t\t\tdashboardTeams,\n\t\t\tthis.componentLoader,\n\t\t\tthis.abortController.signal,\n\t\t\tthis.treeStore,\n\t\t\tthis.newTreeAfterRemoteUpdate,\n\t\t\tthis.newTreeAfterLocalUpdate,\n\t\t)\n\t\tthis.rewriteSyncStore = new DashboardRewriteSyncStore(\n\t\t\tthis.projectStore,\n\t\t\tthis.treeStore,\n\t\t\tthis.abortController.signal,\n\t\t)\n\t}\n\n\tnewTreeAfterRemoteUpdate = (tree: CanvasTree) => {\n\t\tthis.treeStore.newTreeAfterRemoteUpdate(tree)\n\t\tthis.rewriteSyncStore.postProcessTreeUpdate(\"remote\")\n\t}\n\n\tnewTreeAfterLocalUpdate = (tree: CanvasTree, editSource: LocalTreeEditSource) => {\n\t\tthis.treeStore.newTreeAfterLocalUpdate(tree, editSource)\n\t\tthis.rewriteSyncStore.postProcessTreeUpdate(editSource === \"userEdit\" ? \"localUserEdit\" : \"localNonUserEdit\")\n\t}\n\n\tdispose() {\n\t\tthis.abortController.abort()\n\t}\n}\n\nconst DashboardProjectStoresContext = createContext<DashboardProjectStores | null>(null)\nDashboardProjectStoresContext.displayName = \"DashboardProjectStoresContext\"\n\ninterface Props extends React.PropsWithChildren {\n\tprojectId: string\n\tcurrentUserId: string\n\tdashboardTeams: DashboardTeam[]\n}\n\nexport const DashboardProjectStoresProvider = memo(function DashboardProjectStoresProvider({\n\tchildren,\n\tprojectId,\n\tcurrentUserId,\n\tdashboardTeams,\n}: Props) {\n\tconst [stores, setStores] = useState<DashboardProjectStores>(\n\t\t() => new DashboardProjectStores({ projectId, currentUserId, dashboardTeams }),\n\t)\n\n\tif (stores.projectId !== projectId) {\n\t\tsetStores(new DashboardProjectStores({ projectId, currentUserId, dashboardTeams }))\n\t}\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tstores.dispose()\n\t\t}\n\t}, [stores])\n\n\treturn <DashboardProjectStoresContext.Provider value={stores}>{children}</DashboardProjectStoresContext.Provider>\n})\n\nexport function useDashboardProjectStores() {\n\tconst stores = useContext(DashboardProjectStoresContext)\n\tassert(stores, \"`useDashboardProjectStores` must be used within a `DashboardProjectStoresContext.Provider`\")\n\treturn stores\n}\n", "import { getLogger } from \"@framerjs/shared\"\nimport type { PagesData, PagesSectionKeys, SiteStatPoint } from \"document/components/chrome/analytics/types.ts\"\nimport {\n\ttype DateRangePreset,\n\tgetDateRangeForPreset,\n} from \"document/components/chrome/analytics/utils/dateRangePreset.ts\"\nimport { fetchSiteStats, fetchTopField } from \"document/components/chrome/analytics/utils/fetchUtils.ts\"\nimport { isAbortError } from \"web/lib/Fetcher.ts\"\nimport { DashboardStore } from \"./DashboardStore.ts\"\n\nconst log = getLogger(\"DashboardAnalyticsStore\")\n\nconst defaultPagesFacet: PagesSectionKeys = \"pathname\"\nconst defaultDateRangePreset: DateRangePreset = \"Last 30 days\"\n\ninterface State {\n\tdateRange: DateRangePreset\n\n\tisLoadingTopPages: boolean\n\ttopPages: PagesData | undefined\n\n\tisLoadingSiteVisitors: boolean\n\tsiteVisitors: SiteStatPoint[] | undefined\n\ttotalUniques: number\n}\n\nexport class DashboardAnalyticsStore extends DashboardStore<State> {\n\tconstructor(\n\t\tprivate readonly projectId: string,\n\t\tprivate readonly signal: AbortSignal,\n\t) {\n\t\tsuper({\n\t\t\tisLoadingTopPages: false,\n\t\t\tisLoadingSiteVisitors: false,\n\t\t\tdateRange: defaultDateRangePreset,\n\t\t\ttopPages: undefined,\n\t\t\tsiteVisitors: undefined,\n\t\t\ttotalUniques: 0,\n\t\t})\n\n\t\tvoid this.loadTopPages()\n\t\tvoid this.loadSiteStats()\n\t}\n\n\tprivate getDateRange() {\n\t\tconst { dateRange } = this.getState()\n\t\tconst [fromDay, toDay] = getDateRangeForPreset(dateRange)\n\t\treturn { fromDay, toDay }\n\t}\n\n\tprivate topPagesController: AbortController | undefined\n\n\tprivate async loadTopPages() {\n\t\tthis.topPagesController?.abort()\n\t\tthis.topPagesController = new AbortController()\n\t\tconst signal = combineSignals(this.signal, this.topPagesController.signal)\n\n\t\ttry {\n\t\t\tthis.setState({ isLoadingTopPages: true })\n\n\t\t\tconst { fromDay, toDay } = this.getDateRange()\n\t\t\tconst response = await fetchTopField(this.projectId, \"pathname\", { fromDay, toDay }, signal)\n\t\t\tconst topPages = { facet: defaultPagesFacet, data: response.pathname ?? [] }\n\n\t\t\tthis.setState({ isLoadingTopPages: false, topPages })\n\t\t} catch (error) {\n\t\t\tif (isAbortError(error)) return\n\n\t\t\tlog.error(\"Failed to fetch top pages:\", error)\n\t\t\tthis.setState({ isLoadingTopPages: false })\n\t\t}\n\t}\n\n\tprivate siteStatsController: AbortController | undefined\n\n\tprivate async loadSiteStats() {\n\t\tthis.siteStatsController?.abort()\n\t\tthis.siteStatsController = new AbortController()\n\t\tconst signal = combineSignals(this.signal, this.siteStatsController.signal)\n\n\t\ttry {\n\t\t\tthis.setState({ isLoadingSiteVisitors: true })\n\n\t\t\tconst { fromDay, toDay } = this.getDateRange()\n\n\t\t\tconst response = await fetchSiteStats(this.projectId, { fromDay, toDay }, signal)\n\n\t\t\tthis.setState({\n\t\t\t\tisLoadingSiteVisitors: false,\n\t\t\t\tsiteVisitors: response.stats,\n\t\t\t\ttotalUniques: response.totalUniques ?? 0,\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tif (isAbortError(error)) return\n\n\t\t\tlog.error(\"Failed to fetch site stats:\", error)\n\t\t\tthis.setState({ isLoadingSiteVisitors: false })\n\t\t}\n\t}\n\n\tupdateDateRange(dateRange: DateRangePreset) {\n\t\tthis.setState({ dateRange })\n\n\t\tvoid this.loadTopPages()\n\t\tvoid this.loadSiteStats()\n\t}\n}\n\nfunction combineSignals(...signals: AbortSignal[]): AbortSignal {\n\tconst controller = new AbortController()\n\n\tfor (const signal of signals) {\n\t\tif (signal.aborted) {\n\t\t\tcontroller.abort(signal.reason)\n\t\t\treturn controller.signal\n\t\t}\n\n\t\tsignal.addEventListener(\"abort\", () => controller.abort(signal.reason), { once: true })\n\t}\n\n\treturn controller.signal\n}\n", "import { DashboardStore } from \"./DashboardStore.ts\"\n\ninterface State {\n\tredirectsSearchTerm: string\n}\n\nexport class DashboardDomainSearchStore extends DashboardStore<State> {\n\tconstructor() {\n\t\tsuper({ redirectsSearchTerm: \"\" })\n\t}\n\n\tsetRedirectsSearchTerm = (filter: string): void => {\n\t\tthis.setState({ redirectsSearchTerm: filter })\n\t}\n}\n", "import type { Modal } from \"document/stores/ModalStore.ts\"\nimport type { ModalType } from \"document/utils/ModalType.ts\"\nimport { DashboardStore } from \"./DashboardStore.ts\"\n\ntype DomainModal = Extract<\n\tModal,\n\t| { type: ModalType.Confirmation }\n\t| { type: ModalType.DashboardAddHeader }\n\t| { type: ModalType.DashboardAddRedirect }\n\t| { type: ModalType.DashboardAddRewrite }\n\t| { type: ModalType.DashboardEditHeader }\n\t| { type: ModalType.DashboardEditRedirect }\n\t| { type: ModalType.DashboardEditRewrite }\n\t| { type: ModalType.DashboardRequestProjectAccess }\n\t| { type: ModalType.DashboardAddFile }\n\t| { type: ModalType.DashboardEditFile }\n\t| { type: ModalType.DashboardUnsupportedFileType }\n\t| { type: ModalType.DashboardAcquireAddonModal }\n>\n\ninterface State {\n\tactive: DomainModal | null\n}\n\nexport class DashboardDomainModalStore extends DashboardStore<State> {\n\tconstructor() {\n\t\tsuper({ active: null })\n\t}\n\n\tget active() {\n\t\treturn this.getState().active\n\t}\n\n\tshow(active: DomainModal): void {\n\t\tthis.setState({ active })\n\t}\n\n\treadonly dismiss = (): void => {\n\t\tthis.setState({ active: null })\n\t}\n}\n", "import { apiFetcher } from \"web/lib/apiFetcher.ts\"\n\nexport interface RewriteFramerOrigin {\n\thostname: string | null\n\tcanonicalHostname: string | null\n\ttitle: string\n\tprojectId: string\n\tlicenseType: string | null\n\texpirationDate: string | null\n\tsubscriptionIsActive: boolean | null\n}\n\nexport async function getRewriteFramerOrigins(teamId: string, signal?: AbortSignal): Promise<RewriteFramerOrigin[]> {\n\tconst originsData = await apiFetcher.get(`/web/v2/teams/${teamId}/rewrite-origins`, undefined, signal)\n\treturn originsData.origins as RewriteFramerOrigin[]\n}\n", "import { apiFetcher } from \"web/lib/apiFetcher.ts\"\n\nexport const fetchProject = async (projectId: string, addUserToProject: boolean, signal?: AbortSignal) => {\n\tconst projectData = await apiFetcher.get(`/web/v2/projects/${projectId}`, { addUserToProject }, signal)\n\treturn projectData\n}\n", "import type { AccessRequest } from \"web/lib/RequestEditorAccess.ts\"\nimport { apiFetcher } from \"web/lib/apiFetcher.ts\"\n\ninterface ProjectAccessRequestsResponse {\n\taccessRequests: {\n\t\tproject: AccessRequest | null\n\t\tteam: AccessRequest | null\n\t}\n}\n\nexport function fetchProjectAccessRequests(\n\tprojectId: string,\n\tsignal?: AbortSignal,\n): Promise<ProjectAccessRequestsResponse> {\n\treturn apiFetcher.get(`/web/access-requests/projects/${projectId}`, undefined, signal)\n}\n", "import { getServiceMap } from \"environment/domains.ts\"\n\nexport async function requestProjectAccess(projectId: string, signal?: AbortSignal): Promise<void> {\n\tconst response = await fetch(`${getServiceMap().api}/web/projects/${projectId}/acl/request-access`, {\n\t\tcredentials: \"include\",\n\t\tmethod: \"POST\",\n\t\theaders: { \"X-Requested-By\": \"Framer\" },\n\t\tsignal,\n\t})\n\n\tif (!response.ok) {\n\t\tthrow new Error(`Error requesting access to project with ID \"${projectId}\". Response status: ${response.status}.`)\n\t}\n}\n", "import type { FeatureValue } from \"@framerjs/app-config\"\nimport type { HostnameStatus, Project } from \"@framerjs/app-shared\"\nimport { DeploymentStrategy, HostnameType, ProjectLicenseType } from \"@framerjs/app-shared\"\nimport type { ComponentLoader } from \"@framerjs/framer-runtime\"\nimport { assert, getLogger } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { defaultProjectFeatures, projectFeatures } from \"app/projectFeatures.ts\"\nimport { listHostnames } from \"document/base-engine/BaseHostnameStore.ts\"\nimport type { CanvasTree } from \"document/models/CanvasTree/index.ts\"\nimport { getProjectSettings, validateCustomDomain } from \"document/stores/PublishStore.ts\"\nimport { RemoteProject } from \"editorbar/remote/RemoteProject.ts\"\nimport { DisconnectReason } from \"socket/types.ts\"\nimport { isRecoverableDisconnectReason } from \"socket/useSocket.ts\"\nimport { isAbortError } from \"web/lib/Fetcher.ts\"\nimport { prettyURL } from \"web/lib/Project.ts\"\nimport { AccessRequestStatus, type AccessRequestStatusWithLoading } from \"web/lib/RequestEditorAccess.ts\"\nimport { showTreeModeMismatchToast } from \"web/lib/showTreeModeMismatchToast.ts\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport { Pages, UIInteraction, record } from \"web/lib/tracker.ts\"\nimport { ExtendedPermissions } from \"../project/permissions/projectPermissions.ts\"\nimport { DashboardStore } from \"./DashboardStore.ts\"\nimport type { DashboardTreeStore, LocalTreeEditSource } from \"./DashboardTreeStore.ts\"\nimport type { FetchOriginStatus } from \"./components/Domains/Rewrites/RewriteModal.tsx\"\nimport type { RewriteFramerOrigin } from \"./components/Domains/Rewrites/getRewriteFramerOrigins.ts\"\nimport { getRewriteFramerOrigins } from \"./components/Domains/Rewrites/getRewriteFramerOrigins.ts\"\nimport { fetchProject } from \"./components/Domains/fetchProject.ts\"\nimport { fetchProjectAccessRequests } from \"./components/Domains/fetchProjectAccessRequests.ts\"\nimport { requestProjectAccess } from \"./components/Domains/requestProjectAccess.ts\"\nimport type { DashboardTeam } from \"./lib/dashboard/useDashboard.tsx\"\n\nconst logger = getLogger(\"DashboardProjectStore\")\n\ntype TeamID = string\n\ntype ProjectDataStatus = \"loading\" | \"success\" | \"error\"\n\ninterface ProjectDataState {\n\tprojectDataStatus: ProjectDataStatus\n\tprojectTitle: string\n\tisProjectOnEnterprisePlan: boolean\n\tisTeamMember: boolean\n\tprojectTeamId: TeamID | null\n\tcanEdit: boolean\n\tupsellRewrites: boolean\n\tupsellCustomHeaders: boolean\n\tupsellRedirects: boolean\n\tupsellStaging: boolean\n\tcanUseAdvancedHosting: FeatureValue\n\tprojectData: Project | null\n\tresourceLimits: {\n\t\trewrites: number | null\n\t\tmaxRewrites: number | null\n\t\tstaticFiles: number | null\n\t\tmaxStaticFiles: number | null\n\t}\n\tcanUseExternalRewrites: FeatureValue\n\tcanUseInternalRewrites: FeatureValue\n\tcanUseCustomHeaders: FeatureValue\n\tcanUseAdvancedHeaders: FeatureValue\n\tcanUseWellKnown: FeatureValue\n\tcanUseRedirects: FeatureValue\n\tcanUseRewrites: boolean\n\tmaxFileSizeInMB: number | null\n\tlicenseType: ProjectLicenseType\n}\n\ninterface ProjectAccessRequestState {\n\tprojectAccessRequestStatus: AccessRequestStatusWithLoading | undefined\n}\n\ninterface ProjectMemberState {\n\tisProjectMember: boolean\n}\n\ninterface HostnameState {\n\tisLoadingHostnameData: boolean\n\tupdatedAt: Date | undefined\n\tstagingDomain: string | undefined\n\tcustomDomain: string | undefined\n\tdeploymentName: string | undefined\n}\n\ninterface DNSValidationState {\n\thostnameStatus: HostnameStatus | undefined\n}\n\ninterface ProjectSettingsState {\n\tstagingEnabled: boolean\n}\n\ninterface FramerOriginsState {\n\tframerOrigins: RewriteFramerOrigin[]\n\tfetchOriginStatus: FetchOriginStatus\n}\n\ntype State = ProjectMemberState &\n\tProjectDataState &\n\tProjectAccessRequestState &\n\tHostnameState &\n\tDNSValidationState &\n\tProjectSettingsState &\n\tFramerOriginsState\n\nexport class DashboardProjectStore extends DashboardStore<State> {\n\tprivate project: RemoteProject | undefined\n\n\tconstructor(\n\t\treadonly projectId: string,\n\t\treadonly userId: string,\n\t\treadonly dashboardTeams: DashboardTeam[],\n\t\tprivate readonly componentLoader: ComponentLoader,\n\t\tprivate readonly signal: AbortSignal,\n\t\tprivate readonly treeStore: DashboardTreeStore,\n\t\tprivate readonly newTreeAfterRemoteUpdate: (tree: CanvasTree) => void,\n\t\tprivate readonly newTreeAfterLocalUpdate: (tree: CanvasTree, editSource: LocalTreeEditSource) => void,\n\t) {\n\t\tsuper({\n\t\t\tprojectDataStatus: \"loading\",\n\t\t\tprojectTitle: \"\",\n\t\t\tisProjectOnEnterprisePlan: false,\n\t\t\tisTeamMember: false,\n\t\t\tprojectTeamId: null,\n\t\t\tcanEdit: false,\n\t\t\tupsellRewrites: false,\n\t\t\tupsellCustomHeaders: false,\n\t\t\tupsellRedirects: false,\n\t\t\tupsellStaging: false,\n\t\t\tcanUseAdvancedHosting: \"off\",\n\t\t\tmaxFileSizeInMB: null,\n\n\t\t\tprojectAccessRequestStatus: undefined,\n\n\t\t\tisProjectMember: true,\n\n\t\t\tisLoadingHostnameData: true,\n\t\t\tupdatedAt: undefined,\n\t\t\tstagingDomain: undefined,\n\t\t\tdeploymentName: undefined,\n\n\t\t\thostnameStatus: undefined,\n\t\t\tcustomDomain: undefined,\n\n\t\t\tstagingEnabled: true,\n\n\t\t\tframerOrigins: [],\n\t\t\tfetchOriginStatus: \"fetching\",\n\n\t\t\tprojectData: null,\n\t\t\tresourceLimits: {\n\t\t\t\trewrites: 0,\n\t\t\t\tmaxRewrites: 0,\n\t\t\t\tstaticFiles: 0,\n\t\t\t\tmaxStaticFiles: 0,\n\t\t\t},\n\t\t\tcanUseInternalRewrites: \"off\",\n\t\t\tcanUseExternalRewrites: \"off\",\n\t\t\tcanUseCustomHeaders: \"off\",\n\t\t\tcanUseAdvancedHeaders: \"off\",\n\t\t\tcanUseWellKnown: \"off\",\n\t\t\tcanUseRedirects: \"off\",\n\t\t\tcanUseRewrites: false,\n\t\t\tlicenseType: ProjectLicenseType.FreeSite,\n\t\t})\n\n\t\tsignal.addEventListener(\"abort\", () => hidePublishChangesToast(), { once: true })\n\n\t\tthis.initialize().catch(error => {\n\t\t\tif (isAbortError(error)) return\n\t\t\tlogger.error(\"Failed to initialize project store:\", error)\n\t\t})\n\t}\n\n\tprivate async initialize() {\n\t\t// Critical path: must complete in order\n\t\tconst teamId = await this.loadProjectData()\n\n\t\tif (this.signal.aborted) return\n\n\t\t// RemoteProject configures the actual project mode from the socket init message.\n\t\tthis.loadProject()\n\n\t\t// Parallel non-blocking loads\n\t\tawait Promise.allSettled([\n\t\t\tteamId ? this.loadFramerOrigins(teamId) : Promise.resolve(),\n\t\t\tthis.loadProjectAccessRequestStatus(),\n\t\t\tthis.loadHostnames(),\n\t\t\tthis.validateDNS(),\n\t\t\tthis.loadProjectSettings(),\n\t\t])\n\t}\n\n\tasync loadProjectData(): Promise<TeamID | null> {\n\t\tlet projectTitle: string = \"\"\n\t\tlet projectTeamId: TeamID | null = null\n\t\tlet isProjectOnEnterprisePlan: boolean = false\n\t\tlet isTeamMember: boolean = false\n\t\tlet canEdit: boolean = false\n\t\tlet upsellRewrites: boolean = false\n\t\tlet upsellCustomHeaders: boolean = false\n\t\tlet upsellRedirects: boolean = false\n\t\tlet upsellStaging: boolean = false\n\t\tlet canUseAdvancedHosting: FeatureValue = \"off\"\n\t\tlet projectDataStatus: ProjectDataStatus = \"success\"\n\t\tlet resourceLimits: ProjectDataState[\"resourceLimits\"] = {\n\t\t\trewrites: 0,\n\t\t\tmaxRewrites: 0,\n\t\t\tstaticFiles: 0,\n\t\t\tmaxStaticFiles: 0,\n\t\t}\n\t\tlet licenseType: ProjectLicenseType = ProjectLicenseType.FreeSite\n\n\t\tlet canUseInternalRewrites: FeatureValue = \"off\"\n\t\tlet canUseExternalRewrites: FeatureValue = \"off\"\n\t\tlet canUseCustomHeaders: FeatureValue = \"off\"\n\t\tlet canUseAdvancedHeaders: FeatureValue = \"off\"\n\t\tlet canUseWellKnown: FeatureValue = \"off\"\n\t\tlet canUseRedirects: FeatureValue = \"off\"\n\t\tlet canUseRewrites: boolean = false\n\t\tlet maxFileSizeInMB: number | null = null\n\n\t\tlet projectData: Project | null = null\n\t\ttry {\n\t\t\tprojectData = await fetchProject(\n\t\t\t\tthis.projectId,\n\t\t\t\t// Don't add the user to the project\n\t\t\t\tfalse,\n\t\t\t\tthis.signal,\n\t\t\t)\n\n\t\t\tprojectTitle = projectData?.title ?? \"Sites\"\n\n\t\t\tif (projectData?.team) {\n\t\t\t\t// Check if the project is part of any of the teams the user is a member of\n\t\t\t\tisTeamMember = this.dashboardTeams.some(team => team.id === projectData?.team?.id)\n\t\t\t\tprojectTeamId = projectData?.team?.id ?? null\n\t\t\t}\n\n\t\t\tif (projectData?.userPermissions) {\n\t\t\t\tconst permissions = new ExtendedPermissions(projectData.userPermissions)\n\t\t\t\tcanEdit = permissions.canEditSiteSettings\n\t\t\t\tupsellRewrites = projectData.settings.featureFlags.canUseAdvancedHosting === \"upsell\"\n\t\t\t\tupsellCustomHeaders = projectData.settings.featureFlags.canUseAdvancedHosting === \"upsell\"\n\t\t\t\tupsellRedirects = projectData.settings.featureFlags.canUseRedirects === \"upsell\"\n\t\t\t\tupsellStaging = projectData.settings.featureFlags.canUseStagingEnvironment === \"upsell\"\n\t\t\t\tresourceLimits = projectData.settings.resourceLimits\n\t\t\t\tcanUseAdvancedHosting = projectData.settings.featureFlags.canUseAdvancedHosting\n\t\t\t\tcanUseInternalRewrites = projectData.settings.featureFlags.canUseInternalRewrites\n\t\t\t\tcanUseExternalRewrites = projectData.settings.featureFlags.canUseExternalRewrites\n\t\t\t\tcanUseCustomHeaders = projectData.settings.featureFlags.canUseCustomHeaders\n\t\t\t\tcanUseAdvancedHeaders = projectData.settings.featureFlags.canUseAdvancedHeaders\n\t\t\t\tcanUseWellKnown = projectData.settings.featureFlags.canUseWellKnown\n\t\t\t\tcanUseRedirects = projectData.settings.featureFlags.canUseRedirects\n\t\t\t\tcanUseRewrites = canUseInternalRewrites === \"on\" || canUseExternalRewrites === \"on\"\n\t\t\t\tmaxFileSizeInMB = projectData.settings.resourceLimits.fileUploadLimitInMB\n\t\t\t}\n\n\t\t\tif (projectData?.canvasFeatures) {\n\t\t\t\tprojectFeatures.update({ ...defaultProjectFeatures, ...projectData.canvasFeatures })\n\t\t\t}\n\n\t\t\tlicenseType = projectData?.license.type ?? ProjectLicenseType.FreeSite\n\t\t\tisProjectOnEnterprisePlan = projectData?.license.type === ProjectLicenseType.EnterpriseSite\n\t\t} catch (error) {\n\t\t\tif (isAbortError(error)) return projectTeamId\n\n\t\t\tprojectDataStatus = \"error\"\n\t\t\tlogger.error(\"Failed to fetch project:\", error)\n\t\t}\n\n\t\tthis.setState({\n\t\t\tprojectDataStatus,\n\t\t\tprojectTitle,\n\t\t\tprojectTeamId,\n\t\t\tisTeamMember,\n\t\t\tcanEdit,\n\t\t\tupsellRewrites,\n\t\t\tupsellCustomHeaders,\n\t\t\tupsellRedirects,\n\t\t\tupsellStaging,\n\t\t\tcanUseAdvancedHosting,\n\t\t\tisProjectOnEnterprisePlan,\n\t\t\tprojectData,\n\t\t\tresourceLimits,\n\t\t\tcanUseInternalRewrites,\n\t\t\tcanUseExternalRewrites,\n\t\t\tcanUseCustomHeaders,\n\t\t\tcanUseAdvancedHeaders,\n\t\t\tcanUseWellKnown,\n\t\t\tcanUseRedirects,\n\t\t\tcanUseRewrites,\n\t\t\tmaxFileSizeInMB,\n\t\t\tlicenseType,\n\t\t} satisfies ProjectDataState)\n\n\t\treturn projectTeamId\n\t}\n\n\tprivate loadProject() {\n\t\tif (this.project) return\n\t\tif (this.signal.aborted) return\n\n\t\t// Reset local store so UI shows a fresh loading state while connecting to a new project\n\t\tthis.treeStore.resetForNewProject(this.projectId)\n\t\tthis.project = new RemoteProject(this.treeStore, this.componentLoader, this.userId, this.projectId, this.signal)\n\n\t\tthis.project.connect()\n\n\t\tthis.project.on(\"update\", tree => {\n\t\t\tthis.newTreeAfterRemoteUpdate(tree)\n\t\t})\n\n\t\tconst handleDisconnect = (reason: DisconnectReason) => {\n\t\t\tif (isRecoverableDisconnectReason(reason)) return\n\n\t\t\t// Mark loading as complete when connection fails\n\t\t\tthis.treeStore.markLoadingComplete()\n\n\t\t\tif (reason === DisconnectReason.TreeModeMismatch) {\n\t\t\t\tshowTreeModeMismatchToast({\n\t\t\t\t\ttitle: \"Reconnect\",\n\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\tthis.project?.disconnect()\n\t\t\t\t\t\tthis.project = undefined\n\t\t\t\t\t\tthis.loadProject()\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// TODO: We should probably differentiate AccessDenied errors\n\t\t\t// from other non-recoverable errors, but since we don't have designs for error states,\n\t\t\t// this is good enough for now.\n\n\t\t\t// We can only determine that the user is not a project member after a failed connection\n\t\t\t// attempt.\n\n\t\t\t// FIXME: this is causing a white flash when switching between projects.\n\t\t\tthis.setState({ isProjectMember: false })\n\t\t}\n\t\tthis.project.on(\"disconnect\", handleDisconnect)\n\t\tthis.project.connection.on(\"disconnect\", handleDisconnect)\n\t}\n\n\tgetProject(): RemoteProject | undefined {\n\t\treturn this.project\n\t}\n\n\tprivate async loadFramerOrigins(teamId: string): Promise<void> {\n\t\tconst currentState = this.getState()\n\n\t\tif (currentState.framerOrigins.length > 0) return\n\n\t\tif (currentState.fetchOriginStatus !== \"fetching\") {\n\t\t\tthis.setState({ fetchOriginStatus: \"fetching\" })\n\t\t}\n\n\t\tlet framerOrigins: RewriteFramerOrigin[] = []\n\t\tlet fetchOriginStatus: FetchOriginStatus\n\t\ttry {\n\t\t\tframerOrigins = await getRewriteFramerOrigins(teamId, this.signal)\n\t\t\tfetchOriginStatus = \"success\"\n\t\t} catch (error) {\n\t\t\tif (isAbortError(error)) return\n\n\t\t\tlogger.reportError(new Error(\"Failed to fetch framer origins\", { cause: error }))\n\t\t\tfetchOriginStatus = \"error\"\n\t\t}\n\n\t\tthis.setState({ framerOrigins, fetchOriginStatus })\n\t}\n\n\tgetFramerOrigins():\n\t\t| { value: readonly RewriteFramerOrigin[]; status: Extract<FetchOriginStatus, \"success\"> }\n\t\t| { status: Exclude<FetchOriginStatus, \"success\"> } {\n\t\tconst { fetchOriginStatus: status, framerOrigins: value } = this.getState()\n\t\tif (status !== \"success\") {\n\t\t\treturn { status }\n\t\t}\n\n\t\treturn { status, value }\n\t}\n\n\tprivate async loadHostnames() {\n\t\tconst { hostnames } = await listHostnames(this.projectId, undefined, this.signal).catch(error => {\n\t\t\tif (isAbortError(error)) return { hostnames: null }\n\n\t\t\tlogger.error(`Error listing hostnames ${error}`)\n\t\t\treturn { hostnames: null }\n\t\t})\n\n\t\tconst newState: HostnameState = {\n\t\t\tisLoadingHostnameData: false,\n\t\t\tupdatedAt: undefined,\n\t\t\tstagingDomain: undefined,\n\t\t\tcustomDomain: undefined,\n\t\t\tdeploymentName: undefined,\n\t\t}\n\n\t\tif (!hostnames || hostnames.length === 0) {\n\t\t\tthis.setState(newState)\n\t\t\treturn\n\t\t}\n\n\t\tconst defaultHostname = hostnames.find(hostname => hostname.type === HostnameType.Default)\n\t\tconst customHostname = hostnames.find(hostname => hostname.type === HostnameType.Custom)\n\n\t\tif (defaultHostname) {\n\t\t\tnewState.updatedAt = new Date(defaultHostname.deployment.updatedAt)\n\t\t\tnewState.stagingDomain = defaultHostname.hostname\n\t\t}\n\n\t\tif (customHostname) {\n\t\t\tnewState.deploymentName = customHostname.deployment.deployedBy.name\n\t\t\t// HostnameStatus should be obtained from the validateCustomDomain call\n\t\t\tnewState.customDomain = customHostname.hostname\n\t\t}\n\n\t\tthis.setState(newState)\n\t}\n\n\tasync validateDNS() {\n\t\ttry {\n\t\t\t// Trigger DNS validation and get updated status\n\t\t\t// Note: We only update hostnameStatus here because deployment info\n\t\t\t// (updatedAt, deploymentName, stagingDomain) doesn't change during DNS validation\n\t\t\tconst { hostnames } = await validateCustomDomain({ projectId: this.projectId }, this.signal)\n\n\t\t\tconst customNonRedirectHostname = hostnames.find(\n\t\t\t\thostname => hostname.type === HostnameType.Custom && !hostname.redirect,\n\t\t\t)\n\n\t\t\tif (customNonRedirectHostname) {\n\t\t\t\tthis.setState({ hostnameStatus: customNonRedirectHostname.status })\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (isAbortError(error)) return\n\n\t\t\tlogger.reportError(new Error(\"Failed to validate and refresh hostname status\", { cause: error }), {\n\t\t\t\tprojectId: this.projectId,\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate async loadProjectSettings() {\n\t\ttry {\n\t\t\tconst { settings } = await getProjectSettings(this.projectId, this.signal)\n\t\t\tthis.setState({\n\t\t\t\tstagingEnabled: settings.deploymentSettings.deploymentStrategy === DeploymentStrategy.Manual,\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tif (isAbortError(error)) return\n\n\t\t\tlogger.reportError(new Error(\"Failed to load project settings\", { cause: error }), {\n\t\t\t\tprojectId: this.projectId,\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate async loadProjectAccessRequestStatus() {\n\t\tconst { canEdit, projectDataStatus } = this.getState()\n\t\tif (canEdit || projectDataStatus === \"loading\") return\n\n\t\ttry {\n\t\t\tconst { accessRequests } = await fetchProjectAccessRequests(this.projectId, this.signal)\n\t\t\tif (accessRequests.project) {\n\t\t\t\tthis.setState({ projectAccessRequestStatus: accessRequests.project.status })\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (isAbortError(error)) return\n\n\t\t\t// TODO: handle error properly\n\t\t\tlogger.error(\"Failed to fetch project access requests\", error)\n\t\t}\n\t}\n\n\tasync requestAccess() {\n\t\ttry {\n\t\t\tawait requestProjectAccess(this.projectId, this.signal)\n\n\t\t\tthis.setState({ projectAccessRequestStatus: AccessRequestStatus.Pending })\n\n\t\t\tshowRequestAccessSuccessToast()\n\t\t} catch (error) {\n\t\t\tif (isAbortError(error)) return\n\n\t\t\tlogger.error(\"Failed to request edit access:\", error)\n\t\t\tshowRequestAccessErrorToast()\n\t\t}\n\t}\n\n\tprivate isJoiningProject = false\n\n\treadonly joinProject = async () => {\n\t\tif (this.isJoiningProject) return\n\n\t\tthis.isJoiningProject = true\n\n\t\ttry {\n\t\t\t// Fetch the project again but this time we add the user to the project\n\t\t\t// TODO: Replace this with an endpoint that _only_ adds the user to the project\n\t\t\tawait fetchProject(this.projectId, true)\n\n\t\t\t// Reload the page. This is simpler than managing all the states to make a perfect reload\n\t\t\t// TODO: We might want to make this a bit smoother in the future\n\t\t\twindow.location.reload()\n\t\t} catch {\n\t\t\t// TODO: handle this error properly\n\t\t\tthis.isJoiningProject = false\n\t\t}\n\t}\n\n\treadonly openProject = () => {\n\t\topenProject(this.projectId, { showPublishModal: false })\n\t}\n\n\tprivate showPublishChangesToast() {\n\t\ttoast({\n\t\t\tkey: publishChangesToastKey,\n\t\t\ttype: \"add\",\n\t\t\tvariant: \"info\",\n\t\t\tprimaryText: \"Publish your site\",\n\t\t\tsecondaryText: \"to apply changes.\",\n\t\t\tduration: 5000,\n\t\t\t// Action must be an extraAction for the button to be primary (otherwise it's ignored)\n\t\t\textraAction: {\n\t\t\t\ttitle: Dictionary.Publish,\n\t\t\t\tonClick: () => openProject(this.projectId, { showPublishModal: true }),\n\t\t\t\tprimary: true,\n\t\t\t},\n\t\t})\n\t}\n\n\t// TODO: call this method automatically whenever the tree is updated\n\tcommitTreeAndSend(editSource: LocalTreeEditSource = \"userEdit\") {\n\t\tassert(this.project, \"Project must be initialized\")\n\n\t\tconst { tree } = this.treeStore.timeline.commitLocalTree()\n\t\tthis.newTreeAfterLocalUpdate(tree, editSource)\n\t\tthis.project.maybeSend()\n\n\t\tif (editSource === \"userEdit\") {\n\t\t\tthis.showPublishChangesToast()\n\t\t}\n\t}\n}\n\nconst publishChangesToastKey = \"publish-changes\"\n\nfunction hidePublishChangesToast() {\n\ttoast({ type: \"remove\", key: publishChangesToastKey })\n}\n\nconst requestAccessToastKey = \"request-access-project\"\n\nfunction showRequestAccessSuccessToast() {\n\ttoast({\n\t\tkey: requestAccessToastKey,\n\t\ttype: \"add\",\n\t\tvariant: \"success\",\n\t\ticon: \"success\",\n\t\tprimaryText: \"You requested\",\n\t\tsecondaryText: \"edit access for this project.\",\n\t})\n}\n\nfunction showRequestAccessErrorToast() {\n\ttoast({\n\t\tkey: requestAccessToastKey,\n\t\ttype: \"add\",\n\t\tvariant: \"error\",\n\t\ticon: \"error\",\n\t\tprimaryText: \"Failed to request\",\n\t\tsecondaryText: \"edit access for this project.\",\n\t})\n}\n\nfunction openProject(projectId: string, options: { showPublishModal: boolean }) {\n\trecord(\"ui_interaction\", { page: Pages.domains, id: UIInteraction.openProject })\n\tconst url = prettyURL({\n\t\tid: projectId,\n\t\ttitle: null,\n\t\tcanvasFeatures: {},\n\t})\n\n\tif (options.showPublishModal) {\n\t\turl.searchParams.set(\"view\", \"publish\")\n\t}\n\n\twindow.open(url.toString(), \"_blank\")\n\thidePublishChangesToast()\n}\n", "import { parseURL } from \"@framerjs/app-shared\"\nimport { assert, getLogger, murmurHash, stableStringify } from \"@framerjs/shared\"\nimport type { NodeChangesReader, TreeUpdater } from \"document/models/CanvasTree/TreeUpdater.ts\"\nimport type { CanvasTree } from \"document/models/CanvasTree/index.ts\"\nimport type { RewriteRouteNode } from \"document/models/CanvasTree/nodes/RewriteRouteNode.ts\"\nimport { RewriteType } from \"document/models/CanvasTree/nodes/RewriteTypeEnum.ts\"\nimport { ROUTES_NODE_ID, RoutesNode } from \"document/models/CanvasTree/nodes/RoutesNode.ts\"\nimport { NotFound } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { filterNonHashableProperties } from \"document/models/CanvasTree/traits/utils/calculateModuleRevision.ts\"\nimport { isNumber, isUndefined } from \"utils/typeChecks.ts\"\nimport { apiFetcher } from \"web/lib/apiFetcher.ts\"\nimport type { DashboardProjectStore } from \"./DashboardProjectStore.ts\"\nimport type { DashboardTreeStore } from \"./DashboardTreeStore.ts\"\nimport type { RewriteFramerOrigin } from \"./components/Domains/Rewrites/getRewriteFramerOrigins.ts\"\n\nconst logger = getLogger(\"DashboardRewriteSyncStore\")\n\nconst NotLoaded = Symbol(\"NotLoaded\")\ntype NotLoaded = typeof NotLoaded\n\ntype EditSource = \"remote\" | \"localUserEdit\" | \"localNonUserEdit\"\n\n/**\n * This store is responsible for syncing the proxied projects with the backend.\n * Rewrite changes are automatically detected and synced with the server.\n * If any pending changes are detected when the dashboard is initially loaded,\n * it also syncs the changes with the server.\n */\nexport class DashboardRewriteSyncStore {\n\tnodeChangesReader: NodeChangesReader\n\n\tprivate treeUpdater: TreeUpdater\n\n\tconstructor(\n\t\tprivate readonly projectStore: DashboardProjectStore,\n\t\tprivate readonly treeStore: DashboardTreeStore,\n\t\tprivate readonly abortSignal: AbortSignal,\n\t) {\n\t\tthis.nodeChangesReader = treeStore.timeline.openNodeChangesReader()\n\t\tthis.treeUpdater = treeStore.timeline\n\n\t\ttreeStore.subscribe(() => {\n\t\t\tif (treeStore.timeline !== this.treeUpdater) {\n\t\t\t\tthis.nodeChangesReader = treeStore.timeline.openNodeChangesReader()\n\t\t\t\tthis.treeUpdater = treeStore.timeline\n\t\t\t}\n\t\t})\n\n\t\tthis.unsubscribeFromProjectStoreChanges = this.projectStore.subscribe(this.projectStoreDidChange)\n\n\t\tthis.abortSignal.addEventListener(\n\t\t\t\"abort\",\n\t\t\t() => {\n\t\t\t\tthis.unsubscribeFromProjectStoreChanges()\n\t\t\t\tthis.cancelScheduledProxiedProjectsSync()\n\t\t\t},\n\t\t\t{ once: true },\n\t\t)\n\t}\n\n\tprivate readonly unsubscribeFromProjectStoreChanges: VoidFunction\n\n\tprivate projectStoreDidChange = () => {\n\t\t// Try to sync proxied projects once the fetch origin status is loaded.\n\t\tconst { fetchOriginStatus } = this.projectStore.getState()\n\t\tif (fetchOriginStatus !== \"success\") return\n\n\t\tthis.unsubscribeFromProjectStoreChanges()\n\n\t\tconst shouldSyncProxiedProjects = this.shouldSyncProxiedProjects()\n\n\t\tlogger.info(\"Fetch origin status loaded, should sync proxied projects:\", shouldSyncProxiedProjects)\n\n\t\tif (shouldSyncProxiedProjects) {\n\t\t\tthis.scheduleProxiedProjectsSync(\"remote\")\n\t\t}\n\t}\n\n\tpostProcessTreeUpdate(editSource: EditSource) {\n\t\tconst changes = this.nodeChangesReader.read()\n\t\tif (!changes.has(ROUTES_NODE_ID)) return\n\n\t\tif (!this.shouldSyncProxiedProjects()) return\n\n\t\tif (editSource !== \"remote\") {\n\t\t\tconst routesNode = RoutesNode.get(this.treeStore.tree)\n\t\t\tassert(routesNode, \"Routes node must be loaded when syncing proxied projects\")\n\n\t\t\tif (routesNode.committedRewritesHash !== \"stale\") {\n\t\t\t\t// Mark the node as dirty on the server for everyone. This way other clients will\n\t\t\t\t// retry if our sync fails.\n\t\t\t\troutesNode.set({ committedRewritesHash: \"stale\" })\n\t\t\t\tthis.projectStore.commitTreeAndSend(\"nonUserEdit\")\n\t\t\t}\n\t\t}\n\n\t\tlogger.info(\"Post-processing tree update where the hash has changed, edit type:\", editSource)\n\t\tthis.scheduleProxiedProjectsSync(editSource)\n\t}\n\n\tprivate previousHash: number | NotLoaded | NotFound = NotFound\n\n\tprivate shouldSyncProxiedProjects(): boolean {\n\t\tconst { fetchOriginStatus } = this.projectStore.getState()\n\t\tif (fetchOriginStatus !== \"success\") return false\n\n\t\tconst hash = computeRewritesHash(this.treeStore.tree)\n\t\tif (hash === NotFound) return false\n\t\tif (hash === NotLoaded) return false\n\t\tif (hash === this.previousHash) return false\n\t\tthis.previousHash = hash\n\t\tconst routesNode = RoutesNode.get(this.treeStore.tree)\n\t\tassert(routesNode?.isLoaded(), \"Routes node must be loaded after calculating a hash\")\n\n\t\t// If we have never synced before, we don't need to sync unless we have rewrites now.\n\t\tconst hasNoRewrites = hash === noRewritesHash\n\t\tconst hasNeverBeenSynced = isUndefined(routesNode.committedRewritesHash)\n\t\tif (hasNoRewrites && hasNeverBeenSynced) return false\n\n\t\treturn routesNode.committedRewritesHash !== hash\n\t}\n\n\tprivate scheduledProxiedProjectsSync: number | undefined\n\n\tprivate cancelScheduledProxiedProjectsSync(): void {\n\t\twindow.clearTimeout(this.scheduledProxiedProjectsSync)\n\t}\n\n\tprivate scheduleProxiedProjectsSync(editSource: EditSource): void {\n\t\t// Cancel a previous scheduled sync if it's still pending.\n\t\tthis.cancelScheduledProxiedProjectsSync()\n\n\t\tconst localEditDebounceDelay = 1_000 // 1 second\n\t\tconst remoteEditDebounceDelay = 5_000 + Math.random() * 10_000 // 5-15 seconds, random to avoid thundering herd\n\t\tconst debounceDelay = editSource === \"remote\" ? remoteEditDebounceDelay : localEditDebounceDelay\n\n\t\tthis.scheduledProxiedProjectsSync = window.setTimeout(() => {\n\t\t\tvoid this.syncProxiedProjects()\n\t\t}, debounceDelay)\n\t}\n\n\tprivate async syncProxiedProjects() {\n\t\tif (this.abortSignal.aborted) return\n\n\t\tconst hashBeforeSync = computeRewritesHash(this.treeStore.tree)\n\t\tassert(isNumber(hashBeforeSync), \"Hash should be a number when starting a sync\")\n\n\t\tconst tree = this.treeStore.tree\n\t\tconst routesNode = RoutesNode.get(tree)\n\n\t\tassert(routesNode?.isLoaded(), \"Routes node must be loaded after calculating a hash\")\n\n\t\t// Our current state is already committed to the server, nothing to do.\n\t\tif (hashBeforeSync === routesNode.committedRewritesHash) return\n\n\t\tconst framerOrigins = this.projectStore.getFramerOrigins()\n\t\tif (framerOrigins.status !== \"success\") return\n\n\t\ttry {\n\t\t\tlogger.info(\"Storing proxied projects\")\n\t\t\tawait storeProxiedProjects(\n\t\t\t\tthis.projectStore.projectId,\n\t\t\t\troutesNode.getRewriteRoutes(),\n\t\t\t\tframerOrigins.value,\n\t\t\t\tthis.treeStore.remoteTreeVersion,\n\t\t\t)\n\t\t\tlogger.info(\"Proxied projects stored\")\n\n\t\t\tif (this.abortSignal.aborted) return\n\n\t\t\tconst hashAfterSync = computeRewritesHash(this.treeStore.tree)\n\t\t\tassert(isNumber(hashAfterSync), \"Hash should be a number after sync\")\n\n\t\t\tif (hashAfterSync !== hashBeforeSync) {\n\t\t\t\t// Client has newer changes, don't update the server hash.\n\t\t\t\tlogger.info(\"Client has newer changes, not updating the server hash\")\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Committed version is the latest version, store the new committed hash.\n\t\t\tconst currentRoutesNode = this.treeStore.tree.current(routesNode)\n\t\t\tassert(currentRoutesNode, \"Routes node cannot be deleted\")\n\t\t\tcurrentRoutesNode.set({ committedRewritesHash: hashAfterSync })\n\t\t\tthis.projectStore.commitTreeAndSend(\"nonUserEdit\")\n\t\t} catch (error) {\n\t\t\tlogger.reportError(new Error(\"Failed to store proxied projects\", { cause: error }))\n\t\t}\n\t}\n}\n\nconst noRewritesHash = murmurHash(\"\")\n\nexport function computeRewritesHash(tree: CanvasTree): number | NotLoaded | NotFound {\n\tconst routesNode = RoutesNode.get(tree)\n\tif (!routesNode) return NotFound\n\tif (!routesNode.isLoaded()) return NotLoaded\n\n\tconst rewriteRoutes = routesNode.getRewriteRoutes()\n\n\t// Sort the nodes by id so the hash is stable.\n\tconst sortedRewriteRoutes = rewriteRoutes.toSorted((a, b) => a.id.localeCompare(b.id))\n\n\tlet hash = \"\"\n\tfor (const rewriteRoute of sortedRewriteRoutes) {\n\t\tif (rewriteRoute.rewriteType !== RewriteType.Internal) continue\n\t\thash += stableStringify(rewriteRoute, filterNonHashableProperties)\n\t}\n\n\treturn murmurHash(hash)\n}\n\nasync function storeProxiedProjects(\n\tprojectId: string,\n\trewriteRouteNodes: readonly RewriteRouteNode[],\n\tframerOrigins: readonly RewriteFramerOrigin[],\n\ttreeVersion: number,\n): Promise<void> {\n\tconst targetProjectIds = new Set<string>()\n\tfor (const rewriteRouteNode of rewriteRouteNodes) {\n\t\tif (rewriteRouteNode.rewriteType !== RewriteType.Internal) continue\n\n\t\tconst targetProjectHostname = parseURL(rewriteRouteNode.targetUrl).hostname\n\t\tconst targetProjectId = framerOrigins.find(origin => origin.hostname === targetProjectHostname)?.projectId\n\t\tif (!targetProjectId) {\n\t\t\tlogger.reportError(new Error(\"Target project ID not found for rewrite rule\"))\n\t\t\tcontinue\n\t\t}\n\n\t\ttargetProjectIds.add(targetProjectId)\n\t}\n\n\tconst proxiedProjects = Array.from(targetProjectIds).map(targetProjectId => ({ targetProjectId }))\n\n\tconst body = { treeVersion, proxiedProjects }\n\n\tawait apiFetcher.put(`/web/projects/${projectId}/proxied-projects`, body)\n}\n", "import type { ComponentLoader } from \"@framerjs/framer-runtime\"\nimport { SandboxRepeaterData } from \"document/SandboxRepeaterData.ts\"\nimport {\n\tgetBaseTreeStoreMode,\n\tswitchBaseTreeStoreMode,\n\ttype BaseTreeStore,\n} from \"document/base-engine/BaseTreeStore.ts\"\nimport { getCrdtSession } from \"document/crdt/CrdtSession.ts\"\nimport type { DataTree } from \"document/crdt/data-tree/DataTree.ts\"\nimport { getTreeMode } from \"document/crdt/isCrdt.ts\"\nimport { CrdtTreeCommitter } from \"document/crdt/sync/CrdtTreeCommitter.ts\"\nimport { TreeTimeline } from \"document/models/CanvasTree/TreeTimeline.ts\"\nimport type { TreeUpdater } from \"document/models/CanvasTree/TreeUpdater.ts\"\nimport { CanvasTree } from \"document/models/CanvasTree/index.ts\"\nimport { ROUTES_NODE_ID, RoutesNode } from \"document/models/CanvasTree/nodes/RoutesNode.ts\"\nimport { setTreeMode, type TreeMode } from \"document/stores/TreeMode.ts\"\nimport { DashboardStore } from \"./DashboardStore.ts\"\nimport type { DashboardUndoRedoManager } from \"./DashboardUndoRedoManager.ts\"\n\nconst emptySet: ReadonlySet<string> = new Set()\n\nexport type LocalTreeEditSource = \"userEdit\" | \"nonUserEdit\"\n\nfunction isFullyLoadedTree(tree: CanvasTree, loadingTree: CanvasTree) {\n\tif (tree === loadingTree) return false\n\n\t// All domain dashboard functionality requires the routes node to be loaded.\n\tconst routesNode = RoutesNode.get(tree)\n\treturn !routesNode || routesNode.isLoaded() === true\n}\n\ninterface State {\n\treadonly tree: CanvasTree\n\treadonly isLoadingTree: boolean\n}\n\nexport class DashboardTreeStore extends DashboardStore<State> implements BaseTreeStore {\n\t/** @deprecated Do not use: we do not need sandbox data in the dashboard.\n\t * This is here to fulfill BaseTreeStore interface.\n\t */\n\treadonly sandboxRepeaterData = new SandboxRepeaterData(\"dashboard\")\n\n\tget tree() {\n\t\treturn this.getState().tree\n\t}\n\n\tprivate setTree(tree: CanvasTree, mode = this.mode) {\n\t\tconst isLoadingTree = !isFullyLoadedTree(tree, this.loadingTree)\n\t\tthis.setState({ tree, isLoadingTree })\n\t\ttree.setService(\"treeQueryContext\", this)\n\t\tsetTreeMode(tree, mode)\n\t}\n\n\ttimeline: TreeUpdater\n\tprivate projectId: string | undefined\n\tprivate readonly loadingTree: CanvasTree\n\n\tget remoteTreeVersion() {\n\t\treturn this.timeline.remoteTreeVersion\n\t}\n\n\t/** @NOOP */\n\tgetDataTree(): DataTree | undefined {\n\t\treturn undefined\n\t}\n\t/** @NOOP */\n\tgetDataTreeOrPartialTree() {\n\t\treturn this.tree\n\t}\n\t/** @NOOP */\n\tgetPartialIndexes() {\n\t\treturn {\n\t\t\tcodeComponents: [],\n\t\t\tshaderNodes: [],\n\t\t\trichTextNodes: [],\n\t\t\tformContainerNodeIds: emptySet,\n\t\t\twithDataIdentifierNodeIds: emptySet,\n\t\t}\n\t}\n\t/** @NOOP */\n\tgetLoadedIndexes() {\n\t\treturn {\n\t\t\tcodeComponents: [],\n\t\t\tshaderNodes: [],\n\t\t\trichTextNodes: [],\n\t\t}\n\t}\n\n\tconstructor(\n\t\tprivate readonly componentLoader: ComponentLoader,\n\t\tprivate readonly undoRedoManager: DashboardUndoRedoManager,\n\t) {\n\t\tconst loadingTree = CanvasTree.createWithRouteSegmentRoot()\n\t\tsuper({ tree: loadingTree, isLoadingTree: true })\n\t\tthis.loadingTree = loadingTree\n\t\tconst mode = getTreeMode()\n\t\tthis.tree.setService(\"treeQueryContext\", this)\n\t\tsetTreeMode(this.tree, mode)\n\t\tthis.timeline = this.createTimeline(mode)\n\t}\n\n\t/**\n\t * Reset the tree to the initial empty state. This is useful when switching projects\n\t * so that subscribers can reflect a fresh loading state.\n\t */\n\tresetForNewProject(projectId: string): asserts this is this & { timeline: TreeUpdater } {\n\t\tthis.projectId = projectId\n\t\tconst mode = getTreeMode()\n\t\tthis.setTree(this.loadingTree, mode)\n\t\tthis.timeline = this.createTimeline(mode)\n\t}\n\n\tget mode(): TreeMode {\n\t\treturn getBaseTreeStoreMode(this)\n\t}\n\n\tset mode(mode: TreeMode) {\n\t\tswitchBaseTreeStoreMode(this, mode, {\n\t\t\tinitialTree: this.loadingTree,\n\t\t\tcreateTimeline: nextMode => this.createTimeline(nextMode),\n\t\t})\n\t}\n\n\tprivate createTimeline(mode: TreeMode): TreeUpdater {\n\t\tconst projectId = this.projectId\n\t\tconst afterLocalWrite = projectId\n\t\t\t? (branchId: string, seq: number) => getCrdtSession().setSeqWatermark(projectId, branchId, seq)\n\t\t\t: undefined\n\n\t\treturn mode === \"crdt\"\n\t\t\t? new CrdtTreeCommitter(this.tree, this.componentLoader, { afterLocalWrite })\n\t\t\t: new TreeTimeline(this.tree, this.componentLoader)\n\t}\n\n\t/**\n\t * Mark loading as complete. This should be called when either:\n\t * - A tree is successfully loaded\n\t * - A connection fails and we want to stop showing the loading state\n\t */\n\tmarkLoadingComplete() {\n\t\tthis.setState({ isLoadingTree: false })\n\t}\n\n\tprivate getChangesForUndo() {\n\t\tconst changes = this.timeline.getLatestChangesForUndo()\n\t\tif (!changes) return []\n\t\treturn changes.filter(change => !change.ignoreInUndo)\n\t}\n\n\tnewTreeAfterRemoteUpdate(tree: CanvasTree) {\n\t\ttree.inEditor = true\n\n\t\tif (this.tree === tree) return\n\n\t\t// Prioritize loading the routes scope for dashboard functionality\n\t\tconst loader = tree.getService(\"loader\")\n\n\t\tif (loader && !loader.hasLoadedScope(ROUTES_NODE_ID)) {\n\t\t\tvoid loader.prioritizeLoadingScope(ROUTES_NODE_ID)\n\t\t}\n\n\t\t// Enable partial scope access to allow accessing children of nodes\n\t\t// that might be in a partial loading state (like ROUTES_NODE_ID)\n\t\ttree.beginAllowPartialScopeAccess()\n\n\t\t// Commit any changes that might be pending\n\t\tif (tree.hasUncommittedChanges()) {\n\t\t\ttree = tree.commit(this.componentLoader)\n\t\t}\n\n\t\ttree.endAllowPartialScopeAccess()\n\n\t\tthis.setTree(tree)\n\t\t// Mark loading as complete when we receive a tree update\n\t\tthis.markLoadingComplete()\n\t}\n\n\tnewTreeAfterLocalUpdate(tree: CanvasTree, editSource: LocalTreeEditSource) {\n\t\ttree.inEditor = true\n\n\t\tif (this.tree === tree) return\n\t\tthis.setTree(tree)\n\n\t\tconst changes = this.getChangesForUndo()\n\t\tif (editSource === \"userEdit\" && changes.length > 0) {\n\t\t\tthis.undoRedoManager.addUndoEntry({ changes })\n\t\t}\n\t}\n}\n", "import { type BaseUndoRedoEntry, BaseUndoRedoManager } from \"document/base-engine/BaseUndoRedoManager.ts\"\n\ntype DashboardUndoRedoEntry = BaseUndoRedoEntry\n\nexport class DashboardUndoRedoManager extends BaseUndoRedoManager<DashboardUndoRedoEntry> {}\n", "import { assert } from \"@framerjs/shared\"\nimport type { PropsWithChildren } from \"react\"\nimport { createContext, useContext, useEffect } from \"react\"\nimport { useHistory } from \"react-router-dom\"\nimport { useQuery } from \"../../lib/useQuery.ts\"\nimport type { DomainTab } from \"./domainTab.ts\"\nimport { defaultDomainTab, isValidDomainTab } from \"./domainTab.ts\"\n\nconst SelectedDomainTabContext = createContext<DomainTab | null>(null)\nSelectedDomainTabContext.displayName = \"SelectedDomainTabContext\"\n\nexport function SelectedDomainTabProvider({ children, projectId }: PropsWithChildren<{ projectId: string }>) {\n\tconst queryTab = useQuery().get(\"tab\")\n\tconst history = useHistory()\n\n\tconst isValid = isValidDomainTab(queryTab)\n\n\tuseEffect(() => {\n\t\tif (projectId && !isValid) {\n\t\t\thistory.replace(`?tab=${defaultDomainTab}`)\n\t\t}\n\t}, [history, projectId, isValid])\n\n\treturn (\n\t\t<SelectedDomainTabContext.Provider value={isValid ? queryTab : defaultDomainTab}>\n\t\t\t{children}\n\t\t</SelectedDomainTabContext.Provider>\n\t)\n}\n\nexport function useSelectedDomainTab(): DomainTab {\n\tconst selectedTab = useContext(SelectedDomainTabContext)\n\tassert(selectedTab, \"useSelectedDomainTab must be used within a DomainTabProvider\")\n\treturn selectedTab\n}\n", "import \"index.styles_jfjz5u.wyw.css\"; export const rowHeight = 40;\nexport const contentPaddingBottom = 60;\nexport const domainHeaderHeight = 210;\nexport const subheaderHeight = 126;\nexport const subheaderWithSearchHeight = 180;\nexport const mainContainer = \"mainContainer_m86bpcd\";\nexport const mainContainerNonVirtualized = \"mainContainerNonVirtualized_m1hr6m6p\";\nexport const virtualListContainer = \"virtualListContainer_v1kc2szm\";\nexport const virtualizedListItem = \"virtualizedListItem_v1m7b0y8\";\nexport const maxWidthContainer = \"maxWidthContainer_m1e16rhh\";\nexport const stickyHeader = \"stickyHeader_snzmie9\";\nexport const domainHeader = \"domainHeader_d161gygo\";\nexport const title = \"title_tz69u0g\";\nexport const domainSubheading = \"domainSubheading_dr8uyme\";\nexport const tabs = \"tabs_t1hemrvh\";\nexport const domainTab = \"domainTab_d3xfmwb\";\nexport const domainTabActive = \"domainTabActive_dayrl8f\";\nexport const headingsSectionButtonContainer = \"headingsSectionButtonContainer_hy3htsw\";\nexport const tableAddButton = \"tableAddButton_t12frgkw\";\nexport const increaseHitTarget = \"increaseHitTarget_i1lxncb7\";\nexport const collapsingHorizontalBorders = \"collapsingHorizontalBorders_cxsg3jo\";\nexport const defaultHeadersRow = \"defaultHeadersRow_dsuieoe\";\nexport const noGrab = \"noGrab_n150x02e\";\nexport const infoTitle = \"infoTitle_ifmgtba\";\nexport const infoDescription = \"infoDescription_ijieoze\";\nexport const button = \"button_b1hgs1vf\";\nexport const openDashboardButton = \"openDashboardButton_o1646tsa\";\nexport const rotate = \"rotate_r1apwiz6\";\nexport const rotateBack = \"rotateBack_rgmgipr\";\nexport const grow = \"grow_g1nwwwos\";\nexport const errorMessage = \"errorMessage_ehg3t95\";\nexport const warningMessage = \"warningMessage_w1o6tyth\";\nexport const subheaderContainer = \"subheaderContainer_s1tjrrls\";\nexport const subheader = \"subheader_s9jshx9\";\nexport const subheaderWithSearch = \"subheaderWithSearch_s1y95m3\";\nexport const ruleDescription = \"ruleDescription_r12qrwc5\";\nexport const learnMoreLink = \"learnMoreLink_l1dmzf9n\";\nexport const filterInput = \"filterInput_f10np4ax\";\nexport const rewriteInfoTooltip = \"rewriteInfoTooltip_rjfmjs7\";\nexport const advancedHostingInfoIcon = \"advancedHostingInfoIcon_acj3e9s\";\nexport const matchPagesFirstDescription = \"matchPagesFirstDescription_m12dde0n\";\nexport const matchPagesFirstCheckboxContainer = \"matchPagesFirstCheckboxContainer_m4gazps\";\nexport const matchPagesFirstContainer = \"matchPagesFirstContainer_m1fdqxey\";\nexport const deleteFileButton = \"deleteFileButton_d1p2sjra\";\nexport const fileNameContainer = \"fileNameContainer_f1vcj8x3\";\nexport const fileIcon = \"fileIcon_f1fsa3gy\";\nexport const filenameOrUploadContainer = \"filenameOrUploadContainer_f1dokmyg\";\nexport const filesText = \"filesText_f1c2bw4w\";\nexport const acquireAddOnModal = \"acquireAddOnModal_a5sa5bt\";", "import { Link, Stack, T } from \"@framerjs/fresco\"\nimport { assertNever } from \"@framerjs/shared\"\nimport { useSelectedDomainTab } from \"./SelectedDomainTab.tsx\"\nimport type { DomainTab } from \"./domainTab.ts\"\nimport * as domainStyles from \"./index.styles.ts\"\n\nexport function TabHeaderDescription() {\n\tconst selectedTab = useSelectedDomainTab()\n\n\tif (selectedTab === \"overview\") return null\n\n\tconst descriptionLines = getDescriptionLines(selectedTab)\n\n\treturn (\n\t\t<Stack gap={0}>\n\t\t\t<T className={domainStyles.ruleDescription}>{descriptionLines.line1}</T>\n\t\t\t<Stack direction=\"row\" gap={4}>\n\t\t\t\t<T className={domainStyles.ruleDescription}>{descriptionLines.line2}</T>\n\t\t\t\t<Link href={learnMoreLinks[selectedTab]} className={domainStyles.learnMoreLink}>\n\t\t\t\t\tLearn more\n\t\t\t\t</Link>\n\t\t\t</Stack>\n\t\t</Stack>\n\t)\n}\n\ntype NonOverviewDomainTab = Exclude<DomainTab, \"overview\">\n\nexport const learnMoreLinks: Record<NonOverviewDomainTab, string> = {\n\t\"multi-site\": \"https://www.framer.com/help/articles/how-to-use-multi-site-with-rewrite-rules/\",\n\theaders: \"https://www.framer.com/help/articles/how-to-use-custom-headers/\",\n\tredirects: \"https://www.framer.com/help/articles/how-to-setup-redirects-to-maintain-seo-ranking/\",\n\tfiles: \"https://www.framer.com/help/articles/well-known-files/\",\n}\n\ninterface DescriptionLines {\n\tline1: string\n\tline2: string\n}\n\nfunction getDescriptionLines(type: NonOverviewDomainTab): DescriptionLines {\n\tswitch (type) {\n\t\tcase \"multi-site\":\n\t\t\treturn {\n\t\t\t\tline1: \"Rewrite your origins to host multiple sites under the same domain.\",\n\t\t\t\tline2: \"Any changes will take effect after you publish your site.\",\n\t\t\t}\n\t\tcase \"headers\":\n\t\t\treturn {\n\t\t\t\tline1: \"Configure custom HTTP headers for security settings\",\n\t\t\t\tline2: \"like X-Frame-Options or similar policies.\",\n\t\t\t}\n\t\tcase \"redirects\":\n\t\t\treturn {\n\t\t\t\tline1: \"Redirect existing URLs to new ones to maintain search engine\",\n\t\t\t\tline2: \"ranking. The order of the items defines the priority.\",\n\t\t\t}\n\t\tcase \"files\":\n\t\t\treturn {\n\t\t\t\tline1: \"Upload Well-known files like robots.txt, security.txt, or\",\n\t\t\t\tline2: \"llms.txt, or serve any static file on a fixed URL.\",\n\t\t\t}\n\t\tdefault:\n\t\t\tassertNever(type)\n\t}\n}\n", "import \"DomainPageEmptyStates.styles_17eolzy.wyw.css\"; export const body = \"body_b17fu7zr\";", "import { dashboardPath } from \"@framerjs/app-shared\"\nimport { UpsellType } from \"@framerjs/events\"\nimport { Button, Link, T } from \"@framerjs/fresco\"\nimport { EmptyState } from \"@framerjs/fresco/components/EmptyState\"\nimport { assert, assertNever } from \"@framerjs/shared\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { getProjectPlansURL } from \"web/lib/Project.ts\"\nimport { UpsellUIInteraction, record } from \"web/lib/tracker.ts\"\nimport { useDashboardProjectStores } from \"web/pages/projects/DashboardProjectStores.tsx\"\nimport { useSelectedDomainTab } from \"web/pages/projects/components/Domains/SelectedDomainTab.tsx\"\nimport { learnMoreLinks } from \"web/pages/projects/components/Domains/TabHeaderDescription.tsx\"\nimport * as styles from \"./DomainPageEmptyStates.styles.ts\"\n\nexport function DomainPageEmptyStateNoItems() {\n\tconst selectedTab = useSelectedDomainTab()\n\tconst { modalStore } = useDashboardProjectStores()\n\n\tassert(selectedTab !== \"overview\", \"No items empty state should not be shown for overview tab\")\n\tassert(selectedTab !== \"multi-site\", \"The Multi-Site tab has a default row and should not show this empty state\")\n\tassert(selectedTab !== \"headers\", \"The Headers tab has a default row and should not show this empty state\")\n\n\t// Even though this empty state is currently only used for a single tab, we leave the\n\t// infrastructure in place for when we add new tabs in the future, and for consistency with the\n\t// other empty states.\n\tconst lines = {\n\t\tredirects: [\"Redirect existing URLs to\", \"new ones to maintain search\", \"engine ranking.\"],\n\t\tfiles: [\"Upload robots.txt, llms.txt,\", \".well-known, or other static\", \"files to your site.\"],\n\t} as const\n\n\tconst handleAdd = {\n\t\tredirects: () => modalStore.show({ type: ModalType.DashboardAddRedirect }),\n\t\tfiles: () => modalStore.show({ type: ModalType.DashboardAddFile, action: \"add\" }),\n\t}[selectedTab]\n\n\tconst buttonText = {\n\t\tredirects: \"Add Redirect\",\n\t\tfiles: \"Add File\",\n\t}[selectedTab]\n\n\treturn (\n\t\t<EmptyState\n\t\t\tcenter\n\t\t\tbody={\n\t\t\t\t<div className={styles.body}>\n\t\t\t\t\t<T>{lines[selectedTab][0]}</T>\n\t\t\t\t\t<br />\n\t\t\t\t\t<T>{lines[selectedTab][1]}</T>\n\t\t\t\t\t<br />\n\t\t\t\t\t<T>{lines[selectedTab][2]}</T> <Link href={learnMoreLinks[selectedTab]}>Learn more</Link>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\tbutton={\n\t\t\t\t<Button bold variant=\"default\" onClick={handleAdd}>\n\t\t\t\t\t<T>{buttonText}</T>\n\t\t\t\t</Button>\n\t\t\t}\n\t\t\tfullWidthButton={false}\n\t\t\tmaxBodyWidth={220}\n\t\t/>\n\t)\n}\n\nexport function DomainPageEmptyStateNoProjectMember() {\n\tconst selectedTab = useSelectedDomainTab()\n\tconst { projectStore } = useDashboardProjectStores()\n\n\tassert(selectedTab !== \"overview\", \"DomainPageEmptyStateNoProjectMember should not be shown for overview tab\")\n\n\tconst lines = {\n\t\t\"multi-site\": [\"Join the project to add or edit\", \"existing rewrites.\"],\n\t\theaders: [\"Join the project to configure\", \"HTTP headers.\"],\n\t\tredirects: [\"Join the project to add or edit\", \"existing redirects.\"],\n\t\tfiles: [\"Join the project to upload\", \"Well-known files.\"],\n\t} as const\n\n\treturn (\n\t\t<EmptyState\n\t\t\tcenter\n\t\t\tbody={\n\t\t\t\t<div className={styles.body}>\n\t\t\t\t\t<T>{lines[selectedTab][0]}</T>\n\t\t\t\t\t<br />\n\t\t\t\t\t<T>{lines[selectedTab][1]}</T> <Link href={learnMoreLinks[selectedTab]}>Learn more</Link>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\tbutton={\n\t\t\t\t<Button bold variant=\"default\" onClick={projectStore.joinProject}>\n\t\t\t\t\tJoin Project\n\t\t\t\t</Button>\n\t\t\t}\n\t\t\tfullWidthButton={false}\n\t\t/>\n\t)\n}\n\nexport function DomainPageEmptyStateUpsell() {\n\tconst selectedTab = useSelectedDomainTab()\n\tconst { projectStore } = useDashboardProjectStores()\n\n\tassert(selectedTab !== \"overview\", \"DomainPageEmptyStateUpsell should not be shown for overview tab\")\n\tassert(selectedTab !== \"multi-site\", \"The Multi-Site tab has a default row and should not show this empty state\")\n\tassert(selectedTab !== \"headers\", \"The Headers tab has a default row and should not show this empty state\")\n\n\tconst lines = {\n\t\tredirects: [\"Redirect existing URLs to\", \"new ones to maintain search\", \"engine ranking.\"],\n\t\tfiles: [\"Upload robots.txt, llms.txt,\", \".well-known, or other static\", \"files to your site.\"],\n\t} as const\n\n\treturn (\n\t\t<EmptyState\n\t\t\tcenter\n\t\t\tbody={\n\t\t\t\t<div className={styles.body}>\n\t\t\t\t\t<T>{lines[selectedTab][0]}</T>\n\t\t\t\t\t<br />\n\t\t\t\t\t<T>{lines[selectedTab][1]}</T>\n\t\t\t\t\t<br />\n\t\t\t\t\t<T>{lines[selectedTab][2]}</T> <Link href={learnMoreLinks[selectedTab]}>Learn more</Link>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\tbutton={\n\t\t\t\t<Link\n\t\t\t\t\tbold\n\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\thref={getProjectPlansURL({ id: projectStore.projectId, title: null, canvasFeatures: {} }).toString()}\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tswitch (selectedTab) {\n\t\t\t\t\t\t\tcase \"redirects\":\n\t\t\t\t\t\t\t\trecord(\"ui_interaction\", {\n\t\t\t\t\t\t\t\t\tpage: UpsellType.domainsRedirectsEnterpriseUpsell,\n\t\t\t\t\t\t\t\t\tid: UpsellUIInteraction.navigateToPlans,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\tcase \"files\":\n\t\t\t\t\t\t\t\trecord(\"ui_interaction\", {\n\t\t\t\t\t\t\t\t\tpage: UpsellType.domainsFilesUpsell,\n\t\t\t\t\t\t\t\t\tid: UpsellUIInteraction.navigateToPlans,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tassertNever(selectedTab)\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\tUpgrade Plan\n\t\t\t\t</Link>\n\t\t\t}\n\t\t\tfullWidthButton={false}\n\t\t\tmaxBodyWidth={220}\n\t\t/>\n\t)\n}\n\n/**\n * Displayed to users when they accidentally open the advanced hosting dashboard on a project that\n * does not have a custom domain configured. This could happen if the user edits the URL and pastes\n * the project id, and normally never through the UI alone.\n */\nexport function DomainPageEmptyStateNoDomain({ projectId }: { projectId: string }) {\n\treturn (\n\t\t<EmptyState\n\t\t\tcenter\n\t\t\tbody={\n\t\t\t\t<T className={styles.body}>\n\t\t\t\t\tAdvanced Hosting features are available once this project has a connected custom domain\n\t\t\t\t</T>\n\t\t\t}\n\t\t\tbutton={\n\t\t\t\t<Link variant=\"primary\" href={`${dashboardPath}${projectId}?view=settings:domains`}>\n\t\t\t\t\tAdd Domain\n\t\t\t\t</Link>\n\t\t\t}\n\t\t\tfullWidthButton={false}\n\t\t/>\n\t)\n}\n", "import { ConfirmationModal } from \"@framerjs/fresco\"\nimport { getLogger } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { useExperimentIsOn } from \"app/experiments.ts\"\nimport { useCallback, useRef } from \"react\"\nimport { AccessRequestStatus } from \"web/lib/RequestEditorAccess.ts\"\nimport { useDashboardProjectStores } from \"./DashboardProjectStores.tsx\"\n\nconst logger = getLogger(\"DashboardRequestProjectAccessModal\")\n\nexport function DashboardRequestProjectAccessModal() {\n\tconst isAgentExperimentOn = useExperimentIsOn(\"agent\")\n\tconst { modalStore, projectStore } = useDashboardProjectStores()\n\tconst { projectAccessRequestStatus } = projectStore.useState()\n\n\tconst isRequestingAccess = useRef(false)\n\n\tconst handleConfirm = useCallback(async () => {\n\t\tif (isRequestingAccess.current) return\n\n\t\tisRequestingAccess.current = true\n\n\t\ttry {\n\t\t\tawait projectStore.requestAccess()\n\t\t\tmodalStore.dismiss()\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to request edit access:\", error)\n\t\t} finally {\n\t\t\tisRequestingAccess.current = false\n\t\t}\n\t}, [projectStore, modalStore])\n\n\treturn (\n\t\t<ConfirmationModal\n\t\t\ttitle=\"Request Edit Access\"\n\t\t\tdescription=\"You\u2019re currently a viewer in this project. Request edit access to update the site.\"\n\t\t\tonDismiss={modalStore.dismiss}\n\t\t\tconfirmLabel={projectAccessRequestStatus === AccessRequestStatus.Pending ? \"Pending\" : \"Request\"}\n\t\t\tcancelLabel={Dictionary.Cancel}\n\t\t\tonConfirm={handleConfirm}\n\t\t\tonCancel={modalStore.dismiss}\n\t\t\tconfirmButtonEnabled={projectAccessRequestStatus !== AccessRequestStatus.Pending}\n\t\t\tlegacy={!isAgentExperimentOn}\n\t\t/>\n\t)\n}\n", "import { openNewTab } from \"@framerjs/app-shared\"\nimport type { ComboBoxListItem } from \"@framerjs/fresco\"\nimport {\n\tComboBox,\n\tEducationIconAndTooltip,\n\tInputWrapper,\n\tInputWrapperError,\n\tLabel,\n\tModal,\n\tStack,\n\tTranslatable as T,\n\tTextInput,\n\tUpgradeBadge,\n} from \"@framerjs/fresco\"\nimport { assertNever, emptyArray, getLogger } from \"@framerjs/shared\"\nimport { LinkInput } from \"document/components/chrome/shared/LinkInput.tsx\"\nimport { handleLimitError } from \"document/components/chrome/shared/utils/limitError.ts\"\nimport { useModalTheme } from \"document/components/chrome/utils/useModalTheme.ts\"\nimport type { HeaderRouteNode, HeaderRouteNodeInterface } from \"document/models/CanvasTree/nodes/HeaderRouteNode.ts\"\nimport { RoutesNode } from \"document/models/CanvasTree/nodes/RoutesNode.ts\"\nimport { isHeaderRouteNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { addHeader, updateHeader } from \"document/models/CanvasTree/nodes/utils/routesNode.ts\"\nimport { type Link, getLink, isLinkToURL, isLinkToWebPage } from \"document/models/CanvasTree/traits/utils/Link.ts\"\nimport type { ModalProps } from \"document/stores/ModalStore.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { SlugBehavior, getResolvedLinkToWebPage } from \"document/utils/getResolvedLinkToWebPage.ts\"\nimport { startTransition, useCallback, useMemo, useState } from \"react\"\nimport { enterpriseUpsellURL } from \"utils/staticURLs.ts\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport { validateRouteNodePath } from \"web/pages/projects/components/Domains/validation/validateRouteNode.ts\"\nimport { useDashboardProjectStores } from \"../../../DashboardProjectStores.tsx\"\nimport * as domainStyles from \"../index.styles.ts\"\nimport { ensureHeaderLimits } from \"../validation/ensureHeaderLimits.ts\"\nimport {\n\tgetHeadersAllowlist,\n\tvalidateHeaderKey,\n\tvalidateHeaderUniqueness,\n\tvalidateHeaderValue,\n} from \"../validation/validateHeader.ts\"\n\nconst logger = getLogger(\"CustomHeaderModal\")\n\nexport function CustomHeaderModal(\n\tprops: ModalProps<ModalType.DashboardAddHeader> | ModalProps<ModalType.DashboardEditHeader>,\n): JSX.Element {\n\tconst { action } = props\n\n\tconst { treeStore, projectStore, modalStore } = useDashboardProjectStores()\n\tconst { tree } = treeStore.useState()\n\tconst { canUseAdvancedHeaders } = projectStore.useState()\n\n\tconst headerRouteNodeId = action === \"edit\" ? props.nodeId : undefined\n\tconst headerRouteNode = headerRouteNodeId\n\t\t? treeStore.tree.getNodeWithTrait(headerRouteNodeId, isHeaderRouteNode)\n\t\t: undefined\n\tconst headerKeys = useMemo(() => getHeadersAllowlist(canUseAdvancedHeaders), [canUseAdvancedHeaders])\n\t// Close the modal if the node is not found while editing\n\tif (!headerRouteNode && action === \"edit\") {\n\t\tmodalStore.dismiss()\n\t}\n\n\t// Store original values for change detection\n\tconst originalPath = headerRouteNode?.path || \"/*\"\n\tconst originalKey = headerRouteNode?.key || \"\"\n\tconst originalValue = headerRouteNode?.value || \"\"\n\n\tconst [path, setPath] = useState<string>(originalPath)\n\tconst [key, setKey] = useState<string>(originalKey)\n\tconst [value, setValue] = useState<string>(originalValue)\n\tconst [isSubmitted, setIsSubmitted] = useState<boolean>(false)\n\tconst [showInputError, setShowInputError] = useState({\n\t\tpath: false,\n\t\tkey: false,\n\t\tvalue: false,\n\t})\n\n\tconst pathLink = useMemo(() => getLink(path), [path])\n\n\tconst routesNode = RoutesNode.get(tree)\n\tconst isLoadingRoutesNode = routesNode?.isLoaded() === false\n\n\tconst existingHeaders = useMemo(\n\t\t() => routesNode?.loaded?.getHeaderRoutes() || emptyArray<HeaderRouteNode>(),\n\t\t[routesNode],\n\t)\n\tconst pathValidationResult = useMemo(() => validateRouteNodePath(\"header\", path), [path])\n\tconst keyValidationResult = useMemo(() => validateHeaderKey(key, canUseAdvancedHeaders), [key, canUseAdvancedHeaders])\n\tconst valueValidationResult = useMemo(() => validateHeaderValue(key, value), [key, value])\n\tconst uniquenessValidationResult = useMemo(() => {\n\t\t// Skip uniqueness validation if the form has been submitted successfully\n\t\t// This prevents the error flash that occurs when the newly added header\n\t\t// appears in the headers list before the modal closes\n\t\tif (isSubmitted) {\n\t\t\treturn { result: \"ok\" as const, normalizedValue: undefined }\n\t\t}\n\t\treturn validateHeaderUniqueness(path, key, existingHeaders, headerRouteNode ?? undefined)\n\t}, [path, key, existingHeaders, headerRouteNode, isSubmitted])\n\n\t// Check if values have changed from original\n\t// Normalize values before comparing to avoid false positives from whitespace differences\n\tconst hasChanges = useMemo(() => {\n\t\tif (action !== \"edit\") return true\n\t\tif (path.trim() !== originalPath.trim()) return true\n\t\tif (key.trim() !== originalKey.trim()) return true\n\t\tif (value.trim() !== originalValue.trim()) return true\n\t\treturn false\n\t}, [action, path, originalPath, key, originalKey, value, originalValue])\n\n\tconst markFieldAsTouched = useCallback((fieldName: keyof typeof showInputError) => {\n\t\tstartTransition(() => {\n\t\t\tsetShowInputError(prev => ({ ...prev, [fieldName]: true }))\n\t\t})\n\t}, [])\n\n\tconst handlePathBlur = useCallback(() => markFieldAsTouched(\"path\"), [markFieldAsTouched])\n\tconst handleKeyBlur = useCallback(() => markFieldAsTouched(\"key\"), [markFieldAsTouched])\n\tconst handleValueBlur = useCallback(() => markFieldAsTouched(\"value\"), [markFieldAsTouched])\n\n\t// Clear touched state when validation passes\n\t// Only if the field was previously touched, if not it can conflict with the onBlur handler\n\t// that sets the touched state to true when the field is blurred\n\tif (showInputError.path && (pathValidationResult.result === \"empty\" || pathValidationResult.result === \"ok\")) {\n\t\tstartTransition(() => {\n\t\t\tsetShowInputError(prev => ({ ...prev, path: false }))\n\t\t})\n\t}\n\n\tif (showInputError.key && (keyValidationResult.result === \"empty\" || keyValidationResult.result === \"ok\")) {\n\t\tstartTransition(() => {\n\t\t\tsetShowInputError(prev => ({ ...prev, key: false }))\n\t\t})\n\t}\n\n\tif (showInputError.value && (valueValidationResult.result === \"empty\" || valueValidationResult.result === \"ok\")) {\n\t\tstartTransition(() => {\n\t\t\tsetShowInputError(prev => ({ ...prev, value: false }))\n\t\t})\n\t}\n\n\tconst handlePathChange = useCallback(\n\t\t(link: Link) => {\n\t\t\tif (isLinkToWebPage(link)) {\n\t\t\t\tconst resolvedLink = getResolvedLinkToWebPage(tree, link, SlugBehavior.Resolve)\n\t\t\t\tif (resolvedLink) {\n\t\t\t\t\tstartTransition(() => {\n\t\t\t\t\t\tsetPath(resolvedLink)\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t} else if (isLinkToURL(link)) {\n\t\t\t\tstartTransition(() => {\n\t\t\t\t\tsetPath(link.url)\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\t[tree],\n\t)\n\n\tconst handleKeyChange = useCallback((newValue: string) => {\n\t\tstartTransition(() => {\n\t\t\tsetKey(newValue)\n\t\t})\n\t}, [])\n\n\tconst headerOptions: ComboBoxListItem[] = useMemo(() => {\n\t\tconst sortedHeaderOptions = [\n\t\t\t...headerKeys.filter(option => !option.upsell),\n\t\t\t...headerKeys.filter(option => option.upsell),\n\t\t]\n\n\t\treturn sortedHeaderOptions.map(headerOption => ({\n\t\t\ttype: \"option\" as const,\n\t\t\tvalue: headerOption.key,\n\t\t\ttitle: headerOption.key,\n\t\t\tlabel: headerOption.upsell ? <UpgradeBadge /> : undefined,\n\t\t\tlabelWhenItemHighlighted: headerOption.upsell ? <UpgradeBadge variant=\"highlight\" /> : undefined,\n\t\t}))\n\t}, [headerKeys])\n\n\tconst onHeaderChange = useCallback(\n\t\t(value: string, _final: boolean, reset: () => void) => {\n\t\t\tconst headerOption = headerKeys.find(option => option.key === value)\n\t\t\tif (!headerOption) {\n\t\t\t\treset()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (headerOption.upsell) {\n\t\t\t\tmodalStore.show({\n\t\t\t\t\ttype: ModalType.Confirmation,\n\t\t\t\t\ttitle: \"Enterprise Plan Required\",\n\t\t\t\t\tdescription: \"Upgrade to Enterprise to set this header. Contact us to upgrade your plan.\",\n\t\t\t\t\tconfirmLabel: \"Contact Us\",\n\t\t\t\t\tcancelLabel: \"Cancel\",\n\t\t\t\t\tvariant: \"primary\",\n\t\t\t\t\tonConfirm: () => {\n\t\t\t\t\t\topenNewTab(enterpriseUpsellURL)\n\t\t\t\t\t\tmodalStore.dismiss()\n\t\t\t\t\t},\n\t\t\t\t\tonCancel: modalStore.dismiss,\n\t\t\t\t})\n\t\t\t\treset()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\thandleKeyChange(value)\n\t\t},\n\t\t[headerKeys, handleKeyChange, modalStore],\n\t)\n\n\tconst handleValueChange = useCallback((newValue: string) => {\n\t\tstartTransition(() => {\n\t\t\tsetValue(newValue)\n\t\t})\n\t}, [])\n\n\tconst handleConfirm = () => {\n\t\tif (pathValidationResult.result !== \"ok\") return\n\t\tif (keyValidationResult.result !== \"ok\") return\n\t\tif (valueValidationResult.result !== \"ok\") return\n\t\tif (uniquenessValidationResult.result !== \"ok\") return\n\t\tif (!hasChanges) return\n\n\t\tconst attributes: HeaderRouteNodeInterface = {\n\t\t\tpath: pathValidationResult.normalizedValue,\n\t\t\tkey: keyValidationResult.normalizedValue,\n\t\t\tvalue: valueValidationResult.normalizedValue,\n\t\t}\n\n\t\ttry {\n\t\t\thandleLimitError(() => {\n\t\t\t\tif (action === \"add\") {\n\t\t\t\t\taddHeader(treeStore, attributes, () => ensureHeaderLimits(tree, \"add\"))\n\t\t\t\t\tprojectStore.commitTreeAndSend()\n\t\t\t\t} else if (action === \"edit\") {\n\t\t\t\t\tconst latestHeaderRouteNode = treeStore.tree.getNodeWithTrait(headerRouteNodeId, isHeaderRouteNode)\n\t\t\t\t\tif (latestHeaderRouteNode) {\n\t\t\t\t\t\tupdateHeader(latestHeaderRouteNode, attributes, () => ensureHeaderLimits(tree, \"edit\"))\n\t\t\t\t\t\tprojectStore.commitTreeAndSend()\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tassertNever(action)\n\t\t\t\t}\n\n\t\t\t\tsetIsSubmitted(true)\n\t\t\t\tmodalStore.dismiss()\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tlogger.reportError(error)\n\t\t\ttoast({\n\t\t\t\ttype: \"add\",\n\t\t\t\tvariant: \"error\",\n\t\t\t\tkey: `${props.action}-header`,\n\t\t\t\tprimaryText: `Failed to ${props.action}`,\n\t\t\t\tsecondaryText: \"custom header.\",\n\t\t\t})\n\t\t}\n\t}\n\n\tconst modalThemeProps = useModalTheme(\"darker\")\n\n\treturn (\n\t\t<Modal.Root\n\t\t\tonDismiss={modalStore.dismiss}\n\t\t\tonConfirm={handleConfirm}\n\t\t\tnoSelect\n\t\t\toffsetForDashboardSidebar\n\t\t\t{...modalThemeProps}\n\t\t>\n\t\t\t<Modal.Header>{action === \"edit\" ? \"Edit Header\" : \"Add Header\"}</Modal.Header>\n\t\t\t<Modal.Content>\n\t\t\t\t<Stack>\n\t\t\t\t\t<Label htmlFor=\"custom-header-path\">\n\t\t\t\t\t\t<T>Path</T>\n\t\t\t\t\t</Label>\n\t\t\t\t\t<LinkInput\n\t\t\t\t\t\tconstantChange\n\t\t\t\t\t\tbackdropEnabled\n\t\t\t\t\t\tid=\"custom-header-path\"\n\t\t\t\t\t\trightChevron\n\t\t\t\t\t\tplaceholder=\"Enter a path\u2026\"\n\t\t\t\t\t\ttree={tree}\n\t\t\t\t\t\tlink={pathLink}\n\t\t\t\t\t\tsupportsPageLinks\n\t\t\t\t\t\tprependSlashForPathLikeInput\n\t\t\t\t\t\tautoFocus={false}\n\t\t\t\t\t\tvariableInfo={null}\n\t\t\t\t\t\thomePageName=\"/\"\n\t\t\t\t\t\tonChange={handlePathChange}\n\t\t\t\t\t\tonBlur={handlePathBlur}\n\t\t\t\t\t\thasError={showInputError.path && pathValidationResult.result === \"error\"}\n\t\t\t\t\t/>\n\t\t\t\t\t<InputWrapperError\n\t\t\t\t\t\tvisible={showInputError.path && pathValidationResult.result === \"error\"}\n\t\t\t\t\t\tclassName={domainStyles.errorMessage}\n\t\t\t\t\t>\n\t\t\t\t\t\t{pathValidationResult.result === \"error\" && (\n\t\t\t\t\t\t\t<T className={domainStyles.errorMessage}>{pathValidationResult.message}</T>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</InputWrapperError>\n\t\t\t\t</Stack>\n\t\t\t\t<Stack>\n\t\t\t\t\t<Stack direction=\"row\" gap={6} alignItems=\"center\" justifyContent=\"space-between\">\n\t\t\t\t\t\t<Label htmlFor=\"key\">\n\t\t\t\t\t\t\t<T>Name</T>\n\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t<EducationIconAndTooltip\n\t\t\t\t\t\t\ttooltipContent={\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\tFor custom header names\n\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\tclick to <strong>contact support</strong>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttooltipDirection=\"left\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\topenNewTab(\"https://www.framer.com/help/\")\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Stack>\n\t\t\t\t\t<ComboBox\n\t\t\t\t\t\tid=\"key\"\n\t\t\t\t\t\topenOnFocus\n\t\t\t\t\t\tbackdropEnabled\n\t\t\t\t\t\trightChevron\n\t\t\t\t\t\tchangeOnBlur={false}\n\t\t\t\t\t\tshrinkCompletionLabel={false}\n\t\t\t\t\t\tvalue={key}\n\t\t\t\t\t\tcheckedItems={key ? [key] : undefined}\n\t\t\t\t\t\tonChange={onHeaderChange}\n\t\t\t\t\t\tonBlur={handleKeyBlur}\n\t\t\t\t\t\titems={headerOptions}\n\t\t\t\t\t\tplaceholder=\"Header name\u2026\"\n\t\t\t\t\t/>\n\t\t\t\t\t<InputWrapperError\n\t\t\t\t\t\tvisible={showInputError.key && keyValidationResult.result === \"error\"}\n\t\t\t\t\t\tclassName={domainStyles.errorMessage}\n\t\t\t\t\t>\n\t\t\t\t\t\t{keyValidationResult.result === \"error\" && (\n\t\t\t\t\t\t\t<T className={domainStyles.errorMessage}>{keyValidationResult.message}</T>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</InputWrapperError>\n\t\t\t\t</Stack>\n\t\t\t\t<Stack>\n\t\t\t\t\t<Label htmlFor=\"value\">\n\t\t\t\t\t\t<T>Value</T>\n\t\t\t\t\t</Label>\n\t\t\t\t\t<InputWrapper hasError={showInputError.value && valueValidationResult.result === \"error\"}>\n\t\t\t\t\t\t<TextInput\n\t\t\t\t\t\t\tid=\"value\"\n\t\t\t\t\t\t\tconstantChange\n\t\t\t\t\t\t\tonChange={handleValueChange}\n\t\t\t\t\t\t\tonBlur={handleValueBlur}\n\t\t\t\t\t\t\tplaceholder=\"Header value\u2026\"\n\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</InputWrapper>\n\t\t\t\t\t<InputWrapperError\n\t\t\t\t\t\tvisible={showInputError.value && valueValidationResult.result === \"error\"}\n\t\t\t\t\t\tclassName={domainStyles.errorMessage}\n\t\t\t\t\t>\n\t\t\t\t\t\t{valueValidationResult.result === \"error\" && (\n\t\t\t\t\t\t\t<T className={domainStyles.errorMessage}>{valueValidationResult.message}</T>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</InputWrapperError>\n\t\t\t\t</Stack>\n\t\t\t\t<InputWrapperError\n\t\t\t\t\tvisible={uniquenessValidationResult.result === \"error\"}\n\t\t\t\t\tclassName={domainStyles.errorMessage}\n\t\t\t\t>\n\t\t\t\t\t{uniquenessValidationResult.result === \"error\" && (\n\t\t\t\t\t\t<T className={domainStyles.errorMessage}>{uniquenessValidationResult.message}</T>\n\t\t\t\t\t)}\n\t\t\t\t</InputWrapperError>\n\t\t\t</Modal.Content>\n\n\t\t\t<Modal.Footer>\n\t\t\t\t<Modal.CancelButton>Cancel</Modal.CancelButton>\n\t\t\t\t<Modal.ActionButton\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tenabled={\n\t\t\t\t\t\t!isLoadingRoutesNode &&\n\t\t\t\t\t\thasChanges &&\n\t\t\t\t\t\tpathValidationResult.result === \"ok\" &&\n\t\t\t\t\t\tkeyValidationResult.result === \"ok\" &&\n\t\t\t\t\t\tvalueValidationResult.result === \"ok\" &&\n\t\t\t\t\t\tuniquenessValidationResult.result === \"ok\"\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{action === \"edit\" ? \"Save\" : \"Add\"}\n\t\t\t\t</Modal.ActionButton>\n\t\t\t</Modal.Footer>\n\t\t</Modal.Root>\n\t)\n}\n", "import type { FeatureValue } from \"@framerjs/app-config\"\nimport { AddOnLicenseType, openNewTab, ProjectLicenseType } from \"@framerjs/app-shared\"\nimport { UpsellType } from \"@framerjs/events\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { LimitError } from \"document/components/chrome/shared/utils/limitError.ts\"\nimport { UpsellFeature } from \"document/components/chrome/siteSettings/Plans/Stripe/utils/upsell.ts\"\nimport type { CanvasTree } from \"document/models/CanvasTree/index.ts\"\nimport { RoutesNode } from \"document/models/CanvasTree/nodes/RoutesNode.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { getProjectPlansURL } from \"web/lib/Project.ts\"\nimport { record, UpsellUIInteraction } from \"web/lib/tracker.ts\"\nimport type { DashboardDomainModalStore } from \"web/pages/projects/DashboardModalStore.ts\"\n\nconst maxAllowedHeaders = 100\n\nexport function ensureHeaderLimits(tree: CanvasTree, action: \"add\" | \"edit\") {\n\tif (action === \"edit\") {\n\t\treturn\n\t}\n\n\tconst currentHeaderCount = RoutesNode.ensure(tree).loaded?.getHeaderRoutes().length ?? 0\n\tif (currentHeaderCount >= maxAllowedHeaders) {\n\t\tthrow new LimitError(\n\t\t\t`Maximum number of Headers reached: ${maxAllowedHeaders}. Please contact support if you need to add more.`,\n\t\t\t\"max-allowed-reached\",\n\t\t)\n\t}\n}\n\ninterface CheckHeaderLimitUpsellParams {\n\tprojectId: string\n\tmodalStore: DashboardDomainModalStore\n\tcanUseCustomHeaders: FeatureValue\n\tlicenseType: ProjectLicenseType\n\tonAddOnUpsellSuccess: () => void\n}\n\nexport function checkHeaderLimitUpsellModal({\n\tprojectId,\n\tmodalStore,\n\tcanUseCustomHeaders,\n\tlicenseType,\n\tonAddOnUpsellSuccess,\n}: CheckHeaderLimitUpsellParams): boolean {\n\tif (canUseCustomHeaders === \"on\") return false\n\n\tswitch (licenseType) {\n\t\tcase ProjectLicenseType.ScaleSite:\n\t\tcase ProjectLicenseType.ScaleSite2025: {\n\t\t\tconst showAcquireAddonModal = () => {\n\t\t\t\tmodalStore.show({\n\t\t\t\t\ttype: ModalType.DashboardAcquireAddonModal,\n\t\t\t\t\taddonInfo: { addonLicenseType: AddOnLicenseType.CustomProxySetup },\n\t\t\t\t\tonSuccess: onAddOnUpsellSuccess,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Scale site can't use custom headers - i.e. doesn't have the add-on, so we can upsell that\n\t\t\tmodalStore.show({\n\t\t\t\ttitle: \"Advanced Hosting\",\n\t\t\t\ttype: ModalType.Confirmation,\n\t\t\t\tvariant: \"primary\",\n\t\t\t\tcancelLabel: \"Maybe Later\",\n\t\t\t\tonCancel: modalStore.dismiss,\n\t\t\t\tdescription: `Purchase the Advanced Hosting ${Dictionary.AddOn} to set custom HTTP headers and more.`,\n\t\t\t\tconfirmLabel: `Buy ${Dictionary.AddOn}`,\n\t\t\t\tonConfirm: showAcquireAddonModal,\n\t\t\t\tonDismiss: modalStore.dismiss,\n\t\t\t})\n\t\t\treturn true\n\t\t}\n\t\tdefault:\n\t\t\t// Is not a scale or enterprise plan, so we can upsell the scale plan (+ add-on)\n\t\t\tmodalStore.show({\n\t\t\t\ttitle: \"Header Limit Reached\",\n\t\t\t\ttype: ModalType.Confirmation,\n\t\t\t\tvariant: \"primary\",\n\t\t\t\tcancelLabel: \"Maybe Later\",\n\t\t\t\tonCancel: modalStore.dismiss,\n\t\t\t\tdescription: \"Upgrade to Scale to get Multi Site rewrites, Custom Headers and Static Files.\",\n\t\t\t\tconfirmLabel: \"View Plans\",\n\t\t\t\tonConfirm: () => {\n\t\t\t\t\trecord(\"ui_interaction\", {\n\t\t\t\t\t\tpage: UpsellType.domainsHeadersEnterpriseUpsell,\n\t\t\t\t\t\tid: UpsellUIInteraction.confirmUpsell,\n\t\t\t\t\t})\n\t\t\t\t\tconst plansUrl = getProjectPlansURL({ id: projectId, title: null, canvasFeatures: {} }).toString()\n\t\t\t\t\topenNewTab(`${plansUrl}:${UpsellFeature.canUseCustomCanonicalUrl}`)\n\t\t\t\t\tmodalStore.dismiss()\n\t\t\t\t},\n\t\t\t\tonDismiss: modalStore.dismiss,\n\t\t\t})\n\t\t\treturn true\n\t}\n}\n", "import { openNewTab } from \"@framerjs/app-shared\"\nimport { CustomModal, Spinner } from \"@framerjs/fresco\"\nimport type { ModalThemeProps } from \"@framerjs/fresco/components/CustomModal\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { useExperimentIsOn } from \"app/experiments.ts\"\nimport {\n\tAcquireAddOnModalInner,\n\ttrackingPages,\n} from \"document/components/chrome/siteSettings/Plans/Stripe/addOns/AcquireAddOnModalInner.tsx\"\nimport { getAddonPurchaseInfo } from \"document/components/chrome/siteSettings/Plans/Stripe/addOns/useAddonPurchaseInfo.ts\"\nimport { shouldUseBillingV3 } from \"document/components/chrome/siteSettings/Plans/Stripe/api/billingV3.ts\"\nimport { useModalTheme } from \"document/components/chrome/utils/useModalTheme.ts\"\nimport type { ModalProps } from \"document/stores/ModalStore.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { useCallback } from \"react\"\nimport { getProjectPlansURL } from \"web/lib/Project.ts\"\nimport { Pages, UIInteraction, record } from \"web/lib/tracker.ts\"\nimport { pollProject, type PollProjectOptions } from \"web/pages/project/lib/api/pollProject.ts\"\nimport { useDashboardProjectStores } from \"../../DashboardProjectStores.tsx\"\nimport * as styles from \"./index.styles.ts\"\n\nexport function DashboardAcquireAddOnModal({ onSuccess, addonInfo }: ModalProps<ModalType.DashboardAcquireAddonModal>) {\n\tconst { modalStore, treeStore, projectStore } = useDashboardProjectStores()\n\tconst { projectData: project } = projectStore.useState()\n\tconst addonPurchaseInfo = getAddonPurchaseInfo(addonInfo, treeStore.tree, project)\n\tconst modalThemeProps: ModalThemeProps = useModalTheme(\"default\")\n\tconst isBillingV3 = shouldUseBillingV3({\n\t\tbillingV3ExperimentOn: useExperimentIsOn(\"billingV3\"),\n\t\tteamLicenseType: project?.teamLicenseType ?? null,\n\t\tteamLicenseVersion: project?.teamLicenseVersion ?? null,\n\t})\n\n\tfunction onCancelOrDismiss() {\n\t\trecord(\"ui_interaction\", { page: trackingPages.base, id: UIInteraction.dismiss })\n\t\tmodalStore.dismiss()\n\t}\n\n\t// TODO: why is this not one of the error cases but a separate confirmation modal?\n\t// https://github.com/framer/company/issues/31265\n\tconst onSitePlanCancelled = useCallback(() => {\n\t\tmodalStore.show({\n\t\t\ttype: ModalType.Confirmation,\n\t\t\ttitle: \"Not supported\",\n\t\t\tdescription:\n\t\t\t\t\"Your site needs to be on an active plan to add add-ons. Please reactivate your subscription or contact support.\",\n\t\t\tconfirmLabel: \"View Plans\",\n\t\t\tcancelLabel: Dictionary.Cancel,\n\t\t\tonConfirm: () => {\n\t\t\t\trecord(\"ui_interaction\", {\n\t\t\t\t\tpage: Pages.acquireAddOnModal,\n\t\t\t\t\tid: UIInteraction.openSiteSettingsPlans,\n\t\t\t\t})\n\t\t\t\topenNewTab(getProjectPlansURL({ id: projectStore.projectId, title: \"\", canvasFeatures: {} }).toString())\n\t\t\t},\n\t\t})\n\t}, [modalStore, projectStore.projectId])\n\n\treturn (\n\t\t<CustomModal visible onDismiss={onCancelOrDismiss} className={styles.acquireAddOnModal} {...modalThemeProps}>\n\t\t\t{addonPurchaseInfo ? (\n\t\t\t\t<AcquireAddOnModalInner\n\t\t\t\t\tdismissFn={modalStore.dismiss}\n\t\t\t\t\tonCancelOrDismiss={onCancelOrDismiss}\n\t\t\t\t\tonSuccess={onSuccess}\n\t\t\t\t\taddonPurchaseInfo={addonPurchaseInfo}\n\t\t\t\t\tisBillingV3={isBillingV3}\n\t\t\t\t\tonSitePlanCancelled={onSitePlanCancelled}\n\t\t\t\t\ttree={treeStore.tree}\n\t\t\t\t\tpollProject={(params: PollProjectOptions) => pollProject(projectStore.projectId, params)}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<Spinner data-testid=\"preview-spinner\" />\n\t\t\t)}\n\t\t</CustomModal>\n\t)\n}\n", "import { ConfirmationModal, Link, T } from \"@framerjs/fresco\"\nimport { useExperimentIsOn } from \"app/experiments.ts\"\nimport type { ModalProps } from \"document/stores/ModalStore.ts\"\nimport type { ModalType } from \"document/utils/ModalType.ts\"\n\nexport function DashboardUnsupportedFileTypeModal({\n\textension,\n\thelpUrl,\n\tonRetry,\n\tonCancel,\n\tonDismiss,\n}: ModalProps<ModalType.DashboardUnsupportedFileType>) {\n\tconst isAgentExperimentOn = useExperimentIsOn(\"agent\")\n\treturn (\n\t\t<ConfirmationModal\n\t\t\tvariant=\"primary\"\n\t\t\ttitle=\"Unsupported File Format\"\n\t\t\tdescription={\n\t\t\t\t<>\n\t\t\t\t\t<T>\n\t\t\t\t\t\tThe &lsquo;{extension}&rsquo; file format is not supported for Static Files. Learn more about which file\n\t\t\t\t\t\tformats are supported\n\t\t\t\t\t</T>{\" \"}\n\t\t\t\t\t<Link href={helpUrl} style={{ display: \"inline\" }}>\n\t\t\t\t\t\t<T>here</T>\n\t\t\t\t\t</Link>\n\t\t\t\t\t.\n\t\t\t\t</>\n\t\t\t}\n\t\t\tconfirmLabel={\"Try Another\"}\n\t\t\tonConfirm={onRetry}\n\t\t\tcancelLabel=\"Cancel\"\n\t\t\tonCancel={onCancel}\n\t\t\tonDismiss={onDismiss}\n\t\t\thasBackdrop\n\t\t\tlegacy={!isAgentExperimentOn}\n\t\t/>\n\t)\n}\n", "import {\n\tButton,\n\tIconDashboardArchive,\n\tIconPage,\n\tInputWrapper,\n\tInputWrapperError,\n\tLabel,\n\tModal,\n\tSpinner,\n\tStack,\n\tT,\n\tTextInput,\n\ttruncateWithEllipsis,\n} from \"@framerjs/fresco\"\nimport { colors } from \"@framerjs/fresco/tokens\"\nimport { assert, assertNever, emptyArray, getLogger, unhandledError } from \"@framerjs/shared\"\nimport { cx } from \"@linaria/core\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { dirname, filename, pathJoin } from \"code-editor/utils.ts\"\nimport { prependSlashIfMissing } from \"document/components/chrome/shared/prependSlashIfMissing.ts\"\nimport { handleLimitError } from \"document/components/chrome/shared/utils/limitError.ts\"\nimport { useModalTheme } from \"document/components/chrome/utils/useModalTheme.ts\"\nimport type { ProxyRouteNode, ProxyRouteNodeInterface } from \"document/models/CanvasTree/nodes/ProxyRouteNode.ts\"\nimport { RoutesNode } from \"document/models/CanvasTree/nodes/RoutesNode.ts\"\nimport { isProxyRouteNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { addProxy, updateProxy } from \"document/models/CanvasTree/nodes/utils/routesNode.ts\"\nimport type { ModalProps } from \"document/stores/ModalStore.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { slugify } from \"library/utils/slugify.ts\"\nimport { startTransition, useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport { FilePicker, type FilePickerRef } from \"web/components/FilePicker.tsx\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport { initUploadService, uploadService } from \"web/pages/project/lib/UploadService.ts\"\nimport { useDashboardProjectStores } from \"web/pages/projects/DashboardProjectStores.tsx\"\nimport * as domainStyles from \"../index.styles.ts\"\nimport { ensureProxyLimits, maxAllowedProxies } from \"../validation/ensureProxyLimits.ts\"\nimport { validateRouteNodePath, validateRouteNodePathUniqueness } from \"../validation/validateRouteNode.ts\"\nimport { showFileTooLargeUpsellModal } from \"./showFileTooLargeUpsellModal.tsx\"\n\nconst logger = getLogger(\"FilesModal\")\n\nconst helpUrl = \"https://www.framer.com/help/articles/well-known-files/\"\n\nconst allowedFileExtensions = [\n\t// Text files\n\t\"pdf\",\n\t\"txt\",\n\t\"csv\",\n\t\"json\",\n\t\"xml\",\n\t\"md\",\n\t\"vcf\",\n\t// Media files\n\t\"png\",\n\t\"jpg\",\n\t\"jpeg\",\n\t\"webp\",\n\t\"gif\",\n\t\"avif\",\n\t\"ico\",\n\t\"mp3\",\n\t\"wav\",\n\t\"ogg\",\n\t\"webm\",\n\t\"mp4\",\n\t// Generic files\n\t\"exe\",\n\t\"zip\",\n\t\"\",\n]\n\nexport function FilesModal(\n\tprops: ModalProps<ModalType.DashboardAddFile> | ModalProps<ModalType.DashboardEditFile>,\n): JSX.Element {\n\tconst { modalStore, projectStore, treeStore } = useDashboardProjectStores()\n\tconst { tree } = treeStore.useState()\n\tconst { maxFileSizeInMB } = projectStore.useState()\n\tconst { action } = props\n\tconst [showInputError, setShowInputError] = useState({\n\t\tpath: false,\n\t})\n\tconst [uploading, setUploading] = useState<boolean>(false)\n\tconst [fileUploaded, setFileUploaded] = useState<boolean>(false)\n\tconst filePickerRef = useRef<FilePickerRef | null>(null)\n\tconst uploadButtonRef = useRef<HTMLButtonElement | null>(null)\n\tconst routesNode = RoutesNode.get(tree)\n\tconst isLoadingRoutesNode = routesNode?.isLoaded() === false\n\tconst proxyRouteNodes = useMemo(\n\t\t() => routesNode?.loaded?.getProxyRoutes() || emptyArray<ProxyRouteNode>(),\n\t\t[routesNode],\n\t)\n\tconst amountOfFiles = proxyRouteNodes.length\n\tconst canUploadMoreFiles = amountOfFiles < maxAllowedProxies\n\n\tconst proxyRouteNodeId = action === \"edit\" ? props.nodeId : undefined\n\tconst proxyRouteNode = proxyRouteNodeId ? tree.getNodeWithTrait(proxyRouteNodeId, isProxyRouteNode) : undefined\n\n\tconst originalDirName = dirname(proxyRouteNode?.path || \"\") || \"/\"\n\tconst originalFileName = filename(proxyRouteNode?.path || \"\")\n\tconst originalTargetUrl = proxyRouteNode?.targetUrl || \"\"\n\n\tconst [fileDirName, setFileDirName] = useState<string>(originalDirName)\n\tconst [fileName, setFileName] = useState<string>(originalFileName)\n\tconst [targetUrl, setTargetUrl] = useState<string>(originalTargetUrl)\n\tconst [isSubmitted, setIsSubmitted] = useState<boolean>(false)\n\n\tconst markFieldAsTouched = useCallback((fieldName: keyof typeof showInputError) => {\n\t\tstartTransition(() => {\n\t\t\tsetShowInputError(prev => ({ ...prev, [fieldName]: true }))\n\t\t})\n\t}, [])\n\n\tconst handleValueBlur = useCallback(() => markFieldAsTouched(\"path\"), [markFieldAsTouched])\n\n\tconst handleFileDirNameChange = useCallback((value: string) => {\n\t\tsetFileDirName(prependSlashIfMissing(value))\n\t}, [])\n\n\tconst fullPath = useMemo(() => \"/\" + pathJoin(fileDirName.trim(), fileName.trim()), [fileDirName, fileName])\n\n\tconst pathValidationResult = useMemo(() => validateRouteNodePath(\"proxy\", fullPath), [fullPath])\n\n\tconst pathUniquenessValidationResult = useMemo(() => {\n\t\t// Skip uniqueness validation if the form has been submitted successfully\n\t\t// This prevents the error flash that occurs when the newly added rewrite\n\t\t// appears in the rewrites list before the modal closes\n\t\tif (isSubmitted) {\n\t\t\treturn { result: \"ok\" as const, normalizedValue: undefined }\n\t\t}\n\t\treturn validateRouteNodePathUniqueness(\"proxy\", fullPath, proxyRouteNodes, proxyRouteNode?.id)\n\t}, [fullPath, proxyRouteNodes, proxyRouteNode?.id, isSubmitted])\n\n\t// Check if values have changed from original\n\t// Normalize values before comparing to avoid false positives from whitespace differences and locale prefixes\n\tconst hasChanges = useMemo(() => {\n\t\tif (action !== \"edit\") return true\n\n\t\tif (fileDirName.trim() !== originalDirName.trim()) return true\n\n\t\t// A change in target URL means the file has been updated, since the generated URL is random\n\t\t// So we don't need to check if the filename has changed\n\t\treturn targetUrl.trim() !== originalTargetUrl.trim()\n\t}, [action, fileDirName, originalDirName, targetUrl, originalTargetUrl])\n\n\tuseEffect(() => {\n\t\t// Click the hidden button.\n\t\t// This'll trigger the file picker to show before the modal.\n\t\tif (uploadButtonRef.current && props.action === \"add\") {\n\t\t\tuploadButtonRef.current.focus()\n\t\t}\n\t}, [props.action])\n\n\tconst handleConfirm = () => {\n\t\tif (pathValidationResult.result !== \"ok\") return\n\t\tif (pathUniquenessValidationResult.result !== \"ok\") return\n\t\tif (!targetUrl) return\n\t\tif (!hasChanges) return\n\n\t\tconst attributes: ProxyRouteNodeInterface = {\n\t\t\tpath: fullPath,\n\t\t\ttargetUrl,\n\t\t}\n\n\t\ttry {\n\t\t\thandleLimitError(() => {\n\t\t\t\tif (action === \"add\") {\n\t\t\t\t\taddProxy(treeStore, attributes, () => ensureProxyLimits(tree, \"add\"))\n\t\t\t\t\tprojectStore.commitTreeAndSend()\n\t\t\t\t} else if (action === \"edit\") {\n\t\t\t\t\tconst latestFileRouteNode = tree.getNodeWithTrait(proxyRouteNodeId, isProxyRouteNode)\n\t\t\t\t\tif (latestFileRouteNode) {\n\t\t\t\t\t\tupdateProxy(latestFileRouteNode, attributes, () => ensureProxyLimits(tree, \"edit\"))\n\t\t\t\t\t\tprojectStore.commitTreeAndSend()\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tassertNever(action)\n\t\t\t\t}\n\n\t\t\t\tsetIsSubmitted(true)\n\t\t\t\tmodalStore.dismiss()\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tlogger.reportError(error)\n\t\t\ttoast({\n\t\t\t\ttype: \"add\",\n\t\t\t\tvariant: \"error\",\n\t\t\t\tkey: `${props.action}-file`,\n\t\t\t\tprimaryText: `Failed to ${props.action}`,\n\t\t\t\tsecondaryText: \"your file.\",\n\t\t\t})\n\t\t}\n\t}\n\n\tconst onRetryUpload = useCallback(() => {\n\t\tmodalStore.dismiss()\n\t\t// Re-show the FilesModal, then trigger file picker after it mounts\n\t\tif (action === \"edit\" && proxyRouteNodeId) {\n\t\t\tmodalStore.show({\n\t\t\t\ttype: ModalType.DashboardEditFile,\n\t\t\t\taction: \"edit\",\n\t\t\t\tnodeId: proxyRouteNodeId,\n\t\t\t})\n\t\t} else {\n\t\t\tmodalStore.show({\n\t\t\t\ttype: ModalType.DashboardAddFile,\n\t\t\t\taction: \"add\",\n\t\t\t})\n\t\t}\n\t}, [action, modalStore, proxyRouteNodeId])\n\n\tconst fileIsSupported = useCallback(\n\t\t(fileName: string) => {\n\t\t\tconst fileSplit = fileName.split(\".\")\n\t\t\tconst hasFileExtension = fileSplit.length > 1\n\t\t\tconst extension = hasFileExtension ? (fileSplit.at(-1) ?? \"\") : \"\"\n\t\t\tconst isSupported = allowedFileExtensions.includes(extension)\n\t\t\tif (!isSupported) {\n\t\t\t\tmodalStore.show({\n\t\t\t\t\ttype: ModalType.DashboardUnsupportedFileType,\n\t\t\t\t\textension,\n\t\t\t\t\thelpUrl,\n\t\t\t\t\tonRetry: onRetryUpload,\n\t\t\t\t\tonCancel: modalStore.dismiss,\n\t\t\t\t\tonDismiss: modalStore.dismiss,\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn isSupported\n\t\t},\n\t\t[modalStore, onRetryUpload],\n\t)\n\n\tconst dismissModalIfNotRendered = useCallback(() => {\n\t\tif (action === \"add\" && !fileUploaded) {\n\t\t\t// Only dismiss the modal if we haven't rendered its content yet (ie. only showed the file picker)\n\t\t\tmodalStore.dismiss()\n\t\t}\n\t}, [action, fileUploaded, modalStore])\n\n\tconst handleFileUpload = useCallback(\n\t\tasync (file: File): Promise<void> => {\n\t\t\tconst fileName = slugify(file.name)\n\t\t\tif (!fileIsSupported(fileName)) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst remoteProject = projectStore.getProject()\n\t\t\tif (!remoteProject) {\n\t\t\t\ttoast({\n\t\t\t\t\ttype: \"add\",\n\t\t\t\t\tvariant: \"error\",\n\t\t\t\t\tkey: \"file-upload-error\",\n\t\t\t\t\tprimaryText: \"Project is not loaded.\",\n\t\t\t\t\tsecondaryText: \"Please retry.\",\n\t\t\t\t})\n\t\t\t\tmodalStore.dismiss()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tinitUploadService(remoteProject.api, remoteProject.assetService)\n\n\t\t\tsetUploading(true)\n\t\t\tlet exceededCustomMaxSize = false\n\t\t\ttry {\n\t\t\t\tassert(maxFileSizeInMB, \"maxFileSizeInMB is not defined\")\n\t\t\t\tconst uploadResult = await uploadService.uploadFile(file, {\n\t\t\t\t\tsilent: false,\n\t\t\t\t\tmaxFileSize: maxFileSizeInMB,\n\t\t\t\t\trefreshAssetService: true,\n\t\t\t\t\tonExceedsCustomMaxSize: (size: number) => {\n\t\t\t\t\t\texceededCustomMaxSize = true\n\t\t\t\t\t\tdismissModalIfNotRendered()\n\t\t\t\t\t\tshowFileTooLargeUpsellModal(size, projectStore.projectId, modalStore)\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tif (!uploadResult) {\n\t\t\t\t\t// If the file exceeded the custom max size, don't dismiss the modal, as it'll dismiss the upsell modal\n\t\t\t\t\tif (!exceededCustomMaxSize) {\n\t\t\t\t\t\tdismissModalIfNotRendered()\n\t\t\t\t\t}\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tstartTransition(() => {\n\t\t\t\t\tsetTargetUrl(uploadResult.url)\n\t\t\t\t\tsetFileName(fileName)\n\t\t\t\t\tsetFileUploaded(true)\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Handle file upload error\", error)\n\t\t\t\tunhandledError(error)\n\t\t\t\ttoast({\n\t\t\t\t\ttype: \"add\",\n\t\t\t\t\tvariant: \"error\",\n\t\t\t\t\tkey: \"file-upload-error\",\n\t\t\t\t\tprimaryText: \"Failed to upload\",\n\t\t\t\t\tsecondaryText: \"your file.\",\n\t\t\t\t})\n\t\t\t} finally {\n\t\t\t\tsetUploading(false)\n\t\t\t}\n\t\t},\n\t\t[projectStore, fileIsSupported, dismissModalIfNotRendered, modalStore, maxFileSizeInMB],\n\t)\n\n\tconst handleUpload = useCallback(async () => {\n\t\tif (!canUploadMoreFiles) {\n\t\t\ttoast({\n\t\t\t\ttype: \"add\",\n\t\t\t\tvariant: \"warning\",\n\t\t\t\tkey: \"file-upload-limit\",\n\t\t\t\tprimaryText: \"Reached max upload limit\",\n\t\t\t\tsecondaryText: `of ${maxAllowedProxies} files.`,\n\t\t\t\tduration: Infinity,\n\t\t\t\taction: {\n\t\t\t\t\ttitle: \"OK\",\n\t\t\t\t\tonClick: () => toast({ type: \"remove\", key: \"file-upload-limit\" }),\n\t\t\t\t},\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\tif (!filePickerRef.current) return\n\n\t\tconst result = await filePickerRef.current.show()\n\t\tif (!result || !result.isFiles() || result.isCanceled() || result.isEmpty()) {\n\t\t\tdismissModalIfNotRendered()\n\t\t\treturn\n\t\t}\n\n\t\tconst file = result.value[0]\n\t\tawait handleFileUpload(file)\n\t}, [canUploadMoreFiles, handleFileUpload, dismissModalIfNotRendered])\n\n\tconst removeFile = useCallback(() => {\n\t\tstartTransition(() => {\n\t\t\tsetTargetUrl(\"\")\n\t\t\tsetFileName(\"\")\n\t\t})\n\t}, [])\n\n\tconst modalThemeProps = useModalTheme(\"darker\")\n\n\tif (props.action === \"add\" && !fileUploaded) {\n\t\t// Render a hidden button and the file picker so we can click the button programmatically\n\t\t// and open the file picker before rendering the modal.\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<FilePicker ref={filePickerRef} disabled={isLoadingRoutesNode} name=\"files\" />\n\t\t\t\t{/* We use focus instead of click to avoid a warning that the event is not trusted\n\t\t\t\t\tsince this is not actually a user interaction.\n\t\t\t\t\tSee https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted */}\n\t\t\t\t<Button style={{ opacity: 0 }} ref={uploadButtonRef} onFocus={handleUpload} />\n\t\t\t</>\n\t\t)\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<Modal.Root\n\t\t\t\tonDismiss={modalStore.dismiss}\n\t\t\t\tonConfirm={handleConfirm}\n\t\t\t\tnoSelect\n\t\t\t\toffsetForDashboardSidebar\n\t\t\t\t{...modalThemeProps}\n\t\t\t>\n\t\t\t\t<Modal.Header>{action === \"edit\" ? \"Edit File\" : \"Add File\"}</Modal.Header>\n\t\t\t\t<Modal.Content>\n\t\t\t\t\t<Stack>\n\t\t\t\t\t\t<Label htmlFor=\"file-upload\">\n\t\t\t\t\t\t\t<T className={domainStyles.filesText}>File</T>\n\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t<Stack className={domainStyles.filenameOrUploadContainer} justifyContent=\"center\">\n\t\t\t\t\t\t\t{targetUrl ? (\n\t\t\t\t\t\t\t\t<Stack direction=\"row\" justifyContent=\"space-between\">\n\t\t\t\t\t\t\t\t\t<Stack direction=\"row\" alignItems=\"center\" className={domainStyles.fileNameContainer} shrink={1}>\n\t\t\t\t\t\t\t\t\t\t<div className={domainStyles.fileIcon}>\n\t\t\t\t\t\t\t\t\t\t\t<IconPage color={colors.advancedHostingTableIcon} />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<T className={cx(domainStyles.filesText, truncateWithEllipsis)}>{fileName}</T>\n\t\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttitle={Dictionary.Remove}\n\t\t\t\t\t\t\t\t\t\tvariant=\"clean\"\n\t\t\t\t\t\t\t\t\t\tclassName={domainStyles.deleteFileButton}\n\t\t\t\t\t\t\t\t\t\tonClick={removeFile}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<IconDashboardArchive />\n\t\t\t\t\t\t\t\t\t</Button>\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\t\t<Button onClick={handleUpload} enabled={!isLoadingRoutesNode} ref={uploadButtonRef}>\n\t\t\t\t\t\t\t\t\t{uploading ? <Spinner /> : <T>Upload</T>}\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</Stack>\n\t\t\t\t\t<Stack>\n\t\t\t\t\t\t<Label htmlFor=\"file-path\">\n\t\t\t\t\t\t\t<T className={domainStyles.filesText}>Path</T>\n\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t<InputWrapper hasError={showInputError.path && pathValidationResult.result === \"error\"}>\n\t\t\t\t\t\t\t<TextInput\n\t\t\t\t\t\t\t\tid=\"value\"\n\t\t\t\t\t\t\t\tconstantChange\n\t\t\t\t\t\t\t\tonChange={handleFileDirNameChange}\n\t\t\t\t\t\t\t\tonBlur={handleValueBlur}\n\t\t\t\t\t\t\t\tplaceholder=\"Enter a path\u2026\"\n\t\t\t\t\t\t\t\tvalue={fileDirName}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</InputWrapper>\n\t\t\t\t\t\t<InputWrapperError\n\t\t\t\t\t\t\tvisible={showInputError.path && pathValidationResult.result === \"error\"}\n\t\t\t\t\t\t\tclassName={domainStyles.errorMessage}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{pathValidationResult.result === \"error\" && (\n\t\t\t\t\t\t\t\t<T className={domainStyles.errorMessage}>{pathValidationResult.message}</T>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</InputWrapperError>\n\t\t\t\t\t\t<InputWrapperError\n\t\t\t\t\t\t\tvisible={showInputError.path && pathUniquenessValidationResult.result === \"error\"}\n\t\t\t\t\t\t\tclassName={domainStyles.errorMessage}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{pathUniquenessValidationResult.result === \"error\" && (\n\t\t\t\t\t\t\t\t<T className={domainStyles.errorMessage}>{pathUniquenessValidationResult.message}</T>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</InputWrapperError>\n\t\t\t\t\t</Stack>\n\t\t\t\t</Modal.Content>\n\n\t\t\t\t<Modal.Footer>\n\t\t\t\t\t<Modal.CancelButton>Cancel</Modal.CancelButton>\n\t\t\t\t\t<Modal.ActionButton\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\tenabled={\n\t\t\t\t\t\t\t!isLoadingRoutesNode &&\n\t\t\t\t\t\t\t!!targetUrl &&\n\t\t\t\t\t\t\thasChanges &&\n\t\t\t\t\t\t\tpathValidationResult.result === \"ok\" &&\n\t\t\t\t\t\t\tpathUniquenessValidationResult.result === \"ok\"\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t{action === \"edit\" ? \"Save\" : \"Add\"}\n\t\t\t\t\t</Modal.ActionButton>\n\t\t\t\t</Modal.Footer>\n\t\t\t</Modal.Root>\n\t\t\t<FilePicker ref={filePickerRef} disabled={isLoadingRoutesNode} name=\"files\" />\n\t\t</>\n\t)\n}\n", "import { AddOnLicenseType, openNewTab, ProjectLicenseType } from \"@framerjs/app-shared\"\nimport { UpsellType } from \"@framerjs/events\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { LimitError } from \"document/components/chrome/shared/utils/limitError.ts\"\nimport { UpsellFeature } from \"document/components/chrome/siteSettings/Plans/Stripe/utils/upsell.ts\"\nimport type { CanvasTree } from \"document/models/CanvasTree/index.ts\"\nimport { RoutesNode } from \"document/models/CanvasTree/nodes/RoutesNode.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { enterpriseUpsellURL } from \"utils/staticURLs.ts\"\nimport { getProjectPlansURL } from \"web/lib/Project.ts\"\nimport { record, UpsellUIInteraction } from \"web/lib/tracker.ts\"\nimport type { DashboardDomainModalStore } from \"../../../DashboardModalStore.ts\"\n\nexport const maxAllowedProxies = 100\n\nexport function ensureProxyLimits(tree: CanvasTree, action: \"add\" | \"edit\") {\n\tif (action === \"edit\") {\n\t\treturn\n\t}\n\n\tconst currentProxyCount = RoutesNode.ensure(tree).loaded?.getProxyRoutes().length ?? 0\n\tif (currentProxyCount >= maxAllowedProxies) {\n\t\tthrow new LimitError(\n\t\t\t`Maximum number of Files reached: ${maxAllowedProxies}. Please contact support if you need to add more.`,\n\t\t\t\"max-allowed-reached\",\n\t\t)\n\t}\n}\n\ninterface CheckFileLimitUpsellParams {\n\ttree: CanvasTree\n\tmodalStore: DashboardDomainModalStore\n\tprojectId: string\n\tresourceLimits: { staticFiles: number | null; maxStaticFiles: number | null }\n\tlicenseType: ProjectLicenseType\n\tonAddOnUpsellSuccess: () => void\n}\n\nexport function checkFileLimitUpsellModal({\n\ttree,\n\tmodalStore,\n\tprojectId,\n\tresourceLimits,\n\tlicenseType,\n\tonAddOnUpsellSuccess,\n}: CheckFileLimitUpsellParams): boolean {\n\tconst currentFilesCount = RoutesNode.ensure(tree).loaded?.getProxyRoutes().length ?? 0\n\tif (resourceLimits.staticFiles === null || currentFilesCount < resourceLimits.staticFiles) {\n\t\treturn false\n\t}\n\n\tlet description: string\n\tlet confirmLabel: string\n\tlet onConfirm: () => void\n\n\tconst contactEnterpriseConfirm = () => {\n\t\trecord(\"ui_interaction\", {\n\t\t\tpage: UpsellType.domainsFilesEnterpriseUpsell,\n\t\t\tid: UpsellUIInteraction.contactUs,\n\t\t})\n\t\topenNewTab(enterpriseUpsellURL)\n\t\tmodalStore.dismiss()\n\t}\n\n\tconst plansConfirm = () => {\n\t\trecord(\"ui_interaction\", { page: UpsellType.fileLimitUpsell, id: UpsellUIInteraction.confirmUpsell })\n\t\tconst plansUrl = getProjectPlansURL({ id: projectId, title: null, canvasFeatures: {} }).toString()\n\t\topenNewTab(`${plansUrl}:${UpsellFeature.fileUploadLimitInMB}`)\n\t\tmodalStore.dismiss()\n\t}\n\n\tswitch (licenseType) {\n\t\tcase ProjectLicenseType.EnterpriseSite:\n\t\t\tdescription = `You\u2019ve reached the Static File hosting limit on your contract. Contact us to increase your limit.`\n\t\t\tconfirmLabel = \"Contact Us\"\n\t\t\tonConfirm = contactEnterpriseConfirm\n\t\t\tbreak\n\t\tcase ProjectLicenseType.ScaleSite:\n\t\tcase ProjectLicenseType.ScaleSite2025: {\n\t\t\t// If the limit can be increased for the current plan, which means we can upsell the add-on\n\t\t\tconst canUpsellAddOn = resourceLimits.staticFiles !== resourceLimits.maxStaticFiles\n\t\t\tconst showAcquireAddonModal = () => {\n\t\t\t\tmodalStore.show({\n\t\t\t\t\ttype: ModalType.DashboardAcquireAddonModal,\n\t\t\t\t\taddonInfo: { addonLicenseType: AddOnLicenseType.CustomProxySetup },\n\t\t\t\t\tonSuccess: onAddOnUpsellSuccess,\n\t\t\t\t})\n\t\t\t}\n\t\t\tdescription = canUpsellAddOn\n\t\t\t\t? `Purchase an ${Dictionary.AddOn} to serve static files from your domain.`\n\t\t\t\t: \"You\u2019ve reached your Static File hosting limit. Contact us to increase your limit.\"\n\t\t\tconfirmLabel = canUpsellAddOn ? \"Buy\" : \"Contact Us\"\n\t\t\tonConfirm = canUpsellAddOn ? showAcquireAddonModal : contactEnterpriseConfirm\n\t\t\tbreak\n\t\t}\n\n\t\tdefault:\n\t\t\tdescription = \"Upgrade to Scale to get Multi Site rewrites, Custom Headers and additional Static Files.\"\n\t\t\tconfirmLabel = \"View Plans\"\n\t\t\tonConfirm = plansConfirm\n\t\t\tbreak\n\t}\n\n\tmodalStore.show({\n\t\ttype: ModalType.Confirmation,\n\t\tvariant: \"primary\",\n\t\ttitle: \"Files Limit Reached\",\n\t\tdescription,\n\t\tconfirmLabel,\n\t\tonConfirm,\n\t\tcancelLabel: \"Maybe Later\",\n\t\tonCancel: modalStore.dismiss,\n\t\tonDismiss: modalStore.dismiss,\n\t})\n\n\treturn true\n}\n", "import { dashboardPath, openNewTab } from \"@framerjs/app-shared\"\nimport { UpsellType } from \"@framerjs/events\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { UpsellFeature } from \"document/components/chrome/siteSettings/Plans/Stripe/utils/upsell.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport { record, UpsellUIInteraction } from \"web/lib/tracker.ts\"\nimport { MAX_FILE_UPLOAD_LIMIT_IN_MB, MEGABYTE } from \"web/lib/upload.ts\"\nimport type { DashboardDomainModalStore } from \"web/pages/projects/DashboardModalStore.ts\"\n\nexport function showFileTooLargeUpsellModal(\n\tfileSizeBytes: number,\n\tprojectId: string,\n\tmodalStore: DashboardDomainModalStore,\n) {\n\tconst fileSizeInMB = fileSizeBytes / MEGABYTE\n\tif (fileSizeInMB >= MAX_FILE_UPLOAD_LIMIT_IN_MB) {\n\t\ttoast({\n\t\t\ttype: \"add\",\n\t\t\tkey: \"file-too-large-upsell\",\n\t\t\tvariant: \"error\",\n\t\t\tprimaryText: \"File exceeds\",\n\t\t\tsecondaryText: `limit of ${MAX_FILE_UPLOAD_LIMIT_IN_MB}MB.`,\n\t\t\tduration: 10000,\n\t\t\ticon: \"error\",\n\t\t\tmoveToTop: true,\n\t\t})\n\t\treturn\n\t}\n\n\t// NOTE: Because the limits on scale and enterprise match the absolute maximum size for a file\n\t// we don't need to check if we can upsell the add-on or an enterprise plan, since those wouldn't help anyway.\n\tmodalStore.show({\n\t\ttype: ModalType.Confirmation,\n\t\tvariant: \"primary\",\n\t\ttitle: \"Files Too Large\",\n\t\tdescription: `You\u2019ve reached your Static File hosting limit. Upgrade your plan or purchase an ${Dictionary.AddOn} to increase it.`,\n\t\tconfirmLabel: \"View Plans\",\n\t\tonConfirm: () => {\n\t\t\trecord(\"ui_interaction\", { page: UpsellType.domainsFilesUpsell, id: UpsellUIInteraction.confirmUpsell })\n\t\t\topenNewTab(`${dashboardPath}${projectId}?view=settings:plans:${UpsellFeature.fileUploadLimitInMB}`)\n\t\t\tmodalStore.dismiss()\n\t\t},\n\t\tcancelLabel: \"Maybe Later\",\n\t\tonCancel: modalStore.dismiss,\n\t\tonDismiss: modalStore.dismiss,\n\t})\n}\n", "import { InputWrapperError, Label, Modal, Stack, T } from \"@framerjs/fresco\"\nimport { emptyArray, getLogger } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { LinkInput } from \"document/components/chrome/shared/LinkInput.tsx\"\nimport { getNonDefaultLocaleIdForPath } from \"document/components/chrome/siteSettings/Redirects/getNonDefaultLocaleForPath.ts\"\nimport { validateRedirectTo } from \"document/components/chrome/siteSettings/Redirects/validateRedirects.ts\"\nimport { useModalTheme } from \"document/components/chrome/utils/useModalTheme.ts\"\nimport type { RedirectRouteNode } from \"document/models/CanvasTree/nodes/RedirectRouteNode.ts\"\nimport { RoutesNode } from \"document/models/CanvasTree/nodes/RoutesNode.ts\"\nimport { addRedirect, updateRedirect } from \"document/models/CanvasTree/nodes/utils/routesNode.ts\"\nimport {\n\ttype Link,\n\ttype LinkToWebPage,\n\tgetLink,\n\tisLinkEqual,\n\tisLinkToURL,\n\tisLinkToWebPage,\n} from \"document/models/CanvasTree/traits/utils/Link.ts\"\nimport type { Modal as ModalDescriptor } from \"document/stores/ModalStore.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { SlugBehavior, getResolvedLinkToWebPage } from \"document/utils/getResolvedLinkToWebPage.ts\"\nimport { startTransition, useCallback, useMemo, useState } from \"react\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport {\n\tescapeParenthesesInPath,\n\tgetPathForDisplay,\n\tvalidateRouteNodePath,\n\tvalidateRouteNodePathUniqueness,\n} from \"web/pages/projects/components/Domains/validation/validateRouteNode.ts\"\nimport { useDashboardProjectStores } from \"../../../DashboardProjectStores.tsx\"\nimport * as styles from \"../index.styles.ts\"\n\nconst logger = getLogger(\"RedirectModal\")\n\ntype RedirectModalProps = Extract<\n\tModalDescriptor,\n\t{ type: ModalType.DashboardAddRedirect | ModalType.DashboardEditRedirect }\n>\n\nexport function RedirectModal(props: RedirectModalProps): JSX.Element | null {\n\tconst isEdit = props.type === ModalType.DashboardEditRedirect\n\tconst redirectNodeId = isEdit ? props.redirectNodeId : undefined\n\n\tconst { treeStore, projectStore, modalStore } = useDashboardProjectStores()\n\tconst { tree } = treeStore.useState()\n\n\tconst redirectNode = isEdit && redirectNodeId ? tree.get<RedirectRouteNode>(redirectNodeId) : undefined\n\n\t// Store original values for change detection (edit only)\n\tconst originalFrom = redirectNode?.path ?? \"\"\n\tconst originalTo = redirectNode?.to ?? \"\"\n\n\tconst [from, setFrom] = useState(originalFrom)\n\tconst [to, setTo] = useState<string | LinkToWebPage>(originalTo)\n\tconst [isSubmitted, setIsSubmitted] = useState(false)\n\tconst [showInputError, setShowInputError] = useState({\n\t\tfrom: false,\n\t\tto: false,\n\t})\n\n\tconst fromLink = useMemo(() => getLink(getPathForDisplay(from)), [from])\n\tconst toLink = useMemo(() => getLink(to), [to])\n\n\tconst fromLocaleId = useMemo(() => getNonDefaultLocaleIdForPath(from, tree.root.locales), [from, tree])\n\n\tconst routesNode = RoutesNode.get(tree)\n\tconst isLoadingRoutesNode = routesNode?.isLoaded() === false\n\n\tconst redirects = useMemo(() => routesNode?.loaded?.getRedirects() || emptyArray<RedirectRouteNode>(), [routesNode])\n\n\tconst fromValidationResult = useMemo(() => validateRouteNodePath(\"redirect\", from), [from])\n\tconst fromUniquenessValidationResult = useMemo(() => {\n\t\t// Skip uniqueness validation if the form has been submitted successfully\n\t\t// This prevents the error flash that occurs when the newly added redirect\n\t\t// appears in the redirects list before the modal closes\n\t\tif (isSubmitted) {\n\t\t\treturn { result: \"ok\", normalizedValue: undefined } as const\n\t\t}\n\t\treturn validateRouteNodePathUniqueness(\"redirect\", from, redirects, redirectNodeId)\n\t}, [from, redirects, redirectNodeId, isSubmitted])\n\tconst toValidationResult = useMemo(\n\t\t() =>\n\t\t\tvalidateRedirectTo(\n\t\t\t\ttree,\n\t\t\t\tto,\n\t\t\t\tfromValidationResult.result === \"ok\" ? fromValidationResult.normalizedValue : undefined,\n\t\t\t),\n\t\t[fromValidationResult, to, tree],\n\t)\n\n\tconst hasChanges = useMemo(() => {\n\t\tif (!isEdit) {\n\t\t\treturn true\n\t\t}\n\n\t\tif (from !== originalFrom) {\n\t\t\treturn true\n\t\t}\n\n\t\tconst currentToLink = getLink(to)\n\t\tconst originalToLink = getLink(originalTo)\n\n\t\tif (!currentToLink || !originalToLink) {\n\t\t\treturn currentToLink !== originalToLink\n\t\t}\n\n\t\treturn !isLinkEqual(currentToLink, originalToLink)\n\t}, [from, originalFrom, to, originalTo, isEdit])\n\n\tconst markFieldAsTouched = useCallback((fieldName: keyof typeof showInputError) => {\n\t\tstartTransition(() => {\n\t\t\tsetShowInputError(prev => ({ ...prev, [fieldName]: true }))\n\t\t})\n\t}, [])\n\n\tconst handleFromBlur = useCallback(() => markFieldAsTouched(\"from\"), [markFieldAsTouched])\n\tconst handleToBlur = useCallback(() => markFieldAsTouched(\"to\"), [markFieldAsTouched])\n\n\t// Clear touched state when validation passes\n\t// Only if the field was previously touched, if not it can conflict with the onBlur handler\n\t// that sets the touched state to true when the field is blurred\n\tif (showInputError.to && (toValidationResult.result === \"empty\" || toValidationResult.result === \"ok\")) {\n\t\tstartTransition(() => {\n\t\t\tsetShowInputError(prev => ({ ...prev, to: false }))\n\t\t})\n\t}\n\n\tif (\n\t\tshowInputError.from &&\n\t\t(fromValidationResult.result === \"empty\" ||\n\t\t\t(fromValidationResult.result === \"ok\" && fromUniquenessValidationResult.result === \"ok\"))\n\t) {\n\t\tstartTransition(() => {\n\t\t\tsetShowInputError(prev => ({ ...prev, from: false }))\n\t\t})\n\t}\n\n\tconst onFromChange = useCallback(\n\t\t(link: Link) => {\n\t\t\tif (isLinkToWebPage(link)) {\n\t\t\t\tconst resolvedLink = getResolvedLinkToWebPage(tree, link, SlugBehavior.Resolve)\n\t\t\t\tif (resolvedLink) {\n\t\t\t\t\tsetFrom(escapeParenthesesInPath(resolvedLink))\n\t\t\t\t}\n\t\t\t} else if (isLinkToURL(link)) {\n\t\t\t\tsetFrom(escapeParenthesesInPath(link.url))\n\t\t\t}\n\t\t},\n\t\t[tree],\n\t)\n\n\tconst onToChange = useCallback((link: Link) => {\n\t\tif (isLinkToWebPage(link)) {\n\t\t\tsetTo(link)\n\t\t} else if (isLinkToURL(link)) {\n\t\t\tsetTo(link.url)\n\t\t}\n\t}, [])\n\n\tconst onSubmit = useCallback(() => {\n\t\tif (fromValidationResult.result !== \"ok\") return\n\t\tif (fromUniquenessValidationResult.result !== \"ok\") return\n\t\tif (toValidationResult.result !== \"ok\") return\n\t\tif (!hasChanges) return\n\t\t/** @todo: getPagesPreventedFromVisiting */\n\n\t\tconst normalizedTo = toValidationResult.normalizedValue\n\n\t\ttry {\n\t\t\tif (isEdit) {\n\t\t\t\tif (!redirectNodeId) return\n\t\t\t\tconst node = treeStore.tree.get<RedirectRouteNode>(redirectNodeId)\n\t\t\t\tif (!node) return\n\t\t\t\tupdateRedirect(node, {\n\t\t\t\t\tpath: from,\n\t\t\t\t\tto: normalizedTo,\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tconst isExternal = typeof normalizedTo === \"string\"\n\t\t\t\taddRedirect(treeStore, from, normalizedTo, undefined, !isExternal)\n\t\t\t}\n\t\t\tprojectStore.commitTreeAndSend()\n\t\t\tsetIsSubmitted(true)\n\t\t\tmodalStore.dismiss()\n\t\t} catch (error) {\n\t\t\tlogger.reportError(error)\n\t\t\ttoast({\n\t\t\t\ttype: \"add\",\n\t\t\t\tvariant: \"error\",\n\t\t\t\tkey: isEdit ? \"update-redirect-error\" : \"add-redirect-error\",\n\t\t\t\tprimaryText: isEdit ? \"Failed to update\" : \"Failed to add\",\n\t\t\t\tsecondaryText: \"redirect.\",\n\t\t\t})\n\t\t}\n\t}, [\n\t\tfrom,\n\t\tfromUniquenessValidationResult.result,\n\t\tfromValidationResult.result,\n\t\thasChanges,\n\t\tisEdit,\n\t\tmodalStore,\n\t\tprojectStore,\n\t\tredirectNodeId,\n\t\ttoValidationResult,\n\t\ttreeStore,\n\t])\n\n\tconst modalThemeProps = useModalTheme(\"darker\")\n\n\tif (isEdit && !redirectNode) {\n\t\tmodalStore.dismiss()\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<Modal.Root\n\t\t\tonDismiss={modalStore.dismiss}\n\t\t\tonConfirm={onSubmit}\n\t\t\tnoSelect\n\t\t\toffsetForDashboardSidebar\n\t\t\tfixPositionAfterMount\n\t\t\t{...modalThemeProps}\n\t\t>\n\t\t\t<Modal.Header>{isEdit ? \"Edit Redirect\" : \"Add Redirect\"}</Modal.Header>\n\t\t\t<Modal.Content>\n\t\t\t\t<Stack>\n\t\t\t\t\t<Label htmlFor=\"redirect-from\">\n\t\t\t\t\t\t<T>From</T>\n\t\t\t\t\t</Label>\n\t\t\t\t\t<LinkInput\n\t\t\t\t\t\tconstantChange\n\t\t\t\t\t\tbackdropEnabled\n\t\t\t\t\t\trightChevron\n\t\t\t\t\t\tid=\"redirect-from\"\n\t\t\t\t\t\tplaceholder=\"Enter a path\u2026\"\n\t\t\t\t\t\tlink={fromLink}\n\t\t\t\t\t\tsupportsPageLinks\n\t\t\t\t\t\tprependSlashForPathLikeInput\n\t\t\t\t\t\tautoFocus={false}\n\t\t\t\t\t\tvariableInfo={null}\n\t\t\t\t\t\thomePageName=\"/\"\n\t\t\t\t\t\ttree={tree}\n\t\t\t\t\t\tonChange={onFromChange}\n\t\t\t\t\t\tonBlur={handleFromBlur}\n\t\t\t\t\t\thasError={\n\t\t\t\t\t\t\tshowInputError.from &&\n\t\t\t\t\t\t\t(fromValidationResult.result === \"error\" || fromUniquenessValidationResult.result === \"error\")\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t\t<InputWrapperError\n\t\t\t\t\t\tvisible={showInputError.from && fromValidationResult.result === \"error\"}\n\t\t\t\t\t\tclassName={styles.errorMessage}\n\t\t\t\t\t>\n\t\t\t\t\t\t{fromValidationResult.result === \"error\" && (\n\t\t\t\t\t\t\t<T className={styles.errorMessage}>{fromValidationResult.message}</T>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</InputWrapperError>\n\t\t\t\t\t<InputWrapperError\n\t\t\t\t\t\tvisible={showInputError.from && fromUniquenessValidationResult.result === \"error\"}\n\t\t\t\t\t\tclassName={styles.errorMessage}\n\t\t\t\t\t>\n\t\t\t\t\t\t{fromUniquenessValidationResult.result === \"error\" && (\n\t\t\t\t\t\t\t<T className={styles.errorMessage}>{fromUniquenessValidationResult.message}</T>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</InputWrapperError>\n\t\t\t\t</Stack>\n\t\t\t\t<Stack>\n\t\t\t\t\t<Label htmlFor=\"redirect-to\">\n\t\t\t\t\t\t<T>To</T>\n\t\t\t\t\t</Label>\n\t\t\t\t\t<LinkInput\n\t\t\t\t\t\tconstantChange\n\t\t\t\t\t\tbackdropEnabled\n\t\t\t\t\t\tsupportsPageLinks\n\t\t\t\t\t\tid=\"redirect-to\"\n\t\t\t\t\t\tlink={toLink}\n\t\t\t\t\t\tautoFocus={false}\n\t\t\t\t\t\tlocaleId={fromLocaleId}\n\t\t\t\t\t\tvariableInfo={null}\n\t\t\t\t\t\thomePageName=\"/\"\n\t\t\t\t\t\ttree={tree}\n\t\t\t\t\t\tonChange={onToChange}\n\t\t\t\t\t\tonBlur={handleToBlur}\n\t\t\t\t\t\thasError={showInputError.to && toValidationResult.result === \"error\"}\n\t\t\t\t\t/>\n\t\t\t\t\t<InputWrapperError\n\t\t\t\t\t\tvisible={showInputError.to && toValidationResult.result === \"error\"}\n\t\t\t\t\t\tclassName={styles.errorMessage}\n\t\t\t\t\t>\n\t\t\t\t\t\t{toValidationResult.result === \"error\" && (\n\t\t\t\t\t\t\t<T className={styles.errorMessage}>{toValidationResult.message}</T>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</InputWrapperError>\n\t\t\t\t</Stack>\n\t\t\t</Modal.Content>\n\t\t\t<Modal.Footer>\n\t\t\t\t<Modal.CancelButton>Cancel</Modal.CancelButton>\n\t\t\t\t<Modal.ActionButton\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tenabled={\n\t\t\t\t\t\t!isLoadingRoutesNode &&\n\t\t\t\t\t\thasChanges &&\n\t\t\t\t\t\tfromValidationResult.result === \"ok\" &&\n\t\t\t\t\t\ttoValidationResult.result === \"ok\" &&\n\t\t\t\t\t\tfromUniquenessValidationResult.result === \"ok\"\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{isEdit ? Dictionary.Save : Dictionary.Add}\n\t\t\t\t</Modal.ActionButton>\n\t\t\t</Modal.Footer>\n\t\t</Modal.Root>\n\t)\n}\n", "import { openNewTab, parseURL } from \"@framerjs/app-shared\"\nimport type { ComboBoxListItem } from \"@framerjs/fresco\"\nimport {\n\tCheckBox,\n\tComboBox,\n\tEducationIconAndTooltip,\n\tInputWrapper,\n\tInputWrapperWarning,\n\tInputWrapperError,\n\tLabel,\n\tModal,\n\tSegmentedControl,\n\tSegmentedControlItem,\n\tStack,\n\tTranslatable as T,\n\tTextInput,\n\tUpgradeBadge,\n} from \"@framerjs/fresco\"\nimport { assertNever, emptyArray, getLogger } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { experiments } from \"app/experiments.ts\"\nimport { doubleColumn } from \"document/components/chrome/properties/utils/doubleColumn.ts\"\nimport { LinkInput } from \"document/components/chrome/shared/LinkInput.tsx\"\nimport { handleLimitError } from \"document/components/chrome/shared/utils/limitError.ts\"\nimport { useModalTheme } from \"document/components/chrome/utils/useModalTheme.ts\"\nimport type { RewriteRouteNode, RewriteRouteNodeInterface } from \"document/models/CanvasTree/nodes/RewriteRouteNode.ts\"\nimport { RewriteType } from \"document/models/CanvasTree/nodes/RewriteTypeEnum.ts\"\nimport { RoutesNode } from \"document/models/CanvasTree/nodes/RoutesNode.ts\"\nimport { isRewriteRouteNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { addRewrite, updateRewrite } from \"document/models/CanvasTree/nodes/utils/routesNode.ts\"\nimport { type Link, getLink, isLinkToURL, isLinkToWebPage } from \"document/models/CanvasTree/traits/utils/Link.ts\"\nimport type { ModalProps } from \"document/stores/ModalStore.ts\"\nimport { listFreeDomains } from \"document/stores/PublishStore.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { SlugBehavior, getResolvedLinkToWebPage } from \"document/utils/getResolvedLinkToWebPage.ts\"\nimport { startTransition, useCallback, useEffect, useMemo, useState } from \"react\"\nimport { getProjectDomainsURL, openProjectPlansPage } from \"web/lib/Project.ts\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport type { ValidationResult } from \"web/pages/projects/components/Domains/validation/ValidationResult.ts\"\nimport { validateRewritePathVariables } from \"web/pages/projects/components/Domains/validation/rewritePathVariableKeys.ts\"\nimport {\n\tvalidateRouteNodePath,\n\tvalidateRouteNodePathUniqueness,\n} from \"web/pages/projects/components/Domains/validation/validateRouteNode.ts\"\nimport { useDashboardProjectStores } from \"../../../DashboardProjectStores.tsx\"\nimport type { RewriteFramerOrigin } from \"../Rewrites/getRewriteFramerOrigins.ts\"\nimport * as styles from \"../index.styles.ts\"\nimport { ensureRewriteLimits, showExternalRewriteUpsellAddOnModal } from \"../validation/ensureRewriteLimits.ts\"\nimport {\n\tisDefaultFramerDomain,\n\tvalidateRewriteTargetProjectPath,\n\tvalidateRewriteTargetUrl,\n} from \"../validation/validateRewrite.ts\"\nimport { getFramerOriginByUrl } from \"./getFramerOriginByUrl.ts\"\n\nconst logger = getLogger(\"MultiSiteRewriteModal\")\n\n/**\n * Converts wildcards (*) in a path to numbered placeholders (:1, :2, etc.)\n * This is used when copying the source path to the target path.\n *\n * Examples:\n * - \"/path\" -> \"/path\"\n * - \"/:username\" -> \"/:username\"\n * - \"/[wildcard]\" -> \"/:1\"\n * - \"/[wildcard]/segment/[wildcard]\" -> \"/:1/segment/:2\"\n */\nexport function convertWildcardsToPlaceholders(path: string): string {\n\tlet wildcardIndex = 0\n\treturn path.replace(/\\*/g, () => {\n\t\twildcardIndex++\n\t\treturn `:${wildcardIndex}`\n\t})\n}\n\n// NOTE: Seems like sometimes a project has 2 custom domains on Postgres (where this data comes from)\n// possibly caused by data not being properly replicated from Dynamo to Postgres.\n// If that happens, this will console.log an error complaining about duplicate keys, but doesn't seem\n// cause any issues.\n// Nonetheless, since all projects have title for many years now, we'll always show title (title on project dropdown),\n// so we also add the hostname to the key to suppress the error.\n// As far as I can see, this only happens in development.\nconst originKey = (origin: RewriteFramerOrigin) => `${origin.projectId}: ${origin.hostname}`\n\nexport type FetchOriginStatus = \"fetching\" | \"success\" | \"error\"\n\nexport const isProjectOnFreePlan = (origin: RewriteFramerOrigin) =>\n\t!origin.licenseType ||\n\torigin.licenseType === \"freeSite\" ||\n\t!origin.subscriptionIsActive ||\n\tBoolean(origin.expirationDate && new Date(origin.expirationDate) < new Date())\n\nexport function RewriteModal(\n\tprops: ModalProps<ModalType.DashboardAddRewrite> | ModalProps<ModalType.DashboardEditRewrite>,\n): JSX.Element {\n\tconst { action } = props\n\n\tconst { treeStore, projectStore, modalStore } = useDashboardProjectStores()\n\tconst { tree } = treeStore.useState()\n\tconst {\n\t\tframerOrigins,\n\t\tfetchOriginStatus,\n\t\tisProjectOnEnterprisePlan,\n\t\tresourceLimits,\n\t\tcanUseExternalRewrites,\n\t\tcanUseRewrites,\n\t} = projectStore.useState()\n\n\tconst rewriteRouteNodeId = action === \"edit\" ? props.nodeId : undefined\n\tconst rewriteRouteNode = rewriteRouteNodeId\n\t\t? treeStore.tree.getNodeWithTrait(rewriteRouteNodeId, isRewriteRouteNode)\n\t\t: undefined\n\n\t// Close the modal if the node is not found while editing\n\tif (!rewriteRouteNode && action === \"edit\") {\n\t\tmodalStore.dismiss()\n\t}\n\n\t// Store original values for change detection\n\tconst originalTargetUrl = rewriteRouteNode?.targetUrl || \"\"\n\tconst originalRewriteType = rewriteRouteNode?.rewriteType || RewriteType.Internal\n\tconst originalPath = rewriteRouteNode?.path || \"\"\n\tconst originalMatchPagesFirst = rewriteRouteNode?.matchPagesFirst || false\n\n\tconst [path, setPath] = useState<string>(originalPath)\n\tconst [targetUrl, setTargetUrl] = useState<string>(originalTargetUrl)\n\tconst [rewriteType, setRewriteType] = useState<RewriteType>(originalRewriteType)\n\tconst [matchPagesFirst, setMatchPagesFirst] = useState<boolean>(originalMatchPagesFirst)\n\tconst [selectedTargetProject, setSelectedTargetProject] = useState<RewriteFramerOrigin | null>()\n\tconst [isSubmitted, setIsSubmitted] = useState<boolean>(false)\n\tconst [freeDomains, setFreeDomains] = useState<string[]>([])\n\tconst [showInputError, setShowInputError] = useState({\n\t\tpath: false,\n\t\ttargetProjectPath: false,\n\t\ttargetUrl: false,\n\t})\n\n\tconst [targetProjectPath, setTargetProjectPath] = useState<string>(() => {\n\t\tif (rewriteRouteNode?.rewriteType === RewriteType.Internal && rewriteRouteNode?.targetUrl) {\n\t\t\tconst { pathname } = parseURL(rewriteRouteNode.targetUrl)\n\t\t\treturn pathname\n\t\t}\n\t\treturn \"\"\n\t})\n\n\tif (\n\t\t!selectedTargetProject &&\n\t\tframerOrigins.length > 0 &&\n\t\trewriteRouteNode?.rewriteType === RewriteType.Internal &&\n\t\trewriteRouteNode?.targetUrl\n\t) {\n\t\tconst foundOrigin = getFramerOriginByUrl(rewriteRouteNode.targetUrl, framerOrigins)\n\t\tif (foundOrigin) {\n\t\t\tstartTransition(() => {\n\t\t\t\tsetSelectedTargetProject(foundOrigin)\n\t\t\t})\n\t\t}\n\t}\n\n\tconst pathLink = useMemo(() => getLink(path), [path])\n\n\tconst routesNode = RoutesNode.get(tree)\n\tconst isLoadingRoutesNode = routesNode?.isLoaded() === false\n\n\tconst existingRewrites = useMemo(\n\t\t() => routesNode?.loaded?.getRewriteRoutes() || emptyArray<RewriteRouteNode>(),\n\t\t[routesNode],\n\t)\n\tconst pathValidationResult = useMemo(\n\t\t() => validateRouteNodePath(\"rewrite\", path, { allowWellKnownRewrites: isProjectOnEnterprisePlan }),\n\t\t[path, isProjectOnEnterprisePlan],\n\t)\n\tconst pathUniquenessValidationResult = useMemo(() => {\n\t\t// Skip uniqueness validation if the form has been submitted successfully\n\t\t// This prevents the error flash that occurs when the newly added rewrite\n\t\t// appears in the rewrites list before the modal closes\n\t\tif (isSubmitted) {\n\t\t\treturn { result: \"ok\" as const, normalizedValue: undefined }\n\t\t}\n\t\treturn validateRouteNodePathUniqueness(\"rewrite\", path, existingRewrites, rewriteRouteNode?.id)\n\t}, [path, existingRewrites, rewriteRouteNode?.id, isSubmitted])\n\tconst targetUrlValidationResult = useMemo(\n\t\t() =>\n\t\t\tvalidateRewriteTargetUrl(\n\t\t\t\ttargetUrl,\n\t\t\t\tframerOrigins,\n\t\t\t\tfreeDomains,\n\t\t\t\tpathValidationResult.result === \"ok\" ? pathValidationResult.normalizedValue : undefined,\n\t\t\t),\n\t\t[pathValidationResult.result, pathValidationResult, targetUrl, framerOrigins, freeDomains],\n\t)\n\n\tuseEffect(() => {\n\t\tvoid listFreeDomains().then(({ freeDomains: domains }) => {\n\t\t\tsetFreeDomains(domains)\n\t\t})\n\t}, [])\n\n\tconst targetProjectPathValidationResult = useMemo(\n\t\t() => validateRewriteTargetProjectPath(targetProjectPath),\n\t\t[targetProjectPath],\n\t)\n\n\tconst rewritePathVariablesValidationResult = useMemo((): ValidationResult<undefined> => {\n\t\tif (pathValidationResult.result !== \"ok\") {\n\t\t\treturn { result: \"ok\", normalizedValue: undefined }\n\t\t}\n\t\tconst sourcePath = pathValidationResult.normalizedValue\n\n\t\tif (rewriteType === RewriteType.Internal) {\n\t\t\tif (!selectedTargetProject || targetProjectPathValidationResult.result !== \"ok\") {\n\t\t\t\treturn { result: \"ok\", normalizedValue: undefined }\n\t\t\t}\n\t\t\treturn validateRewritePathVariables(sourcePath, targetProjectPathValidationResult.normalizedValue)\n\t\t}\n\n\t\tif (targetUrlValidationResult.result !== \"ok\") {\n\t\t\treturn { result: \"ok\", normalizedValue: undefined }\n\t\t}\n\t\ttry {\n\t\t\tconst url = new URL(targetUrlValidationResult.normalizedValue)\n\t\t\treturn validateRewritePathVariables(sourcePath, url.pathname)\n\t\t} catch {\n\t\t\treturn { result: \"ok\", normalizedValue: undefined }\n\t\t}\n\t}, [\n\t\tpathValidationResult,\n\t\trewriteType,\n\t\tselectedTargetProject,\n\t\ttargetProjectPathValidationResult,\n\t\ttargetUrlValidationResult,\n\t])\n\n\t// Check if values have changed from original\n\t// Normalize values before comparing to avoid false positives from whitespace differences and locale prefixes\n\tconst hasChanges = useMemo(() => {\n\t\tif (action !== \"edit\") return true\n\n\t\tif (path.trim() !== originalPath.trim()) return true\n\t\tif (rewriteType !== originalRewriteType) return true\n\t\tif (matchPagesFirst !== originalMatchPagesFirst) return true\n\n\t\treturn targetUrl.trim() !== originalTargetUrl.trim()\n\t}, [\n\t\taction,\n\t\tpath,\n\t\toriginalPath,\n\t\trewriteType,\n\t\toriginalRewriteType,\n\t\ttargetUrl,\n\t\toriginalTargetUrl,\n\t\tmatchPagesFirst,\n\t\toriginalMatchPagesFirst,\n\t])\n\n\tconst restoreRewriteModal = useCallback(() => {\n\t\tif (props.action === \"add\") {\n\t\t\tmodalStore.show({ type: ModalType.DashboardAddRewrite, action: \"add\" })\n\t\t\treturn\n\t\t}\n\t\tmodalStore.show({\n\t\t\ttype: ModalType.DashboardEditRewrite,\n\t\t\taction: \"edit\",\n\t\t\tnodeId: props.nodeId,\n\t\t})\n\t}, [modalStore, props])\n\n\tconst scheduleRestoreRewriteModal = useCallback(() => {\n\t\tqueueMicrotask(restoreRewriteModal)\n\t}, [restoreRewriteModal])\n\n\tconst handleTargetProjectChange = useCallback(\n\t\t(value: string, _final: boolean, reset: () => void) => {\n\t\t\tconst targetProject = framerOrigins.find(origin => originKey(origin) === value)\n\n\t\t\tif (!targetProject) {\n\t\t\t\treset()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// If the project is a free site or has no license, upsell instead of selecting\n\t\t\tif (isProjectOnFreePlan(targetProject)) {\n\t\t\t\topenProjectPlansPage(targetProject.projectId)\n\t\t\t\treset()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// If the project only has a default domain, suggest adding a custom domain\n\t\t\tif (!targetProject.hostname || isDefaultFramerDomain(targetProject.hostname)) {\n\t\t\t\tmodalStore.show({\n\t\t\t\t\ttype: ModalType.Confirmation,\n\t\t\t\t\ttitle: \"Add a Domain\",\n\t\t\t\t\tdescription: \"This project requires a custom domain so it can be used as a rewrite target.\",\n\t\t\t\t\tconfirmLabel: \"Add Domain\",\n\t\t\t\t\tcancelLabel: Dictionary.Cancel,\n\t\t\t\t\tonConfirm: () => {\n\t\t\t\t\t\topenNewTab(getProjectDomainsURL(targetProject.projectId).toString())\n\t\t\t\t\t\tmodalStore.dismiss()\n\t\t\t\t\t},\n\t\t\t\t\tonCancel: scheduleRestoreRewriteModal,\n\t\t\t\t\tonDismiss: scheduleRestoreRewriteModal,\n\t\t\t\t})\n\t\t\t\treset()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tstartTransition(() => {\n\t\t\t\t// When copying the source path to target, convert wildcards (*) to numbered placeholders (:1, :2, etc.)\n\t\t\t\tconst targetProjectPathForURL = targetProjectPath || convertWildcardsToPlaceholders(path) || \"/\"\n\t\t\t\tsetTargetProjectPath(targetProjectPathForURL)\n\t\t\t\tsetSelectedTargetProject(targetProject)\n\t\t\t\tsetTargetUrl(`https://${targetProject.hostname}${targetProjectPathForURL}`)\n\t\t\t})\n\t\t},\n\t\t[framerOrigins, targetProjectPath, path, modalStore, scheduleRestoreRewriteModal],\n\t)\n\n\tconst handleTargetProjectPathChange = useCallback(\n\t\t(value: string) => {\n\t\t\tstartTransition(() => {\n\t\t\t\tsetTargetProjectPath(value)\n\t\t\t\tsetTargetUrl(`https://${selectedTargetProject?.hostname}${value}`)\n\t\t\t})\n\t\t},\n\t\t[selectedTargetProject?.hostname],\n\t)\n\n\tconst handlePathChange = useCallback(\n\t\t(link: Link) => {\n\t\t\tstartTransition(() => {\n\t\t\t\tif (isLinkToWebPage(link)) {\n\t\t\t\t\tconst resolvedLink = getResolvedLinkToWebPage(tree, link, SlugBehavior.Resolve)\n\t\t\t\t\tif (resolvedLink) {\n\t\t\t\t\t\tsetPath(resolvedLink)\n\t\t\t\t\t}\n\t\t\t\t} else if (isLinkToURL(link)) {\n\t\t\t\t\tsetPath(link.url)\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\t[tree],\n\t)\n\n\tconst handleTargetUrlChange = useCallback((value: string) => {\n\t\tstartTransition(() => {\n\t\t\tsetTargetUrl(value)\n\t\t})\n\t}, [])\n\n\tconst markFieldAsTouched = useCallback((fieldName: keyof typeof showInputError) => {\n\t\tstartTransition(() => {\n\t\t\tsetShowInputError(prev => ({ ...prev, [fieldName]: true }))\n\t\t})\n\t}, [])\n\n\tconst handlePathBlur = useCallback(() => markFieldAsTouched(\"path\"), [markFieldAsTouched])\n\tconst handleTargetProjectPathBlur = useCallback(() => markFieldAsTouched(\"targetProjectPath\"), [markFieldAsTouched])\n\tconst handleTargetUrlBlur = useCallback(() => markFieldAsTouched(\"targetUrl\"), [markFieldAsTouched])\n\n\t// Clear touched state when validation passes\n\t// Only if the field was previously touched, if not it can conflict with the onBlur handler\n\t// that sets the touched state to true when the field is blurred\n\tif (\n\t\tshowInputError.path &&\n\t\t(pathValidationResult.result === \"empty\" ||\n\t\t\t(pathValidationResult.result === \"ok\" && pathUniquenessValidationResult.result === \"ok\"))\n\t) {\n\t\tstartTransition(() => {\n\t\t\tsetShowInputError(prev => ({ ...prev, path: false }))\n\t\t})\n\t}\n\n\tif (\n\t\tshowInputError.targetProjectPath &&\n\t\t(targetProjectPathValidationResult.result === \"empty\" || targetProjectPathValidationResult.result === \"ok\")\n\t) {\n\t\tstartTransition(() => {\n\t\t\tsetShowInputError(prev => ({ ...prev, targetProjectPath: false }))\n\t\t})\n\t}\n\n\tif (\n\t\tshowInputError.targetUrl &&\n\t\t(targetUrlValidationResult.result === \"empty\" || targetUrlValidationResult.result === \"ok\")\n\t) {\n\t\tstartTransition(() => {\n\t\t\tsetShowInputError(prev => ({ ...prev, targetUrl: false }))\n\t\t})\n\t}\n\n\tconst handleConfirm = () => {\n\t\tif (pathValidationResult.result !== \"ok\") return\n\t\tif (pathUniquenessValidationResult.result !== \"ok\") return\n\t\tif (targetUrlValidationResult.result !== \"ok\") return\n\t\tif (!hasChanges) return\n\t\tif (rewriteType === RewriteType.Internal && targetProjectPathValidationResult.result !== \"ok\") {\n\t\t\treturn\n\t\t}\n\n\t\t// Use normalized value to have the https:// protocol\n\t\tconst normalizedTargetUrl = targetUrlValidationResult.normalizedValue\n\n\t\tconst attributes: RewriteRouteNodeInterface = {\n\t\t\tpath,\n\t\t\trewriteType,\n\t\t\ttargetUrl: normalizedTargetUrl,\n\t\t\tmatchPagesFirst,\n\t\t}\n\t\ttry {\n\t\t\thandleLimitError(() => {\n\t\t\t\tlet rewriteRouteNode: RewriteRouteNode | null = null\n\t\t\t\tif (action === \"add\") {\n\t\t\t\t\trewriteRouteNode = addRewrite(treeStore, attributes, () =>\n\t\t\t\t\t\tensureRewriteLimits({\n\t\t\t\t\t\t\ttree,\n\t\t\t\t\t\t\tprojectId: projectStore.projectId,\n\t\t\t\t\t\t\tresourceLimits: {\n\t\t\t\t\t\t\t\trewrites: experiments.isOn(\"advancedHostingUpsells\") ? resourceLimits.rewrites : 100,\n\t\t\t\t\t\t\t\tmaxRewrites: experiments.isOn(\"advancedHostingUpsells\") ? resourceLimits.maxRewrites : 100,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmodalStore,\n\t\t\t\t\t\t\tcanUseExternalRewrites,\n\t\t\t\t\t\t\tprojectStore,\n\t\t\t\t\t\t\tcanUseRewrites,\n\t\t\t\t\t\t\tisProjectOnEnterprisePlan,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t\tprojectStore.commitTreeAndSend()\n\t\t\t\t} else if (action === \"edit\") {\n\t\t\t\t\trewriteRouteNode = treeStore.tree.getNodeWithTrait(rewriteRouteNodeId, isRewriteRouteNode)\n\t\t\t\t\tif (rewriteRouteNode) {\n\t\t\t\t\t\trewriteRouteNode = updateRewrite(rewriteRouteNode, attributes)\n\t\t\t\t\t\tprojectStore.commitTreeAndSend()\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tassertNever(action)\n\t\t\t\t}\n\n\t\t\t\tsetIsSubmitted(true)\n\t\t\t\tmodalStore.dismiss()\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tlogger.reportError(error)\n\t\t\ttoast({\n\t\t\t\ttype: \"add\",\n\t\t\t\tvariant: \"error\",\n\t\t\t\tkey: `${props.action}-multi-site-rule`,\n\t\t\t\tprimaryText: `Failed to ${props.action}`,\n\t\t\t\tsecondaryText: \"multi site rule.\",\n\t\t\t})\n\t\t}\n\t}\n\n\tconst projectOptions: ComboBoxListItem[] = useMemo(() => {\n\t\tif (fetchOriginStatus !== \"success\") return [] as ComboBoxListItem[]\n\n\t\treturn (\n\t\t\tframerOrigins\n\t\t\t\t// We don't allow to set rewrites to the same project\n\t\t\t\t// This prevents circular rewrites (which would 508 anyway) and duplicate content (since the same content would be served from both paths)\n\t\t\t\t.filter(origin => origin.projectId !== projectStore.projectId)\n\t\t\t\t.map(origin => ({\n\t\t\t\t\ttype: \"option\",\n\t\t\t\t\tvalue: originKey(origin),\n\t\t\t\t\ttitle: origin.title,\n\t\t\t\t\tlabel: isProjectOnFreePlan(origin) ? <UpgradeBadge /> : undefined,\n\t\t\t\t\tlabelWhenItemHighlighted: isProjectOnFreePlan(origin) ? <UpgradeBadge variant=\"highlight\" /> : undefined,\n\t\t\t\t}))\n\t\t)\n\t}, [framerOrigins, fetchOriginStatus, projectStore.projectId])\n\n\tconst getDropdownPlaceholder = useMemo(() => {\n\t\tif (fetchOriginStatus === \"fetching\") return \"Loading projects\u2026\"\n\t\tif (fetchOriginStatus === \"error\") return \"Error loading projects\"\n\t\treturn \"Project name\u2026\"\n\t}, [fetchOriginStatus])\n\n\tconst onSetRewriteType = useCallback(\n\t\t(value: RewriteType) => {\n\t\t\tif (\n\t\t\t\texperiments.isOn(\"advancedHostingUpsells\") &&\n\t\t\t\tcanUseExternalRewrites !== \"on\" &&\n\t\t\t\tvalue === RewriteType.External\n\t\t\t) {\n\t\t\t\treturn showExternalRewriteUpsellAddOnModal({ modalStore, projectStore })\n\t\t\t}\n\t\t\tsetRewriteType(value)\n\n\t\t\t// When changing origin types, we need to reset the target URL and selected origin\n\t\t\t// Otherwise it'll be a weird experience (e.g. you see the selected project's URL in the external tab)\n\t\t\tsetTargetUrl(\"\")\n\t\t\tsetSelectedTargetProject(null)\n\t\t\tsetTargetProjectPath(\"\")\n\t\t},\n\t\t[modalStore, canUseExternalRewrites, projectStore],\n\t)\n\n\tconst modalThemeProps = useModalTheme(\"darker\")\n\n\treturn (\n\t\t<Modal.Root\n\t\t\tonDismiss={modalStore.dismiss}\n\t\t\tonConfirm={handleConfirm}\n\t\t\tnoSelect\n\t\t\toffsetForDashboardSidebar\n\t\t\tfixPositionAfterMount\n\t\t\t{...modalThemeProps}\n\t\t>\n\t\t\t<Modal.Header>{action === \"edit\" ? \"Edit Rule\" : \"Add Rule\"}</Modal.Header>\n\t\t\t<Modal.Content>\n\t\t\t\t<Stack>\n\t\t\t\t\t<Stack direction=\"row\" gap={6} alignItems=\"center\" justifyContent=\"space-between\">\n\t\t\t\t\t\t<Label htmlFor=\"rewrite-path\">\n\t\t\t\t\t\t\t<T>Path</T>\n\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t<EducationIconAndTooltip\n\t\t\t\t\t\t\ttooltipContent={\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\tUse <strong>/*</strong> to match any segment (e.g. /blog/*)\n\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\tor <strong>/:slug</strong> for parameters (e.g. /products/:id)\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttooltipDirection=\"left\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Stack>\n\t\t\t\t\t<LinkInput\n\t\t\t\t\t\tconstantChange\n\t\t\t\t\t\tbackdropEnabled\n\t\t\t\t\t\tid=\"rewrite-path\"\n\t\t\t\t\t\trightChevron\n\t\t\t\t\t\tplaceholder=\"Enter a path\u2026\"\n\t\t\t\t\t\ttree={tree}\n\t\t\t\t\t\tlink={pathLink}\n\t\t\t\t\t\tsupportsPageLinks\n\t\t\t\t\t\tprependSlashForPathLikeInput\n\t\t\t\t\t\tautoFocus={false}\n\t\t\t\t\t\tvariableInfo={null}\n\t\t\t\t\t\thomePageName=\"/\"\n\t\t\t\t\t\tonChange={handlePathChange}\n\t\t\t\t\t\tonBlur={handlePathBlur}\n\t\t\t\t\t\thasError={\n\t\t\t\t\t\t\tshowInputError.path &&\n\t\t\t\t\t\t\t(pathValidationResult.result === \"error\" || pathUniquenessValidationResult.result === \"error\")\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t\t<InputWrapperError\n\t\t\t\t\t\tvisible={showInputError.path && pathValidationResult.result === \"error\"}\n\t\t\t\t\t\tclassName={styles.errorMessage}\n\t\t\t\t\t>\n\t\t\t\t\t\t{pathValidationResult.result === \"error\" && (\n\t\t\t\t\t\t\t<T className={styles.errorMessage}>{pathValidationResult.message}</T>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</InputWrapperError>\n\t\t\t\t\t<InputWrapperError\n\t\t\t\t\t\tvisible={showInputError.path && pathUniquenessValidationResult.result === \"error\"}\n\t\t\t\t\t\tclassName={styles.errorMessage}\n\t\t\t\t\t>\n\t\t\t\t\t\t{pathUniquenessValidationResult.result === \"error\" && (\n\t\t\t\t\t\t\t<T className={styles.errorMessage}>{pathUniquenessValidationResult.message}</T>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</InputWrapperError>\n\t\t\t\t</Stack>\n\t\t\t\t<Stack>\n\t\t\t\t\t<Stack direction=\"row\" gap={6} alignItems=\"center\" justifyContent=\"space-between\">\n\t\t\t\t\t\t<Label htmlFor={rewriteType === RewriteType.Internal ? \"target-project\" : \"target-url\"}>\n\t\t\t\t\t\t\t<T>Target</T>\n\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t<EducationIconAndTooltip\n\t\t\t\t\t\t\ttooltipContent={\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\tUse <strong>/:1</strong> to reference /* matches or <strong>:slug</strong> to\n\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\treference parameters (e.g. blog.com/:1)\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttooltipDirection=\"left\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Stack>\n\t\t\t\t\t<SegmentedControl unsaturated style={doubleColumn}>\n\t\t\t\t\t\t<SegmentedControlItem<RewriteType>\n\t\t\t\t\t\t\tidentifier={RewriteType.Internal}\n\t\t\t\t\t\t\ttitle=\"Project\"\n\t\t\t\t\t\t\tselected={rewriteType === RewriteType.Internal}\n\t\t\t\t\t\t\tonSelect={onSetRewriteType}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<SegmentedControlItem<RewriteType>\n\t\t\t\t\t\t\tidentifier={RewriteType.External}\n\t\t\t\t\t\t\ttitle=\"External\"\n\t\t\t\t\t\t\tselected={rewriteType === RewriteType.External}\n\t\t\t\t\t\t\tonSelect={onSetRewriteType}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</SegmentedControl>\n\t\t\t\t\t{rewriteType === RewriteType.Internal && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<ComboBox\n\t\t\t\t\t\t\t\tid=\"target-project\"\n\t\t\t\t\t\t\t\topenOnFocus\n\t\t\t\t\t\t\t\tbackdropEnabled\n\t\t\t\t\t\t\t\trightChevron\n\t\t\t\t\t\t\t\t// Project should only change when the user selects an option from the dropdown\n\t\t\t\t\t\t\t\tchangeOnBlur={false}\n\t\t\t\t\t\t\t\tvalue={selectedTargetProject?.title ?? \"\"}\n\t\t\t\t\t\t\t\tcheckedItems={selectedTargetProject ? [originKey(selectedTargetProject)] : undefined}\n\t\t\t\t\t\t\t\tonChange={handleTargetProjectChange}\n\t\t\t\t\t\t\t\titems={projectOptions}\n\t\t\t\t\t\t\t\tplaceholder={getDropdownPlaceholder}\n\t\t\t\t\t\t\t\tenabled={fetchOriginStatus === \"success\"}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{selectedTargetProject && (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<InputWrapper\n\t\t\t\t\t\t\t\t\t\thasError={showInputError.targetProjectPath && targetProjectPathValidationResult.result === \"error\"}\n\t\t\t\t\t\t\t\t\t\thasWarning={rewritePathVariablesValidationResult.result === \"warning\"}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<TextInput\n\t\t\t\t\t\t\t\t\t\t\tid=\"target-project-path\"\n\t\t\t\t\t\t\t\t\t\t\tconstantChange\n\t\t\t\t\t\t\t\t\t\t\tonChange={handleTargetProjectPathChange}\n\t\t\t\t\t\t\t\t\t\t\tonBlur={handleTargetProjectPathBlur}\n\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Enter a path\u2026\"\n\t\t\t\t\t\t\t\t\t\t\tvalue={targetProjectPath}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</InputWrapper>\n\t\t\t\t\t\t\t\t\t<InputWrapperError\n\t\t\t\t\t\t\t\t\t\tvisible={showInputError.targetProjectPath && targetProjectPathValidationResult.result === \"error\"}\n\t\t\t\t\t\t\t\t\t\tclassName={styles.errorMessage}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{targetProjectPathValidationResult.result === \"error\" && (\n\t\t\t\t\t\t\t\t\t\t\t<T className={styles.errorMessage}>{targetProjectPathValidationResult.message}</T>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</InputWrapperError>\n\t\t\t\t\t\t\t\t\t<InputWrapperWarning\n\t\t\t\t\t\t\t\t\t\tvisible={rewritePathVariablesValidationResult.result === \"warning\"}\n\t\t\t\t\t\t\t\t\t\tclassName={styles.warningMessage}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{rewritePathVariablesValidationResult.result === \"warning\" && (\n\t\t\t\t\t\t\t\t\t\t\t<T className={styles.warningMessage}>{rewritePathVariablesValidationResult.message}</T>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</InputWrapperWarning>\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t{rewriteType === RewriteType.External && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<InputWrapper\n\t\t\t\t\t\t\t\thasError={showInputError.targetUrl && targetUrlValidationResult.result === \"error\"}\n\t\t\t\t\t\t\t\thasWarning={rewritePathVariablesValidationResult.result === \"warning\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<TextInput\n\t\t\t\t\t\t\t\t\tid=\"target-url\"\n\t\t\t\t\t\t\t\t\tconstantChange\n\t\t\t\t\t\t\t\t\tonChange={handleTargetUrlChange}\n\t\t\t\t\t\t\t\t\tonBlur={handleTargetUrlBlur}\n\t\t\t\t\t\t\t\t\tplaceholder=\"Enter URL\u2026\"\n\t\t\t\t\t\t\t\t\tvalue={targetUrl}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</InputWrapper>\n\t\t\t\t\t\t\t<InputWrapperError\n\t\t\t\t\t\t\t\tvisible={showInputError.targetUrl && targetUrlValidationResult.result === \"error\"}\n\t\t\t\t\t\t\t\tclassName={styles.errorMessage}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{targetUrlValidationResult.result === \"error\" && (\n\t\t\t\t\t\t\t\t\t<T className={styles.errorMessage}>{targetUrlValidationResult.message}</T>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</InputWrapperError>\n\t\t\t\t\t\t\t<InputWrapperWarning\n\t\t\t\t\t\t\t\tvisible={rewritePathVariablesValidationResult.result === \"warning\"}\n\t\t\t\t\t\t\t\tclassName={styles.warningMessage}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{rewritePathVariablesValidationResult.result === \"warning\" && (\n\t\t\t\t\t\t\t\t\t<T className={styles.warningMessage}>{rewritePathVariablesValidationResult.message}</T>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</InputWrapperWarning>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t\t<Stack direction=\"row\" justifyContent=\"space-between\" className={styles.matchPagesFirstContainer}>\n\t\t\t\t\t<Stack\n\t\t\t\t\t\tdirection=\"row\"\n\t\t\t\t\t\talignItems=\"center\"\n\t\t\t\t\t\tonClick={() => setMatchPagesFirst(!matchPagesFirst)}\n\t\t\t\t\t\tclassName={styles.matchPagesFirstCheckboxContainer}\n\t\t\t\t\t>\n\t\t\t\t\t\t<CheckBox id=\"match-after-pages\" value={matchPagesFirst} onChange={setMatchPagesFirst} />\n\t\t\t\t\t\t<T className={styles.matchPagesFirstDescription}>Match pages first</T>\n\t\t\t\t\t</Stack>\n\t\t\t\t\t<EducationIconAndTooltip\n\t\t\t\t\t\ttooltipContent={\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\tSkip Multi Site rule for existing\n\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\tpages with matching paths.\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttooltipDirection=\"left\"\n\t\t\t\t\t/>\n\t\t\t\t</Stack>\n\t\t\t</Modal.Content>\n\t\t\t<Modal.Footer>\n\t\t\t\t<Modal.CancelButton>Cancel</Modal.CancelButton>\n\t\t\t\t<Modal.ActionButton\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tenabled={\n\t\t\t\t\t\t!isLoadingRoutesNode &&\n\t\t\t\t\t\thasChanges &&\n\t\t\t\t\t\tpathValidationResult.result === \"ok\" &&\n\t\t\t\t\t\tpathUniquenessValidationResult.result === \"ok\" &&\n\t\t\t\t\t\ttargetUrlValidationResult.result === \"ok\" &&\n\t\t\t\t\t\t// We're not validating paths against target projects but this captures invalid paths (not starting with /)\n\t\t\t\t\t\t(rewriteType === RewriteType.Internal ? targetProjectPathValidationResult.result === \"ok\" : true)\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{action === \"edit\" ? \"Save\" : \"Add\"}\n\t\t\t\t</Modal.ActionButton>\n\t\t\t</Modal.Footer>\n\t\t</Modal.Root>\n\t)\n}\n", "/**\n * Collects rewrite path variable keys: named (`:slug`), numbered (`:1`), and `*` wildcards\n * (each `*` adds the next numeric key, same left-to-right order as in the path string).\n */\n\nimport type { ValidationResult } from \"./ValidationResult.ts\"\n\nconst variableIdentifierPattern = \"[a-z]\\\\w*\"\nconst pathVariablesRegExp = new RegExp(`:(${variableIdentifierPattern})`, \"gi\")\nconst pathNumberedVariablesRegExp = /:(\\d+)/gi\n\nfunction extractNamedPathVariableKeys(path: string): string[] {\n\treturn Array.from(path.matchAll(pathVariablesRegExp), match => match[1]).filter(\n\t\t(key): key is string => key !== undefined,\n\t)\n}\n\nfunction extractNumberedPathVariableKeys(path: string): string[] {\n\treturn Array.from(path.matchAll(pathNumberedVariablesRegExp), match => match[1]).filter(\n\t\t(key): key is string => key !== undefined,\n\t)\n}\n\nexport function getRewritePathVariableKeys(path: string, localePrefixes: string[] = []): Map<string, boolean> {\n\tconst variables: Map<string, boolean> = new Map()\n\tlet numWildcards = 0\n\n\tif (localePrefixes.length > 0) {\n\t\tvariables.set(`${++numWildcards}`, true)\n\t}\n\n\tfor (const key of extractNamedPathVariableKeys(path)) {\n\t\tvariables.set(key, true)\n\t}\n\tfor (const key of extractNumberedPathVariableKeys(path)) {\n\t\tvariables.set(key, true)\n\t}\n\tconst pathWildcards = (path.match(/\\*/g) || []).length\n\tfor (let i = 0; i < pathWildcards; i++) {\n\t\tvariables.set(`${++numWildcards}`, true)\n\t}\n\n\treturn variables\n}\n\nfunction formatPathVariableLabel(key: string): string {\n\treturn `:${key}`\n}\n\nexport function validateRewritePathVariables(sourcePath: string, targetPath: string): ValidationResult<undefined> {\n\tconst sourceVars = getRewritePathVariableKeys(sourcePath, [])\n\tconst targetVars = getRewritePathVariableKeys(targetPath, [])\n\n\tif (sourceVars.size === 0 && targetVars.size === 0) {\n\t\treturn { result: \"ok\", normalizedValue: undefined }\n\t}\n\n\tfor (const key of sourceVars.keys()) {\n\t\tif (!targetVars.has(key)) {\n\t\t\treturn {\n\t\t\t\tresult: \"warning\",\n\t\t\t\tmessage: `Add variable ${formatPathVariableLabel(key)} to target path.`,\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const key of targetVars.keys()) {\n\t\tif (!sourceVars.has(key)) {\n\t\t\treturn {\n\t\t\t\tresult: \"warning\",\n\t\t\t\tmessage: `Remove variable ${formatPathVariableLabel(key)} from target path.`,\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { result: \"ok\", normalizedValue: undefined }\n}\n", "import type { FeatureValue } from \"@framerjs/app-config\"\nimport { AddOnLicenseType, openNewTab } from \"@framerjs/app-shared\"\nimport { UpsellType } from \"@framerjs/events\"\nimport { getLogger } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { LimitError } from \"document/components/chrome/shared/utils/limitError.ts\"\nimport { UpsellFeature } from \"document/components/chrome/siteSettings/Plans/Stripe/utils/upsell.ts\"\nimport type { CanvasTree } from \"document/models/CanvasTree/index.ts\"\nimport { RoutesNode } from \"document/models/CanvasTree/nodes/RoutesNode.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { enterpriseUpsellURL } from \"utils/staticURLs.ts\"\nimport { getProjectPlansURL } from \"web/lib/Project.ts\"\nimport { UpsellUIInteraction, record } from \"web/lib/tracker.ts\"\nimport type { DashboardDomainModalStore } from \"web/pages/projects/DashboardModalStore.ts\"\nimport type { DashboardProjectStore } from \"web/pages/projects/DashboardProjectStore.ts\"\n\nconst logger = getLogger(\"DashboardProjectStore\")\n\nexport function ensureRewriteLimits(params: CheckRewriteLimitUpsellParams) {\n\tif (params.resourceLimits.rewrites === null) return\n\n\tconst currentRewriteCount = RoutesNode.ensure(params.tree).loaded?.getRewriteRoutes().length ?? 0\n\tif (currentRewriteCount >= params.resourceLimits.rewrites) {\n\t\tcheckRewriteLimitUpsellModal(params)\n\t\tthrow new LimitError(\n\t\t\t`Maximum number of Multi Site reached: ${params.resourceLimits.rewrites}. Please contact support if you need to add more.`,\n\t\t\t\"max-allowed-reached\",\n\t\t)\n\t}\n}\n\ninterface CheckRewriteLimitUpsellParams {\n\ttree: CanvasTree\n\tprojectId: string\n\tresourceLimits: {\n\t\trewrites: number | null\n\t\tmaxRewrites: number | null\n\t}\n\tmodalStore: DashboardDomainModalStore\n\tcanUseExternalRewrites: FeatureValue\n\tprojectStore: DashboardProjectStore\n\tcanUseRewrites: boolean\n\tisProjectOnEnterprisePlan: boolean\n}\n\nexport function checkRewriteLimitUpsellModal({\n\ttree,\n\tprojectId,\n\tresourceLimits,\n\tcanUseExternalRewrites,\n\tmodalStore,\n\tcanUseRewrites,\n\tprojectStore,\n\tisProjectOnEnterprisePlan,\n}: CheckRewriteLimitUpsellParams): boolean {\n\tconst currentRewriteCount = RoutesNode.ensure(tree).loaded?.getRewriteRoutes().length ?? 0\n\n\tif (!canUseRewrites || (resourceLimits.rewrites !== null && currentRewriteCount >= resourceLimits.rewrites)) {\n\t\tconst title = \"Multi Site Limit Reached\"\n\n\t\tconst rewriteUpsellDetails = RewriteUpsellDetails({\n\t\t\tprojectId,\n\t\t\tcanUseExternalRewrites,\n\t\t\tcanUseRewrites,\n\t\t\tmodalStore,\n\t\t\tprojectStore,\n\t\t\tisProjectOnEnterprisePlan,\n\t\t})\n\n\t\tmodalStore.show({\n\t\t\ttitle,\n\t\t\ttype: ModalType.Confirmation,\n\t\t\tvariant: \"primary\",\n\t\t\tcancelLabel: \"Maybe Later\",\n\t\t\tonCancel: modalStore.dismiss,\n\t\t\tonDismiss: modalStore.dismiss,\n\t\t\t...rewriteUpsellDetails,\n\t\t})\n\n\t\treturn true\n\t}\n\n\treturn false\n}\n\ninterface RewriteUpsellDetailsParams extends Omit<CheckRewriteLimitUpsellParams, \"tree\" | \"resourceLimits\"> {}\n\nfunction RewriteUpsellDetails({\n\tprojectId,\n\tcanUseExternalRewrites,\n\tcanUseRewrites,\n\tmodalStore,\n\tprojectStore,\n\tisProjectOnEnterprisePlan,\n}: RewriteUpsellDetailsParams) {\n\tconst contactLabel = \"Contact Us\"\n\tconst contactConfirm = () => {\n\t\trecord(\"ui_interaction\", {\n\t\t\tpage: UpsellType.domainsRewriteEnterpriseUpsell,\n\t\t\tid: UpsellUIInteraction.contactUs,\n\t\t})\n\t\topenNewTab(enterpriseUpsellURL)\n\t\tmodalStore.dismiss()\n\t}\n\tconst plansLabel = \"View Plans\"\n\tconst plansConfirm = () => {\n\t\trecord(\"ui_interaction\", { page: UpsellType.domainsRewriteEnterpriseUpsell, id: UpsellUIInteraction.confirmUpsell })\n\t\tconst plansUrl = getProjectPlansURL({ id: projectId, title: null, canvasFeatures: {} }).toString()\n\t\topenNewTab(`${plansUrl}:${UpsellFeature.canUseCustomCanonicalUrl}`)\n\t\tmodalStore.dismiss()\n\t}\n\n\tif (!canUseRewrites) {\n\t\treturn {\n\t\t\tdescription: \"Upgrade to Scale or Enterprise to get Multi Site rewrites, Custom Headers and Static Files.\",\n\t\t\tconfirmLabel: plansLabel,\n\t\t\tonConfirm: plansConfirm,\n\t\t}\n\t}\n\n\tif (isProjectOnEnterprisePlan) {\n\t\treturn {\n\t\t\tconfirmLabel: contactLabel,\n\t\t\tdescription:\n\t\t\t\t\"You\u2019ve reached the Multi Site limit for this domain. To add more rewrites, contact your Account Manager or email us.\",\n\t\t\tonConfirm: contactConfirm,\n\t\t}\n\t}\n\n\tif (canUseExternalRewrites !== \"on\") {\n\t\treturn {\n\t\t\tdescription: `Purchase an ${Dictionary.AddOn} to host multiple sites or landing pages on your domain.`,\n\t\t\tconfirmLabel: \"Buy\",\n\t\t\tonConfirm: () => buyConfirm({ modalStore, projectStore }),\n\t\t}\n\t}\n\n\treturn {\n\t\tdescription: \"You\u2019ve reached your rewrite limit. Contact us to increase your limit.\",\n\t\tconfirmLabel: contactLabel,\n\t\tonConfirm: contactConfirm,\n\t}\n}\n\nexport const showExternalRewriteUpsellAddOnModal = ({\n\tmodalStore,\n\tprojectStore,\n}: {\n\tmodalStore: DashboardDomainModalStore\n\tprojectStore: DashboardProjectStore\n}) => {\n\tmodalStore.show({\n\t\ttitle: `${Dictionary.AddOn} Required`,\n\t\tdescription: `Purchase an ${Dictionary.AddOn} to add external rewrites.`,\n\t\tconfirmLabel: \"Buy\",\n\t\tonConfirm: () => buyConfirm({ modalStore, projectStore }),\n\t\ttype: ModalType.Confirmation,\n\t\tvariant: \"primary\",\n\t\tcancelLabel: \"Maybe Later\",\n\t\tonCancel: modalStore.dismiss,\n\t\tonDismiss: modalStore.dismiss,\n\t})\n}\n\nfunction buyConfirm({\n\tmodalStore,\n\tprojectStore,\n}: {\n\tmodalStore: DashboardDomainModalStore\n\tprojectStore: DashboardProjectStore\n}) {\n\tmodalStore.show({\n\t\ttype: ModalType.DashboardAcquireAddonModal,\n\t\taddonInfo: { addonLicenseType: AddOnLicenseType.CustomProxySetup },\n\t\tonSuccess: async () => {\n\t\t\t// Reload project data so the limits are updated without reloading the page\n\t\t\tawait projectStore.loadProjectData().catch(error => logger.error(\"Failed to reload project store:\", error))\n\t\t},\n\t})\n}\n", "import { hasInvalidProtocolPrefix } from \"@framerjs/app-shared\"\nimport { isValidURLWithoutProtocol } from \"document/utils/domainValidation.ts\"\nimport type { RewriteFramerOrigin } from \"../Rewrites/getRewriteFramerOrigins.ts\"\nimport type { ValidationResult } from \"./ValidationResult.ts\"\nimport { validatePathOrURL } from \"./validatePathOrURL.ts\"\n\nconst genericErrorMessage = \"Please enter a valid URL\"\n\nconst isFreeHostname = (hostname: string, freeDomains: string[]) => {\n\tconst lowercaseHostname = hostname.toLowerCase()\n\treturn freeDomains.some(freeDomain => lowercaseHostname.endsWith(freeDomain))\n}\n\nconst isValidProjectTarget = (hostname: string, framerOrigins: RewriteFramerOrigin[]) => {\n\tconst lowercaseHostname = hostname.toLowerCase()\n\tconst origin = framerOrigins.find(fOrigin => fOrigin.hostname === lowercaseHostname)\n\t// If we don't find an origin, it's an _actual_ external origin.\n\t// If we do find one, the customer is using external URLs for internal rewrites (not ideal, but sure)\n\t// but in that case we need to make sure the target project has a paid license\n\treturn !origin || origin.licenseType !== \"freeSite\"\n}\n\nexport function validateRewriteTargetProjectPath(targetProjectPath: string): ValidationResult {\n\treturn validatePathOrURL(targetProjectPath, \"path\", { blockInvalidCharacters: \"all\" })\n}\n\nexport function isDefaultFramerDomain(hostname: string): boolean {\n\treturn hostname.endsWith(\".framer.app\") || hostname.endsWith(\".framerdev.app\")\n}\n\nexport function validateRewriteTargetUrl(\n\ttoUrl: string,\n\tframerOrigins: RewriteFramerOrigin[] = [],\n\tfreeDomains: string[] = [],\n\tnormalizedPathValue?: string,\n): ValidationResult {\n\ttoUrl = toUrl.trim()\n\n\tconst validationResult = validatePathOrURL(toUrl, \"URL\", { blockInvalidCharacters: \"all\" })\n\tif (validationResult.result !== \"ok\") {\n\t\treturn validationResult\n\t}\n\n\tif (!toUrl) {\n\t\treturn { result: \"empty\" }\n\t}\n\n\ttoUrl = validationResult.normalizedValue\n\n\t// Prevent circular rewrites\n\tif (toUrl === normalizedPathValue) {\n\t\treturn { result: \"error\", message: \"Source URL cannot be the same as the path\" }\n\t}\n\n\tif (hasInvalidProtocolPrefix(toUrl)) {\n\t\treturn { result: \"error\", message: \"Only https:// protocol is supported\" }\n\t}\n\n\tlet normalizedValue = isValidURLWithoutProtocol(toUrl) ? `https://${toUrl}` : toUrl\n\tlet url: URL\n\n\t// Check if it's a valid absolute URL\n\ttry {\n\t\turl = new URL(normalizedValue)\n\t\tnormalizedValue = url.toString().replace(\"http://\", \"https://\")\n\t} catch {\n\t\treturn { result: \"error\", message: genericErrorMessage }\n\t}\n\n\tif (isDefaultFramerDomain(url.hostname)) {\n\t\treturn {\n\t\t\tresult: \"error\",\n\t\t\tmessage: \"You cannot rewrite to base framer domains\",\n\t\t}\n\t}\n\n\tif (isFreeHostname(url.hostname, freeDomains) && !isValidProjectTarget(url.hostname, framerOrigins)) {\n\t\treturn {\n\t\t\tresult: \"error\",\n\t\t\tmessage: \"Project must be on a paid plan\",\n\t\t}\n\t}\n\n\treturn { result: \"ok\", normalizedValue }\n}\n", "import { parseURL } from \"@framerjs/app-shared\"\nimport type { RewriteFramerOrigin } from \"./getRewriteFramerOrigins.ts\"\n\nexport const getFramerOriginByUrl = (\n\turl: string,\n\tframerOrigins: RewriteFramerOrigin[],\n): RewriteFramerOrigin | undefined => {\n\tconst { hostname } = parseURL(url)\n\tif (!hostname) return undefined\n\n\treturn framerOrigins.find(origin => origin.hostname === hostname)\n}\n", "import { ConfirmationModal } from \"@framerjs/fresco\"\nimport { assertNever } from \"@framerjs/shared\"\nimport { useExperimentIsOn } from \"app/experiments.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { useDashboardProjectStores } from \"./DashboardProjectStores.tsx\"\nimport { DashboardRequestProjectAccessModal } from \"./DashboardRequestProjectAccessModal.tsx\"\nimport { CustomHeaderModal } from \"./components/Domains/CustomHeaders/CustomHeaderModal.tsx\"\nimport { DashboardAcquireAddOnModal } from \"./components/Domains/DashboardAquireAddOnModal.tsx\"\nimport { DashboardUnsupportedFileTypeModal } from \"./components/Domains/DashboardUnsupportedFileTypeModal.tsx\"\nimport { FilesModal } from \"./components/Domains/Files/FilesModal.tsx\"\nimport { RedirectModal } from \"./components/Domains/Redirects/RedirectModal.tsx\"\nimport { RewriteModal } from \"./components/Domains/Rewrites/RewriteModal.tsx\"\n\nexport function DomainModalRenderer() {\n\tconst { modalStore } = useDashboardProjectStores()\n\tconst { active } = modalStore.useState()\n\n\tconst isAgentExperimentOn = useExperimentIsOn(\"agent\")\n\n\tif (!active) return null\n\n\tswitch (active.type) {\n\t\tcase ModalType.Confirmation:\n\t\t\treturn (\n\t\t\t\t<ConfirmationModal\n\t\t\t\t\t{...active}\n\t\t\t\t\tonDismiss={() => {\n\t\t\t\t\t\tactive.onDismiss?.()\n\t\t\t\t\t\tmodalStore.dismiss()\n\t\t\t\t\t}}\n\t\t\t\t\tnoSelect\n\t\t\t\t\toffsetForDashboardSidebar\n\t\t\t\t\tlegacy={!isAgentExperimentOn}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase ModalType.DashboardAddRedirect:\n\t\tcase ModalType.DashboardEditRedirect:\n\t\t\treturn <RedirectModal {...active} />\n\t\tcase ModalType.DashboardAddHeader:\n\t\tcase ModalType.DashboardEditHeader:\n\t\t\treturn <CustomHeaderModal {...active} />\n\t\tcase ModalType.DashboardAddRewrite:\n\t\tcase ModalType.DashboardEditRewrite:\n\t\t\treturn <RewriteModal {...active} />\n\t\tcase ModalType.DashboardRequestProjectAccess:\n\t\t\treturn <DashboardRequestProjectAccessModal />\n\t\tcase ModalType.DashboardAddFile:\n\t\tcase ModalType.DashboardEditFile:\n\t\t\treturn <FilesModal {...active} />\n\t\tcase ModalType.DashboardUnsupportedFileType:\n\t\t\treturn <DashboardUnsupportedFileTypeModal {...active} />\n\t\tcase ModalType.DashboardAcquireAddonModal:\n\t\t\treturn <DashboardAcquireAddOnModal {...active} />\n\t\tdefault:\n\t\t\tassertNever(active)\n\t}\n}\n", "import { IconArrowFilledDropdown, Stack } from \"@framerjs/fresco\"\nimport { assert, emptyArray, hostInfo } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { experiments } from \"app/experiments.ts\"\nimport type { HeaderRouteNode } from \"document/models/CanvasTree/nodes/HeaderRouteNode.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/nodes/NodeID.ts\"\nimport { RoutesNode } from \"document/models/CanvasTree/nodes/RoutesNode.ts\"\nimport { isHeaderRouteNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { deleteCustomHeaders, moveHeader, updateHeader } from \"document/models/CanvasTree/nodes/utils/routesNode.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { useCallback, useMemo, useState } from \"react\"\nimport { getId } from \"utils/getId.ts\"\nimport { useDashboardProjectStores } from \"../../../DashboardProjectStores.tsx\"\nimport { DomainPageLayoutVirtualized } from \"../DomainPageLayoutVirtualized.tsx\"\nimport { DomainPageRow, DomainPageRowLabel, SortableDomainPageRow } from \"../DomainPageRow.tsx\"\nimport * as domainStyles from \"../index.styles.ts\"\n\nexport function CustomHeaders() {\n\tconst { treeStore, projectStore, modalStore } = useDashboardProjectStores()\n\tconst { tree } = treeStore.useState()\n\tconst { upsellCustomHeaders, canUseCustomHeaders } = projectStore.useState()\n\n\tconst routesNode = RoutesNode.get(tree)\n\n\tconst pageURL = new URL(window.location.href)\n\tconst [defaultHeadersExpanded, setDefaultHeadersExpanded] = useState(\n\t\tpageURL.searchParams.get(\"showDefaultHeaders\") === \"true\",\n\t)\n\n\tconst headerRouteNodes = useMemo(\n\t\t() => routesNode?.loaded?.getHeaderRoutes() || emptyArray<HeaderRouteNode>(),\n\t\t[routesNode],\n\t)\n\n\tconst hasLocales = Boolean(tree?.root.locales?.length)\n\n\tconst toggleDefaultHeaders = () => {\n\t\tconst showDefaultHeaders = !defaultHeadersExpanded\n\t\tsetDefaultHeadersExpanded(showDefaultHeaders)\n\t\tpageURL.searchParams.set(\"showDefaultHeaders\", showDefaultHeaders.toString())\n\t\twindow.history.replaceState(window.history.state, \"\", pageURL.href)\n\t}\n\n\tconst handleReorderHeaders = useCallback(\n\t\t(from: number, to: number) => {\n\t\t\t// We don't need to ensure limits because we're just changing existing headers order\n\t\t\tmoveHeader(treeStore, to, from)\n\t\t\tprojectStore.commitTreeAndSend()\n\t\t},\n\t\t[projectStore, treeStore],\n\t)\n\n\tconst handleDeleteHeader = useCallback(\n\t\t(headerId: string) => {\n\t\t\tmodalStore.show({\n\t\t\t\ttype: ModalType.Confirmation,\n\t\t\t\ttitle: \"Delete Header\",\n\t\t\t\tdescription: \"This header will be removed from your site when you publish a new version.\",\n\t\t\t\tconfirmLabel: Dictionary.Delete,\n\t\t\t\tcancelLabel: Dictionary.Cancel,\n\t\t\t\tonCancel: modalStore.dismiss,\n\t\t\t\tonConfirm: () => {\n\t\t\t\t\tdeleteCustomHeaders(treeStore, [headerId])\n\t\t\t\t\tprojectStore.commitTreeAndSend()\n\t\t\t\t\tmodalStore.dismiss()\n\t\t\t\t},\n\t\t\t\tvariant: \"destructive\",\n\t\t\t\tonDismiss: modalStore.dismiss,\n\t\t\t})\n\t\t},\n\t\t[projectStore, treeStore, modalStore],\n\t)\n\n\tconst handleEditHeader = useCallback(\n\t\t(nodeId: NodeID) => {\n\t\t\tmodalStore.show({\n\t\t\t\ttype: ModalType.DashboardEditHeader,\n\t\t\t\taction: \"edit\",\n\t\t\t\tnodeId,\n\t\t\t})\n\t\t},\n\t\t[modalStore],\n\t)\n\n\tconst handleToggleExpandToAllLocales = useCallback(\n\t\t(nodeId: NodeID) => {\n\t\t\tconst node = treeStore.tree.getNodeWithTrait(nodeId, isHeaderRouteNode)\n\t\t\tassert(node, `Node with id \"${nodeId}\" not found in tree`)\n\t\t\tupdateHeader(node, { expandToAllLocales: !node.shouldExpandToAllLocales() })\n\t\t\tprojectStore.commitTreeAndSend()\n\t\t},\n\t\t[projectStore, treeStore],\n\t)\n\n\tconst rowHeaderRowCount = defaultHeadersExpanded ? 1 + defaultHeaders.length : 1\n\tconst rowHeaderHeight = rowHeaderRowCount * domainStyles.rowHeight\n\n\treturn (\n\t\t<DomainPageLayoutVirtualized\n\t\t\titems={headerRouteNodes}\n\t\t\tmoveItem={handleReorderHeaders}\n\t\t\tkeyForItem={getId}\n\t\t\tdefaultRows={<DefaultHeadersRow expanded={defaultHeadersExpanded} toggleExpanded={toggleDefaultHeaders} />}\n\t\t\tdefaultRowsHeight={rowHeaderHeight}\n\t\t\tupsell={experiments.isOn(\"advancedHostingUpsells\") ? canUseCustomHeaders !== \"on\" : upsellCustomHeaders}\n\t\t>\n\t\t\t{({ item, dragHandleRef, sortingEnabled }) => (\n\t\t\t\t<SortableDomainPageRow\n\t\t\t\t\tid={item.id}\n\t\t\t\t\tdragHandleRef={dragHandleRef}\n\t\t\t\t\thasLocales={hasLocales}\n\t\t\t\t\tupsell={experiments.isOn(\"advancedHostingUpsells\") ? canUseCustomHeaders !== \"on\" : upsellCustomHeaders}\n\t\t\t\t\tonEdit={handleEditHeader}\n\t\t\t\t\tonDelete={handleDeleteHeader}\n\t\t\t\t\tsortingEnabled={sortingEnabled}\n\t\t\t\t\tonToggleExpandToAllLocales={handleToggleExpandToAllLocales}\n\t\t\t\t\tcanExpandToAllLocales={!item.pathHasExplicitLocaleFromTree()}\n\t\t\t\t\tisExpandedToAllLocales={item.shouldExpandToAllLocales()}\n\t\t\t\t>\n\t\t\t\t\t<DomainPageRowLabel>{item.path}</DomainPageRowLabel>\n\t\t\t\t\t<DomainPageRowLabel>{item.key}</DomainPageRowLabel>\n\t\t\t\t\t<DomainPageRowLabel>{item.value}</DomainPageRowLabel>\n\t\t\t\t</SortableDomainPageRow>\n\t\t\t)}\n\t\t</DomainPageLayoutVirtualized>\n\t)\n}\n\nconst framerUserContentDomain = hostInfo.isProduction ? \"framerusercontent.com\" : \"framerusercontent.dev\"\n\nconst defaultHeaders = [\n\t{ id: \"111111\", key: \"Alt-Svc\", value: `h3=\":443\"; ma=2592000` },\n\t{\n\t\tid: \"222222\",\n\t\tkey: \"Cache-Control\",\n\t\tvalue: `public, max-age=0, must-revalidate`,\n\t},\n\t{ id: \"333333\", key: \"Content-Length\", value: \"<dynamic>\" },\n\t{ id: \"444444\", key: \"Date\", value: \"<dynamic>\" },\n\t{ id: \"555555\", key: \"Etag\", value: \"<dynamic>\" },\n\t{\n\t\tid: \"666666\",\n\t\tkey: \"Link\",\n\t\tvalue: `<https://${framerUserContentDomain}>; rel=\"preconnect\", <https://${framerUserContentDomain}>; rel=\"preconnect\"; crossorigin=\"\"`,\n\t},\n\t{ id: \"777777\", key: \"Server\", value: \"<dynamic>\" },\n\t{ id: \"888888\", key: \"Server-Timing\", value: \"<dynamic>\" },\n\t{ id: \"999999\", key: \"Strict-Transport-Security\", value: \"max-age=31536000\" },\n\t{ id: \"101010\", key: \"Vary\", value: \"<dynamic>\" },\n\t{ id: \"000000\", key: \"X-Content-Type-Options\", value: \"nosniff\" },\n]\n\nfunction DefaultHeadersRow({ expanded, toggleExpanded }: { expanded: boolean; toggleExpanded: () => void }) {\n\treturn (\n\t\t<Stack direction=\"column\" gap={0}>\n\t\t\t<DomainPageRow\n\t\t\t\trowClassName={domainStyles.defaultHeadersRow}\n\t\t\t\tonMouseDown={toggleExpanded}\n\t\t\t\ticon={\n\t\t\t\t\t<IconArrowFilledDropdown\n\t\t\t\t\t\tclassName={(expanded && domainStyles.rotate) || domainStyles.rotateBack}\n\t\t\t\t\t\theight={7}\n\t\t\t\t\t\twidth={3}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<DomainPageRowLabel>Default</DomainPageRowLabel>\n\t\t\t\t<DomainPageRowLabel>{`${defaultHeaders.length} Headers`}</DomainPageRowLabel>\n\t\t\t\t<DomainPageRowLabel>{`${defaultHeaders.length} Values`}</DomainPageRowLabel>\n\t\t\t</DomainPageRow>\n\t\t\t{expanded &&\n\t\t\t\tdefaultHeaders.map(header => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<DomainPageRow key={header.id}>\n\t\t\t\t\t\t\t<DomainPageRowLabel />\n\t\t\t\t\t\t\t<DomainPageRowLabel>{header.key}</DomainPageRowLabel>\n\t\t\t\t\t\t\t<DomainPageRowLabel>{header.value}</DomainPageRowLabel>\n\t\t\t\t\t\t</DomainPageRow>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t</Stack>\n\t)\n}\n", "import type { StickyHeaderLevel } from \"@framerjs/fresco\"\nimport { EmptyState as FrescoEmptyState, SortableVirtualList, Spinner, useReadOnly } from \"@framerjs/fresco\"\nimport { assert, assertNever } from \"@framerjs/shared\"\nimport { cx } from \"@linaria/core\"\nimport { getNoSearchResultProps } from \"document/components/chrome/shared/utils/getNoSearchResultProps.ts\"\nimport { useCallback, useLayoutEffect, useMemo, useRef, useState } from \"react\"\nimport {\n\tDomainPageEmptyStateNoItems,\n\tDomainPageEmptyStateNoProjectMember,\n\tDomainPageEmptyStateUpsell,\n} from \"web/pages/projects/components/Domains/DomainPageEmptyStates.tsx\"\nimport { useDashboardProjectStores } from \"../../DashboardProjectStores.tsx\"\nimport { DomainPageSubHeader, domainTabHasSearch } from \"./DomainPageSubHeader.tsx\"\nimport { DomainsPageHeader } from \"./DomainsPageHeader.tsx\"\nimport { useSelectedDomainTab } from \"./SelectedDomainTab.tsx\"\nimport * as styles from \"./index.styles.ts\"\n\n// We are using symbols to avoid name collisions with the items array\nconst mainHeaderSlot = Symbol(\"mainHeaderSlot\")\nconst subHeaderSlot = Symbol(\"subHeaderSlot\")\nconst defaultRowsSlot = Symbol(\"defaultRowsSlot\")\nconst tableEmptyStateSlot = Symbol(\"emptyStateSlot\")\nconst pageEmptyStateSlot = Symbol(\"pageEmptyStateSlot\")\n\nconst SlotType = {\n\tMainHeader: mainHeaderSlot,\n\tSubHeader: subHeaderSlot,\n\tDefaultRows: defaultRowsSlot,\n\tTableEmptyState: tableEmptyStateSlot,\n\tPageEmptyState: pageEmptyStateSlot,\n} as const\n\ntype SlotType = (typeof SlotType)[keyof typeof SlotType]\n\nconst slotTypes = new Set(Object.values(SlotType))\n\nfunction isSlotType(item: unknown): item is SlotType {\n\treturn slotTypes.has(item as SlotType)\n}\n\nfunction isNotSlotType<T>(item: T | SlotType): item is T {\n\treturn !slotTypes.has(item as SlotType)\n}\n\ntype HeaderSlot = Exclude<SlotType, typeof SlotType.TableEmptyState | typeof SlotType.PageEmptyState>\n\nfunction isHeaderSlot(item: unknown): item is HeaderSlot {\n\tif (isNotSlotType(item)) return false\n\n\tif (item === SlotType.TableEmptyState) return false\n\tif (item === SlotType.PageEmptyState) return false\n\n\t// Make sure the type matches the logic within this function\n\titem satisfies HeaderSlot\n\n\treturn true\n}\n\ntype DomainPageLayoutVirtualizedProps<T> = {\n\titems: readonly T[]\n\tkeyForItem: (item: T) => string | number\n\tchildren: (options: {\n\t\titem: T\n\t\tindex: number\n\t\tisDragPreview: boolean\n\t\tsortingEnabled: boolean\n\t\tdragHandleRef?: React.RefObject<HTMLDivElement>\n\t}) => React.ReactElement\n\n\tdefaultRows?: React.ReactElement\n\tdefaultRowsHeight?: number\n\tupsell: boolean\n} & (\n\t| {\n\t\t\tdraggingEnabled?: true\n\t\t\tmoveItem: (from: number, to: number) => void\n\t  }\n\t| {\n\t\t\tdraggingEnabled?: false\n\t\t\tmoveItem?: never\n\t  }\n)\n\nexport function DomainPageLayoutVirtualized<T>({\n\titems,\n\tchildren,\n\tmoveItem,\n\tkeyForItem,\n\tdefaultRows,\n\tdefaultRowsHeight,\n\tupsell,\n\tdraggingEnabled = true,\n}: DomainPageLayoutVirtualizedProps<T>) {\n\tconst selectedTab = useSelectedDomainTab()\n\tconst { projectStore, treeStore, searchStore } = useDashboardProjectStores()\n\tconst { isLoadingTree } = treeStore.useState()\n\tconst { isProjectMember } = projectStore.useState()\n\tconst { redirectsSearchTerm } = searchStore.useState()\n\tconst readOnly = useReadOnly()\n\n\tconst isSearching = redirectsSearchTerm !== \"\" && selectedTab === \"redirects\"\n\tconst selectedTabHasSearch = domainTabHasSearch(selectedTab)\n\tconst subHeaderHeight = selectedTabHasSearch ? styles.subheaderWithSearchHeight : styles.subheaderHeight\n\n\tconst virtualListRef = useRef<HTMLDivElement>(null)\n\n\tconst [virtualListHeight, setVirtualListHeight] = useState(0)\n\n\tuseLayoutEffect(() => {\n\t\tconst updateVirtualListHeight = () => {\n\t\t\tconst virtualListElement = virtualListRef.current\n\t\t\tif (!virtualListElement) return\n\t\t\tsetVirtualListHeight(virtualListElement.offsetHeight)\n\t\t}\n\n\t\tupdateVirtualListHeight()\n\n\t\twindow.addEventListener(\"resize\", updateVirtualListHeight)\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"resize\", updateVirtualListHeight)\n\t\t}\n\t}, [])\n\n\tconst noItems = items.length === 0\n\tconst hasDefaultRows = Boolean(defaultRows)\n\n\tconst pageEmptyState = useMemo((): PageEmptyStateType => {\n\t\tif (!isProjectMember) return \"no-project-member\"\n\t\tif (isLoadingTree) return \"loading\"\n\t\tif (!hasDefaultRows && upsell) return \"upsell\"\n\t\tif (!hasDefaultRows && noItems && !isSearching) return \"no-items\"\n\t\treturn \"none\"\n\t}, [isLoadingTree, isProjectMember, noItems, isSearching, upsell, hasDefaultRows])\n\n\tconst tableEmptyState = useMemo((): TableEmptyStateType => {\n\t\tif (pageEmptyState !== \"none\") return \"none\"\n\t\tif (isSearching && noItems) return \"no-search-results\"\n\t\treturn \"none\"\n\t}, [isSearching, noItems, pageEmptyState])\n\n\tconst headerSlots = useMemo<HeaderSlot[]>(() => {\n\t\tconst headers: HeaderSlot[] = [SlotType.MainHeader]\n\n\t\tif (pageEmptyState === \"none\") {\n\t\t\theaders.push(SlotType.SubHeader)\n\t\t}\n\n\t\tconst noEmptyStates = pageEmptyState === \"none\" && tableEmptyState === \"none\"\n\t\tif (noEmptyStates && hasDefaultRows) {\n\t\t\theaders.push(SlotType.DefaultRows)\n\t\t}\n\n\t\treturn headers\n\t}, [pageEmptyState, tableEmptyState, hasDefaultRows])\n\n\tconst itemsIncludingSlots = useMemo<readonly (T | SlotType)[]>(() => {\n\t\tif (pageEmptyState !== \"none\") return [...headerSlots, SlotType.PageEmptyState]\n\t\tif (tableEmptyState !== \"none\") return [...headerSlots, SlotType.TableEmptyState]\n\t\treturn [...headerSlots, ...items]\n\t}, [items, headerSlots, tableEmptyState, pageEmptyState])\n\n\tconst keyForItemHandler = useCallback(\n\t\t(item: T | SlotType) => {\n\t\t\tif (isSlotType(item)) return item.toString()\n\t\t\treturn keyForItem(item)\n\t\t},\n\t\t[keyForItem],\n\t)\n\n\tconst heightForHeaderSlot = useCallback(\n\t\t(item: HeaderSlot) => {\n\t\t\tif (item === SlotType.MainHeader) return styles.domainHeaderHeight\n\t\t\tif (item === SlotType.SubHeader) return subHeaderHeight + styles.rowHeight\n\t\t\tif (item === SlotType.DefaultRows) return defaultRowsHeight ?? styles.rowHeight\n\t\t\tassertNever(item)\n\t\t},\n\t\t[subHeaderHeight, defaultRowsHeight],\n\t)\n\n\tconst totalHeightOfHeaders = useMemo(() => {\n\t\treturn headerSlots.reduce((height, item) => height + heightForHeaderSlot(item), 0)\n\t}, [heightForHeaderSlot, headerSlots])\n\n\tconst heightForItemHandler = useCallback(\n\t\t(item: T | SlotType) => {\n\t\t\tif (item === SlotType.TableEmptyState || item === SlotType.PageEmptyState) {\n\t\t\t\tconst emptyStateHeight = virtualListHeight - totalHeightOfHeaders - styles.contentPaddingBottom\n\t\t\t\treturn Math.max(emptyStateHeight, 100)\n\t\t\t}\n\t\t\tif (isHeaderSlot(item)) return heightForHeaderSlot(item)\n\t\t\treturn styles.rowHeight\n\t\t},\n\t\t[totalHeightOfHeaders, virtualListHeight, heightForHeaderSlot],\n\t)\n\n\tconst headerSlotCount = headerSlots.length\n\n\tconst moveItemHandler = useCallback(\n\t\t(from: number, to: number) => {\n\t\t\tif (draggingEnabled) {\n\t\t\t\tmoveItem?.(from - headerSlotCount, to - headerSlotCount)\n\t\t\t}\n\t\t},\n\t\t[moveItem, headerSlotCount, draggingEnabled],\n\t)\n\n\tconst stickyHeaderLevelForItemHandler = useCallback((item: T | SlotType): StickyHeaderLevel => {\n\t\tif (!isHeaderSlot(item)) return \"off\"\n\t\tif (item === SlotType.MainHeader) return \"primary\"\n\t\tif (item === SlotType.SubHeader) return \"secondary\"\n\t\tif (item === SlotType.DefaultRows) return \"off\"\n\t\tassertNever(item)\n\t}, [])\n\n\tconst sortingEnabled = !readOnly && !isSearching && tableEmptyState === \"none\" && !upsell\n\n\tconst draggingEnabledForItemHandler = useCallback(\n\t\t(item: T | SlotType, _: number) => {\n\t\t\treturn draggingEnabled && isNotSlotType(item)\n\t\t},\n\t\t[draggingEnabled],\n\t)\n\n\treturn (\n\t\t<SortableVirtualList\n\t\t\tshowScrollbar\n\t\t\tscrollRef={virtualListRef}\n\t\t\tsortingEnabled={sortingEnabled}\n\t\t\theightForItem={heightForItemHandler}\n\t\t\titems={itemsIncludingSlots}\n\t\t\tkeyForItem={keyForItemHandler}\n\t\t\tmoveItem={moveItemHandler}\n\t\t\tminDropIndex={headerSlotCount}\n\t\t\tdraggingEnabledForItem={draggingEnabledForItemHandler}\n\t\t\tstickyHeaderLevelForItem={stickyHeaderLevelForItemHandler}\n\t\t\tclassName={cx(styles.mainContainer, styles.virtualListContainer)}\n\t\t>\n\t\t\t{({ item, index, isDragPreview, dragHandleRef }) => {\n\t\t\t\tif (item === SlotType.MainHeader) {\n\t\t\t\t\treturn <DomainsPageHeader />\n\t\t\t\t}\n\t\t\t\tif (item === SlotType.SubHeader) {\n\t\t\t\t\treturn <DomainPageSubHeader sortableItemCount={items.length} scrollRef={virtualListRef} />\n\t\t\t\t}\n\t\t\t\tif (item === SlotType.DefaultRows) {\n\t\t\t\t\tassert(defaultRows, \"defaultRows must be provided\")\n\t\t\t\t\treturn defaultRows\n\t\t\t\t}\n\t\t\t\tif (item === SlotType.PageEmptyState) {\n\t\t\t\t\treturn <PageEmptyState type={pageEmptyState} />\n\t\t\t\t}\n\t\t\t\tif (item === SlotType.TableEmptyState) {\n\t\t\t\t\treturn <TableEmptyState type={tableEmptyState} />\n\t\t\t\t}\n\t\t\t\treturn children({ item, index, isDragPreview, sortingEnabled, dragHandleRef })\n\t\t\t}}\n\t\t</SortableVirtualList>\n\t)\n}\n\ntype PageEmptyStateType = \"loading\" | \"no-items\" | \"no-project-member\" | \"upsell\" | \"none\"\n\nfunction PageEmptyState({ type }: { type: PageEmptyStateType }) {\n\tassert(type !== \"none\", \"Big empty state type should not be none\")\n\n\tif (type === \"loading\") return <Spinner />\n\tif (type === \"no-items\") return <DomainPageEmptyStateNoItems />\n\tif (type === \"no-project-member\") return <DomainPageEmptyStateNoProjectMember />\n\tif (type === \"upsell\") return <DomainPageEmptyStateUpsell />\n\n\tassertNever(type)\n}\n\ntype TableEmptyStateType = \"no-search-results\" | \"none\"\n\nfunction TableEmptyState({ type }: { type: TableEmptyStateType }) {\n\tassert(type !== \"none\", \"Empty state type should not be none\")\n\tif (type === \"no-search-results\") return <FrescoEmptyState center {...getNoSearchResultProps()} />\n\tassertNever(type)\n}\n", "import { openNewTab } from \"@framerjs/app-shared\"\nimport { UpsellType } from \"@framerjs/events\"\nimport {\n\tButton,\n\tIconPlus,\n\tReadOnlyContext,\n\tSearchBar,\n\tStack,\n\tTranslatable as T,\n\tUpgradeBadge,\n\tVirtualListShrinkingHeader,\n\tuseReadOnly,\n} from \"@framerjs/fresco\"\nimport { assertNever, getLogger } from \"@framerjs/shared\"\nimport { cx } from \"@linaria/core\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { experiments } from \"app/experiments.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { motion } from \"framer-motion\"\nimport { memo } from \"react\"\nimport { enterpriseUpsellURL } from \"utils/staticURLs.ts\"\nimport { UpsellUIInteraction, record } from \"web/lib/tracker.ts\"\nimport { useDashboardProjectStores } from \"../../DashboardProjectStores.tsx\"\nimport { DomainPageTableHeader } from \"./DomainPageTableHeader.tsx\"\nimport { useSelectedDomainTab } from \"./SelectedDomainTab.tsx\"\nimport { TabHeaderDescription } from \"./TabHeaderDescription.tsx\"\nimport type { DomainTab } from \"./domainTab.ts\"\nimport { getDomainTabTitle } from \"./domainTab.ts\"\nimport * as domainStyles from \"./index.styles.ts\"\nimport { checkHeaderLimitUpsellModal } from \"./validation/ensureHeaderLimits.ts\"\nimport { checkFileLimitUpsellModal } from \"./validation/ensureProxyLimits.ts\"\nimport { checkRewriteLimitUpsellModal } from \"./validation/ensureRewriteLimits.ts\"\n\nconst logger = getLogger(\"DomainPageSubHeader\")\n\nexport function domainTabHasSearch(tab: DomainTab): boolean {\n\treturn tab === \"redirects\"\n}\n\n// Redirects excluded from upsell map as it is rendered in the empty state via the Upgrade Plan button\nconst domainTabUpsellMap = {\n\t\"multi-site\": UpsellType.domainsRewriteEnterpriseUpsell,\n\theaders: UpsellType.domainsHeadersEnterpriseUpsell,\n\tfiles: UpsellType.domainsFilesUpsell,\n}\n\ninterface DomainPageSubHeaderProps {\n\tsortableItemCount: number\n\tscrollRef: React.RefObject<HTMLDivElement>\n}\n\nexport const DomainPageSubHeader = memo(function DomainPageSubHeader({\n\tsortableItemCount,\n\tscrollRef,\n}: DomainPageSubHeaderProps) {\n\tconst selectedTab = useSelectedDomainTab()\n\tconst { projectStore, treeStore, modalStore, searchStore } = useDashboardProjectStores()\n\tconst {\n\t\tisProjectMember,\n\t\tupsellRedirects,\n\t\tupsellRewrites,\n\t\tupsellCustomHeaders,\n\t\tresourceLimits,\n\t\tcanUseExternalRewrites,\n\t\tcanUseCustomHeaders,\n\t\tcanUseRedirects,\n\t\tcanUseWellKnown,\n\t\tcanUseRewrites,\n\t\tisProjectOnEnterprisePlan,\n\t\tlicenseType,\n\t} = projectStore.useState()\n\tconst { isLoadingTree } = treeStore.useState()\n\tconst { redirectsSearchTerm } = searchStore.useState()\n\tconst readOnly = useReadOnly()\n\n\tconst selectedTabHasSearch = domainTabHasSearch(selectedTab)\n\n\tif (selectedTab === \"overview\") return null\n\n\tconst searchEnabled = (sortableItemCount > 0 && isProjectMember) || redirectsSearchTerm !== \"\"\n\n\tconst upsell = {\n\t\t\"multi-site\": experiments.isOn(\"advancedHostingUpsells\") ? !canUseRewrites : upsellRewrites,\n\t\theaders: experiments.isOn(\"advancedHostingUpsells\") ? canUseCustomHeaders !== \"on\" : upsellCustomHeaders,\n\t\tredirects: experiments.isOn(\"advancedHostingUpsells\") ? canUseRedirects !== \"on\" : upsellRedirects, // Upsell for redirects is rendered in the empty state\n\t\tfiles: experiments.isOn(\"advancedHostingUpsells\") ? canUseWellKnown !== \"on\" : false,\n\t}[selectedTab]\n\n\tconst handleAdd = () => {\n\t\tif (!experiments.isOn(\"advancedHostingUpsells\") && upsell) {\n\t\t\thandleUpgrade()\n\t\t\treturn\n\t\t}\n\n\t\tswitch (selectedTab) {\n\t\t\tcase \"redirects\":\n\t\t\t\tmodalStore.show({ type: ModalType.DashboardAddRedirect })\n\t\t\t\tbreak\n\t\t\tcase \"multi-site\":\n\t\t\t\tif (experiments.isOn(\"advancedHostingUpsells\")) {\n\t\t\t\t\tconst checkRewriteLimitResult = checkRewriteLimitUpsellModal({\n\t\t\t\t\t\ttree: treeStore.tree,\n\t\t\t\t\t\tresourceLimits,\n\t\t\t\t\t\tprojectId: projectStore.projectId,\n\t\t\t\t\t\tcanUseExternalRewrites,\n\t\t\t\t\t\tmodalStore,\n\t\t\t\t\t\tcanUseRewrites,\n\t\t\t\t\t\tprojectStore,\n\t\t\t\t\t\tisProjectOnEnterprisePlan,\n\t\t\t\t\t})\n\t\t\t\t\tif (checkRewriteLimitResult) return\n\t\t\t\t}\n\t\t\t\tmodalStore.show({ type: ModalType.DashboardAddRewrite, action: \"add\" })\n\t\t\t\tbreak\n\t\t\tcase \"headers\":\n\t\t\t\tif (experiments.isOn(\"advancedHostingUpsells\")) {\n\t\t\t\t\tconst checkHeaderLimitResult = checkHeaderLimitUpsellModal({\n\t\t\t\t\t\tprojectId: projectStore.projectId,\n\t\t\t\t\t\tmodalStore,\n\t\t\t\t\t\tcanUseCustomHeaders,\n\t\t\t\t\t\tlicenseType,\n\t\t\t\t\t\tonAddOnUpsellSuccess: () => {\n\t\t\t\t\t\t\tprojectStore.loadProjectData().catch(error => {\n\t\t\t\t\t\t\t\tlogger.error(\"Failed to reload project data:\", error)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (checkHeaderLimitResult) return\n\t\t\t\t}\n\t\t\t\tmodalStore.show({ type: ModalType.DashboardAddHeader, action: \"add\" })\n\t\t\t\tbreak\n\t\t\tcase \"files\":\n\t\t\t\tif (experiments.isOn(\"advancedHostingUpsells\")) {\n\t\t\t\t\tconst checkFileLimitResult = checkFileLimitUpsellModal({\n\t\t\t\t\t\ttree: treeStore.tree,\n\t\t\t\t\t\tmodalStore,\n\t\t\t\t\t\tprojectId: projectStore.projectId,\n\t\t\t\t\t\tresourceLimits,\n\t\t\t\t\t\tlicenseType,\n\t\t\t\t\t\tonAddOnUpsellSuccess: async () => {\n\t\t\t\t\t\t\tawait projectStore.loadProjectData().catch(error => {\n\t\t\t\t\t\t\t\tlogger.error(\"Failed to reload project data:\", error)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (checkFileLimitResult) return\n\t\t\t\t}\n\t\t\t\tmodalStore.show({ type: ModalType.DashboardAddFile, action: \"add\" })\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tassertNever(selectedTab)\n\t\t}\n\t}\n\n\tconst handleUpgrade = () => {\n\t\t// Upsell for redirects is rendered in the empty state via the Upgrade Plan button\n\t\tif (selectedTab === \"redirects\") return\n\n\t\tconst upsellType = domainTabUpsellMap[selectedTab]\n\t\tif (experiments.isOn(\"advancedHostingUpsells\")) {\n\t\t\tswitch (selectedTab) {\n\t\t\t\tcase \"multi-site\":\n\t\t\t\t\trecord(\"ui_impression\", { page: upsellType })\n\t\t\t\t\tcheckRewriteLimitUpsellModal({\n\t\t\t\t\t\tprojectId: projectStore.projectId,\n\t\t\t\t\t\tmodalStore,\n\t\t\t\t\t\tcanUseRewrites,\n\t\t\t\t\t\tcanUseExternalRewrites,\n\t\t\t\t\t\tprojectStore,\n\t\t\t\t\t\tisProjectOnEnterprisePlan,\n\t\t\t\t\t\ttree: treeStore.tree,\n\t\t\t\t\t\tresourceLimits,\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"headers\":\n\t\t\t\t\trecord(\"ui_impression\", { page: upsellType })\n\t\t\t\t\tcheckHeaderLimitUpsellModal({\n\t\t\t\t\t\tprojectId: projectStore.projectId,\n\t\t\t\t\t\tmodalStore,\n\t\t\t\t\t\tcanUseCustomHeaders,\n\t\t\t\t\t\tlicenseType,\n\t\t\t\t\t\tonAddOnUpsellSuccess: () => {\n\t\t\t\t\t\t\tprojectStore.loadProjectData().catch(error => {\n\t\t\t\t\t\t\t\tlogger.error(\"Failed to reload project data:\", error)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"files\":\n\t\t\t\t\trecord(\"ui_impression\", { page: upsellType })\n\t\t\t\t\tcheckFileLimitUpsellModal({\n\t\t\t\t\t\ttree: treeStore.tree,\n\t\t\t\t\t\tmodalStore,\n\t\t\t\t\t\tprojectId: projectStore.projectId,\n\t\t\t\t\t\tresourceLimits,\n\t\t\t\t\t\tlicenseType,\n\t\t\t\t\t\tonAddOnUpsellSuccess: async () => {\n\t\t\t\t\t\t\tawait projectStore.loadProjectData().catch(error => {\n\t\t\t\t\t\t\t\tlogger.error(\"Failed to reload project data:\", error)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tswitch (selectedTab) {\n\t\t\tcase \"multi-site\":\n\t\t\tcase \"headers\":\n\t\t\t\trecord(\"ui_impression\", { page: upsellType })\n\t\t\t\tmodalStore.show({\n\t\t\t\t\ttype: ModalType.Confirmation,\n\t\t\t\t\tvariant: \"primary\",\n\t\t\t\t\ttitle: getDomainTabTitle(selectedTab),\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Upgrade your site to an Enterprise plan to host multiple sites under the same domain and add custom HTTP headers.\",\n\t\t\t\t\tconfirmLabel: Dictionary.ContactUs,\n\t\t\t\t\tcancelLabel: Dictionary.MaybeLater,\n\t\t\t\t\tonConfirm: () => {\n\t\t\t\t\t\trecord(\"ui_interaction\", {\n\t\t\t\t\t\t\tpage: upsellType,\n\t\t\t\t\t\t\tid: UpsellUIInteraction.contactUs,\n\t\t\t\t\t\t})\n\t\t\t\t\t\topenNewTab(enterpriseUpsellURL)\n\t\t\t\t\t\tmodalStore.dismiss()\n\t\t\t\t\t},\n\t\t\t\t\tonCancel: () => {\n\t\t\t\t\t\trecord(\"ui_interaction\", {\n\t\t\t\t\t\t\tpage: upsellType,\n\t\t\t\t\t\t\tid: UpsellUIInteraction.cancelUpsell,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tmodalStore.dismiss()\n\t\t\t\t\t},\n\t\t\t\t\tonDismiss: modalStore.dismiss,\n\t\t\t\t})\n\n\t\t\t\tbreak\n\t\t\tcase \"files\":\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tassertNever(selectedTab)\n\t\t}\n\t}\n\n\treturn (\n\t\t<VirtualListShrinkingHeader minHeight={domainStyles.rowHeight} scrollRef={scrollRef}>\n\t\t\t{({ heightReductionTransform }) => (\n\t\t\t\t<motion.div className={domainStyles.subheaderContainer} style={{ transform: heightReductionTransform }}>\n\t\t\t\t\t<div className={domainStyles.virtualizedListItem}>\n\t\t\t\t\t\t<Stack\n\t\t\t\t\t\t\tclassName={cx(\n\t\t\t\t\t\t\t\tdomainStyles.maxWidthContainer,\n\t\t\t\t\t\t\t\tdomainStyles.subheader,\n\t\t\t\t\t\t\t\tselectedTabHasSearch && domainStyles.subheaderWithSearch,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tjustifyContent=\"space-between\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Stack direction=\"row\" alignItems=\"center\" justifyContent=\"space-between\">\n\t\t\t\t\t\t\t\t<Stack direction=\"column\">\n\t\t\t\t\t\t\t\t\t<Stack direction=\"row\" alignItems=\"center\">\n\t\t\t\t\t\t\t\t\t\t<T className={domainStyles.infoTitle}>{getDomainTabTitle(selectedTab)}</T>\n\t\t\t\t\t\t\t\t\t\t<div style={{ position: \"relative\", bottom: \"1px\" }}>\n\t\t\t\t\t\t\t\t\t\t\t{upsell ? <UpgradeBadge onMouseDown={handleUpgrade} /> : null}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</Stack>\n\n\t\t\t\t\t\t\t\t\t<TabHeaderDescription />\n\t\t\t\t\t\t\t\t</Stack>\n\n\t\t\t\t\t\t\t\t{!isLoadingTree && (\n\t\t\t\t\t\t\t\t\t<Stack direction=\"row\" className={domainStyles.headingsSectionButtonContainer}>\n\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\tonClick={handleAdd}\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"clean\"\n\t\t\t\t\t\t\t\t\t\t\tenabled={!readOnly}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cx(domainStyles.tableAddButton, domainStyles.increaseHitTarget)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<IconPlus />\n\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Stack>\n\n\t\t\t\t\t\t\t{selectedTabHasSearch && (\n\t\t\t\t\t\t\t\t// Make sure the search bar is enabled when you don't have edit\n\t\t\t\t\t\t\t\t// permissions. This overrides the context set in DomainsPage.tsx.\n\t\t\t\t\t\t\t\t<ReadOnlyContext.Provider value={false}>\n\t\t\t\t\t\t\t\t\t<SearchBar\n\t\t\t\t\t\t\t\t\t\tisIconVisible\n\t\t\t\t\t\t\t\t\t\ticonPosition=\"left\"\n\t\t\t\t\t\t\t\t\t\tid=\"domainFilterInput\"\n\t\t\t\t\t\t\t\t\t\tonChange={searchStore.setRedirectsSearchTerm}\n\t\t\t\t\t\t\t\t\t\tvalue={redirectsSearchTerm}\n\t\t\t\t\t\t\t\t\t\tenabled={searchEnabled}\n\t\t\t\t\t\t\t\t\t\tplaceholder={Dictionary.SearchEllipsis}\n\t\t\t\t\t\t\t\t\t\tclassName={domainStyles.filterInput}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</ReadOnlyContext.Provider>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</div>\n\t\t\t\t\t<DomainPageTableHeader />\n\t\t\t\t</motion.div>\n\t\t\t)}\n\t\t</VirtualListShrinkingHeader>\n\t)\n})\n", "import {\n\tCenterChild,\n\tContextMenuButton,\n\tIconReorderHandle,\n\tSpacer,\n\tStack,\n\tTranslatable as T,\n\ttruncateWithEllipsis,\n\tuseReadOnly,\n} from \"@framerjs/fresco\"\nimport { Events } from \"@framerjs/fresco/layout-transitions\"\nimport { dimensions } from \"@framerjs/fresco/tokens\"\nimport { cx } from \"@linaria/core\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { MenuItemOptions } from \"app/menu.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { Children, type PropsWithChildren, memo, useCallback, useState } from \"react\"\nimport { useUnmountSignal } from \"utils/useUnmountSignal.ts\"\nimport { useContextMenu } from \"web/lib/useContextMenu.ts\"\nimport * as styles from \"./DomainPageRow.styles.ts\"\nimport * as domainStyles from \"./index.styles.ts\"\n\ninterface DomainPageRowProps extends PropsWithChildren {\n\ticon?: React.ReactNode\n\tcontextMenu?: React.ReactNode\n\tinfoIcon?: React.ReactNode\n\trowRef?: React.RefObject<HTMLDivElement>\n\tonMouseDown?: (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void\n\tonContextMenu?: (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void\n\tonDoubleClick?: (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void\n\trowClassName?: string\n}\n\nexport function DomainPageRow({\n\trowRef,\n\tonMouseDown,\n\tonContextMenu,\n\tonDoubleClick,\n\ticon: iconSlot,\n\tcontextMenu,\n\tinfoIcon,\n\tchildren,\n\trowClassName,\n}: DomainPageRowProps) {\n\tconst columnCount = Children.count(children)\n\tconst hasIconSlot = !!iconSlot\n\n\treturn (\n\t\t<div className={domainStyles.virtualizedListItem}>\n\t\t\t{/* biome-ignore lint/nursery/noStaticElementInteractions: Wrapping div is needed to capture whole row clicks. */}\n\t\t\t<div\n\t\t\t\tref={rowRef}\n\t\t\t\tonMouseDown={onMouseDown}\n\t\t\t\tonContextMenu={onContextMenu}\n\t\t\t\tonDoubleClick={onDoubleClick}\n\t\t\t\tstyle={{ [styles.columnCountVariable]: columnCount }}\n\t\t\t\tclassName={cx(\n\t\t\t\t\trowClassName,\n\t\t\t\t\tdomainStyles.maxWidthContainer,\n\t\t\t\t\tdomainStyles.collapsingHorizontalBorders,\n\t\t\t\t\tstyles.rowGrid,\n\t\t\t\t\t!hasIconSlot && styles.rowGridWithoutIconSlot,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{hasIconSlot && <CenterChild className={styles.iconWrapper}>{iconSlot}</CenterChild>}\n\t\t\t\t{children}\n\t\t\t\t<Stack direction=\"row\" alignItems=\"center\" style={{ width: \"fit-content\", marginLeft: \"auto\" }}>\n\t\t\t\t\t{infoIcon}\n\t\t\t\t\t{contextMenu}\n\t\t\t\t</Stack>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\ninterface SortableDomainPageRowProps extends PropsWithChildren {\n\tid: NodeID\n\tsortingEnabled: boolean\n\tonEdit: (id: NodeID) => void\n\tonDelete: (id: NodeID) => void\n\tonToggleExpandToAllLocales: (id: NodeID) => void\n\tupsell?: boolean\n\tcanExpandToAllLocales: boolean\n\thasLocales: boolean\n\tisExpandedToAllLocales: boolean\n\tdragHandleRef: React.RefObject<HTMLDivElement> | undefined\n\tinfoIcon?: React.ReactNode\n}\n\nexport const SortableDomainPageRow = memo(function SortableDomainPageRow({\n\tid,\n\tchildren,\n\tdragHandleRef,\n\tsortingEnabled,\n\tonEdit,\n\tonDelete,\n\tonToggleExpandToAllLocales,\n\thasLocales,\n\tcanExpandToAllLocales,\n\tisExpandedToAllLocales,\n\tupsell = false,\n\tinfoIcon,\n}: SortableDomainPageRowProps) {\n\tconst [isGrabbing, setIsGrabbing] = useState(false)\n\tconst unmountSignal = useUnmountSignal()\n\n\tconst showGrabbingCursor = (event: React.MouseEvent<SVGSVGElement, MouseEvent>) => {\n\t\tif (!sortingEnabled) return\n\t\tif (!Events.isLeftMouseButton(event)) return\n\n\t\tsetIsGrabbing(true)\n\n\t\tdocument.addEventListener(\"mouseup\", () => setIsGrabbing(false), {\n\t\t\tonce: true,\n\t\t\tsignal: unmountSignal,\n\t\t})\n\t}\n\n\treturn (\n\t\t<DomainPageRowWithContextMenu\n\t\t\tid={id}\n\t\t\trowRef={dragHandleRef}\n\t\t\ticon={\n\t\t\t\t<IconReorderHandle\n\t\t\t\t\tclassName={cx(\n\t\t\t\t\t\tstyles.reorderHandle,\n\t\t\t\t\t\t!sortingEnabled && styles.reorderHandleDisabled,\n\t\t\t\t\t\tisGrabbing && styles.reorderHandleGrabbing,\n\t\t\t\t\t)}\n\t\t\t\t\tonMouseDown={showGrabbingCursor}\n\t\t\t\t/>\n\t\t\t}\n\t\t\tinfoIcon={infoIcon}\n\t\t\tupsell={upsell}\n\t\t\tcanExpandToAllLocales={canExpandToAllLocales}\n\t\t\thasLocales={hasLocales}\n\t\t\tisExpandedToAllLocales={isExpandedToAllLocales}\n\t\t\tonEdit={onEdit}\n\t\t\tonDelete={onDelete}\n\t\t\tonToggleExpandToAllLocales={onToggleExpandToAllLocales}\n\t\t>\n\t\t\t{children}\n\t\t</DomainPageRowWithContextMenu>\n\t)\n})\n\ninterface DomainPageRowLabelProps {\n\tchildren?: string | undefined\n\ticon?: React.ReactNode\n\tsubLabel?: string | undefined\n\twithSubLabelGap?: boolean\n}\n\nexport const DomainPageRowLabel = memo(function DomainPageRowLabel({\n\tchildren,\n\ticon,\n\tsubLabel,\n\twithSubLabelGap = true,\n}: DomainPageRowLabelProps) {\n\tconst [showTooltip, setShowTooltip] = useState(false)\n\n\tconst handleMouseEnter = useCallback((event: React.MouseEvent<HTMLSpanElement>) => {\n\t\t// Check if the text of any child spans is overflowing, if so we enable the tooltip so the\n\t\t// text can still be read.\n\t\tfor (const child of event.currentTarget.childNodes) {\n\t\t\tif (child instanceof HTMLSpanElement) {\n\t\t\t\tconst childIsOverflowing = child.offsetWidth < child.scrollWidth\n\t\t\t\tif (!childIsOverflowing) continue\n\n\t\t\t\tsetShowTooltip(true)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}, [])\n\n\tlet tooltip: string | undefined\n\tif (showTooltip && children) {\n\t\ttooltip = children\n\t\tif (subLabel) {\n\t\t\tconst separator = withSubLabelGap ? \" \" : \"\"\n\t\t\ttooltip += separator + subLabel\n\t\t}\n\t}\n\n\treturn (\n\t\t<Stack gap={0} direction=\"row\" title={tooltip} onMouseEnter={handleMouseEnter}>\n\t\t\t{!!icon && (\n\t\t\t\t<>\n\t\t\t\t\t<CenterChild className={styles.iconWrapper}>{icon}</CenterChild>\n\t\t\t\t\t<Spacer size={dimensions.css.inputSpacing} />\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t<span\n\t\t\t\t// We use overflow hidden to be able to know if the text is overflowing\n\t\t\t\tclassName={cx(truncateWithEllipsis, styles.overflowHidden, styles.label)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</span>\n\t\t\t{subLabel && (\n\t\t\t\t<>\n\t\t\t\t\t{withSubLabelGap && <Spacer size={5} />}\n\t\t\t\t\t<span className={cx(truncateWithEllipsis, styles.overflowHidden, styles.subLabel)}>{subLabel}</span>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</Stack>\n\t)\n})\n\ninterface GetContextMenuOptionsProps extends Required<\n\tPick<\n\t\tSortableDomainPageRowProps,\n\t\t| \"id\"\n\t\t| \"upsell\"\n\t\t| \"canExpandToAllLocales\"\n\t\t| \"isExpandedToAllLocales\"\n\t\t| \"hasLocales\"\n\t\t| \"onToggleExpandToAllLocales\"\n\t\t| \"onEdit\"\n\t\t| \"onDelete\"\n\t>\n> {\n\treadOnly: boolean\n\tonCopyLink?: (id: NodeID) => void\n}\n\nfunction getContextMenuOptions({\n\tid,\n\tupsell,\n\treadOnly,\n\tcanExpandToAllLocales,\n\tisExpandedToAllLocales,\n\thasLocales,\n\tonEdit,\n\tonDelete,\n\tonToggleExpandToAllLocales,\n\tonCopyLink,\n}: GetContextMenuOptionsProps): readonly MenuItemOptions[] {\n\tconst canEdit = !readOnly && !upsell\n\treturn [\n\t\t{\n\t\t\tlabel: \"Expand to All Locales\",\n\t\t\tenabled: canExpandToAllLocales && canEdit,\n\t\t\tchecked: isExpandedToAllLocales,\n\t\t\tvisible: hasLocales,\n\t\t\tclick: () => onToggleExpandToAllLocales(id),\n\t\t},\n\t\t{\n\t\t\ttype: \"separator\",\n\t\t},\n\t\t{\n\t\t\tlabel: Dictionary.Edit,\n\t\t\tenabled: canEdit,\n\t\t\tclick: () => onEdit(id),\n\t\t},\n\t\t{\n\t\t\tlabel: \"Copy Link\",\n\t\t\tenabled: !!onCopyLink,\n\t\t\tvisible: !!onCopyLink,\n\t\t\tclick: () => onCopyLink?.(id),\n\t\t},\n\t\t{\n\t\t\tlabel: Dictionary.Remove,\n\t\t\tenabled: canEdit,\n\t\t\tclick: () => onDelete(id),\n\t\t},\n\t]\n}\n\nexport function DomainPageRowHeaderTitle({ children }: { children: string }) {\n\treturn <T>{children}</T>\n}\n\nexport const DomainPageRowHeader = memo(function DomainPageRowHeader({ children }: PropsWithChildren) {\n\tconst columnCount = Children.count(children)\n\treturn (\n\t\t<div className={domainStyles.virtualizedListItem}>\n\t\t\t<div\n\t\t\t\tstyle={{ [styles.columnCountVariable]: columnCount }}\n\t\t\t\tclassName={cx(\n\t\t\t\t\tdomainStyles.maxWidthContainer,\n\t\t\t\t\tdomainStyles.collapsingHorizontalBorders,\n\t\t\t\t\tstyles.rowGrid,\n\t\t\t\t\tstyles.tableHeadings,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</div>\n\t)\n})\n\ninterface DomainPageRowWithContextMenuProps extends PropsWithChildren {\n\tid: NodeID\n\tupsell: boolean\n\tcanExpandToAllLocales: boolean\n\thasLocales: boolean\n\tisExpandedToAllLocales: boolean\n\tonEdit: (id: NodeID) => void\n\tonDelete: (id: NodeID) => void\n\tonToggleExpandToAllLocales: (id: NodeID) => void\n\tonCopyLink?: (id: NodeID) => void\n\ticon?: React.ReactNode\n\tinfoIcon?: React.ReactNode\n\trowRef?: React.RefObject<HTMLDivElement>\n}\n\nexport function DomainPageRowWithContextMenu({\n\tid,\n\tupsell,\n\tcanExpandToAllLocales,\n\thasLocales,\n\tisExpandedToAllLocales,\n\tonEdit,\n\tonDelete,\n\tonToggleExpandToAllLocales,\n\tonCopyLink,\n\tchildren,\n\trowRef,\n\ticon,\n\tinfoIcon,\n}: DomainPageRowWithContextMenuProps) {\n\tconst [isMenuVisible, setIsMenuVisible] = useState(false)\n\tconst contextMenu = useContextMenu()\n\tconst readOnly = useReadOnly()\n\n\tfunction openContextMenu(x: number, y: number) {\n\t\tconst items = getContextMenuOptions({\n\t\t\tid,\n\t\t\tupsell,\n\t\t\treadOnly,\n\t\t\tcanExpandToAllLocales,\n\t\t\tisExpandedToAllLocales,\n\t\t\thasLocales,\n\t\t\tonEdit,\n\t\t\tonDelete,\n\t\t\tonToggleExpandToAllLocales,\n\t\t\tonCopyLink,\n\t\t})\n\n\t\tsetIsMenuVisible(true)\n\t\tcontextMenu.show(items, {\n\t\t\tlocation: { x, y },\n\t\t\tonDone: () => setIsMenuVisible(false),\n\t\t})\n\t}\n\n\tfunction handleContextButtonClick(event: React.MouseEvent<HTMLButtonElement>) {\n\t\tconst buttonElement = event.currentTarget\n\t\tconst bounds = buttonElement.getBoundingClientRect()\n\t\topenContextMenu(bounds.x, bounds.bottom + 5)\n\t}\n\n\tfunction handleContextMenu(event: React.MouseEvent<HTMLDivElement, MouseEvent>) {\n\t\tevent.preventDefault()\n\t\topenContextMenu(event.clientX, event.clientY)\n\t}\n\n\tfunction handleDoubleClick() {\n\t\tif (readOnly || upsell) {\n\t\t\treturn\n\t\t}\n\n\t\tonEdit(id)\n\t}\n\n\treturn (\n\t\t<DomainPageRow\n\t\t\trowRef={rowRef}\n\t\t\tonContextMenu={handleContextMenu}\n\t\t\tonDoubleClick={handleDoubleClick}\n\t\t\tcontextMenu={\n\t\t\t\t<ContextMenuButton\n\t\t\t\t\tonMouseDown={handleContextButtonClick}\n\t\t\t\t\tclassName={cx(styles.contextMenuButton, isMenuVisible && styles.contextMenuVisible)}\n\t\t\t\t/>\n\t\t\t}\n\t\t\ticon={icon}\n\t\t\tinfoIcon={infoIcon}\n\t\t>\n\t\t\t{children}\n\t\t</DomainPageRow>\n\t)\n}\n", "import { useEffect } from \"react\"\nimport { useConstant } from \"./useConstant.ts\"\n\n/**\n * Returns an AbortSignal that is aborted when the component unmounts.\n *\n * This is useful for cleaning up resources when the component unmounts, for example when a timeout\n * is set and the component unmounts before the timeout completes.\n *\n * @returns An AbortSignal that is aborted when the component unmounts.\n */\nexport function useUnmountSignal(): AbortSignal {\n\tconst abortController = useConstant(() => new AbortController())\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tabortController.abort()\n\t\t}\n\t}, [])\n\n\treturn abortController.signal\n}\n", "import \"DomainPageRow.styles_n40usu.wyw.css\"; export const columnCountVariable = \"--column-count\";\nexport const contextMenuButton = \"contextMenuButton_chdbaq4\";\nexport const contextMenuVisible = \"contextMenuVisible_c1qfbu4q\";\nexport const rowGrid = \"rowGrid_r1u68kif\";\nexport const rowGridWithoutIconSlot = \"rowGridWithoutIconSlot_rr2egu0\";\nexport const tableHeadings = \"tableHeadings_tchcjts\";\nexport const overflowHidden = \"overflowHidden_o13edo4t\";\nexport const label = \"label_l1vooay1\";\nexport const subLabel = \"subLabel_sk43o1m\";\nexport const iconWrapper = \"iconWrapper_iadeqt8\";\nexport const noGrab = \"noGrab_ny5rp6y\";\nexport const reorderHandle = \"reorderHandle_r4cjnqx\";\nexport const reorderHandleDisabled = \"reorderHandleDisabled_r1ynq3bo\";\nexport const reorderHandleGrabbing = \"reorderHandleGrabbing_r1dwxtjx\";", "import { assertNever } from \"@framerjs/shared\"\nimport { DomainPageRowHeader, DomainPageRowHeaderTitle } from \"./DomainPageRow.tsx\"\nimport { useSelectedDomainTab } from \"./SelectedDomainTab.tsx\"\n\nexport function DomainPageTableHeader() {\n\tconst selectedTab = useSelectedDomainTab()\n\tif (selectedTab === \"overview\") return null\n\n\tswitch (selectedTab) {\n\t\tcase \"multi-site\":\n\t\t\treturn (\n\t\t\t\t<DomainPageRowHeader>\n\t\t\t\t\t<DomainPageRowHeaderTitle>Path</DomainPageRowHeaderTitle>\n\t\t\t\t\t<DomainPageRowHeaderTitle>Target</DomainPageRowHeaderTitle>\n\t\t\t\t</DomainPageRowHeader>\n\t\t\t)\n\t\tcase \"headers\":\n\t\t\treturn (\n\t\t\t\t<DomainPageRowHeader>\n\t\t\t\t\t<DomainPageRowHeaderTitle>Path</DomainPageRowHeaderTitle>\n\t\t\t\t\t<DomainPageRowHeaderTitle>Name</DomainPageRowHeaderTitle>\n\t\t\t\t\t<DomainPageRowHeaderTitle>Value</DomainPageRowHeaderTitle>\n\t\t\t\t</DomainPageRowHeader>\n\t\t\t)\n\t\tcase \"redirects\":\n\t\t\treturn (\n\t\t\t\t<DomainPageRowHeader>\n\t\t\t\t\t<DomainPageRowHeaderTitle>From</DomainPageRowHeaderTitle>\n\t\t\t\t\t<DomainPageRowHeaderTitle>To</DomainPageRowHeaderTitle>\n\t\t\t\t</DomainPageRowHeader>\n\t\t\t)\n\t\tcase \"files\":\n\t\t\treturn (\n\t\t\t\t<DomainPageRowHeader>\n\t\t\t\t\t<DomainPageRowHeaderTitle>File</DomainPageRowHeaderTitle>\n\t\t\t\t\t<DomainPageRowHeaderTitle>Path</DomainPageRowHeaderTitle>\n\t\t\t\t</DomainPageRowHeader>\n\t\t\t)\n\t\tdefault:\n\t\t\tassertNever(selectedTab)\n\t}\n}\n", "import { domainsDashboardPath } from \"@framerjs/app-shared\"\nimport { Button, Placeholder, Stack, Translatable as T, emoji } from \"@framerjs/fresco\"\nimport { cx } from \"@linaria/core\"\nimport { experiments } from \"app/experiments.ts\"\nimport { memo } from \"react\"\nimport { Link } from \"react-router-dom\"\nimport { Pages, UIInteraction, record } from \"web/lib/tracker.ts\"\nimport { useDashboardProjectStores } from \"../../DashboardProjectStores.tsx\"\nimport { useSelectedDomainTab } from \"./SelectedDomainTab.tsx\"\nimport type { DomainTab } from \"./domainTab.ts\"\nimport { allDomainTabs, getDomainTabTitle } from \"./domainTab.ts\"\nimport * as styles from \"./index.styles.ts\"\n\ntype DomainTabWithoutOverview = Exclude<DomainTab, \"overview\">\nconst domainTabInteractionMap: Record<DomainTabWithoutOverview, UIInteraction> = {\n\t\"multi-site\": UIInteraction.selectDomainMultiSiteTab,\n\theaders: UIInteraction.selectDomainHeadersTab,\n\tredirects: UIInteraction.selectDomainRedirectsTab,\n\tfiles: UIInteraction.selectDomainFilesTab,\n}\n\nexport function DomainsPageHeader() {\n\tconst { projectStore } = useDashboardProjectStores()\n\tconst { projectDataStatus, projectTitle, customDomain } = projectStore.useState()\n\tconst selectedTab = useSelectedDomainTab()\n\n\tconst canUseStaticFileHosting = experiments.isOn(\"canUseStaticFileHosting\")\n\tconst availableTabs = canUseStaticFileHosting ? allDomainTabs : allDomainTabs.filter(tab => tab !== \"files\")\n\n\tconst [, projectTitleWithoutEmoji] = emoji.extract(projectTitle)\n\n\treturn (\n\t\t<div className={cx(styles.virtualizedListItem, styles.stickyHeader)}>\n\t\t\t<Stack\n\t\t\t\tdirection=\"column\"\n\t\t\t\tjustifyContent=\"end\"\n\t\t\t\tgap={0}\n\t\t\t\tclassName={cx(styles.maxWidthContainer, styles.domainHeader)}\n\t\t\t>\n\t\t\t\t<Stack direction=\"row\" alignItems=\"center\" justifyContent=\"space-between\">\n\t\t\t\t\t<Stack gap={8}>\n\t\t\t\t\t\t{projectDataStatus === \"loading\" ? (\n\t\t\t\t\t\t\t<DomainHeaderPlaceholder height={28} width={120} />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<h1 className={styles.title}>{projectTitleWithoutEmoji}</h1>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!customDomain ? (\n\t\t\t\t\t\t\t<DomainHeaderPlaceholder height={19.5} width={200} />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<a href={`https://${customDomain}`} className={styles.domainSubheading}>\n\t\t\t\t\t\t\t\t{customDomain}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t\t<Button bold title=\"Open Project\" variant=\"primary\" onClick={projectStore.openProject} />\n\t\t\t\t</Stack>\n\t\t\t\t<Stack direction=\"row\" className={cx(styles.tabs)}>\n\t\t\t\t\t{availableTabs.map(tab => (\n\t\t\t\t\t\t<DomainTabLink key={tab} tab={tab} projectId={projectStore.projectId} isSelected={selectedTab === tab} />\n\t\t\t\t\t))}\n\t\t\t\t</Stack>\n\t\t\t</Stack>\n\t\t</div>\n\t)\n}\n\nfunction DomainTabLink({ projectId, tab, isSelected }: { projectId: string; tab: DomainTab; isSelected: boolean }) {\n\tconst handleClick = () => {\n\t\tif (isSelected || tab === \"overview\") return\n\t\trecord(\"ui_interaction\", {\n\t\t\tpage: Pages.domains,\n\t\t\tid: domainTabInteractionMap[tab],\n\t\t})\n\t}\n\n\treturn (\n\t\t<Link to={`${domainsDashboardPath}/${projectId}?tab=${tab}`} tabIndex={0} draggable={false} onClick={handleClick}>\n\t\t\t<Stack direction=\"row\" alignItems=\"center\" className={cx(styles.domainTab, isSelected && styles.domainTabActive)}>\n\t\t\t\t<T>{getDomainTabTitle(tab)}</T>\n\t\t\t</Stack>\n\t\t</Link>\n\t)\n}\n\nconst DomainHeaderPlaceholder = memo(function DomainHeaderPlaceholder({\n\twidth,\n\theight,\n\tclassName,\n}: {\n\twidth: number\n\theight: number\n\tclassName?: string\n}) {\n\tconst skeletonHeight = 12\n\tconst skeletonY = (height - skeletonHeight) / 2\n\treturn (\n\t\t<Placeholder height={height} width={width} className={className} effect=\"none\">\n\t\t\t<rect x={0} y={skeletonY} width={width} height={skeletonHeight} rx={6} />\n\t\t</Placeholder>\n\t)\n})\n", "import { IconPage, T } from \"@framerjs/fresco\"\nimport { colors } from \"@framerjs/fresco/tokens\"\nimport { assert, emptyArray, unhandledError } from \"@framerjs/shared\"\nimport { noop } from \"@framerjs/shared/src/noop.ts\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { experiments } from \"app/experiments.ts\"\nimport { filename } from \"code-editor/utils.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/nodes/NodeID.ts\"\nimport type { ProxyRouteNode } from \"document/models/CanvasTree/nodes/ProxyRouteNode.ts\"\nimport { RoutesNode } from \"document/models/CanvasTree/nodes/RoutesNode.ts\"\nimport { deleteProxies } from \"document/models/CanvasTree/nodes/utils/routesNode.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport React, { useCallback, useMemo } from \"react\"\nimport { copyText } from \"utils/clipboard/index.ts\"\nimport { getId } from \"utils/getId.ts\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport { useDashboardProjectStores } from \"web/pages/projects/DashboardProjectStores.tsx\"\nimport { DomainPageLayoutVirtualized } from \"../DomainPageLayoutVirtualized.tsx\"\nimport { DomainPageRowLabel, DomainPageRowWithContextMenu } from \"../DomainPageRow.tsx\"\nimport { getPathForDisplay } from \"../validation/validateRouteNode.ts\"\n\nexport const Files = React.memo(function Files() {\n\tconst { treeStore, projectStore, modalStore } = useDashboardProjectStores()\n\tconst { tree, isLoadingTree } = treeStore.useState()\n\n\tconst { canUseAdvancedHosting, customDomain, canUseWellKnown } = projectStore.useState()\n\n\tconst canonicalUrl = useMemo(() => {\n\t\tif (isLoadingTree) return undefined\n\n\t\t// Tree has loaded, so we should be able to get the canonical URL if it exists\n\t\t// If webMetadata is empty, there's no canonical URL\n\t\tconst webMetadata = tree?.root?.webMetadata\n\t\tif (!webMetadata) return undefined\n\n\t\tconst hasCustomCanonicalURL = webMetadata.canonicalURL === \"custom\" || webMetadata.canonicalURL === \"rewrite\"\n\t\tif (!hasCustomCanonicalURL) return undefined\n\t\tif (!webMetadata.customCanonicalURL && !webMetadata.rewriteCanonicalHostname) return undefined\n\n\t\treturn webMetadata.canonicalURL === \"custom\"\n\t\t\t? webMetadata.customCanonicalURL\n\t\t\t: `https://${webMetadata.rewriteCanonicalHostname}${webMetadata.rewriteCanonicalPath ?? \"\"}`\n\t}, [isLoadingTree, tree])\n\n\t// Will contain the canonical URL.\n\t// If a custom canonical URL is not set, it will fall back to the custom domain.\n\t// It will *not* fall back to the default domain\n\t// because we don't show this page for projects with no custom domain.\n\tconst canonicalUrlWithFallback = canonicalUrl ?? `https://${customDomain}`\n\n\tconst routesNode = RoutesNode.get(tree)\n\n\tconst proxyRouteNodes = useMemo(\n\t\t() => routesNode?.loaded?.getProxyRoutes() || emptyArray<ProxyRouteNode>(),\n\t\t[routesNode],\n\t)\n\n\tconst handleEditFile = useCallback(\n\t\t(nodeId: NodeID) => {\n\t\t\tmodalStore.show({\n\t\t\t\ttype: ModalType.DashboardEditFile,\n\t\t\t\taction: \"edit\",\n\t\t\t\tnodeId,\n\t\t\t})\n\t\t},\n\t\t[modalStore],\n\t)\n\n\tconst handleDeleteFile = useCallback(\n\t\t(nodeId: NodeID) => {\n\t\t\tconst proxyRouteNode = treeStore.tree.get<ProxyRouteNode>(nodeId)\n\t\t\tassert(proxyRouteNode, `Proxy route node with id \"${nodeId}\" not found in tree`)\n\n\t\t\tmodalStore.show({\n\t\t\t\ttype: ModalType.Confirmation,\n\t\t\t\ttitle: \"Delete File\",\n\t\t\t\tdescription: (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<T>You are about to delete file </T>\n\t\t\t\t\t\t<strong>{proxyRouteNode.path}</strong>\n\t\t\t\t\t\t<T>. It will be removed permanently from your project. This cannot be undone.</T>\n\t\t\t\t\t</>\n\t\t\t\t),\n\t\t\t\tconfirmLabel: Dictionary.Delete,\n\t\t\t\tcancelLabel: Dictionary.Cancel,\n\t\t\t\tonCancel: modalStore.dismiss,\n\t\t\t\tonConfirm: () => {\n\t\t\t\t\tdeleteProxies(treeStore, [nodeId])\n\t\t\t\t\tprojectStore.commitTreeAndSend()\n\t\t\t\t\tmodalStore.dismiss()\n\t\t\t\t},\n\t\t\t\tvariant: \"destructive\",\n\t\t\t\tonDismiss: modalStore.dismiss,\n\t\t\t})\n\t\t},\n\t\t[projectStore, treeStore, modalStore],\n\t)\n\n\tconst handleCopyLink = useCallback(\n\t\tasync (nodeId: NodeID) => {\n\t\t\tconst proxyRouteNode = treeStore.tree.get<ProxyRouteNode>(nodeId)\n\t\t\tassert(proxyRouteNode, `Proxy route node with id \"${nodeId}\" not found in tree`)\n\t\t\tconst url = `${canonicalUrlWithFallback}${proxyRouteNode.path}`\n\n\t\t\ttry {\n\t\t\t\tawait copyText(url)\n\t\t\t\ttoast({\n\t\t\t\t\ttype: \"add\",\n\t\t\t\t\tvariant: \"success\",\n\t\t\t\t\ticon: \"success\",\n\t\t\t\t\tprimaryText: \"Copied file link\",\n\t\t\t\t\tsecondaryText: \"to clipboard.\",\n\t\t\t\t})\n\t\t\t} catch (error) {\n\t\t\t\tunhandledError(error)\n\t\t\t\ttoast({\n\t\t\t\t\ttype: \"add\",\n\t\t\t\t\tvariant: \"error\",\n\t\t\t\t\ticon: \"error\",\n\t\t\t\t\tprimaryText: \"Failed to copy\",\n\t\t\t\t\tsecondaryText: \"file link.\",\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\t[canonicalUrlWithFallback, treeStore],\n\t)\n\n\treturn (\n\t\t<DomainPageLayoutVirtualized\n\t\t\titems={proxyRouteNodes}\n\t\t\tkeyForItem={getId}\n\t\t\tupsell={experiments.isOn(\"advancedHostingUpsells\") ? canUseWellKnown !== \"on\" : false}\n\t\t\tdraggingEnabled={false}\n\t\t>\n\t\t\t{({ item }) => (\n\t\t\t\t<DomainPageRowWithContextMenu\n\t\t\t\t\tid={item.id}\n\t\t\t\t\tupsell={\n\t\t\t\t\t\texperiments.isOn(\"advancedHostingUpsells\") ? canUseWellKnown !== \"on\" : canUseAdvancedHosting !== \"on\"\n\t\t\t\t\t}\n\t\t\t\t\tonEdit={handleEditFile}\n\t\t\t\t\tonDelete={handleDeleteFile}\n\t\t\t\t\tonCopyLink={canonicalUrlWithFallback ? handleCopyLink : undefined} // Until we have a canonical URL, we don't show the copy link button\n\t\t\t\t\ticon={<IconPage color={colors.advancedHostingTableIcon} />}\n\t\t\t\t\t// Proxy nodes don't support locales\n\t\t\t\t\tcanExpandToAllLocales={false}\n\t\t\t\t\thasLocales={false}\n\t\t\t\t\tisExpandedToAllLocales={false}\n\t\t\t\t\tonToggleExpandToAllLocales={noop}\n\t\t\t\t>\n\t\t\t\t\t<DomainPageRowLabel>{filename(item.path)}</DomainPageRowLabel>\n\t\t\t\t\t<DomainPageRowLabel>{getPathForDisplay(item.path)}</DomainPageRowLabel>\n\t\t\t\t</DomainPageRowWithContextMenu>\n\t\t\t)}\n\t\t</DomainPageLayoutVirtualized>\n\t)\n})\n", "import { HostnameStatus, dashboardPath } from \"@framerjs/app-shared\"\nimport { Badge, Button, Link, Placeholder, Stack, T, UpgradeBadge, truncateWithEllipsis } from \"@framerjs/fresco\"\nimport { IconPreviewReload } from \"@framerjs/fresco/icons\"\nimport { cx } from \"@linaria/core\"\nimport { rotateElement } from \"document/components/chrome/shared/utils/rotateElement.ts\"\nimport { assertNever } from \"library/utils/assert.ts\"\nimport { memo, useCallback, useMemo, useRef, useState } from \"react\"\nimport { Separator } from \"web/components/Separator.tsx\"\nimport { formatDistanceToNowShort } from \"web/pages/project/lib/formatDistanceToNowShort.ts\"\nimport { UpgradeProjectInNewTab } from \"web/pages/projects/components/Domains/UpgradeProjectInNewTab.tsx\"\nimport { useDashboardProjectStores } from \"../../../DashboardProjectStores.tsx\"\nimport { ThumbnailImage } from \"../../ThumbnailImage.tsx\"\nimport { DomainPageLayout } from \"../DomainPageLayout.tsx\"\nimport * as domainStyles from \"../index.styles.ts\"\nimport { Analytics } from \"./Analytics.tsx\"\nimport * as styles from \"./Overview.styles.ts\"\n\nexport function Overview() {\n\tconst { treeStore, projectStore, analyticsStore } = useDashboardProjectStores()\n\tconst { isLoadingTree, tree } = treeStore.useState()\n\tconst { updatedAt, isLoadingHostnameData, hostnameStatus, deploymentName, stagingDomain, customDomain } =\n\t\tprojectStore.useState()\n\tconst { topPages, siteVisitors, totalUniques } = analyticsStore.useState()\n\tconst [isFetchingThumbnail, setIsFetchingThumbnail] = useState(true)\n\n\tconst reloadIconRef = useRef<SVGSVGElement>(null)\n\n\tconst handleRefresh = () => {\n\t\tvoid projectStore.validateDNS()\n\t\tconst reloadIcon = reloadIconRef.current\n\t\tif (reloadIcon) rotateElement(reloadIcon)\n\t}\n\n\tconst handleThumbnailLoaded = useCallback(() => {\n\t\tsetIsFetchingThumbnail(false)\n\t}, [])\n\n\tconst canonicalHostname = useMemo(() => {\n\t\tif (isLoadingTree) return undefined\n\n\t\t// Tree has loaded, so we should be able to get the canonical URL if it exists\n\t\t// If webMetadata is empty, there's no canonical URL\n\t\tconst webMetadata = tree?.root?.webMetadata\n\t\tif (!webMetadata) return undefined\n\n\t\tswitch (webMetadata.canonicalURL) {\n\t\t\tcase \"custom\":\n\t\t\t\tif (!webMetadata.customCanonicalURL) return undefined\n\t\t\t\treturn new URL(webMetadata.customCanonicalURL).hostname\n\t\t\tcase \"rewrite\":\n\t\t\t\tif (!webMetadata.rewriteCanonicalHostname) return undefined\n\t\t\t\treturn `https://${webMetadata.rewriteCanonicalHostname}${webMetadata.rewriteCanonicalPath ?? \"\"}`\n\t\t\tdefault:\n\t\t\t\treturn undefined\n\t\t}\n\t}, [isLoadingTree, tree])\n\n\t// Will contain the canonical URL's hostname.\n\t// If a custom canonical URL is not set, it will fall back to the custom domain's hostname.\n\t// It will *not* fall back to the default domain's hostname\n\t// because we don't show this page for projects with no custom domain.\n\tconst canonicalHostnameWithFallback = canonicalHostname ?? customDomain\n\n\t// Check if analytics has data to determine if we should show the separator\n\tconst noSiteVisitorStats = !siteVisitors || siteVisitors.length === 0 || totalUniques === 0\n\tconst noTopPages = !topPages || topPages.data.length === 0\n\tconst hasAnalyticsData = !noSiteVisitorStats || !noTopPages\n\n\treturn (\n\t\t<DomainPageLayout>\n\t\t\t<Stack\n\t\t\t\tdirection=\"column\"\n\t\t\t\tgap={40}\n\t\t\t\tclassName={cx(styles.previewBlock, styles.overviewContainer, domainStyles.maxWidthContainer)}\n\t\t\t>\n\t\t\t\t<Stack direction=\"row\" gap={90} alignItems=\"center\">\n\t\t\t\t\t<Link\n\t\t\t\t\t\tonClick={projectStore.openProject}\n\t\t\t\t\t\tclassName={cx(\n\t\t\t\t\t\t\tstyles.previewThumbnailContainer,\n\t\t\t\t\t\t\t!isFetchingThumbnail && styles.previewThumbnailContainerBorder,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ThumbnailImage\n\t\t\t\t\t\t\tprojectId={projectStore.projectId}\n\t\t\t\t\t\t\timageClass={styles.previewThumbnailImage}\n\t\t\t\t\t\t\tcontainerClass={styles.thumbnailContainer}\n\t\t\t\t\t\t\tonImageDoneLoading={handleThumbnailLoaded}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Link>\n\t\t\t\t\t<Stack direction=\"row\" className={domainStyles.grow} gap={styles.previewTextGap}>\n\t\t\t\t\t\t<Stack className={styles.previewTextSection} gap={30}>\n\t\t\t\t\t\t\t<Stack gap={5}>\n\t\t\t\t\t\t\t\t<div className={styles.previewBlockHeading}>Domain</div>\n\t\t\t\t\t\t\t\t{!customDomain ? (\n\t\t\t\t\t\t\t\t\t<DomainPlaceholder width={140} />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\ttitle={customDomain}\n\t\t\t\t\t\t\t\t\t\tclassName={styles.previewBlockDomainLink}\n\t\t\t\t\t\t\t\t\t\thref={`https://${customDomain}`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t<Stack gap={5}>\n\t\t\t\t\t\t\t\t<Stack gap={5} direction=\"row\">\n\t\t\t\t\t\t\t\t\t<div className={styles.previewBlockHeading}>Staging</div>\n\t\t\t\t\t\t\t\t\t<StagingBadge />\n\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t{!stagingDomain ? (\n\t\t\t\t\t\t\t\t\t<DomainPlaceholder width={140} className={domainStyles.grow} />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<StagingContent stagingDomain={stagingDomain} />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t{(canonicalHostname || isLoadingTree) && (\n\t\t\t\t\t\t\t\t<Stack gap={5} className={styles.canonicalHostnameWrapper}>\n\t\t\t\t\t\t\t\t\t{isLoadingTree ? (\n\t\t\t\t\t\t\t\t\t\t<DomainPlaceholder width={90} className={domainStyles.grow} effect=\"pulse\" />\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<div className={styles.previewBlockHeading}>Canonical URL</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{isLoadingTree ? (\n\t\t\t\t\t\t\t\t\t\t<DomainPlaceholder width={71} className={domainStyles.grow} effect=\"pulse\" />\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\ttitle={canonicalHostname}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cx(styles.previewBlockDomainLink, truncateWithEllipsis)}\n\t\t\t\t\t\t\t\t\t\t\thref={`https://${canonicalHostname}`}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)}\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</Stack>\n\t\t\t\t\t\t<Stack className={styles.previewTextSection} gap={30}>\n\t\t\t\t\t\t\t<Stack gap={5}>\n\t\t\t\t\t\t\t\t<div className={styles.previewBlockHeading}>Published</div>\n\t\t\t\t\t\t\t\t{isLoadingHostnameData ? (\n\t\t\t\t\t\t\t\t\t<DomainPlaceholder width={140} className={domainStyles.grow} />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<div className={styles.previewBlockPlainText}>\n\t\t\t\t\t\t\t\t\t\t{updatedAt ? formatDistanceToNowShort(updatedAt) : \"Unknown\"} ago by {deploymentName}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t<Stack gap={5} className={styles.dnsStatusContainer}>\n\t\t\t\t\t\t\t\t<Stack direction=\"row\" alignItems=\"center\" gap={8}>\n\t\t\t\t\t\t\t\t\t<div className={styles.previewBlockHeading}>DNS Status</div>\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttitle=\"Refresh DNS status\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Refresh DNS status\"\n\t\t\t\t\t\t\t\t\t\tvariant=\"clean\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleRefresh}\n\t\t\t\t\t\t\t\t\t\tclassName={styles.refreshButton}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<IconPreviewReload ref={reloadIconRef} />\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t<div className={styles.previewBlockPlainText}>\n\t\t\t\t\t\t\t\t\t{isLoadingHostnameData || !hostnameStatus ? (\n\t\t\t\t\t\t\t\t\t\t<DomainPlaceholder width={68} />\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<T>{hostnameStatusToIndicatorText(hostnameStatus)}</T>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</Stack>\n\t\t\t\t</Stack>\n\t\t\t\t{hasAnalyticsData && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Separator height={1} />\n\t\t\t\t\t\t<Analytics canonicalHostname={canonicalHostnameWithFallback} />\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</DomainPageLayout>\n\t)\n}\n\nconst StagingBadge = memo(function StagingBadge() {\n\tconst { projectStore } = useDashboardProjectStores()\n\tconst { stagingEnabled, upsellStaging } = projectStore.useState()\n\n\tif (upsellStaging) {\n\t\treturn (\n\t\t\t<UpgradeProjectInNewTab projectId={projectStore.projectId}>\n\t\t\t\t<UpgradeBadge />\n\t\t\t</UpgradeProjectInNewTab>\n\t\t)\n\t}\n\tif (!stagingEnabled) return <Badge variant=\"neutral\">Disabled</Badge>\n\n\treturn null\n})\n\nconst StagingContent = memo(function StagingContent({ stagingDomain }: { stagingDomain: string }) {\n\tconst { projectStore } = useDashboardProjectStores()\n\tconst { stagingEnabled, upsellStaging } = projectStore.useState()\n\n\tif (upsellStaging) return <T>Manage stagings and site versions</T>\n\tif (!stagingEnabled) {\n\t\treturn (\n\t\t\t<Stack direction=\"row\" gap={3}>\n\t\t\t\t<T>Enable staging in the</T>\n\t\t\t\t<Link\n\t\t\t\t\ttitle=\"site settings\"\n\t\t\t\t\tclassName={styles.previewBlockDomainLink}\n\t\t\t\t\thref={`${dashboardPath}/${projectStore.projectId}?view=settings:versions`}\n\t\t\t\t/>\n\t\t\t</Stack>\n\t\t)\n\t}\n\n\treturn <Link title={stagingDomain} className={styles.previewBlockDomainLink} href={`https://${stagingDomain}`} />\n})\n\nfunction hostnameStatusToIndicatorText(status?: HostnameStatus) {\n\tswitch (status) {\n\t\tcase HostnameStatus.Active:\n\t\t\treturn \"Connected\"\n\t\tcase HostnameStatus.InvalidDNS:\n\t\t\treturn \"Pending\"\n\t\tcase undefined:\n\t\t\treturn \"\"\n\t\tdefault:\n\t\t\tassertNever(status)\n\t}\n}\n\nconst DomainPlaceholder = memo(function DomainPlaceholder({\n\twidth,\n\teffect = \"none\",\n\tclassName,\n}: {\n\twidth: number\n\teffect?: \"shimmer\" | \"pulse\" | \"none\"\n\tclassName?: string\n}) {\n\tconst skeletonHeight = 12\n\tconst skeletonY = (styles.skeletonHeight - skeletonHeight) / 2\n\treturn (\n\t\t<Placeholder height={styles.skeletonHeight} width={width} className={className} effect={effect}>\n\t\t\t<rect x={0} y={skeletonY} width={width} height={skeletonHeight} rx={6} />\n\t\t</Placeholder>\n\t)\n})\n", "import { UpsellType } from \"@framerjs/events\"\nimport type { PropsWithChildren } from \"react\"\nimport { getProjectPlansURL } from \"web/lib/Project.ts\"\nimport { UpsellUIInteraction, record } from \"web/lib/tracker.ts\"\n\ninterface Props extends PropsWithChildren {\n\tprojectId: string\n}\n\nexport function UpgradeProjectInNewTab({ projectId, children }: Props) {\n\treturn (\n\t\t<a\n\t\t\thref={getProjectPlansURL({ id: projectId, title: null, canvasFeatures: {} }).toString()}\n\t\t\tonClick={() => {\n\t\t\t\trecord(\"ui_interaction\", {\n\t\t\t\t\tpage: UpsellType.domainsStagingUpsell,\n\t\t\t\t\tid: UpsellUIInteraction.navigateToPlans,\n\t\t\t\t})\n\t\t\t}}\n\t\t\ttarget=\"_blank\"\n\t\t>\n\t\t\t{children}\n\t\t</a>\n\t)\n}\n", "import { Scroll } from \"@framerjs/fresco\"\nimport { cx } from \"@linaria/core\"\nimport type { PropsWithChildren } from \"react\"\nimport { DomainsPageHeader } from \"./DomainsPageHeader.tsx\"\nimport * as styles from \"./index.styles.ts\"\n\nexport function DomainPageLayout({ children }: PropsWithChildren) {\n\treturn (\n\t\t<Scroll showScrollbar direction=\"vertical\" className={cx(styles.mainContainer, styles.mainContainerNonVirtualized)}>\n\t\t\t<DomainsPageHeader />\n\t\t\t{children}\n\t\t</Scroll>\n\t)\n}\n", "import { CustomButton, Spinner, Stack, T } from \"@framerjs/fresco\"\nimport { isSameDay, parseISO } from \"date-fns\"\nimport AnalyticsChart, {\n\tdefaultDailyTicks,\n\tdefaultHourlyTicks,\n} from \"document/components/chrome/analytics/section/AnalyticsChart.tsx\"\nimport { getDateRangeForPreset } from \"document/components/chrome/analytics/utils/dateRangePreset.ts\"\nimport { formatNumberCompactNotation } from \"document/components/chrome/analytics/utils/formatUtils.ts\"\nimport pluralize from \"pluralize\"\nimport { getProjectAnalyticsURL } from \"web/lib/Project.ts\"\nimport { Pages, UIInteraction, record } from \"web/lib/tracker.ts\"\nimport { useDashboardProjectStores } from \"../../../DashboardProjectStores.tsx\"\nimport * as styles from \"./Analytics.styles.ts\"\nimport { AnalyticsPagesSection } from \"./AnalyticsPagesSection.tsx\"\n\ninterface Props {\n\tcanonicalHostname: string | undefined\n}\n\nexport function Analytics({ canonicalHostname }: Props) {\n\tconst { analyticsStore } = useDashboardProjectStores()\n\tconst { dateRange, isLoadingTopPages, isLoadingSiteVisitors, topPages, siteVisitors, totalUniques } =\n\t\tanalyticsStore.useState()\n\n\tconst isLoading = isLoadingTopPages || isLoadingSiteVisitors\n\n\tconst [fromDay, toDay] = getDateRangeForPreset(dateRange)\n\n\tconst isHourlyData = isSameDay(parseISO(fromDay), parseISO(toDay))\n\n\treturn (\n\t\t<Stack direction=\"column\" gap={15}>\n\t\t\t<AnalyticsHeader />\n\t\t\t{isLoading ? (\n\t\t\t\t<Stack className={styles.noContentWrapper}>\n\t\t\t\t\t<Spinner inline />\n\t\t\t\t</Stack>\n\t\t\t) : (\n\t\t\t\t<Stack gap={40} direction=\"row\">\n\t\t\t\t\t<Stack direction=\"column\" className={styles.analyticsColumn} gap={18}>\n\t\t\t\t\t\t<T className={styles.analyticsTitle}>\n\t\t\t\t\t\t\t{formatNumberCompactNotation(totalUniques)} unique {pluralize(\"visitor\", totalUniques)}\n\t\t\t\t\t\t</T>\n\t\t\t\t\t\t<AnalyticsChart\n\t\t\t\t\t\t\tfromDay={fromDay}\n\t\t\t\t\t\t\ttoDay={toDay}\n\t\t\t\t\t\t\tvisitors={siteVisitors ?? []}\n\t\t\t\t\t\t\tisLoading={isLoadingSiteVisitors}\n\t\t\t\t\t\t\tshowPageviews={false}\n\t\t\t\t\t\t\tshowLeftAxisLabel={false}\n\t\t\t\t\t\t\tnumTicks={isHourlyData ? defaultHourlyTicks : defaultDailyTicks}\n\t\t\t\t\t\t\tsmoothCurve={false}\n\t\t\t\t\t\t\ttooltipClassName={styles.uniqueVisitorTooltip}\n\t\t\t\t\t\t\tchartHeight={styles.analyticsChartHeight}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Stack>\n\t\t\t\t\t<Stack direction=\"column\" className={styles.analyticsColumn} gap={18}>\n\t\t\t\t\t\t<T className={styles.analyticsTitle}>Top pages</T>\n\t\t\t\t\t\t<AnalyticsPagesSection\n\t\t\t\t\t\t\tdata={topPages}\n\t\t\t\t\t\t\tisLoadingData={isLoadingTopPages}\n\t\t\t\t\t\t\tcanonicalHostname={canonicalHostname ?? \"\"}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Stack>\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t</Stack>\n\t)\n}\n\nfunction trackOpenProjectAnalytics() {\n\trecord(\"ui_interaction\", { page: Pages.domains, id: UIInteraction.openAnalytics })\n}\n\nfunction AnalyticsHeader() {\n\tconst { projectStore } = useDashboardProjectStores()\n\n\tconst projectAnalyticsURL = getProjectAnalyticsURL({\n\t\tid: projectStore.projectId,\n\t\ttitle: null,\n\t\tcanvasFeatures: {},\n\t})\n\n\treturn (\n\t\t<Stack direction=\"row\" justifyContent=\"space-between\" alignItems=\"center\">\n\t\t\t<T className={styles.title}>Analytics</T>\n\t\t\t<CustomButton bold as=\"a\" href={projectAnalyticsURL} target=\"_blank\" onClick={trackOpenProjectAnalytics}>\n\t\t\t\tOpen Analytics\n\t\t\t</CustomButton>\n\t\t</Stack>\n\t)\n}\n", "import \"Analytics.styles_1iim6q6.wyw.css\"; import { CHART_HEIGHT, Y_AXIS_TOP_LABEL_PADDING } from \"document/components/chrome/analytics/section/AnalyticsChart.styles.ts\";\nexport const analyticsChartHeight = CHART_HEIGHT - Y_AXIS_TOP_LABEL_PADDING;\nexport const title = \"title_t4roeu4\";\nexport const analyticsColumn = \"analyticsColumn_admwdhe\";\nexport const analyticsTitle = \"analyticsTitle_a1a91b48\";\nexport const noContentWrapper = \"noContentWrapper_n1lu2k53\";\nexport const emptyStateContentWrapper = \"emptyStateContentWrapper_er4ny50\";\nexport const emptyStateText = \"emptyStateText_e1slpnra\";\nexport const presetButton = \"presetButton_p1vugc4w\";\nexport const uniqueVisitorTooltip = \"uniqueVisitorTooltip_uzqvdvl\";", "import { openNewTab } from \"@framerjs/app-shared\"\nimport { colors } from \"@framerjs/fresco/tokens\"\nimport { noop } from \"@framerjs/shared/src/noop.ts\"\nimport { AnalyticsTable, AnalyticsTableKind } from \"document/components/chrome/analytics/components/AnalyticsTable.tsx\"\nimport { IconPageHome, IconPageOther } from \"document/components/chrome/analytics/icons.tsx\"\nimport type { AnalyticsTableData, PagesData, TopFieldRow } from \"document/components/chrome/analytics/types.ts\"\nimport { pagePathLabel } from \"document/components/utils/pathToName.ts\"\nimport React from \"react\"\n\ninterface Props {\n\tdata: PagesData | undefined\n\tisLoadingData: boolean\n\tcanonicalHostname: string\n}\n\nfunction normalizePagesData(pagesResponse: TopFieldRow[] | undefined, canonicalHostname: string): AnalyticsTableData[] {\n\tconst pages = pagesResponse ?? []\n\n\treturn pages.map(({ value: pathname, count, percentage }) => {\n\t\tconst row: AnalyticsTableData = {\n\t\t\tname: pagePathLabel(pathname),\n\t\t\tfilterValue: pathname,\n\t\t\ticon: pathname === \"/\" ? <IconPageHome /> : <IconPageOther />,\n\t\t\tcount,\n\t\t\tpercentage,\n\t\t\thref: `https://${canonicalHostname}${pathname}`,\n\t\t}\n\t\treturn row\n\t})\n}\n\n// [AnalyticsPagesSection] is a simpler version of the same analytics component, but without engine dependencies.\n// This is relevant for the dashboard, because the engine is not available here.\nexport const AnalyticsPagesSection = React.memo(function AnalyticsPagesSection({\n\tdata,\n\tisLoadingData,\n\tcanonicalHostname,\n}: Props) {\n\tconst normalizedData = normalizePagesData(data?.data, canonicalHostname)\n\n\treturn (\n\t\t<AnalyticsTable\n\t\t\t// Disable title\n\t\t\ttitle={\"\"}\n\t\t\tdata={normalizedData}\n\t\t\tisLoading={isLoadingData}\n\t\t\tsectionFilter=\"pathname\"\n\t\t\tkind={AnalyticsTableKind.Analytics}\n\t\t\tonClickRow={\n\t\t\t\tcanonicalHostname ? (_filterKey, path, _filterLabel) => openNewTab(`https://${canonicalHostname}${path}`) : noop\n\t\t\t}\n\t\t\tgradientColor={colors.advancedHostingAnalyticsGradientColor}\n\t\t/>\n\t)\n})\n", "import \"Overview.styles_w3sudr.wyw.css\"; export const skeletonHeight = 16;\nexport const previewBlock = \"previewBlock_p1rwafe4\";\nexport const previewThumbnailContainer = \"previewThumbnailContainer_p1xzzvmu\";\nexport const previewThumbnailContainerBorder = \"previewThumbnailContainerBorder_p6zv0ld\";\nexport const thumbnailContainer = \"thumbnailContainer_tfezx6j\";\nexport const previewThumbnailImage = \"previewThumbnailImage_p1i6zcak\";\nexport const previewTextGap = 40;\nexport const previewTextSection = \"previewTextSection_p1mbmalu\";\nexport const canonicalHostnameWrapper = \"canonicalHostnameWrapper_cc1qb84\";\nexport const previewBlockHeading = \"previewBlockHeading_puleflu\";\nexport const previewBlockPlainText = \"previewBlockPlainText_p56zgi4\";\nexport const previewBlockDomainLink = \"previewBlockDomainLink_penqwwv\";\nexport const hostnameIndicatorLabel = \"hostnameIndicatorLabel_h1dmih7v\";\nexport const connectionLabel = \"connectionLabel_cm1avxx\";\nexport const pendingLabel = \"pendingLabel_p13950ow\";\nexport const refreshButton = \"refreshButton_r118kljx\";\nexport const dnsStatusContainer = \"dnsStatusContainer_d1kfeb9l\";\nexport const overviewContainer = \"overviewContainer_o12dhiqz\";", "import { dashboardPath } from \"@framerjs/app-shared\"\nimport { Button, Spinner, Stack, T } from \"@framerjs/fresco\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { useCallback, useState } from \"react\"\nimport { useHistory } from \"react-router-dom\"\nimport { useDashboardProjectStores } from \"web/pages/projects/DashboardProjectStores.tsx\"\nimport * as domainStyles from \"../index.styles.ts\"\nimport { requestProjectAccess } from \"../requestProjectAccess.ts\"\nimport * as styles from \"./AccessDenied.styles.ts\"\n\nfunction AccessDeniedButtons({\n\trequestedAccess,\n\thandleRequestAccess,\n\tloading,\n}: {\n\trequestedAccess: boolean\n\thandleRequestAccess: () => void\n\tloading: boolean\n}) {\n\tconst history = useHistory()\n\n\tconst goToDashboard = useCallback(() => {\n\t\thistory.push(dashboardPath)\n\t}, [history])\n\n\tif (requestedAccess) {\n\t\treturn (\n\t\t\t<Button variant=\"withDepthPrimary\" className={domainStyles.openDashboardButton} onClick={goToDashboard}>\n\t\t\t\tOpen Dashboard\n\t\t\t</Button>\n\t\t)\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<Button className={domainStyles.button} onClick={goToDashboard}>\n\t\t\t\tOpen Dashboard\n\t\t\t</Button>\n\t\t\t<Button variant=\"withDepthPrimary\" className={domainStyles.button} onClick={handleRequestAccess}>\n\t\t\t\t{loading ? <Spinner /> : Dictionary.RequestAccess}\n\t\t\t</Button>\n\t\t</>\n\t)\n}\n\nexport function AccessDenied() {\n\tconst { projectStore } = useDashboardProjectStores()\n\tconst [requestedAccess, setRequestedAccess] = useState(false)\n\tconst [loading, setLoading] = useState(false)\n\n\tconst handleRequestAccess = useCallback(async () => {\n\t\tsetLoading(true)\n\t\ttry {\n\t\t\tawait requestProjectAccess(projectStore.projectId)\n\t\t\tsetRequestedAccess(true)\n\t\t} catch {\n\t\t\tsetRequestedAccess(false)\n\t\t}\n\t\tsetLoading(false)\n\t}, [projectStore.projectId])\n\n\treturn (\n\t\t<Stack className={domainStyles.mainContainer} gap={0} justifyContent=\"center\" paddingTop={0}>\n\t\t\t<Stack className={styles.container} gap={15} alignItems=\"center\" justifyContent=\"center\">\n\t\t\t\t<Stack gap={10}>\n\t\t\t\t\t<T className={domainStyles.infoTitle}>\n\t\t\t\t\t\t{requestedAccess ? Dictionary.RequestPending : Dictionary.RequestAccess}\n\t\t\t\t\t</T>\n\t\t\t\t\t<T className={domainStyles.infoDescription}>\n\t\t\t\t\t\t{requestedAccess\n\t\t\t\t\t\t\t? \"Once granted, you\u2019ll be able to view this page or project.\"\n\t\t\t\t\t\t\t: \"You don\u2019t have enough permissions to access this page or project.\"}\n\t\t\t\t\t</T>\n\t\t\t\t</Stack>\n\t\t\t\t<Stack gap={10} direction=\"row\" className={styles.buttonsContainer}>\n\t\t\t\t\t<AccessDeniedButtons\n\t\t\t\t\t\trequestedAccess={requestedAccess}\n\t\t\t\t\t\thandleRequestAccess={handleRequestAccess}\n\t\t\t\t\t\tloading={loading}\n\t\t\t\t\t/>\n\t\t\t\t</Stack>\n\t\t\t</Stack>\n\t\t</Stack>\n\t)\n}\n", "import \"AccessDenied.styles_mu3wsl.wyw.css\"; export const container = \"container_ccsqzsf\";\nexport const buttonsContainer = \"buttonsContainer_b1sh0ndw\";", "import { assert, emptyArray } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { experiments } from \"app/experiments.ts\"\nimport type { PageLinkAndLocaleId } from \"document/components/utils/convertPathVariablesToReadablePath.ts\"\nimport type { ReadableWebPageLinkPaths } from \"document/components/utils/getReadableWebPageLinkPaths.ts\"\nimport { getReadableWebPageLinkPaths } from \"document/components/utils/getReadableWebPageLinkPaths.ts\"\nimport type { CanvasTree, NodeID } from \"document/models/CanvasTree//index.ts\"\nimport type { RedirectRouteNode } from \"document/models/CanvasTree/nodes/RedirectRouteNode.ts\"\nimport { RoutesNode } from \"document/models/CanvasTree/nodes/RoutesNode.ts\"\nimport { isRedirectRouteNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { getWebPageLinksWithLocaleInfo } from \"document/models/CanvasTree/nodes/utils/redirectRouteNode.ts\"\nimport { deleteRedirects, moveRedirect, updateRedirect } from \"document/models/CanvasTree/nodes/utils/routesNode.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport React, { useCallback, useMemo } from \"react\"\nimport { getId } from \"utils/getId.ts\"\nimport { isString } from \"utils/typeChecks.ts\"\nimport { useDashboardProjectStores } from \"../../../DashboardProjectStores.tsx\"\nimport { DomainPageLayoutVirtualized } from \"../DomainPageLayoutVirtualized.tsx\"\nimport { DomainPageRowLabel, SortableDomainPageRow } from \"../DomainPageRow.tsx\"\nimport { getPathForDisplay } from \"../validation/validateRouteNode.ts\"\n\nexport const Redirects = React.memo(function Redirects() {\n\tconst { treeStore, projectStore, modalStore, searchStore } = useDashboardProjectStores()\n\tconst { tree } = treeStore.useState()\n\tconst { upsellRedirects, canUseRedirects } = projectStore.useState()\n\tconst { redirectsSearchTerm } = searchStore.useState()\n\n\tconst routesNode = RoutesNode.get(tree)\n\tconst hasLocales = Boolean(tree.root.locales?.length)\n\n\tconst redirectRouteNodes = useMemo(\n\t\t() => routesNode?.loaded?.getRedirects() || emptyArray<RedirectRouteNode>(),\n\t\t[routesNode],\n\t)\n\n\tconst redirects = useMemo(() => {\n\t\treturn getRedirects(tree, redirectRouteNodes)\n\t}, [redirectRouteNodes, tree])\n\n\tconst filteredRedirects = useMemo(() => {\n\t\tif (redirectsSearchTerm === \"\") return redirects\n\t\treturn redirects.filter(\n\t\t\tredirect =>\n\t\t\t\tgetPathForDisplay(redirect.path).includes(redirectsSearchTerm) || redirect.to.includes(redirectsSearchTerm),\n\t\t)\n\t}, [redirectsSearchTerm, redirects])\n\n\tconst handleEditRedirect = useCallback(\n\t\t(redirectId: NodeID) => {\n\t\t\tmodalStore.show({\n\t\t\t\ttype: ModalType.DashboardEditRedirect,\n\t\t\t\tredirectNodeId: redirectId,\n\t\t\t})\n\t\t},\n\t\t[modalStore],\n\t)\n\n\tconst reorderRedirects = useCallback(\n\t\t(from: number, to: number) => {\n\t\t\t/* We don't need to ensure limits because we're just changing existing redirects order */\n\t\t\tmoveRedirect(treeStore, to, from)\n\t\t\tprojectStore.commitTreeAndSend()\n\t\t},\n\t\t[projectStore, treeStore],\n\t)\n\n\tconst handleDeleteRedirect = useCallback(\n\t\t(redirectId: NodeID) => {\n\t\t\tmodalStore.show({\n\t\t\t\ttype: ModalType.Confirmation,\n\t\t\t\ttitle: \"Delete Redirect\",\n\t\t\t\tdescription: \"This redirect will be removed from your site when you publish a new version.\",\n\t\t\t\tconfirmLabel: Dictionary.Delete,\n\t\t\t\tcancelLabel: Dictionary.Cancel,\n\t\t\t\tonCancel: modalStore.dismiss,\n\t\t\t\tonConfirm: () => {\n\t\t\t\t\tdeleteRedirects(treeStore, [redirectId])\n\t\t\t\t\tprojectStore.commitTreeAndSend()\n\t\t\t\t\tmodalStore.dismiss()\n\t\t\t\t},\n\t\t\t\tvariant: \"destructive\",\n\t\t\t\tonDismiss: modalStore.dismiss,\n\t\t\t})\n\t\t},\n\t\t[projectStore, treeStore, modalStore],\n\t)\n\n\tconst handleToggleExpandToAllLocales = useCallback(\n\t\t(nodeId: NodeID) => {\n\t\t\tconst node = treeStore.tree.get(nodeId)\n\t\t\tassert(isRedirectRouteNode(node), `Node with id \"${nodeId}\" not found in tree`)\n\t\t\tupdateRedirect(node, { expandToAllLocales: !node.shouldExpandToAllLocales() })\n\t\t\tprojectStore.commitTreeAndSend()\n\t\t},\n\t\t[projectStore, treeStore],\n\t)\n\n\treturn (\n\t\t<DomainPageLayoutVirtualized\n\t\t\titems={filteredRedirects}\n\t\t\tmoveItem={reorderRedirects}\n\t\t\tkeyForItem={getId}\n\t\t\tupsell={experiments.isOn(\"advancedHostingUpsells\") ? canUseRedirects !== \"on\" : upsellRedirects}\n\t\t>\n\t\t\t{({ item, sortingEnabled, dragHandleRef }) => (\n\t\t\t\t<SortableDomainPageRow\n\t\t\t\t\tid={item.id}\n\t\t\t\t\thasLocales={hasLocales}\n\t\t\t\t\tupsell={experiments.isOn(\"advancedHostingUpsells\") ? canUseRedirects !== \"on\" : upsellRedirects}\n\t\t\t\t\tdragHandleRef={dragHandleRef}\n\t\t\t\t\tsortingEnabled={sortingEnabled}\n\t\t\t\t\tcanExpandToAllLocales={!item.hasExplicitLocale}\n\t\t\t\t\tisExpandedToAllLocales={item.expandToAllLocales}\n\t\t\t\t\tonDelete={handleDeleteRedirect}\n\t\t\t\t\tonEdit={handleEditRedirect}\n\t\t\t\t\tonToggleExpandToAllLocales={handleToggleExpandToAllLocales}\n\t\t\t\t>\n\t\t\t\t\t<DomainPageRowLabel>{getPathForDisplay(item.path)}</DomainPageRowLabel>\n\t\t\t\t\t<DomainPageRowLabel>{item.to}</DomainPageRowLabel>\n\t\t\t\t</SortableDomainPageRow>\n\t\t\t)}\n\t\t</DomainPageLayoutVirtualized>\n\t)\n})\n\ninterface Redirect {\n\tpath: string\n\tto: string\n\tid: string\n\texpandToAllLocales: boolean\n\thasExplicitLocale: boolean\n}\n\nfunction getRedirect(\n\tredirectRouteNode: RedirectRouteNode,\n\tlinkWithLocaleByRedirect: Map<RedirectRouteNode, PageLinkAndLocaleId>,\n\treadableWebPageLinkPaths: ReadableWebPageLinkPaths,\n): Redirect | null {\n\tif (!redirectRouteNode.path) return null\n\n\tconst hasExplicitLocale = redirectRouteNode.pathHasExplicitLocaleFromTree()\n\tconst expandToAllLocales = redirectRouteNode.shouldExpandToAllLocales()\n\n\tconst redirect: Redirect = {\n\t\tpath: redirectRouteNode.path,\n\t\tid: redirectRouteNode.id,\n\t\thasExplicitLocale,\n\t\texpandToAllLocales,\n\t\tto: \"\",\n\t}\n\n\tif (isString(redirectRouteNode.to)) {\n\t\tredirect.to = redirectRouteNode.to\n\t\treturn redirect\n\t}\n\n\tconst linkWithLocale = linkWithLocaleByRedirect.get(redirectRouteNode)\n\tif (!linkWithLocale) return null\n\n\tconst readablePath = readableWebPageLinkPaths.get(linkWithLocale)\n\tif (!readablePath) return null\n\n\tredirect.to = readablePath\n\treturn redirect\n}\n\nfunction getRedirects(tree: CanvasTree, redirectRouteNodes: readonly RedirectRouteNode[]): readonly Redirect[] {\n\tconst { linksWithLocale, linkWithLocaleByRedirect } = getWebPageLinksWithLocaleInfo(\n\t\tredirectRouteNodes,\n\t\ttree.root.locales,\n\t)\n\n\tconst readableWebPageLinkPaths = getReadableWebPageLinkPaths(tree, linksWithLocale)\n\n\tconst result: Redirect[] = []\n\n\tfor (const redirectRouteNode of redirectRouteNodes) {\n\t\tconst redirect = getRedirect(redirectRouteNode, linkWithLocaleByRedirect, readableWebPageLinkPaths)\n\t\tif (redirect) result.push(redirect)\n\t}\n\n\treturn result\n}\n", "import { parseURL } from \"@framerjs/app-shared\"\nimport { IconGlobeDomains, IconLock, IconPage, IconWarning, T, Tooltip } from \"@framerjs/fresco\"\nimport { colors } from \"@framerjs/fresco/tokens\"\nimport { assert, emptyArray } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { experiments } from \"app/experiments.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/nodes/NodeID.ts\"\nimport type { RewriteRouteNode } from \"document/models/CanvasTree/nodes/RewriteRouteNode.ts\"\nimport { RewriteType } from \"document/models/CanvasTree/nodes/RewriteTypeEnum.ts\"\nimport { RoutesNode } from \"document/models/CanvasTree/nodes/RoutesNode.ts\"\nimport { isRewriteRouteNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { deleteRewrites, moveRewrite, updateRewrite } from \"document/models/CanvasTree/nodes/utils/routesNode.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { useCallback, useMemo } from \"react\"\nimport { getId } from \"utils/getId.ts\"\nimport { getProjectDomainsURL } from \"web/lib/Project.ts\"\nimport { useDashboardProjectStores } from \"../../../DashboardProjectStores.tsx\"\nimport { DomainPageLayoutVirtualized } from \"../DomainPageLayoutVirtualized.tsx\"\nimport { DomainPageRow, DomainPageRowLabel, SortableDomainPageRow } from \"../DomainPageRow.tsx\"\nimport * as domainStyles from \"../index.styles.ts\"\nimport { getFramerOriginByUrl } from \"./getFramerOriginByUrl.ts\"\nimport type { RewriteFramerOrigin } from \"./getRewriteFramerOrigins.ts\"\n\nexport function Rewrites() {\n\tconst { treeStore, projectStore, modalStore } = useDashboardProjectStores()\n\tconst { tree } = treeStore.useState()\n\tconst { projectTitle, framerOrigins, upsellRewrites, canUseRewrites, customDomain } = projectStore.useState()\n\n\tconst routesNode = RoutesNode.get(tree)\n\tconst locales = tree.root.locales\n\n\tconst rewriteRouteNodes = useMemo(() => {\n\t\treturn routesNode?.loaded?.getRewriteRoutes() || emptyArray<RewriteRouteNode>()\n\t}, [routesNode])\n\n\tconst hasLocales = Boolean(locales?.length)\n\n\tconst handleEditRewrite = useCallback(\n\t\t(nodeId: NodeID) => {\n\t\t\tmodalStore.show({\n\t\t\t\ttype: ModalType.DashboardEditRewrite,\n\t\t\t\taction: \"edit\",\n\t\t\t\tnodeId,\n\t\t\t})\n\t\t},\n\t\t[modalStore],\n\t)\n\n\tconst handleReorderRewrites = useCallback(\n\t\t(from: number, to: number) => {\n\t\t\tmoveRewrite(treeStore, to, from)\n\t\t\tprojectStore.commitTreeAndSend()\n\t\t},\n\t\t[projectStore, treeStore],\n\t)\n\n\tconst confirmDeleteRewrite = useCallback(\n\t\t(rewriteId: string) => {\n\t\t\tdeleteRewrites(treeStore, [rewriteId])\n\t\t\tprojectStore.commitTreeAndSend()\n\t\t\tmodalStore.dismiss()\n\t\t},\n\t\t[projectStore, treeStore, modalStore],\n\t)\n\n\tconst handleDeleteRewrite = useCallback(\n\t\t(rewriteId: string) => {\n\t\t\tmodalStore.show({\n\t\t\t\ttype: ModalType.Confirmation,\n\t\t\t\ttitle: \"Delete Rule\",\n\t\t\t\tdescription: \"This rule will be removed from your site when you publish a new version.\",\n\t\t\t\tconfirmLabel: Dictionary.Delete,\n\t\t\t\tcancelLabel: Dictionary.Cancel,\n\t\t\t\tonCancel: modalStore.dismiss,\n\t\t\t\tonConfirm: () => confirmDeleteRewrite(rewriteId),\n\t\t\t\tvariant: \"destructive\",\n\t\t\t\tonDismiss: modalStore.dismiss,\n\t\t\t})\n\t\t},\n\t\t[modalStore, confirmDeleteRewrite],\n\t)\n\n\tconst handleToggleExpandToAllLocales = useCallback(\n\t\t(nodeId: NodeID) => {\n\t\t\tconst node = treeStore.tree.getNodeWithTrait(nodeId, isRewriteRouteNode)\n\t\t\tassert(node, `Node with id \"${nodeId}\" not found in tree`)\n\t\t\tupdateRewrite(node, { expandToAllLocales: !node.shouldExpandToAllLocales() })\n\t\t\tprojectStore.commitTreeAndSend()\n\t\t},\n\t\t[projectStore, treeStore],\n\t)\n\n\tconst showChangeCanonicalUrlTooltip = useCallback(\n\t\t(rewriteRouteNode: RewriteRouteNode) => {\n\t\t\tif (rewriteRouteNode.rewriteType !== RewriteType.Internal) return false\n\n\t\t\tconst origin = getFramerOriginByUrl(rewriteRouteNode.targetUrl, framerOrigins)\n\t\t\t// Doesn't make sense to show the tooltip\n\t\t\t// because we can't show the customer how to fit it without knowing the project id\n\t\t\tif (!origin) return false\n\n\t\t\treturn origin.canonicalHostname !== customDomain\n\t\t},\n\t\t[customDomain, framerOrigins],\n\t)\n\n\tconst openTargetProjectDomainsSettings = useCallback(\n\t\t(rewriteRouteNode: RewriteRouteNode) => {\n\t\t\tconst origin = getFramerOriginByUrl(rewriteRouteNode.targetUrl, framerOrigins)\n\t\t\tassert(origin, \"Multi site origin not found\")\n\t\t\twindow.open(getProjectDomainsURL(origin.projectId), \"_blank\")\n\t\t},\n\t\t[framerOrigins],\n\t)\n\n\treturn (\n\t\t<DomainPageLayoutVirtualized\n\t\t\titems={rewriteRouteNodes}\n\t\t\tmoveItem={handleReorderRewrites}\n\t\t\tkeyForItem={getId}\n\t\t\tdefaultRows={<DefaultRewriteRow path=\"Default\" projectTitle={projectTitle} />}\n\t\t\t// Remove ternary after advancedHostingUpsell release.\n\t\t\tupsell={experiments.isOn(\"advancedHostingUpsells\") ? !canUseRewrites : upsellRewrites}\n\t\t>\n\t\t\t{({ item, sortingEnabled, dragHandleRef }) => {\n\t\t\t\tconst { label, subLabel } = getRewriteTargetLabelAndSubLabel(item, framerOrigins)\n\t\t\t\treturn (\n\t\t\t\t\t<SortableDomainPageRow\n\t\t\t\t\t\tid={item.id}\n\t\t\t\t\t\tdragHandleRef={dragHandleRef}\n\t\t\t\t\t\tsortingEnabled={sortingEnabled}\n\t\t\t\t\t\t// Remove ternary after advancedHostingUpsell release.\n\t\t\t\t\t\tupsell={experiments.isOn(\"advancedHostingUpsells\") ? !canUseRewrites : upsellRewrites}\n\t\t\t\t\t\tonEdit={handleEditRewrite}\n\t\t\t\t\t\tonDelete={handleDeleteRewrite}\n\t\t\t\t\t\tonToggleExpandToAllLocales={handleToggleExpandToAllLocales}\n\t\t\t\t\t\thasLocales={hasLocales}\n\t\t\t\t\t\tcanExpandToAllLocales={!item.pathHasExplicitLocaleFromTree()}\n\t\t\t\t\t\tisExpandedToAllLocales={item.shouldExpandToAllLocales()}\n\t\t\t\t\t\tinfoIcon={\n\t\t\t\t\t\t\tshowChangeCanonicalUrlTooltip(item) ? (\n\t\t\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\t\t\ttooltip={\n\t\t\t\t\t\t\t\t\t\t<div style={{ textAlign: \"start\" }}>\n\t\t\t\t\t\t\t\t\t\t\t<T>The Canonical URL defines which domain search engines should</T>\n\t\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t\t\t<T>treat as the primary one. Make sure the Canonical URL of the target</T>\n\t\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t\t\t<T>project matches the rewritten path. Go to </T>\n\t\t\t\t\t\t\t\t\t\t\t<strong>Project Settings \u2192 Domains</strong>\n\t\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t\t\t<T>and set the Canonical URL to </T>\n\t\t\t\t\t\t\t\t\t\t\t<strong>Multi Site </strong>\n\t\t\t\t\t\t\t\t\t\t\t<T>with the matching path.</T>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tinnerClassName={domainStyles.rewriteInfoTooltip}\n\t\t\t\t\t\t\t\t\tdirection=\"right\"\n\t\t\t\t\t\t\t\t\ttint={colors.advancedHostingTooltipTint}\n\t\t\t\t\t\t\t\t\tonClick={() => openTargetProjectDomainsSettings(item)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<IconWarning className={domainStyles.advancedHostingInfoIcon} />\n\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t) : undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t<DomainPageRowLabel>{item.path}</DomainPageRowLabel>\n\t\t\t\t\t\t<DomainPageRowLabel\n\t\t\t\t\t\t\tsubLabel={subLabel}\n\t\t\t\t\t\t\twithSubLabelGap={item.rewriteType === RewriteType.Internal}\n\t\t\t\t\t\t\ticon={item.rewriteType === RewriteType.Internal ? <IconPage /> : <IconGlobeDomains />}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t</DomainPageRowLabel>\n\t\t\t\t\t</SortableDomainPageRow>\n\t\t\t\t)\n\t\t\t}}\n\t\t</DomainPageLayoutVirtualized>\n\t)\n}\n\nfunction DefaultRewriteRow({ path, projectTitle }: { path: string; projectTitle: string }) {\n\treturn (\n\t\t<DomainPageRow icon={<IconLock className={domainStyles.noGrab} />}>\n\t\t\t<DomainPageRowLabel>{path}</DomainPageRowLabel>\n\t\t\t<DomainPageRowLabel icon={<IconPage />}>{projectTitle}</DomainPageRowLabel>\n\t\t</DomainPageRow>\n\t)\n}\n\nfunction getRewriteTargetLabelAndSubLabel(\n\trewriteRouteNode: RewriteRouteNode,\n\tframerOrigins: RewriteFramerOrigin[],\n): { label: string; subLabel: string | undefined } {\n\tconst { hostname, pathname, port } = parseURL(rewriteRouteNode.targetUrl)\n\n\tconst pathSegment = pathname === \"/\" ? \"\" : pathname\n\n\tif (rewriteRouteNode.rewriteType === RewriteType.External || framerOrigins.length === 0) {\n\t\tconst portSegment = port ? `:${port}` : \"\"\n\t\tconst subLabelSegments = portSegment + pathSegment\n\t\tconst subLabel = subLabelSegments !== \"\" ? subLabelSegments : undefined\n\n\t\tconst label = hostname\n\t\treturn { label, subLabel }\n\t}\n\n\tconst origin = framerOrigins.find(framerOrigin => framerOrigin.hostname === hostname)\n\tif (!origin) {\n\t\t// If for some reason we can't find the origin, default to show the target URL\n\t\treturn { label: rewriteRouteNode.targetUrl, subLabel: undefined }\n\t}\n\n\tconst label = origin.title\n\tconst subLabel = pathSegment !== \"\" ? pathSegment : undefined\n\n\treturn { label, subLabel }\n}\n", "import { assert } from \"@framerjs/shared\"\nimport type { BaseUndoRedoEntry } from \"document/base-engine/BaseUndoRedoManager.ts\"\nimport type { CanvasTree } from \"document/models/CanvasTree/index.ts\"\nimport { isRoutesNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isEditingText } from \"document/utils/isEditingText.ts\"\nimport { useCallback, useEffect } from \"react\"\nimport { useHistory } from \"react-router-dom\"\nimport { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { record } from \"web/lib/tracker.ts\"\nimport { KeyBindings, keyboardEventToBrowserAccelerator } from \"web/pages/project/lib/KeyBindings.ts\"\nimport { useDashboardProjectStores } from \"../../DashboardProjectStores.tsx\"\nimport type { DashboardTreeStore } from \"../../DashboardTreeStore.ts\"\nimport type { DashboardUndoRedoManager } from \"../../DashboardUndoRedoManager.ts\"\nimport { useDashboardModal } from \"../../providers/DashboardModalProvider.tsx\"\nimport { useSelectedDomainTab } from \"./SelectedDomainTab.tsx\"\nimport type { DomainTab } from \"./domainTab.ts\"\n\nexport function useDomainsPageWindowEventListeners() {\n\tconst stores = useDashboardProjectStores()\n\tconst selectedTab = useSelectedDomainTab()\n\tconst history = useHistory()\n\tconst { active: activeGeneralDashboardModal } = useDashboardModal()\n\n\tconst isModalOpen = Boolean(activeGeneralDashboardModal || stores.modalStore.active)\n\n\tconst switchDomainTab = useCallback(\n\t\t(domainTab: DomainTab) => {\n\t\t\thistory.push(`?tab=${domainTab}`)\n\t\t},\n\t\t[history],\n\t)\n\n\tuseEffect(() => {\n\t\tconst bindings = new KeyBindings()\n\n\t\tfunction undo() {\n\t\t\tconst domainTabContainingChange = getDomainTabForUndoChange(stores.undoRedoManager, stores.treeStore)\n\t\t\tif (!!domainTabContainingChange && domainTabContainingChange !== selectedTab) {\n\t\t\t\tswitchDomainTab(domainTabContainingChange)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (!stores.undoRedoManager.canUndo()) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tstores.undoRedoManager.undo(stores.treeStore.timeline)\n\t\t\tstores.projectStore.commitTreeAndSend(\"nonUserEdit\")\n\t\t}\n\n\t\tfunction redo() {\n\t\t\tconst domainTabContainingChange = getDomainTabForRedoChange(stores.undoRedoManager, stores.treeStore)\n\t\t\tif (!!domainTabContainingChange && domainTabContainingChange !== selectedTab) {\n\t\t\t\tswitchDomainTab(domainTabContainingChange)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (!stores.undoRedoManager.canRedo()) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tstores.undoRedoManager.redo(stores.treeStore.timeline)\n\t\t\tstores.projectStore.commitTreeAndSend(\"nonUserEdit\")\n\t\t}\n\n\t\tbindings.set(\"CommandOrControl+Z\", undo, \"undo\")\n\t\tbindings.set(\"CommandOrControl+Shift+Z\", redo, \"redo\")\n\n\t\tfunction handleKeyDown(event: KeyboardEvent) {\n\t\t\tif (isEditingText()) return\n\t\t\tif (isModalOpen) return\n\n\t\t\tconst binding = bindings.get(event)\n\t\t\tif (!binding) return\n\n\t\t\trecord(\"keyboard_shortcut\", { shortcut: keyboardEventToBrowserAccelerator(event) })\n\n\t\t\tbinding.action(event)\n\n\t\t\tevent.preventDefault()\n\t\t\tevent.stopPropagation()\n\t\t}\n\n\t\twindow.addEventListener(\"keydown\", handleKeyDown)\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"keydown\", handleKeyDown)\n\t\t}\n\t}, [stores, selectedTab, switchDomainTab, isModalOpen])\n}\n\nfunction getDomainTabForUndoChange(\n\tundoRedoManager: DashboardUndoRedoManager,\n\ttreeStore: DashboardTreeStore,\n): DomainTab | null {\n\tconst entry = undoRedoManager.peekUndo()\n\treturn getDomainTabForUndoRedoEntry(entry, treeStore.tree)\n}\n\nfunction getDomainTabForRedoChange(\n\tundoRedoManager: DashboardUndoRedoManager,\n\ttreeStore: DashboardTreeStore,\n): DomainTab | null {\n\tconst entry = undoRedoManager.peekRedo()\n\treturn getDomainTabForUndoRedoEntry(entry, treeStore.tree)\n}\n\nfunction getDomainTabForNodeClass(nodeClass: string): DomainTab | null {\n\tswitch (nodeClass) {\n\t\tcase ClassDiscriminator.RewriteRouteNode:\n\t\t\treturn \"multi-site\"\n\t\tcase ClassDiscriminator.RedirectRouteNode:\n\t\t\treturn \"redirects\"\n\t\tcase ClassDiscriminator.HeaderRouteNode:\n\t\t\treturn \"headers\"\n\t\tdefault:\n\t\t\treturn null\n\t}\n}\n\nfunction getDomainTabForUndoRedoEntry(entry: BaseUndoRedoEntry | undefined, tree: CanvasTree): DomainTab | null {\n\tif (!entry) return null\n\n\tfor (const change of entry.changes) {\n\t\tconst changedNode = tree.get(change.id)\n\t\tconst changedNodeClass = changedNode?.__class ?? change.added ?? change.removed\n\t\tif (!changedNodeClass) continue\n\n\t\tconst domainTab = getDomainTabForNodeClass(changedNodeClass)\n\t\tif (domainTab) return domainTab\n\t}\n\n\tif (entry.changes.length !== 1) return null\n\n\tconst change = entry.changes[0]\n\tassert(change, \"Expected change to be defined\")\n\n\tconst changedNode = tree.get(change.id)\n\tif (!isRoutesNode(changedNode)) return null\n\tif (!change.fromChildren || !change.toChildren) return null\n\n\t// When sorting routes, only the parent routes node has changed, so we need to check which child\n\t// nodes were affected.\n\tfor (let index = 0; index < change.fromChildren.length; index++) {\n\t\tconst fromChildId = change.fromChildren[index]\n\t\tconst toChildId = change.toChildren[index]\n\t\tif (fromChildId === toChildId) continue\n\n\t\tconst fromChild = tree.get(fromChildId)\n\t\tif (fromChild) {\n\t\t\tconst domainTab = getDomainTabForNodeClass(fromChild.__class)\n\t\t\tif (domainTab) return domainTab\n\t\t}\n\n\t\tconst toChild = tree.get(toChildId)\n\t\tif (toChild) {\n\t\t\tconst domainTab = getDomainTabForNodeClass(toChild.__class)\n\t\t\tif (domainTab) return domainTab\n\t\t}\n\t}\n\n\treturn null\n}\n", "import { Dictionary } from \"app/dictionary.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { useEffect } from \"react\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport { useDashboardProjectStores } from \"../../DashboardProjectStores.tsx\"\n\nexport function useRequestAccessToast() {\n\tconst { treeStore, projectStore, modalStore } = useDashboardProjectStores()\n\tconst { isLoadingTree } = treeStore.useState()\n\tconst { isProjectMember, projectDataStatus, canEdit } = projectStore.useState()\n\n\tuseEffect(() => {\n\t\tif (projectDataStatus === \"loading\" || isLoadingTree || !isProjectMember || canEdit) return\n\n\t\tconst toastKey = \"view-only-access\"\n\n\t\ttoast({\n\t\t\tvariant: \"info\",\n\t\t\tkey: toastKey,\n\t\t\tprimaryText: \"No edit access\",\n\t\t\tsecondaryText: \"for this project.\",\n\t\t\tpermanent: true,\n\t\t\tshowCloseButton: \"never\",\n\t\t\ttype: \"add\",\n\t\t\ticon: \"view-only\",\n\t\t\tduration: Infinity,\n\t\t\taction: {\n\t\t\t\ttitle: Dictionary.RequestAccess,\n\t\t\t\tonClick: () => {\n\t\t\t\t\tmodalStore.show({ type: ModalType.DashboardRequestProjectAccess })\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\n\t\t// Cleanup function to remove the toast when component unmounts or dependencies change\n\t\treturn () => {\n\t\t\ttoast({ type: \"remove\", key: toastKey })\n\t\t}\n\t}, [projectDataStatus, isLoadingTree, modalStore, canEdit, isProjectMember])\n}\n"],
  "mappings": "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",
  "names": ["import_react", "logger", "body", "DashboardProjectStoresProvider", "import_react", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "import_react", "import_jsx_runtime", "logger", "import_react", "import_jsx_runtime", "logger", "value", "import_react", "import_jsx_runtime", "import_jsx_runtime", "helpUrl", "import_react", "import_jsx_runtime", "logger", "fileName", "import_react", "import_jsx_runtime", "logger", "import_react", "logger", "title", "import_jsx_runtime", "logger", "rewriteRouteNode", "import_jsx_runtime", "import_react", "import_react", "import_react", "import_react", "import_react", "import_jsx_runtime", "SortableDomainPageRow", "DomainPageRowLabel", "subLabel", "DomainPageRowHeader", "import_jsx_runtime", "import_jsx_runtime", "logger", "DomainPageSubHeader", "import_react", "import_jsx_runtime", "Link", "DomainHeaderPlaceholder", "skeletonHeight", "import_jsx_runtime", "import_jsx_runtime", "import_react", "import_jsx_runtime", "React", "Files", "import_react", "import_jsx_runtime", "import_jsx_runtime", "title", "import_react", "import_jsx_runtime", "React", "AnalyticsPagesSection", "import_jsx_runtime", "pluralize", "title", "import_jsx_runtime", "StagingBadge", "StagingContent", "assertNever", "DomainPlaceholder", "skeletonHeight", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "React", "Redirects", "import_react", "import_jsx_runtime", "label", "subLabel", "import_react", "domainTab", "change", "changedNode", "import_react", "import_jsx_runtime"]
}
