@fayz-ai/ui 0.36.0 → 0.36.1

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 (31) hide show
  1. package/dist/{chunk-XR3WXB6N.js → chunk-7SEWMFO3.js} +80 -13
  2. package/dist/chunk-7SEWMFO3.js.map +1 -0
  3. package/dist/{chunk-CUCIVYCV.js → chunk-BJNV7RJQ.js} +4 -4
  4. package/dist/{chunk-CUCIVYCV.js.map → chunk-BJNV7RJQ.js.map} +1 -1
  5. package/dist/chunk-FKYFYGAS.js +143 -0
  6. package/dist/chunk-FKYFYGAS.js.map +1 -0
  7. package/dist/{chunk-7W6WRDDF.js → chunk-IA3QZZSC.js} +5 -5
  8. package/dist/{chunk-7W6WRDDF.js.map → chunk-IA3QZZSC.js.map} +1 -1
  9. package/dist/{chunk-OB2ULDBD.js → chunk-IN2DFMJV.js} +4 -4
  10. package/dist/{chunk-OB2ULDBD.js.map → chunk-IN2DFMJV.js.map} +1 -1
  11. package/dist/{chunk-XQTGXHT6.js → chunk-N6LNCYOT.js} +3 -3
  12. package/dist/{chunk-XQTGXHT6.js.map → chunk-N6LNCYOT.js.map} +1 -1
  13. package/dist/{chunk-N7JP63VB.js → chunk-P4764AWQ.js} +5 -5
  14. package/dist/{chunk-N7JP63VB.js.map → chunk-P4764AWQ.js.map} +1 -1
  15. package/dist/{chunk-UCNY76FQ.js → chunk-URDLBXAS.js} +4 -4
  16. package/dist/{chunk-UCNY76FQ.js.map → chunk-URDLBXAS.js.map} +1 -1
  17. package/dist/{chunk-GLRLWBBF.js → chunk-ZJ7C2P64.js} +17 -102
  18. package/dist/chunk-ZJ7C2P64.js.map +1 -0
  19. package/dist/dashboard/index.js +4 -4
  20. package/dist/index.js +15 -15
  21. package/dist/layout/AppShell.d.ts.map +1 -1
  22. package/dist/layout/ModulePage.d.ts.map +1 -1
  23. package/dist/layout/SaveBar.d.ts.map +1 -1
  24. package/dist/layout/index.js +4 -4
  25. package/dist/primitives/index.js +6 -6
  26. package/dist/wizard/index.js +3 -3
  27. package/package.json +2 -2
  28. package/dist/chunk-GLRLWBBF.js.map +0 -1
  29. package/dist/chunk-OKZ6WQB3.js +0 -57
  30. package/dist/chunk-OKZ6WQB3.js.map +0 -1
  31. package/dist/chunk-XR3WXB6N.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { cn } from './chunk-OKZ6WQB3.js';
1
+ import { cn, ConfirmDialog } from './chunk-FKYFYGAS.js';
2
2
  import { ICON_MAP } from './chunk-ZTS5S6BZ.js';
3
3
  import * as React12 from 'react';
4
4
  import * as DialogPrimitive from '@radix-ui/react-dialog';
@@ -116,6 +116,16 @@ var HIDDEN = { visible: false, saving: false };
116
116
  var SaveBarApiContext = React12.createContext(null);
117
117
  var SaveBarStateContext = React12.createContext({ visible: false, saving: false });
118
118
  var _saveBarVisible = false;
119
+ var saveFlow = { current: null };
120
+ var requestSave = (onSave) => {
121
+ saveFlow.current = { at: Date.now(), started: false };
122
+ onSave?.();
123
+ };
124
+ var requestDiscard = (onDiscard) => {
125
+ saveFlow.current = { at: Date.now(), started: true };
126
+ onDiscard?.();
127
+ };
128
+ var dialogOpen = () => typeof document !== "undefined" && !!document.querySelector('[role="dialog"], [role="alertdialog"]');
119
129
  var _saveBarSubs = /* @__PURE__ */ new Set();
