@fayz-ai/admin 0.62.0 → 0.65.2

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.
Files changed (171) hide show
  1. package/dist/{CommandPalette-B5PMQFDG.js → CommandPalette-XDJJ5E3O.js} +3 -3
  2. package/dist/{CommandPalette-B5PMQFDG.js.map → CommandPalette-XDJJ5E3O.js.map} +1 -1
  3. package/dist/ConnectedBrandingSettings-43ZM3HCI.js +680 -0
  4. package/dist/ConnectedBrandingSettings-43ZM3HCI.js.map +1 -0
  5. package/dist/ConnectedCompanySettings-I4MALI2Q.js +197 -0
  6. package/dist/ConnectedCompanySettings-I4MALI2Q.js.map +1 -0
  7. package/dist/ConnectedModulesSettings-A2VJ5BMJ.js +563 -0
  8. package/dist/ConnectedModulesSettings-A2VJ5BMJ.js.map +1 -0
  9. package/dist/ConnectedSecuritySettings-25AHA4HJ.js +189 -0
  10. package/dist/ConnectedSecuritySettings-25AHA4HJ.js.map +1 -0
  11. package/dist/ConnectedUserProfile-E7USJRUE.js +424 -0
  12. package/dist/ConnectedUserProfile-E7USJRUE.js.map +1 -0
  13. package/dist/FieldRulesEditor-YGIPKI5T.js +129 -0
  14. package/dist/FieldRulesEditor-YGIPKI5T.js.map +1 -0
  15. package/dist/GettingStartedWidget-HMIJ3Y24.js +12 -0
  16. package/dist/GettingStartedWidget-HMIJ3Y24.js.map +1 -0
  17. package/dist/PermissionProfilesTab-3ZPRCHMZ.js +548 -0
  18. package/dist/PermissionProfilesTab-3ZPRCHMZ.js.map +1 -0
  19. package/dist/PersonTimeline-HQZT527S.js +3 -0
  20. package/dist/{PersonTimeline-X7JTPUWJ.js.map → PersonTimeline-HQZT527S.js.map} +1 -1
  21. package/dist/ProjectsSettings-7O2F27MD.js +5 -0
  22. package/dist/ProjectsSettings-7O2F27MD.js.map +1 -0
  23. package/dist/ScheduleEditor-54ELWR45.js +8 -0
  24. package/dist/{ScheduleEditor-L2UJXKMY.js.map → ScheduleEditor-54ELWR45.js.map} +1 -1
  25. package/dist/SeuSiteWidget-QLSUVC63.js +6 -0
  26. package/dist/SeuSiteWidget-QLSUVC63.js.map +1 -0
  27. package/dist/SubscriptionPage-5GE5HFJK.js +17 -0
  28. package/dist/{SubscriptionPage-IDVEFLZ5.js.map → SubscriptionPage-5GE5HFJK.js.map} +1 -1
  29. package/dist/TeamTab-6RAULFLW.js +502 -0
  30. package/dist/TeamTab-6RAULFLW.js.map +1 -0
  31. package/dist/TrialWidget-Z6CLUCU3.js +7 -0
  32. package/dist/TrialWidget-Z6CLUCU3.js.map +1 -0
  33. package/dist/app/AdminShell.d.ts.map +1 -1
  34. package/dist/app/admin-app.d.ts.map +1 -1
  35. package/dist/app/config.d.ts +14 -0
  36. package/dist/app/config.d.ts.map +1 -1
  37. package/dist/app/routing.d.ts +6 -0
  38. package/dist/app/routing.d.ts.map +1 -1
  39. package/dist/app/scaffold.d.ts.map +1 -1
  40. package/dist/billing/index.js +9 -4
  41. package/dist/chunk-2H46WDG5.js +53 -0
  42. package/dist/chunk-2H46WDG5.js.map +1 -0
  43. package/dist/chunk-3HLX7YB2.js +94 -0
  44. package/dist/chunk-3HLX7YB2.js.map +1 -0
  45. package/dist/chunk-3OUD4XBK.js +3 -0
  46. package/dist/chunk-3OUD4XBK.js.map +1 -0
  47. package/dist/{chunk-IXSY4GPK.js → chunk-5D5QLMOQ.js} +5 -3
  48. package/dist/chunk-5D5QLMOQ.js.map +1 -0
  49. package/dist/chunk-5WR62X2R.js +1081 -0
  50. package/dist/chunk-5WR62X2R.js.map +1 -0
  51. package/dist/{chunk-KPYRTOCK.js → chunk-6CQFGMEO.js} +4 -140
  52. package/dist/chunk-6CQFGMEO.js.map +1 -0
  53. package/dist/chunk-6MMSYC2I.js +116 -0
  54. package/dist/chunk-6MMSYC2I.js.map +1 -0
  55. package/dist/chunk-6QFOE3UD.js +1466 -0
  56. package/dist/chunk-6QFOE3UD.js.map +1 -0
  57. package/dist/chunk-6UUFVQ2E.js +283 -0
  58. package/dist/chunk-6UUFVQ2E.js.map +1 -0
  59. package/dist/chunk-7WNLL3F6.js +7889 -0
  60. package/dist/chunk-7WNLL3F6.js.map +1 -0
  61. package/dist/chunk-A74IHAQE.js +439 -0
  62. package/dist/chunk-A74IHAQE.js.map +1 -0
  63. package/dist/{chunk-JOBRLBIQ.js → chunk-AFA6IO23.js} +4 -3
  64. package/dist/chunk-AFA6IO23.js.map +1 -0
  65. package/dist/{chunk-P5UIGQFY.js → chunk-ALCSIN3Z.js} +5 -5
  66. package/dist/chunk-ALCSIN3Z.js.map +1 -0
  67. package/dist/chunk-AWM4AMBS.js +39 -0
  68. package/dist/chunk-AWM4AMBS.js.map +1 -0
  69. package/dist/{chunk-OQARLKZN.js → chunk-BG5Z6KLN.js} +6 -18
  70. package/dist/chunk-BG5Z6KLN.js.map +1 -0
  71. package/dist/chunk-DPNFZONC.js +19 -0
  72. package/dist/chunk-DPNFZONC.js.map +1 -0
  73. package/dist/chunk-DRCV643L.js +193 -0
  74. package/dist/chunk-DRCV643L.js.map +1 -0
  75. package/dist/chunk-E6DF3VR6.js +206 -0
  76. package/dist/chunk-E6DF3VR6.js.map +1 -0
  77. package/dist/chunk-ENHCVGXZ.js +120 -0
  78. package/dist/chunk-ENHCVGXZ.js.map +1 -0
  79. package/dist/chunk-FK6RHGI7.js +56 -0
  80. package/dist/chunk-FK6RHGI7.js.map +1 -0
  81. package/dist/chunk-G5HNA5QK.js +233 -0
  82. package/dist/chunk-G5HNA5QK.js.map +1 -0
  83. package/dist/chunk-HCFO4Z6A.js +53 -0
  84. package/dist/chunk-HCFO4Z6A.js.map +1 -0
  85. package/dist/chunk-JFIU6NQP.js +51 -0
  86. package/dist/chunk-JFIU6NQP.js.map +1 -0
  87. package/dist/chunk-JRZJBMOY.js +3 -0
  88. package/dist/chunk-JRZJBMOY.js.map +1 -0
  89. package/dist/{chunk-3YP7KW47.js → chunk-JVVOL4BB.js} +41 -512
  90. package/dist/chunk-JVVOL4BB.js.map +1 -0
  91. package/dist/chunk-KAQ3UIAA.js +415 -0
  92. package/dist/chunk-KAQ3UIAA.js.map +1 -0
  93. package/dist/{chunk-P6XUDT2P.js → chunk-KJELMULA.js} +4 -51
  94. package/dist/chunk-KJELMULA.js.map +1 -0
  95. package/dist/chunk-KLO7DKXX.js +1651 -0
  96. package/dist/chunk-KLO7DKXX.js.map +1 -0
  97. package/dist/chunk-M2CMDWUI.js +75 -0
  98. package/dist/chunk-M2CMDWUI.js.map +1 -0
  99. package/dist/chunk-PQ47MLTH.js +255 -0
  100. package/dist/chunk-PQ47MLTH.js.map +1 -0
  101. package/dist/{chunk-VX3WJLKK.js → chunk-QD7BMUDF.js} +17 -8
  102. package/dist/chunk-QD7BMUDF.js.map +1 -0
  103. package/dist/{chunk-E4MESMNR.js → chunk-QTSKCPSW.js} +7 -10
  104. package/dist/chunk-QTSKCPSW.js.map +1 -0
  105. package/dist/chunk-S56FQKPL.js +186 -0
  106. package/dist/chunk-S56FQKPL.js.map +1 -0
  107. package/dist/chunk-SGAFPNMA.js +75 -0
  108. package/dist/chunk-SGAFPNMA.js.map +1 -0
  109. package/dist/{chunk-OD7P4L3D.js → chunk-SOKCLVM4.js} +3 -3
  110. package/dist/{chunk-OD7P4L3D.js.map → chunk-SOKCLVM4.js.map} +1 -1
  111. package/dist/chunk-TL42NKTH.js +3 -0
  112. package/dist/chunk-TL42NKTH.js.map +1 -0
  113. package/dist/chunk-U6ZCO2PS.js +2964 -0
  114. package/dist/chunk-U6ZCO2PS.js.map +1 -0
  115. package/dist/chunk-VSXNROYH.js +16 -0
  116. package/dist/chunk-VSXNROYH.js.map +1 -0
  117. package/dist/chunk-WPFZCYZL.js +619 -0
  118. package/dist/chunk-WPFZCYZL.js.map +1 -0
  119. package/dist/chunk-XFTNIBDW.js +23 -0
  120. package/dist/chunk-XFTNIBDW.js.map +1 -0
  121. package/dist/chunk-Y66JDL6I.js +1020 -0
  122. package/dist/chunk-Y66JDL6I.js.map +1 -0
  123. package/dist/chunk-YEHIBPIX.js +137 -0
  124. package/dist/chunk-YEHIBPIX.js.map +1 -0
  125. package/dist/chunk-YKPPCV2Z.js +53 -0
  126. package/dist/chunk-YKPPCV2Z.js.map +1 -0
  127. package/dist/components/chat/markdown.d.ts.map +1 -1
  128. package/dist/components/plugins/PluginSettingsPanel.d.ts.map +1 -1
  129. package/dist/components/settings/SettingsPage.d.ts.map +1 -1
  130. package/dist/connect-XKQJOWR7.js +18 -0
  131. package/dist/connect-XKQJOWR7.js.map +1 -0
  132. package/dist/crud/CrudDetailPage.d.ts.map +1 -1
  133. package/dist/crud/CrudListView.d.ts.map +1 -1
  134. package/dist/crud/CrudPage.d.ts.map +1 -1
  135. package/dist/crud/RelatedListTab.d.ts.map +1 -1
  136. package/dist/crud/archetypes/EntityLink.d.ts +1 -1
  137. package/dist/crud/archetypes/EntityLink.d.ts.map +1 -1
  138. package/dist/crud/record-chrome.d.ts.map +1 -1
  139. package/dist/entity-routes-PGU7EHAD.js +4 -0
  140. package/dist/{entity-routes-LXOBW5IB.js.map → entity-routes-PGU7EHAD.js.map} +1 -1
  141. package/dist/hooks/useModuleNavigation.d.ts.map +1 -1
  142. package/dist/impersonation/ImpersonateDialog.d.ts.map +1 -1
  143. package/dist/impersonation/session.d.ts.map +1 -1
  144. package/dist/index.d.ts +2 -2
  145. package/dist/index.d.ts.map +1 -1
  146. package/dist/index.js +11951 -33576
  147. package/dist/index.js.map +1 -1
  148. package/dist/lib/attention.d.ts +6 -0
  149. package/dist/lib/attention.d.ts.map +1 -1
  150. package/dist/lib/entity-routes.d.ts.map +1 -1
  151. package/dist/org/index.js +4 -2
  152. package/dist/plugins/PluginRegistryManager.d.ts.map +1 -1
  153. package/dist/settings/MessageTemplateRow.d.ts.map +1 -1
  154. package/dist/timeline/PersonTimeline.d.ts.map +1 -1
  155. package/dist/timeline/TimelineList.d.ts.map +1 -1
  156. package/dist/units/UnitRailPage.d.ts.map +1 -1
  157. package/dist/units/useUnitFilter.d.ts.map +1 -1
  158. package/package.json +5 -5
  159. package/dist/PersonTimeline-X7JTPUWJ.js +0 -3
  160. package/dist/ScheduleEditor-L2UJXKMY.js +0 -6
  161. package/dist/SubscriptionPage-IDVEFLZ5.js +0 -8
  162. package/dist/chunk-3YP7KW47.js.map +0 -1
  163. package/dist/chunk-E4MESMNR.js.map +0 -1
  164. package/dist/chunk-IXSY4GPK.js.map +0 -1
  165. package/dist/chunk-JOBRLBIQ.js.map +0 -1
  166. package/dist/chunk-KPYRTOCK.js.map +0 -1
  167. package/dist/chunk-OQARLKZN.js.map +0 -1
  168. package/dist/chunk-P5UIGQFY.js.map +0 -1
  169. package/dist/chunk-P6XUDT2P.js.map +0 -1
  170. package/dist/chunk-VX3WJLKK.js.map +0 -1
  171. package/dist/entity-routes-LXOBW5IB.js +0 -4
