@fluid-app/portal-sdk 0.1.518 → 0.1.520
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ContactsScreen-By9x021F.mjs → ContactsScreen-5tn5LOdL.mjs} +2 -2
- package/dist/{ContactsScreen-DP5A5yQN.mjs → ContactsScreen-BIjEr68m.mjs} +2 -2
- package/dist/{ContactsScreen-DP5A5yQN.mjs.map → ContactsScreen-BIjEr68m.mjs.map} +1 -1
- package/dist/{ContactsScreen-DV0hoorh.cjs → ContactsScreen-CQeHdBSj.cjs} +2 -2
- package/dist/{ContactsScreen-B6_KXScY.cjs → ContactsScreen-DJsCRndV.cjs} +2 -2
- package/dist/{ContactsScreen-B6_KXScY.cjs.map → ContactsScreen-DJsCRndV.cjs.map} +1 -1
- package/dist/{FluidProvider-DYN-3PCs.mjs → FluidProvider-BsXK_zQv.mjs} +3 -2
- package/dist/{FluidProvider-DYN-3PCs.mjs.map → FluidProvider-BsXK_zQv.mjs.map} +1 -1
- package/dist/{FluidProvider-DwwVnnFW.cjs → FluidProvider-xECI7Cct.cjs} +2 -1
- package/dist/FluidProvider-xECI7Cct.cjs.map +1 -0
- package/dist/{MessagingScreen-CUOhRPr-.mjs → MessagingScreen-Bwne_Hx_.mjs} +3 -3
- package/dist/{MessagingScreen-CEHNxhs9.cjs → MessagingScreen-C4CaUUMV.cjs} +3 -3
- package/dist/{MessagingScreen-CEHNxhs9.cjs.map → MessagingScreen-C4CaUUMV.cjs.map} +1 -1
- package/dist/{MessagingScreen-B-J6jRWH.cjs → MessagingScreen-CBjR49dn.cjs} +3 -3
- package/dist/{MessagingScreen-B5zl1dov.mjs → MessagingScreen-DnRfW8T_.mjs} +3 -3
- package/dist/{MessagingScreen-B5zl1dov.mjs.map → MessagingScreen-DnRfW8T_.mjs.map} +1 -1
- package/dist/{MySiteScreen-DV7iYs_P.mjs → MySiteScreen-BOwQw4Ud.mjs} +2 -2
- package/dist/{MySiteScreen-q4tciAP1.cjs → MySiteScreen-C6_2pJ3S.cjs} +2 -2
- package/dist/{MySiteScreen-q4tciAP1.cjs.map → MySiteScreen-C6_2pJ3S.cjs.map} +1 -1
- package/dist/{MySiteScreen-CAvKw9Yo.mjs → MySiteScreen-CktOXvV5.mjs} +2 -2
- package/dist/{MySiteScreen-CAvKw9Yo.mjs.map → MySiteScreen-CktOXvV5.mjs.map} +1 -1
- package/dist/{MySiteScreen-DMZyJGuY.cjs → MySiteScreen-nmG9-sZI.cjs} +2 -2
- package/dist/{OrdersScreen-CInfDm3v.cjs → OrdersScreen-C_JKIGjS.cjs} +2 -2
- package/dist/{OrdersScreen-CxN6w55q.cjs → OrdersScreen-Cok9YH0q.cjs} +2 -2
- package/dist/{OrdersScreen-CxN6w55q.cjs.map → OrdersScreen-Cok9YH0q.cjs.map} +1 -1
- package/dist/{OrdersScreen-2s7JqOac.mjs → OrdersScreen-Cypqeqk0.mjs} +2 -2
- package/dist/{OrdersScreen-BJH8PmWZ.mjs → OrdersScreen-DlJU28Ll.mjs} +2 -2
- package/dist/{OrdersScreen-BJH8PmWZ.mjs.map → OrdersScreen-DlJU28Ll.mjs.map} +1 -1
- package/dist/{ProfileScreen-thlAvVV-.mjs → ProfileScreen-DF2jFZN3.mjs} +3 -3
- package/dist/{ProfileScreen-thlAvVV-.mjs.map → ProfileScreen-DF2jFZN3.mjs.map} +1 -1
- package/dist/{ProfileScreen-CQia71t1.mjs → ProfileScreen-DNMonsJC.mjs} +4 -4
- package/dist/{ProfileScreen-DdhsKq8b.cjs → ProfileScreen-QucOM0vU.cjs} +4 -4
- package/dist/{ProfileScreen-DDo49SL5.cjs → ProfileScreen-kJiYhRI9.cjs} +3 -3
- package/dist/{ProfileScreen-DDo49SL5.cjs.map → ProfileScreen-kJiYhRI9.cjs.map} +1 -1
- package/dist/{SubscriptionsScreen-AW_duq75.cjs → SubscriptionsScreen-CrKfJmYj.cjs} +4 -4
- package/dist/{SubscriptionsScreen-C0ZFD-A5.mjs → SubscriptionsScreen-CsfDx795.mjs} +4 -4
- package/dist/{SubscriptionsScreen-CRHFGux0.cjs → SubscriptionsScreen-D2Thca-o.cjs} +105 -57
- package/dist/SubscriptionsScreen-D2Thca-o.cjs.map +1 -0
- package/dist/{SubscriptionsScreen-CdDBKpkc.mjs → SubscriptionsScreen-DBYCi-c3.mjs} +106 -58
- package/dist/SubscriptionsScreen-DBYCi-c3.mjs.map +1 -0
- package/dist/index.cjs +21 -21
- package/dist/index.mjs +21 -21
- package/dist/{sidebar-DS8r8yy1.mjs → sidebar-CQpJWKMc.mjs} +2 -2
- package/dist/{sidebar-DS8r8yy1.mjs.map → sidebar-CQpJWKMc.mjs.map} +1 -1
- package/dist/{sidebar-Cu7C835M.cjs → sidebar-zkV-HxHW.cjs} +7 -1
- package/dist/{sidebar-Cu7C835M.cjs.map → sidebar-zkV-HxHW.cjs.map} +1 -1
- package/dist/{use-portal-card-add-3ds-flow-B2Ca5nEr.mjs → use-portal-card-add-3ds-flow-C8Otluj_.mjs} +2 -2
- package/dist/{use-portal-card-add-3ds-flow-B2Ca5nEr.mjs.map → use-portal-card-add-3ds-flow-C8Otluj_.mjs.map} +1 -1
- package/dist/{use-portal-card-add-3ds-flow-Bvs0RcyI.cjs → use-portal-card-add-3ds-flow-D7IUv-eA.cjs} +2 -2
- package/dist/{use-portal-card-add-3ds-flow-Bvs0RcyI.cjs.map → use-portal-card-add-3ds-flow-D7IUv-eA.cjs.map} +1 -1
- package/package.json +13 -13
- package/dist/FluidProvider-DwwVnnFW.cjs.map +0 -1
- package/dist/SubscriptionsScreen-CRHFGux0.cjs.map +0 -1
- package/dist/SubscriptionsScreen-CdDBKpkc.mjs.map +0 -1
|
@@ -5,7 +5,7 @@ import { t as createTranslationContext } from "./translation-api-context-factory
|
|
|
5
5
|
import { t as ResponsiveDialog } from "./ResponsiveDialog-C1p9IkQx.mjs";
|
|
6
6
|
import { n as mysiteDomain, t as createMysiteTranslationAdapter } from "./translation-adapter-B735scDI.mjs";
|
|
7
7
|
import { n as useAppNavigation } from "./AppNavigationContext-PCbmG3nH.mjs";
|
|
8
|
-
import {
|
|
8
|
+
import { p as useSidebar } from "./sidebar-CQpJWKMc.mjs";
|
|
9
9
|
import { n as ScreenHeaderBreadcrumbs } from "./ScreenHeaderContext-DahYFA_m.mjs";
|
|
10
10
|
import { a as verticalListSortingStrategy, c as PointerSensor, d as useSensors, f as CSS, i as useSortable, l as closestCenter, n as arrayMove, o as DndContext, r as sortableKeyboardCoordinates, s as KeyboardSensor, t as SortableContext, u as useSensor } from "./sortable.esm-vRB8e_vF.mjs";
|
|
11
11
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
@@ -1331,4 +1331,4 @@ const mySiteScreenPropertySchema = {
|
|
|
1331
1331
|
//#endregion
|
|
1332
1332
|
export { mySiteScreenPropertySchema as n, MySiteScreen as t };
|
|
1333
1333
|
|
|
1334
|
-
//# sourceMappingURL=MySiteScreen-
|
|
1334
|
+
//# sourceMappingURL=MySiteScreen-CktOXvV5.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MySiteScreen-CAvKw9Yo.mjs","names":[],"sources":["../../../mysite/core/src/translation-api-context.ts","../src/providers/MysiteTranslationBridge.tsx","../../../mysite/ui/src/portal/components/animation-utils.ts","../../../mysite/ui/src/portal/components/VisitorDetailsCard.tsx","../../../mysite/ui/src/portal/components/MySiteLinkCard.tsx","../../../mysite/ui/src/portal/components/PhonePreview.tsx","../../../mysite/ui/src/portal/components/ThemeEditor.tsx","../../../mysite/ui/src/shared/schemas/mysite.schema.ts","../../../mysite/ui/src/shared/schemas/mysite-theme.schema.ts","../../../mysite/ui/src/shared/utils.ts","../../../mysite/ui/src/portal/components/PortalButtonsEditor.tsx","../../../mysite/ui/src/portal/components/PortalFavoritesEditor.tsx","../src/screens/MySiteScreen/MySiteMainView.tsx","../src/screens/MySiteScreen/use-mysite-editing-section.ts","../src/screens/MySiteScreen/index.tsx"],"sourcesContent":["import type { Provider } from \"react\";\nimport { createTranslationContext } from \"@fluid-app/i18n/translation-api-context-factory\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\nimport type { MysiteDict } from \"./translation-dictionary\";\n\nconst { Provider: MysiteProvider, useTranslation } =\n createTranslationContext<MysiteDict>(\"Mysite\");\n\nexport const MysiteTranslationProvider: Provider<TranslationApi<MysiteDict> | null> =\n MysiteProvider;\nexport const useMysiteTranslation = useTranslation;\n","import { useMemo, type ReactNode } from \"react\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { useDomainDict } from \"@fluid-app/i18n/use-domain-dict\";\nimport {\n mysiteDomain,\n createMysiteTranslationAdapter,\n} from \"@fluid-app/mysite-core/translation-adapter\";\nimport { MysiteTranslationProvider } from \"@fluid-app/mysite-core/translation-api-context\";\n\nexport function MysiteTranslationBridge({\n children,\n}: {\n children: ReactNode;\n}): React.JSX.Element {\n const { locale } = useActiveLocale();\n const dict = useDomainDict(mysiteDomain, locale);\n const api = useMemo(\n () => createMysiteTranslationAdapter(locale, dict),\n [locale, dict],\n );\n return (\n <MysiteTranslationProvider value={api}>\n {children}\n </MysiteTranslationProvider>\n );\n}\n","import type { AnimPhase } from \"./types\";\n\n// Tailwind className helpers for the MySite main → editor slide/fade.\n//\n// The slide transform (`translate-x-[50%]` / `-translate-x-[200%]`) is only\n// meaningful in the 2/3 + 1/3 wide layout where the content + preview columns\n// sit side-by-side. Below the `2xl` breakpoint the preview column stacks below\n// the content column, so we gate the transform classes with `2xl:` — otherwise\n// the content slides off-screen on narrower viewports. Opacity and transition\n// timings still run at all breakpoints so sections still fade in and out.\n\nexport function getContentClassName(phase: AnimPhase): string {\n switch (phase) {\n case \"idle\":\n return \"opacity-100 transition-none\";\n case \"fade-out\":\n return \"opacity-0 transition-opacity duration-300 ease-in-out\";\n case \"slide\":\n return \"opacity-0 2xl:translate-x-[50%] transition-transform duration-500 ease-in-out\";\n case \"fade-in\":\n return \"opacity-100 2xl:translate-x-[50%] transition-opacity duration-300 ease-in-out\";\n case \"editing\":\n return \"opacity-100 2xl:translate-x-[50%] transition-none\";\n case \"exit-fade-out\":\n return \"opacity-0 2xl:translate-x-[50%] transition-opacity duration-300 ease-in-out\";\n case \"exit-slide\":\n return \"opacity-0 transition-transform duration-500 ease-in-out\";\n case \"exit-fade-in\":\n return \"opacity-100 transition-opacity duration-300 ease-in-out\";\n }\n}\n\nexport function getPreviewClassName(phase: AnimPhase): string {\n switch (phase) {\n case \"idle\":\n case \"fade-out\":\n case \"exit-fade-in\":\n return \"transition-none\";\n case \"slide\":\n return \"2xl:-translate-x-[200%] transition-transform duration-500 ease-in-out\";\n case \"fade-in\":\n case \"editing\":\n case \"exit-fade-out\":\n return \"2xl:-translate-x-[200%] transition-none\";\n case \"exit-slide\":\n return \"transition-transform duration-500 ease-in-out\";\n }\n}\n","import { Eye, Users } from \"lucide-react\";\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Separator,\n} from \"@fluid-app/ui-primitives\";\nimport { useMysiteTranslation } from \"@fluid-app/mysite-core/translation-api-context\";\n\nexport function MySiteVisitorDetailsCard({\n views,\n leads,\n}: {\n views: number;\n leads: number;\n}): React.JSX.Element {\n const { t } = useMysiteTranslation();\n return (\n <Card className=\"h-auto gap-0 py-0 shadow-none\">\n <CardHeader className=\"p-4 pb-3\">\n <CardTitle className=\"text-sm\">{t(\"visitor_details\")}</CardTitle>\n </CardHeader>\n <CardContent className=\"flex px-4 pb-4\">\n <div className=\"flex-1\">\n <div className=\"mb-2 flex items-center gap-1.5\">\n <Eye className=\"text-muted-foreground size-3.5\" />\n <span className=\"text-muted-foreground text-sm\">{t(\"views\")}</span>\n </div>\n <p className=\"text-foreground text-2xl font-bold\">\n {views.toLocaleString()}\n </p>\n </div>\n <Separator orientation=\"vertical\" className=\"bg-border mx-4 h-auto\" />\n <div className=\"flex-1\">\n <div className=\"mb-2 flex items-center gap-1.5\">\n <Users className=\"text-muted-foreground size-3.5\" />\n <span className=\"text-muted-foreground text-sm\">{t(\"leads\")}</span>\n </div>\n <p className=\"text-foreground text-2xl font-bold\">\n {leads.toLocaleString()}\n </p>\n </div>\n </CardContent>\n </Card>\n );\n}\n","import { useCallback, useState } from \"react\";\nimport { Copy } from \"lucide-react\";\nimport {\n Button,\n Card,\n CardAction,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"@fluid-app/ui-primitives\";\nimport { useMysiteTranslation } from \"@fluid-app/mysite-core/translation-api-context\";\n\nexport function MySiteLinkCard({\n mysiteUrl,\n displayUrl,\n onUpdateSlug,\n onToast,\n}: {\n mysiteUrl: string;\n displayUrl: string;\n onUpdateSlug?: (slug: string) => Promise<void>;\n onToast?: (message: string, type: \"success\" | \"error\") => void;\n}): React.JSX.Element {\n const { t } = useMysiteTranslation();\n const lastSlashIndex = displayUrl.lastIndexOf(\"/\");\n const urlPrefix =\n lastSlashIndex >= 0 ? displayUrl.slice(0, lastSlashIndex + 1) : \"\";\n const currentSlug =\n lastSlashIndex >= 0 ? displayUrl.slice(lastSlashIndex + 1) : displayUrl;\n\n const [isEditingLink, setIsEditingLink] = useState(false);\n const [linkSlugInput, setLinkSlugInput] = useState(currentSlug);\n const [isSaving, setIsSaving] = useState(false);\n\n const handleEditLink = useCallback(() => {\n setLinkSlugInput(currentSlug);\n setIsEditingLink(true);\n }, [currentSlug]);\n\n const handleCancelEditLink = useCallback(() => {\n setIsEditingLink(false);\n setLinkSlugInput(currentSlug);\n }, [currentSlug]);\n\n const handleSaveLink = useCallback(async () => {\n const trimmed = linkSlugInput.trim();\n if (!trimmed) {\n onToast?.(t(\"slug_empty_error\"), \"error\");\n return;\n }\n if (trimmed === currentSlug) {\n setIsEditingLink(false);\n return;\n }\n if (!onUpdateSlug) return;\n setIsSaving(true);\n try {\n await onUpdateSlug(trimmed);\n onToast?.(t(\"link_updated\"), \"success\");\n setIsEditingLink(false);\n } catch {\n onToast?.(t(\"link_update_failed\"), \"error\");\n } finally {\n setIsSaving(false);\n }\n }, [linkSlugInput, currentSlug, onUpdateSlug, onToast, t]);\n\n const handleCopyLink = useCallback(async () => {\n if (!mysiteUrl) return;\n try {\n await navigator.clipboard.writeText(mysiteUrl);\n onToast?.(t(\"link_copied\"), \"success\");\n } catch {\n onToast?.(t(\"link_copy_failed\"), \"error\");\n }\n }, [mysiteUrl, onToast, t]);\n\n return (\n <Card className=\"h-auto gap-0 py-0 shadow-none\">\n <CardHeader className=\"items-center p-4\">\n <CardTitle className=\"text-sm\">{t(\"your_mysite_link\")}</CardTitle>\n {!isEditingLink && onUpdateSlug && (\n <CardAction>\n <Button variant=\"link\" size=\"sm\" onClick={handleEditLink}>\n {t(\"edit_link\")}\n </Button>\n </CardAction>\n )}\n </CardHeader>\n <CardContent className=\"px-4 pb-4\">\n <div className=\"text-foreground flex items-center gap-2 rounded-lg border bg-gradient-to-r from-[rgba(72,187,120,0.2)] via-[rgba(236,72,153,0.15)] to-[rgba(251,146,60,0.15)] px-3 py-2.5\">\n {isEditingLink ? (\n <>\n <span className=\"shrink-0 text-sm\">{urlPrefix}</span>\n <input\n type=\"text\"\n value={linkSlugInput}\n onChange={(e) => setLinkSlugInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !isSaving) handleSaveLink();\n if (e.key === \"Escape\") handleCancelEditLink();\n }}\n className=\"border-input text-foreground focus:ring-primary bg-background/60 min-w-0 flex-1 rounded-md border px-2 py-1 text-sm font-medium outline-none focus:ring-1\"\n autoFocus\n />\n </>\n ) : (\n <span className=\"min-w-0 flex-1 truncate text-sm\">\n {displayUrl || t(\"not_configured\")}\n </span>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleCopyLink}\n disabled={!mysiteUrl}\n >\n <Copy className=\"size-4\" />\n </Button>\n </div>\n\n <div\n className=\"grid transition-all duration-300 ease-in-out\"\n style={{\n gridTemplateRows: isEditingLink ? \"1fr\" : \"0fr\",\n opacity: isEditingLink ? 1 : 0,\n marginTop: isEditingLink ? 12 : 0,\n }}\n >\n <div className=\"overflow-hidden\">\n <div className=\"flex justify-end gap-2\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={handleCancelEditLink}\n >\n {t(\"cancel\")}\n </Button>\n <Button size=\"sm\" onClick={handleSaveLink} disabled={isSaving}>\n {isSaving ? t(\"saving\") : t(\"save\")}\n </Button>\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { LoaderCircle } from \"lucide-react\";\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n} from \"@fluid-app/ui-primitives\";\nimport { useMysiteTranslation } from \"@fluid-app/mysite-core/translation-api-context\";\n\nexport function MySitePhonePreview({\n mysiteUrl,\n themeName,\n previewKey,\n isUpdating,\n onPreview,\n}: {\n mysiteUrl: string;\n themeName: string;\n previewKey: number;\n isUpdating: boolean;\n onPreview: () => void;\n}): React.JSX.Element {\n const { t } = useMysiteTranslation();\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const previewSrc = `${mysiteUrl}?preview=true`;\n const isInitialLoadRef = useRef(true);\n\n useEffect(() => {\n isInitialLoadRef.current = true;\n }, [previewKey]);\n\n const handleIframeLoad = () => {\n if (isInitialLoadRef.current) {\n isInitialLoadRef.current = false;\n return;\n }\n const iframe = iframeRef.current;\n if (!iframe) return;\n isInitialLoadRef.current = true;\n iframe.src = previewSrc;\n };\n\n return (\n <Card className=\"items-center gap-4 py-5\">\n <CardHeader className=\"w-full items-center px-5\">\n <div>\n <p className=\"text-muted-foreground text-xs\">{t(\"current_theme\")}</p>\n <p className=\"text-foreground text-sm font-semibold\">{themeName}</p>\n </div>\n <Button\n className=\"col-start-2 row-span-2 row-start-1 cursor-pointer self-center justify-self-end\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={onPreview}\n disabled={!mysiteUrl}\n >\n {t(\"preview\")}\n </Button>\n </CardHeader>\n\n <CardContent className=\"relative mx-auto my-auto w-[260px] px-0 sm:w-[320px]\">\n <div className=\"overflow-hidden rounded-[32px] border-[6px] border-[#1e2939] bg-[#1e2939] shadow-xl sm:rounded-[40px] sm:border-[8px]\">\n <div className=\"flex items-center justify-between bg-[#101828] px-5 py-1 sm:px-6 sm:py-1.5\">\n <span className=\"text-[10px] font-medium text-[#ffffff] sm:text-[11px]\">\n 9:41\n </span>\n <div className=\"flex items-center gap-1\">\n <div className=\"h-2 w-2 rounded-full bg-[#ffffff60] sm:h-2.5 sm:w-2.5\" />\n <div className=\"h-2 w-3.5 rounded-sm bg-[#ffffff60] sm:h-2.5 sm:w-4\" />\n </div>\n </div>\n\n <div\n className=\"relative h-[490px] overflow-y-auto bg-[#ffffff] sm:h-[600px]\"\n style={{ scrollbarWidth: \"none\" }}\n aria-busy={isUpdating}\n >\n {mysiteUrl ? (\n <>\n <iframe\n ref={iframeRef}\n key={previewKey}\n className=\"h-full w-full origin-top-left bg-[#ffffff]\"\n src={previewSrc}\n title={t(\"mysite_preview\")}\n tabIndex={-1}\n // allow-scripts + allow-same-origin is a known sandbox escape\n // hatch: if iframe and parent share an origin, scripts can\n // strip the sandbox attribute. Safe here because mysite is\n // hosted on a different origin than portal.\n sandbox=\"allow-scripts allow-same-origin\"\n onLoad={handleIframeLoad}\n />\n {isUpdating && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-white/60\">\n <LoaderCircle className=\"text-muted-foreground size-6 animate-spin\" />\n </div>\n )}\n </>\n ) : (\n <div className=\"flex h-full items-center justify-center\">\n <p className=\"text-muted-foreground text-sm\">\n {t(\"no_site_configured\")}\n </p>\n </div>\n )}\n </div>\n </div>\n\n <div className=\"absolute bottom-1.5 left-1/2 h-1 w-24 -translate-x-1/2 rounded-full bg-white sm:bottom-2 sm:w-28\" />\n </CardContent>\n </Card>\n );\n}\n","import { ArrowLeft, Check, Palette } from \"lucide-react\";\nimport { Button, Card, CardContent, cn } from \"@fluid-app/ui-primitives\";\nimport { useMysiteTranslation } from \"@fluid-app/mysite-core/translation-api-context\";\n\n/** Minimal theme shape accepted by ThemeEditor.\n * Compatible with both core MySiteTheme (preview_url) and legacy MysiteTheme (image_url). */\nexport interface ThemeDisplayItem {\n id: number;\n name: string;\n preview_url?: string | null;\n image_url?: string | null;\n}\n\nexport function MySiteThemeEditor<T extends ThemeDisplayItem>({\n themes,\n selectedThemeId,\n onSelectTheme,\n isPending,\n onBack,\n}: {\n themes: T[];\n selectedThemeId: number | null;\n onSelectTheme: (theme: T) => void;\n isPending: boolean;\n onBack: () => void;\n}): React.JSX.Element {\n const { t } = useMysiteTranslation();\n return (\n <>\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={onBack}>\n <ArrowLeft className=\"size-4\" />\n </Button>\n <h1 className=\"text-foreground text-xl font-bold\">\n {t(\"choose_a_theme\")}\n </h1>\n </div>\n\n {themes.length === 0 ? (\n <Card>\n <CardContent className=\"py-8 text-center\">\n <p className=\"text-muted-foreground\">{t(\"no_themes_available\")}</p>\n </CardContent>\n </Card>\n ) : (\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-3\">\n {themes.map((theme) => {\n const isSelected = theme.id === selectedThemeId;\n const imageUrl = theme.preview_url || theme.image_url;\n return (\n <button\n key={theme.id}\n type=\"button\"\n onClick={() => onSelectTheme(theme)}\n className={cn(\n \"group focus:ring-primary relative overflow-hidden rounded-lg border-2 transition-all focus:ring-2 focus:ring-offset-2 focus:outline-none\",\n isSelected\n ? \"border-primary ring-primary ring-2\"\n : \"border-border hover:border-muted-foreground/50\",\n )}\n aria-pressed={isSelected}\n disabled={isPending}\n >\n <div className=\"bg-muted relative aspect-[4/3] w-full\">\n {imageUrl ? (\n <img\n src={imageUrl}\n alt={theme.name}\n loading=\"lazy\"\n className=\"absolute inset-0 h-full w-full object-cover\"\n />\n ) : (\n <div className=\"text-muted-foreground/50 flex h-full w-full items-center justify-center\">\n <Palette className=\"size-8\" />\n </div>\n )}\n {isSelected && (\n <div className=\"bg-primary/20 absolute inset-0 flex items-center justify-center\">\n <div className=\"bg-primary text-primary-foreground flex size-8 items-center justify-center rounded-full\">\n <Check className=\"size-5\" />\n </div>\n </div>\n )}\n {!isSelected && (\n <div className=\"group-hover:bg-foreground/10 absolute inset-0 transition-colors\" />\n )}\n </div>\n <div className=\"bg-card p-2\">\n <p\n className={cn(\n \"truncate text-sm font-medium\",\n isSelected ? \"text-primary\" : \"text-foreground\",\n )}\n >\n {theme.name}\n </p>\n </div>\n </button>\n );\n })}\n </div>\n )}\n </>\n );\n}\n","import { z } from \"zod\";\n\n// User Links (Buttons)\nexport const linkSchema = z.object({\n id: z.number(),\n url: z.string(),\n text: z.string(),\n order: z.number(),\n clicks: z.number().optional().default(0),\n});\n\nexport const linksResponseSchema = z.array(linkSchema);\n\nexport type MySiteLink = z.infer<typeof linkSchema>;\n\n// Favorites\nexport const favoriteableSchema = z\n .object({\n id: z.number(),\n title: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n image_url: z.string().nullable().optional(),\n type: z.string().optional(),\n })\n .passthrough();\n\nexport const favoriteSchema = z\n .object({\n id: z.number(),\n favoriteable_id: z.number().optional(),\n favoriteable_type: z.string(),\n order: z.number(),\n user_company_id: z.number().optional(),\n created_at: z.string().optional(),\n favoriteable: favoriteableSchema.nullable(),\n })\n .passthrough();\n\nexport const favoritesResponseSchema = z.array(favoriteSchema);\n\nexport type MySiteFavorite = z.infer<typeof favoriteSchema>;\n\n// MySite Update\nexport const mysiteUpdateResponseSchema = z\n .object({\n id: z.number(),\n })\n .passthrough();\n\n// User Profile Update\nexport const profileUpdateResponseSchema = z.object({\n id: z.number(),\n bio: z.string().nullable(),\n facebook: z.string().nullable(),\n twitter: z.string().nullable(),\n instagram: z.string().nullable(),\n youtube: z.string().nullable(),\n pinterest: z.string().nullable(),\n tiktok: z.string().nullable(),\n linkedin: z.string().nullable(),\n whatsapp: z.string().nullable(),\n wechat: z.string().nullable(),\n image_url: z.string().nullable(),\n});\n\nexport type ProfileUpdateResponse = z.infer<typeof profileUpdateResponseSchema>;\n","import { z } from \"zod\";\n\nexport interface MysiteTheme {\n id: number;\n name: string;\n description: string | null;\n public: boolean;\n company_id: number | null;\n created_at: string;\n updated_at: string;\n image_url: string | null;\n /** Generated placeholder carrying the theme name, sent whenever the theme\n * has no image of its own. Null for a nameless theme, and absent against a\n * backend that predates the field. */\n picker_image_url?: string | null;\n application_theme_template_id: number | null;\n default?: boolean | null;\n}\n\nexport const themeSchema: z.ZodType<MysiteTheme> = z.object({\n id: z.number(),\n name: z.string(),\n description: z.string().nullable(),\n public: z.boolean(),\n company_id: z.number().nullable(),\n created_at: z.string().datetime(),\n updated_at: z.string().datetime(),\n image_url: z.string().nullable(),\n picker_image_url: z.string().nullish(),\n application_theme_template_id: z.number().nullable(),\n default: z.boolean().nullable().optional(),\n});\n\nexport const mysiteThemesSchema: z.ZodType<MysiteTheme[]> =\n z.array(themeSchema);\n\n// --- Legacy Theme (for creating themes via /legacy_themes endpoint) ---\n\ninterface LegacyThemeTemplate {\n id: number;\n name: string;\n content: string | null;\n stylesheet: string | null;\n head: string | null;\n status: string;\n}\n\nconst legacyThemeTemplateSchema: z.ZodType<LegacyThemeTemplate> = z.object({\n id: z.number(),\n name: z.string(),\n content: z.string().nullable(),\n stylesheet: z.string().nullable(),\n head: z.string().nullable(),\n status: z.string(),\n});\n\nexport interface LegacyThemeResponse {\n data: {\n legacy_theme: {\n id: number;\n name: string;\n description: string | null;\n image_url: string | null;\n public: boolean;\n company_id: number | null;\n template: LegacyThemeTemplate;\n };\n };\n}\n\nconst legacyThemeResponseSchema: z.ZodType<LegacyThemeResponse> = z.object({\n data: z.object({\n legacy_theme: z.object({\n id: z.number(),\n name: z.string(),\n description: z.string().nullable(),\n image_url: z.string().nullable(),\n public: z.boolean(),\n company_id: z.number().nullable(),\n template: legacyThemeTemplateSchema,\n }),\n }),\n});\n\nexport { legacyThemeResponseSchema };\n\nexport interface CreateLegacyThemeInput {\n name: string;\n description?: string;\n image_url?: string;\n public?: boolean;\n template?: {\n content?: string;\n stylesheet?: string;\n head?: string;\n };\n}\n","export const sortByOrder = <T extends { order: number }>(items: T[]): T[] => {\n return items.toSorted((a, b) => a.order - b.order);\n};\n\nexport const updateOrders = <T extends { id: number | string; order: number }>(\n items: T[],\n): T[] => {\n return items.map((item, index) => ({\n ...item,\n order: index + 1,\n }));\n};\n\nexport const generateTempId = (): string => {\n return `temp_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n};\n\n/**\n * Strip the server-injected `public_id` query param from a URL so the rep\n * sees their clean original URL when editing or previewing. The BFF appends\n * `public_id=<rep uuid>` to outbound MySite link URLs for attribution; that\n * value should not be persisted back when the rep saves an edit, and it\n * should not clutter list previews.\n */\nexport function stripRepPublicIdFromUrl(url: string): string {\n if (!url) return url;\n try {\n const parsed = new URL(url);\n if (!parsed.searchParams.has(\"public_id\")) return url;\n parsed.searchParams.delete(\"public_id\");\n return parsed.toString();\n } catch {\n return url;\n }\n}\n\nexport function normalizeUrl(value: string): string {\n const trimmed = value.trim();\n if (!trimmed) return \"\";\n if (/^https?:\\/\\//i.test(trimmed)) return trimmed;\n return `https://${trimmed}`;\n}\n","\"use client\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { ArrowLeft, Plus, GripVertical, Pencil, Trash2 } from \"lucide-react\";\nimport {\n Button,\n Card,\n Skeleton,\n DialogFooter,\n Input,\n Label,\n useZodForm,\n} from \"@fluid-app/ui-primitives\";\nimport { ResponsiveDialog } from \"@fluid-app/ui-components/components/ResponsiveDialog\";\nimport { useSidebar } from \"@fluid-app/portal-react/shell/sidebar\";\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from \"@dnd-kit/core\";\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { z } from \"zod\";\nimport {\n usePortalLinks,\n usePortalCreateLink,\n usePortalUpdateLink,\n usePortalDeleteLink,\n usePortalReorderLinks,\n} from \"../hooks/use-mysite-portal\";\nimport type { MySiteLink } from \"@fluid-app/mysite-core/mysite-api-types\";\nimport { useMysiteTranslation } from \"@fluid-app/mysite-core/translation-api-context\";\nimport { normalizeUrl, stripRepPublicIdFromUrl } from \"../../shared/utils\";\n\nfunction createButtonSchema(t: ReturnType<typeof useMysiteTranslation>[\"t\"]) {\n return z.object({\n title: z.string().min(1, t(\"validation_button_text_required\")),\n url: z\n .string()\n .transform(normalizeUrl)\n .pipe(z.string().url(t(\"validation_url_invalid\"))),\n });\n}\n\ntype ButtonFormData = z.infer<ReturnType<typeof createButtonSchema>>;\n\nfunction SortableButtonCard({\n link,\n onEdit,\n onDelete,\n}: {\n link: MySiteLink;\n onEdit: (link: MySiteLink) => void;\n onDelete: (link: MySiteLink) => void;\n}) {\n const { t } = useMysiteTranslation();\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: link.id });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n };\n\n const displayUrl = stripRepPublicIdFromUrl(link.url);\n const truncatedUrl =\n displayUrl.length > 40 ? `${displayUrl.substring(0, 40)}...` : displayUrl;\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={`border-border bg-card flex items-center gap-3 rounded-lg border p-3 sm:p-4 ${\n isDragging ? \"opacity-50 shadow-lg\" : \"\"\n }`}\n >\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground cursor-grab touch-none\"\n aria-label={t(\"drag_to_reorder\")}\n {...attributes}\n {...listeners}\n >\n <GripVertical className=\"size-5\" />\n </button>\n\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-foreground truncate font-medium\">{link.title}</p>\n <p className=\"text-muted-foreground truncate text-sm\">{truncatedUrl}</p>\n </div>\n\n <div className=\"flex shrink-0 items-center gap-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-muted-foreground hover:text-foreground\"\n onClick={() => onEdit(link)}\n aria-label={t(\"edit_button_aria\")}\n >\n <Pencil className=\"size-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-muted-foreground hover:text-destructive\"\n onClick={() => onDelete(link)}\n aria-label={t(\"delete_button_aria\")}\n >\n <Trash2 className=\"size-4\" />\n </Button>\n </div>\n </div>\n );\n}\n\n/**\n * Portal-specific buttons editor that uses MySiteApi context.\n * No client/userId props needed — data comes from context.\n */\nexport function PortalButtonsEditor({\n onBack,\n onRefreshPreview,\n onToast,\n}: {\n onBack: () => void;\n onRefreshPreview?: () => void;\n onToast?: (message: string, type: \"success\" | \"error\") => void;\n}): React.JSX.Element {\n \"use no memo\";\n const { t } = useMysiteTranslation();\n const { isMobile } = useSidebar();\n const schema = useMemo(() => createButtonSchema(t), [t]);\n const { data: links = [], isLoading } = usePortalLinks();\n const createLinkMutation = usePortalCreateLink();\n const updateLinkMutation = usePortalUpdateLink();\n const deleteLinkMutation = usePortalDeleteLink();\n const reorderLinksMutation = usePortalReorderLinks();\n\n const [isAddEditDialogOpen, setIsAddEditDialogOpen] = useState(false);\n const [editingLink, setEditingLink] = useState<MySiteLink | null>(null);\n const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);\n const [deletingLink, setDeletingLink] = useState<MySiteLink | null>(null);\n\n const {\n register,\n handleSubmit: handleButtonSubmit,\n reset: resetButtonForm,\n formState: { errors: buttonErrors, isSubmitting: isButtonSubmitting },\n } = useZodForm<ButtonFormData>(schema, {\n defaultValues: { title: \"\", url: \"\" },\n });\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n\n const handleOpenAddDialog = useCallback(() => {\n setEditingLink(null);\n resetButtonForm({ title: \"\", url: \"\" });\n setIsAddEditDialogOpen(true);\n }, [resetButtonForm]);\n\n const handleOpenEditDialog = useCallback(\n (link: MySiteLink) => {\n setEditingLink(link);\n resetButtonForm({\n title: link.title,\n url: stripRepPublicIdFromUrl(link.url),\n });\n setIsAddEditDialogOpen(true);\n },\n [resetButtonForm],\n );\n\n const handleCloseAddEditDialog = useCallback(() => {\n setIsAddEditDialogOpen(false);\n setEditingLink(null);\n resetButtonForm({ title: \"\", url: \"\" });\n }, [resetButtonForm]);\n\n const onButtonSubmit = useCallback(\n (data: ButtonFormData) => {\n if (editingLink) {\n updateLinkMutation.mutate(\n {\n linkId: editingLink.id,\n body: { title: data.title, url: data.url },\n },\n {\n onSuccess: () => {\n onToast?.(t(\"button_updated\"), \"success\");\n handleCloseAddEditDialog();\n onRefreshPreview?.();\n },\n onError: () => {\n onToast?.(t(\"button_update_failed\"), \"error\");\n },\n },\n );\n } else {\n createLinkMutation.mutate(\n { title: data.title, url: data.url },\n {\n onSuccess: () => {\n onToast?.(t(\"button_created\"), \"success\");\n handleCloseAddEditDialog();\n onRefreshPreview?.();\n },\n onError: () => {\n onToast?.(t(\"button_create_failed\"), \"error\");\n },\n },\n );\n }\n },\n [\n editingLink,\n createLinkMutation,\n updateLinkMutation,\n handleCloseAddEditDialog,\n onRefreshPreview,\n onToast,\n t,\n ],\n );\n\n const handleOpenDeleteDialog = useCallback((link: MySiteLink) => {\n setDeletingLink(link);\n setIsDeleteDialogOpen(true);\n }, []);\n\n const handleCloseDeleteDialog = useCallback(() => {\n setIsDeleteDialogOpen(false);\n setDeletingLink(null);\n }, []);\n\n const handleConfirmDelete = useCallback(() => {\n if (deletingLink) {\n deleteLinkMutation.mutate(deletingLink.id, {\n onSuccess: () => {\n onToast?.(t(\"button_deleted\"), \"success\");\n handleCloseDeleteDialog();\n onRefreshPreview?.();\n },\n onError: () => {\n onToast?.(t(\"button_delete_failed\"), \"error\");\n },\n });\n }\n }, [\n deletingLink,\n deleteLinkMutation,\n handleCloseDeleteDialog,\n onRefreshPreview,\n onToast,\n t,\n ]);\n\n const handleDragEnd = useCallback(\n (event: DragEndEvent) => {\n const { active, over } = event;\n if (over && active.id !== over.id) {\n const oldIndex = links.findIndex((l) => l.id === active.id);\n const newIndex = links.findIndex((l) => l.id === over.id);\n const reordered = arrayMove(links, oldIndex, newIndex);\n const orderedIds = reordered.map((link) => link.id);\n reorderLinksMutation.mutate(\n { orderedIds, optimisticItems: reordered },\n {\n onSuccess: () => {\n onRefreshPreview?.();\n },\n onError: () => {\n onToast?.(t(\"reorder_buttons_failed\"), \"error\");\n },\n },\n );\n }\n },\n [links, reorderLinksMutation, onRefreshPreview, onToast, t],\n );\n\n return (\n <>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={onBack}>\n <ArrowLeft className=\"size-4\" />\n </Button>\n <h1 className=\"text-foreground text-xl font-bold\">\n {t(\"buttons_heading\")}\n </h1>\n </div>\n <Button size=\"sm\" onClick={handleOpenAddDialog}>\n <Plus className=\"mr-1 size-4\" />\n {t(\"add_button\")}\n </Button>\n </div>\n\n {isLoading ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div\n key={i}\n className=\"border-border bg-card flex items-center gap-3 rounded-lg border p-3 sm:p-4\"\n >\n <Skeleton className=\"size-5\" />\n <div className=\"min-w-0 flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-3 w-48\" />\n </div>\n <div className=\"flex gap-1\">\n <Skeleton className=\"size-8\" />\n <Skeleton className=\"size-8\" />\n </div>\n </div>\n ))}\n </div>\n ) : links.length === 0 ? (\n <Card className=\"p-6 text-center sm:p-8\">\n <p className=\"text-muted-foreground mb-4\">{t(\"no_buttons_empty\")}</p>\n <Button size=\"sm\" onClick={handleOpenAddDialog}>\n <Plus className=\"mr-1 size-4\" />\n {t(\"add_button\")}\n </Button>\n </Card>\n ) : (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleDragEnd}\n >\n <SortableContext\n items={links.map((l) => l.id)}\n strategy={verticalListSortingStrategy}\n >\n <div className=\"space-y-2\">\n {links.map((link) => (\n <SortableButtonCard\n key={link.id}\n link={link}\n onEdit={handleOpenEditDialog}\n onDelete={handleOpenDeleteDialog}\n />\n ))}\n </div>\n </SortableContext>\n </DndContext>\n )}\n\n {/* Add/Edit Dialog */}\n <ResponsiveDialog\n open={isAddEditDialogOpen}\n onOpenChange={setIsAddEditDialogOpen}\n title={editingLink ? t(\"edit_button_dialog\") : t(\"add_button_dialog\")}\n presentation={isMobile ? \"bottom-sheet\" : \"dialog\"}\n >\n <form\n onSubmit={handleButtonSubmit(onButtonSubmit)}\n className=\"space-y-4\"\n >\n <div className=\"space-y-2\">\n <Label htmlFor=\"title\">{t(\"button_text_label\")}</Label>\n <Input\n id=\"title\"\n placeholder={t(\"button_text_placeholder\")}\n {...register(\"title\")}\n className={buttonErrors.title ? \"border-destructive\" : \"\"}\n />\n {buttonErrors.title && (\n <p className=\"text-destructive text-sm\">\n {buttonErrors.title.message}\n </p>\n )}\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"url\">{t(\"url_label\")}</Label>\n <Input\n id=\"url\"\n placeholder={t(\"url_placeholder\")}\n {...register(\"url\")}\n className={buttonErrors.url ? \"border-destructive\" : \"\"}\n />\n {buttonErrors.url && (\n <p className=\"text-destructive text-sm\">\n {buttonErrors.url.message}\n </p>\n )}\n </div>\n <DialogFooter className=\"flex justify-between\">\n {editingLink ? (\n <Button\n type=\"button\"\n variant=\"destructive\"\n onClick={() => {\n handleCloseAddEditDialog();\n handleOpenDeleteDialog(editingLink);\n }}\n >\n <Trash2 className=\"mr-1 size-4\" />\n {t(\"delete\")}\n </Button>\n ) : (\n <div />\n )}\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleCloseAddEditDialog}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n type=\"submit\"\n disabled={\n isButtonSubmitting ||\n createLinkMutation.isPending ||\n updateLinkMutation.isPending\n }\n >\n {isButtonSubmitting ||\n createLinkMutation.isPending ||\n updateLinkMutation.isPending\n ? t(\"saving\")\n : t(\"save\")}\n </Button>\n </div>\n </DialogFooter>\n </form>\n </ResponsiveDialog>\n\n {/* Delete Confirmation Dialog */}\n <ResponsiveDialog\n open={isDeleteDialogOpen}\n onOpenChange={setIsDeleteDialogOpen}\n title={t(\"delete_button_dialog\")}\n presentation={isMobile ? \"bottom-sheet\" : \"dialog\"}\n size=\"compact\"\n >\n <p className=\"text-muted-foreground\">\n {t(\"delete_button_confirm\", {\n name: deletingLink?.title ?? \"\",\n })}\n </p>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleCloseDeleteDialog}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n onClick={handleConfirmDelete}\n disabled={deleteLinkMutation.isPending}\n >\n {deleteLinkMutation.isPending ? t(\"deleting\") : t(\"delete\")}\n </Button>\n </DialogFooter>\n </ResponsiveDialog>\n </>\n );\n}\n","\"use client\";\nimport { useCallback, useState } from \"react\";\nimport { ArrowLeft, GripVertical, Trash2 } from \"lucide-react\";\nimport { Button, Card, Skeleton, DialogFooter } from \"@fluid-app/ui-primitives\";\nimport { ResponsiveDialog } from \"@fluid-app/ui-components/components/ResponsiveDialog\";\nimport { useSidebar } from \"@fluid-app/portal-react/shell/sidebar\";\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from \"@dnd-kit/core\";\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport {\n usePortalFavorites,\n usePortalDeleteFavorite,\n usePortalReorderFavorites,\n} from \"../hooks/use-mysite-portal\";\nimport type { MySiteFavorite } from \"@fluid-app/mysite-core/mysite-api-types\";\nimport { useMysiteTranslation } from \"@fluid-app/mysite-core/translation-api-context\";\n\nconst TYPE_LABEL_KEYS: Record<\n string,\n \"type_media\" | \"type_playlist\" | \"type_enrollment_pack\" | \"type_page\"\n> = {\n Medium: \"type_media\",\n Library: \"type_playlist\",\n EnrollmentPack: \"type_enrollment_pack\",\n Page: \"type_page\",\n};\n\nfunction SortableFavoriteCard({\n favorite,\n onDelete,\n}: {\n favorite: MySiteFavorite;\n onDelete: (favorite: MySiteFavorite) => void;\n}) {\n const { t } = useMysiteTranslation();\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: favorite.id });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n };\n\n const title = favorite.name ?? t(\"untitled\");\n const imageUrl = favorite.image_url;\n const typeLabelKey = TYPE_LABEL_KEYS[favorite.favoriteable_type];\n const typeLabel =\n favorite.favoriteable_type !== \"Product\"\n ? typeLabelKey\n ? t(typeLabelKey)\n : favorite.favoriteable_type\n : null;\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={`border-border bg-card flex items-center gap-3 rounded-lg border p-3 sm:p-4 ${\n isDragging ? \"opacity-50 shadow-lg\" : \"\"\n }`}\n >\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground cursor-grab touch-none\"\n aria-label={t(\"drag_to_reorder\")}\n {...attributes}\n {...listeners}\n >\n <GripVertical className=\"size-5\" />\n </button>\n\n <div className=\"bg-muted size-10 shrink-0 overflow-hidden rounded-md\">\n {imageUrl ? (\n <img\n src={imageUrl}\n alt={title}\n loading=\"lazy\"\n width={40}\n height={40}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"text-muted-foreground flex h-full w-full items-center justify-center text-xs\">\n {t(\"no_image\")}\n </div>\n )}\n </div>\n\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-foreground truncate font-medium\">{title}</p>\n {typeLabel ? (\n <span className=\"text-muted-foreground text-xs\">{typeLabel}</span>\n ) : null}\n </div>\n\n <div className=\"flex shrink-0 items-center gap-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-muted-foreground hover:text-destructive\"\n onClick={() => onDelete(favorite)}\n aria-label={t(\"remove_favorite_aria\")}\n >\n <Trash2 className=\"size-4\" />\n </Button>\n </div>\n </div>\n );\n}\n\n/**\n * Portal-specific favorites editor that uses MySiteApi context.\n * No client/affiliateId props needed — data comes from context.\n */\nexport function PortalFavoritesEditor({\n onBack,\n onRefreshPreview,\n onToast,\n}: {\n onBack: () => void;\n onRefreshPreview?: () => void;\n onToast?: (message: string, type: \"success\" | \"error\") => void;\n}): React.JSX.Element {\n const { t } = useMysiteTranslation();\n const { isMobile } = useSidebar();\n const { data: favorites = [], isLoading } = usePortalFavorites();\n const deleteFavoriteMutation = usePortalDeleteFavorite();\n const reorderFavoritesMutation = usePortalReorderFavorites();\n\n const [isDeleteFavoriteDialogOpen, setIsDeleteFavoriteDialogOpen] =\n useState(false);\n const [deletingFavorite, setDeletingFavorite] =\n useState<MySiteFavorite | null>(null);\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n\n const handleOpenDeleteFavoriteDialog = useCallback(\n (favorite: MySiteFavorite) => {\n setDeletingFavorite(favorite);\n setIsDeleteFavoriteDialogOpen(true);\n },\n [],\n );\n\n const handleCloseDeleteFavoriteDialog = useCallback(() => {\n setIsDeleteFavoriteDialogOpen(false);\n setDeletingFavorite(null);\n }, []);\n\n const handleConfirmDeleteFavorite = useCallback(() => {\n if (deletingFavorite) {\n deleteFavoriteMutation.mutate(deletingFavorite.id, {\n onSuccess: () => {\n onToast?.(t(\"content_removed\"), \"success\");\n handleCloseDeleteFavoriteDialog();\n onRefreshPreview?.();\n },\n onError: () => {\n onToast?.(t(\"content_remove_failed\"), \"error\");\n },\n });\n }\n }, [\n deletingFavorite,\n deleteFavoriteMutation,\n handleCloseDeleteFavoriteDialog,\n onRefreshPreview,\n onToast,\n t,\n ]);\n\n const handleFavoriteDragEnd = useCallback(\n (event: DragEndEvent) => {\n const { active, over } = event;\n if (over && active.id !== over.id) {\n const oldIndex = favorites.findIndex((f) => f.id === active.id);\n const newIndex = favorites.findIndex((f) => f.id === over.id);\n const reordered = arrayMove(favorites, oldIndex, newIndex);\n const orderedIds = reordered.map((fav) => fav.id);\n reorderFavoritesMutation.mutate(\n { orderedIds, optimisticItems: reordered },\n {\n onSuccess: () => {\n onRefreshPreview?.();\n },\n onError: () => {\n onToast?.(t(\"reorder_content_failed\"), \"error\");\n },\n },\n );\n }\n },\n [favorites, reorderFavoritesMutation, onRefreshPreview, onToast, t],\n );\n\n return (\n <>\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={onBack}>\n <ArrowLeft className=\"size-4\" />\n </Button>\n <h1 className=\"text-foreground text-xl font-bold\">\n {t(\"content_heading\")}\n </h1>\n </div>\n\n {isLoading ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div\n key={i}\n className=\"border-border bg-card flex items-center gap-3 rounded-lg border p-3 sm:p-4\"\n >\n <Skeleton className=\"size-5\" />\n <Skeleton className=\"size-10 rounded-md\" />\n <div className=\"min-w-0 flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-3 w-20\" />\n </div>\n <Skeleton className=\"size-8\" />\n </div>\n ))}\n </div>\n ) : favorites.length === 0 ? (\n <Card className=\"p-6 text-center sm:p-8\">\n <p className=\"text-muted-foreground\">{t(\"no_content_empty\")}</p>\n </Card>\n ) : (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleFavoriteDragEnd}\n >\n <SortableContext\n items={favorites.map((f) => f.id)}\n strategy={verticalListSortingStrategy}\n >\n <div className=\"space-y-2\">\n {favorites.map((fav) => (\n <SortableFavoriteCard\n key={fav.id}\n favorite={fav}\n onDelete={handleOpenDeleteFavoriteDialog}\n />\n ))}\n </div>\n </SortableContext>\n </DndContext>\n )}\n\n {/* Delete Favorite Confirmation Dialog */}\n <ResponsiveDialog\n open={isDeleteFavoriteDialogOpen}\n onOpenChange={setIsDeleteFavoriteDialogOpen}\n title={t(\"remove_content_dialog\")}\n presentation={isMobile ? \"bottom-sheet\" : \"dialog\"}\n size=\"compact\"\n >\n <p className=\"text-muted-foreground\">\n {t(\"remove_content_confirm\", {\n name: deletingFavorite?.name ?? t(\"untitled\"),\n })}\n </p>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleCloseDeleteFavoriteDialog}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n onClick={handleConfirmDeleteFavorite}\n disabled={deleteFavoriteMutation.isPending}\n >\n {deleteFavoriteMutation.isPending ? t(\"removing\") : t(\"remove\")}\n </Button>\n </DialogFooter>\n </ResponsiveDialog>\n </>\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport {\n usePortalMySiteProfile,\n usePortalMySiteThemes,\n usePortalUpdateSettings,\n} from \"@fluid-app/mysite-ui/portal/hooks/use-mysite-portal\";\nimport type { MySiteTheme } from \"@fluid-app/mysite-core/mysite-api-types\";\nimport {\n type AnimPhase,\n type EditingSection,\n getContentClassName,\n getPreviewClassName,\n MySiteVisitorDetailsCard,\n MySitePhonePreview,\n MySiteLinkCard,\n MySiteThemeEditor,\n PortalButtonsEditor,\n PortalFavoritesEditor,\n} from \"@fluid-app/mysite-ui/portal/components\";\nimport { useMysiteTranslation } from \"@fluid-app/mysite-core/translation-api-context\";\nimport { ChevronRight, User, Link2, Palette, LayoutGrid } from \"lucide-react\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { useAppNavigation } from \"../../shell/AppNavigationContext\";\n\ntype NavActionItem = {\n labelKey: \"nav_profile\" | \"nav_theme\" | \"nav_content\" | \"nav_buttons\";\n key: Exclude<EditingSection, null>;\n icon: typeof User;\n};\ntype NavLinkItem = {\n labelKey: \"nav_profile\" | \"nav_theme\" | \"nav_content\" | \"nav_buttons\";\n slug: string;\n icon: typeof User;\n};\ntype NavItem = NavActionItem | NavLinkItem;\n\nconst navigationItems: NavItem[] = [\n { labelKey: \"nav_profile\", slug: \"profile\", icon: User },\n { labelKey: \"nav_theme\", key: \"theme\", icon: Palette },\n { labelKey: \"nav_content\", key: \"content\", icon: LayoutGrid },\n { labelKey: \"nav_buttons\", key: \"buttons\", icon: Link2 },\n];\n\nfunction defaultToast(message: string, type: \"success\" | \"error\") {\n fluidToast({ title: message, type });\n}\n\nexport interface MySiteMainViewProps {\n editingSection: EditingSection;\n animPhase: AnimPhase;\n showEditContent: boolean;\n onEditSection: (section: EditingSection) => void;\n onBackClick: () => void;\n}\n\nexport function MySiteMainView({\n editingSection,\n animPhase,\n showEditContent,\n onEditSection,\n onBackClick,\n}: MySiteMainViewProps): React.JSX.Element {\n const { t } = useMysiteTranslation();\n const { navigate } = useAppNavigation();\n const { data: profile, isLoading: isProfileLoading } =\n usePortalMySiteProfile();\n const { data: themes = [] } = usePortalMySiteThemes();\n const updateSettingsMutation = usePortalUpdateSettings();\n\n const [previewKey, setPreviewKey] = useState(0);\n const refreshPreview = useCallback(() => setPreviewKey((k) => k + 1), []);\n\n const [selectedThemeId, setSelectedThemeId] = useState<number | null>(null);\n\n const resolvedThemeId =\n selectedThemeId ??\n profile?.theme_id ??\n themes.find((t) => t.name === \"Default\")?.id ??\n themes[0]?.id ??\n null;\n\n const currentTheme = themes.find((t) => t.id === resolvedThemeId);\n const themeName = currentTheme?.name ?? \"Default\";\n\n const mysiteUrl = profile?.mysite_url ?? \"\";\n const displayUrl = mysiteUrl ? mysiteUrl.replace(/^https?:\\/\\//, \"\") : \"\";\n const views = profile?.mysite_views ?? 0;\n const leads = profile?.mysite_leads ?? 0;\n\n const handleSelectTheme = useCallback(\n (theme: MySiteTheme) => {\n if (theme.id === resolvedThemeId) return;\n const previousThemeId = selectedThemeId;\n setSelectedThemeId(theme.id);\n updateSettingsMutation.mutate(\n { theme_id: theme.id },\n {\n onSuccess: () => {\n defaultToast(t(\"theme_changed\", { name: theme.name }), \"success\");\n refreshPreview();\n },\n onError: () => {\n setSelectedThemeId(previousThemeId);\n defaultToast(t(\"theme_update_failed\"), \"error\");\n },\n },\n );\n },\n [\n resolvedThemeId,\n selectedThemeId,\n updateSettingsMutation,\n refreshPreview,\n t,\n ],\n );\n\n const handleUpdateSlug = useCallback(\n async (slug: string) => {\n await new Promise<void>((resolve, reject) => {\n updateSettingsMutation.mutate(\n { slug },\n {\n onSuccess: () => resolve(),\n onError: () => reject(new Error(\"Failed\")),\n },\n );\n });\n },\n [updateSettingsMutation],\n );\n\n const handlePreview = useCallback(() => {\n if (mysiteUrl) window.open(`${mysiteUrl}?preview=true`, \"_blank\");\n }, [mysiteUrl]);\n\n const sectionLabel = useMemo(() => {\n if (editingSection === \"theme\") return t(\"nav_theme\");\n if (editingSection === \"buttons\") return t(\"nav_buttons\");\n if (editingSection === \"content\") return t(\"nav_content\");\n return \"\";\n }, [editingSection, t]);\n\n if (isProfileLoading) {\n return (\n <div className=\"flex h-full flex-col overflow-y-auto px-2 py-6 2xl:flex-row 2xl:overflow-hidden\">\n <div className=\"w-full px-4 2xl:w-2/3 2xl:shrink-0\">\n <div className=\"flex flex-col gap-5\">\n <div className=\"bg-muted h-7 w-32 animate-pulse rounded-md\" />\n <div className=\"bg-muted h-20 w-full animate-pulse rounded-lg\" />\n <div className=\"bg-muted h-16 w-full animate-pulse rounded-lg\" />\n <div className=\"bg-muted h-40 w-full animate-pulse rounded-lg\" />\n </div>\n </div>\n <div className=\"w-full shrink-0 overflow-y-hidden px-4 pt-5 2xl:h-full 2xl:w-1/3 2xl:overflow-y-auto 2xl:pt-0\">\n <div className=\"bg-muted flex h-full flex-col items-center gap-4 rounded-xl p-5\">\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"space-y-1\">\n <div className=\"bg-background/50 h-3 w-24 animate-pulse rounded\" />\n <div className=\"bg-background/50 h-4 w-28 animate-pulse rounded\" />\n </div>\n <div className=\"bg-background/50 h-8 w-20 animate-pulse rounded-md\" />\n </div>\n <div className=\"bg-background/50 h-[490px] w-[260px] animate-pulse rounded-[36px] sm:h-[600px] sm:w-[320px]\" />\n </div>\n </div>\n </div>\n );\n }\n\n const contentAnimClassName = getContentClassName(animPhase);\n const previewAnimClassName = getPreviewClassName(animPhase);\n\n return (\n <div className=\"flex h-full flex-col overflow-y-auto px-2 py-6 2xl:flex-row 2xl:overflow-hidden\">\n {/* Content column */}\n <div\n className={`w-full px-4 2xl:w-2/3 2xl:shrink-0 ${contentAnimClassName}`}\n >\n <div className=\"flex min-w-0 flex-col gap-5 2xl:h-full 2xl:overflow-y-auto\">\n {showEditContent && editingSection === \"theme\" ? (\n <MySiteThemeEditor\n themes={themes}\n selectedThemeId={resolvedThemeId}\n onSelectTheme={handleSelectTheme}\n isPending={updateSettingsMutation.isPending}\n onBack={onBackClick}\n />\n ) : showEditContent && editingSection === \"buttons\" ? (\n <PortalButtonsEditor\n onBack={onBackClick}\n onRefreshPreview={refreshPreview}\n onToast={defaultToast}\n />\n ) : showEditContent && editingSection === \"content\" ? (\n <PortalFavoritesEditor\n onBack={onBackClick}\n onRefreshPreview={refreshPreview}\n onToast={defaultToast}\n />\n ) : (\n <>\n {/* Header with optional back-to-section label */}\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-foreground text-xl font-bold\">\n {t(\"heading\")}\n </h1>\n {animPhase !== \"idle\" && sectionLabel && (\n <>\n <ChevronRight className=\"text-muted-foreground size-4\" />\n <span className=\"text-foreground text-xl font-bold\">\n {sectionLabel}\n </span>\n </>\n )}\n </div>\n\n <MySiteVisitorDetailsCard views={views} leads={leads} />\n\n <MySiteLinkCard\n mysiteUrl={mysiteUrl}\n displayUrl={displayUrl}\n onUpdateSlug={handleUpdateSlug}\n onToast={defaultToast}\n />\n\n <div className=\"border-border bg-card divide-border divide-y overflow-hidden rounded-lg border\">\n {navigationItems.map((item) => {\n const Icon = item.icon;\n const rowClassName =\n \"group hover:bg-muted flex w-full items-center gap-2.5 px-3 py-2.5 transition-colors text-left cursor-pointer\";\n const onClick =\n \"slug\" in item\n ? () => navigate(item.slug)\n : () => onEditSection(item.key);\n\n return (\n <button\n key={item.labelKey}\n type=\"button\"\n onClick={onClick}\n className={rowClassName}\n >\n <div className=\"bg-muted text-foreground flex size-7 shrink-0 items-center justify-center rounded-full\">\n <Icon className=\"size-3.5\" />\n </div>\n <span className=\"text-foreground flex-1 text-sm font-medium\">\n {t(item.labelKey)}\n </span>\n <ChevronRight className=\"text-muted-foreground size-3 shrink-0 transition-transform group-hover:translate-x-0.5\" />\n </button>\n );\n })}\n </div>\n </>\n )}\n </div>\n </div>\n\n {/* Preview column */}\n <div\n className={`w-full shrink-0 overflow-y-hidden px-4 pt-5 2xl:h-full 2xl:w-1/3 2xl:overflow-y-auto 2xl:pt-0 ${previewAnimClassName}`}\n >\n <MySitePhonePreview\n mysiteUrl={mysiteUrl}\n themeName={themeName}\n previewKey={previewKey}\n isUpdating={updateSettingsMutation.isPending}\n onPreview={handlePreview}\n />\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n type AnimPhase,\n type EditingSection,\n FADE_MS,\n SLIDE_MS,\n} from \"@fluid-app/mysite-ui/portal/components\";\n\nexport interface MySiteEditingSectionState {\n editingSection: EditingSection;\n animPhase: AnimPhase;\n showEditContent: boolean;\n handleEditSection: (section: EditingSection) => void;\n handleBackClick: () => void;\n}\n\nexport function useMySiteEditingSection(): MySiteEditingSectionState {\n const [animPhase, setAnimPhase] = useState<AnimPhase>(\"idle\");\n const [editingSection, setEditingSection] = useState<EditingSection>(null);\n const timeoutsRef = useRef<ReturnType<typeof setTimeout>[]>([]);\n\n useEffect(() => {\n const ref = timeoutsRef;\n return () => ref.current.forEach(clearTimeout);\n }, []);\n\n const cancelScheduled = useCallback(() => {\n timeoutsRef.current.forEach(clearTimeout);\n timeoutsRef.current = [];\n }, []);\n\n const schedule = useCallback((phase: AnimPhase, delay: number) => {\n const id = setTimeout(() => setAnimPhase(phase), delay);\n timeoutsRef.current.push(id);\n }, []);\n\n const showEditContent = [\n \"slide\",\n \"fade-in\",\n \"editing\",\n \"exit-fade-out\",\n \"exit-slide\",\n ].includes(animPhase);\n\n const handleEditSection = useCallback(\n (section: EditingSection) => {\n cancelScheduled();\n setEditingSection(section);\n setAnimPhase(\"fade-out\");\n schedule(\"slide\", FADE_MS);\n schedule(\"fade-in\", FADE_MS + SLIDE_MS);\n schedule(\"editing\", FADE_MS + SLIDE_MS + FADE_MS);\n },\n [cancelScheduled, schedule],\n );\n\n const handleBackClick = useCallback(() => {\n cancelScheduled();\n setAnimPhase(\"exit-fade-out\");\n schedule(\"exit-slide\", FADE_MS);\n schedule(\"exit-fade-in\", FADE_MS + SLIDE_MS);\n const id = setTimeout(\n () => {\n setAnimPhase(\"idle\");\n setEditingSection(null);\n },\n FADE_MS + SLIDE_MS + FADE_MS,\n );\n timeoutsRef.current.push(id);\n }, [cancelScheduled, schedule]);\n\n return {\n editingSection,\n animPhase,\n showEditContent,\n handleEditSection,\n handleBackClick,\n };\n}\n","import React, { useCallback, useMemo } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { useMysiteTranslation } from \"@fluid-app/mysite-core/translation-api-context\";\nimport type { WidgetPropertySchema } from \"../../registries/property-schema-types\";\nimport { MysiteTranslationBridge } from \"../../providers/MysiteTranslationBridge\";\nimport { MySiteMainView } from \"./MySiteMainView\";\nimport { useMySiteEditingSection } from \"./use-mysite-editing-section\";\nimport type { MySiteScreenProps } from \"./types\";\n\nexport type { MySiteScreenProps } from \"./types\";\nexport type { MeProfile } from \"./types\";\n\nexport function MySiteScreen({\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: MySiteScreenProps): React.JSX.Element {\n return (\n <MysiteTranslationBridge>\n <MySiteScreenContent {...divProps} />\n </MysiteTranslationBridge>\n );\n}\n\nfunction MySiteScreenContent(\n divProps: Omit<\n MySiteScreenProps,\n \"background\" | \"textColor\" | \"accentColor\" | \"padding\" | \"borderRadius\"\n >,\n): React.JSX.Element {\n const { t } = useMysiteTranslation();\n const {\n editingSection,\n animPhase,\n showEditContent,\n handleEditSection,\n handleBackClick,\n } = useMySiteEditingSection();\n\n const sectionLabel = useMemo(() => {\n if (editingSection === \"theme\") return t(\"nav_theme\");\n if (editingSection === \"buttons\") return t(\"nav_buttons\");\n if (editingSection === \"content\") return t(\"nav_content\");\n return null;\n }, [editingSection, t]);\n\n const handleRootCrumbClick = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n if (editingSection !== null) handleBackClick();\n },\n [editingSection, handleBackClick],\n );\n\n return (\n <>\n <ScreenHeaderBreadcrumbs>\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n {sectionLabel ? (\n <BreadcrumbLink href=\"#\" onClick={handleRootCrumbClick}>\n MySite\n </BreadcrumbLink>\n ) : (\n <BreadcrumbPage className=\"font-semibold\">\n MySite\n </BreadcrumbPage>\n )}\n </BreadcrumbItem>\n {sectionLabel && (\n <>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {sectionLabel}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </>\n )}\n </BreadcrumbList>\n </Breadcrumb>\n </ScreenHeaderBreadcrumbs>\n <div {...divProps} className={`h-full ${divProps.className ?? \"\"}`}>\n <MySiteMainView\n editingSection={editingSection}\n animPhase={animPhase}\n showEditContent={showEditContent}\n onEditSection={handleEditSection}\n onBackClick={handleBackClick}\n />\n </div>\n </>\n );\n}\n\nexport const mySiteScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"MySiteScreen\",\n displayName: \"MySite Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":";;;;;;;;;;;;;;;;AAKA,MAAM,EAAE,UAAU,gBAAgB,mBAChC,yBAAqC,SAAS;AAEhD,MAAa,4BACX;AACF,MAAa,uBAAuB;;;ACDpC,SAAgB,wBAAwB,EACtC,YAGoB;CACpB,MAAM,EAAE,WAAW,iBAAiB;CACpC,MAAM,OAAO,cAAc,cAAc,OAAO;AAKhD,QACE,oBAAC,2BAAD;EAA2B,OALjB,cACJ,+BAA+B,QAAQ,KAAK,EAClD,CAAC,QAAQ,KAAK,CACf;EAGI;EACyB,CAAA;;;;ACZhC,SAAgB,oBAAoB,OAA0B;AAC5D,SAAQ,OAAR;EACE,KAAK,OACH,QAAO;EACT,KAAK,WACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,UACH,QAAO;EACT,KAAK,UACH,QAAO;EACT,KAAK,gBACH,QAAO;EACT,KAAK,aACH,QAAO;EACT,KAAK,eACH,QAAO;;;AAIb,SAAgB,oBAAoB,OAA0B;AAC5D,SAAQ,OAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK,eACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,gBACH,QAAO;EACT,KAAK,aACH,QAAO;;;;;ACnCb,SAAgB,yBAAyB,EACvC,OACA,SAIoB;CACpB,MAAM,EAAE,MAAM,sBAAsB;AACpC,QACE,qBAAC,MAAD;EAAM,WAAU;YAAhB,CACE,oBAAC,YAAD;GAAY,WAAU;aACpB,oBAAC,WAAD;IAAW,WAAU;cAAW,EAAE,kBAAkB;IAAa,CAAA;GACtD,CAAA,EACb,qBAAC,aAAD;GAAa,WAAU;aAAvB;IACE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,KAAD,EAAK,WAAU,kCAAmC,CAAA,EAClD,oBAAC,QAAD;OAAM,WAAU;iBAAiC,EAAE,QAAQ;OAAQ,CAAA,CAC/D;SACN,oBAAC,KAAD;MAAG,WAAU;gBACV,MAAM,gBAAgB;MACrB,CAAA,CACA;;IACN,oBAAC,WAAD;KAAW,aAAY;KAAW,WAAU;KAA0B,CAAA;IACtE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,OAAD,EAAO,WAAU,kCAAmC,CAAA,EACpD,oBAAC,QAAD;OAAM,WAAU;iBAAiC,EAAE,QAAQ;OAAQ,CAAA,CAC/D;SACN,oBAAC,KAAD;MAAG,WAAU;gBACV,MAAM,gBAAgB;MACrB,CAAA,CACA;;IACM;KACT;;;;;AChCX,SAAgB,eAAe,EAC7B,WACA,YACA,cACA,WAMoB;CACpB,MAAM,EAAE,MAAM,sBAAsB;CACpC,MAAM,iBAAiB,WAAW,YAAY,IAAI;CAClD,MAAM,YACJ,kBAAkB,IAAI,WAAW,MAAM,GAAG,iBAAiB,EAAE,GAAG;CAClE,MAAM,cACJ,kBAAkB,IAAI,WAAW,MAAM,iBAAiB,EAAE,GAAG;CAE/D,MAAM,CAAC,eAAe,oBAAoB,SAAS,MAAM;CACzD,MAAM,CAAC,eAAe,oBAAoB,SAAS,YAAY;CAC/D,MAAM,CAAC,UAAU,eAAe,SAAS,MAAM;CAE/C,MAAM,iBAAiB,kBAAkB;AACvC,mBAAiB,YAAY;AAC7B,mBAAiB,KAAK;IACrB,CAAC,YAAY,CAAC;CAEjB,MAAM,uBAAuB,kBAAkB;AAC7C,mBAAiB,MAAM;AACvB,mBAAiB,YAAY;IAC5B,CAAC,YAAY,CAAC;CAEjB,MAAM,iBAAiB,YAAY,YAAY;EAC7C,MAAM,UAAU,cAAc,MAAM;AACpC,MAAI,CAAC,SAAS;AACZ,aAAU,EAAE,mBAAmB,EAAE,QAAQ;AACzC;;AAEF,MAAI,YAAY,aAAa;AAC3B,oBAAiB,MAAM;AACvB;;AAEF,MAAI,CAAC,aAAc;AACnB,cAAY,KAAK;AACjB,MAAI;AACF,SAAM,aAAa,QAAQ;AAC3B,aAAU,EAAE,eAAe,EAAE,UAAU;AACvC,oBAAiB,MAAM;UACjB;AACN,aAAU,EAAE,qBAAqB,EAAE,QAAQ;YACnC;AACR,eAAY,MAAM;;IAEnB;EAAC;EAAe;EAAa;EAAc;EAAS;EAAE,CAAC;CAE1D,MAAM,iBAAiB,YAAY,YAAY;AAC7C,MAAI,CAAC,UAAW;AAChB,MAAI;AACF,SAAM,UAAU,UAAU,UAAU,UAAU;AAC9C,aAAU,EAAE,cAAc,EAAE,UAAU;UAChC;AACN,aAAU,EAAE,mBAAmB,EAAE,QAAQ;;IAE1C;EAAC;EAAW;EAAS;EAAE,CAAC;AAE3B,QACE,qBAAC,MAAD;EAAM,WAAU;YAAhB,CACE,qBAAC,YAAD;GAAY,WAAU;aAAtB,CACE,oBAAC,WAAD;IAAW,WAAU;cAAW,EAAE,mBAAmB;IAAa,CAAA,EACjE,CAAC,iBAAiB,gBACjB,oBAAC,YAAD,EAAA,UACE,oBAAC,QAAD;IAAQ,SAAQ;IAAO,MAAK;IAAK,SAAS;cACvC,EAAE,YAAY;IACR,CAAA,EACE,CAAA,CAEJ;MACb,qBAAC,aAAD;GAAa,WAAU;aAAvB,CACE,qBAAC,OAAD;IAAK,WAAU;cAAf,CACG,gBACC,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,QAAD;KAAM,WAAU;eAAoB;KAAiB,CAAA,EACrD,oBAAC,SAAD;KACE,MAAK;KACL,OAAO;KACP,WAAW,MAAM,iBAAiB,EAAE,OAAO,MAAM;KACjD,YAAY,MAAM;AAChB,UAAI,EAAE,QAAQ,WAAW,CAAC,SAAU,iBAAgB;AACpD,UAAI,EAAE,QAAQ,SAAU,uBAAsB;;KAEhD,WAAU;KACV,WAAA;KACA,CAAA,CACD,EAAA,CAAA,GAEH,oBAAC,QAAD;KAAM,WAAU;eACb,cAAc,EAAE,iBAAiB;KAC7B,CAAA,EAET,oBAAC,QAAD;KACE,SAAQ;KACR,MAAK;KACL,SAAS;KACT,UAAU,CAAC;eAEX,oBAAC,MAAD,EAAM,WAAU,UAAW,CAAA;KACpB,CAAA,CACL;OAEN,oBAAC,OAAD;IACE,WAAU;IACV,OAAO;KACL,kBAAkB,gBAAgB,QAAQ;KAC1C,SAAS,gBAAgB,IAAI;KAC7B,WAAW,gBAAgB,KAAK;KACjC;cAED,oBAAC,OAAD;KAAK,WAAU;eACb,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,QAAD;OACE,SAAQ;OACR,MAAK;OACL,SAAS;iBAER,EAAE,SAAS;OACL,CAAA,EACT,oBAAC,QAAD;OAAQ,MAAK;OAAK,SAAS;OAAgB,UAAU;iBAClD,WAAW,EAAE,SAAS,GAAG,EAAE,OAAO;OAC5B,CAAA,CACL;;KACF,CAAA;IACF,CAAA,CACM;KACT;;;;;ACvIX,SAAgB,mBAAmB,EACjC,WACA,WACA,YACA,YACA,aAOoB;CACpB,MAAM,EAAE,MAAM,sBAAsB;CACpC,MAAM,YAAY,OAA0B,KAAK;CACjD,MAAM,aAAa,GAAG,UAAU;CAChC,MAAM,mBAAmB,OAAO,KAAK;AAErC,iBAAgB;AACd,mBAAiB,UAAU;IAC1B,CAAC,WAAW,CAAC;CAEhB,MAAM,yBAAyB;AAC7B,MAAI,iBAAiB,SAAS;AAC5B,oBAAiB,UAAU;AAC3B;;EAEF,MAAM,SAAS,UAAU;AACzB,MAAI,CAAC,OAAQ;AACb,mBAAiB,UAAU;AAC3B,SAAO,MAAM;;AAGf,QACE,qBAAC,MAAD;EAAM,WAAU;YAAhB,CACE,qBAAC,YAAD;GAAY,WAAU;aAAtB,CACE,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,KAAD;IAAG,WAAU;cAAiC,EAAE,gBAAgB;IAAK,CAAA,EACrE,oBAAC,KAAD;IAAG,WAAU;cAAyC;IAAc,CAAA,CAChE,EAAA,CAAA,EACN,oBAAC,QAAD;IACE,WAAU;IACV,SAAQ;IACR,MAAK;IACL,SAAS;IACT,UAAU,CAAC;cAEV,EAAE,UAAU;IACN,CAAA,CACE;MAEb,qBAAC,aAAD;GAAa,WAAU;aAAvB,CACE,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,QAAD;MAAM,WAAU;gBAAwD;MAEjE,CAAA,EACP,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,OAAD,EAAK,WAAU,yDAA0D,CAAA,EACzE,oBAAC,OAAD,EAAK,WAAU,uDAAwD,CAAA,CACnE;QACF;QAEN,oBAAC,OAAD;KACE,WAAU;KACV,OAAO,EAAE,gBAAgB,QAAQ;KACjC,aAAW;eAEV,YACC,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,UAAD;MACE,KAAK;MAEL,WAAU;MACV,KAAK;MACL,OAAO,EAAE,iBAAiB;MAC1B,UAAU;MAKV,SAAQ;MACR,QAAQ;MACR,EAXK,WAWL,EACD,cACC,oBAAC,OAAD;MAAK,WAAU;gBACb,oBAAC,cAAD,EAAc,WAAU,6CAA8C,CAAA;MAClE,CAAA,CAEP,EAAA,CAAA,GAEH,oBAAC,OAAD;MAAK,WAAU;gBACb,oBAAC,KAAD;OAAG,WAAU;iBACV,EAAE,qBAAqB;OACtB,CAAA;MACA,CAAA;KAEJ,CAAA,CACF;OAEN,oBAAC,OAAD,EAAK,WAAU,oGAAqG,CAAA,CACxG;KACT;;;;;ACnGX,SAAgB,kBAA8C,EAC5D,QACA,iBACA,eACA,WACA,UAOoB;CACpB,MAAM,EAAE,MAAM,sBAAsB;AACpC,QACE,qBAAA,YAAA,EAAA,UAAA,CACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,QAAD;GAAQ,SAAQ;GAAQ,MAAK;GAAO,SAAS;aAC3C,oBAAC,WAAD,EAAW,WAAU,UAAW,CAAA;GACzB,CAAA,EACT,oBAAC,MAAD;GAAI,WAAU;aACX,EAAE,iBAAiB;GACjB,CAAA,CACD;KAEL,OAAO,WAAW,IACjB,oBAAC,MAAD,EAAA,UACE,oBAAC,aAAD;EAAa,WAAU;YACrB,oBAAC,KAAD;GAAG,WAAU;aAAyB,EAAE,sBAAsB;GAAK,CAAA;EACvD,CAAA,EACT,CAAA,GAEP,oBAAC,OAAD;EAAK,WAAU;YACZ,OAAO,KAAK,UAAU;GACrB,MAAM,aAAa,MAAM,OAAO;GAChC,MAAM,WAAW,MAAM,eAAe,MAAM;AAC5C,UACE,qBAAC,UAAD;IAEE,MAAK;IACL,eAAe,cAAc,MAAM;IACnC,WAAW,GACT,4IACA,aACI,uCACA,iDACL;IACD,gBAAc;IACd,UAAU;cAXZ,CAaE,qBAAC,OAAD;KAAK,WAAU;eAAf;MACG,WACC,oBAAC,OAAD;OACE,KAAK;OACL,KAAK,MAAM;OACX,SAAQ;OACR,WAAU;OACV,CAAA,GAEF,oBAAC,OAAD;OAAK,WAAU;iBACb,oBAAC,SAAD,EAAS,WAAU,UAAW,CAAA;OAC1B,CAAA;MAEP,cACC,oBAAC,OAAD;OAAK,WAAU;iBACb,oBAAC,OAAD;QAAK,WAAU;kBACb,oBAAC,OAAD,EAAO,WAAU,UAAW,CAAA;QACxB,CAAA;OACF,CAAA;MAEP,CAAC,cACA,oBAAC,OAAD,EAAK,WAAU,mEAAoE,CAAA;MAEjF;QACN,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,KAAD;MACE,WAAW,GACT,gCACA,aAAa,iBAAiB,kBAC/B;gBAEA,MAAM;MACL,CAAA;KACA,CAAA,CACC;MA9CF,MAAM,GA8CJ;IAEX;EACE,CAAA,CAEP,EAAA,CAAA;;;;ACnGP,MAAa,aAAa,EAAE,OAAO;CACjC,IAAI,EAAE,QAAQ;CACd,KAAK,EAAE,QAAQ;CACf,MAAM,EAAE,QAAQ;CAChB,OAAO,EAAE,QAAQ;CACjB,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE;CACzC,CAAC;AAEiC,EAAE,MAAM,WAAW;AAKtD,MAAa,qBAAqB,EAC/B,OAAO;CACN,IAAI,EAAE,QAAQ;CACd,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU;CACvC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU;CACtC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU;CAC3C,MAAM,EAAE,QAAQ,CAAC,UAAU;CAC5B,CAAC,CACD,aAAa;AAEhB,MAAa,iBAAiB,EAC3B,OAAO;CACN,IAAI,EAAE,QAAQ;CACd,iBAAiB,EAAE,QAAQ,CAAC,UAAU;CACtC,mBAAmB,EAAE,QAAQ;CAC7B,OAAO,EAAE,QAAQ;CACjB,iBAAiB,EAAE,QAAQ,CAAC,UAAU;CACtC,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,cAAc,mBAAmB,UAAU;CAC5C,CAAC,CACD,aAAa;AAEuB,EAAE,MAAM,eAAe;AAKpB,EACvC,OAAO,EACN,IAAI,EAAE,QAAQ,EACf,CAAC,CACD,aAAa;AAG2B,EAAE,OAAO;CAClD,IAAI,EAAE,QAAQ;CACd,KAAK,EAAE,QAAQ,CAAC,UAAU;CAC1B,UAAU,EAAE,QAAQ,CAAC,UAAU;CAC/B,SAAS,EAAE,QAAQ,CAAC,UAAU;CAC9B,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,SAAS,EAAE,QAAQ,CAAC,UAAU;CAC9B,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;CAC/B,UAAU,EAAE,QAAQ,CAAC,UAAU;CAC/B,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,WAAW,EAAE,QAAQ,CAAC,UAAU;CACjC,CAAC;;;AC5CF,MAAa,cAAsC,EAAE,OAAO;CAC1D,IAAI,EAAE,QAAQ;CACd,MAAM,EAAE,QAAQ;CAChB,aAAa,EAAE,QAAQ,CAAC,UAAU;CAClC,QAAQ,EAAE,SAAS;CACnB,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,kBAAkB,EAAE,QAAQ,CAAC,SAAS;CACtC,+BAA+B,EAAE,QAAQ,CAAC,UAAU;CACpD,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,UAAU;CAC3C,CAAC;AAGA,EAAE,MAAM,YAAY;AAatB,MAAM,4BAA4D,EAAE,OAAO;CACzE,IAAI,EAAE,QAAQ;CACd,MAAM,EAAE,QAAQ;CAChB,SAAS,EAAE,QAAQ,CAAC,UAAU;CAC9B,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,MAAM,EAAE,QAAQ,CAAC,UAAU;CAC3B,QAAQ,EAAE,QAAQ;CACnB,CAAC;AAgBgE,EAAE,OAAO,EACzE,MAAM,EAAE,OAAO,EACb,cAAc,EAAE,OAAO;CACrB,IAAI,EAAE,QAAQ;CACd,MAAM,EAAE,QAAQ;CAChB,aAAa,EAAE,QAAQ,CAAC,UAAU;CAClC,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,QAAQ,EAAE,SAAS;CACnB,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,UAAU;CACX,CAAC,EACH,CAAC,EACH,CAAC;;;;;;;;;;AC1DF,SAAgB,wBAAwB,KAAqB;AAC3D,KAAI,CAAC,IAAK,QAAO;AACjB,KAAI;EACF,MAAM,SAAS,IAAI,IAAI,IAAI;AAC3B,MAAI,CAAC,OAAO,aAAa,IAAI,YAAY,CAAE,QAAO;AAClD,SAAO,aAAa,OAAO,YAAY;AACvC,SAAO,OAAO,UAAU;SAClB;AACN,SAAO;;;AAIX,SAAgB,aAAa,OAAuB;CAClD,MAAM,UAAU,MAAM,MAAM;AAC5B,KAAI,CAAC,QAAS,QAAO;AACrB,KAAI,gBAAgB,KAAK,QAAQ,CAAE,QAAO;AAC1C,QAAO,WAAW;;;;ACGpB,SAAS,mBAAmB,GAAiD;AAC3E,QAAO,EAAE,OAAO;EACd,OAAO,EAAE,QAAQ,CAAC,IAAI,GAAG,EAAE,kCAAkC,CAAC;EAC9D,KAAK,EACF,QAAQ,CACR,UAAU,aAAa,CACvB,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;EACrD,CAAC;;AAKJ,SAAS,mBAAmB,EAC1B,MACA,QACA,YAKC;CACD,MAAM,EAAE,MAAM,sBAAsB;CACpC,MAAM,EACJ,YACA,WACA,YACA,WACA,YACA,eACE,YAAY,EAAE,IAAI,KAAK,IAAI,CAAC;CAEhC,MAAM,QAAQ;EACZ,WAAW,IAAI,UAAU,SAAS,UAAU;EAC5C;EACD;CAED,MAAM,aAAa,wBAAwB,KAAK,IAAI;CACpD,MAAM,eACJ,WAAW,SAAS,KAAK,GAAG,WAAW,UAAU,GAAG,GAAG,CAAC,OAAO;AAEjE,QACE,qBAAC,OAAD;EACE,KAAK;EACE;EACP,WAAW,8EACT,aAAa,yBAAyB;YAJ1C;GAOE,oBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,cAAY,EAAE,kBAAkB;IAChC,GAAI;IACJ,GAAI;cAEJ,oBAAC,cAAD,EAAc,WAAU,UAAW,CAAA;IAC5B,CAAA;GAET,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,KAAD;KAAG,WAAU;eAAwC,KAAK;KAAU,CAAA,EACpE,oBAAC,KAAD;KAAG,WAAU;eAA0C;KAAiB,CAAA,CACpE;;GAEN,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,QAAD;KACE,SAAQ;KACR,MAAK;KACL,WAAU;KACV,eAAe,OAAO,KAAK;KAC3B,cAAY,EAAE,mBAAmB;eAEjC,oBAAC,QAAD,EAAQ,WAAU,UAAW,CAAA;KACtB,CAAA,EACT,oBAAC,QAAD;KACE,SAAQ;KACR,MAAK;KACL,WAAU;KACV,eAAe,SAAS,KAAK;KAC7B,cAAY,EAAE,qBAAqB;eAEnC,oBAAC,QAAD,EAAQ,WAAU,UAAW,CAAA;KACtB,CAAA,CACL;;GACF;;;;;;;AAQV,SAAgB,oBAAoB,EAClC,QACA,kBACA,WAKoB;AACpB;CACA,MAAM,EAAE,MAAM,sBAAsB;CACpC,MAAM,EAAE,aAAa,YAAY;CACjC,MAAM,SAAS,cAAc,mBAAmB,EAAE,EAAE,CAAC,EAAE,CAAC;CACxD,MAAM,EAAE,MAAM,QAAQ,EAAE,EAAE,cAAc,gBAAgB;CACxD,MAAM,qBAAqB,qBAAqB;CAChD,MAAM,qBAAqB,qBAAqB;CAChD,MAAM,qBAAqB,qBAAqB;CAChD,MAAM,uBAAuB,uBAAuB;CAEpD,MAAM,CAAC,qBAAqB,0BAA0B,SAAS,MAAM;CACrE,MAAM,CAAC,aAAa,kBAAkB,SAA4B,KAAK;CACvE,MAAM,CAAC,oBAAoB,yBAAyB,SAAS,MAAM;CACnE,MAAM,CAAC,cAAc,mBAAmB,SAA4B,KAAK;CAEzE,MAAM,EACJ,UACA,cAAc,oBACd,OAAO,iBACP,WAAW,EAAE,QAAQ,cAAc,cAAc,yBAC/C,WAA2B,QAAQ,EACrC,eAAe;EAAE,OAAO;EAAI,KAAK;EAAI,EACtC,CAAC;CAEF,MAAM,UAAU,WACd,UAAU,cAAc,EACxB,UAAU,gBAAgB,EACxB,kBAAkB,6BACnB,CAAC,CACH;CAED,MAAM,sBAAsB,kBAAkB;AAC5C,iBAAe,KAAK;AACpB,kBAAgB;GAAE,OAAO;GAAI,KAAK;GAAI,CAAC;AACvC,yBAAuB,KAAK;IAC3B,CAAC,gBAAgB,CAAC;CAErB,MAAM,uBAAuB,aAC1B,SAAqB;AACpB,iBAAe,KAAK;AACpB,kBAAgB;GACd,OAAO,KAAK;GACZ,KAAK,wBAAwB,KAAK,IAAI;GACvC,CAAC;AACF,yBAAuB,KAAK;IAE9B,CAAC,gBAAgB,CAClB;CAED,MAAM,2BAA2B,kBAAkB;AACjD,yBAAuB,MAAM;AAC7B,iBAAe,KAAK;AACpB,kBAAgB;GAAE,OAAO;GAAI,KAAK;GAAI,CAAC;IACtC,CAAC,gBAAgB,CAAC;CAErB,MAAM,iBAAiB,aACpB,SAAyB;AACxB,MAAI,YACF,oBAAmB,OACjB;GACE,QAAQ,YAAY;GACpB,MAAM;IAAE,OAAO,KAAK;IAAO,KAAK,KAAK;IAAK;GAC3C,EACD;GACE,iBAAiB;AACf,cAAU,EAAE,iBAAiB,EAAE,UAAU;AACzC,8BAA0B;AAC1B,wBAAoB;;GAEtB,eAAe;AACb,cAAU,EAAE,uBAAuB,EAAE,QAAQ;;GAEhD,CACF;MAED,oBAAmB,OACjB;GAAE,OAAO,KAAK;GAAO,KAAK,KAAK;GAAK,EACpC;GACE,iBAAiB;AACf,cAAU,EAAE,iBAAiB,EAAE,UAAU;AACzC,8BAA0B;AAC1B,wBAAoB;;GAEtB,eAAe;AACb,cAAU,EAAE,uBAAuB,EAAE,QAAQ;;GAEhD,CACF;IAGL;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;CAED,MAAM,yBAAyB,aAAa,SAAqB;AAC/D,kBAAgB,KAAK;AACrB,wBAAsB,KAAK;IAC1B,EAAE,CAAC;CAEN,MAAM,0BAA0B,kBAAkB;AAChD,wBAAsB,MAAM;AAC5B,kBAAgB,KAAK;IACpB,EAAE,CAAC;CAEN,MAAM,sBAAsB,kBAAkB;AAC5C,MAAI,aACF,oBAAmB,OAAO,aAAa,IAAI;GACzC,iBAAiB;AACf,cAAU,EAAE,iBAAiB,EAAE,UAAU;AACzC,6BAAyB;AACzB,wBAAoB;;GAEtB,eAAe;AACb,cAAU,EAAE,uBAAuB,EAAE,QAAQ;;GAEhD,CAAC;IAEH;EACD;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,gBAAgB,aACnB,UAAwB;EACvB,MAAM,EAAE,QAAQ,SAAS;AACzB,MAAI,QAAQ,OAAO,OAAO,KAAK,IAAI;GAGjC,MAAM,YAAY,UAAU,OAFX,MAAM,WAAW,MAAM,EAAE,OAAO,OAAO,GAAG,EAC1C,MAAM,WAAW,MAAM,EAAE,OAAO,KAAK,GAAG,CACH;GACtD,MAAM,aAAa,UAAU,KAAK,SAAS,KAAK,GAAG;AACnD,wBAAqB,OACnB;IAAE;IAAY,iBAAiB;IAAW,EAC1C;IACE,iBAAiB;AACf,yBAAoB;;IAEtB,eAAe;AACb,eAAU,EAAE,yBAAyB,EAAE,QAAQ;;IAElD,CACF;;IAGL;EAAC;EAAO;EAAsB;EAAkB;EAAS;EAAE,CAC5D;AAED,QACE,qBAAA,YAAA,EAAA,UAAA;EACE,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,QAAD;KAAQ,SAAQ;KAAQ,MAAK;KAAO,SAAS;eAC3C,oBAAC,WAAD,EAAW,WAAU,UAAW,CAAA;KACzB,CAAA,EACT,oBAAC,MAAD;KAAI,WAAU;eACX,EAAE,kBAAkB;KAClB,CAAA,CACD;OACN,qBAAC,QAAD;IAAQ,MAAK;IAAK,SAAS;cAA3B,CACE,oBAAC,MAAD,EAAM,WAAU,eAAgB,CAAA,EAC/B,EAAE,aAAa,CACT;MACL;;EAEL,YACC,oBAAC,OAAD;GAAK,WAAU;aACZ,MAAM,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG,MACjC,qBAAC,OAAD;IAEE,WAAU;cAFZ;KAIE,oBAAC,UAAD,EAAU,WAAU,UAAW,CAAA;KAC/B,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,UAAD,EAAU,WAAU,YAAa,CAAA,EACjC,oBAAC,UAAD,EAAU,WAAU,YAAa,CAAA,CAC7B;;KACN,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,UAAD,EAAU,WAAU,UAAW,CAAA,EAC/B,oBAAC,UAAD,EAAU,WAAU,UAAW,CAAA,CAC3B;;KACF;MAZC,EAYD,CACN;GACE,CAAA,GACJ,MAAM,WAAW,IACnB,qBAAC,MAAD;GAAM,WAAU;aAAhB,CACE,oBAAC,KAAD;IAAG,WAAU;cAA8B,EAAE,mBAAmB;IAAK,CAAA,EACrE,qBAAC,QAAD;IAAQ,MAAK;IAAK,SAAS;cAA3B,CACE,oBAAC,MAAD,EAAM,WAAU,eAAgB,CAAA,EAC/B,EAAE,aAAa,CACT;MACJ;OAEP,oBAAC,YAAD;GACW;GACT,oBAAoB;GACpB,WAAW;aAEX,oBAAC,iBAAD;IACE,OAAO,MAAM,KAAK,MAAM,EAAE,GAAG;IAC7B,UAAU;cAEV,oBAAC,OAAD;KAAK,WAAU;eACZ,MAAM,KAAK,SACV,oBAAC,oBAAD;MAEQ;MACN,QAAQ;MACR,UAAU;MACV,EAJK,KAAK,GAIV,CACF;KACE,CAAA;IACU,CAAA;GACP,CAAA;EAIf,oBAAC,kBAAD;GACE,MAAM;GACN,cAAc;GACd,OAAO,cAAc,EAAE,qBAAqB,GAAG,EAAE,oBAAoB;GACrE,cAAc,WAAW,iBAAiB;aAE1C,qBAAC,QAAD;IACE,UAAU,mBAAmB,eAAe;IAC5C,WAAU;cAFZ;KAIE,qBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,oBAAC,OAAD;QAAO,SAAQ;kBAAS,EAAE,oBAAoB;QAAS,CAAA;OACvD,oBAAC,OAAD;QACE,IAAG;QACH,aAAa,EAAE,0BAA0B;QACzC,GAAI,SAAS,QAAQ;QACrB,WAAW,aAAa,QAAQ,uBAAuB;QACvD,CAAA;OACD,aAAa,SACZ,oBAAC,KAAD;QAAG,WAAU;kBACV,aAAa,MAAM;QAClB,CAAA;OAEF;;KACN,qBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,oBAAC,OAAD;QAAO,SAAQ;kBAAO,EAAE,YAAY;QAAS,CAAA;OAC7C,oBAAC,OAAD;QACE,IAAG;QACH,aAAa,EAAE,kBAAkB;QACjC,GAAI,SAAS,MAAM;QACnB,WAAW,aAAa,MAAM,uBAAuB;QACrD,CAAA;OACD,aAAa,OACZ,oBAAC,KAAD;QAAG,WAAU;kBACV,aAAa,IAAI;QAChB,CAAA;OAEF;;KACN,qBAAC,cAAD;MAAc,WAAU;gBAAxB,CACG,cACC,qBAAC,QAAD;OACE,MAAK;OACL,SAAQ;OACR,eAAe;AACb,kCAA0B;AAC1B,+BAAuB,YAAY;;iBALvC,CAQE,oBAAC,QAAD,EAAQ,WAAU,eAAgB,CAAA,EACjC,EAAE,SAAS,CACL;WAET,oBAAC,OAAD,EAAO,CAAA,EAET,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,oBAAC,QAAD;QACE,MAAK;QACL,SAAQ;QACR,SAAS;kBAER,EAAE,SAAS;QACL,CAAA,EACT,oBAAC,QAAD;QACE,MAAK;QACL,UACE,sBACA,mBAAmB,aACnB,mBAAmB;kBAGpB,sBACD,mBAAmB,aACnB,mBAAmB,YACf,EAAE,SAAS,GACX,EAAE,OAAO;QACN,CAAA,CACL;SACO;;KACV;;GACU,CAAA;EAGnB,qBAAC,kBAAD;GACE,MAAM;GACN,cAAc;GACd,OAAO,EAAE,uBAAuB;GAChC,cAAc,WAAW,iBAAiB;GAC1C,MAAK;aALP,CAOE,oBAAC,KAAD;IAAG,WAAU;cACV,EAAE,yBAAyB,EAC1B,MAAM,cAAc,SAAS,IAC9B,CAAC;IACA,CAAA,EACJ,qBAAC,cAAD,EAAA,UAAA,CACE,oBAAC,QAAD;IACE,MAAK;IACL,SAAQ;IACR,SAAS;cAER,EAAE,SAAS;IACL,CAAA,EACT,oBAAC,QAAD;IACE,MAAK;IACL,SAAQ;IACR,SAAS;IACT,UAAU,mBAAmB;cAE5B,mBAAmB,YAAY,EAAE,WAAW,GAAG,EAAE,SAAS;IACpD,CAAA,CACI,EAAA,CAAA,CACE;;EAClB,EAAA,CAAA;;;;AClcP,MAAM,kBAGF;CACF,QAAQ;CACR,SAAS;CACT,gBAAgB;CAChB,MAAM;CACP;AAED,SAAS,qBAAqB,EAC5B,UACA,YAIC;CACD,MAAM,EAAE,MAAM,sBAAsB;CACpC,MAAM,EACJ,YACA,WACA,YACA,WACA,YACA,eACE,YAAY,EAAE,IAAI,SAAS,IAAI,CAAC;CAEpC,MAAM,QAAQ;EACZ,WAAW,IAAI,UAAU,SAAS,UAAU;EAC5C;EACD;CAED,MAAM,QAAQ,SAAS,QAAQ,EAAE,WAAW;CAC5C,MAAM,WAAW,SAAS;CAC1B,MAAM,eAAe,gBAAgB,SAAS;CAC9C,MAAM,YACJ,SAAS,sBAAsB,YAC3B,eACE,EAAE,aAAa,GACf,SAAS,oBACX;AAEN,QACE,qBAAC,OAAD;EACE,KAAK;EACE;EACP,WAAW,8EACT,aAAa,yBAAyB;YAJ1C;GAOE,oBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,cAAY,EAAE,kBAAkB;IAChC,GAAI;IACJ,GAAI;cAEJ,oBAAC,cAAD,EAAc,WAAU,UAAW,CAAA;IAC5B,CAAA;GAET,oBAAC,OAAD;IAAK,WAAU;cACZ,WACC,oBAAC,OAAD;KACE,KAAK;KACL,KAAK;KACL,SAAQ;KACR,OAAO;KACP,QAAQ;KACR,WAAU;KACV,CAAA,GAEF,oBAAC,OAAD;KAAK,WAAU;eACZ,EAAE,WAAW;KACV,CAAA;IAEJ,CAAA;GAEN,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,KAAD;KAAG,WAAU;eAAwC;KAAU,CAAA,EAC9D,YACC,oBAAC,QAAD;KAAM,WAAU;eAAiC;KAAiB,CAAA,GAChE,KACA;;GAEN,oBAAC,OAAD;IAAK,WAAU;cACb,oBAAC,QAAD;KACE,SAAQ;KACR,MAAK;KACL,WAAU;KACV,eAAe,SAAS,SAAS;KACjC,cAAY,EAAE,uBAAuB;eAErC,oBAAC,QAAD,EAAQ,WAAU,UAAW,CAAA;KACtB,CAAA;IACL,CAAA;GACF;;;;;;;AAQV,SAAgB,sBAAsB,EACpC,QACA,kBACA,WAKoB;CACpB,MAAM,EAAE,MAAM,sBAAsB;CACpC,MAAM,EAAE,aAAa,YAAY;CACjC,MAAM,EAAE,MAAM,YAAY,EAAE,EAAE,cAAc,oBAAoB;CAChE,MAAM,yBAAyB,yBAAyB;CACxD,MAAM,2BAA2B,2BAA2B;CAE5D,MAAM,CAAC,4BAA4B,iCACjC,SAAS,MAAM;CACjB,MAAM,CAAC,kBAAkB,uBACvB,SAAgC,KAAK;CAEvC,MAAM,UAAU,WACd,UAAU,cAAc,EACxB,UAAU,gBAAgB,EACxB,kBAAkB,6BACnB,CAAC,CACH;CAED,MAAM,iCAAiC,aACpC,aAA6B;AAC5B,sBAAoB,SAAS;AAC7B,gCAA8B,KAAK;IAErC,EAAE,CACH;CAED,MAAM,kCAAkC,kBAAkB;AACxD,gCAA8B,MAAM;AACpC,sBAAoB,KAAK;IACxB,EAAE,CAAC;CAEN,MAAM,8BAA8B,kBAAkB;AACpD,MAAI,iBACF,wBAAuB,OAAO,iBAAiB,IAAI;GACjD,iBAAiB;AACf,cAAU,EAAE,kBAAkB,EAAE,UAAU;AAC1C,qCAAiC;AACjC,wBAAoB;;GAEtB,eAAe;AACb,cAAU,EAAE,wBAAwB,EAAE,QAAQ;;GAEjD,CAAC;IAEH;EACD;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,wBAAwB,aAC3B,UAAwB;EACvB,MAAM,EAAE,QAAQ,SAAS;AACzB,MAAI,QAAQ,OAAO,OAAO,KAAK,IAAI;GAGjC,MAAM,YAAY,UAAU,WAFX,UAAU,WAAW,MAAM,EAAE,OAAO,OAAO,GAAG,EAC9C,UAAU,WAAW,MAAM,EAAE,OAAO,KAAK,GAAG,CACH;GAC1D,MAAM,aAAa,UAAU,KAAK,QAAQ,IAAI,GAAG;AACjD,4BAAyB,OACvB;IAAE;IAAY,iBAAiB;IAAW,EAC1C;IACE,iBAAiB;AACf,yBAAoB;;IAEtB,eAAe;AACb,eAAU,EAAE,yBAAyB,EAAE,QAAQ;;IAElD,CACF;;IAGL;EAAC;EAAW;EAA0B;EAAkB;EAAS;EAAE,CACpE;AAED,QACE,qBAAA,YAAA,EAAA,UAAA;EACE,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,QAAD;IAAQ,SAAQ;IAAQ,MAAK;IAAO,SAAS;cAC3C,oBAAC,WAAD,EAAW,WAAU,UAAW,CAAA;IACzB,CAAA,EACT,oBAAC,MAAD;IAAI,WAAU;cACX,EAAE,kBAAkB;IAClB,CAAA,CACD;;EAEL,YACC,oBAAC,OAAD;GAAK,WAAU;aACZ,MAAM,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG,MACjC,qBAAC,OAAD;IAEE,WAAU;cAFZ;KAIE,oBAAC,UAAD,EAAU,WAAU,UAAW,CAAA;KAC/B,oBAAC,UAAD,EAAU,WAAU,sBAAuB,CAAA;KAC3C,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,UAAD,EAAU,WAAU,YAAa,CAAA,EACjC,oBAAC,UAAD,EAAU,WAAU,YAAa,CAAA,CAC7B;;KACN,oBAAC,UAAD,EAAU,WAAU,UAAW,CAAA;KAC3B;MAVC,EAUD,CACN;GACE,CAAA,GACJ,UAAU,WAAW,IACvB,oBAAC,MAAD;GAAM,WAAU;aACd,oBAAC,KAAD;IAAG,WAAU;cAAyB,EAAE,mBAAmB;IAAK,CAAA;GAC3D,CAAA,GAEP,oBAAC,YAAD;GACW;GACT,oBAAoB;GACpB,WAAW;aAEX,oBAAC,iBAAD;IACE,OAAO,UAAU,KAAK,MAAM,EAAE,GAAG;IACjC,UAAU;cAEV,oBAAC,OAAD;KAAK,WAAU;eACZ,UAAU,KAAK,QACd,oBAAC,sBAAD;MAEE,UAAU;MACV,UAAU;MACV,EAHK,IAAI,GAGT,CACF;KACE,CAAA;IACU,CAAA;GACP,CAAA;EAIf,qBAAC,kBAAD;GACE,MAAM;GACN,cAAc;GACd,OAAO,EAAE,wBAAwB;GACjC,cAAc,WAAW,iBAAiB;GAC1C,MAAK;aALP,CAOE,oBAAC,KAAD;IAAG,WAAU;cACV,EAAE,0BAA0B,EAC3B,MAAM,kBAAkB,QAAQ,EAAE,WAAW,EAC9C,CAAC;IACA,CAAA,EACJ,qBAAC,cAAD,EAAA,UAAA,CACE,oBAAC,QAAD;IACE,MAAK;IACL,SAAQ;IACR,SAAS;cAER,EAAE,SAAS;IACL,CAAA,EACT,oBAAC,QAAD;IACE,MAAK;IACL,SAAQ;IACR,SAAS;IACT,UAAU,uBAAuB;cAEhC,uBAAuB,YAAY,EAAE,WAAW,GAAG,EAAE,SAAS;IACxD,CAAA,CACI,EAAA,CAAA,CACE;;EAClB,EAAA,CAAA;;;;AC9QP,MAAM,kBAA6B;CACjC;EAAE,UAAU;EAAe,MAAM;EAAW,MAAM;EAAM;CACxD;EAAE,UAAU;EAAa,KAAK;EAAS,MAAM;EAAS;CACtD;EAAE,UAAU;EAAe,KAAK;EAAW,MAAM;EAAY;CAC7D;EAAE,UAAU;EAAe,KAAK;EAAW,MAAM;EAAO;CACzD;AAED,SAAS,aAAa,SAAiB,MAA2B;AAChE,YAAW;EAAE,OAAO;EAAS;EAAM,CAAC;;AAWtC,SAAgB,eAAe,EAC7B,gBACA,WACA,iBACA,eACA,eACyC;CACzC,MAAM,EAAE,MAAM,sBAAsB;CACpC,MAAM,EAAE,aAAa,kBAAkB;CACvC,MAAM,EAAE,MAAM,SAAS,WAAW,qBAChC,wBAAwB;CAC1B,MAAM,EAAE,MAAM,SAAS,EAAE,KAAK,uBAAuB;CACrD,MAAM,yBAAyB,yBAAyB;CAExD,MAAM,CAAC,YAAY,iBAAiB,SAAS,EAAE;CAC/C,MAAM,iBAAiB,kBAAkB,eAAe,MAAM,IAAI,EAAE,EAAE,EAAE,CAAC;CAEzE,MAAM,CAAC,iBAAiB,sBAAsB,SAAwB,KAAK;CAE3E,MAAM,kBACJ,mBACA,SAAS,YACT,OAAO,MAAM,MAAM,EAAE,SAAS,UAAU,EAAE,MAC1C,OAAO,IAAI,MACX;CAGF,MAAM,YADe,OAAO,MAAM,MAAM,EAAE,OAAO,gBAAgB,EACjC,QAAQ;CAExC,MAAM,YAAY,SAAS,cAAc;CACzC,MAAM,aAAa,YAAY,UAAU,QAAQ,gBAAgB,GAAG,GAAG;CACvE,MAAM,QAAQ,SAAS,gBAAgB;CACvC,MAAM,QAAQ,SAAS,gBAAgB;CAEvC,MAAM,oBAAoB,aACvB,UAAuB;AACtB,MAAI,MAAM,OAAO,gBAAiB;EAClC,MAAM,kBAAkB;AACxB,qBAAmB,MAAM,GAAG;AAC5B,yBAAuB,OACrB,EAAE,UAAU,MAAM,IAAI,EACtB;GACE,iBAAiB;AACf,iBAAa,EAAE,iBAAiB,EAAE,MAAM,MAAM,MAAM,CAAC,EAAE,UAAU;AACjE,oBAAgB;;GAElB,eAAe;AACb,uBAAmB,gBAAgB;AACnC,iBAAa,EAAE,sBAAsB,EAAE,QAAQ;;GAElD,CACF;IAEH;EACE;EACA;EACA;EACA;EACA;EACD,CACF;CAED,MAAM,mBAAmB,YACvB,OAAO,SAAiB;AACtB,QAAM,IAAI,SAAe,SAAS,WAAW;AAC3C,0BAAuB,OACrB,EAAE,MAAM,EACR;IACE,iBAAiB,SAAS;IAC1B,eAAe,uBAAO,IAAI,MAAM,SAAS,CAAC;IAC3C,CACF;IACD;IAEJ,CAAC,uBAAuB,CACzB;CAED,MAAM,gBAAgB,kBAAkB;AACtC,MAAI,UAAW,QAAO,KAAK,GAAG,UAAU,gBAAgB,SAAS;IAChE,CAAC,UAAU,CAAC;CAEf,MAAM,eAAe,cAAc;AACjC,MAAI,mBAAmB,QAAS,QAAO,EAAE,YAAY;AACrD,MAAI,mBAAmB,UAAW,QAAO,EAAE,cAAc;AACzD,MAAI,mBAAmB,UAAW,QAAO,EAAE,cAAc;AACzD,SAAO;IACN,CAAC,gBAAgB,EAAE,CAAC;AAEvB,KAAI,iBACF,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,OAAD;GAAK,WAAU;aACb,qBAAC,OAAD;IAAK,WAAU;cAAf;KACE,oBAAC,OAAD,EAAK,WAAU,8CAA+C,CAAA;KAC9D,oBAAC,OAAD,EAAK,WAAU,iDAAkD,CAAA;KACjE,oBAAC,OAAD,EAAK,WAAU,iDAAkD,CAAA;KACjE,oBAAC,OAAD,EAAK,WAAU,iDAAkD,CAAA;KAC7D;;GACF,CAAA,EACN,oBAAC,OAAD;GAAK,WAAU;aACb,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,OAAD,EAAK,WAAU,mDAAoD,CAAA,EACnE,oBAAC,OAAD,EAAK,WAAU,mDAAoD,CAAA,CAC/D;SACN,oBAAC,OAAD,EAAK,WAAU,sDAAuD,CAAA,CAClE;QACN,oBAAC,OAAD,EAAK,WAAU,+FAAgG,CAAA,CAC3G;;GACF,CAAA,CACF;;CAIV,MAAM,uBAAuB,oBAAoB,UAAU;CAC3D,MAAM,uBAAuB,oBAAoB,UAAU;AAE3D,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CAEE,oBAAC,OAAD;GACE,WAAW,sCAAsC;aAEjD,oBAAC,OAAD;IAAK,WAAU;cACZ,mBAAmB,mBAAmB,UACrC,oBAAC,mBAAD;KACU;KACR,iBAAiB;KACjB,eAAe;KACf,WAAW,uBAAuB;KAClC,QAAQ;KACR,CAAA,GACA,mBAAmB,mBAAmB,YACxC,oBAAC,qBAAD;KACE,QAAQ;KACR,kBAAkB;KAClB,SAAS;KACT,CAAA,GACA,mBAAmB,mBAAmB,YACxC,oBAAC,uBAAD;KACE,QAAQ;KACR,kBAAkB;KAClB,SAAS;KACT,CAAA,GAEF,qBAAA,YAAA,EAAA,UAAA;KAEE,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,MAAD;OAAI,WAAU;iBACX,EAAE,UAAU;OACV,CAAA,EACJ,cAAc,UAAU,gBACvB,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,cAAD,EAAc,WAAU,gCAAiC,CAAA,EACzD,oBAAC,QAAD;OAAM,WAAU;iBACb;OACI,CAAA,CACN,EAAA,CAAA,CAED;;KAEN,oBAAC,0BAAD;MAAiC;MAAc;MAAS,CAAA;KAExD,oBAAC,gBAAD;MACa;MACC;MACZ,cAAc;MACd,SAAS;MACT,CAAA;KAEF,oBAAC,OAAD;MAAK,WAAU;gBACZ,gBAAgB,KAAK,SAAS;OAC7B,MAAM,OAAO,KAAK;AAQlB,cACE,qBAAC,UAAD;QAEE,MAAK;QACL,SARF,UAAU,aACA,SAAS,KAAK,KAAK,SACnB,cAAc,KAAK,IAAI;QAO/B,WAXF;kBAOA;SAME,oBAAC,OAAD;UAAK,WAAU;oBACb,oBAAC,MAAD,EAAM,WAAU,YAAa,CAAA;UACzB,CAAA;SACN,oBAAC,QAAD;UAAM,WAAU;oBACb,EAAE,KAAK,SAAS;UACZ,CAAA;SACP,oBAAC,cAAD,EAAc,WAAU,0FAA2F,CAAA;SAC5G;UAZF,KAAK,SAYH;QAEX;MACE,CAAA;KACL,EAAA,CAAA;IAED,CAAA;GACF,CAAA,EAGN,oBAAC,OAAD;GACE,WAAW,iGAAiG;aAE5G,oBAAC,oBAAD;IACa;IACA;IACC;IACZ,YAAY,uBAAuB;IACnC,WAAW;IACX,CAAA;GACE,CAAA,CACF;;;;;AC/PV,SAAgB,0BAAqD;CACnE,MAAM,CAAC,WAAW,gBAAgB,SAAoB,OAAO;CAC7D,MAAM,CAAC,gBAAgB,qBAAqB,SAAyB,KAAK;CAC1E,MAAM,cAAc,OAAwC,EAAE,CAAC;AAE/D,iBAAgB;EACd,MAAM,MAAM;AACZ,eAAa,IAAI,QAAQ,QAAQ,aAAa;IAC7C,EAAE,CAAC;CAEN,MAAM,kBAAkB,kBAAkB;AACxC,cAAY,QAAQ,QAAQ,aAAa;AACzC,cAAY,UAAU,EAAE;IACvB,EAAE,CAAC;CAEN,MAAM,WAAW,aAAa,OAAkB,UAAkB;EAChE,MAAM,KAAK,iBAAiB,aAAa,MAAM,EAAE,MAAM;AACvD,cAAY,QAAQ,KAAK,GAAG;IAC3B,EAAE,CAAC;AAqCN,QAAO;EACL;EACA;EACA,iBAtCsB;GACtB;GACA;GACA;GACA;GACA;GACD,CAAC,SAAS,UAAU;EAiCnB,mBA/BwB,aACvB,YAA4B;AAC3B,oBAAiB;AACjB,qBAAkB,QAAQ;AAC1B,gBAAa,WAAW;AACxB,YAAS,SAAA,IAAiB;AAC1B,YAAS,WAAA,IAA8B;AACvC,YAAS,WAAA,KAAwC;KAEnD,CAAC,iBAAiB,SAAS,CAC5B;EAsBC,iBApBsB,kBAAkB;AACxC,oBAAiB;AACjB,gBAAa,gBAAgB;AAC7B,YAAS,cAAA,IAAsB;AAC/B,YAAS,gBAAA,IAAmC;GAC5C,MAAM,KAAK,iBACH;AACJ,iBAAa,OAAO;AACpB,sBAAkB,KAAK;WAG1B;AACD,eAAY,QAAQ,KAAK,GAAG;KAC3B,CAAC,iBAAiB,SAAS,CAAC;EAQ9B;;;;ACzDH,SAAgB,aAAa,EAE3B,YACA,WACA,aACA,SACA,cAEA,GAAG,YACoC;AACvC,QACE,oBAAC,yBAAD,EAAA,UACE,oBAAC,qBAAD,EAAqB,GAAI,UAAY,CAAA,EACb,CAAA;;AAI9B,SAAS,oBACP,UAImB;CACnB,MAAM,EAAE,MAAM,sBAAsB;CACpC,MAAM,EACJ,gBACA,WACA,iBACA,mBACA,oBACE,yBAAyB;CAE7B,MAAM,eAAe,cAAc;AACjC,MAAI,mBAAmB,QAAS,QAAO,EAAE,YAAY;AACrD,MAAI,mBAAmB,UAAW,QAAO,EAAE,cAAc;AACzD,MAAI,mBAAmB,UAAW,QAAO,EAAE,cAAc;AACzD,SAAO;IACN,CAAC,gBAAgB,EAAE,CAAC;CAEvB,MAAM,uBAAuB,aAC1B,MAAwB;AACvB,IAAE,gBAAgB;AAClB,MAAI,mBAAmB,KAAM,kBAAiB;IAEhD,CAAC,gBAAgB,gBAAgB,CAClC;AAED,QACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,yBAAD,EAAA,UACE,oBAAC,YAAD,EAAA,UACE,qBAAC,gBAAD;EAAgB,WAAU;YAA1B,CACE,oBAAC,gBAAD,EAAA,UACG,eACC,oBAAC,gBAAD;GAAgB,MAAK;GAAI,SAAS;aAAsB;GAEvC,CAAA,GAEjB,oBAAC,gBAAD;GAAgB,WAAU;aAAgB;GAEzB,CAAA,EAEJ,CAAA,EAChB,gBACC,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,qBAAD,EAAuB,CAAA,EACvB,oBAAC,gBAAD,EAAA,UACE,oBAAC,gBAAD;GAAgB,WAAU;aACvB;GACc,CAAA,EACF,CAAA,CAChB,EAAA,CAAA,CAEU;KACN,CAAA,EACW,CAAA,EAC1B,oBAAC,OAAD;EAAK,GAAI;EAAU,WAAW,UAAU,SAAS,aAAa;YAC5D,oBAAC,gBAAD;GACkB;GACL;GACM;GACjB,eAAe;GACf,aAAa;GACb,CAAA;EACE,CAAA,CACL,EAAA,CAAA;;AAIP,MAAa,6BAAmD;CAC9D,YAAY;CACZ,aAAa;CACb,YAAY,CAAC;EAAE,IAAI;EAAW,OAAO;EAAW,CAAC;CACjD,QAAQ,EAAE;CACX"}
|
|
1
|
+
{"version":3,"file":"MySiteScreen-CktOXvV5.mjs","names":[],"sources":["../../../mysite/core/src/translation-api-context.ts","../src/providers/MysiteTranslationBridge.tsx","../../../mysite/ui/src/portal/components/animation-utils.ts","../../../mysite/ui/src/portal/components/VisitorDetailsCard.tsx","../../../mysite/ui/src/portal/components/MySiteLinkCard.tsx","../../../mysite/ui/src/portal/components/PhonePreview.tsx","../../../mysite/ui/src/portal/components/ThemeEditor.tsx","../../../mysite/ui/src/shared/schemas/mysite.schema.ts","../../../mysite/ui/src/shared/schemas/mysite-theme.schema.ts","../../../mysite/ui/src/shared/utils.ts","../../../mysite/ui/src/portal/components/PortalButtonsEditor.tsx","../../../mysite/ui/src/portal/components/PortalFavoritesEditor.tsx","../src/screens/MySiteScreen/MySiteMainView.tsx","../src/screens/MySiteScreen/use-mysite-editing-section.ts","../src/screens/MySiteScreen/index.tsx"],"sourcesContent":["import type { Provider } from \"react\";\nimport { createTranslationContext } from \"@fluid-app/i18n/translation-api-context-factory\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\nimport type { MysiteDict } from \"./translation-dictionary\";\n\nconst { Provider: MysiteProvider, useTranslation } =\n createTranslationContext<MysiteDict>(\"Mysite\");\n\nexport const MysiteTranslationProvider: Provider<TranslationApi<MysiteDict> | null> =\n MysiteProvider;\nexport const useMysiteTranslation = useTranslation;\n","import { useMemo, type ReactNode } from \"react\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { useDomainDict } from \"@fluid-app/i18n/use-domain-dict\";\nimport {\n mysiteDomain,\n createMysiteTranslationAdapter,\n} from \"@fluid-app/mysite-core/translation-adapter\";\nimport { MysiteTranslationProvider } from \"@fluid-app/mysite-core/translation-api-context\";\n\nexport function MysiteTranslationBridge({\n children,\n}: {\n children: ReactNode;\n}): React.JSX.Element {\n const { locale } = useActiveLocale();\n const dict = useDomainDict(mysiteDomain, locale);\n const api = useMemo(\n () => createMysiteTranslationAdapter(locale, dict),\n [locale, dict],\n );\n return (\n <MysiteTranslationProvider value={api}>\n {children}\n </MysiteTranslationProvider>\n );\n}\n","import type { AnimPhase } from \"./types\";\n\n// Tailwind className helpers for the MySite main → editor slide/fade.\n//\n// The slide transform (`translate-x-[50%]` / `-translate-x-[200%]`) is only\n// meaningful in the 2/3 + 1/3 wide layout where the content + preview columns\n// sit side-by-side. Below the `2xl` breakpoint the preview column stacks below\n// the content column, so we gate the transform classes with `2xl:` — otherwise\n// the content slides off-screen on narrower viewports. Opacity and transition\n// timings still run at all breakpoints so sections still fade in and out.\n\nexport function getContentClassName(phase: AnimPhase): string {\n switch (phase) {\n case \"idle\":\n return \"opacity-100 transition-none\";\n case \"fade-out\":\n return \"opacity-0 transition-opacity duration-300 ease-in-out\";\n case \"slide\":\n return \"opacity-0 2xl:translate-x-[50%] transition-transform duration-500 ease-in-out\";\n case \"fade-in\":\n return \"opacity-100 2xl:translate-x-[50%] transition-opacity duration-300 ease-in-out\";\n case \"editing\":\n return \"opacity-100 2xl:translate-x-[50%] transition-none\";\n case \"exit-fade-out\":\n return \"opacity-0 2xl:translate-x-[50%] transition-opacity duration-300 ease-in-out\";\n case \"exit-slide\":\n return \"opacity-0 transition-transform duration-500 ease-in-out\";\n case \"exit-fade-in\":\n return \"opacity-100 transition-opacity duration-300 ease-in-out\";\n }\n}\n\nexport function getPreviewClassName(phase: AnimPhase): string {\n switch (phase) {\n case \"idle\":\n case \"fade-out\":\n case \"exit-fade-in\":\n return \"transition-none\";\n case \"slide\":\n return \"2xl:-translate-x-[200%] transition-transform duration-500 ease-in-out\";\n case \"fade-in\":\n case \"editing\":\n case \"exit-fade-out\":\n return \"2xl:-translate-x-[200%] transition-none\";\n case \"exit-slide\":\n return \"transition-transform duration-500 ease-in-out\";\n }\n}\n","import { Eye, Users } from \"lucide-react\";\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Separator,\n} from \"@fluid-app/ui-primitives\";\nimport { useMysiteTranslation } from \"@fluid-app/mysite-core/translation-api-context\";\n\nexport function MySiteVisitorDetailsCard({\n views,\n leads,\n}: {\n views: number;\n leads: number;\n}): React.JSX.Element {\n const { t } = useMysiteTranslation();\n return (\n <Card className=\"h-auto gap-0 py-0 shadow-none\">\n <CardHeader className=\"p-4 pb-3\">\n <CardTitle className=\"text-sm\">{t(\"visitor_details\")}</CardTitle>\n </CardHeader>\n <CardContent className=\"flex px-4 pb-4\">\n <div className=\"flex-1\">\n <div className=\"mb-2 flex items-center gap-1.5\">\n <Eye className=\"text-muted-foreground size-3.5\" />\n <span className=\"text-muted-foreground text-sm\">{t(\"views\")}</span>\n </div>\n <p className=\"text-foreground text-2xl font-bold\">\n {views.toLocaleString()}\n </p>\n </div>\n <Separator orientation=\"vertical\" className=\"bg-border mx-4 h-auto\" />\n <div className=\"flex-1\">\n <div className=\"mb-2 flex items-center gap-1.5\">\n <Users className=\"text-muted-foreground size-3.5\" />\n <span className=\"text-muted-foreground text-sm\">{t(\"leads\")}</span>\n </div>\n <p className=\"text-foreground text-2xl font-bold\">\n {leads.toLocaleString()}\n </p>\n </div>\n </CardContent>\n </Card>\n );\n}\n","import { useCallback, useState } from \"react\";\nimport { Copy } from \"lucide-react\";\nimport {\n Button,\n Card,\n CardAction,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"@fluid-app/ui-primitives\";\nimport { useMysiteTranslation } from \"@fluid-app/mysite-core/translation-api-context\";\n\nexport function MySiteLinkCard({\n mysiteUrl,\n displayUrl,\n onUpdateSlug,\n onToast,\n}: {\n mysiteUrl: string;\n displayUrl: string;\n onUpdateSlug?: (slug: string) => Promise<void>;\n onToast?: (message: string, type: \"success\" | \"error\") => void;\n}): React.JSX.Element {\n const { t } = useMysiteTranslation();\n const lastSlashIndex = displayUrl.lastIndexOf(\"/\");\n const urlPrefix =\n lastSlashIndex >= 0 ? displayUrl.slice(0, lastSlashIndex + 1) : \"\";\n const currentSlug =\n lastSlashIndex >= 0 ? displayUrl.slice(lastSlashIndex + 1) : displayUrl;\n\n const [isEditingLink, setIsEditingLink] = useState(false);\n const [linkSlugInput, setLinkSlugInput] = useState(currentSlug);\n const [isSaving, setIsSaving] = useState(false);\n\n const handleEditLink = useCallback(() => {\n setLinkSlugInput(currentSlug);\n setIsEditingLink(true);\n }, [currentSlug]);\n\n const handleCancelEditLink = useCallback(() => {\n setIsEditingLink(false);\n setLinkSlugInput(currentSlug);\n }, [currentSlug]);\n\n const handleSaveLink = useCallback(async () => {\n const trimmed = linkSlugInput.trim();\n if (!trimmed) {\n onToast?.(t(\"slug_empty_error\"), \"error\");\n return;\n }\n if (trimmed === currentSlug) {\n setIsEditingLink(false);\n return;\n }\n if (!onUpdateSlug) return;\n setIsSaving(true);\n try {\n await onUpdateSlug(trimmed);\n onToast?.(t(\"link_updated\"), \"success\");\n setIsEditingLink(false);\n } catch {\n onToast?.(t(\"link_update_failed\"), \"error\");\n } finally {\n setIsSaving(false);\n }\n }, [linkSlugInput, currentSlug, onUpdateSlug, onToast, t]);\n\n const handleCopyLink = useCallback(async () => {\n if (!mysiteUrl) return;\n try {\n await navigator.clipboard.writeText(mysiteUrl);\n onToast?.(t(\"link_copied\"), \"success\");\n } catch {\n onToast?.(t(\"link_copy_failed\"), \"error\");\n }\n }, [mysiteUrl, onToast, t]);\n\n return (\n <Card className=\"h-auto gap-0 py-0 shadow-none\">\n <CardHeader className=\"items-center p-4\">\n <CardTitle className=\"text-sm\">{t(\"your_mysite_link\")}</CardTitle>\n {!isEditingLink && onUpdateSlug && (\n <CardAction>\n <Button variant=\"link\" size=\"sm\" onClick={handleEditLink}>\n {t(\"edit_link\")}\n </Button>\n </CardAction>\n )}\n </CardHeader>\n <CardContent className=\"px-4 pb-4\">\n <div className=\"text-foreground flex items-center gap-2 rounded-lg border bg-gradient-to-r from-[rgba(72,187,120,0.2)] via-[rgba(236,72,153,0.15)] to-[rgba(251,146,60,0.15)] px-3 py-2.5\">\n {isEditingLink ? (\n <>\n <span className=\"shrink-0 text-sm\">{urlPrefix}</span>\n <input\n type=\"text\"\n value={linkSlugInput}\n onChange={(e) => setLinkSlugInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !isSaving) handleSaveLink();\n if (e.key === \"Escape\") handleCancelEditLink();\n }}\n className=\"border-input text-foreground focus:ring-primary bg-background/60 min-w-0 flex-1 rounded-md border px-2 py-1 text-sm font-medium outline-none focus:ring-1\"\n autoFocus\n />\n </>\n ) : (\n <span className=\"min-w-0 flex-1 truncate text-sm\">\n {displayUrl || t(\"not_configured\")}\n </span>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleCopyLink}\n disabled={!mysiteUrl}\n >\n <Copy className=\"size-4\" />\n </Button>\n </div>\n\n <div\n className=\"grid transition-all duration-300 ease-in-out\"\n style={{\n gridTemplateRows: isEditingLink ? \"1fr\" : \"0fr\",\n opacity: isEditingLink ? 1 : 0,\n marginTop: isEditingLink ? 12 : 0,\n }}\n >\n <div className=\"overflow-hidden\">\n <div className=\"flex justify-end gap-2\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={handleCancelEditLink}\n >\n {t(\"cancel\")}\n </Button>\n <Button size=\"sm\" onClick={handleSaveLink} disabled={isSaving}>\n {isSaving ? t(\"saving\") : t(\"save\")}\n </Button>\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { LoaderCircle } from \"lucide-react\";\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n} from \"@fluid-app/ui-primitives\";\nimport { useMysiteTranslation } from \"@fluid-app/mysite-core/translation-api-context\";\n\nexport function MySitePhonePreview({\n mysiteUrl,\n themeName,\n previewKey,\n isUpdating,\n onPreview,\n}: {\n mysiteUrl: string;\n themeName: string;\n previewKey: number;\n isUpdating: boolean;\n onPreview: () => void;\n}): React.JSX.Element {\n const { t } = useMysiteTranslation();\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const previewSrc = `${mysiteUrl}?preview=true`;\n const isInitialLoadRef = useRef(true);\n\n useEffect(() => {\n isInitialLoadRef.current = true;\n }, [previewKey]);\n\n const handleIframeLoad = () => {\n if (isInitialLoadRef.current) {\n isInitialLoadRef.current = false;\n return;\n }\n const iframe = iframeRef.current;\n if (!iframe) return;\n isInitialLoadRef.current = true;\n iframe.src = previewSrc;\n };\n\n return (\n <Card className=\"items-center gap-4 py-5\">\n <CardHeader className=\"w-full items-center px-5\">\n <div>\n <p className=\"text-muted-foreground text-xs\">{t(\"current_theme\")}</p>\n <p className=\"text-foreground text-sm font-semibold\">{themeName}</p>\n </div>\n <Button\n className=\"col-start-2 row-span-2 row-start-1 cursor-pointer self-center justify-self-end\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={onPreview}\n disabled={!mysiteUrl}\n >\n {t(\"preview\")}\n </Button>\n </CardHeader>\n\n <CardContent className=\"relative mx-auto my-auto w-[260px] px-0 sm:w-[320px]\">\n <div className=\"overflow-hidden rounded-[32px] border-[6px] border-[#1e2939] bg-[#1e2939] shadow-xl sm:rounded-[40px] sm:border-[8px]\">\n <div className=\"flex items-center justify-between bg-[#101828] px-5 py-1 sm:px-6 sm:py-1.5\">\n <span className=\"text-[10px] font-medium text-[#ffffff] sm:text-[11px]\">\n 9:41\n </span>\n <div className=\"flex items-center gap-1\">\n <div className=\"h-2 w-2 rounded-full bg-[#ffffff60] sm:h-2.5 sm:w-2.5\" />\n <div className=\"h-2 w-3.5 rounded-sm bg-[#ffffff60] sm:h-2.5 sm:w-4\" />\n </div>\n </div>\n\n <div\n className=\"relative h-[490px] overflow-y-auto bg-[#ffffff] sm:h-[600px]\"\n style={{ scrollbarWidth: \"none\" }}\n aria-busy={isUpdating}\n >\n {mysiteUrl ? (\n <>\n <iframe\n ref={iframeRef}\n key={previewKey}\n className=\"h-full w-full origin-top-left bg-[#ffffff]\"\n src={previewSrc}\n title={t(\"mysite_preview\")}\n tabIndex={-1}\n // allow-scripts + allow-same-origin is a known sandbox escape\n // hatch: if iframe and parent share an origin, scripts can\n // strip the sandbox attribute. Safe here because mysite is\n // hosted on a different origin than portal.\n sandbox=\"allow-scripts allow-same-origin\"\n onLoad={handleIframeLoad}\n />\n {isUpdating && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-white/60\">\n <LoaderCircle className=\"text-muted-foreground size-6 animate-spin\" />\n </div>\n )}\n </>\n ) : (\n <div className=\"flex h-full items-center justify-center\">\n <p className=\"text-muted-foreground text-sm\">\n {t(\"no_site_configured\")}\n </p>\n </div>\n )}\n </div>\n </div>\n\n <div className=\"absolute bottom-1.5 left-1/2 h-1 w-24 -translate-x-1/2 rounded-full bg-white sm:bottom-2 sm:w-28\" />\n </CardContent>\n </Card>\n );\n}\n","import { ArrowLeft, Check, Palette } from \"lucide-react\";\nimport { Button, Card, CardContent, cn } from \"@fluid-app/ui-primitives\";\nimport { useMysiteTranslation } from \"@fluid-app/mysite-core/translation-api-context\";\n\n/** Minimal theme shape accepted by ThemeEditor.\n * Compatible with both core MySiteTheme (preview_url) and legacy MysiteTheme (image_url). */\nexport interface ThemeDisplayItem {\n id: number;\n name: string;\n preview_url?: string | null;\n image_url?: string | null;\n}\n\nexport function MySiteThemeEditor<T extends ThemeDisplayItem>({\n themes,\n selectedThemeId,\n onSelectTheme,\n isPending,\n onBack,\n}: {\n themes: T[];\n selectedThemeId: number | null;\n onSelectTheme: (theme: T) => void;\n isPending: boolean;\n onBack: () => void;\n}): React.JSX.Element {\n const { t } = useMysiteTranslation();\n return (\n <>\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={onBack}>\n <ArrowLeft className=\"size-4\" />\n </Button>\n <h1 className=\"text-foreground text-xl font-bold\">\n {t(\"choose_a_theme\")}\n </h1>\n </div>\n\n {themes.length === 0 ? (\n <Card>\n <CardContent className=\"py-8 text-center\">\n <p className=\"text-muted-foreground\">{t(\"no_themes_available\")}</p>\n </CardContent>\n </Card>\n ) : (\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-3\">\n {themes.map((theme) => {\n const isSelected = theme.id === selectedThemeId;\n const imageUrl = theme.preview_url || theme.image_url;\n return (\n <button\n key={theme.id}\n type=\"button\"\n onClick={() => onSelectTheme(theme)}\n className={cn(\n \"group focus:ring-primary relative overflow-hidden rounded-lg border-2 transition-all focus:ring-2 focus:ring-offset-2 focus:outline-none\",\n isSelected\n ? \"border-primary ring-primary ring-2\"\n : \"border-border hover:border-muted-foreground/50\",\n )}\n aria-pressed={isSelected}\n disabled={isPending}\n >\n <div className=\"bg-muted relative aspect-[4/3] w-full\">\n {imageUrl ? (\n <img\n src={imageUrl}\n alt={theme.name}\n loading=\"lazy\"\n className=\"absolute inset-0 h-full w-full object-cover\"\n />\n ) : (\n <div className=\"text-muted-foreground/50 flex h-full w-full items-center justify-center\">\n <Palette className=\"size-8\" />\n </div>\n )}\n {isSelected && (\n <div className=\"bg-primary/20 absolute inset-0 flex items-center justify-center\">\n <div className=\"bg-primary text-primary-foreground flex size-8 items-center justify-center rounded-full\">\n <Check className=\"size-5\" />\n </div>\n </div>\n )}\n {!isSelected && (\n <div className=\"group-hover:bg-foreground/10 absolute inset-0 transition-colors\" />\n )}\n </div>\n <div className=\"bg-card p-2\">\n <p\n className={cn(\n \"truncate text-sm font-medium\",\n isSelected ? \"text-primary\" : \"text-foreground\",\n )}\n >\n {theme.name}\n </p>\n </div>\n </button>\n );\n })}\n </div>\n )}\n </>\n );\n}\n","import { z } from \"zod\";\n\n// User Links (Buttons)\nexport const linkSchema = z.object({\n id: z.number(),\n url: z.string(),\n text: z.string(),\n order: z.number(),\n clicks: z.number().optional().default(0),\n});\n\nexport const linksResponseSchema = z.array(linkSchema);\n\nexport type MySiteLink = z.infer<typeof linkSchema>;\n\n// Favorites\nexport const favoriteableSchema = z\n .object({\n id: z.number(),\n title: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n image_url: z.string().nullable().optional(),\n type: z.string().optional(),\n })\n .passthrough();\n\nexport const favoriteSchema = z\n .object({\n id: z.number(),\n favoriteable_id: z.number().optional(),\n favoriteable_type: z.string(),\n order: z.number(),\n user_company_id: z.number().optional(),\n created_at: z.string().optional(),\n favoriteable: favoriteableSchema.nullable(),\n })\n .passthrough();\n\nexport const favoritesResponseSchema = z.array(favoriteSchema);\n\nexport type MySiteFavorite = z.infer<typeof favoriteSchema>;\n\n// MySite Update\nexport const mysiteUpdateResponseSchema = z\n .object({\n id: z.number(),\n })\n .passthrough();\n\n// User Profile Update\nexport const profileUpdateResponseSchema = z.object({\n id: z.number(),\n bio: z.string().nullable(),\n facebook: z.string().nullable(),\n twitter: z.string().nullable(),\n instagram: z.string().nullable(),\n youtube: z.string().nullable(),\n pinterest: z.string().nullable(),\n tiktok: z.string().nullable(),\n linkedin: z.string().nullable(),\n whatsapp: z.string().nullable(),\n wechat: z.string().nullable(),\n image_url: z.string().nullable(),\n});\n\nexport type ProfileUpdateResponse = z.infer<typeof profileUpdateResponseSchema>;\n","import { z } from \"zod\";\n\nexport interface MysiteTheme {\n id: number;\n name: string;\n description: string | null;\n public: boolean;\n company_id: number | null;\n created_at: string;\n updated_at: string;\n image_url: string | null;\n /** Generated placeholder carrying the theme name, sent whenever the theme\n * has no image of its own. Null for a nameless theme, and absent against a\n * backend that predates the field. */\n picker_image_url?: string | null;\n application_theme_template_id: number | null;\n default?: boolean | null;\n}\n\nexport const themeSchema: z.ZodType<MysiteTheme> = z.object({\n id: z.number(),\n name: z.string(),\n description: z.string().nullable(),\n public: z.boolean(),\n company_id: z.number().nullable(),\n created_at: z.string().datetime(),\n updated_at: z.string().datetime(),\n image_url: z.string().nullable(),\n picker_image_url: z.string().nullish(),\n application_theme_template_id: z.number().nullable(),\n default: z.boolean().nullable().optional(),\n});\n\nexport const mysiteThemesSchema: z.ZodType<MysiteTheme[]> =\n z.array(themeSchema);\n\n// --- Legacy Theme (for creating themes via /legacy_themes endpoint) ---\n\ninterface LegacyThemeTemplate {\n id: number;\n name: string;\n content: string | null;\n stylesheet: string | null;\n head: string | null;\n status: string;\n}\n\nconst legacyThemeTemplateSchema: z.ZodType<LegacyThemeTemplate> = z.object({\n id: z.number(),\n name: z.string(),\n content: z.string().nullable(),\n stylesheet: z.string().nullable(),\n head: z.string().nullable(),\n status: z.string(),\n});\n\nexport interface LegacyThemeResponse {\n data: {\n legacy_theme: {\n id: number;\n name: string;\n description: string | null;\n image_url: string | null;\n public: boolean;\n company_id: number | null;\n template: LegacyThemeTemplate;\n };\n };\n}\n\nconst legacyThemeResponseSchema: z.ZodType<LegacyThemeResponse> = z.object({\n data: z.object({\n legacy_theme: z.object({\n id: z.number(),\n name: z.string(),\n description: z.string().nullable(),\n image_url: z.string().nullable(),\n public: z.boolean(),\n company_id: z.number().nullable(),\n template: legacyThemeTemplateSchema,\n }),\n }),\n});\n\nexport { legacyThemeResponseSchema };\n\nexport interface CreateLegacyThemeInput {\n name: string;\n description?: string;\n image_url?: string;\n public?: boolean;\n template?: {\n content?: string;\n stylesheet?: string;\n head?: string;\n };\n}\n","export const sortByOrder = <T extends { order: number }>(items: T[]): T[] => {\n return items.toSorted((a, b) => a.order - b.order);\n};\n\nexport const updateOrders = <T extends { id: number | string; order: number }>(\n items: T[],\n): T[] => {\n return items.map((item, index) => ({\n ...item,\n order: index + 1,\n }));\n};\n\nexport const generateTempId = (): string => {\n return `temp_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n};\n\n/**\n * Strip the server-injected `public_id` query param from a URL so the rep\n * sees their clean original URL when editing or previewing. The BFF appends\n * `public_id=<rep uuid>` to outbound MySite link URLs for attribution; that\n * value should not be persisted back when the rep saves an edit, and it\n * should not clutter list previews.\n */\nexport function stripRepPublicIdFromUrl(url: string): string {\n if (!url) return url;\n try {\n const parsed = new URL(url);\n if (!parsed.searchParams.has(\"public_id\")) return url;\n parsed.searchParams.delete(\"public_id\");\n return parsed.toString();\n } catch {\n return url;\n }\n}\n\nexport function normalizeUrl(value: string): string {\n const trimmed = value.trim();\n if (!trimmed) return \"\";\n if (/^https?:\\/\\//i.test(trimmed)) return trimmed;\n return `https://${trimmed}`;\n}\n","\"use client\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { ArrowLeft, Plus, GripVertical, Pencil, Trash2 } from \"lucide-react\";\nimport {\n Button,\n Card,\n Skeleton,\n DialogFooter,\n Input,\n Label,\n useZodForm,\n} from \"@fluid-app/ui-primitives\";\nimport { ResponsiveDialog } from \"@fluid-app/ui-components/components/ResponsiveDialog\";\nimport { useSidebar } from \"@fluid-app/portal-react/shell/sidebar\";\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from \"@dnd-kit/core\";\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { z } from \"zod\";\nimport {\n usePortalLinks,\n usePortalCreateLink,\n usePortalUpdateLink,\n usePortalDeleteLink,\n usePortalReorderLinks,\n} from \"../hooks/use-mysite-portal\";\nimport type { MySiteLink } from \"@fluid-app/mysite-core/mysite-api-types\";\nimport { useMysiteTranslation } from \"@fluid-app/mysite-core/translation-api-context\";\nimport { normalizeUrl, stripRepPublicIdFromUrl } from \"../../shared/utils\";\n\nfunction createButtonSchema(t: ReturnType<typeof useMysiteTranslation>[\"t\"]) {\n return z.object({\n title: z.string().min(1, t(\"validation_button_text_required\")),\n url: z\n .string()\n .transform(normalizeUrl)\n .pipe(z.string().url(t(\"validation_url_invalid\"))),\n });\n}\n\ntype ButtonFormData = z.infer<ReturnType<typeof createButtonSchema>>;\n\nfunction SortableButtonCard({\n link,\n onEdit,\n onDelete,\n}: {\n link: MySiteLink;\n onEdit: (link: MySiteLink) => void;\n onDelete: (link: MySiteLink) => void;\n}) {\n const { t } = useMysiteTranslation();\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: link.id });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n };\n\n const displayUrl = stripRepPublicIdFromUrl(link.url);\n const truncatedUrl =\n displayUrl.length > 40 ? `${displayUrl.substring(0, 40)}...` : displayUrl;\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={`border-border bg-card flex items-center gap-3 rounded-lg border p-3 sm:p-4 ${\n isDragging ? \"opacity-50 shadow-lg\" : \"\"\n }`}\n >\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground cursor-grab touch-none\"\n aria-label={t(\"drag_to_reorder\")}\n {...attributes}\n {...listeners}\n >\n <GripVertical className=\"size-5\" />\n </button>\n\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-foreground truncate font-medium\">{link.title}</p>\n <p className=\"text-muted-foreground truncate text-sm\">{truncatedUrl}</p>\n </div>\n\n <div className=\"flex shrink-0 items-center gap-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-muted-foreground hover:text-foreground\"\n onClick={() => onEdit(link)}\n aria-label={t(\"edit_button_aria\")}\n >\n <Pencil className=\"size-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-muted-foreground hover:text-destructive\"\n onClick={() => onDelete(link)}\n aria-label={t(\"delete_button_aria\")}\n >\n <Trash2 className=\"size-4\" />\n </Button>\n </div>\n </div>\n );\n}\n\n/**\n * Portal-specific buttons editor that uses MySiteApi context.\n * No client/userId props needed — data comes from context.\n */\nexport function PortalButtonsEditor({\n onBack,\n onRefreshPreview,\n onToast,\n}: {\n onBack: () => void;\n onRefreshPreview?: () => void;\n onToast?: (message: string, type: \"success\" | \"error\") => void;\n}): React.JSX.Element {\n \"use no memo\";\n const { t } = useMysiteTranslation();\n const { isMobile } = useSidebar();\n const schema = useMemo(() => createButtonSchema(t), [t]);\n const { data: links = [], isLoading } = usePortalLinks();\n const createLinkMutation = usePortalCreateLink();\n const updateLinkMutation = usePortalUpdateLink();\n const deleteLinkMutation = usePortalDeleteLink();\n const reorderLinksMutation = usePortalReorderLinks();\n\n const [isAddEditDialogOpen, setIsAddEditDialogOpen] = useState(false);\n const [editingLink, setEditingLink] = useState<MySiteLink | null>(null);\n const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);\n const [deletingLink, setDeletingLink] = useState<MySiteLink | null>(null);\n\n const {\n register,\n handleSubmit: handleButtonSubmit,\n reset: resetButtonForm,\n formState: { errors: buttonErrors, isSubmitting: isButtonSubmitting },\n } = useZodForm<ButtonFormData>(schema, {\n defaultValues: { title: \"\", url: \"\" },\n });\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n\n const handleOpenAddDialog = useCallback(() => {\n setEditingLink(null);\n resetButtonForm({ title: \"\", url: \"\" });\n setIsAddEditDialogOpen(true);\n }, [resetButtonForm]);\n\n const handleOpenEditDialog = useCallback(\n (link: MySiteLink) => {\n setEditingLink(link);\n resetButtonForm({\n title: link.title,\n url: stripRepPublicIdFromUrl(link.url),\n });\n setIsAddEditDialogOpen(true);\n },\n [resetButtonForm],\n );\n\n const handleCloseAddEditDialog = useCallback(() => {\n setIsAddEditDialogOpen(false);\n setEditingLink(null);\n resetButtonForm({ title: \"\", url: \"\" });\n }, [resetButtonForm]);\n\n const onButtonSubmit = useCallback(\n (data: ButtonFormData) => {\n if (editingLink) {\n updateLinkMutation.mutate(\n {\n linkId: editingLink.id,\n body: { title: data.title, url: data.url },\n },\n {\n onSuccess: () => {\n onToast?.(t(\"button_updated\"), \"success\");\n handleCloseAddEditDialog();\n onRefreshPreview?.();\n },\n onError: () => {\n onToast?.(t(\"button_update_failed\"), \"error\");\n },\n },\n );\n } else {\n createLinkMutation.mutate(\n { title: data.title, url: data.url },\n {\n onSuccess: () => {\n onToast?.(t(\"button_created\"), \"success\");\n handleCloseAddEditDialog();\n onRefreshPreview?.();\n },\n onError: () => {\n onToast?.(t(\"button_create_failed\"), \"error\");\n },\n },\n );\n }\n },\n [\n editingLink,\n createLinkMutation,\n updateLinkMutation,\n handleCloseAddEditDialog,\n onRefreshPreview,\n onToast,\n t,\n ],\n );\n\n const handleOpenDeleteDialog = useCallback((link: MySiteLink) => {\n setDeletingLink(link);\n setIsDeleteDialogOpen(true);\n }, []);\n\n const handleCloseDeleteDialog = useCallback(() => {\n setIsDeleteDialogOpen(false);\n setDeletingLink(null);\n }, []);\n\n const handleConfirmDelete = useCallback(() => {\n if (deletingLink) {\n deleteLinkMutation.mutate(deletingLink.id, {\n onSuccess: () => {\n onToast?.(t(\"button_deleted\"), \"success\");\n handleCloseDeleteDialog();\n onRefreshPreview?.();\n },\n onError: () => {\n onToast?.(t(\"button_delete_failed\"), \"error\");\n },\n });\n }\n }, [\n deletingLink,\n deleteLinkMutation,\n handleCloseDeleteDialog,\n onRefreshPreview,\n onToast,\n t,\n ]);\n\n const handleDragEnd = useCallback(\n (event: DragEndEvent) => {\n const { active, over } = event;\n if (over && active.id !== over.id) {\n const oldIndex = links.findIndex((l) => l.id === active.id);\n const newIndex = links.findIndex((l) => l.id === over.id);\n const reordered = arrayMove(links, oldIndex, newIndex);\n const orderedIds = reordered.map((link) => link.id);\n reorderLinksMutation.mutate(\n { orderedIds, optimisticItems: reordered },\n {\n onSuccess: () => {\n onRefreshPreview?.();\n },\n onError: () => {\n onToast?.(t(\"reorder_buttons_failed\"), \"error\");\n },\n },\n );\n }\n },\n [links, reorderLinksMutation, onRefreshPreview, onToast, t],\n );\n\n return (\n <>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={onBack}>\n <ArrowLeft className=\"size-4\" />\n </Button>\n <h1 className=\"text-foreground text-xl font-bold\">\n {t(\"buttons_heading\")}\n </h1>\n </div>\n <Button size=\"sm\" onClick={handleOpenAddDialog}>\n <Plus className=\"mr-1 size-4\" />\n {t(\"add_button\")}\n </Button>\n </div>\n\n {isLoading ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div\n key={i}\n className=\"border-border bg-card flex items-center gap-3 rounded-lg border p-3 sm:p-4\"\n >\n <Skeleton className=\"size-5\" />\n <div className=\"min-w-0 flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-3 w-48\" />\n </div>\n <div className=\"flex gap-1\">\n <Skeleton className=\"size-8\" />\n <Skeleton className=\"size-8\" />\n </div>\n </div>\n ))}\n </div>\n ) : links.length === 0 ? (\n <Card className=\"p-6 text-center sm:p-8\">\n <p className=\"text-muted-foreground mb-4\">{t(\"no_buttons_empty\")}</p>\n <Button size=\"sm\" onClick={handleOpenAddDialog}>\n <Plus className=\"mr-1 size-4\" />\n {t(\"add_button\")}\n </Button>\n </Card>\n ) : (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleDragEnd}\n >\n <SortableContext\n items={links.map((l) => l.id)}\n strategy={verticalListSortingStrategy}\n >\n <div className=\"space-y-2\">\n {links.map((link) => (\n <SortableButtonCard\n key={link.id}\n link={link}\n onEdit={handleOpenEditDialog}\n onDelete={handleOpenDeleteDialog}\n />\n ))}\n </div>\n </SortableContext>\n </DndContext>\n )}\n\n {/* Add/Edit Dialog */}\n <ResponsiveDialog\n open={isAddEditDialogOpen}\n onOpenChange={setIsAddEditDialogOpen}\n title={editingLink ? t(\"edit_button_dialog\") : t(\"add_button_dialog\")}\n presentation={isMobile ? \"bottom-sheet\" : \"dialog\"}\n >\n <form\n onSubmit={handleButtonSubmit(onButtonSubmit)}\n className=\"space-y-4\"\n >\n <div className=\"space-y-2\">\n <Label htmlFor=\"title\">{t(\"button_text_label\")}</Label>\n <Input\n id=\"title\"\n placeholder={t(\"button_text_placeholder\")}\n {...register(\"title\")}\n className={buttonErrors.title ? \"border-destructive\" : \"\"}\n />\n {buttonErrors.title && (\n <p className=\"text-destructive text-sm\">\n {buttonErrors.title.message}\n </p>\n )}\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"url\">{t(\"url_label\")}</Label>\n <Input\n id=\"url\"\n placeholder={t(\"url_placeholder\")}\n {...register(\"url\")}\n className={buttonErrors.url ? \"border-destructive\" : \"\"}\n />\n {buttonErrors.url && (\n <p className=\"text-destructive text-sm\">\n {buttonErrors.url.message}\n </p>\n )}\n </div>\n <DialogFooter className=\"flex justify-between\">\n {editingLink ? (\n <Button\n type=\"button\"\n variant=\"destructive\"\n onClick={() => {\n handleCloseAddEditDialog();\n handleOpenDeleteDialog(editingLink);\n }}\n >\n <Trash2 className=\"mr-1 size-4\" />\n {t(\"delete\")}\n </Button>\n ) : (\n <div />\n )}\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleCloseAddEditDialog}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n type=\"submit\"\n disabled={\n isButtonSubmitting ||\n createLinkMutation.isPending ||\n updateLinkMutation.isPending\n }\n >\n {isButtonSubmitting ||\n createLinkMutation.isPending ||\n updateLinkMutation.isPending\n ? t(\"saving\")\n : t(\"save\")}\n </Button>\n </div>\n </DialogFooter>\n </form>\n </ResponsiveDialog>\n\n {/* Delete Confirmation Dialog */}\n <ResponsiveDialog\n open={isDeleteDialogOpen}\n onOpenChange={setIsDeleteDialogOpen}\n title={t(\"delete_button_dialog\")}\n presentation={isMobile ? \"bottom-sheet\" : \"dialog\"}\n size=\"compact\"\n >\n <p className=\"text-muted-foreground\">\n {t(\"delete_button_confirm\", {\n name: deletingLink?.title ?? \"\",\n })}\n </p>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleCloseDeleteDialog}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n onClick={handleConfirmDelete}\n disabled={deleteLinkMutation.isPending}\n >\n {deleteLinkMutation.isPending ? t(\"deleting\") : t(\"delete\")}\n </Button>\n </DialogFooter>\n </ResponsiveDialog>\n </>\n );\n}\n","\"use client\";\nimport { useCallback, useState } from \"react\";\nimport { ArrowLeft, GripVertical, Trash2 } from \"lucide-react\";\nimport { Button, Card, Skeleton, DialogFooter } from \"@fluid-app/ui-primitives\";\nimport { ResponsiveDialog } from \"@fluid-app/ui-components/components/ResponsiveDialog\";\nimport { useSidebar } from \"@fluid-app/portal-react/shell/sidebar\";\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from \"@dnd-kit/core\";\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport {\n usePortalFavorites,\n usePortalDeleteFavorite,\n usePortalReorderFavorites,\n} from \"../hooks/use-mysite-portal\";\nimport type { MySiteFavorite } from \"@fluid-app/mysite-core/mysite-api-types\";\nimport { useMysiteTranslation } from \"@fluid-app/mysite-core/translation-api-context\";\n\nconst TYPE_LABEL_KEYS: Record<\n string,\n \"type_media\" | \"type_playlist\" | \"type_enrollment_pack\" | \"type_page\"\n> = {\n Medium: \"type_media\",\n Library: \"type_playlist\",\n EnrollmentPack: \"type_enrollment_pack\",\n Page: \"type_page\",\n};\n\nfunction SortableFavoriteCard({\n favorite,\n onDelete,\n}: {\n favorite: MySiteFavorite;\n onDelete: (favorite: MySiteFavorite) => void;\n}) {\n const { t } = useMysiteTranslation();\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: favorite.id });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n };\n\n const title = favorite.name ?? t(\"untitled\");\n const imageUrl = favorite.image_url;\n const typeLabelKey = TYPE_LABEL_KEYS[favorite.favoriteable_type];\n const typeLabel =\n favorite.favoriteable_type !== \"Product\"\n ? typeLabelKey\n ? t(typeLabelKey)\n : favorite.favoriteable_type\n : null;\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={`border-border bg-card flex items-center gap-3 rounded-lg border p-3 sm:p-4 ${\n isDragging ? \"opacity-50 shadow-lg\" : \"\"\n }`}\n >\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground cursor-grab touch-none\"\n aria-label={t(\"drag_to_reorder\")}\n {...attributes}\n {...listeners}\n >\n <GripVertical className=\"size-5\" />\n </button>\n\n <div className=\"bg-muted size-10 shrink-0 overflow-hidden rounded-md\">\n {imageUrl ? (\n <img\n src={imageUrl}\n alt={title}\n loading=\"lazy\"\n width={40}\n height={40}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"text-muted-foreground flex h-full w-full items-center justify-center text-xs\">\n {t(\"no_image\")}\n </div>\n )}\n </div>\n\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-foreground truncate font-medium\">{title}</p>\n {typeLabel ? (\n <span className=\"text-muted-foreground text-xs\">{typeLabel}</span>\n ) : null}\n </div>\n\n <div className=\"flex shrink-0 items-center gap-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-muted-foreground hover:text-destructive\"\n onClick={() => onDelete(favorite)}\n aria-label={t(\"remove_favorite_aria\")}\n >\n <Trash2 className=\"size-4\" />\n </Button>\n </div>\n </div>\n );\n}\n\n/**\n * Portal-specific favorites editor that uses MySiteApi context.\n * No client/affiliateId props needed — data comes from context.\n */\nexport function PortalFavoritesEditor({\n onBack,\n onRefreshPreview,\n onToast,\n}: {\n onBack: () => void;\n onRefreshPreview?: () => void;\n onToast?: (message: string, type: \"success\" | \"error\") => void;\n}): React.JSX.Element {\n const { t } = useMysiteTranslation();\n const { isMobile } = useSidebar();\n const { data: favorites = [], isLoading } = usePortalFavorites();\n const deleteFavoriteMutation = usePortalDeleteFavorite();\n const reorderFavoritesMutation = usePortalReorderFavorites();\n\n const [isDeleteFavoriteDialogOpen, setIsDeleteFavoriteDialogOpen] =\n useState(false);\n const [deletingFavorite, setDeletingFavorite] =\n useState<MySiteFavorite | null>(null);\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n\n const handleOpenDeleteFavoriteDialog = useCallback(\n (favorite: MySiteFavorite) => {\n setDeletingFavorite(favorite);\n setIsDeleteFavoriteDialogOpen(true);\n },\n [],\n );\n\n const handleCloseDeleteFavoriteDialog = useCallback(() => {\n setIsDeleteFavoriteDialogOpen(false);\n setDeletingFavorite(null);\n }, []);\n\n const handleConfirmDeleteFavorite = useCallback(() => {\n if (deletingFavorite) {\n deleteFavoriteMutation.mutate(deletingFavorite.id, {\n onSuccess: () => {\n onToast?.(t(\"content_removed\"), \"success\");\n handleCloseDeleteFavoriteDialog();\n onRefreshPreview?.();\n },\n onError: () => {\n onToast?.(t(\"content_remove_failed\"), \"error\");\n },\n });\n }\n }, [\n deletingFavorite,\n deleteFavoriteMutation,\n handleCloseDeleteFavoriteDialog,\n onRefreshPreview,\n onToast,\n t,\n ]);\n\n const handleFavoriteDragEnd = useCallback(\n (event: DragEndEvent) => {\n const { active, over } = event;\n if (over && active.id !== over.id) {\n const oldIndex = favorites.findIndex((f) => f.id === active.id);\n const newIndex = favorites.findIndex((f) => f.id === over.id);\n const reordered = arrayMove(favorites, oldIndex, newIndex);\n const orderedIds = reordered.map((fav) => fav.id);\n reorderFavoritesMutation.mutate(\n { orderedIds, optimisticItems: reordered },\n {\n onSuccess: () => {\n onRefreshPreview?.();\n },\n onError: () => {\n onToast?.(t(\"reorder_content_failed\"), \"error\");\n },\n },\n );\n }\n },\n [favorites, reorderFavoritesMutation, onRefreshPreview, onToast, t],\n );\n\n return (\n <>\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={onBack}>\n <ArrowLeft className=\"size-4\" />\n </Button>\n <h1 className=\"text-foreground text-xl font-bold\">\n {t(\"content_heading\")}\n </h1>\n </div>\n\n {isLoading ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div\n key={i}\n className=\"border-border bg-card flex items-center gap-3 rounded-lg border p-3 sm:p-4\"\n >\n <Skeleton className=\"size-5\" />\n <Skeleton className=\"size-10 rounded-md\" />\n <div className=\"min-w-0 flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-3 w-20\" />\n </div>\n <Skeleton className=\"size-8\" />\n </div>\n ))}\n </div>\n ) : favorites.length === 0 ? (\n <Card className=\"p-6 text-center sm:p-8\">\n <p className=\"text-muted-foreground\">{t(\"no_content_empty\")}</p>\n </Card>\n ) : (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleFavoriteDragEnd}\n >\n <SortableContext\n items={favorites.map((f) => f.id)}\n strategy={verticalListSortingStrategy}\n >\n <div className=\"space-y-2\">\n {favorites.map((fav) => (\n <SortableFavoriteCard\n key={fav.id}\n favorite={fav}\n onDelete={handleOpenDeleteFavoriteDialog}\n />\n ))}\n </div>\n </SortableContext>\n </DndContext>\n )}\n\n {/* Delete Favorite Confirmation Dialog */}\n <ResponsiveDialog\n open={isDeleteFavoriteDialogOpen}\n onOpenChange={setIsDeleteFavoriteDialogOpen}\n title={t(\"remove_content_dialog\")}\n presentation={isMobile ? \"bottom-sheet\" : \"dialog\"}\n size=\"compact\"\n >\n <p className=\"text-muted-foreground\">\n {t(\"remove_content_confirm\", {\n name: deletingFavorite?.name ?? t(\"untitled\"),\n })}\n </p>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleCloseDeleteFavoriteDialog}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n onClick={handleConfirmDeleteFavorite}\n disabled={deleteFavoriteMutation.isPending}\n >\n {deleteFavoriteMutation.isPending ? t(\"removing\") : t(\"remove\")}\n </Button>\n </DialogFooter>\n </ResponsiveDialog>\n </>\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport {\n usePortalMySiteProfile,\n usePortalMySiteThemes,\n usePortalUpdateSettings,\n} from \"@fluid-app/mysite-ui/portal/hooks/use-mysite-portal\";\nimport type { MySiteTheme } from \"@fluid-app/mysite-core/mysite-api-types\";\nimport {\n type AnimPhase,\n type EditingSection,\n getContentClassName,\n getPreviewClassName,\n MySiteVisitorDetailsCard,\n MySitePhonePreview,\n MySiteLinkCard,\n MySiteThemeEditor,\n PortalButtonsEditor,\n PortalFavoritesEditor,\n} from \"@fluid-app/mysite-ui/portal/components\";\nimport { useMysiteTranslation } from \"@fluid-app/mysite-core/translation-api-context\";\nimport { ChevronRight, User, Link2, Palette, LayoutGrid } from \"lucide-react\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { useAppNavigation } from \"../../shell/AppNavigationContext\";\n\ntype NavActionItem = {\n labelKey: \"nav_profile\" | \"nav_theme\" | \"nav_content\" | \"nav_buttons\";\n key: Exclude<EditingSection, null>;\n icon: typeof User;\n};\ntype NavLinkItem = {\n labelKey: \"nav_profile\" | \"nav_theme\" | \"nav_content\" | \"nav_buttons\";\n slug: string;\n icon: typeof User;\n};\ntype NavItem = NavActionItem | NavLinkItem;\n\nconst navigationItems: NavItem[] = [\n { labelKey: \"nav_profile\", slug: \"profile\", icon: User },\n { labelKey: \"nav_theme\", key: \"theme\", icon: Palette },\n { labelKey: \"nav_content\", key: \"content\", icon: LayoutGrid },\n { labelKey: \"nav_buttons\", key: \"buttons\", icon: Link2 },\n];\n\nfunction defaultToast(message: string, type: \"success\" | \"error\") {\n fluidToast({ title: message, type });\n}\n\nexport interface MySiteMainViewProps {\n editingSection: EditingSection;\n animPhase: AnimPhase;\n showEditContent: boolean;\n onEditSection: (section: EditingSection) => void;\n onBackClick: () => void;\n}\n\nexport function MySiteMainView({\n editingSection,\n animPhase,\n showEditContent,\n onEditSection,\n onBackClick,\n}: MySiteMainViewProps): React.JSX.Element {\n const { t } = useMysiteTranslation();\n const { navigate } = useAppNavigation();\n const { data: profile, isLoading: isProfileLoading } =\n usePortalMySiteProfile();\n const { data: themes = [] } = usePortalMySiteThemes();\n const updateSettingsMutation = usePortalUpdateSettings();\n\n const [previewKey, setPreviewKey] = useState(0);\n const refreshPreview = useCallback(() => setPreviewKey((k) => k + 1), []);\n\n const [selectedThemeId, setSelectedThemeId] = useState<number | null>(null);\n\n const resolvedThemeId =\n selectedThemeId ??\n profile?.theme_id ??\n themes.find((t) => t.name === \"Default\")?.id ??\n themes[0]?.id ??\n null;\n\n const currentTheme = themes.find((t) => t.id === resolvedThemeId);\n const themeName = currentTheme?.name ?? \"Default\";\n\n const mysiteUrl = profile?.mysite_url ?? \"\";\n const displayUrl = mysiteUrl ? mysiteUrl.replace(/^https?:\\/\\//, \"\") : \"\";\n const views = profile?.mysite_views ?? 0;\n const leads = profile?.mysite_leads ?? 0;\n\n const handleSelectTheme = useCallback(\n (theme: MySiteTheme) => {\n if (theme.id === resolvedThemeId) return;\n const previousThemeId = selectedThemeId;\n setSelectedThemeId(theme.id);\n updateSettingsMutation.mutate(\n { theme_id: theme.id },\n {\n onSuccess: () => {\n defaultToast(t(\"theme_changed\", { name: theme.name }), \"success\");\n refreshPreview();\n },\n onError: () => {\n setSelectedThemeId(previousThemeId);\n defaultToast(t(\"theme_update_failed\"), \"error\");\n },\n },\n );\n },\n [\n resolvedThemeId,\n selectedThemeId,\n updateSettingsMutation,\n refreshPreview,\n t,\n ],\n );\n\n const handleUpdateSlug = useCallback(\n async (slug: string) => {\n await new Promise<void>((resolve, reject) => {\n updateSettingsMutation.mutate(\n { slug },\n {\n onSuccess: () => resolve(),\n onError: () => reject(new Error(\"Failed\")),\n },\n );\n });\n },\n [updateSettingsMutation],\n );\n\n const handlePreview = useCallback(() => {\n if (mysiteUrl) window.open(`${mysiteUrl}?preview=true`, \"_blank\");\n }, [mysiteUrl]);\n\n const sectionLabel = useMemo(() => {\n if (editingSection === \"theme\") return t(\"nav_theme\");\n if (editingSection === \"buttons\") return t(\"nav_buttons\");\n if (editingSection === \"content\") return t(\"nav_content\");\n return \"\";\n }, [editingSection, t]);\n\n if (isProfileLoading) {\n return (\n <div className=\"flex h-full flex-col overflow-y-auto px-2 py-6 2xl:flex-row 2xl:overflow-hidden\">\n <div className=\"w-full px-4 2xl:w-2/3 2xl:shrink-0\">\n <div className=\"flex flex-col gap-5\">\n <div className=\"bg-muted h-7 w-32 animate-pulse rounded-md\" />\n <div className=\"bg-muted h-20 w-full animate-pulse rounded-lg\" />\n <div className=\"bg-muted h-16 w-full animate-pulse rounded-lg\" />\n <div className=\"bg-muted h-40 w-full animate-pulse rounded-lg\" />\n </div>\n </div>\n <div className=\"w-full shrink-0 overflow-y-hidden px-4 pt-5 2xl:h-full 2xl:w-1/3 2xl:overflow-y-auto 2xl:pt-0\">\n <div className=\"bg-muted flex h-full flex-col items-center gap-4 rounded-xl p-5\">\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"space-y-1\">\n <div className=\"bg-background/50 h-3 w-24 animate-pulse rounded\" />\n <div className=\"bg-background/50 h-4 w-28 animate-pulse rounded\" />\n </div>\n <div className=\"bg-background/50 h-8 w-20 animate-pulse rounded-md\" />\n </div>\n <div className=\"bg-background/50 h-[490px] w-[260px] animate-pulse rounded-[36px] sm:h-[600px] sm:w-[320px]\" />\n </div>\n </div>\n </div>\n );\n }\n\n const contentAnimClassName = getContentClassName(animPhase);\n const previewAnimClassName = getPreviewClassName(animPhase);\n\n return (\n <div className=\"flex h-full flex-col overflow-y-auto px-2 py-6 2xl:flex-row 2xl:overflow-hidden\">\n {/* Content column */}\n <div\n className={`w-full px-4 2xl:w-2/3 2xl:shrink-0 ${contentAnimClassName}`}\n >\n <div className=\"flex min-w-0 flex-col gap-5 2xl:h-full 2xl:overflow-y-auto\">\n {showEditContent && editingSection === \"theme\" ? (\n <MySiteThemeEditor\n themes={themes}\n selectedThemeId={resolvedThemeId}\n onSelectTheme={handleSelectTheme}\n isPending={updateSettingsMutation.isPending}\n onBack={onBackClick}\n />\n ) : showEditContent && editingSection === \"buttons\" ? (\n <PortalButtonsEditor\n onBack={onBackClick}\n onRefreshPreview={refreshPreview}\n onToast={defaultToast}\n />\n ) : showEditContent && editingSection === \"content\" ? (\n <PortalFavoritesEditor\n onBack={onBackClick}\n onRefreshPreview={refreshPreview}\n onToast={defaultToast}\n />\n ) : (\n <>\n {/* Header with optional back-to-section label */}\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-foreground text-xl font-bold\">\n {t(\"heading\")}\n </h1>\n {animPhase !== \"idle\" && sectionLabel && (\n <>\n <ChevronRight className=\"text-muted-foreground size-4\" />\n <span className=\"text-foreground text-xl font-bold\">\n {sectionLabel}\n </span>\n </>\n )}\n </div>\n\n <MySiteVisitorDetailsCard views={views} leads={leads} />\n\n <MySiteLinkCard\n mysiteUrl={mysiteUrl}\n displayUrl={displayUrl}\n onUpdateSlug={handleUpdateSlug}\n onToast={defaultToast}\n />\n\n <div className=\"border-border bg-card divide-border divide-y overflow-hidden rounded-lg border\">\n {navigationItems.map((item) => {\n const Icon = item.icon;\n const rowClassName =\n \"group hover:bg-muted flex w-full items-center gap-2.5 px-3 py-2.5 transition-colors text-left cursor-pointer\";\n const onClick =\n \"slug\" in item\n ? () => navigate(item.slug)\n : () => onEditSection(item.key);\n\n return (\n <button\n key={item.labelKey}\n type=\"button\"\n onClick={onClick}\n className={rowClassName}\n >\n <div className=\"bg-muted text-foreground flex size-7 shrink-0 items-center justify-center rounded-full\">\n <Icon className=\"size-3.5\" />\n </div>\n <span className=\"text-foreground flex-1 text-sm font-medium\">\n {t(item.labelKey)}\n </span>\n <ChevronRight className=\"text-muted-foreground size-3 shrink-0 transition-transform group-hover:translate-x-0.5\" />\n </button>\n );\n })}\n </div>\n </>\n )}\n </div>\n </div>\n\n {/* Preview column */}\n <div\n className={`w-full shrink-0 overflow-y-hidden px-4 pt-5 2xl:h-full 2xl:w-1/3 2xl:overflow-y-auto 2xl:pt-0 ${previewAnimClassName}`}\n >\n <MySitePhonePreview\n mysiteUrl={mysiteUrl}\n themeName={themeName}\n previewKey={previewKey}\n isUpdating={updateSettingsMutation.isPending}\n onPreview={handlePreview}\n />\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n type AnimPhase,\n type EditingSection,\n FADE_MS,\n SLIDE_MS,\n} from \"@fluid-app/mysite-ui/portal/components\";\n\nexport interface MySiteEditingSectionState {\n editingSection: EditingSection;\n animPhase: AnimPhase;\n showEditContent: boolean;\n handleEditSection: (section: EditingSection) => void;\n handleBackClick: () => void;\n}\n\nexport function useMySiteEditingSection(): MySiteEditingSectionState {\n const [animPhase, setAnimPhase] = useState<AnimPhase>(\"idle\");\n const [editingSection, setEditingSection] = useState<EditingSection>(null);\n const timeoutsRef = useRef<ReturnType<typeof setTimeout>[]>([]);\n\n useEffect(() => {\n const ref = timeoutsRef;\n return () => ref.current.forEach(clearTimeout);\n }, []);\n\n const cancelScheduled = useCallback(() => {\n timeoutsRef.current.forEach(clearTimeout);\n timeoutsRef.current = [];\n }, []);\n\n const schedule = useCallback((phase: AnimPhase, delay: number) => {\n const id = setTimeout(() => setAnimPhase(phase), delay);\n timeoutsRef.current.push(id);\n }, []);\n\n const showEditContent = [\n \"slide\",\n \"fade-in\",\n \"editing\",\n \"exit-fade-out\",\n \"exit-slide\",\n ].includes(animPhase);\n\n const handleEditSection = useCallback(\n (section: EditingSection) => {\n cancelScheduled();\n setEditingSection(section);\n setAnimPhase(\"fade-out\");\n schedule(\"slide\", FADE_MS);\n schedule(\"fade-in\", FADE_MS + SLIDE_MS);\n schedule(\"editing\", FADE_MS + SLIDE_MS + FADE_MS);\n },\n [cancelScheduled, schedule],\n );\n\n const handleBackClick = useCallback(() => {\n cancelScheduled();\n setAnimPhase(\"exit-fade-out\");\n schedule(\"exit-slide\", FADE_MS);\n schedule(\"exit-fade-in\", FADE_MS + SLIDE_MS);\n const id = setTimeout(\n () => {\n setAnimPhase(\"idle\");\n setEditingSection(null);\n },\n FADE_MS + SLIDE_MS + FADE_MS,\n );\n timeoutsRef.current.push(id);\n }, [cancelScheduled, schedule]);\n\n return {\n editingSection,\n animPhase,\n showEditContent,\n handleEditSection,\n handleBackClick,\n };\n}\n","import React, { useCallback, useMemo } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { useMysiteTranslation } from \"@fluid-app/mysite-core/translation-api-context\";\nimport type { WidgetPropertySchema } from \"../../registries/property-schema-types\";\nimport { MysiteTranslationBridge } from \"../../providers/MysiteTranslationBridge\";\nimport { MySiteMainView } from \"./MySiteMainView\";\nimport { useMySiteEditingSection } from \"./use-mysite-editing-section\";\nimport type { MySiteScreenProps } from \"./types\";\n\nexport type { MySiteScreenProps } from \"./types\";\nexport type { MeProfile } from \"./types\";\n\nexport function MySiteScreen({\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: MySiteScreenProps): React.JSX.Element {\n return (\n <MysiteTranslationBridge>\n <MySiteScreenContent {...divProps} />\n </MysiteTranslationBridge>\n );\n}\n\nfunction MySiteScreenContent(\n divProps: Omit<\n MySiteScreenProps,\n \"background\" | \"textColor\" | \"accentColor\" | \"padding\" | \"borderRadius\"\n >,\n): React.JSX.Element {\n const { t } = useMysiteTranslation();\n const {\n editingSection,\n animPhase,\n showEditContent,\n handleEditSection,\n handleBackClick,\n } = useMySiteEditingSection();\n\n const sectionLabel = useMemo(() => {\n if (editingSection === \"theme\") return t(\"nav_theme\");\n if (editingSection === \"buttons\") return t(\"nav_buttons\");\n if (editingSection === \"content\") return t(\"nav_content\");\n return null;\n }, [editingSection, t]);\n\n const handleRootCrumbClick = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n if (editingSection !== null) handleBackClick();\n },\n [editingSection, handleBackClick],\n );\n\n return (\n <>\n <ScreenHeaderBreadcrumbs>\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n {sectionLabel ? (\n <BreadcrumbLink href=\"#\" onClick={handleRootCrumbClick}>\n MySite\n </BreadcrumbLink>\n ) : (\n <BreadcrumbPage className=\"font-semibold\">\n MySite\n </BreadcrumbPage>\n )}\n </BreadcrumbItem>\n {sectionLabel && (\n <>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {sectionLabel}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </>\n )}\n </BreadcrumbList>\n </Breadcrumb>\n </ScreenHeaderBreadcrumbs>\n <div {...divProps} className={`h-full ${divProps.className ?? \"\"}`}>\n <MySiteMainView\n editingSection={editingSection}\n animPhase={animPhase}\n showEditContent={showEditContent}\n onEditSection={handleEditSection}\n onBackClick={handleBackClick}\n />\n </div>\n </>\n );\n}\n\nexport const mySiteScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"MySiteScreen\",\n displayName: \"MySite Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
|
|
@@ -6,9 +6,9 @@ require("./translation-api-context-factory-mbsJk2UU.cjs");
|
|
|
6
6
|
require("./src-DPBCDigp.cjs");
|
|
7
7
|
require("./ResponsiveDialog-BZ3Cf5m9.cjs");
|
|
8
8
|
require("./translation-adapter-D_fMLp4u.cjs");
|
|
9
|
-
require("./sidebar-
|
|
9
|
+
require("./sidebar-zkV-HxHW.cjs");
|
|
10
10
|
require("./ScreenHeaderContext-Df1DvpEW.cjs");
|
|
11
|
-
const require_MySiteScreen = require("./MySiteScreen-
|
|
11
|
+
const require_MySiteScreen = require("./MySiteScreen-C6_2pJ3S.cjs");
|
|
12
12
|
require("./dist-BtQsnRL_.cjs");
|
|
13
13
|
exports.MySiteScreen = require_MySiteScreen.MySiteScreen;
|
|
14
14
|
exports.mySiteScreenPropertySchema = require_MySiteScreen.mySiteScreenPropertySchema;
|
|
@@ -5,7 +5,7 @@ require("./account-api-context-CrShCYnN.cjs");
|
|
|
5
5
|
require("./use-optional-store-CIM4spDu.cjs");
|
|
6
6
|
require("./use-mysite-portal-B0Mrv9jq.cjs");
|
|
7
7
|
require("./Combobox-CReJLJfk.cjs");
|
|
8
|
-
require("./FluidProvider-
|
|
8
|
+
require("./FluidProvider-xECI7Cct.cjs");
|
|
9
9
|
require("./ContactsTranslationBridge-46-NUAaR.cjs");
|
|
10
10
|
require("./prop-types-CwLNzi3Z.cjs");
|
|
11
11
|
require("./MobileBottomSheet-HzfAr8dE.cjs");
|
|
@@ -66,6 +66,6 @@ require("./translation-adapter-Dw2qIlJq.cjs");
|
|
|
66
66
|
require("./translation-adapter-DoSZB36K.cjs");
|
|
67
67
|
require("./translation-adapter-D_fMLp4u.cjs");
|
|
68
68
|
require("./ScreenHeaderContext-Df1DvpEW.cjs");
|
|
69
|
-
const require_OrdersScreen = require("./OrdersScreen-
|
|
69
|
+
const require_OrdersScreen = require("./OrdersScreen-Cok9YH0q.cjs");
|
|
70
70
|
exports.OrdersScreen = require_OrdersScreen.OrdersScreen;
|
|
71
71
|
exports.ordersScreenPropertySchema = require_OrdersScreen.ordersScreenPropertySchema;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require("./chunk-9hOWP6kD.cjs");
|
|
2
2
|
const require_build_widget_registry = require("./build-widget-registry-xHNKUhyG.cjs");
|
|
3
|
-
const require_FluidProvider = require("./FluidProvider-
|
|
3
|
+
const require_FluidProvider = require("./FluidProvider-xECI7Cct.cjs");
|
|
4
4
|
const require_ContactsTranslationBridge = require("./ContactsTranslationBridge-46-NUAaR.cjs");
|
|
5
5
|
const require_static_dict_adapter = require("./static-dict-adapter-BCgoKiVT.cjs");
|
|
6
6
|
const require_translation_api_context_factory = require("./translation-api-context-factory-mbsJk2UU.cjs");
|
|
@@ -1332,4 +1332,4 @@ Object.defineProperty(exports, "ordersScreenPropertySchema", {
|
|
|
1332
1332
|
}
|
|
1333
1333
|
});
|
|
1334
1334
|
|
|
1335
|
-
//# sourceMappingURL=OrdersScreen-
|
|
1335
|
+
//# sourceMappingURL=OrdersScreen-Cok9YH0q.cjs.map
|