@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.
- package/dist/{chunk-XR3WXB6N.js → chunk-7SEWMFO3.js} +80 -13
- package/dist/chunk-7SEWMFO3.js.map +1 -0
- package/dist/{chunk-CUCIVYCV.js → chunk-BJNV7RJQ.js} +4 -4
- package/dist/{chunk-CUCIVYCV.js.map → chunk-BJNV7RJQ.js.map} +1 -1
- package/dist/chunk-FKYFYGAS.js +143 -0
- package/dist/chunk-FKYFYGAS.js.map +1 -0
- package/dist/{chunk-7W6WRDDF.js → chunk-IA3QZZSC.js} +5 -5
- package/dist/{chunk-7W6WRDDF.js.map → chunk-IA3QZZSC.js.map} +1 -1
- package/dist/{chunk-OB2ULDBD.js → chunk-IN2DFMJV.js} +4 -4
- package/dist/{chunk-OB2ULDBD.js.map → chunk-IN2DFMJV.js.map} +1 -1
- package/dist/{chunk-XQTGXHT6.js → chunk-N6LNCYOT.js} +3 -3
- package/dist/{chunk-XQTGXHT6.js.map → chunk-N6LNCYOT.js.map} +1 -1
- package/dist/{chunk-N7JP63VB.js → chunk-P4764AWQ.js} +5 -5
- package/dist/{chunk-N7JP63VB.js.map → chunk-P4764AWQ.js.map} +1 -1
- package/dist/{chunk-UCNY76FQ.js → chunk-URDLBXAS.js} +4 -4
- package/dist/{chunk-UCNY76FQ.js.map → chunk-URDLBXAS.js.map} +1 -1
- package/dist/{chunk-GLRLWBBF.js → chunk-ZJ7C2P64.js} +17 -102
- package/dist/chunk-ZJ7C2P64.js.map +1 -0
- package/dist/dashboard/index.js +4 -4
- package/dist/index.js +15 -15
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/ModulePage.d.ts.map +1 -1
- package/dist/layout/SaveBar.d.ts.map +1 -1
- package/dist/layout/index.js +4 -4
- package/dist/primitives/index.js +6 -6
- package/dist/wizard/index.js +3 -3
- package/package.json +2 -2
- package/dist/chunk-GLRLWBBF.js.map +0 -1
- package/dist/chunk-OKZ6WQB3.js +0 -57
- package/dist/chunk-OKZ6WQB3.js.map +0 -1
- package/dist/chunk-XR3WXB6N.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { cn } from './chunk-
|
|
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__ */
|
|
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-
|
|
4498
|
-
//# sourceMappingURL=chunk-
|
|
4564
|
+
//# sourceMappingURL=chunk-7SEWMFO3.js.map
|
|
4565
|
+
//# sourceMappingURL=chunk-7SEWMFO3.js.map
|