@@ -0,0 +1,283 @@
1
+ import { useFayzProjectsStore, defaultProjectOf, editorUrlOf } from './chunk-6MMSYC2I.js';
2
+ import { cn } from './chunk-JRZJBMOY.js';
3
+ import { useOrganizationStore } from './chunk-YKPPCV2Z.js';
4
+ import * as React from 'react';
5
+ import { Globe, LayoutTemplate, Store, ChevronsUpDown, ExternalLink, PenSquare, RefreshCw } from 'lucide-react';
6
+ import { useLayoutStore, Button, Dropdown, DropdownTrigger, DropdownContent, DropdownLabel, DropdownItem } from '@fayz-ai/ui';
7
+ import { useTranslation } from '@fayz-ai/core';
8
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
9
+
10
+ var KIND_ICON = {
11
+ site: Globe,
12
+ storefront: Store,
13
+ landing_page: LayoutTemplate,
14
+ other: Globe
15
+ };
16
+ function openExternal(url) {
17
+ if (url) window.open(url, "_blank", "noopener,noreferrer");
18
+ }
19
+ function previewSourceOf(p) {
20
+ const metadata = p.metadata ?? {};
21
+ if (typeof metadata.sandbox_url === "string" && metadata.sandbox_url) return metadata.sandbox_url;
22
+ const env = import.meta.env;
23
+ return env?.VITE_APP_BUILDER_SANDBOX_URL || p.previewUrl;
24
+ }
25
+ function synthFromFallback(f) {
26
+ if (!f) return null;
27
+ return {
28
+ id: "config-site",
29
+ tenantId: "",
30
+ name: f.name,
31
+ kind: f.kind ?? "site",
32
+ isDefault: true,
33
+ storefrontEnabled: f.kind === "storefront",
34
+ fayzProjectId: f.fayzProjectId ?? null,
35
+ appId: null,
36
+ previewUrl: f.previewUrl ?? null,
37
+ editorUrl: f.editorUrl ?? null,
38
+ slug: null,
39
+ metadata: {},
40
+ createdAt: "",
41
+ updatedAt: ""
42
+ };
43
+ }
44
+ function SeuSiteWidget({ fallback, onEdit }) {
45
+ const t = useTranslation();
46
+ const currentOrgId = useOrganizationStore((s) => s.currentOrg?.id);
47
+ const projects = useFayzProjectsStore((s) => s.projects);
48
+ const load = useFayzProjectsStore((s) => s.load);
49
+ const loadedFor = useFayzProjectsStore((s) => s.loadedFor);
50
+ const collapsed = useLayoutStore((s) => s.sidebarCollapsed);
51
+ const [selectedId, setSelectedId] = React.useState(null);
52
+ const [hovered, setHovered] = React.useState(false);
53
+ const [primed, setPrimed] = React.useState(false);
54
+ const closeTimer = React.useRef(null);
55
+ const cancelClose = () => {
56
+ if (closeTimer.current) {
57
+ clearTimeout(closeTimer.current);
58
+ closeTimer.current = null;
59
+ }
60
+ };
61
+ const openPreview = () => {
62
+ cancelClose();
63
+ setPrimed(true);
64
+ setHovered(true);
65
+ };
66
+ const closePreview = () => {
67
+ cancelClose();
68
+ closeTimer.current = setTimeout(() => setHovered(false), 140);
69
+ };
70
+ React.useEffect(() => () => cancelClose(), []);
71
+ React.useEffect(() => {
72
+ if (loadedFor !== (currentOrgId ?? null)) void load(currentOrgId);
73
+ }, [currentOrgId, loadedFor, load]);
74
+ const active = projects.find((p) => p.id === selectedId) ?? defaultProjectOf(projects) ?? synthFromFallback(fallback);
75
+ if (!active) return null;
76
+ const Icon = KIND_ICON[active.kind] ?? Globe;
77
+ const tr = (key, fallback2) => {
78
+ const v = t(key);
79
+ return !v || v === key ? fallback2 : v;
80
+ };
81
+ const multiple = projects.length > 1;
82
+ const editorUrl = editorUrlOf(active);
83
+ const domain = active.previewUrl ? active.previewUrl.replace(/^https?:\/\//, "").replace(/\/+$/, "") : null;
84
+ const edit = () => onEdit ? onEdit() : openExternal(editorUrl);
85
+ const canEdit = !!onEdit || !!editorUrl;
86
+ const iconBtn = "rounded-button p-1 text-sidebar-muted transition-colors hover:bg-sidebar-accent hover:text-sidebar-foreground disabled:cursor-not-allowed disabled:opacity-30";
87
+ const body = collapsed ? /* @__PURE__ */ jsx(
88
+ Button,
89
+ {
90
+ variant: "bare",
91
+ size: "bare",
92
+ onClick: () => openExternal(active.previewUrl),
93
+ title: active.name,
94
+ className: "flex w-full items-center justify-center rounded-button p-2 text-sidebar-foreground/80 transition-colors hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground",
95
+ children: /* @__PURE__ */ jsx(Icon, { className: "h-4 w-4 shrink-0" })
96
+ }
97
+ ) : /* @__PURE__ */ jsxs(Fragment, { children: [
98
+ /* @__PURE__ */ jsx("p", { className: "px-1 pb-1 text-[10px] font-semibold uppercase tracking-wider text-sidebar-muted", children: fallback?.label ?? tr("projects.yourSite", "Seu site") }),
99
+ /* @__PURE__ */ jsxs(
100
+ "div",
101
+ {
102
+ role: canEdit ? "button" : void 0,
103
+ tabIndex: canEdit ? 0 : void 0,
104
+ onClick: canEdit ? edit : void 0,
105
+ onKeyDown: canEdit ? (e) => {
106
+ if (e.key === "Enter" || e.key === " ") {
107
+ e.preventDefault();
108
+ edit();
109
+ }
110
+ } : void 0,
111
+ className: cn("rounded-button px-1 py-0.5", canEdit && "cursor-pointer hover:bg-sidebar-accent/40"),
112
+ children: [
113
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
114
+ /* @__PURE__ */ jsx(Icon, { className: "h-4 w-4 shrink-0 text-sidebar-foreground/70" }),
115
+ multiple ? /* @__PURE__ */ jsxs(Dropdown, { children: [
116
+ /* @__PURE__ */ jsx(DropdownTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "bare", size: "bare", onClick: (e) => e.stopPropagation(), className: "flex min-w-0 flex-1 items-center gap-1 text-left justify-start whitespace-normal text-[length:inherit] font-normal", children: [
117
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-[13px] font-medium text-sidebar-foreground", children: active.name }),
118
+ /* @__PURE__ */ jsx(ChevronsUpDown, { className: "h-3 w-3 shrink-0 text-sidebar-muted" })
119
+ ] }) }),
120
+ /* @__PURE__ */ jsxs(DropdownContent, { align: "start", className: "w-56", children: [
121
+ /* @__PURE__ */ jsx(DropdownLabel, { children: tr("projects.yourProjects", "Seus projetos") }),
122
+ projects.map((p) => {
123
+ const PIcon = KIND_ICON[p.kind] ?? Globe;
124
+ return /* @__PURE__ */ jsxs(DropdownItem, { onClick: () => setSelectedId(p.id), children: [
125
+ /* @__PURE__ */ jsx(PIcon, { className: "mr-2 h-3.5 w-3.5 shrink-0" }),
126
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: p.name })
127
+ ] }, p.id);
128
+ })
129
+ ] })
130
+ ] }) : /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-[13px] font-medium text-sidebar-foreground", children: active.name }),
131
+ /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-0.5", children: [
132
+ /* @__PURE__ */ jsx(Button, { variant: "bare", size: "bare", onClick: (e) => {
133
+ e.stopPropagation();
134
+ openExternal(active.previewUrl);
135
+ }, disabled: !active.previewUrl, title: tr("projects.open", "Abrir"), className: iconBtn, children: /* @__PURE__ */ jsx(ExternalLink, { className: "h-3.5 w-3.5" }) }),
136
+ /* @__PURE__ */ jsx(Button, { variant: "bare", size: "bare", onClick: (e) => {
137
+ e.stopPropagation();
138
+ edit();
139
+ }, disabled: !canEdit, title: tr("projects.edit", "Editar"), className: iconBtn, children: /* @__PURE__ */ jsx(PenSquare, { className: "h-3.5 w-3.5" }) })
140
+ ] })
141
+ ] }),
142
+ domain && /* @__PURE__ */ jsx(
143
+ "a",
144
+ {
145
+ href: active.previewUrl ?? void 0,
146
+ target: "_blank",
147
+ rel: "noopener noreferrer",
148
+ onClick: (e) => e.stopPropagation(),
149
+ className: "mt-0.5 block truncate pl-6 text-[11px] text-sidebar-muted hover:text-sidebar-foreground/80",
150
+ children: domain
151
+ }
152
+ )
153
+ ]
154
+ }
155
+ )
156
+ ] });
157
+ return /* @__PURE__ */ jsxs("div", { className: "relative", onMouseEnter: openPreview, onMouseLeave: closePreview, children: [
158
+ body,
159
+ primed && /* @__PURE__ */ jsx(
160
+ SitePreview,
161
+ {
162
+ project: active,
163
+ open: hovered,
164
+ label: domain ?? fallback?.label ?? tr("projects.yourSite", "Seu site"),
165
+ onOpen: () => openExternal(active.previewUrl),
166
+ onEdit: canEdit ? edit : void 0,
167
+ tr
168
+ }
169
+ )
170
+ ] });
171
+ }
172
+ var PREVIEW_W = 1200;
173
+ var PREVIEW_H = 780;
174
+ var PANEL_W = 336;
175
+ var SCALE = PANEL_W / PREVIEW_W;
176
+ function SitePreview({
177
+ project,
178
+ open,
179
+ label,
180
+ onOpen,
181
+ onEdit,
182
+ tr
183
+ }) {
184
+ const [nonce, setNonce] = React.useState(0);
185
+ const [loading, setLoading] = React.useState(true);
186
+ const url = previewSourceOf(project);
187
+ React.useEffect(() => {
188
+ setLoading(true);
189
+ }, [nonce, url]);
190
+ const action = "flex items-center gap-1.5 rounded-button px-2 py-1 text-[11.5px] font-medium text-sidebar-foreground/80 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground disabled:cursor-not-allowed disabled:opacity-40";
191
+ return /* @__PURE__ */ jsx(
192
+ "div",
193
+ {
194
+ style: { width: PANEL_W },
195
+ className: cn(
196
+ "absolute bottom-0 left-full z-50 ml-2 hidden md:block",
197
+ "motion-safe:transition-opacity motion-safe:duration-150",
198
+ open ? "opacity-100" : "pointer-events-none opacity-0"
199
+ ),
200
+ "aria-hidden": !open,
201
+ children: /* @__PURE__ */ jsxs("div", { className: "overflow-hidden rounded-lg border border-sidebar-border bg-sidebar text-sidebar-foreground shadow-xl shadow-black/25", children: [
202
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-3 py-2", children: [
203
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
204
+ /* @__PURE__ */ jsx("span", { className: "block truncate text-[13px] font-semibold", children: project.name }),
205
+ /* @__PURE__ */ jsx("span", { className: "block truncate text-[11px] text-sidebar-muted", children: label })
206
+ ] }),
207
+ /* @__PURE__ */ jsx(
208
+ Button,
209
+ {
210
+ variant: "bare",
211
+ size: "bare",
212
+ type: "button",
213
+ onClick: () => setNonce((n) => n + 1),
214
+ disabled: !url,
215
+ title: tr("projects.refresh", "Atualizar"),
216
+ "aria-label": tr("projects.refresh", "Atualizar"),
217
+ className: "rounded-button p-1 text-sidebar-muted transition-colors hover:bg-sidebar-accent hover:text-sidebar-foreground disabled:opacity-30",
218
+ children: /* @__PURE__ */ jsx(RefreshCw, { className: cn("h-3.5 w-3.5", loading && url && "motion-safe:animate-spin") })
219
+ }
220
+ )
221
+ ] }),
222
+ /* @__PURE__ */ jsxs(
223
+ "div",
224
+ {
225
+ style: { height: PREVIEW_H * SCALE },
226
+ className: "relative overflow-hidden border-y border-sidebar-border bg-white",
227
+ children: [
228
+ url && /* @__PURE__ */ jsx(
229
+ Button,
230
+ {
231
+ variant: "bare",
232
+ size: "bare",
233
+ type: "button",
234
+ onClick: onOpen,
235
+ "aria-label": tr("projects.open", "Abrir"),
236
+ className: "absolute inset-0 z-10 cursor-pointer"
237
+ }
238
+ ),
239
+ url ? /* @__PURE__ */ jsxs(Fragment, { children: [
240
+ /* @__PURE__ */ jsx(
241
+ "iframe",
242
+ {
243
+ src: url,
244
+ title: project.name,
245
+ loading: "lazy",
246
+ onLoad: () => setLoading(false),
247
+ sandbox: "allow-scripts allow-same-origin",
248
+ style: {
249
+ width: PREVIEW_W,
250
+ height: PREVIEW_H,
251
+ transform: `scale(${SCALE})`,
252
+ transformOrigin: "top left"
253
+ },
254
+ className: "pointer-events-none absolute left-0 top-0 border-0"
255
+ },
256
+ `${url}#${nonce}`
257
+ ),
258
+ loading && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 motion-safe:animate-pulse bg-sidebar-accent/40" })
259
+ ] }) : /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-1 px-4 text-center", children: [
260
+ /* @__PURE__ */ jsx(Globe, { className: "h-5 w-5 text-sidebar-muted" }),
261
+ /* @__PURE__ */ jsx("p", { className: "text-[11.5px] text-sidebar-muted", children: tr("projects.noPreview", "Este projeto ainda n\xE3o tem endere\xE7o publicado.") })
262
+ ] })
263
+ ]
264
+ }
265
+ ),
266
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 px-2 py-1.5", children: [
267
+ /* @__PURE__ */ jsxs(Button, { variant: "bare", size: "bare", type: "button", onClick: onOpen, disabled: !url, className: action, children: [
268
+ /* @__PURE__ */ jsx(ExternalLink, { className: "h-3.5 w-3.5" }),
269
+ tr("projects.open", "Abrir")
270
+ ] }),
271
+ /* @__PURE__ */ jsxs(Button, { variant: "bare", size: "bare", type: "button", onClick: onEdit, disabled: !onEdit, className: action, children: [
272
+ /* @__PURE__ */ jsx(PenSquare, { className: "h-3.5 w-3.5" }),
273
+ tr("projects.edit", "Editar")
274
+ ] })
275
+ ] })
276
+ ] })
277
+ }
278
+ );
279
+ }
280
+
281
+ export { SeuSiteWidget };
282
+ //# sourceMappingURL=chunk-6UUFVQ2E.js.map
283
+ //# sourceMappingURL=chunk-6UUFVQ2E.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/projects/SeuSiteWidget.tsx"],"names":["fallback"],"mappings":"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","file":"chunk-6UUFVQ2E.js","sourcesContent":["import * as React from 'react'\nimport { Globe, Store, LayoutTemplate, ExternalLink, PenSquare, ChevronsUpDown, RefreshCw } from 'lucide-react'\nimport { Button, Dropdown, DropdownTrigger, DropdownContent, DropdownItem, DropdownLabel, useLayoutStore } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { cn } from '../lib/cn'\nimport { useOrganizationStore } from '../org/store'\nimport { useFayzProjectsStore, defaultProjectOf, editorUrlOf } from './store'\nimport type { FayzProject, FayzProjectKind } from './types'\nimport type { AppSiteConfig } from '../app/config'\n\n// ---------------------------------------------------------------------------\n// \"Seu site\" — sidebar footer widget (rendered just above the user row). Shows\n// the current tenant's default fayz project with two actions: Abrir (open the\n// live/preview site) and Editar (open the fayz editor, /fayz/editor). When the\n// tenant owns more than one project, a picker switches which one is shown.\n// Self-hides when the tenant has no projects (or no supabase).\n// ---------------------------------------------------------------------------\n\nconst KIND_ICON: Record<FayzProjectKind, React.ComponentType<{ className?: string }>> = {\n site: Globe,\n storefront: Store,\n landing_page: LayoutTemplate,\n other: Globe,\n}\n\nfunction openExternal(url: string | null | undefined) {\n if (url) window.open(url, '_blank', 'noopener,noreferrer')\n}\n\n/** The running preview container, when its address is known — the same source\n * the builder canvas uses. Falls back to the published site. */\nfunction previewSourceOf(p: FayzProject): string | null {\n const metadata = (p.metadata ?? {}) as Record<string, unknown>\n if (typeof metadata.sandbox_url === 'string' && metadata.sandbox_url) return metadata.sandbox_url\n const env = (import.meta as unknown as { env?: Record<string, string | undefined> }).env\n return env?.VITE_APP_BUILDER_SANDBOX_URL || p.previewUrl\n}\n\n/** Build a display-only FayzProject from the app's config-declared site. */\nfunction synthFromFallback(f?: AppSiteConfig): FayzProject | null {\n if (!f) return null\n return {\n id: 'config-site', tenantId: '', name: f.name, kind: f.kind ?? 'site',\n isDefault: true, storefrontEnabled: f.kind === 'storefront',\n fayzProjectId: f.fayzProjectId ?? null, appId: null,\n previewUrl: f.previewUrl ?? null, editorUrl: f.editorUrl ?? null,\n slug: null, metadata: {}, createdAt: '', updatedAt: '',\n }\n}\n\nexport function SeuSiteWidget({ fallback, onEdit }: { fallback?: AppSiteConfig; onEdit?: () => void }) {\n const t = useTranslation()\n const currentOrgId = useOrganizationStore((s) => s.currentOrg?.id)\n const projects = useFayzProjectsStore((s) => s.projects)\n const load = useFayzProjectsStore((s) => s.load)\n const loadedFor = useFayzProjectsStore((s) => s.loadedFor)\n const collapsed = useLayoutStore((s) => s.sidebarCollapsed)\n\n const [selectedId, setSelectedId] = React.useState<string | null>(null)\n\n // Hover preview. `primed` stays true after the first hover so the iframe is\n // mounted once and re-hovering is instant — the point of a preview is to see\n // the store NOW, not to watch it load again every time.\n const [hovered, setHovered] = React.useState(false)\n const [primed, setPrimed] = React.useState(false)\n const closeTimer = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n const cancelClose = () => {\n if (closeTimer.current) {\n clearTimeout(closeTimer.current)\n closeTimer.current = null\n }\n }\n const openPreview = () => {\n cancelClose()\n setPrimed(true)\n setHovered(true)\n }\n const closePreview = () => {\n cancelClose()\n closeTimer.current = setTimeout(() => setHovered(false), 140)\n }\n React.useEffect(() => () => cancelClose(), [])\n\n React.useEffect(() => {\n if (loadedFor !== (currentOrgId ?? null)) void load(currentOrgId)\n }, [currentOrgId, loadedFor, load])\n\n // DB projects win; the config-declared site is the fallback for mock/standalone\n // apps with no per-tenant rows (e.g. a mock admin whose site is bamboo.business).\n const active: FayzProject | null =\n projects.find((p) => p.id === selectedId) ?? defaultProjectOf(projects) ?? synthFromFallback(fallback)\n\n if (!active) return null\n\n const Icon = KIND_ICON[active.kind] ?? Globe\n const tr = (key: string, fallback: string) => {\n const v = t(key)\n return !v || v === key ? fallback : v\n }\n\n const multiple = projects.length > 1\n const editorUrl = editorUrlOf(active)\n const domain = active.previewUrl ? active.previewUrl.replace(/^https?:\\/\\//, '').replace(/\\/+$/, '') : null\n const edit = () => (onEdit ? onEdit() : openExternal(editorUrl))\n const canEdit = !!onEdit || !!editorUrl\n\n const iconBtn = 'rounded-button p-1 text-sidebar-muted transition-colors hover:bg-sidebar-accent hover:text-sidebar-foreground disabled:cursor-not-allowed disabled:opacity-30'\n\n // Collapsed rail: a single icon that opens the live site. Pointing at it\n // still brings up the full preview — that is the whole reason to hover a\n // 4rem rail in the first place.\n const body = collapsed ? (\n <Button\n variant=\"bare\"\n size=\"bare\"\n onClick={() => openExternal(active.previewUrl)}\n title={active.name}\n className=\"flex w-full items-center justify-center rounded-button p-2 text-sidebar-foreground/80 transition-colors hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground\"\n >\n <Icon className=\"h-4 w-4 shrink-0\" />\n </Button>\n ) : (\n <>\n <p className=\"px-1 pb-1 text-[10px] font-semibold uppercase tracking-wider text-sidebar-muted\">\n {/* App-supplied wording wins over the translation: \"site\" is wrong for a\n store admin, and the right word is the host's to choose. */}\n {fallback?.label ?? tr('projects.yourSite', 'Seu site')}\n </p>\n {/* The whole row is the door: the pencil was a 14px target for the thing\n the widget exists to open. */}\n <div\n role={canEdit ? 'button' : undefined}\n tabIndex={canEdit ? 0 : undefined}\n onClick={canEdit ? edit : undefined}\n onKeyDown={canEdit ? (e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); edit() } } : undefined}\n className={cn('rounded-button px-1 py-0.5', canEdit && 'cursor-pointer hover:bg-sidebar-accent/40')}\n >\n <div className=\"flex items-center gap-2\">\n <Icon className=\"h-4 w-4 shrink-0 text-sidebar-foreground/70\" />\n {multiple ? (\n <Dropdown>\n <DropdownTrigger asChild>\n <Button variant=\"bare\" size=\"bare\" onClick={(e) => e.stopPropagation()} className=\"flex min-w-0 flex-1 items-center gap-1 text-left justify-start whitespace-normal text-[length:inherit] font-normal\">\n <span className=\"min-w-0 flex-1 truncate text-[13px] font-medium text-sidebar-foreground\">{active.name}</span>\n <ChevronsUpDown className=\"h-3 w-3 shrink-0 text-sidebar-muted\" />\n </Button>\n </DropdownTrigger>\n <DropdownContent align=\"start\" className=\"w-56\">\n <DropdownLabel>{tr('projects.yourProjects', 'Seus projetos')}</DropdownLabel>\n {projects.map((p) => {\n const PIcon = KIND_ICON[p.kind] ?? Globe\n return (\n <DropdownItem key={p.id} onClick={() => setSelectedId(p.id)}>\n <PIcon className=\"mr-2 h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate\">{p.name}</span>\n </DropdownItem>\n )\n })}\n </DropdownContent>\n </Dropdown>\n ) : (\n <span className=\"min-w-0 flex-1 truncate text-[13px] font-medium text-sidebar-foreground\">{active.name}</span>\n )}\n <div className=\"flex shrink-0 items-center gap-0.5\">\n <Button variant=\"bare\" size=\"bare\" onClick={(e) => { e.stopPropagation(); openExternal(active.previewUrl) }} disabled={!active.previewUrl} title={tr('projects.open', 'Abrir')} className={iconBtn}>\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </Button>\n <Button variant=\"bare\" size=\"bare\" onClick={(e) => { e.stopPropagation(); edit() }} disabled={!canEdit} title={tr('projects.edit', 'Editar')} className={iconBtn}>\n <PenSquare className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n {domain && (\n <a\n href={active.previewUrl ?? undefined}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(e) => e.stopPropagation()}\n className=\"mt-0.5 block truncate pl-6 text-[11px] text-sidebar-muted hover:text-sidebar-foreground/80\"\n >\n {domain}\n </a>\n )}\n </div>\n </>\n )\n\n return (\n <div className=\"relative\" onMouseEnter={openPreview} onMouseLeave={closePreview}>\n {body}\n {primed && (\n <SitePreview\n project={active}\n open={hovered}\n // The rail already prints \"Seu site\" above the widget; the card's\n // second line is better spent on WHICH address this is.\n label={domain ?? fallback?.label ?? tr('projects.yourSite', 'Seu site')}\n onOpen={() => openExternal(active.previewUrl)}\n onEdit={canEdit ? edit : undefined}\n tr={tr}\n />\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// SitePreview — the store itself, as it is right now.\n//\n// A live iframe rather than a stored thumbnail: a screenshot is a promise that\n// the store still looks like that, and the merchant's whole question when they\n// point at this widget is \"what does it look like AFTER what I just changed?\".\n// It is scaled down from a desktop viewport so the frame shows the real layout\n// and not a phone-width column, and it is inert (pointer-events off) — this is\n// a look at the store, not a second place to use it.\n// ---------------------------------------------------------------------------\n\nconst PREVIEW_W = 1200\nconst PREVIEW_H = 780\nconst PANEL_W = 336\nconst SCALE = PANEL_W / PREVIEW_W\n\nfunction SitePreview({\n project,\n open,\n label,\n onOpen,\n onEdit,\n tr,\n}: {\n project: FayzProject\n open: boolean\n label: string\n onOpen: () => void\n onEdit?: () => void\n tr: (key: string, fallback: string) => string\n}) {\n // Bumping the key remounts the frame, which is the only reliable way to\n // reload a cross-origin document we don't control.\n const [nonce, setNonce] = React.useState(0)\n const [loading, setLoading] = React.useState(true)\n // The container if it is up, the published site otherwise: hovering asks\n // \"how does it look NOW\", and now is the sandbox once one exists.\n const url = previewSourceOf(project)\n\n React.useEffect(() => {\n setLoading(true)\n }, [nonce, url])\n\n const action =\n 'flex items-center gap-1.5 rounded-button px-2 py-1 text-[11.5px] font-medium text-sidebar-foreground/80 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground disabled:cursor-not-allowed disabled:opacity-40'\n\n return (\n <div\n style={{ width: PANEL_W }}\n className={cn(\n 'absolute bottom-0 left-full z-50 ml-2 hidden md:block',\n 'motion-safe:transition-opacity motion-safe:duration-150',\n open ? 'opacity-100' : 'pointer-events-none opacity-0',\n )}\n aria-hidden={!open}\n >\n <div className=\"overflow-hidden rounded-lg border border-sidebar-border bg-sidebar text-sidebar-foreground shadow-xl shadow-black/25\">\n <div className=\"flex items-center gap-2 px-3 py-2\">\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-[13px] font-semibold\">{project.name}</span>\n <span className=\"block truncate text-[11px] text-sidebar-muted\">{label}</span>\n </span>\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n onClick={() => setNonce((n) => n + 1)}\n disabled={!url}\n title={tr('projects.refresh', 'Atualizar')}\n aria-label={tr('projects.refresh', 'Atualizar')}\n className=\"rounded-button p-1 text-sidebar-muted transition-colors hover:bg-sidebar-accent hover:text-sidebar-foreground disabled:opacity-30\"\n >\n <RefreshCw className={cn('h-3.5 w-3.5', loading && url && 'motion-safe:animate-spin')} />\n </Button>\n </div>\n\n <div\n style={{ height: PREVIEW_H * SCALE }}\n className=\"relative overflow-hidden border-y border-sidebar-border bg-white\"\n >\n {/* The picture of the store IS a link to the store — clicking what\n you are looking at is the first thing anyone tries. */}\n {url && (\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n onClick={onOpen}\n aria-label={tr('projects.open', 'Abrir')}\n className=\"absolute inset-0 z-10 cursor-pointer\"\n />\n )}\n {url ? (\n <>\n <iframe\n key={`${url}#${nonce}`}\n src={url}\n title={project.name}\n loading=\"lazy\"\n onLoad={() => setLoading(false)}\n // Untrusted-by-default: the storefront is the tenant's own page,\n // but it has no business scripting or navigating the admin.\n sandbox=\"allow-scripts allow-same-origin\"\n style={{\n width: PREVIEW_W,\n height: PREVIEW_H,\n transform: `scale(${SCALE})`,\n transformOrigin: 'top left',\n }}\n className=\"pointer-events-none absolute left-0 top-0 border-0\"\n />\n {loading && (\n <div className=\"absolute inset-0 motion-safe:animate-pulse bg-sidebar-accent/40\" />\n )}\n </>\n ) : (\n <div className=\"flex h-full flex-col items-center justify-center gap-1 px-4 text-center\">\n <Globe className=\"h-5 w-5 text-sidebar-muted\" />\n <p className=\"text-[11.5px] text-sidebar-muted\">\n {tr('projects.noPreview', 'Este projeto ainda não tem endereço publicado.')}\n </p>\n </div>\n )}\n </div>\n\n <div className=\"flex items-center gap-1 px-2 py-1.5\">\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={onOpen} disabled={!url} className={action}>\n <ExternalLink className=\"h-3.5 w-3.5\" />\n {tr('projects.open', 'Abrir')}\n </Button>\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={onEdit} disabled={!onEdit} className={action}>\n <PenSquare className=\"h-3.5 w-3.5\" />\n {tr('projects.edit', 'Editar')}\n </Button>\n </div>\n </div>\n </div>\n )\n}\n"]}