120
130
  function setSaveBarVisibleSignal(v) {
121
131
  if (v === _saveBarVisible) return;
@@ -153,15 +163,54 @@ function SaveBarProvider({ children }) {
153
163
  React12.useEffect(() => {
154
164
  setSaveBarVisibleSignal(state.visible);
155
165
  }, [state.visible]);
166
+ const [leaveTo, setLeaveTo] = React12.useState(null);
167
+ const bypass = React12.useRef(false);
168
+ if (state.saving && saveFlow.current) saveFlow.current.started = true;
169
+ const t = useTranslation();
170
+ React12.useEffect(() => {
171
+ if (!state.dirty || state.host || typeof window === "undefined") return;
172
+ const guarded = window.location.href;
173
+ const onNav = (e) => {
174
+ if (bypass.current || window.location.href === guarded) return;
175
+ const flow = saveFlow.current;
176
+ if (flow && (flow.started || state.saving) && Date.now() - flow.at < 15e3) return;
177
+ e.stopImmediatePropagation();
178
+ const target = window.location.href;
179
+ window.history.replaceState(window.history.state, "", guarded);
180
+ setLeaveTo(target);
181
+ };
182
+ const onUnload = (e) => {
183
+ e.preventDefault();
184
+ e.returnValue = "";
185
+ };
186
+ window.addEventListener("popstate", onNav, true);
187
+ window.addEventListener("hashchange", onNav, true);
188
+ window.addEventListener("beforeunload", onUnload);
189
+ return () => {
190
+ window.removeEventListener("popstate", onNav, true);
191
+ window.removeEventListener("hashchange", onNav, true);
192
+ window.removeEventListener("beforeunload", onUnload);
193
+ };
194
+ }, [state.dirty, state.host, state.saving]);
195
+ const leave = () => {
196
+ const target = leaveTo;
197
+ setLeaveTo(null);
198
+ if (!target) return;
199
+ bypass.current = true;
200
+ window.location.href = target;
201
+ setTimeout(() => {
202
+ bypass.current = false;
203
+ }, 0);
204
+ };
156
205
  React12.useEffect(() => {
157
206
  function onKey(e) {
158
207
  if (state.visible && !state.saving) {
159
208
  if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) {
160
209
  e.preventDefault();
161
- handlers.current.onSave?.();
162
- } else if (e.key === "Escape") {
210
+ requestSave(handlers.current.onSave);
211
+ } else if (e.key === "Escape" && !e.defaultPrevented && !dialogOpen()) {
163
212
  e.preventDefault();
164
- handlers.current.onDiscard?.();
213
+ requestDiscard(handlers.current.onDiscard);
165
214
  }
166
215
  return;
167
216
  }
@@ -179,7 +228,22 @@ function SaveBarProvider({ children }) {
179
228
  window.addEventListener("keydown", onKey);
180
229
  return () => window.removeEventListener("keydown", onKey);
181
230
  }, [state.visible, state.saving]);
182
- return /* @__PURE__ */ jsx(SaveBarApiContext.Provider, { value: api, children: /* @__PURE__ */ jsx(BackNavApiContext.Provider, { value: backApi, children: /* @__PURE__ */ jsx(SaveBarStateContext.Provider, { value: state, children }) }) });
231
+ return /* @__PURE__ */ jsx(SaveBarApiContext.Provider, { value: api, children: /* @__PURE__ */ jsx(BackNavApiContext.Provider, { value: backApi, children: /* @__PURE__ */ jsxs(SaveBarStateContext.Provider, { value: state, children: [
232
+ children,
233
+ /* @__PURE__ */ jsx(
234
+ ConfirmDialog,
235
+ {
236
+ open: leaveTo !== null,
237
+ variant: "warning",
238
+ title: t("saveBar.leaveTitle"),
239
+ description: t("saveBar.leaveDescription"),
240
+ confirmLabel: t("saveBar.leaveConfirm"),
241
+ cancelLabel: t("saveBar.leaveCancel"),
242
+ onConfirm: leave,
243
+ onCancel: () => setLeaveTo(null)
244
+ }
245
+ )
246
+ ] }) }) });
183
247
  }
184
248
  var BackNavApiContext = React12.createContext(null);
185
249
  function isEditableTarget(target) {
@@ -265,8 +329,8 @@ function SaveBar({ className }) {
265
329
  closing ? "animate-out fade-out slide-out-to-bottom-2" : "animate-in fade-in slide-in-from-bottom-2"
266
330
  ), children: [
267
331
  /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2 text-sm font-medium", children: [
268
- /* @__PURE__ */ jsx("span", { className: "h-2 w-2 shrink-0 rounded-full bg-amber-400" }),
269
- message ?? t("saveBar.unsaved")
332
+ /* @__PURE__ */ jsx("span", { className: cn("h-2 w-2 shrink-0 rounded-full", state.dirty === false ? "bg-background/40" : "bg-amber-400") }),
333
+ message ?? t(state.dirty === false ? "saveBar.clean" : "saveBar.unsaved")
270
334
  ] }),
271
335
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
272
336
  /* @__PURE__ */ jsx(
@@ -275,7 +339,7 @@ function SaveBar({ className }) {
275
339
  type: "button",
276
340
  "data-tour": "savebar.discard",
277
341
  disabled: saving,
278
- onClick: () => api.handlers.current.onDiscard?.(),
342
+ onClick: () => requestDiscard(api.handlers.current.onDiscard),
279
343
  className: "rounded-full px-3 py-1.5 text-sm font-medium text-background/70 transition-colors hover:bg-background/10 hover:text-background disabled:opacity-50",
280
344
  children: discardLabel ?? t("common.discard")
281
345
  }
@@ -286,7 +350,7 @@ function SaveBar({ className }) {
286
350
  type: "button",
287
351
  "data-tour": "savebar.save",
288
352
  disabled: saving,
289
- onClick: () => api.handlers.current.onSave?.(),
353
+ onClick: () => requestSave(api.handlers.current.onSave),
290
354
  className: "inline-flex items-center rounded-full bg-background px-4 py-1.5 text-sm font-semibold text-foreground transition-colors hover:bg-background/90 disabled:opacity-60",
291
355
  children: [
292
356
  saving && /* @__PURE__ */ jsx(Loader2, { className: "mr-1.5 h-3.5 w-3.5 animate-spin" }),
@@ -2068,6 +2132,7 @@ function SidebarLayout({
2068
2132
  sidebarNavChildConnector,
2069
2133
  railOpen
2070
2134
  }) {
2135
+ const saveBarVisible = useSaveBarVisible();
2071
2136
  const sidebarCollapsed = useLayoutStore((s) => s.sidebarCollapsed);
2072
2137
  const rawClaimed = usePageHeaderClaimed();
2073
2138
  const hasOutlet = useHasPageHeaderOutlet();
@@ -2267,7 +2332,7 @@ function SidebarLayout({
2267
2332
  /* @__PURE__ */ jsxs("div", { className: "relative flex min-w-0 min-h-0 flex-1 overflow-hidden", children: [
2268
2333
  /* @__PURE__ */ jsx("div", { ref: setPageRailSlot, className: "flex shrink-0 empty:hidden" }),
2269
2334
  /* @__PURE__ */ jsxs("div", { className: "relative flex min-w-0 min-h-0 flex-1 flex-col overflow-hidden", children: [
2270
- /* @__PURE__ */ jsx("main", { className: cn("min-w-0 flex-1 overflow-y-auto pb-16 md:pb-0", menuOpen && "invisible md:visible"), children }),
2335
+ /* @__PURE__ */ jsx("main", { className: cn("min-w-0 flex-1 overflow-y-auto", saveBarVisible ? "pb-24" : "pb-16 md:pb-0", menuOpen && "invisible md:visible"), children }),
2271
2336
  /* @__PURE__ */ jsx(SaveBar, {})
2272
2337
  ] })
2273
2338
  ] })
@@ -2358,6 +2423,7 @@ function TopbarLayout({
2358
2423
  mobileIdentity,
2359
2424
  pagePrimary = false
2360
2425
  }) {
2426
+ const saveBarVisible = useSaveBarVisible();
2361
2427
  const mobileMenuOpen = useLayoutStore((st) => st.mobileDrawerOpen);
2362
2428
  const setMobileMenuOpen = useLayoutStore((st) => st.setMobileDrawerOpen);
2363
2429
  const [headerSlot, setHeaderSlot] = React12.useState(null);
@@ -2439,7 +2505,7 @@ function TopbarLayout({
2439
2505
  ),
2440
2506
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 min-h-0 flex-1 overflow-hidden", children: [
2441
2507
  /* @__PURE__ */ jsx("div", { ref: setPageRailSlot, className: "flex shrink-0 empty:hidden" }),
2442
- /* @__PURE__ */ jsx("div", { className: cn("min-w-0 min-h-0 flex-1 overflow-y-auto pb-16 md:pb-0", menuOpen && "invisible md:visible"), children })
2508
+ /* @__PURE__ */ jsx("div", { className: cn("min-w-0 min-h-0 flex-1 overflow-y-auto", saveBarVisible ? "pb-24" : "pb-16 md:pb-0", menuOpen && "invisible md:visible"), children })
2443
2509
  ] })
2444
2510
  ] }) }),
2445
2511
  /* @__PURE__ */ jsx(SaveBar, {}),
@@ -3978,6 +4044,7 @@ function RailSections({ sections, search, collapsed }) {
3978
4044
  }
3979
4045
  )
