@fayz-ai/ui 0.35.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 (48) hide show
  1. package/dist/{chunk-63BB2CNP.js → chunk-7SEWMFO3.js} +101 -16
  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-OBWOHU5E.js → chunk-IA3QZZSC.js} +173 -134
  8. package/dist/chunk-IA3QZZSC.js.map +1 -0
  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-2CRN3BOD.js → chunk-P4764AWQ.js} +6 -6
  14. package/dist/{chunk-2CRN3BOD.js.map → chunk-P4764AWQ.js.map} +1 -1
  15. package/dist/{chunk-FNGCA3XR.js → chunk-URDLBXAS.js} +4 -4
  16. package/dist/{chunk-FNGCA3XR.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/{chunk-ATDIWKBD.js → chunk-ZTS5S6BZ.js} +4 -3
  20. package/dist/chunk-ZTS5S6BZ.js.map +1 -0
  21. package/dist/dashboard/index.js +5 -5
  22. package/dist/icons.js +1 -1
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +16 -16
  26. package/dist/layout/AppShell.d.ts.map +1 -1
  27. package/dist/layout/ModulePage.d.ts.map +1 -1
  28. package/dist/layout/SaveBar.d.ts.map +1 -1
  29. package/dist/layout/index.js +5 -5
  30. package/dist/layout/rail-flyout.d.ts.map +1 -1
  31. package/dist/primitives/ai-action-button.d.ts +13 -0
  32. package/dist/primitives/ai-action-button.d.ts.map +1 -0
  33. package/dist/primitives/date-picker.d.ts.map +1 -1
  34. package/dist/primitives/index.d.ts +2 -0
  35. package/dist/primitives/index.d.ts.map +1 -1
  36. package/dist/primitives/index.js +7 -7
  37. package/dist/primitives/inline-link.d.ts +29 -0
  38. package/dist/primitives/inline-link.d.ts.map +1 -0
  39. package/dist/primitives/search-select.d.ts +4 -1
  40. package/dist/primitives/search-select.d.ts.map +1 -1
  41. package/dist/wizard/index.js +3 -3
  42. package/package.json +2 -2
  43. package/dist/chunk-63BB2CNP.js.map +0 -1
  44. package/dist/chunk-ATDIWKBD.js.map +0 -1
  45. package/dist/chunk-GLRLWBBF.js.map +0 -1
  46. package/dist/chunk-OBWOHU5E.js.map +0 -1
  47. package/dist/chunk-OKZ6WQB3.js +0 -57
  48. package/dist/chunk-OKZ6WQB3.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { cn } from './chunk-OKZ6WQB3.js';
2
- import { ICON_MAP } from './chunk-ATDIWKBD.js';
1
+ import { cn, ConfirmDialog } from './chunk-FKYFYGAS.js';
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';
5
5
  import { X, Loader2, ChevronLeft, ArrowLeft, Bell, PanelLeft, PanelLeftClose, Search, CornerDownLeft, Menu, Crown, ChevronsRight, ChevronsLeft, ChevronDown, ChevronRight, Info, ExternalLink, CreditCard, Sparkles, Home, ChevronUp, Plus, Settings, UserCog, LogOut } from 'lucide-react';
@@ -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" }),
@@ -669,7 +733,20 @@ function useRailFlyout({
669
733
  "div",
670
734
  {
671
735
  ref: panelRef,
672
- style: { borderTopLeftRadius: 2, borderBottomLeftRadius: 2 },
736
+ style: {
737
+ borderTopLeftRadius: 2,
738
+ borderBottomLeftRadius: 2,
739
+ // A cor vai em `style` e vem acompanhada de blur. Só a classe
740
+ // `bg-sidebar` deixava o painel atravessável sempre que
741
+ // `hsl(var(--sidebar))` nao resolvia — o tema da conta escreve esse
742
+ // token em runtime, e um valor que o `hsl()` nao aceita faz o
743
+ // navegador DESCARTAR a declaracao inteira, sem erro e so em
744
+ // producao. O blur e a rede embaixo disso: mesmo sem cor nenhuma, a
745
+ // pagina nao atravessa mais o texto do menu.
746
+ backgroundColor: "hsl(var(--sidebar) / 0.9)",
747
+ backdropFilter: "blur(16px) saturate(140%)",
748
+ WebkitBackdropFilter: "blur(16px) saturate(140%)"
749
+ },
673
750
  className: cn(
674
751
  // Sidebar tone, sidebar border: the panel is the menu leaning out,
675
752
  // not a popover from the page underneath it.
@@ -681,7 +758,12 @@ function useRailFlyout({
681
758
  "span",
682
759
  {
683
760
  "aria-hidden": true,
684
- style: { top: pos.arrow },
761
+ style: {
762
+ top: pos.arrow,
763
+ backgroundColor: "hsl(var(--sidebar) / 0.9)",
764
+ backdropFilter: "blur(16px) saturate(140%)",
765
+ WebkitBackdropFilter: "blur(16px) saturate(140%)"
766
+ },
685
767
  className: "absolute -left-[5px] h-2.5 w-2.5 -translate-y-1/2 rotate-45 border-b border-l border-sidebar-border bg-sidebar"
686
768
  }
687
769
  ),
@@ -2050,6 +2132,7 @@ function SidebarLayout({
2050
2132
  sidebarNavChildConnector,
2051
2133
  railOpen
2052
2134
  }) {
2135
+ const saveBarVisible = useSaveBarVisible();
2053
2136
  const sidebarCollapsed = useLayoutStore((s) => s.sidebarCollapsed);
2054
2137
  const rawClaimed = usePageHeaderClaimed();
2055
2138
  const hasOutlet = useHasPageHeaderOutlet();
@@ -2249,7 +2332,7 @@ function SidebarLayout({
2249
2332
  /* @__PURE__ */ jsxs("div", { className: "relative flex min-w-0 min-h-0 flex-1 overflow-hidden", children: [
2250
2333
  /* @__PURE__ */ jsx("div", { ref: setPageRailSlot, className: "flex shrink-0 empty:hidden" }),
2251
2334
  /* @__PURE__ */ jsxs("div", { className: "relative flex min-w-0 min-h-0 flex-1 flex-col overflow-hidden", children: [
2252
- /* @__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 }),
2253
2336
  /* @__PURE__ */ jsx(SaveBar, {})
2254
2337
  ] })
2255
2338
  ] })
@@ -2340,6 +2423,7 @@ function TopbarLayout({
2340
2423
  mobileIdentity,
2341
2424
  pagePrimary = false
2342
2425
  }) {
2426
+ const saveBarVisible = useSaveBarVisible();
2343
2427
  const mobileMenuOpen = useLayoutStore((st) => st.mobileDrawerOpen);
2344
2428
  const setMobileMenuOpen = useLayoutStore((st) => st.setMobileDrawerOpen);
2345
2429
  const [headerSlot, setHeaderSlot] = React12.useState(null);
@@ -2421,7 +2505,7 @@ function TopbarLayout({
2421
2505
  ),
2422
2506
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 min-h-0 flex-1 overflow-hidden", children: [
2423
2507
  /* @__PURE__ */ jsx("div", { ref: setPageRailSlot, className: "flex shrink-0 empty:hidden" }),
2424
- /* @__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 })
2425
2509
  ] })
2426
2510
  ] }) }),
2427
2511
  /* @__PURE__ */ jsx(SaveBar, {}),
@@ -3960,6 +4044,7 @@ function RailSections({ sections, search, collapsed }) {
3960
4044
  }
3961
4045
  )
3962
4046
  ] }),
4047
+ search && collapsed && /* @__PURE__ */ jsx("div", { "aria-hidden": true, className: "mb-2 h-8" }),
3963
4048
  sections.map((section, i) => /* @__PURE__ */ jsxs("div", { className: i > 0 ? "mt-3 border-t border-border pt-3" : void 0, children: [
3964
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 }),
3965
4050
  /* @__PURE__ */ jsx("div", { className: "space-y-0.5", children: section.items.map((item) => /* @__PURE__ */ jsx(RailNavItem, { item, collapsed }, item.id)) })
@@ -4476,5 +4561,5 @@ function ModulePage({ title: _title, subtitle, nav, children, className, headerA
4476
4561
  }
4477
4562
 
4478
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 };
4479
- //# sourceMappingURL=chunk-63BB2CNP.js.map
4480
- //# sourceMappingURL=chunk-63BB2CNP.js.map
4564
+ //# sourceMappingURL=chunk-7SEWMFO3.js.map
4565
+ //# sourceMappingURL=chunk-7SEWMFO3.js.map