@fayz-ai/ui 0.2.0 → 0.5.0

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 (57) hide show
  1. package/dist/chunk-22J2RTMN.js +1397 -0
  2. package/dist/chunk-22J2RTMN.js.map +1 -0
  3. package/dist/chunk-2P7T6QQK.cjs +206 -0
  4. package/dist/chunk-2P7T6QQK.cjs.map +1 -0
  5. package/dist/chunk-7TBDPNLY.cjs +649 -0
  6. package/dist/chunk-7TBDPNLY.cjs.map +1 -0
  7. package/dist/chunk-CZ6X6PZT.js +1237 -0
  8. package/dist/chunk-CZ6X6PZT.js.map +1 -0
  9. package/dist/chunk-D6SXPF4F.cjs +397 -0
  10. package/dist/chunk-D6SXPF4F.cjs.map +1 -0
  11. package/dist/chunk-DNYVEOAX.js +11 -0
  12. package/dist/chunk-DNYVEOAX.js.map +1 -0
  13. package/dist/chunk-E526FHZ4.js +169 -0
  14. package/dist/chunk-E526FHZ4.js.map +1 -0
  15. package/dist/chunk-GE6XUREM.cjs +1277 -0
  16. package/dist/chunk-GE6XUREM.cjs.map +1 -0
  17. package/dist/chunk-GFH5HOCO.js +605 -0
  18. package/dist/chunk-GFH5HOCO.js.map +1 -0
  19. package/dist/chunk-IWBXYV4U.js +203 -0
  20. package/dist/chunk-IWBXYV4U.js.map +1 -0
  21. package/dist/chunk-MYZT2OG7.js +350 -0
  22. package/dist/chunk-MYZT2OG7.js.map +1 -0
  23. package/dist/chunk-O5F4LLSL.js +445 -0
  24. package/dist/chunk-O5F4LLSL.js.map +1 -0
  25. package/dist/chunk-TDGSY5W6.cjs +474 -0
  26. package/dist/chunk-TDGSY5W6.cjs.map +1 -0
  27. package/dist/chunk-VVVZO2LE.cjs +13 -0
  28. package/dist/chunk-VVVZO2LE.cjs.map +1 -0
  29. package/dist/chunk-W4XXXJRW.cjs +196 -0
  30. package/dist/chunk-W4XXXJRW.cjs.map +1 -0
  31. package/dist/chunk-YB5ZJKNG.cjs +1484 -0
  32. package/dist/chunk-YB5ZJKNG.cjs.map +1 -0
  33. package/dist/dashboard/index.cjs +102 -0
  34. package/dist/dashboard/index.cjs.map +1 -0
  35. package/dist/dashboard/index.js +5 -0
  36. package/dist/dashboard/index.js.map +1 -0
  37. package/dist/index.cjs +569 -4304
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.js +15 -4152
  40. package/dist/index.js.map +1 -1
  41. package/dist/layout/index.cjs +90 -0
  42. package/dist/layout/index.cjs.map +1 -0
  43. package/dist/layout/index.js +5 -0
  44. package/dist/layout/index.js.map +1 -0
  45. package/dist/preset.cjs +18 -0
  46. package/dist/preset.cjs.map +1 -0
  47. package/dist/preset.js +3 -0
  48. package/dist/preset.js.map +1 -0
  49. package/dist/primitives/index.cjs +347 -0
  50. package/dist/primitives/index.cjs.map +1 -0
  51. package/dist/primitives/index.js +6 -0
  52. package/dist/primitives/index.js.map +1 -0
  53. package/dist/theme/index.cjs +41 -0
  54. package/dist/theme/index.cjs.map +1 -0
  55. package/dist/theme/index.js +4 -0
  56. package/dist/theme/index.js.map +1 -0
  57. package/package.json +10 -10