3980
4046
  ] }),
4047
+ search && collapsed && /* @__PURE__ */ jsx("div", { "aria-hidden": true, className: "mb-2 h-8" }),
3981
4048
  sections.map((section, i) => /* @__PURE__ */ jsxs("div", { className: i > 0 ? "mt-3 border-t border-border pt-3" : void 0, children: [
3982
4049
  section.heading && !collapsed && /* @__PURE__ */ jsx("p", { className: "px-3 pb-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: section.heading }),
3983
4050
  /* @__PURE__ */ jsx("div", { className: "space-y-0.5", children: section.items.map((item) => /* @__PURE__ */ jsx(RailNavItem, { item, collapsed }, item.id)) })
@@ -4494,5 +4561,5 @@ function ModulePage({ title: _title, subtitle, nav, children, className, headerA
4494
4561
  }
4495
4562
 
4496
4563
  export { AppShell, BackStyleProvider, BottomSheet, COLUMN_WIDTH, CollapsibleColumn, HeaderTabs, Hint, Modal, ModalBody, ModalClose, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalOverlay, ModalPortal, ModalTitle, ModalTrigger, ModuleLayoutProvider, ModulePage, NavTransitionProvider, PageHeader, PageHeaderActions, PageHeaderCrumb, PageHeaderOutlet, PageRail, PageSubNav, PageTabs, PageTitlePortal, PageTrail, PageTransition, PageViewBar, RailColumn, RailNavItem, SUB_NAV_STYLE, SaveBar, SaveBarProvider, SheetCard, SheetRow, ShellSearch, Sidebar, SubpageHeader, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, Topbar, ViewTabs, bottomNavReachesAll, isCreateRoute, navigateToCrumb, useBackHandler, useBackStyle, useCrossModuleBack, useCurrentRouteHref, useHasPageActions, useHasPageHeaderBack, useHasPageHeaderHost, useHasPageHeaderOutlet, useLayoutStore, useModalHost, useModuleHeaderActionsSlot, useModuleHeaderSlot, useModuleLayout, useModuleViewLabel, useNavTransition, usePageHeader, usePageHeaderClaimed, usePageHeaderHost, usePageTrail, usePageTrailParent, usePublishModuleViewLabel, useRailRow, useRegisterPageActions, useSaveBar, useSaveBarVisible, useSheetClose, useSheetDrag, useTrailBack };
4497
- //# sourceMappingURL=chunk-XR3WXB6N.js.map
4498
- //# sourceMappingURL=chunk-XR3WXB6N.js.map
4564
+ //# sourceMappingURL=chunk-7SEWMFO3.js.map
4565
+ //# sourceMappingURL=chunk-7SEWMFO3.js.map