@fluid-app/portal-sdk 0.1.340 → 0.1.341
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/{AddressAutocompleteInput-4OS-oYis.mjs → AddressAutocompleteInput-BQ7HCDqS.mjs} +17 -17
- package/dist/AddressAutocompleteInput-BQ7HCDqS.mjs.map +1 -0
- package/dist/{AddressAutocompleteInput-CZITNL-n.cjs → AddressAutocompleteInput-C0ns8N-l.cjs} +17 -17
- package/dist/AddressAutocompleteInput-C0ns8N-l.cjs.map +1 -0
- package/dist/{AppDownloadScreen-BYjlFEVq.cjs → AppDownloadScreen-DqqUBpS-.cjs} +5 -5
- package/dist/AppDownloadScreen-DqqUBpS-.cjs.map +1 -0
- package/dist/{AppDownloadScreen-BkPXQ6HD.mjs → AppDownloadScreen-ZUoc8X2D.mjs} +5 -5
- package/dist/AppDownloadScreen-ZUoc8X2D.mjs.map +1 -0
- package/dist/{CardWidget-Jv6HiiK-.cjs → CardWidget--S5FBquC.cjs} +2 -2
- package/dist/{CardWidget-Jv6HiiK-.cjs.map → CardWidget--S5FBquC.cjs.map} +1 -1
- package/dist/{CardWidget-C9UbLrzZ.mjs → CardWidget-ChfurL_z.mjs} +2 -2
- package/dist/{CardWidget-C9UbLrzZ.mjs.map → CardWidget-ChfurL_z.mjs.map} +1 -1
- package/dist/{CardWidget-Wj7aNAAe.cjs → CardWidget-DsfLoyup.cjs} +2 -2
- package/dist/{ContactsScreen-BDOyYGyR.cjs → ContactsScreen-B3Ena0O7.cjs} +2 -2
- package/dist/{ContactsScreen-6x_Y2HBg.cjs → ContactsScreen-CiegGc50.cjs} +18 -18
- package/dist/ContactsScreen-CiegGc50.cjs.map +1 -0
- package/dist/{ContactsScreen-CU5_SYVK.mjs → ContactsScreen-Cwyt5qIf.mjs} +18 -18
- package/dist/ContactsScreen-Cwyt5qIf.mjs.map +1 -0
- package/dist/{ContainerWidget-B0WqVKej.mjs → ContainerWidget-BHWPtBmF.mjs} +2 -2
- package/dist/{ContainerWidget-B0WqVKej.mjs.map → ContainerWidget-BHWPtBmF.mjs.map} +1 -1
- package/dist/{ContainerWidget-BJys0vji.cjs → ContainerWidget-Cf_D4TAi.cjs} +2 -2
- package/dist/{ContainerWidget-BJys0vji.cjs.map → ContainerWidget-Cf_D4TAi.cjs.map} +1 -1
- package/dist/{ContainerWidget-BPoDy9wl.cjs → ContainerWidget-CyDVJu83.cjs} +3 -3
- package/dist/{EmbedWidget-BjLKHqCD.cjs → EmbedWidget-B1gWxgsn.cjs} +2 -2
- package/dist/EmbedWidget-B1gWxgsn.cjs.map +1 -0
- package/dist/{EmbedWidget-DwYcDOSr.mjs → EmbedWidget-JVbp9wAL.mjs} +2 -2
- package/dist/EmbedWidget-JVbp9wAL.mjs.map +1 -0
- package/dist/{FluidProvider-CYgSHMUd.cjs → FluidProvider-BFU7ermL.cjs} +23 -23
- package/dist/{FluidProvider-CYgSHMUd.cjs.map → FluidProvider-BFU7ermL.cjs.map} +1 -1
- package/dist/{FluidProvider-rLNjrHI9.mjs → FluidProvider-BqJ-t2bW.mjs} +23 -23
- package/dist/{FluidProvider-rLNjrHI9.mjs.map → FluidProvider-BqJ-t2bW.mjs.map} +1 -1
- package/dist/{LayoutWidget-COFyne-B.cjs → LayoutWidget-3G-w-YLz.cjs} +2 -2
- package/dist/{LayoutWidget-_f70Meea.cjs → LayoutWidget-CG-dWz_c.cjs} +2 -2
- package/dist/{LayoutWidget-_f70Meea.cjs.map → LayoutWidget-CG-dWz_c.cjs.map} +1 -1
- package/dist/{LayoutWidget-CUG5HXPH.mjs → LayoutWidget-CrZG6Ipw.mjs} +2 -2
- package/dist/{LayoutWidget-CUG5HXPH.mjs.map → LayoutWidget-CrZG6Ipw.mjs.map} +1 -1
- package/dist/{MessagingScreen-CKPKnmdA.cjs → MessagingScreen-7BBNidBx.cjs} +15 -15
- package/dist/{MessagingScreen-DEKQhSxk.mjs → MessagingScreen-BIWRCS3T.mjs} +15 -15
- package/dist/{MessagingScreen-C_VnN2yj.cjs → MessagingScreen-D_wVko-i.cjs} +2 -2
- package/dist/{MessagingScreen-C_VnN2yj.cjs.map → MessagingScreen-D_wVko-i.cjs.map} +1 -1
- package/dist/{MessagingScreen-Bn1jNjdF.mjs → MessagingScreen-ZwSPp6zu.mjs} +2 -2
- package/dist/{MessagingScreen-Bn1jNjdF.mjs.map → MessagingScreen-ZwSPp6zu.mjs.map} +1 -1
- package/dist/{MySiteScreen-BLI39L5d.cjs → MySiteScreen-17KRkcj7.cjs} +29 -29
- package/dist/MySiteScreen-17KRkcj7.cjs.map +1 -0
- package/dist/{MySiteScreen-h7lBk3gC.cjs → MySiteScreen-BdBnDI6s.cjs} +1 -1
- package/dist/{MySiteScreen-B5jblKuW.mjs → MySiteScreen-BlTSt7a0.mjs} +29 -29
- package/dist/MySiteScreen-BlTSt7a0.mjs.map +1 -0
- package/dist/{MySiteWidget-CAj-6hXM.cjs → MySiteWidget-23lGcDO1.cjs} +3 -3
- package/dist/MySiteWidget-23lGcDO1.cjs.map +1 -0
- package/dist/{MySiteWidget-D0ZQpY-e.mjs → MySiteWidget-BXO8rmnf.mjs} +3 -3
- package/dist/{MySiteWidget-D0ZQpY-e.mjs.map → MySiteWidget-BXO8rmnf.mjs.map} +1 -1
- package/dist/{NestedWidget-D1iDgWh8.cjs → NestedWidget-CZGOZbpZ.cjs} +5 -5
- package/dist/NestedWidget-CZGOZbpZ.cjs.map +1 -0
- package/dist/{NestedWidget-BISpn0HM.cjs → NestedWidget-Cv8h-u5K.cjs} +1 -1
- package/dist/{NestedWidget-DPC6Y52o.mjs → NestedWidget-DuNuNaeT.mjs} +5 -5
- package/dist/NestedWidget-DuNuNaeT.mjs.map +1 -0
- package/dist/{OrdersScreen-BOu-b93J.mjs → OrdersScreen-BkUvISL0.mjs} +15 -15
- package/dist/{OrdersScreen-BX3Tp0W6.mjs → OrdersScreen-DgriwQBo.mjs} +4 -4
- package/dist/OrdersScreen-DgriwQBo.mjs.map +1 -0
- package/dist/{OrdersScreen-C0-X_pGG.cjs → OrdersScreen-TGNvFpjj.cjs} +4 -4
- package/dist/OrdersScreen-TGNvFpjj.cjs.map +1 -0
- package/dist/{OrdersScreen-CyT1TpjL.cjs → OrdersScreen-t1EwXPZx.cjs} +15 -15
- package/dist/{ProfileScreen-B1OMNJrQ.mjs → ProfileScreen-Bw8W8nxK.mjs} +4 -4
- package/dist/{ProfileScreen-B1OMNJrQ.mjs.map → ProfileScreen-Bw8W8nxK.mjs.map} +1 -1
- package/dist/{ProfileScreen-DEYfahoM.mjs → ProfileScreen-CArZ7TAm.mjs} +16 -16
- package/dist/{ProfileScreen-Dshb7RM2.cjs → ProfileScreen-CP5ijd_t.cjs} +4 -4
- package/dist/{ProfileScreen-Dshb7RM2.cjs.map → ProfileScreen-CP5ijd_t.cjs.map} +1 -1
- package/dist/{ProfileScreen-BRbz69S3.cjs → ProfileScreen-DXlKK4gO.cjs} +16 -16
- package/dist/{RecentActivityWidget-CVQpo1jC.mjs → RecentActivityWidget-ClgOlTXl.mjs} +3 -3
- package/dist/RecentActivityWidget-ClgOlTXl.mjs.map +1 -0
- package/dist/{RecentActivityWidget-DnGybdc3.cjs → RecentActivityWidget-DZGKRR5x.cjs} +3 -3
- package/dist/RecentActivityWidget-DZGKRR5x.cjs.map +1 -0
- package/dist/{ScreenRenderer-BYiZunHL.cjs → ScreenRenderer-CLDJUinO.cjs} +2 -2
- package/dist/{ScreenRenderer-BYiZunHL.cjs.map → ScreenRenderer-CLDJUinO.cjs.map} +1 -1
- package/dist/{ScreenRenderer-1ZCNOyIb.mjs → ScreenRenderer-TobkTBMC.mjs} +2 -2
- package/dist/{ScreenRenderer-1ZCNOyIb.mjs.map → ScreenRenderer-TobkTBMC.mjs.map} +1 -1
- package/dist/{SearchSort-K0-ffUoD.cjs → SearchSort-CDuQPacI.cjs} +2 -2
- package/dist/{SearchSort-K0-ffUoD.cjs.map → SearchSort-CDuQPacI.cjs.map} +1 -1
- package/dist/{SearchSort-CObUt78n.mjs → SearchSort-CMUL0qt3.mjs} +2 -2
- package/dist/{SearchSort-CObUt78n.mjs.map → SearchSort-CMUL0qt3.mjs.map} +1 -1
- package/dist/{ShareablesScreen-aafzr3Vs.mjs → ShareablesScreen-B6Qs0xXn.mjs} +116 -116
- package/dist/ShareablesScreen-B6Qs0xXn.mjs.map +1 -0
- package/dist/{ShareablesScreen-COVW0ikb.cjs → ShareablesScreen-BAOW6RIK.cjs} +116 -116
- package/dist/ShareablesScreen-BAOW6RIK.cjs.map +1 -0
- package/dist/{ShareablesScreen-CNAem5rt.mjs → ShareablesScreen-C3K5ed-X.mjs} +2 -2
- package/dist/{ShareablesScreen-BZv1NXJV.cjs → ShareablesScreen-C3juoUMG.cjs} +2 -2
- package/dist/{ShopScreen-fcy9uJ3Z.cjs → ShopScreen-BjuLPVrk.cjs} +13 -13
- package/dist/ShopScreen-BjuLPVrk.cjs.map +1 -0
- package/dist/{ShopScreen-Bhn_bZ8O.mjs → ShopScreen-CtqHSaUW.mjs} +15 -15
- package/dist/{ShopScreen-CaEKFEGZ.cjs → ShopScreen-CwGh-q7J.cjs} +15 -15
- package/dist/{ShopScreen-dvruZcuz.mjs → ShopScreen-DNJ4Geoq.mjs} +13 -13
- package/dist/ShopScreen-DNJ4Geoq.mjs.map +1 -0
- package/dist/{ShopWidget-BZ48BUxp.cjs → ShopWidget-BAi2p8DP.cjs} +8 -8
- package/dist/ShopWidget-BAi2p8DP.cjs.map +1 -0
- package/dist/{ShopWidget-ZmhMoVmK.mjs → ShopWidget-D9-DhKP4.mjs} +8 -8
- package/dist/ShopWidget-D9-DhKP4.mjs.map +1 -0
- package/dist/{ShopWidget-DmlseAqM.cjs → ShopWidget-_T-ycRq1.cjs} +2 -2
- package/dist/{SubscriptionsScreen-BYQrZ2aR.mjs → SubscriptionsScreen-B55dK8Qb.mjs} +16 -16
- package/dist/{SubscriptionsScreen-CfxeuHVV.mjs → SubscriptionsScreen-CVKyyzbR.mjs} +23 -23
- package/dist/SubscriptionsScreen-CVKyyzbR.mjs.map +1 -0
- package/dist/{SubscriptionsScreen-Bupuf-0D.cjs → SubscriptionsScreen-Dz1PGO2z.cjs} +23 -23
- package/dist/SubscriptionsScreen-Dz1PGO2z.cjs.map +1 -0
- package/dist/{SubscriptionsScreen-BoSpOiOm.cjs → SubscriptionsScreen-TAXj2UXa.cjs} +16 -16
- package/dist/{TableWidget-Dyq8JXbd.cjs → TableWidget-C4F1IEKt.cjs} +1 -1
- package/dist/{TableWidget-fbsVsyqZ.mjs → TableWidget-CpHI9CGQ.mjs} +3 -3
- package/dist/TableWidget-CpHI9CGQ.mjs.map +1 -0
- package/dist/{TableWidget-wQkzw7Jg.cjs → TableWidget-RK0B52qT.cjs} +3 -3
- package/dist/TableWidget-RK0B52qT.cjs.map +1 -0
- package/dist/{ToDoWidget-BPh5ZLCT.cjs → ToDoWidget-B1uzfuI5.cjs} +2 -2
- package/dist/{ToDoWidget-1_JCx9X7.mjs → ToDoWidget-BaWksZpJ.mjs} +5 -5
- package/dist/{ToDoWidget-1_JCx9X7.mjs.map → ToDoWidget-BaWksZpJ.mjs.map} +1 -1
- package/dist/{ToDoWidget-1ZaXZTi4.cjs → ToDoWidget-C03kvBE-.cjs} +5 -5
- package/dist/{ToDoWidget-1ZaXZTi4.cjs.map → ToDoWidget-C03kvBE-.cjs.map} +1 -1
- package/dist/index.cjs +50 -50
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +50 -50
- package/dist/index.mjs.map +1 -1
- package/dist/{task-composer-form-2z5Qk6US.cjs → task-composer-form-BEZGTBBZ.cjs} +2 -2
- package/dist/{task-composer-form-2z5Qk6US.cjs.map → task-composer-form-BEZGTBBZ.cjs.map} +1 -1
- package/dist/{task-composer-form-B3eR9kfb.mjs → task-composer-form-D_Pbl6qk.mjs} +2 -2
- package/dist/{task-composer-form-B3eR9kfb.mjs.map → task-composer-form-D_Pbl6qk.mjs.map} +1 -1
- package/package.json +15 -15
- package/dist/AddressAutocompleteInput-4OS-oYis.mjs.map +0 -1
- package/dist/AddressAutocompleteInput-CZITNL-n.cjs.map +0 -1
- package/dist/AppDownloadScreen-BYjlFEVq.cjs.map +0 -1
- package/dist/AppDownloadScreen-BkPXQ6HD.mjs.map +0 -1
- package/dist/ContactsScreen-6x_Y2HBg.cjs.map +0 -1
- package/dist/ContactsScreen-CU5_SYVK.mjs.map +0 -1
- package/dist/EmbedWidget-BjLKHqCD.cjs.map +0 -1
- package/dist/EmbedWidget-DwYcDOSr.mjs.map +0 -1
- package/dist/MySiteScreen-B5jblKuW.mjs.map +0 -1
- package/dist/MySiteScreen-BLI39L5d.cjs.map +0 -1
- package/dist/MySiteWidget-CAj-6hXM.cjs.map +0 -1
- package/dist/NestedWidget-D1iDgWh8.cjs.map +0 -1
- package/dist/NestedWidget-DPC6Y52o.mjs.map +0 -1
- package/dist/OrdersScreen-BX3Tp0W6.mjs.map +0 -1
- package/dist/OrdersScreen-C0-X_pGG.cjs.map +0 -1
- package/dist/RecentActivityWidget-CVQpo1jC.mjs.map +0 -1
- package/dist/RecentActivityWidget-DnGybdc3.cjs.map +0 -1
- package/dist/ShareablesScreen-COVW0ikb.cjs.map +0 -1
- package/dist/ShareablesScreen-aafzr3Vs.mjs.map +0 -1
- package/dist/ShopScreen-dvruZcuz.mjs.map +0 -1
- package/dist/ShopScreen-fcy9uJ3Z.cjs.map +0 -1
- package/dist/ShopWidget-BZ48BUxp.cjs.map +0 -1
- package/dist/ShopWidget-ZmhMoVmK.mjs.map +0 -1
- package/dist/SubscriptionsScreen-Bupuf-0D.cjs.map +0 -1
- package/dist/SubscriptionsScreen-CfxeuHVV.mjs.map +0 -1
- package/dist/TableWidget-fbsVsyqZ.mjs.map +0 -1
- package/dist/TableWidget-wQkzw7Jg.cjs.map +0 -1
|
@@ -171,7 +171,7 @@ function MySiteVisitorDetailsCard({ views, leads }) {
|
|
|
171
171
|
className: "flex-1",
|
|
172
172
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
173
173
|
className: "mb-2 flex items-center gap-1.5",
|
|
174
|
-
children: [/* @__PURE__ */ jsx(Eye, { className: "text-muted-foreground
|
|
174
|
+
children: [/* @__PURE__ */ jsx(Eye, { className: "text-muted-foreground size-3.5" }), /* @__PURE__ */ jsx("span", {
|
|
175
175
|
className: "text-muted-foreground text-sm",
|
|
176
176
|
children: t("views")
|
|
177
177
|
})]
|
|
@@ -188,7 +188,7 @@ function MySiteVisitorDetailsCard({ views, leads }) {
|
|
|
188
188
|
className: "flex-1",
|
|
189
189
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
190
190
|
className: "mb-2 flex items-center gap-1.5",
|
|
191
|
-
children: [/* @__PURE__ */ jsx(Users, { className: "text-muted-foreground
|
|
191
|
+
children: [/* @__PURE__ */ jsx(Users, { className: "text-muted-foreground size-3.5" }), /* @__PURE__ */ jsx("span", {
|
|
192
192
|
className: "text-muted-foreground text-sm",
|
|
193
193
|
children: t("leads")
|
|
194
194
|
})]
|
|
@@ -298,7 +298,7 @@ function MySiteLinkCard({ mysiteUrl, displayUrl, onUpdateSlug, onToast }) {
|
|
|
298
298
|
size: "icon",
|
|
299
299
|
onClick: handleCopyLink,
|
|
300
300
|
disabled: !mysiteUrl,
|
|
301
|
-
children: /* @__PURE__ */ jsx(Copy, { className: "
|
|
301
|
+
children: /* @__PURE__ */ jsx(Copy, { className: "size-4" })
|
|
302
302
|
})]
|
|
303
303
|
}), /* @__PURE__ */ jsx("div", {
|
|
304
304
|
className: "grid transition-all duration-300 ease-in-out",
|
|
@@ -393,7 +393,7 @@ function MySitePhonePreview({ mysiteUrl, themeName, previewKey, isUpdating, onPr
|
|
|
393
393
|
onLoad: handleIframeLoad
|
|
394
394
|
}, previewKey), isUpdating && /* @__PURE__ */ jsx("div", {
|
|
395
395
|
className: "absolute inset-0 flex items-center justify-center bg-white/60",
|
|
396
|
-
children: /* @__PURE__ */ jsx(LoaderCircle, { className: "text-muted-foreground
|
|
396
|
+
children: /* @__PURE__ */ jsx(LoaderCircle, { className: "text-muted-foreground size-6 animate-spin" })
|
|
397
397
|
})] }) : /* @__PURE__ */ jsx("div", {
|
|
398
398
|
className: "flex h-full items-center justify-center",
|
|
399
399
|
children: /* @__PURE__ */ jsx("p", {
|
|
@@ -416,7 +416,7 @@ function MySiteThemeEditor({ themes, selectedThemeId, onSelectTheme, isPending,
|
|
|
416
416
|
variant: "ghost",
|
|
417
417
|
size: "icon",
|
|
418
418
|
onClick: onBack,
|
|
419
|
-
children: /* @__PURE__ */ jsx(ArrowLeft, { className: "
|
|
419
|
+
children: /* @__PURE__ */ jsx(ArrowLeft, { className: "size-4" })
|
|
420
420
|
}), /* @__PURE__ */ jsx("h1", {
|
|
421
421
|
className: "text-foreground text-xl font-bold",
|
|
422
422
|
children: t("choose_a_theme")
|
|
@@ -448,13 +448,13 @@ function MySiteThemeEditor({ themes, selectedThemeId, onSelectTheme, isPending,
|
|
|
448
448
|
className: "absolute inset-0 h-full w-full object-cover"
|
|
449
449
|
}) : /* @__PURE__ */ jsx("div", {
|
|
450
450
|
className: "text-muted-foreground/50 flex h-full w-full items-center justify-center",
|
|
451
|
-
children: /* @__PURE__ */ jsx(Palette, { className: "
|
|
451
|
+
children: /* @__PURE__ */ jsx(Palette, { className: "size-8" })
|
|
452
452
|
}),
|
|
453
453
|
isSelected && /* @__PURE__ */ jsx("div", {
|
|
454
454
|
className: "bg-primary/20 absolute inset-0 flex items-center justify-center",
|
|
455
455
|
children: /* @__PURE__ */ jsx("div", {
|
|
456
|
-
className: "bg-primary text-primary-foreground flex
|
|
457
|
-
children: /* @__PURE__ */ jsx(Check, { className: "
|
|
456
|
+
className: "bg-primary text-primary-foreground flex size-8 items-center justify-center rounded-full",
|
|
457
|
+
children: /* @__PURE__ */ jsx(Check, { className: "size-5" })
|
|
458
458
|
})
|
|
459
459
|
}),
|
|
460
460
|
!isSelected && /* @__PURE__ */ jsx("div", { className: "group-hover:bg-foreground/10 absolute inset-0 transition-colors" })
|
|
@@ -578,7 +578,7 @@ function SortableButtonCard({ link, onEdit, onDelete }) {
|
|
|
578
578
|
"aria-label": t("drag_to_reorder"),
|
|
579
579
|
...attributes,
|
|
580
580
|
...listeners,
|
|
581
|
-
children: /* @__PURE__ */ jsx(GripVertical, { className: "
|
|
581
|
+
children: /* @__PURE__ */ jsx(GripVertical, { className: "size-5" })
|
|
582
582
|
}),
|
|
583
583
|
/* @__PURE__ */ jsxs("div", {
|
|
584
584
|
className: "min-w-0 flex-1",
|
|
@@ -598,14 +598,14 @@ function SortableButtonCard({ link, onEdit, onDelete }) {
|
|
|
598
598
|
className: "text-muted-foreground hover:text-foreground",
|
|
599
599
|
onClick: () => onEdit(link),
|
|
600
600
|
"aria-label": t("edit_button_aria"),
|
|
601
|
-
children: /* @__PURE__ */ jsx(Pencil, { className: "
|
|
601
|
+
children: /* @__PURE__ */ jsx(Pencil, { className: "size-4" })
|
|
602
602
|
}), /* @__PURE__ */ jsx(Button, {
|
|
603
603
|
variant: "ghost",
|
|
604
604
|
size: "sm",
|
|
605
605
|
className: "text-muted-foreground hover:text-destructive",
|
|
606
606
|
onClick: () => onDelete(link),
|
|
607
607
|
"aria-label": t("delete_button_aria"),
|
|
608
|
-
children: /* @__PURE__ */ jsx(Trash2, { className: "
|
|
608
|
+
children: /* @__PURE__ */ jsx(Trash2, { className: "size-4" })
|
|
609
609
|
})]
|
|
610
610
|
})
|
|
611
611
|
]
|
|
@@ -756,7 +756,7 @@ function PortalButtonsEditor({ onBack, onRefreshPreview, onToast }) {
|
|
|
756
756
|
variant: "ghost",
|
|
757
757
|
size: "icon",
|
|
758
758
|
onClick: onBack,
|
|
759
|
-
children: /* @__PURE__ */ jsx(ArrowLeft, { className: "
|
|
759
|
+
children: /* @__PURE__ */ jsx(ArrowLeft, { className: "size-4" })
|
|
760
760
|
}), /* @__PURE__ */ jsx("h1", {
|
|
761
761
|
className: "text-foreground text-xl font-bold",
|
|
762
762
|
children: t("buttons_heading")
|
|
@@ -764,7 +764,7 @@ function PortalButtonsEditor({ onBack, onRefreshPreview, onToast }) {
|
|
|
764
764
|
}), /* @__PURE__ */ jsxs(Button, {
|
|
765
765
|
size: "sm",
|
|
766
766
|
onClick: handleOpenAddDialog,
|
|
767
|
-
children: [/* @__PURE__ */ jsx(Plus, { className: "mr-1
|
|
767
|
+
children: [/* @__PURE__ */ jsx(Plus, { className: "mr-1 size-4" }), t("add_button")]
|
|
768
768
|
})]
|
|
769
769
|
}),
|
|
770
770
|
isLoading ? /* @__PURE__ */ jsx("div", {
|
|
@@ -772,14 +772,14 @@ function PortalButtonsEditor({ onBack, onRefreshPreview, onToast }) {
|
|
|
772
772
|
children: Array.from({ length: 3 }).map((_, i) => /* @__PURE__ */ jsxs("div", {
|
|
773
773
|
className: "border-border bg-card flex items-center gap-3 rounded-lg border p-3 sm:p-4",
|
|
774
774
|
children: [
|
|
775
|
-
/* @__PURE__ */ jsx(Skeleton, { className: "
|
|
775
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "size-5" }),
|
|
776
776
|
/* @__PURE__ */ jsxs("div", {
|
|
777
777
|
className: "min-w-0 flex-1 space-y-2",
|
|
778
778
|
children: [/* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-32" }), /* @__PURE__ */ jsx(Skeleton, { className: "h-3 w-48" })]
|
|
779
779
|
}),
|
|
780
780
|
/* @__PURE__ */ jsxs("div", {
|
|
781
781
|
className: "flex gap-1",
|
|
782
|
-
children: [/* @__PURE__ */ jsx(Skeleton, { className: "
|
|
782
|
+
children: [/* @__PURE__ */ jsx(Skeleton, { className: "size-8" }), /* @__PURE__ */ jsx(Skeleton, { className: "size-8" })]
|
|
783
783
|
})
|
|
784
784
|
]
|
|
785
785
|
}, i))
|
|
@@ -791,7 +791,7 @@ function PortalButtonsEditor({ onBack, onRefreshPreview, onToast }) {
|
|
|
791
791
|
}), /* @__PURE__ */ jsxs(Button, {
|
|
792
792
|
size: "sm",
|
|
793
793
|
onClick: handleOpenAddDialog,
|
|
794
|
-
children: [/* @__PURE__ */ jsx(Plus, { className: "mr-1
|
|
794
|
+
children: [/* @__PURE__ */ jsx(Plus, { className: "mr-1 size-4" }), t("add_button")]
|
|
795
795
|
})]
|
|
796
796
|
}) : /* @__PURE__ */ jsx(DndContext, {
|
|
797
797
|
sensors,
|
|
@@ -864,7 +864,7 @@ function PortalButtonsEditor({ onBack, onRefreshPreview, onToast }) {
|
|
|
864
864
|
handleCloseAddEditDialog();
|
|
865
865
|
handleOpenDeleteDialog(editingLink);
|
|
866
866
|
},
|
|
867
|
-
children: [/* @__PURE__ */ jsx(Trash2, { className: "mr-1
|
|
867
|
+
children: [/* @__PURE__ */ jsx(Trash2, { className: "mr-1 size-4" }), t("delete")]
|
|
868
868
|
}) : /* @__PURE__ */ jsx("div", {}), /* @__PURE__ */ jsxs("div", {
|
|
869
869
|
className: "flex gap-2",
|
|
870
870
|
children: [/* @__PURE__ */ jsx(Button, {
|
|
@@ -937,10 +937,10 @@ function SortableFavoriteCard({ favorite, onDelete }) {
|
|
|
937
937
|
"aria-label": t("drag_to_reorder"),
|
|
938
938
|
...attributes,
|
|
939
939
|
...listeners,
|
|
940
|
-
children: /* @__PURE__ */ jsx(GripVertical, { className: "
|
|
940
|
+
children: /* @__PURE__ */ jsx(GripVertical, { className: "size-5" })
|
|
941
941
|
}),
|
|
942
942
|
/* @__PURE__ */ jsx("div", {
|
|
943
|
-
className: "bg-muted
|
|
943
|
+
className: "bg-muted size-10 shrink-0 overflow-hidden rounded-md",
|
|
944
944
|
children: imageUrl ? /* @__PURE__ */ jsx("img", {
|
|
945
945
|
src: imageUrl,
|
|
946
946
|
alt: title,
|
|
@@ -971,7 +971,7 @@ function SortableFavoriteCard({ favorite, onDelete }) {
|
|
|
971
971
|
className: "text-muted-foreground hover:text-destructive",
|
|
972
972
|
onClick: () => onDelete(favorite),
|
|
973
973
|
"aria-label": t("remove_favorite_aria"),
|
|
974
|
-
children: /* @__PURE__ */ jsx(Trash2, { className: "
|
|
974
|
+
children: /* @__PURE__ */ jsx(Trash2, { className: "size-4" })
|
|
975
975
|
})
|
|
976
976
|
})
|
|
977
977
|
]
|
|
@@ -1047,7 +1047,7 @@ function PortalFavoritesEditor({ onBack, onRefreshPreview, onToast }) {
|
|
|
1047
1047
|
variant: "ghost",
|
|
1048
1048
|
size: "icon",
|
|
1049
1049
|
onClick: onBack,
|
|
1050
|
-
children: /* @__PURE__ */ jsx(ArrowLeft, { className: "
|
|
1050
|
+
children: /* @__PURE__ */ jsx(ArrowLeft, { className: "size-4" })
|
|
1051
1051
|
}), /* @__PURE__ */ jsx("h1", {
|
|
1052
1052
|
className: "text-foreground text-xl font-bold",
|
|
1053
1053
|
children: t("content_heading")
|
|
@@ -1058,13 +1058,13 @@ function PortalFavoritesEditor({ onBack, onRefreshPreview, onToast }) {
|
|
|
1058
1058
|
children: Array.from({ length: 3 }).map((_, i) => /* @__PURE__ */ jsxs("div", {
|
|
1059
1059
|
className: "border-border bg-card flex items-center gap-3 rounded-lg border p-3 sm:p-4",
|
|
1060
1060
|
children: [
|
|
1061
|
-
/* @__PURE__ */ jsx(Skeleton, { className: "
|
|
1062
|
-
/* @__PURE__ */ jsx(Skeleton, { className: "
|
|
1061
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "size-5" }),
|
|
1062
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "size-10 rounded-md" }),
|
|
1063
1063
|
/* @__PURE__ */ jsxs("div", {
|
|
1064
1064
|
className: "min-w-0 flex-1 space-y-2",
|
|
1065
1065
|
children: [/* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-32" }), /* @__PURE__ */ jsx(Skeleton, { className: "h-3 w-20" })]
|
|
1066
1066
|
}),
|
|
1067
|
-
/* @__PURE__ */ jsx(Skeleton, { className: "
|
|
1067
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "size-8" })
|
|
1068
1068
|
]
|
|
1069
1069
|
}, i))
|
|
1070
1070
|
}) : favorites.length === 0 ? /* @__PURE__ */ jsx(Card, {
|
|
@@ -1252,7 +1252,7 @@ function MySiteMainView({ editingSection, animPhase, showEditContent, onEditSect
|
|
|
1252
1252
|
children: [/* @__PURE__ */ jsx("h1", {
|
|
1253
1253
|
className: "text-foreground text-xl font-bold",
|
|
1254
1254
|
children: t("heading")
|
|
1255
|
-
}), animPhase !== "idle" && sectionLabel && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(ChevronRight, { className: "text-muted-foreground
|
|
1255
|
+
}), animPhase !== "idle" && sectionLabel && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(ChevronRight, { className: "text-muted-foreground size-4" }), /* @__PURE__ */ jsx("span", {
|
|
1256
1256
|
className: "text-foreground text-xl font-bold",
|
|
1257
1257
|
children: sectionLabel
|
|
1258
1258
|
})] })]
|
|
@@ -1277,14 +1277,14 @@ function MySiteMainView({ editingSection, animPhase, showEditContent, onEditSect
|
|
|
1277
1277
|
className: "group hover:bg-muted flex w-full items-center gap-2.5 px-3 py-2.5 transition-colors text-left cursor-pointer",
|
|
1278
1278
|
children: [
|
|
1279
1279
|
/* @__PURE__ */ jsx("div", {
|
|
1280
|
-
className: "bg-muted text-foreground flex
|
|
1281
|
-
children: /* @__PURE__ */ jsx(Icon, { className: "
|
|
1280
|
+
className: "bg-muted text-foreground flex size-7 shrink-0 items-center justify-center rounded-full",
|
|
1281
|
+
children: /* @__PURE__ */ jsx(Icon, { className: "size-3.5" })
|
|
1282
1282
|
}),
|
|
1283
1283
|
/* @__PURE__ */ jsx("span", {
|
|
1284
1284
|
className: "text-foreground flex-1 text-sm font-medium",
|
|
1285
1285
|
children: t(item.labelKey)
|
|
1286
1286
|
}),
|
|
1287
|
-
/* @__PURE__ */ jsx(ChevronRight, { className: "text-muted-foreground
|
|
1287
|
+
/* @__PURE__ */ jsx(ChevronRight, { className: "text-muted-foreground size-3 shrink-0 transition-transform group-hover:translate-x-0.5" })
|
|
1288
1288
|
]
|
|
1289
1289
|
}, item.labelKey);
|
|
1290
1290
|
})
|
|
@@ -1411,4 +1411,4 @@ const mySiteScreenPropertySchema = {
|
|
|
1411
1411
|
//#endregion
|
|
1412
1412
|
export { MySiteScreen_exports as n, mySiteScreenPropertySchema as r, MySiteScreen as t };
|
|
1413
1413
|
|
|
1414
|
-
//# sourceMappingURL=MySiteScreen-
|
|
1414
|
+
//# sourceMappingURL=MySiteScreen-BlTSt7a0.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MySiteScreen-BlTSt7a0.mjs","names":[],"sources":["../../../mysite/core/src/translation-api-context.ts","../../../mysite/core/src/translation-dictionary.ts","../../../mysite/core/src/translation-adapter.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","export const mysiteEn = {\n breadcrumb: \"My Site\",\n heading: \"MySite\",\n nav_profile: \"Profile\",\n nav_theme: \"Theme\",\n nav_content: \"MySite Content\",\n nav_buttons: \"Buttons\",\n visitor_details: \"Visitor Details\",\n views: \"Views\",\n leads: \"Leads\",\n your_mysite_link: \"Your MySite Link\",\n edit_link: \"Edit Link\",\n not_configured: \"Not configured\",\n slug_empty_error: \"Slug cannot be empty\",\n link_updated: \"MySite link updated\",\n link_update_failed: \"Failed to update link\",\n link_copied: \"Link copied to clipboard\",\n link_copy_failed: \"Failed to copy link\",\n cancel: \"Cancel\",\n save: \"Save\",\n saving: \"Saving...\",\n delete: \"Delete\",\n deleting: \"Deleting...\",\n remove: \"Remove\",\n removing: \"Removing...\",\n current_theme: \"Current Theme\",\n preview: \"Preview\",\n mysite_preview: \"MySite Preview\",\n no_site_configured: \"No site configured\",\n choose_a_theme: \"Choose a Theme\",\n no_themes_available: \"No themes available\",\n buttons_heading: \"Buttons\",\n add_button: \"Add Button\",\n no_buttons_empty:\n \"No buttons yet. Add custom link buttons to display on your MySite.\",\n drag_to_reorder: \"Drag to reorder\",\n edit_button_aria: \"Edit button\",\n delete_button_aria: \"Delete button\",\n edit_button_dialog: \"Edit Button\",\n add_button_dialog: \"Add Button\",\n button_text_label: \"Button Text\",\n button_text_placeholder: \"Enter button text...\",\n url_label: \"URL\",\n url_placeholder: \"https://example.com\",\n button_updated: \"Button updated\",\n button_update_failed: \"Failed to update button\",\n button_created: \"Button created\",\n button_create_failed: \"Failed to create button\",\n delete_button_dialog: \"Delete Button\",\n delete_button_confirm:\n 'Are you sure you want to delete the button \"{{name}}\"? This action cannot be undone.',\n button_deleted: \"Button deleted\",\n button_delete_failed: \"Failed to delete button\",\n reorder_buttons_failed: \"Failed to reorder buttons\",\n content_heading: \"MySite Content\",\n no_content_empty:\n \"No featured content yet. Favorite products, media, or pages to display on your MySite.\",\n untitled: \"Untitled\",\n no_image: \"N/A\",\n remove_favorite_aria: \"Remove favorite\",\n remove_content_dialog: \"Remove Content\",\n remove_content_confirm:\n 'Are you sure you want to remove \"{{name}}\" from your MySite? This action cannot be undone.',\n content_removed: \"Content removed\",\n content_remove_failed: \"Failed to remove content\",\n reorder_content_failed: \"Failed to reorder content\",\n theme_changed: 'Theme changed to \"{{name}}\"',\n theme_update_failed: \"Failed to update theme\",\n type_media: \"Media\",\n type_playlist: \"Playlist\",\n type_enrollment_pack: \"Enrollment Pack\",\n type_page: \"Page\",\n validation_button_text_required: \"Button text is required\",\n validation_url_invalid: \"Must be a valid URL\",\n loading: \"Loading...\",\n} as const satisfies Record<string, string>;\n\nexport type MysiteDict = typeof mysiteEn;\n","import {\n createDomainTranslations,\n type DomainTranslations,\n} from \"@fluid-app/i18n/translations\";\nimport { createStaticDictAdapter } from \"@fluid-app/i18n/static-dict-adapter\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\nimport { mysiteEn, type MysiteDict } from \"./translation-dictionary\";\n\nexport const mysiteDomain: DomainTranslations<MysiteDict> =\n createDomainTranslations<MysiteDict>({\n fallback: mysiteEn,\n loaders: {\n de: () =>\n import(\"./locale/de.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n el: () =>\n import(\"./locale/el.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n es: () =>\n import(\"./locale/es.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n fr: () =>\n import(\"./locale/fr.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n he: () =>\n import(\"./locale/he.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n hu: () =>\n import(\"./locale/hu.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n id: () =>\n import(\"./locale/id.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n it: () =>\n import(\"./locale/it.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n ja: () =>\n import(\"./locale/ja.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n ko: () =>\n import(\"./locale/ko.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n nl: () =>\n import(\"./locale/nl.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n pl: () =>\n import(\"./locale/pl.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n pt: () =>\n import(\"./locale/pt.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n ro: () =>\n import(\"./locale/ro.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n ru: () =>\n import(\"./locale/ru.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n th: () =>\n import(\"./locale/th.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n tl: () =>\n import(\"./locale/tl.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n tr: () =>\n import(\"./locale/tr.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n zh_CN: () =>\n import(\"./locale/zh_CN.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n zh_TW: () =>\n import(\"./locale/zh_TW.json\").then(\n (m): MysiteDict => m.default as MysiteDict,\n ),\n },\n });\n\nexport function createMysiteTranslationAdapter(\n locale: string,\n dict: MysiteDict,\n): TranslationApi<MysiteDict> {\n return createStaticDictAdapter(locale, dict);\n}\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 application_theme_template_id: number | 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 application_theme_template_id: z.number().nullable(),\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\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 Dialog,\n Skeleton,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n Input,\n Label,\n useZodForm,\n} from \"@fluid-app/ui-primitives\";\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 } 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 truncatedUrl =\n link.url.length > 40 ? `${link.url.substring(0, 40)}...` : link.url;\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 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({ title: link.title, url: link.url });\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 <Dialog open={isAddEditDialogOpen} onOpenChange={setIsAddEditDialogOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>\n {editingLink ? t(\"edit_button_dialog\") : t(\"add_button_dialog\")}\n </DialogTitle>\n </DialogHeader>\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 </DialogContent>\n </Dialog>\n\n {/* Delete Confirmation Dialog */}\n <Dialog open={isDeleteDialogOpen} onOpenChange={setIsDeleteDialogOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{t(\"delete_button_dialog\")}</DialogTitle>\n </DialogHeader>\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 </DialogContent>\n </Dialog>\n </>\n );\n}\n","\"use client\";\nimport { useCallback, useState } from \"react\";\nimport { ArrowLeft, GripVertical, Trash2 } from \"lucide-react\";\nimport {\n Button,\n Card,\n Dialog,\n Skeleton,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from \"@fluid-app/ui-primitives\";\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 { 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 <Dialog\n open={isDeleteFavoriteDialogOpen}\n onOpenChange={setIsDeleteFavoriteDialogOpen}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{t(\"remove_content_dialog\")}</DialogTitle>\n </DialogHeader>\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 </DialogContent>\n </Dialog>\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:w-1/3 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:w-1/3 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 {t(\"breadcrumb\")}\n </BreadcrumbLink>\n ) : (\n <BreadcrumbPage className=\"font-semibold\">\n {t(\"breadcrumb\")}\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: \"My Site 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;;;AEFpC,MAAa,eACX,yBAAqC;CACnC,UDVoB;EACtB,YAAY;EACZ,SAAS;EACT,aAAa;EACb,WAAW;EACX,aAAa;EACb,aAAa;EACb,iBAAiB;EACjB,OAAO;EACP,OAAO;EACP,kBAAkB;EAClB,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,cAAc;EACd,oBAAoB;EACpB,aAAa;EACb,kBAAkB;EAClB,QAAQ;EACR,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,UAAU;EACV,QAAQ;EACR,UAAU;EACV,eAAe;EACf,SAAS;EACT,gBAAgB;EAChB,oBAAoB;EACpB,gBAAgB;EAChB,qBAAqB;EACrB,iBAAiB;EACjB,YAAY;EACZ,kBACE;EACF,iBAAiB;EACjB,kBAAkB;EAClB,oBAAoB;EACpB,oBAAoB;EACpB,mBAAmB;EACnB,mBAAmB;EACnB,yBAAyB;EACzB,WAAW;EACX,iBAAiB;EACjB,gBAAgB;EAChB,sBAAsB;EACtB,gBAAgB;EAChB,sBAAsB;EACtB,sBAAsB;EACtB,uBACE;EACF,gBAAgB;EAChB,sBAAsB;EACtB,wBAAwB;EACxB,iBAAiB;EACjB,kBACE;EACF,UAAU;EACV,UAAU;EACV,sBAAsB;EACtB,uBAAuB;EACvB,wBACE;EACF,iBAAiB;EACjB,uBAAuB;EACvB,wBAAwB;EACxB,eAAe;EACf,qBAAqB;EACrB,YAAY;EACZ,eAAe;EACf,sBAAsB;EACtB,WAAW;EACX,iCAAiC;EACjC,wBAAwB;EACxB,SAAS;EACV;CChEG,SAAS;EACP,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,UACE,OAAO,qBAAoB,MACxB,MAAkB,EAAE,QACtB;EACH,aACE,OAAO,wBAAuB,MAC3B,MAAkB,EAAE,QACtB;EACH,aACE,OAAO,wBAAuB,MAC3B,MAAkB,EAAE,QACtB;EACJ;CACF,CAAC;AAEJ,SAAgB,+BACd,QACA,MAC4B;AAC5B,QAAO,wBAAwB,QAAQ,KAAK;;;;AC1F9C,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;;;ACjDF,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,+BAA+B,EAAE,QAAQ,CAAC,UAAU;CACrD,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,aAAa,OAAuB;CAClD,MAAM,UAAU,MAAM,MAAM;AAC5B,KAAI,CAAC,QAAS,QAAO;AACrB,KAAI,gBAAgB,KAAK,QAAQ,CAAE,QAAO;AAC1C,QAAO,WAAW;;;;ACwBpB,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,eACJ,KAAK,IAAI,SAAS,KAAK,GAAG,KAAK,IAAI,UAAU,GAAG,GAAG,CAAC,OAAO,KAAK;AAElE,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,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;GAAE,OAAO,KAAK;GAAO,KAAK,KAAK;GAAK,CAAC;AACrD,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,QAAD;GAAQ,MAAM;GAAqB,cAAc;aAC/C,qBAAC,eAAD,EAAA,UAAA,CACE,oBAAC,cAAD,EAAA,UACE,oBAAC,aAAD,EAAA,UACG,cAAc,EAAE,qBAAqB,GAAG,EAAE,oBAAoB,EACnD,CAAA,EACD,CAAA,EACf,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;MACO,EAAA,CAAA;GACT,CAAA;EAGT,oBAAC,QAAD;GAAQ,MAAM;GAAoB,cAAc;aAC9C,qBAAC,eAAD,EAAA,UAAA;IACE,oBAAC,cAAD,EAAA,UACE,oBAAC,aAAD,EAAA,UAAc,EAAE,uBAAuB,EAAe,CAAA,EACzC,CAAA;IACf,oBAAC,KAAD;KAAG,WAAU;eACV,EAAE,yBAAyB,EAC1B,MAAM,cAAc,SAAS,IAC9B,CAAC;KACA,CAAA;IACJ,qBAAC,cAAD,EAAA,UAAA,CACE,oBAAC,QAAD;KACE,MAAK;KACL,SAAQ;KACR,SAAS;eAER,EAAE,SAAS;KACL,CAAA,EACT,oBAAC,QAAD;KACE,MAAK;KACL,SAAQ;KACR,SAAS;KACT,UAAU,mBAAmB;eAE5B,mBAAmB,YAAY,EAAE,WAAW,GAAG,EAAE,SAAS;KACpD,CAAA,CACI,EAAA,CAAA;IACD,EAAA,CAAA;GACT,CAAA;EACR,EAAA,CAAA;;;;ACzbP,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,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,oBAAC,QAAD;GACE,MAAM;GACN,cAAc;aAEd,qBAAC,eAAD,EAAA,UAAA;IACE,oBAAC,cAAD,EAAA,UACE,oBAAC,aAAD,EAAA,UAAc,EAAE,wBAAwB,EAAe,CAAA,EAC1C,CAAA;IACf,oBAAC,KAAD;KAAG,WAAU;eACV,EAAE,0BAA0B,EAC3B,MAAM,kBAAkB,QAAQ,EAAE,WAAW,EAC9C,CAAC;KACA,CAAA;IACJ,qBAAC,cAAD,EAAA,UAAA,CACE,oBAAC,QAAD;KACE,MAAK;KACL,SAAQ;KACR,SAAS;eAER,EAAE,SAAS;KACL,CAAA,EACT,oBAAC,QAAD;KACE,MAAK;KACL,SAAQ;KACR,SAAS;KACT,UAAU,uBAAuB;eAEhC,uBAAuB,YAAY,EAAE,WAAW,GAAG,EAAE,SAAS;KACxD,CAAA,CACI,EAAA,CAAA;IACD,EAAA,CAAA;GACT,CAAA;EACR,EAAA,CAAA;;;;ACtRP,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,kEAAkE;aAE7E,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;aAC/B,EAAE,aAAa;GACD,CAAA,GAEjB,oBAAC,gBAAD;GAAgB,WAAU;aACvB,EAAE,aAAa;GACD,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"}
|
|
@@ -303,8 +303,8 @@ function MySitePreviewPlaceholder({ hostLabel }) {
|
|
|
303
303
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
304
304
|
className: "bg-muted/30 absolute inset-0 flex flex-col items-center justify-center gap-3 p-4 text-center",
|
|
305
305
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
306
|
-
className: "bg-muted flex
|
|
307
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.Globe, { className: "text-muted-foreground
|
|
306
|
+
className: "bg-muted flex size-10 items-center justify-center rounded-full",
|
|
307
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.Globe, { className: "text-muted-foreground size-5" })
|
|
308
308
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
309
309
|
className: "text-foreground text-sm font-medium",
|
|
310
310
|
children: "My Site"
|
|
@@ -575,4 +575,4 @@ Object.defineProperty(exports, "mySiteWidgetPropertySchema", {
|
|
|
575
575
|
}
|
|
576
576
|
});
|
|
577
577
|
|
|
578
|
-
//# sourceMappingURL=MySiteWidget-
|
|
578
|
+
//# sourceMappingURL=MySiteWidget-23lGcDO1.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MySiteWidget-23lGcDO1.cjs","names":["useWidgetsApi","useWidgetPreviewContext","useDataSourceRegistryConfig","useWidgetPreviewContext","ErrorState","Globe","Check","Copy","ArrowUpRight","QRCodeSVG","useLayoutEffect","useEffect","getColorField","getBorderRadiusField"],"sources":["../../widgets/src/hooks/use-mysite.preview.ts","../../widgets/src/hooks/use-mysite.ts","../../widgets/src/widgets/MySiteWidget.tsx"],"sourcesContent":["import type { MySiteData } from \"@fluid-app/portal-core/widgets-api-types\";\n\nexport const PREVIEW_DATA: MySiteData = {\n url: \"https://mysite.example.com\",\n views: 1248,\n leads: 43,\n userName: \"Jane\",\n};\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useWidgetsApi } from \"@fluid-app/portal-core/widgets-api-context\";\nimport { useWidgetPreviewContext } from \"@fluid-app/portal-react/data-sources/preview-context\";\nimport { useDataSourceRegistryConfig } from \"@fluid-app/portal-react/data-sources/registry-context\";\nimport { PREVIEW_DATA } from \"./use-mysite.preview\";\nimport type { MySiteData } from \"@fluid-app/portal-core/widgets-api-types\";\n\nexport type { MySiteData } from \"@fluid-app/portal-core/widgets-api-types\";\n\nexport function useMySite(): UseQueryResult<MySiteData, Error> {\n const widgetsApi = useWidgetsApi();\n const { isPreview } = useWidgetPreviewContext();\n const { baseUrl } = useDataSourceRegistryConfig();\n\n return useQuery({\n queryKey: [\n \"portal-widget-use\",\n \"mysite\",\n isPreview ? \"preview\" : baseUrl,\n ] as const,\n queryFn: ({ signal }) => widgetsApi.fetchMySite(signal),\n enabled: !isPreview,\n ...(isPreview && { placeholderData: PREVIEW_DATA }),\n });\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ComponentProps,\n type CSSProperties,\n} from \"react\";\nimport type React from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n} from \"@fluid-app/portal-core/types\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport { useWidgetPreviewContext } from \"@fluid-app/portal-react/data-sources/preview-context\";\nimport { getBorderRadiusField, getColorField } from \"../core/fields\";\nimport { useMySite, type MySiteData } from \"../hooks/use-mysite\";\nimport { ErrorState } from \"../components/error-state\";\nimport { QRCodeSVG } from \"qrcode.react\";\nimport { ArrowUpRight, Check, Copy, Globe } from \"lucide-react\";\n\ntype MySiteWidgetProps = ComponentProps<\"div\"> & {\n // Design\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n borderRadius?: BorderRadiusOptions;\n\n // Display toggles\n showPreview?: boolean;\n showAnalytics?: boolean;\n showLiveBadge?: boolean;\n showQR?: boolean;\n};\n\nconst formatCompactNumber = (n: number | undefined): string => {\n const value = n ?? 0;\n if (value < 1000) return value.toLocaleString();\n if (value < 10_000) return `${(value / 1000).toFixed(1)}k`;\n if (value < 1_000_000) return `${Math.round(value / 1000)}k`;\n return `${(value / 1_000_000).toFixed(1)}m`;\n};\n\nconst splitUrl = (url: string): { prefix: string; path: string } => {\n try {\n const parsed = new URL(url);\n return {\n prefix: `${parsed.protocol}//${parsed.host}`,\n path:\n `${parsed.pathname}${parsed.search}${parsed.hash}`.replace(\n /^\\/$/,\n \"\",\n ) || \"\",\n };\n } catch {\n return { prefix: \"\", path: url };\n }\n};\n\nexport function MySiteWidget({\n background = { type: \"solid\", color: \"background\" },\n textColor = \"foreground\",\n accentColor = \"primary\",\n borderRadius = \"xl\",\n\n showPreview = true,\n showAnalytics = true,\n showLiveBadge = true,\n showQR = true,\n\n className,\n ...props\n}: MySiteWidgetProps): React.JSX.Element | null {\n const { copyState, markCopied } = useTimedCopyState(1600);\n const { rootRef: widgetRootRef, isWide } = useIsContainerWide(720);\n const {\n frameRef: previewFrameRef,\n scale,\n iframeHeight,\n } = useScaledIframePreview({\n viewportWidth: 1280,\n minIframeHeight: 500,\n });\n\n const backgroundColor = background.color || \"background\";\n const backgroundImage =\n (background.resource?.image_url || background.resource?.imageUrl) &&\n background.type === \"image\"\n ? `url(${background.resource.image_url || background.resource.imageUrl})`\n : \"none\";\n\n const { data: mySite, isLoading, isError } = useMySite();\n const { isPreview } = useWidgetPreviewContext();\n const realMySite = useRealMySiteData(mySite, isPreview);\n const { hasRealSite, url, views, leads } = realMySite;\n const { previewUrl, hostLabel, urlPrefix, urlPath } =\n useMySiteDisplayUrls(url);\n const showDashboardLayout = isWide && hasRealSite;\n const showStats = showAnalytics && hasRealSite;\n const showFooter = hasRealSite;\n\n const handleCopy = async () => {\n if (!url) return;\n try {\n await navigator.clipboard.writeText(url);\n markCopied();\n } catch (error) {\n console.error(\"Failed to copy MySite URL:\", error);\n }\n };\n\n if (!isLoading && !isError && !isPreview && !hasRealSite) {\n return null;\n }\n\n // Hairline divider color — subtle, theme-aware\n const divider: CSSProperties = {\n borderTop: `1px solid color-mix(in oklch, var(--color-${textColor}) 8%, transparent)`,\n };\n\n return (\n <div\n ref={widgetRootRef}\n className={`@container relative overflow-hidden rounded-${borderRadius} bg-${backgroundColor} text-${textColor} ${className ?? \"\"}`}\n style={{\n backgroundImage,\n boxShadow: `0 1px 2px rgba(15,23,42,0.04), 0 20px 40px -24px rgba(15,23,42,0.16), inset 0 0 0 1px color-mix(in oklch, var(--color-${textColor}) 7%, transparent)`,\n }}\n {...props}\n >\n {isLoading ? (\n <MySiteSkeleton\n textColor={textColor}\n accentColor={accentColor}\n borderRadius={borderRadius}\n />\n ) : isError ? (\n <div className=\"p-6\">\n <ErrorState />\n </div>\n ) : showDashboardLayout ? (\n <div className=\"flex items-stretch\">\n {/* Left: site preview */}\n {showPreview && (\n <div\n className=\"relative isolate shrink-0 bg-white\"\n style={{\n width: \"45%\",\n borderRight: `1px solid color-mix(in oklch, var(--color-${textColor}) 10%, transparent)`,\n }}\n >\n <div\n ref={previewFrameRef}\n className=\"relative h-full w-full overflow-hidden bg-white\"\n >\n <iframe\n className=\"pointer-events-none absolute top-0 left-0 origin-top-left bg-white\"\n src={previewUrl}\n title={`${hostLabel} preview`}\n loading=\"lazy\"\n style={{\n width: \"1280px\",\n height: `${iframeHeight}px`,\n transform: `scale(${scale})`,\n }}\n />\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-x-0 top-0 h-px\"\n style={{\n background:\n \"linear-gradient(to right, transparent, rgba(255,255,255,0.7), transparent)\",\n }}\n />\n </div>\n\n {showLiveBadge && (\n <div className=\"absolute top-4 left-4\">\n <span\n className={`inline-flex items-center gap-1.5 rounded-${borderRadius} bg-white px-2.5 py-1 text-[10px] font-bold tracking-[0.18em] text-slate-700 uppercase`}\n style={{\n boxShadow:\n \"0 2px 8px rgba(15,23,42,0.08), inset 0 0 0 1px rgba(15,23,42,0.06)\",\n }}\n >\n <span\n aria-hidden=\"true\"\n className={`bg-${accentColor} size-1.5 rounded-full`}\n />\n Live\n </span>\n </div>\n )}\n </div>\n )}\n\n {/* Right: dashboard column */}\n <div className=\"flex min-w-0 flex-1 flex-col gap-3.5 p-5 sm:p-6\">\n <div>\n <span\n className={`text-[10px] font-bold tracking-[0.2em] uppercase text-${textColor}/55`}\n >\n Your Storefront\n </span>\n <h2\n className={`mt-1 text-[22px] leading-[1.1] font-bold tracking-[-0.02em] text-${textColor}`}\n >\n You’re live\n </h2>\n </div>\n\n {hasRealSite && (\n <button\n type=\"button\"\n onClick={handleCopy}\n aria-label={\n copyState === \"copied\"\n ? \"Copied to clipboard\"\n : \"Copy site link\"\n }\n className={`group/copy flex items-center gap-2.5 rounded-${borderRadius} px-3 py-2 text-[13px] transition-all duration-300 focus:outline-none focus-visible:ring-2 focus-visible:ring-${accentColor}/40 ${copyState === \"copied\" ? `bg-${accentColor}/10` : `bg-${textColor}/5 hover:bg-${textColor}/10`}`}\n style={{\n boxShadow: `inset 0 0 0 1px color-mix(in oklch, var(--color-${textColor}) 10%, transparent)`,\n }}\n >\n <Globe className={`size-3.5 shrink-0 text-${textColor}/55`} />\n <span\n className={`min-w-0 flex-1 truncate text-left font-semibold tabular-nums text-${textColor}`}\n >\n {hostLabel}\n {urlPath}\n </span>\n <span\n className={`flex size-7 shrink-0 items-center justify-center rounded-full transition-all duration-300 ${copyState === \"copied\" ? `bg-${accentColor} text-${accentColor}-foreground` : `bg-${textColor} text-${backgroundColor}`}`}\n >\n {copyState === \"copied\" ? (\n <Check className=\"size-3\" />\n ) : (\n <Copy className=\"size-3\" />\n )}\n </span>\n </button>\n )}\n\n {showStats && (\n <>\n <div\n style={{\n borderTop: `1px solid color-mix(in oklch, var(--color-${textColor}) 10%, transparent)`,\n }}\n />\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <div\n className={`text-[10px] font-bold tracking-[0.18em] uppercase text-${textColor}/55`}\n >\n Visitors\n </div>\n <div\n className={`mt-1 text-[32px] leading-none font-bold tracking-[-0.02em] tabular-nums text-${textColor}`}\n >\n {formatCompactNumber(views)}\n </div>\n </div>\n <div>\n <div\n className={`text-[10px] font-bold tracking-[0.18em] uppercase text-${textColor}/55`}\n >\n Leads\n </div>\n <div\n className={`mt-1 text-[32px] leading-none font-bold tracking-[-0.02em] tabular-nums text-${textColor}`}\n >\n {formatCompactNumber(leads)}\n </div>\n </div>\n </div>\n </>\n )}\n\n {hasRealSite && (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={`group/visit mt-auto inline-flex items-center justify-between gap-2 rounded-${borderRadius} bg-${accentColor} px-4 py-3 text-[13px] font-bold text-${accentColor}-foreground transition-all duration-300 hover:shadow-[0_12px_28px_-8px_color-mix(in_oklch,var(--color-${accentColor})_60%,transparent)]`}\n >\n <span>Open the live site</span>\n <ArrowUpRight className=\"size-3.5 transition-transform duration-300 group-hover/visit:translate-x-0.5 group-hover/visit:-translate-y-0.5\" />\n </a>\n )}\n </div>\n </div>\n ) : (\n <div className=\"flex flex-col\">\n {/* Card body: site preview — flush to the top of the card */}\n {showPreview && (hasRealSite || isPreview) && (\n <div className=\"relative isolate bg-white\">\n <div\n ref={previewFrameRef}\n className=\"relative aspect-[16/10] w-full overflow-hidden bg-white\"\n >\n {isPreview || !hasRealSite ? (\n <MySitePreviewPlaceholder hostLabel={hostLabel} />\n ) : (\n <iframe\n className=\"pointer-events-none absolute top-0 left-0 origin-top-left bg-white\"\n src={previewUrl}\n title={`${hostLabel} preview`}\n loading=\"lazy\"\n style={{\n width: \"1280px\",\n height: `${iframeHeight}px`,\n transform: `scale(${scale})`,\n }}\n />\n )}\n {/* Very subtle top-edge sheen for polish */}\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-x-0 top-0 h-px\"\n style={{\n background:\n \"linear-gradient(to right, transparent, rgba(255,255,255,0.7), transparent)\",\n }}\n />\n </div>\n\n {/* LIVE badge — quiet, not blinking */}\n {showLiveBadge && hasRealSite && (\n <div className=\"absolute top-3 right-3\">\n <span\n className={`inline-flex items-center gap-1.5 rounded-${borderRadius} bg-white px-2 py-1 text-[9px] font-bold tracking-[0.18em] text-slate-700 uppercase`}\n style={{\n boxShadow:\n \"0 2px 8px rgba(15,23,42,0.08), inset 0 0 0 1px rgba(15,23,42,0.06)\",\n }}\n >\n <span\n aria-hidden=\"true\"\n className={`bg-${accentColor} size-1.5 rounded-full`}\n />\n Live\n </span>\n </div>\n )}\n </div>\n )}\n\n {/* Card footer — distinct tinted surface, QR column + right column */}\n {showFooter && (\n <div\n className=\"flex items-stretch\"\n style={{\n borderTop: `1px solid color-mix(in oklch, var(--color-${textColor}) 10%, transparent)`,\n background: `color-mix(in oklch, var(--color-${textColor}) 3%, transparent)`,\n }}\n >\n {/* QR column — spans the full footer height */}\n {showQR && hasRealSite && (\n <div\n className=\"flex shrink-0 items-center justify-center p-4\"\n style={{\n borderRight: `1px solid color-mix(in oklch, var(--color-${textColor}) 8%, transparent)`,\n }}\n >\n <div\n className={`flex flex-col items-center gap-1.5 rounded-${borderRadius} bg-white p-2.5`}\n style={{\n boxShadow:\n \"0 2px 8px rgba(15,23,42,0.05), inset 0 0 0 1px rgba(15,23,42,0.06)\",\n }}\n role=\"img\"\n aria-label=\"QR code for your site\"\n >\n <QRCodeSVG\n value={url}\n size={64}\n level=\"H\"\n bgColor=\"#ffffff\"\n fgColor=\"#0f172a\"\n />\n </div>\n </div>\n )}\n\n {/* Right column */}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n {/* Stats row */}\n {showStats && (\n <div className=\"grid grid-cols-2\">\n <StatCell\n label=\"Visitors\"\n value={formatCompactNumber(views)}\n textColor={textColor}\n />\n <StatCell\n label=\"Leads\"\n value={formatCompactNumber(leads)}\n textColor={textColor}\n leftDivider\n />\n </div>\n )}\n\n {/* Action row */}\n {hasRealSite && (\n <div\n className=\"flex items-center gap-2 px-4 py-3\"\n style={showStats ? divider : undefined}\n >\n <button\n type=\"button\"\n onClick={handleCopy}\n aria-label={\n copyState === \"copied\"\n ? \"Copied to clipboard\"\n : \"Copy site link\"\n }\n className={`group/copy flex min-w-0 flex-1 items-center justify-between gap-2 rounded-${borderRadius} px-3 py-2 text-left text-[12px] transition-all duration-300 focus:outline-none focus-visible:ring-2 focus-visible:ring-${accentColor}/40 ${copyState === \"copied\" ? `bg-${accentColor}/10` : `bg-${textColor}/5 hover:bg-${textColor}/10`}`}\n style={{\n boxShadow: `inset 0 0 0 1px color-mix(in oklch, var(--color-${textColor}) 8%, transparent)`,\n }}\n >\n <span\n className={`min-w-0 flex-1 truncate font-medium text-${textColor}`}\n >\n {urlPrefix && (\n <span className={`text-${textColor}/45`}>\n {urlPrefix}\n </span>\n )}\n <span className=\"font-semibold\">{urlPath || \"/\"}</span>\n </span>\n <span\n className={`flex size-6 shrink-0 items-center justify-center rounded-full transition-all duration-300 ${copyState === \"copied\" ? `scale-105 bg-${accentColor} text-${accentColor}-foreground` : `bg-${textColor}/10 text-${textColor} group-hover/copy:bg-${textColor}/20`}`}\n >\n {copyState === \"copied\" ? (\n <Check className=\"size-3\" />\n ) : (\n <Copy className=\"size-3\" />\n )}\n </span>\n </button>\n\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label=\"Visit site\"\n className={`group/visit inline-flex size-9 shrink-0 items-center justify-center rounded-${borderRadius} bg-${accentColor} text-${accentColor}-foreground transition-all duration-300 hover:shadow-[0_10px_24px_-8px_color-mix(in_oklch,var(--color-${accentColor})_60%,transparent)]`}\n >\n <ArrowUpRight className=\"size-3.5 transition-transform duration-300 group-hover/visit:translate-x-0.5 group-hover/visit:-translate-y-0.5\" />\n </a>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\ntype MySitePreviewPlaceholderProps = {\n hostLabel: string;\n};\n\n// Static placeholder shown in builder/preview contexts. Preview mode keeps\n// placeholder API values out of visible widget content.\nfunction MySitePreviewPlaceholder({\n hostLabel,\n}: MySitePreviewPlaceholderProps): React.JSX.Element {\n return (\n <div className=\"bg-muted/30 absolute inset-0 flex flex-col items-center justify-center gap-3 p-4 text-center\">\n <div className=\"bg-muted flex size-10 items-center justify-center rounded-full\">\n <Globe className=\"text-muted-foreground size-5\" />\n </div>\n <div>\n <p className=\"text-foreground text-sm font-medium\">My Site</p>\n {hostLabel && (\n <p className=\"text-muted-foreground mt-0.5 text-xs\">{hostLabel}</p>\n )}\n </div>\n </div>\n );\n}\n\ntype StatCellProps = {\n label: string;\n value: string;\n textColor: ColorOptions;\n leftDivider?: boolean;\n};\n\nfunction StatCell({ label, value, textColor, leftDivider }: StatCellProps) {\n const leftDividerStyle: CSSProperties | undefined = leftDivider\n ? {\n borderLeft: `1px solid color-mix(in oklch, var(--color-${textColor}) 8%, transparent)`,\n }\n : undefined;\n\n return (\n <div className=\"flex flex-col gap-1.5 px-5 py-4\" style={leftDividerStyle}>\n <span\n className={`text-[10px] font-bold tracking-[0.16em] uppercase text-${textColor}/55`}\n >\n {label}\n </span>\n <span\n className={`text-[22px] leading-none font-bold tracking-[-0.02em] tabular-nums text-${textColor}`}\n >\n {value}\n </span>\n </div>\n );\n}\n\ntype MySiteSkeletonProps = {\n textColor: ColorOptions;\n accentColor: ColorOptions;\n borderRadius: BorderRadiusOptions;\n};\n\nfunction MySiteSkeleton({\n textColor,\n accentColor,\n borderRadius,\n}: MySiteSkeletonProps) {\n const divider: CSSProperties = {\n borderTop: `1px solid color-mix(in oklch, var(--color-${textColor}) 8%, transparent)`,\n };\n\n return (\n <div className=\"flex animate-pulse flex-col\" aria-busy=\"true\">\n <div\n className={`relative aspect-[16/10] w-full overflow-hidden bg-${textColor}/5`}\n />\n\n <div\n className=\"flex items-stretch\"\n style={{\n borderTop: `1px solid color-mix(in oklch, var(--color-${textColor}) 10%, transparent)`,\n background: `color-mix(in oklch, var(--color-${textColor}) 3%, transparent)`,\n }}\n >\n {/* QR placeholder column */}\n <div\n className=\"flex shrink-0 items-center justify-center p-4\"\n style={{\n borderRight: `1px solid color-mix(in oklch, var(--color-${textColor}) 8%, transparent)`,\n }}\n >\n <div\n className={`size-[84px] rounded-${borderRadius} bg-${textColor}/10`}\n />\n </div>\n\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"grid grid-cols-2\">\n {[0, 1].map((i) => (\n <div\n key={i}\n className=\"flex flex-col gap-2 px-5 py-4\"\n style={\n i > 0\n ? {\n borderLeft: `1px solid color-mix(in oklch, var(--color-${textColor}) 8%, transparent)`,\n }\n : undefined\n }\n >\n <div className={`h-2 w-14 rounded-full bg-${textColor}/10`} />\n <div className={`h-5 w-16 rounded-full bg-${textColor}/15`} />\n </div>\n ))}\n </div>\n\n <div className=\"flex items-center gap-2 px-4 py-3\" style={divider}>\n <div\n className={`h-8 flex-1 rounded-${borderRadius} bg-${textColor}/10`}\n />\n <div\n className={`size-9 shrink-0 rounded-${borderRadius} bg-${accentColor}/30`}\n />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n// ----- Hooks -----\n\ntype CopyState = \"idle\" | \"copied\";\n\nfunction useRealMySiteData(mySite: MySiteData | undefined, isPreview: boolean) {\n return useMemo(() => {\n if (isPreview || !mySite?.url) {\n return {\n hasRealSite: false,\n url: \"\",\n views: 0,\n leads: 0,\n userName: \"\",\n };\n }\n\n return {\n hasRealSite: true,\n url: mySite.url,\n views: mySite.views,\n leads: mySite.leads,\n userName: mySite.userName,\n };\n }, [isPreview, mySite]);\n}\n\nfunction useMySiteDisplayUrls(url: string) {\n const previewUrl = useMemo(() => {\n if (!url) return \"\";\n try {\n const urlObj = new URL(url);\n urlObj.searchParams.set(\"preview\", \"true\");\n return urlObj.toString();\n } catch {\n return url;\n }\n }, [url]);\n\n const hostLabel = useMemo(() => {\n if (!url) return \"\";\n try {\n return new URL(url).host;\n } catch {\n return url.replace(/^https?:\\/\\//, \"\");\n }\n }, [url]);\n\n const { prefix: urlPrefix, path: urlPath } = useMemo(\n () => (url ? splitUrl(url) : { prefix: \"\", path: \"\" }),\n [url],\n );\n\n return { previewUrl, hostLabel, urlPrefix, urlPath };\n}\n\nfunction useTimedCopyState(timeoutMs: number) {\n const [copyState, setCopyState] = useState<CopyState>(\"idle\");\n\n useEffect(() => {\n if (copyState !== \"copied\") return;\n const id = window.setTimeout(() => setCopyState(\"idle\"), timeoutMs);\n return () => window.clearTimeout(id);\n }, [copyState, timeoutMs]);\n\n const markCopied = useCallback(() => {\n setCopyState(\"copied\");\n }, []);\n\n return { copyState, markCopied };\n}\n\n// useLayoutEffect warns on the server. Widgets are client-rendered, but guard\n// for parity with the rest of the codebase.\nconst useIsoLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\n// Switches to a \"wide\" layout once the container reaches `threshold` px.\n// Uses useLayoutEffect so the initial measurement and state-flip land\n// synchronously before paint, avoiding a narrow→wide flash on mount.\nfunction useIsContainerWide(threshold: number) {\n const rootRef = useRef<HTMLDivElement | null>(null);\n const [isWide, setIsWide] = useState(false);\n\n useIsoLayoutEffect(() => {\n const el = rootRef.current;\n if (!el) return;\n const update = () => setIsWide(el.clientWidth >= threshold);\n update();\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => ro.disconnect();\n }, [threshold]);\n\n return { rootRef, isWide };\n}\n\ntype ScaledIframePreviewOptions = {\n viewportWidth: number;\n minIframeHeight: number;\n};\n\n// Renders the iframe at a real desktop viewport (`viewportWidth`) and scales\n// it to fit the actual container. The iframe's rendered height is computed\n// dynamically so it fills the container in both aspect-locked compact mode\n// AND the height-driven wide mode (no whitespace gap below the preview).\nfunction useScaledIframePreview({\n viewportWidth,\n minIframeHeight,\n}: ScaledIframePreviewOptions) {\n const [metrics, setMetrics] = useState({\n scale: 0.5,\n iframeHeight: minIframeHeight,\n });\n\n const frameRef = useCallback(\n (el: HTMLDivElement | null) => {\n if (!el) return;\n const update = () => {\n const w = el.clientWidth;\n const h = el.clientHeight;\n if (w > 0 && h > 0) {\n const scale = w / viewportWidth;\n const iframeHeight = Math.max(minIframeHeight, h / scale);\n setMetrics((prev) =>\n prev.scale === scale && prev.iframeHeight === iframeHeight\n ? prev\n : { scale, iframeHeight },\n );\n }\n };\n update();\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => ro.disconnect();\n },\n [viewportWidth, minIframeHeight],\n );\n\n return { frameRef, scale: metrics.scale, iframeHeight: metrics.iframeHeight };\n}\n\nexport const mySiteWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"MySiteWidget\",\n displayName: \"MySite Widget\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [\n // Display group\n {\n key: \"showPreview\",\n label: \"Show Site Preview\",\n type: \"boolean\",\n description: \"Show the live iframe preview of the storefront\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Display\",\n },\n {\n key: \"showAnalytics\",\n label: \"Show Stats\",\n type: \"boolean\",\n description: \"Visitors and Leads grid in the footer\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Display\",\n },\n {\n key: \"showLiveBadge\",\n label: \"Show LIVE Badge\",\n type: \"boolean\",\n description: \"Small 'Live' chip in the preview corner\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Display\",\n },\n {\n key: \"showQR\",\n label: \"Show QR Code\",\n type: \"boolean\",\n description: \"Show a scannable QR code in the card footer\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Display\",\n },\n\n // Design group\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the widget container\",\n defaultValue: \"background\",\n tab: \"styling\",\n group: \"Design\",\n },\n getColorField({\n key: \"textColor\",\n label: \"Text Color\",\n description: \"Primary text, hairline, and neutral chip color\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Design\",\n }),\n getColorField({\n key: \"accentColor\",\n label: \"Accent Color\",\n description: \"Drives the Live dot, conversion ring, and Visit CTA\",\n defaultValue: \"primary\",\n tab: \"styling\",\n group: \"Design\",\n }),\n {\n key: \"separator\",\n type: \"separator\",\n label: \"Separator\",\n tab: \"styling\",\n group: \"Design\",\n },\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Corner radius for the widget and inner chips\",\n defaultValue: \"xl\",\n tab: \"styling\",\n group: \"Design\",\n }),\n ],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR;EAGD;GACE,MAAM;GACN,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR;EACDC,mBAAAA,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACFA,mBAAAA,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACF;GACE,KAAK;GACL,MAAM;GACN,OAAO;GACP,KAAK;GACL,OAAO;GACR;EACDC,mBAAAA,qBAAqB;GACnB,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACH;CACF"}
|