@@ -0,0 +1,397 @@
1
+ 'use strict';
2
+
3
+ var chunkVVVZO2LE_cjs = require('./chunk-VVVZO2LE.cjs');
4
+ var React3 = require('react');
5
+ var reactSlot = require('@radix-ui/react-slot');
6
+ var classVarianceAuthority = require('class-variance-authority');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+ var DropdownMenuPrimitive = require('@radix-ui/react-dropdown-menu');
9
+ var lucideReact = require('lucide-react');
10
+ var reactTable = require('@tanstack/react-table');
11
+
12
+ function _interopNamespace(e) {
13
+ if (e && e.__esModule) return e;
14
+ var n = Object.create(null);
15
+ if (e) {
16
+ Object.keys(e).forEach(function (k) {
17
+ if (k !== 'default') {
18
+ var d = Object.getOwnPropertyDescriptor(e, k);
19
+ Object.defineProperty(n, k, d.get ? d : {
20
+ enumerable: true,
21
+ get: function () { return e[k]; }
22
+ });
23
+ }
24
+ });
25
+ }
26
+ n.default = e;
27
+ return Object.freeze(n);
28
+ }
29
+
30
+ var React3__namespace = /*#__PURE__*/_interopNamespace(React3);
31
+ var DropdownMenuPrimitive__namespace = /*#__PURE__*/_interopNamespace(DropdownMenuPrimitive);
32
+
33
+ var buttonVariants = classVarianceAuthority.cva(
34
+ "inline-flex items-center justify-center gap-1.5 whitespace-nowrap rounded-button text-sm font-semibold ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
35
+ {
36
+ variants: {
37
+ variant: {
38
+ // Polaris primary — near-black brand with the stronger primary bevel
39
+ default: "bg-primary text-primary-foreground border border-primary shadow-button-primary hover:bg-primary/90 active:shadow-button-inset",
40
+ destructive: "bg-destructive text-destructive-foreground border border-destructive shadow-button-primary hover:bg-destructive/90 active:shadow-button-inset",
41
+ // Default/secondary surface — white with hairline + bevel
42
+ outline: "border border-border bg-card text-foreground shadow-button hover:bg-muted active:shadow-button-inset",
43
+ secondary: "border border-border bg-card text-foreground shadow-button hover:bg-muted active:shadow-button-inset",
44
+ ghost: "hover:bg-muted hover:text-foreground",
45
+ link: "text-info underline-offset-4 hover:underline"
46
+ },
47
+ size: {
48
+ // Polaris button sizes: md 30px, sm 26px, lg 36px
49
+ default: "h-[30px] px-3 py-1",
50
+ sm: "h-[26px] rounded-button px-2.5 text-xs",
51
+ lg: "h-9 rounded-button px-4 text-sm",
52
+ icon: "h-[30px] w-[30px]"
53
+ }
54
+ },
55
+ defaultVariants: {
56
+ variant: "default",
57
+ size: "default"
58
+ }
59
+ }
60
+ );
61
+ var Button = React3__namespace.forwardRef(
62
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
63
+ const Comp = asChild ? reactSlot.Slot : "button";
64
+ return /* @__PURE__ */ jsxRuntime.jsx(
65
+ Comp,
66
+ {
67
+ className: chunkVVVZO2LE_cjs.cn(buttonVariants({ variant, size, className })),
68
+ ref,
69
+ ...props
70
+ }
71
+ );
72
+ }
73
+ );
74
+ Button.displayName = "Button";
75
+ var Card = React3__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
76
+ "div",
77
+ {
78
+ ref,
79
+ className: chunkVVVZO2LE_cjs.cn(
80
+ "fayz-glass-surface rounded-card border bg-card text-card-foreground shadow-sm",
81
+ className
82
+ ),
83
+ ...props
84
+ }
85
+ ));
86
+ Card.displayName = "Card";
87
+ var CardHeader = React3__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
88
+ "div",
89
+ {
90
+ ref,
91
+ className: chunkVVVZO2LE_cjs.cn("flex flex-col space-y-1 p-4", className),
92
+ ...props
93
+ }
94
+ ));
95
+ CardHeader.displayName = "CardHeader";
96
+ var CardTitle = React3__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
97
+ "h3",
98
+ {
99
+ ref,
100
+ className: chunkVVVZO2LE_cjs.cn(
101
+ "text-sm font-semibold leading-tight tracking-tight",
102
+ className
103
+ ),
104
+ ...props
105
+ }
106
+ ));
107
+ CardTitle.displayName = "CardTitle";
108
+ var CardDescription = React3__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
109
+ "p",
110
+ {
111
+ ref,
112
+ className: chunkVVVZO2LE_cjs.cn("text-xs text-muted-foreground", className),
113
+ ...props
114
+ }
115
+ ));
116
+ CardDescription.displayName = "CardDescription";
117
+ var CardContent = React3__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: chunkVVVZO2LE_cjs.cn("p-4 pt-0", className), ...props }));
118
+ CardContent.displayName = "CardContent";
119
+ var CardFooter = React3__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
120
+ "div",
121
+ {
122
+ ref,
123
+ className: chunkVVVZO2LE_cjs.cn("flex items-center p-4 pt-0", className),
124
+ ...props
125
+ }
126
+ ));
127
+ CardFooter.displayName = "CardFooter";
128
+ var Dropdown = DropdownMenuPrimitive__namespace.Root;
129
+ var DropdownTrigger = DropdownMenuPrimitive__namespace.Trigger;
130
+ var DropdownGroup = DropdownMenuPrimitive__namespace.Group;
131
+ var DropdownPortal = DropdownMenuPrimitive__namespace.Portal;
132
+ var DropdownSub = DropdownMenuPrimitive__namespace.Sub;
133
+ var DropdownRadioGroup = DropdownMenuPrimitive__namespace.RadioGroup;
134
+ var DropdownSubTrigger = React3__namespace.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
135
+ DropdownMenuPrimitive__namespace.SubTrigger,
136
+ {
137
+ ref,
138
+ className: chunkVVVZO2LE_cjs.cn(
139
+ "flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-muted data-[state=open]:bg-muted",
140
+ inset && "pl-8",
141
+ className
142
+ ),
143
+ ...props,
144
+ children: [
145
+ children,
146
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "ml-auto h-4 w-4" })
147
+ ]
148
+ }
149
+ ));
150
+ DropdownSubTrigger.displayName = DropdownMenuPrimitive__namespace.SubTrigger.displayName;
151
+ var DropdownSubContent = React3__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
152
+ DropdownMenuPrimitive__namespace.SubContent,
153
+ {
154
+ ref,
155
+ className: chunkVVVZO2LE_cjs.cn(
156
+ "fayz-glass-surface z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
157
+ className
158
+ ),
159
+ ...props
160
+ }
161
+ ));
162
+ DropdownSubContent.displayName = DropdownMenuPrimitive__namespace.SubContent.displayName;
163
+ var DropdownContent = React3__namespace.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
164
+ DropdownMenuPrimitive__namespace.Content,
165
+ {
166
+ ref,
167
+ sideOffset,
168
+ className: chunkVVVZO2LE_cjs.cn(
169
+ "fayz-glass-surface z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
170
+ className
171
+ ),
172
+ ...props
173
+ }
174
+ ) }));
175
+ DropdownContent.displayName = DropdownMenuPrimitive__namespace.Content.displayName;
176
+ var DropdownItem = React3__namespace.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
177
+ DropdownMenuPrimitive__namespace.Item,
178
+ {
179
+ ref,
180
+ className: chunkVVVZO2LE_cjs.cn(
181
+ "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
182
+ inset && "pl-8",
183
+ className
184
+ ),
185
+ ...props
186
+ }
187
+ ));
188
+ DropdownItem.displayName = DropdownMenuPrimitive__namespace.Item.displayName;
189
+ var DropdownCheckboxItem = React3__namespace.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
190
+ DropdownMenuPrimitive__namespace.CheckboxItem,
191
+ {
192
+ ref,
193
+ className: chunkVVVZO2LE_cjs.cn(
194
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
195
+ className
196
+ ),
197
+ checked,
198
+ ...props,
199
+ children: [
200
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuPrimitive__namespace.ItemIndicator, { children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-4 w-4" }) }) }),
201
+ children
202
+ ]
203
+ }
204
+ ));
205
+ DropdownCheckboxItem.displayName = DropdownMenuPrimitive__namespace.CheckboxItem.displayName;
206
+ var DropdownRadioItem = React3__namespace.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
207
+ DropdownMenuPrimitive__namespace.RadioItem,
208
+ {
209
+ ref,
210
+ className: chunkVVVZO2LE_cjs.cn(
211
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
212
+ className
213
+ ),
214
+ ...props,
215
+ children: [
216
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuPrimitive__namespace.ItemIndicator, { children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Circle, { className: "h-2 w-2 fill-current" }) }) }),
217
+ children
218
+ ]
219
+ }
220
+ ));
221
+ DropdownRadioItem.displayName = DropdownMenuPrimitive__namespace.RadioItem.displayName;
222
+ var DropdownLabel = React3__namespace.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
223
+ DropdownMenuPrimitive__namespace.Label,
224
+ {
225
+ ref,
226
+ className: chunkVVVZO2LE_cjs.cn(
227
+ "px-2 py-1.5 text-sm font-semibold",
228
+ inset && "pl-8",
229
+ className
230
+ ),
231
+ ...props
232
+ }
233
+ ));
234
+ DropdownLabel.displayName = DropdownMenuPrimitive__namespace.Label.displayName;
235
+ var DropdownSeparator = React3__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
236
+ DropdownMenuPrimitive__namespace.Separator,
237
+ {
238
+ ref,
239
+ className: chunkVVVZO2LE_cjs.cn("-mx-1 my-1 h-px bg-muted", className),
240
+ ...props
241
+ }
242
+ ));
243
+ DropdownSeparator.displayName = DropdownMenuPrimitive__namespace.Separator.displayName;
244
+ var DropdownShortcut = ({
245
+ className,
246
+ ...props
247
+ }) => {
248
+ return /* @__PURE__ */ jsxRuntime.jsx(
249
+ "span",
250
+ {
251
+ className: chunkVVVZO2LE_cjs.cn("ml-auto text-xs tracking-widest opacity-60", className),
252
+ ...props
253
+ }
254
+ );
255
+ };
256
+ DropdownShortcut.displayName = "DropdownShortcut";
257
+ function DataTable({
258
+ columns,
259
+ data,
260
+ loading = false,
261
+ skeletonRows = 3,
262
+ emptyMessage = "No results.",
263
+ onRowClick,
264
+ variant = "card",
265
+ compact = false
266
+ }) {
267
+ const isCard = variant === "card";
268
+ const wrapperCls = isCard ? "rounded-lg border bg-card shadow-sm overflow-x-auto" : "rounded-lg border overflow-x-auto";
269
+ const headerCls = isCard ? "border-b bg-muted/50" : "border-b bg-muted/30";
270
+ const thCls = compact ? "px-3 py-1.5 text-left text-[11px] font-medium text-muted-foreground" : "px-4 py-2.5 text-left font-medium text-muted-foreground";
271
+ const tdCls = compact ? "px-3 py-1.5 align-middle text-xs" : "px-4 py-3 align-middle";
272
+ const tableCls = compact ? "w-full text-xs min-w-max" : "w-full text-sm min-w-max";
273
+ const rowHoverCls = isCard ? "hover:bg-muted/30" : "hover:bg-muted/20";
274
+ const [sorting, setSorting] = React3__namespace.useState([]);
275
+ const table = reactTable.useReactTable({
276
+ data,
277
+ columns,
278
+ getCoreRowModel: reactTable.getCoreRowModel(),
279
+ getSortedRowModel: reactTable.getSortedRowModel(),
280
+ onSortingChange: setSorting,
281
+ state: { sorting }
282
+ });
283
+ if (loading) {
284
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: wrapperCls, children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: tableCls, children: [
285
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsx("tr", { className: headerCls, children: columns.map((_, i) => /* @__PURE__ */ jsxRuntime.jsx("th", { className: thCls, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-3.5 w-20 animate-pulse rounded bg-muted" }) }, i)) }) }),
286
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: Array.from({ length: skeletonRows }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx("tr", { className: "border-b last:border-0", children: columns.map((_2, j) => /* @__PURE__ */ jsxRuntime.jsx("td", { className: tdCls, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-3.5 w-full animate-pulse rounded bg-muted" }) }, j)) }, i)) })
287
+ ] }) });
288
+ }
289
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: wrapperCls, children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: tableCls, children: [
290
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ jsxRuntime.jsx("tr", { className: headerCls, children: headerGroup.headers.map((header) => {
291
+ const sorted = header.column.getIsSorted();
292
+ return /* @__PURE__ */ jsxRuntime.jsx(
293
+ "th",
294
+ {
295
+ className: thCls,
296
+ children: header.isPlaceholder ? null : header.column.getCanSort() ? /* @__PURE__ */ jsxRuntime.jsxs(
297
+ "button",
298
+ {
299
+ className: "flex items-center gap-1 hover:text-foreground transition-colors",
300
+ onClick: header.column.getToggleSortingHandler(),
301
+ children: [
302
+ reactTable.flexRender(header.column.columnDef.header, header.getContext()),
303
+ sorted === "asc" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowUp, { className: "h-3 w-3" }) : sorted === "desc" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowDown, { className: "h-3 w-3" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowUpDown, { className: "h-3 w-3 opacity-40" })
304
+ ]
305
+ }
306
+ ) : reactTable.flexRender(header.column.columnDef.header, header.getContext())
307
+ },
308
+ header.id
309
+ );
310
+ }) }, headerGroup.id)) }),
311
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: table.getRowModel().rows?.length ? table.getRowModel().rows.map((row) => /* @__PURE__ */ jsxRuntime.jsx(
312
+ "tr",
313
+ {
314
+ className: chunkVVVZO2LE_cjs.cn(
315
+ `border-b last:border-0 transition-colors ${rowHoverCls}`,
316
+ onRowClick && "cursor-pointer"
317
+ ),
318
+ onClick: () => onRowClick?.(row.original),
319
+ children: row.getVisibleCells().map((cell) => /* @__PURE__ */ jsxRuntime.jsx("td", { className: tdCls, children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id))
320
+ },
321
+ row.id
322
+ )) : /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: columns.length, className: "h-24 text-center text-muted-foreground", children: emptyMessage }) }) })
323
+ ] }) });
324
+ }
325
+ var SIZE = {
326
+ sm: { container: "h-[26px]", segment: "px-2.5 text-xs" },
327
+ md: { container: "h-[30px]", segment: "px-3 text-sm" }
328
+ };
329
+ function SegmentedControl({
330
+ options,
331
+ value,
332
+ onChange,
333
+ size = "sm",
334
+ className,
335
+ ...rest
336
+ }) {
337
+ const items = options.map((o) => typeof o === "string" ? { value: o, label: o } : o);
338
+ return /* @__PURE__ */ jsxRuntime.jsx(
339
+ "div",
340
+ {
341
+ role: "tablist",
342
+ "aria-label": rest["aria-label"],
343
+ className: chunkVVVZO2LE_cjs.cn(
344
+ "inline-flex items-center rounded-button border border-border bg-card p-0.5 shadow-button",
345
+ SIZE[size].container,
346
+ className
347
+ ),
348
+ children: items.map((item) => {
349
+ const active = item.value === value;
350
+ return /* @__PURE__ */ jsxRuntime.jsx(
351
+ "button",
352
+ {
353
+ type: "button",
354
+ role: "tab",
355
+ "aria-selected": active,
356
+ onClick: () => onChange(item.value),
357
+ className: chunkVVVZO2LE_cjs.cn(
358
+ "flex h-full items-center rounded-button font-semibold transition-colors",
359
+ SIZE[size].segment,
360
+ active ? "bg-foreground text-background" : "text-muted-foreground hover:bg-muted/60"
361
+ ),
362
+ children: item.label
363
+ },
364
+ item.value
365
+ );
366
+ })
367
+ }
368
+ );
369
+ }
370
+
371
+ exports.Button = Button;
372
+ exports.Card = Card;
373
+ exports.CardContent = CardContent;
374
+ exports.CardDescription = CardDescription;
375
+ exports.CardFooter = CardFooter;
376
+ exports.CardHeader = CardHeader;
377
+ exports.CardTitle = CardTitle;
378
+ exports.DataTable = DataTable;
379
+ exports.Dropdown = Dropdown;
380
+ exports.DropdownCheckboxItem = DropdownCheckboxItem;
381
+ exports.DropdownContent = DropdownContent;
382
+ exports.DropdownGroup = DropdownGroup;
383
+ exports.DropdownItem = DropdownItem;
384
+ exports.DropdownLabel = DropdownLabel;
385
+ exports.DropdownPortal = DropdownPortal;
386
+ exports.DropdownRadioGroup = DropdownRadioGroup;
387
+ exports.DropdownRadioItem = DropdownRadioItem;
388
+ exports.DropdownSeparator = DropdownSeparator;
389
+ exports.DropdownShortcut = DropdownShortcut;
390
+ exports.DropdownSub = DropdownSub;
391
+ exports.DropdownSubContent = DropdownSubContent;
392
+ exports.DropdownSubTrigger = DropdownSubTrigger;
393
+ exports.DropdownTrigger = DropdownTrigger;
394
+ exports.SegmentedControl = SegmentedControl;
395
+ exports.buttonVariants = buttonVariants;
396
+ //# sourceMappingURL=chunk-D6SXPF4F.cjs.map
397
+ //# sourceMappingURL=chunk-D6SXPF4F.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/primitives/button.tsx","../src/primitives/card.tsx","../src/primitives/dropdown.tsx","../src/primitives/data-table.tsx","../src/primitives/segmented-control.tsx"],"names":["cva","React","Slot","jsx","cn","React2","DropdownMenuPrimitive","React3","jsxs","ChevronRight","Check","Circle","React4","useReactTable","getCoreRowModel","getSortedRowModel","_","flexRender","ArrowUp","ArrowDown","ArrowUpDown"],"mappings":"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","file":"chunk-D6SXPF4F.cjs","sourcesContent":["import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../utils/cn'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-1.5 whitespace-nowrap rounded-button text-sm font-semibold ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n variant: {\n // Polaris primary — near-black brand with the stronger primary bevel\n default:\n 'bg-primary text-primary-foreground border border-primary shadow-button-primary hover:bg-primary/90 active:shadow-button-inset',\n destructive:\n 'bg-destructive text-destructive-foreground border border-destructive shadow-button-primary hover:bg-destructive/90 active:shadow-button-inset',\n // Default/secondary surface — white with hairline + bevel\n outline:\n 'border border-border bg-card text-foreground shadow-button hover:bg-muted active:shadow-button-inset',\n secondary:\n 'border border-border bg-card text-foreground shadow-button hover:bg-muted active:shadow-button-inset',\n ghost: 'hover:bg-muted hover:text-foreground',\n link: 'text-info underline-offset-4 hover:underline',\n },\n size: {\n // Polaris button sizes: md 30px, sm 26px, lg 36px\n default: 'h-[30px] px-3 py-1',\n sm: 'h-[26px] rounded-button px-2.5 text-xs',\n lg: 'h-9 rounded-button px-4 text-sm',\n icon: 'h-[30px] w-[30px]',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","import * as React from 'react'\n\nimport { cn } from '../utils/cn'\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'fayz-glass-surface rounded-card border bg-card text-card-foreground shadow-sm',\n className\n )}\n {...props}\n />\n))\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex flex-col space-y-1 p-4', className)}\n {...props}\n />\n))\nCardHeader.displayName = 'CardHeader'\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n 'text-sm font-semibold leading-tight tracking-tight',\n className\n )}\n {...props}\n />\n))\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn('text-xs text-muted-foreground', className)}\n {...props}\n />\n))\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-4 pt-0', className)} {...props} />\n))\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex items-center p-4 pt-0', className)}\n {...props}\n />\n))\nCardFooter.displayName = 'CardFooter'\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","import * as React from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { Check, ChevronRight, Circle } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\n\nconst Dropdown = DropdownMenuPrimitive.Root\n\nconst DropdownTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownGroup = DropdownMenuPrimitive.Group\n\nconst DropdownPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownSub = DropdownMenuPrimitive.Sub\n\nconst DropdownRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-muted data-[state=open]:bg-muted',\n inset && 'pl-8',\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'fayz-glass-surface z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n))\nDropdownSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'fayz-glass-surface z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n inset && 'pl-8',\n className\n )}\n {...props}\n />\n))\nDropdownItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n 'px-2 py-1.5 text-sm font-semibold',\n inset && 'pl-8',\n className\n )}\n {...props}\n />\n))\nDropdownLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n))\nDropdownSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn('ml-auto text-xs tracking-widest opacity-60', className)}\n {...props}\n />\n )\n}\nDropdownShortcut.displayName = 'DropdownShortcut'\n\nexport {\n Dropdown,\n DropdownTrigger,\n DropdownContent,\n DropdownItem,\n DropdownCheckboxItem,\n DropdownRadioItem,\n DropdownLabel,\n DropdownSeparator,\n DropdownShortcut,\n DropdownGroup,\n DropdownPortal,\n DropdownSub,\n DropdownSubContent,\n DropdownSubTrigger,\n DropdownRadioGroup,\n}\n","import * as React from 'react'\nimport {\n type ColumnDef,\n type SortingState,\n flexRender,\n getCoreRowModel,\n getSortedRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport { ArrowUpDown, ArrowUp, ArrowDown } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\n\ninterface DataTableProps<TData, TValue> {\n columns: ColumnDef<TData, TValue>[]\n data: TData[]\n loading?: boolean\n skeletonRows?: number\n emptyMessage?: string\n onRowClick?: (row: TData) => void\n /** Visual variant: 'card' (white bg, card wrapper — default) or 'flat' (transparent bg) */\n variant?: 'card' | 'flat'\n /** Compact mode: smaller padding and font size */\n compact?: boolean\n}\n\nfunction DataTable<TData, TValue>({\n columns,\n data,\n loading = false,\n skeletonRows = 3,\n emptyMessage = 'No results.',\n onRowClick,\n variant = 'card',\n compact = false,\n}: DataTableProps<TData, TValue>) {\n const isCard = variant === 'card'\n const wrapperCls = isCard ? 'rounded-lg border bg-card shadow-sm overflow-x-auto' : 'rounded-lg border overflow-x-auto'\n const headerCls = isCard ? 'border-b bg-muted/50' : 'border-b bg-muted/30'\n const thCls = compact ? 'px-3 py-1.5 text-left text-[11px] font-medium text-muted-foreground' : 'px-4 py-2.5 text-left font-medium text-muted-foreground'\n const tdCls = compact ? 'px-3 py-1.5 align-middle text-xs' : 'px-4 py-3 align-middle'\n const tableCls = compact ? 'w-full text-xs min-w-max' : 'w-full text-sm min-w-max'\n const rowHoverCls = isCard ? 'hover:bg-muted/30' : 'hover:bg-muted/20'\n const [sorting, setSorting] = React.useState<SortingState>([])\n\n const table = useReactTable({\n data,\n columns,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n onSortingChange: setSorting,\n state: { sorting },\n })\n\n if (loading) {\n return (\n <div className={wrapperCls}>\n <table className={tableCls}>\n <thead>\n <tr className={headerCls}>\n {columns.map((_, i) => (\n <th key={i} className={thCls}>\n <div className=\"h-3.5 w-20 animate-pulse rounded bg-muted\" />\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {Array.from({ length: skeletonRows }).map((_, i) => (\n <tr key={i} className=\"border-b last:border-0\">\n {columns.map((_, j) => (\n <td key={j} className={tdCls}>\n <div className=\"h-3.5 w-full animate-pulse rounded bg-muted\" />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n }\n\n return (\n <div className={wrapperCls}>\n <table className={tableCls}>\n <thead>\n {table.getHeaderGroups().map((headerGroup) => (\n <tr key={headerGroup.id} className={headerCls}>\n {headerGroup.headers.map((header) => {\n const sorted = header.column.getIsSorted()\n return (\n <th\n key={header.id}\n className={thCls}\n >\n {header.isPlaceholder ? null : header.column.getCanSort() ? (\n <button\n className=\"flex items-center gap-1 hover:text-foreground transition-colors\"\n onClick={header.column.getToggleSortingHandler()}\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n {sorted === 'asc' ? (\n <ArrowUp className=\"h-3 w-3\" />\n ) : sorted === 'desc' ? (\n <ArrowDown className=\"h-3 w-3\" />\n ) : (\n <ArrowUpDown className=\"h-3 w-3 opacity-40\" />\n )}\n </button>\n ) : (\n flexRender(header.column.columnDef.header, header.getContext())\n )}\n </th>\n )\n })}\n </tr>\n ))}\n </thead>\n <tbody>\n {table.getRowModel().rows?.length ? (\n table.getRowModel().rows.map((row) => (\n <tr\n key={row.id}\n className={cn(\n `border-b last:border-0 transition-colors ${rowHoverCls}`,\n onRowClick && 'cursor-pointer'\n )}\n onClick={() => onRowClick?.(row.original)}\n >\n {row.getVisibleCells().map((cell) => (\n <td key={cell.id} className={tdCls}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n ))}\n </tr>\n ))\n ) : (\n <tr>\n <td colSpan={columns.length} className=\"h-24 text-center text-muted-foreground\">\n {emptyMessage}\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n )\n}\n\nexport { DataTable, type DataTableProps }\n","import * as React from 'react'\nimport { cn } from '../utils/cn'\n\nexport interface SegmentedOption<T extends string = string> {\n value: T\n label: React.ReactNode\n}\n\nexport interface SegmentedControlProps<T extends string = string> {\n /** Options as plain values (label = value) or `{ value, label }` objects. */\n options: ReadonlyArray<T | SegmentedOption<T>>\n value: T\n onChange: (value: T) => void\n /** Matches the equivalent Button heights: sm = 26px, md = 30px. */\n size?: 'sm' | 'md'\n className?: string\n 'aria-label'?: string\n}\n\nconst SIZE: Record<'sm' | 'md', { container: string; segment: string }> = {\n sm: { container: 'h-[26px]', segment: 'px-2.5 text-xs' },\n md: { container: 'h-[30px]', segment: 'px-3 text-sm' },\n}\n\n/**\n * Canonical segmented (pill) control — same chrome as Button (rounded-button\n * radius, hairline border + shadow-button bevel on a card surface). Use this for\n * any 7d/30d/90d-style toggle so every surface stays visually consistent instead\n * of hand-rolling a styled toggle group.\n */\nexport function SegmentedControl<T extends string = string>({\n options, value, onChange, size = 'sm', className, ...rest\n}: SegmentedControlProps<T>) {\n const items = options.map((o) => (typeof o === 'string' ? { value: o, label: o } : o)) as SegmentedOption<T>[]\n return (\n <div\n role=\"tablist\"\n aria-label={rest['aria-label']}\n className={cn(\n 'inline-flex items-center rounded-button border border-border bg-card p-0.5 shadow-button',\n SIZE[size].container,\n className,\n )}\n >\n {items.map((item) => {\n const active = item.value === value\n return (\n <button\n key={item.value}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={() => onChange(item.value)}\n className={cn(\n 'flex h-full items-center rounded-button font-semibold transition-colors',\n SIZE[size].segment,\n active ? 'bg-foreground text-background' : 'text-muted-foreground hover:bg-muted/60',\n )}\n >\n {item.label}\n </button>\n )\n })}\n </div>\n )\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import { clsx } from 'clsx';
2
+ import { twMerge } from 'tailwind-merge';
3
+
4
+ // src/utils/cn.ts
5
+ function cn(...inputs) {
6
+ return twMerge(clsx(inputs));
7
+ }
8
+
9
+ export { cn };
10
+ //# sourceMappingURL=chunk-DNYVEOAX.js.map
11
+ //# sourceMappingURL=chunk-DNYVEOAX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/cn.ts"],"names":[],"mappings":";;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B","file":"chunk-DNYVEOAX.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n"]}
@@ -0,0 +1,169 @@
1
+ import { cn } from './chunk-DNYVEOAX.js';
2
+ import * as React from 'react';
3
+ import { Loader2 } from 'lucide-react';
4
+ import { useTranslation, useNavReferrer, routeModule, navHistoryBack } from '@fayz-ai/core';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+
7
+ var SaveBarApiContext = React.createContext(null);
8
+ var SaveBarStateContext = React.createContext({ visible: false, saving: false });
9
+ var _saveBarVisible = false;
10
+ var _saveBarSubs = /* @__PURE__ */ new Set();
11
+ function setSaveBarVisibleSignal(v) {
12
+ if (v === _saveBarVisible) return;
13
+ _saveBarVisible = v;
14
+ _saveBarSubs.forEach((fn) => fn());
15
+ }
16
+ function useSaveBarVisible() {
17
+ return React.useSyncExternalStore(
18
+ (cb) => {
19
+ _saveBarSubs.add(cb);
20
+ return () => {
21
+ _saveBarSubs.delete(cb);
22
+ };
23
+ },
24
+ () => _saveBarVisible,
25
+ () => false
26
+ );
27
+ }
28
+ function SaveBarProvider({ children }) {
29
+ const [state, setState] = React.useState({ visible: false, saving: false });
30
+ const handlers = React.useRef({});
31
+ const api = React.useMemo(() => ({ setState, handlers }), []);
32
+ const backStack = React.useRef([]);
33
+ const backApi = React.useMemo(() => ({ stack: backStack }), []);
34
+ React.useEffect(() => {
35
+ setSaveBarVisibleSignal(state.visible);
36
+ }, [state.visible]);
37
+ React.useEffect(() => {
38
+ function onKey(e) {
39
+ if (state.visible && !state.saving) {
40
+ if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) {
41
+ e.preventDefault();
42
+ handlers.current.onSave?.();
43
+ } else if (e.key === "Escape") {
44
+ e.preventDefault();
45
+ handlers.current.onDiscard?.();
46
+ }
47
+ return;
48
+ }
49
+ if (e.key === "Escape" && !e.defaultPrevented && !isEditableTarget(e.target)) {
50
+ for (let i = backStack.current.length - 1; i >= 0; i--) {
51
+ const back = backStack.current[i].current;
52
+ if (back) {
53
+ e.preventDefault();
54
+ back();
55
+ return;
56
+ }
57
+ }
58
+ }
59
+ }
60
+ window.addEventListener("keydown", onKey);
61
+ return () => window.removeEventListener("keydown", onKey);
62
+ }, [state.visible, state.saving]);
63
+ return /* @__PURE__ */ jsx(SaveBarApiContext.Provider, { value: api, children: /* @__PURE__ */ jsx(BackNavApiContext.Provider, { value: backApi, children: /* @__PURE__ */ jsx(SaveBarStateContext.Provider, { value: state, children }) }) });
64
+ }
65
+ var BackNavApiContext = React.createContext(null);
66
+ function isEditableTarget(target) {
67
+ const el = target;
68
+ if (!el || !el.tagName) return false;
69
+ const tag = el.tagName.toLowerCase();
70
+ return tag === "input" || tag === "textarea" || tag === "select" || el.isContentEditable;
71
+ }
72
+ function useBackHandler(onBack) {
73
+ const api = React.useContext(BackNavApiContext);
74
+ const ref = React.useRef(onBack);
75
+ React.useEffect(() => {
76
+ ref.current = onBack;
77
+ });
78
+ React.useEffect(() => {
79
+ if (!api) return;
80
+ const stack = api.stack.current;
81
+ stack.push(ref);
82
+ return () => {
83
+ const i = stack.indexOf(ref);
84
+ if (i !== -1) stack.splice(i, 1);
85
+ };
86
+ }, [api]);
87
+ }
88
+ function useSaveBar({ dirty, saving = false, onSave, onDiscard, message, saveLabel, discardLabel }) {
89
+ const api = React.useContext(SaveBarApiContext);
90
+ React.useEffect(() => {
91
+ if (api) api.handlers.current = { onSave, onDiscard };
92
+ });
93
+ React.useEffect(() => {
94
+ if (!api) return;
95
+ api.setState({ visible: dirty, saving, message, saveLabel, discardLabel });
96
+ return () => api.setState((s) => ({ ...s, visible: false }));
97
+ }, [api, dirty, saving, message, saveLabel, discardLabel]);
98
+ }
99
+ function SaveBar({ className }) {
100
+ const state = React.useContext(SaveBarStateContext);
101
+ const api = React.useContext(SaveBarApiContext);
102
+ const t = useTranslation();
103
+ const [rendered, setRendered] = React.useState(state.visible);
104
+ const [closing, setClosing] = React.useState(false);
105
+ React.useEffect(() => {
106
+ if (state.visible) {
107
+ setRendered(true);
108
+ setClosing(false);
109
+ return;
110
+ }
111
+ if (!rendered) return;
112
+ setClosing(true);
113
+ const id = setTimeout(() => {
114
+ setRendered(false);
115
+ setClosing(false);
116
+ }, 200);
117
+ return () => clearTimeout(id);
118
+ }, [state.visible, rendered]);
119
+ if (!api || !rendered) return null;
120
+ const { saving, message, saveLabel, discardLabel } = state;
121
+ return /* @__PURE__ */ jsx("div", { className: cn("pointer-events-none fixed inset-x-0 bottom-5 z-40 flex justify-center px-4", className), children: /* @__PURE__ */ jsxs("div", { className: cn(
122
+ "pointer-events-auto flex items-center gap-5 rounded-full bg-foreground py-2 pl-5 pr-2 text-background shadow-xl ring-1 ring-black/5 duration-200",
123
+ closing ? "animate-out fade-out slide-out-to-bottom-2" : "animate-in fade-in slide-in-from-bottom-2"
124
+ ), children: [
125
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2 text-sm font-medium", children: [
126
+ /* @__PURE__ */ jsx("span", { className: "h-2 w-2 shrink-0 rounded-full bg-amber-400" }),
127
+ message ?? t("saveBar.unsaved")
128
+ ] }),
129
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
130
+ /* @__PURE__ */ jsx(
131
+ "button",
132
+ {
133
+ type: "button",
134
+ disabled: saving,
135
+ onClick: () => api.handlers.current.onDiscard?.(),
136
+ 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",
137
+ children: discardLabel ?? t("common.discard")
138
+ }
139
+ ),
140
+ /* @__PURE__ */ jsxs(
141
+ "button",
142
+ {
143
+ type: "button",
144
+ disabled: saving,
145
+ onClick: () => api.handlers.current.onSave?.(),
146
+ 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",
147
+ children: [
148
+ saving && /* @__PURE__ */ jsx(Loader2, { className: "mr-1.5 h-3.5 w-3.5 animate-spin" }),
149
+ saveLabel ?? t("common.save")
150
+ ]
151
+ }
152
+ )
153
+ ] })
154
+ ] }) });
155
+ }
156
+ function useCrossModuleBack(onBack, parentLabel) {
157
+ const currentPath = typeof window !== "undefined" ? (window.location.hash ? window.location.hash.slice(1) : window.location.pathname) || "/" : "/";
158
+ const referrer = useNavReferrer(currentPath);
159
+ const cross = referrer && referrer.label && routeModule(referrer.path) !== routeModule(currentPath) ? referrer : null;
160
+ return {
161
+ onBack: cross ? () => navHistoryBack(onBack) : onBack,
162
+ parentLabel: cross ? cross.label : parentLabel,
163
+ isCrossModule: !!cross
164
+ };
165
+ }
166
+
167
+ export { SaveBar, SaveBarProvider, useBackHandler, useCrossModuleBack, useSaveBar, useSaveBarVisible };
168
+ //# sourceMappingURL=chunk-E526FHZ4.js.map
169
+ //# sourceMappingURL=chunk-E526FHZ4.js.map