{"version":3,"file":"MySiteScreen-CofiTwCp.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// Mixed into the muted token rather than replacing it, so a tile with no\n// image of its own still follows light and dark mode.\nconst HUE_STEP = 137; // coprime with 360, so neighbouring names land apart\n\nconst tintForName = (name: string): string => {\n  let hash = 0;\n  for (const character of name) {\n    hash = (hash * 31 + (character.codePointAt(0) ?? 0)) >>> 0;\n  }\n  const hue = (hash * HUE_STEP) % 360;\n  return `color-mix(in oklab, hsl(${hue} 70% 50%) 28%, var(--color-muted))`;\n};\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\n                      className=\"text-muted-foreground/50 flex h-full w-full items-center justify-center\"\n                      style={{ backgroundColor: tintForName(theme.name) }}\n                    >\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 { useQueryClient } from \"@tanstack/react-query\";\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 { refreshAccount } from \"../../hooks/use-account\";\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 queryClient = useQueryClient();\n  const updateSettingsMutation = usePortalUpdateSettings({\n    // The theme saves through here too, and only a slug write moves the URL.\n    onSuccess: (body) =>\n      body.slug === undefined ? undefined : refreshAccount(queryClient),\n  });\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\n        {...divProps}\n        className={`h-full min-h-0 flex-1 ${divProps.className ?? \"\"}`}\n      >\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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"}