@fayz-ai/ui 0.6.0 → 0.7.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.
- package/dist/chunk-75EFDLST.js +274 -0
- package/dist/chunk-75EFDLST.js.map +1 -0
- package/dist/{chunk-YB5ZJKNG.cjs → chunk-7PTRAWHO.cjs} +263 -225
- package/dist/chunk-7PTRAWHO.cjs.map +1 -0
- package/dist/{chunk-CZ6X6PZT.js → chunk-COC5DDFG.js} +313 -44
- package/dist/chunk-COC5DDFG.js.map +1 -0
- package/dist/{chunk-MYZT2OG7.js → chunk-FY7OZNKU.js} +24 -68
- package/dist/chunk-FY7OZNKU.js.map +1 -0
- package/dist/chunk-H6OULCHF.cjs +81 -0
- package/dist/chunk-H6OULCHF.cjs.map +1 -0
- package/dist/{chunk-GE6XUREM.cjs → chunk-HG5RH3B3.cjs} +339 -68
- package/dist/chunk-HG5RH3B3.cjs.map +1 -0
- package/dist/{chunk-7TBDPNLY.cjs → chunk-NWPMNPGR.cjs} +76 -47
- package/dist/chunk-NWPMNPGR.cjs.map +1 -0
- package/dist/{chunk-D6SXPF4F.cjs → chunk-ODY3GZ3Y.cjs} +41 -87
- package/dist/chunk-ODY3GZ3Y.cjs.map +1 -0
- package/dist/{chunk-22J2RTMN.js → chunk-OTUH4K4B.js} +196 -150
- package/dist/chunk-OTUH4K4B.js.map +1 -0
- package/dist/chunk-OW73RZOU.cjs +313 -0
- package/dist/chunk-OW73RZOU.cjs.map +1 -0
- package/dist/{chunk-GFH5HOCO.js → chunk-W5O2X277.js} +42 -14
- package/dist/chunk-W5O2X277.js.map +1 -0
- package/dist/chunk-YRVE4FOD.js +57 -0
- package/dist/chunk-YRVE4FOD.js.map +1 -0
- package/dist/dashboard/DashboardCanvas.d.ts +5 -1
- package/dist/dashboard/DashboardCanvas.d.ts.map +1 -1
- package/dist/dashboard/GoldCard.d.ts +19 -0
- package/dist/dashboard/GoldCard.d.ts.map +1 -0
- package/dist/dashboard/KpiCard.d.ts.map +1 -1
- package/dist/dashboard/index.cjs +30 -26
- package/dist/dashboard/index.d.ts +1 -0
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +3 -3
- package/dist/index.cjs +198 -174
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -7
- package/dist/layout/AppShell.d.ts +27 -6
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/ContentSplit.d.ts +32 -0
- package/dist/layout/ContentSplit.d.ts.map +1 -0
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/Topbar.d.ts.map +1 -1
- package/dist/layout/index.cjs +31 -23
- package/dist/layout/index.d.ts +2 -1
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/index.js +3 -3
- package/dist/primitives/index.cjs +126 -114
- package/dist/primitives/index.d.ts +2 -0
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +4 -4
- package/dist/primitives/markdown-editor.d.ts +23 -0
- package/dist/primitives/markdown-editor.d.ts.map +1 -0
- package/dist/primitives/markdown.d.ts +9 -0
- package/dist/primitives/markdown.d.ts.map +1 -0
- package/package.json +3 -3
- package/src/dashboard/DashboardCanvas.tsx +13 -2
- package/src/dashboard/GoldCard.tsx +38 -0
- package/src/dashboard/KpiCard.tsx +4 -2
- package/src/dashboard/index.ts +1 -0
- package/src/index.ts +15 -0
- package/src/layout/AppShell.tsx +240 -20
- package/src/layout/ContentSplit.tsx +153 -0
- package/src/layout/ModulePage.tsx +2 -2
- package/src/layout/Sidebar.tsx +71 -20
- package/src/layout/Topbar.tsx +47 -17
- package/src/layout/index.ts +15 -1
- package/src/primitives/dropdown.tsx +4 -4
- package/src/primitives/index.ts +2 -0
- package/src/primitives/markdown-editor.tsx +75 -0
- package/src/primitives/markdown.tsx +169 -0
- package/src/primitives/select.tsx +1 -1
- package/dist/chunk-22J2RTMN.js.map +0 -1
- package/dist/chunk-7TBDPNLY.cjs.map +0 -1
- package/dist/chunk-CZ6X6PZT.js.map +0 -1
- package/dist/chunk-D6SXPF4F.cjs.map +0 -1
- package/dist/chunk-DNYVEOAX.js +0 -11
- package/dist/chunk-DNYVEOAX.js.map +0 -1
- package/dist/chunk-E526FHZ4.js +0 -169
- package/dist/chunk-E526FHZ4.js.map +0 -1
- package/dist/chunk-GE6XUREM.cjs.map +0 -1
- package/dist/chunk-GFH5HOCO.js.map +0 -1
- package/dist/chunk-MYZT2OG7.js.map +0 -1
- package/dist/chunk-VVVZO2LE.cjs +0 -13
- package/dist/chunk-VVVZO2LE.cjs.map +0 -1
- package/dist/chunk-W4XXXJRW.cjs +0 -196
- package/dist/chunk-W4XXXJRW.cjs.map +0 -1
- package/dist/chunk-YB5ZJKNG.cjs.map +0 -1
package/dist/chunk-W4XXXJRW.cjs
DELETED
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var chunkVVVZO2LE_cjs = require('./chunk-VVVZO2LE.cjs');
|
|
4
|
-
var React = require('react');
|
|
5
|
-
var lucideReact = require('lucide-react');
|
|
6
|
-
var core = require('@fayz-ai/core');
|
|
7
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
-
|
|
9
|
-
function _interopNamespace(e) {
|
|
10
|
-
if (e && e.__esModule) return e;
|
|
11
|
-
var n = Object.create(null);
|
|
12
|
-
if (e) {
|
|
13
|
-
Object.keys(e).forEach(function (k) {
|
|
14
|
-
if (k !== 'default') {
|
|
15
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
16
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
17
|
-
enumerable: true,
|
|
18
|
-
get: function () { return e[k]; }
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
n.default = e;
|
|
24
|
-
return Object.freeze(n);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
28
|
-
|
|
29
|
-
var SaveBarApiContext = React__namespace.createContext(null);
|
|
30
|
-
var SaveBarStateContext = React__namespace.createContext({ visible: false, saving: false });
|
|
31
|
-
var _saveBarVisible = false;
|
|
32
|
-
var _saveBarSubs = /* @__PURE__ */ new Set();
|
|
33
|
-
function setSaveBarVisibleSignal(v) {
|
|
34
|
-
if (v === _saveBarVisible) return;
|
|
35
|
-
_saveBarVisible = v;
|
|
36
|
-
_saveBarSubs.forEach((fn) => fn());
|
|
37
|
-
}
|
|
38
|
-
function useSaveBarVisible() {
|
|
39
|
-
return React__namespace.useSyncExternalStore(
|
|
40
|
-
(cb) => {
|
|
41
|
-
_saveBarSubs.add(cb);
|
|
42
|
-
return () => {
|
|
43
|
-
_saveBarSubs.delete(cb);
|
|
44
|
-
};
|
|
45
|
-
},
|
|
46
|
-
() => _saveBarVisible,
|
|
47
|
-
() => false
|
|
48
|
-
);
|
|
49
|
-
}
|
|
50
|
-
function SaveBarProvider({ children }) {
|
|
51
|
-
const [state, setState] = React__namespace.useState({ visible: false, saving: false });
|
|
52
|
-
const handlers = React__namespace.useRef({});
|
|
53
|
-
const api = React__namespace.useMemo(() => ({ setState, handlers }), []);
|
|
54
|
-
const backStack = React__namespace.useRef([]);
|
|
55
|
-
const backApi = React__namespace.useMemo(() => ({ stack: backStack }), []);
|
|
56
|
-
React__namespace.useEffect(() => {
|
|
57
|
-
setSaveBarVisibleSignal(state.visible);
|
|
58
|
-
}, [state.visible]);
|
|
59
|
-
React__namespace.useEffect(() => {
|
|
60
|
-
function onKey(e) {
|
|
61
|
-
if (state.visible && !state.saving) {
|
|
62
|
-
if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) {
|
|
63
|
-
e.preventDefault();
|
|
64
|
-
handlers.current.onSave?.();
|
|
65
|
-
} else if (e.key === "Escape") {
|
|
66
|
-
e.preventDefault();
|
|
67
|
-
handlers.current.onDiscard?.();
|
|
68
|
-
}
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
if (e.key === "Escape" && !e.defaultPrevented && !isEditableTarget(e.target)) {
|
|
72
|
-
for (let i = backStack.current.length - 1; i >= 0; i--) {
|
|
73
|
-
const back = backStack.current[i].current;
|
|
74
|
-
if (back) {
|
|
75
|
-
e.preventDefault();
|
|
76
|
-
back();
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
window.addEventListener("keydown", onKey);
|
|
83
|
-
return () => window.removeEventListener("keydown", onKey);
|
|
84
|
-
}, [state.visible, state.saving]);
|
|
85
|
-
return /* @__PURE__ */ jsxRuntime.jsx(SaveBarApiContext.Provider, { value: api, children: /* @__PURE__ */ jsxRuntime.jsx(BackNavApiContext.Provider, { value: backApi, children: /* @__PURE__ */ jsxRuntime.jsx(SaveBarStateContext.Provider, { value: state, children }) }) });
|
|
86
|
-
}
|
|
87
|
-
var BackNavApiContext = React__namespace.createContext(null);
|
|
88
|
-
function isEditableTarget(target) {
|
|
89
|
-
const el = target;
|
|
90
|
-
if (!el || !el.tagName) return false;
|
|
91
|
-
const tag = el.tagName.toLowerCase();
|
|
92
|
-
return tag === "input" || tag === "textarea" || tag === "select" || el.isContentEditable;
|
|
93
|
-
}
|
|
94
|
-
function useBackHandler(onBack) {
|
|
95
|
-
const api = React__namespace.useContext(BackNavApiContext);
|
|
96
|
-
const ref = React__namespace.useRef(onBack);
|
|
97
|
-
React__namespace.useEffect(() => {
|
|
98
|
-
ref.current = onBack;
|
|
99
|
-
});
|
|
100
|
-
React__namespace.useEffect(() => {
|
|
101
|
-
if (!api) return;
|
|
102
|
-
const stack = api.stack.current;
|
|
103
|
-
stack.push(ref);
|
|
104
|
-
return () => {
|
|
105
|
-
const i = stack.indexOf(ref);
|
|
106
|
-
if (i !== -1) stack.splice(i, 1);
|
|
107
|
-
};
|
|
108
|
-
}, [api]);
|
|
109
|
-
}
|
|
110
|
-
function useSaveBar({ dirty, saving = false, onSave, onDiscard, message, saveLabel, discardLabel }) {
|
|
111
|
-
const api = React__namespace.useContext(SaveBarApiContext);
|
|
112
|
-
React__namespace.useEffect(() => {
|
|
113
|
-
if (api) api.handlers.current = { onSave, onDiscard };
|
|
114
|
-
});
|
|
115
|
-
React__namespace.useEffect(() => {
|
|
116
|
-
if (!api) return;
|
|
117
|
-
api.setState({ visible: dirty, saving, message, saveLabel, discardLabel });
|
|
118
|
-
return () => api.setState((s) => ({ ...s, visible: false }));
|
|
119
|
-
}, [api, dirty, saving, message, saveLabel, discardLabel]);
|
|
120
|
-
}
|
|
121
|
-
function SaveBar({ className }) {
|
|
122
|
-
const state = React__namespace.useContext(SaveBarStateContext);
|
|
123
|
-
const api = React__namespace.useContext(SaveBarApiContext);
|
|
124
|
-
const t = core.useTranslation();
|
|
125
|
-
const [rendered, setRendered] = React__namespace.useState(state.visible);
|
|
126
|
-
const [closing, setClosing] = React__namespace.useState(false);
|
|
127
|
-
React__namespace.useEffect(() => {
|
|
128
|
-
if (state.visible) {
|
|
129
|
-
setRendered(true);
|
|
130
|
-
setClosing(false);
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
if (!rendered) return;
|
|
134
|
-
setClosing(true);
|
|
135
|
-
const id = setTimeout(() => {
|
|
136
|
-
setRendered(false);
|
|
137
|
-
setClosing(false);
|
|
138
|
-
}, 200);
|
|
139
|
-
return () => clearTimeout(id);
|
|
140
|
-
}, [state.visible, rendered]);
|
|
141
|
-
if (!api || !rendered) return null;
|
|
142
|
-
const { saving, message, saveLabel, discardLabel } = state;
|
|
143
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkVVVZO2LE_cjs.cn("pointer-events-none fixed inset-x-0 bottom-5 z-40 flex justify-center px-4", className), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkVVVZO2LE_cjs.cn(
|
|
144
|
-
"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",
|
|
145
|
-
closing ? "animate-out fade-out slide-out-to-bottom-2" : "animate-in fade-in slide-in-from-bottom-2"
|
|
146
|
-
), children: [
|
|
147
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2 text-sm font-medium", children: [
|
|
148
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-2 w-2 shrink-0 rounded-full bg-amber-400" }),
|
|
149
|
-
message ?? t("saveBar.unsaved")
|
|
150
|
-
] }),
|
|
151
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
|
|
152
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
153
|
-
"button",
|
|
154
|
-
{
|
|
155
|
-
type: "button",
|
|
156
|
-
disabled: saving,
|
|
157
|
-
onClick: () => api.handlers.current.onDiscard?.(),
|
|
158
|
-
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",
|
|
159
|
-
children: discardLabel ?? t("common.discard")
|
|
160
|
-
}
|
|
161
|
-
),
|
|
162
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
163
|
-
"button",
|
|
164
|
-
{
|
|
165
|
-
type: "button",
|
|
166
|
-
disabled: saving,
|
|
167
|
-
onClick: () => api.handlers.current.onSave?.(),
|
|
168
|
-
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",
|
|
169
|
-
children: [
|
|
170
|
-
saving && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "mr-1.5 h-3.5 w-3.5 animate-spin" }),
|
|
171
|
-
saveLabel ?? t("common.save")
|
|
172
|
-
]
|
|
173
|
-
}
|
|
174
|
-
)
|
|
175
|
-
] })
|
|
176
|
-
] }) });
|
|
177
|
-
}
|
|
178
|
-
function useCrossModuleBack(onBack, parentLabel) {
|
|
179
|
-
const currentPath = typeof window !== "undefined" ? (window.location.hash ? window.location.hash.slice(1) : window.location.pathname) || "/" : "/";
|
|
180
|
-
const referrer = core.useNavReferrer(currentPath);
|
|
181
|
-
const cross = referrer && referrer.label && core.routeModule(referrer.path) !== core.routeModule(currentPath) ? referrer : null;
|
|
182
|
-
return {
|
|
183
|
-
onBack: cross ? () => core.navHistoryBack(onBack) : onBack,
|
|
184
|
-
parentLabel: cross ? cross.label : parentLabel,
|
|
185
|
-
isCrossModule: !!cross
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
exports.SaveBar = SaveBar;
|
|
190
|
-
exports.SaveBarProvider = SaveBarProvider;
|
|
191
|
-
exports.useBackHandler = useBackHandler;
|
|
192
|
-
exports.useCrossModuleBack = useCrossModuleBack;
|
|
193
|
-
exports.useSaveBar = useSaveBar;
|
|
194
|
-
exports.useSaveBarVisible = useSaveBarVisible;
|
|
195
|
-
//# sourceMappingURL=chunk-W4XXXJRW.cjs.map
|
|
196
|
-
//# sourceMappingURL=chunk-W4XXXJRW.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/layout/SaveBar.tsx","../src/layout/useCrossModuleBack.ts"],"names":["React","jsx","useTranslation","cn","jsxs","Loader2","useNavReferrer","routeModule","navHistoryBack"],"mappings":"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","file":"chunk-W4XXXJRW.cjs","sourcesContent":["import * as React from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { cn } from '../utils/cn'\n\n// ---------------------------------------------------------------------------\n// SaveBar — the single, app-wide \"Unsaved changes\" floating island. A form\n// declares its state via useSaveBar({ dirty, saving, onSave, onDiscard }); the\n// shell renders ONE <SaveBar/> (centered, floating above the content area) that\n// appears whenever the active form is dirty. Mirrors the BackStyleProvider /\n// PageHeaderActions idiom: decide-once at the shell, hook-in at the page.\n//\n// Handlers live in a ref (not state) so per-render closure changes never cause\n// re-render loops; only the primitive `dirty`/`saving` flags drive visibility.\n// ---------------------------------------------------------------------------\n\nexport interface SaveBarRegistration {\n /** Show the bar when true (form has unsaved changes). */\n dirty: boolean\n /** Save in progress — disables buttons and shows a spinner. */\n saving?: boolean\n onSave: () => void\n onDiscard?: () => void\n /** Override the \"Unsaved changes\" message. */\n message?: string\n /** Override the Save / Discard button labels. */\n saveLabel?: string\n discardLabel?: string\n}\n\ninterface SaveBarState {\n visible: boolean\n saving: boolean\n message?: string\n saveLabel?: string\n discardLabel?: string\n}\n\ninterface SaveBarApi {\n setState: React.Dispatch<React.SetStateAction<SaveBarState>>\n handlers: React.MutableRefObject<{ onSave?: () => void; onDiscard?: () => void }>\n}\n\n// Two contexts on purpose: the API context is STABLE (so useSaveBar's effect\n// deps don't change every render → no loop), the state context changes to\n// re-render only <SaveBar/>.\nconst SaveBarApiContext = React.createContext<SaveBarApi | null>(null)\nconst SaveBarStateContext = React.createContext<SaveBarState>({ visible: false, saving: false })\n\n// Module-level \"is the SaveBar showing\" signal so sibling UI that isn't a\n// descendant of SaveBarProvider (e.g. the ToastProvider) can react to it —\n// used to lift toasts above the bar so they stack instead of overlapping.\nlet _saveBarVisible = false\nconst _saveBarSubs = new Set<() => void>()\nfunction setSaveBarVisibleSignal(v: boolean) {\n if (v === _saveBarVisible) return\n _saveBarVisible = v\n _saveBarSubs.forEach((fn) => fn())\n}\n\n/** Subscribe to whether the floating SaveBar is currently on screen. */\nexport function useSaveBarVisible(): boolean {\n return React.useSyncExternalStore(\n (cb) => { _saveBarSubs.add(cb); return () => { _saveBarSubs.delete(cb) } },\n () => _saveBarVisible,\n () => false,\n )\n}\n\nexport function SaveBarProvider({ children }: { children: React.ReactNode }) {\n const [state, setState] = React.useState<SaveBarState>({ visible: false, saving: false })\n const handlers = React.useRef<{ onSave?: () => void; onDiscard?: () => void }>({})\n const api = React.useMemo<SaveBarApi>(() => ({ setState, handlers }), [])\n\n // Stack of registered back-navigation handlers (latest-mounted wins) so the\n // app-wide Escape key can navigate \"up\" to the parent route. Lives here, next\n // to the SaveBar handlers, so ONE keydown listener arbitrates both — Escape\n // discards a dirty form first, and only navigates back when none is open.\n const backStack = React.useRef<React.MutableRefObject<(() => void) | undefined>[]>([])\n const backApi = React.useMemo<BackNavApi>(() => ({ stack: backStack }), [])\n\n // Broadcast visibility to the module-level signal (for the ToastProvider).\n React.useEffect(() => { setSaveBarVisibleSignal(state.visible) }, [state.visible])\n\n // App-wide keyboard shortcuts, arbitrated in one place:\n // • Cmd/Ctrl+Enter → save the active (dirty) form\n // • Escape (form dirty) → discard the form\n // • Escape (no dirty form) → navigate back to the parent route\n React.useEffect(() => {\n function onKey(e: KeyboardEvent) {\n if (state.visible && !state.saving) {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n handlers.current.onSave?.()\n } else if (e.key === 'Escape') {\n e.preventDefault()\n handlers.current.onDiscard?.()\n }\n return\n }\n // No open/dirty form — Escape walks \"up\" via the topmost back handler.\n if (e.key === 'Escape' && !e.defaultPrevented && !isEditableTarget(e.target)) {\n for (let i = backStack.current.length - 1; i >= 0; i--) {\n const back = backStack.current[i].current\n if (back) { e.preventDefault(); back(); return }\n }\n }\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [state.visible, state.saving])\n\n return (\n <SaveBarApiContext.Provider value={api}>\n <BackNavApiContext.Provider value={backApi}>\n <SaveBarStateContext.Provider value={state}>\n {children}\n </SaveBarStateContext.Provider>\n </BackNavApiContext.Provider>\n </SaveBarApiContext.Provider>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Back-navigation registry — lets any subpage register its \"go to parent\" action\n// so the shell's single Escape handler can drive it (see SaveBarProvider above).\n// SubpageHeader already receives onBack, so wiring it there gives every plugin\n// detail page Escape-to-parent for free, with zero per-plugin code.\n// ---------------------------------------------------------------------------\n\ninterface BackNavApi {\n stack: React.MutableRefObject<React.MutableRefObject<(() => void) | undefined>[]>\n}\nconst BackNavApiContext = React.createContext<BackNavApi | null>(null)\n\n/** True when the keyboard event originates from a field where Escape has its\n * own meaning (clear/close), so we shouldn't hijack it for back-navigation. */\nfunction isEditableTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null\n if (!el || !el.tagName) return false\n const tag = el.tagName.toLowerCase()\n return tag === 'input' || tag === 'textarea' || tag === 'select' || el.isContentEditable\n}\n\n/**\n * Register a back-navigation handler with the app-wide Escape key. Call it in a\n * subpage (or pass through SubpageHeader's onBack); while mounted, pressing\n * Escape with no dirty form open invokes the most-recently-registered handler.\n * Pass `undefined` to opt out (e.g. a top-level page with nothing to go back to).\n */\nexport function useBackHandler(onBack?: () => void): void {\n const api = React.useContext(BackNavApiContext)\n // Hold the latest closure in a ref so re-renders don't churn the stack.\n const ref = React.useRef(onBack)\n React.useEffect(() => { ref.current = onBack })\n React.useEffect(() => {\n if (!api) return\n const stack = api.stack.current\n stack.push(ref)\n return () => {\n const i = stack.indexOf(ref)\n if (i !== -1) stack.splice(i, 1)\n }\n }, [api])\n}\n\n/**\n * Register the current form with the app-wide SaveBar. Call it unconditionally\n * in a form view; it shows the island while `dirty`, keeps handlers current, and\n * hides the island automatically when the form unmounts (e.g. on navigation).\n */\nexport function useSaveBar({ dirty, saving = false, onSave, onDiscard, message, saveLabel, discardLabel }: SaveBarRegistration): void {\n const api = React.useContext(SaveBarApiContext)\n\n // Keep latest handlers in the shared ref (no state churn from new closures).\n React.useEffect(() => {\n if (api) api.handlers.current = { onSave, onDiscard }\n })\n\n // Drive visibility from primitives only; `api` is stable → no render loops.\n React.useEffect(() => {\n if (!api) return\n api.setState({ visible: dirty, saving, message, saveLabel, discardLabel })\n return () => api.setState((s) => ({ ...s, visible: false }))\n }, [api, dirty, saving, message, saveLabel, discardLabel])\n}\n\n/** The floating island. Rendered once by the shell inside the content column. */\nexport function SaveBar({ className }: { className?: string }) {\n const state = React.useContext(SaveBarStateContext)\n const api = React.useContext(SaveBarApiContext)\n const t = useTranslation()\n\n // Keep the island mounted through its exit animation: `rendered` lags behind\n // `visible` so we can play fade-out before unmounting.\n const [rendered, setRendered] = React.useState(state.visible)\n const [closing, setClosing] = React.useState(false)\n\n React.useEffect(() => {\n if (state.visible) {\n setRendered(true)\n setClosing(false)\n return\n }\n if (!rendered) return\n setClosing(true)\n const id = setTimeout(() => { setRendered(false); setClosing(false) }, 200)\n return () => clearTimeout(id)\n }, [state.visible, rendered])\n\n if (!api || !rendered) return null\n const { saving, message, saveLabel, discardLabel } = state\n\n return (\n <div className={cn('pointer-events-none fixed inset-x-0 bottom-5 z-40 flex justify-center px-4', className)}>\n {/* Dark island for strong contrast against the light page (auto-inverts in dark mode). */}\n <div className={cn(\n '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',\n closing ? 'animate-out fade-out slide-out-to-bottom-2' : 'animate-in fade-in slide-in-from-bottom-2',\n )}>\n <span className=\"flex items-center gap-2 text-sm font-medium\">\n <span className=\"h-2 w-2 shrink-0 rounded-full bg-amber-400\" />\n {message ?? t('saveBar.unsaved')}\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => api.handlers.current.onDiscard?.()}\n 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\"\n >\n {discardLabel ?? t('common.discard')}\n </button>\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => api.handlers.current.onSave?.()}\n 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\"\n >\n {saving && <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />}\n {saveLabel ?? t('common.save')}\n </button>\n </div>\n </div>\n </div>\n )\n}\n","import { useNavReferrer, navHistoryBack, routeModule } from '@fayz-ai/core'\n\n/**\n * Context-aware back target shared by all header/breadcrumb components.\n *\n * When the user arrived from a *different* module (tracked in the global\n * navigation history), a page's own onBack/parentLabel point at its local\n * parent — wrong for the referrer. In that case we return the referrer's label\n * and a back action that pops the browser history to the actual previous page.\n * Within the same module the page's own (more specific) values pass through\n * unchanged, so existing behavior is preserved.\n */\nexport function useCrossModuleBack(onBack?: () => void, parentLabel?: string): {\n onBack?: () => void\n parentLabel?: string\n isCrossModule: boolean\n} {\n const currentPath = typeof window !== 'undefined'\n ? ((window.location.hash ? window.location.hash.slice(1) : window.location.pathname) || '/')\n : '/'\n const referrer = useNavReferrer(currentPath)\n const cross = referrer && referrer.label && routeModule(referrer.path) !== routeModule(currentPath)\n ? referrer\n : null\n return {\n onBack: cross ? () => navHistoryBack(onBack) : onBack,\n parentLabel: cross ? cross.label : parentLabel,\n isCrossModule: !!cross,\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/primitives/input.tsx","../src/primitives/badge.tsx","../src/primitives/modal.tsx","../src/primitives/checkbox.tsx","../src/primitives/sheet.tsx","../src/primitives/select.tsx","../src/primitives/toast.tsx","../src/primitives/tabs.tsx","../src/primitives/separator.tsx","../src/primitives/breadcrumb.tsx","../src/primitives/tooltip.tsx","../src/primitives/time-picker.tsx","../src/primitives/skeleton.tsx","../src/primitives/list-view.tsx","../src/primitives/date-picker.tsx","../src/primitives/search-select.tsx","../src/primitives/currency-input.tsx","../src/primitives/confirm-dialog.tsx","../src/primitives/popover.tsx"],"names":["React","jsxs","jsx","cn","cva","DialogPrimitive","React2","X","React3","Check","DialogPrimitive2","React4","SelectPrimitive","React5","ChevronDown","ChevronUp","useSaveBarVisible","Toaster","TabsPrimitive","React6","Separator","React7","SeparatorPrimitive","useCrossModuleBack","useBackHandler","ArrowLeft","Fragment","TooltipPrimitive","React8","useState","useRef","useEffect","useMemo","Clock","createPortal","_","useCallback","Search","Button","Plus","DataTable","ChevronLeft","ChevronRight","useTranslation","getCurrentLocale","Calendar","React11","Loader2","React12","Info","XCircle","AlertTriangle","CheckCircle2","Icon","React13","PopoverPrimitive","React14"],"mappings":"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","file":"chunk-YB5ZJKNG.cjs","sourcesContent":["import * as React from 'react'\n\nimport { cn } from '../utils/cn'\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {\n error?: string\n description?: string\n}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, error, description, id, ...props }, ref) => {\n const inputId = id ?? React.useId()\n const descriptionId = description ? `${inputId}-description` : undefined\n const errorId = error ? `${inputId}-error` : undefined\n\n return (\n <div className=\"w-full\">\n <input\n type={type}\n id={inputId}\n className={cn(\n 'flex h-8 w-full rounded-input border border-input bg-card px-2 py-1 text-sm text-foreground shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n error && 'border-destructive focus-visible:ring-destructive',\n className,\n )}\n ref={ref}\n aria-invalid={error ? true : undefined}\n aria-describedby={\n [descriptionId, errorId].filter(Boolean).join(' ') || undefined\n }\n {...props}\n />\n {description && !error && (\n <p id={descriptionId} className=\"mt-1.5 text-xs text-muted-foreground\">\n {description}\n </p>\n )}\n {error && (\n <p id={errorId} className=\"mt-1.5 text-xs text-destructive\">\n {error}\n </p>\n )}\n </div>\n )\n }\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../utils/cn'\n\nconst badgeVariants = cva(\n 'inline-flex items-center gap-1.5 rounded px-2 py-0.5 text-xs font-medium leading-[18px] transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n default: 'bg-muted text-muted-foreground',\n secondary: 'bg-muted text-muted-foreground',\n info: 'bg-info-soft text-info-soft-foreground',\n success: 'bg-success-soft text-success-soft-foreground',\n warning: 'bg-warning-soft text-warning-soft-foreground',\n destructive: 'bg-destructive-soft text-destructive-soft-foreground',\n magic: 'bg-magic-soft text-magic-soft-foreground',\n strong: 'bg-primary text-primary-foreground',\n outline: 'border border-border text-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\nconst VARIANTS_WITH_DOT = new Set([\n 'info',\n 'success',\n 'warning',\n 'destructive',\n 'magic',\n])\n\nconst DOT_COLOR: Record<string, string> = {\n info: 'hsl(var(--info))',\n success: 'hsl(var(--success))',\n warning: 'hsl(var(--warning))',\n destructive: 'hsl(var(--destructive))',\n magic: 'hsl(var(--magic))',\n}\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {\n // Show a leading status dot. Defaults to true for status variants\n // (info/success/warning/destructive/magic), false for neutral/outline/strong.\n dot?: boolean\n}\n\nfunction Badge({ className, variant, dot, children, ...props }: BadgeProps) {\n const v = variant ?? 'default'\n const showDot = dot ?? VARIANTS_WITH_DOT.has(v)\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props}>\n {showDot && (\n <span\n className=\"inline-block size-1.5 rounded-full\"\n style={{ background: DOT_COLOR[v] ?? 'currentColor' }}\n />\n )}\n {children}\n </div>\n )\n}\n\nexport { Badge, badgeVariants }\n","import * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { X } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\n\n// ---------------------------------------------------------------------------\n// Animations are defined in styles.css under .saas-mdl-ov / .saas-mdl-ct\n// selectors with [data-state=\"open\"/\"closed\"]. Radix defers unmount when\n// it detects animationName on the element — CSS must be loaded before render.\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Sizes\n// ---------------------------------------------------------------------------\n\nconst SIZE_MAP = {\n sm: 'sm:max-w-sm',\n md: 'sm:max-w-md',\n lg: 'sm:max-w-lg',\n xl: 'sm:max-w-xl',\n '2xl': 'sm:max-w-2xl',\n '3xl': 'sm:max-w-3xl',\n full: 'sm:max-w-[calc(100vw-4rem)]',\n} as const\n\ntype ModalSize = keyof typeof SIZE_MAP\n\n// ---------------------------------------------------------------------------\n// Primitives re-export\n// ---------------------------------------------------------------------------\n\nconst Modal = DialogPrimitive.Root\nconst ModalTrigger = DialogPrimitive.Trigger\nconst ModalClose = DialogPrimitive.Close\nconst ModalPortal = DialogPrimitive.Portal\n\n// ---------------------------------------------------------------------------\n// Overlay — also serves as the flex centering wrapper\n// ---------------------------------------------------------------------------\n\nconst ModalOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fayz-modal-overlay saas-mdl-ov fixed inset-0 z-50',\n 'flex items-center justify-center p-0 sm:p-6',\n className,\n )}\n {...props}\n />\n))\nModalOverlay.displayName = 'ModalOverlay'\n\n// ---------------------------------------------------------------------------\n// Content — rendered INSIDE the overlay (flex-centered)\n// ---------------------------------------------------------------------------\n\nconst ModalContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n size?: ModalSize\n hideClose?: boolean\n noPadding?: boolean\n }\n>(({ className, children, size = 'lg', hideClose, noPadding, onPointerDownOutside, onInteractOutside, onCloseAutoFocus, ...props }, ref) => (\n <ModalPortal>\n <ModalOverlay>\n <DialogPrimitive.Content\n ref={ref}\n onCloseAutoFocus={(e) => {\n // Prevent Radix from stealing focus back to the trigger element on close.\n // This interferes with FullCalendar's selection and other interactive components.\n e.preventDefault()\n onCloseAutoFocus?.(e)\n }}\n onPointerDownOutside={(e) => {\n // Prevent Radix from intercepting clicks on portaled dropdowns (DatePicker, TimePicker, etc.)\n const target = e.target as HTMLElement\n if (target.closest('[data-modal-passthrough]') || target.closest('[data-radix-popper-content-wrapper]')) {\n e.preventDefault()\n }\n onPointerDownOutside?.(e)\n }}\n onInteractOutside={(e) => {\n const target = e.target as HTMLElement\n if (target.closest('[data-modal-passthrough]') || target.closest('[data-radix-popper-content-wrapper]')) {\n e.preventDefault()\n }\n onInteractOutside?.(e)\n }}\n className={cn(\n 'fayz-glass-surface fayz-modal-content saas-mdl-ct relative z-50 flex flex-col w-full outline-none',\n // Mobile fullscreen\n 'h-full rounded-none border-0',\n // Desktop centered card\n 'sm:h-auto sm:max-h-[85vh] sm:rounded-2xl sm:border',\n SIZE_MAP[size],\n noPadding ? '' : 'p-6 gap-4',\n className,\n )}\n {...props}\n >\n {children}\n {!hideClose && (\n <DialogPrimitive.Close className=\"absolute right-4 top-4 z-10 flex h-7 w-7 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus:outline-none focus:ring-2 focus:ring-ring\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </ModalOverlay>\n </ModalPortal>\n))\nModalContent.displayName = 'ModalContent'\n\n// ---------------------------------------------------------------------------\n// Sections\n// ---------------------------------------------------------------------------\n\nfunction ModalHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex flex-col space-y-1.5 text-center sm:text-left shrink-0', className)} {...props} />\n}\n\nfunction ModalBody({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex-1 overflow-y-auto min-h-0', className)} {...props} />\n}\n\nfunction ModalFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2 shrink-0', className)} {...props} />\n}\n\nconst ModalTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title ref={ref} className={cn('text-lg font-semibold leading-none tracking-tight', className)} {...props} />\n))\nModalTitle.displayName = 'ModalTitle'\n\nconst ModalDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n))\nModalDescription.displayName = 'ModalDescription'\n\nexport {\n Modal, ModalPortal, ModalOverlay, ModalClose, ModalTrigger,\n ModalContent, ModalHeader, ModalBody, ModalFooter, ModalTitle, ModalDescription,\n}\nexport type { ModalSize }\n","import * as React from 'react'\nimport { Check } from 'lucide-react'\nimport { cn } from '../utils/cn'\n\ntype CheckboxColor = 'primary' | 'success' | 'warning' | 'destructive'\n\ninterface CheckboxProps {\n checked?: boolean\n onChange?: (checked: boolean) => void\n disabled?: boolean\n className?: string\n color?: CheckboxColor\n id?: string\n}\n\nconst COLOR_CLASSES: Record<CheckboxColor, string> = {\n primary: 'border-primary bg-primary text-primary-foreground',\n success: 'border-success bg-success text-white dark:border-success dark:bg-success',\n warning: 'border-warning bg-warning text-white',\n destructive: 'border-destructive bg-destructive text-destructive-foreground',\n}\n\nconst Checkbox = React.forwardRef<HTMLButtonElement, CheckboxProps>(\n ({ checked = false, onChange, disabled, className, color = 'primary', id, ...props }, ref) => {\n return (\n <button\n ref={ref}\n id={id}\n type=\"button\"\n role=\"checkbox\"\n aria-checked={checked}\n disabled={disabled}\n onClick={() => onChange?.(!checked)}\n className={cn(\n 'peer inline-flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-[5px] border-2 transition-all duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n checked\n ? `${COLOR_CLASSES[color]} shadow-sm`\n : 'border-muted-foreground/40 bg-background hover:border-muted-foreground/60',\n className,\n )}\n {...props}\n >\n {checked && <Check className=\"h-3.5 w-3.5\" strokeWidth={3} />}\n </button>\n )\n },\n)\nCheckbox.displayName = 'Checkbox'\n\nexport { Checkbox }\nexport type { CheckboxColor, CheckboxProps }\n","import * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { X } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\n\n// ---------------------------------------------------------------------------\n// Inject sheet animations once (module-level side effect)\n// ---------------------------------------------------------------------------\n\nconst STYLE_ID = 'saas-sheet-styles'\nif (typeof document !== 'undefined' && !document.getElementById(STYLE_ID)) {\n const style = document.createElement('style')\n style.id = STYLE_ID\n style.textContent = `\n @keyframes saas-sheet-fade-in { from { opacity: 0 } to { opacity: 1 } }\n @keyframes saas-sheet-fade-out { from { opacity: 1 } to { opacity: 0 } }\n @keyframes saas-sheet-slide-in { from { transform: translateX(100%) } to { transform: translateX(0) } }\n @keyframes saas-sheet-slide-out { from { transform: translateX(0) } to { transform: translateX(100%) } }\n .saas-sheet-overlay[data-state=\"open\"] { animation: saas-sheet-fade-in 200ms ease-out }\n .saas-sheet-overlay[data-state=\"closed\"] { animation: saas-sheet-fade-out 150ms ease-in }\n .saas-sheet-content[data-state=\"open\"] { animation: saas-sheet-slide-in 280ms cubic-bezier(0.16, 1, 0.3, 1) }\n .saas-sheet-content[data-state=\"closed\"] { animation: saas-sheet-slide-out 200ms ease-in }\n `\n document.head.appendChild(style)\n}\n\n// ---------------------------------------------------------------------------\n// Root, Trigger, Close — re-exported from Radix\n// ---------------------------------------------------------------------------\n\nconst Sheet = DialogPrimitive.Root\nconst SheetTrigger = DialogPrimitive.Trigger\nconst SheetClose = DialogPrimitive.Close\nconst SheetPortal = DialogPrimitive.Portal\n\n// ---------------------------------------------------------------------------\n// Overlay\n// ---------------------------------------------------------------------------\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'saas-sheet-overlay fixed inset-0 z-50 bg-black/40 backdrop-blur-[2px]',\n className\n )}\n {...props}\n />\n))\nSheetOverlay.displayName = 'SheetOverlay'\n\n// ---------------------------------------------------------------------------\n// Content — slides in from the right\n// ---------------------------------------------------------------------------\n\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n /** Width class override — defaults to max-w-md */\n width?: string\n /** Hide the built-in close button */\n hideClose?: boolean\n /** Overlay style: \"blur\" (default), \"dim\" (no blur), \"none\" (transparent) */\n overlay?: 'blur' | 'dim' | 'none'\n }\n>(({ className, children, width, hideClose, overlay = 'blur', ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay className={overlay === 'none' ? 'bg-transparent backdrop-blur-0' : overlay === 'dim' ? 'backdrop-blur-0' : undefined} />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fayz-glass-surface saas-sheet-content fixed inset-y-0 right-0 z-50 flex flex-col border-l bg-card shadow-2xl outline-none',\n 'w-full',\n width ?? 'max-w-md',\n className\n )}\n {...props}\n >\n {children}\n {!hideClose && (\n <DialogPrimitive.Close className=\"absolute right-4 top-4 z-10 flex h-7 w-7 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus:outline-none focus:ring-2 focus:ring-ring\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </SheetPortal>\n))\nSheetContent.displayName = 'SheetContent'\n\n// ---------------------------------------------------------------------------\n// Header — top section with title + description\n// ---------------------------------------------------------------------------\n\nfunction SheetHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('flex flex-col gap-1 px-5 py-4 border-b shrink-0', className)}\n {...props}\n />\n )\n}\nSheetHeader.displayName = 'SheetHeader'\n\n// ---------------------------------------------------------------------------\n// Footer — bottom section for actions\n// ---------------------------------------------------------------------------\n\nfunction SheetFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('flex items-center gap-2 px-5 py-3 border-t shrink-0', className)}\n {...props}\n />\n )\n}\nSheetFooter.displayName = 'SheetFooter'\n\n// ---------------------------------------------------------------------------\n// Title\n// ---------------------------------------------------------------------------\n\nconst SheetTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-sm font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n))\nSheetTitle.displayName = 'SheetTitle'\n\n// ---------------------------------------------------------------------------\n// Description\n// ---------------------------------------------------------------------------\n\nconst SheetDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-xs text-muted-foreground', className)}\n {...props}\n />\n))\nSheetDescription.displayName = 'SheetDescription'\n\n// ---------------------------------------------------------------------------\n// Body — scrollable content area\n// ---------------------------------------------------------------------------\n\nfunction SheetBody({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('flex-1 overflow-y-auto px-5 py-5', className)}\n {...props}\n />\n )\n}\nSheetBody.displayName = 'SheetBody'\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetBody,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { ChevronDown, ChevronUp, Check } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex h-10 w-full items-center justify-between rounded-input border border-input bg-background px-3 py-2 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n 'flex cursor-default items-center justify-center py-1',\n className\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n 'flex cursor-default items-center justify-center py-1',\n className\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'fayz-glass-surface relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-card border bg-popover text-popover-foreground shadow-md',\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]'\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn('py-1.5 pl-8 pr-2 text-sm font-semibold', className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none data-[highlighted]:bg-muted 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 <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","import * as React from 'react'\nimport { Toaster, toast } from 'sonner'\nimport { useSaveBarVisible } from '../layout/SaveBar'\n\ninterface ToastProviderProps {\n position?:\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right'\n theme?: 'light' | 'dark' | 'system'\n}\n\nfunction ToastProvider({\n position = 'bottom-center',\n theme = 'system',\n}: ToastProviderProps) {\n // Stack toasts ABOVE the floating SaveBar (instead of overlapping it) by\n // lifting the bottom offset while the bar is on screen.\n const saveBarVisible = useSaveBarVisible()\n const bottomOffset = position.startsWith('bottom') && saveBarVisible ? 84 : 24\n return (\n <Toaster\n position={position}\n theme={theme}\n offset={bottomOffset}\n closeButton\n richColors\n toastOptions={{\n classNames: {\n // Format harmonized with the SaveBar island: soft ring + xl shadow,\n // generous rounded-2xl radius (full-pill looks wrong on multi-line\n // toasts). Colors stay semantic (richColors).\n toast: 'group !gap-3 !rounded-3xl !border !px-4 !py-3 !shadow-xl !ring-1 !ring-black/5',\n title: '!text-sm !font-semibold',\n description: '!text-xs !mt-0.5',\n closeButton: '!opacity-0 group-hover:!opacity-60 hover:!opacity-100 !transition-opacity',\n },\n }}\n />\n )\n}\n\nexport { ToastProvider, toast }\n","import * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\n\nimport { cn } from '../utils/cn'\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n 'inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground',\n className\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm',\n className\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n className\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","import * as React from 'react'\nimport * as SeparatorPrimitive from '@radix-ui/react-separator'\n\nimport { cn } from '../utils/cn'\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = 'horizontal', decorative = true, ...props },\n ref\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'shrink-0 bg-border',\n orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]',\n className\n )}\n {...props}\n />\n )\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n","import * as React from 'react'\nimport { ArrowLeft } from 'lucide-react'\nimport { useBackHandler } from '../layout/SaveBar'\nimport { useCrossModuleBack } from '../layout/useCrossModuleBack'\n\ninterface BreadcrumbProps {\n /** Parent label (e.g. \"Invoices\", \"Clients\") — clicking navigates back */\n parent: string\n /** Current item name (e.g. \"Invoice #123\", \"John Doe\") */\n current?: string\n /** Navigate back handler */\n onBack: () => void\n}\n\nexport function Breadcrumb({ parent, current, onBack }: BreadcrumbProps) {\n // When the user came from another module, point \"back\" at that actual\n // previous page; otherwise keep this page's own parent/onBack.\n const { onBack: effectiveOnBack, parentLabel: effectiveParent } = useCrossModuleBack(onBack, parent)\n // Wire this page's back action into the app-wide Escape key (no per-plugin code).\n useBackHandler(effectiveOnBack)\n return (\n <nav className=\"flex items-center gap-1.5 text-sm text-muted-foreground\">\n <button\n type=\"button\"\n onClick={effectiveOnBack}\n className=\"inline-flex items-center gap-1 hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n {effectiveParent}\n </button>\n {current !== undefined && (\n <>\n <span>/</span>\n {current ? (\n <span className=\"text-foreground font-medium truncate max-w-[200px]\">{current}</span>\n ) : (\n <span className=\"inline-block h-4 w-24 rounded bg-muted animate-pulse align-middle\" />\n )}\n </>\n )}\n </nav>\n )\n}\n","import * as React from 'react'\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip'\n\nimport { cn } from '../utils/cn'\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'fayz-glass-surface z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-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))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import React, { useState, useEffect, useRef, useMemo } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Clock } from 'lucide-react'\n\n// ---------------------------------------------------------------------------\n// TimePicker — dropdown time slot selector, Google Calendar style\n// ---------------------------------------------------------------------------\n\nfunction formatTime12(h: number, m: number) {\n const period = h >= 12 ? 'pm' : 'am'\n const h12 = h % 12 || 12\n return `${h12}:${String(m).padStart(2, '0')}${period}`\n}\n\nfunction formatTime24(h: number, m: number) {\n return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`\n}\n\ninterface TimePickerProps {\n /** Value as HH:MM (24h) */\n value: string\n onChange: (value: string) => void\n /** Interval in minutes between slots (default: 15) */\n interval?: number\n /** Min time as HH:MM (default: '00:00') */\n min?: string\n /** Max time as HH:MM (default: '23:45') */\n max?: string\n /** Use 12h format for display (default: false) */\n use12h?: boolean\n /** Read-only mode */\n readOnly?: boolean\n className?: string\n /** Open the dropdown immediately on mount */\n defaultOpen?: boolean\n /** Called when the dropdown opens or closes */\n onOpenChange?: (open: boolean) => void\n}\n\nexport function TimePicker({ value, onChange, interval = 15, min = '00:00', max = '23:45', use12h = false, readOnly, className, defaultOpen, onOpenChange }: TimePickerProps) {\n const [open, setOpen] = useState(defaultOpen ?? false)\n const ref = useRef<HTMLDivElement>(null)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n const [pos, setPos] = useState<{ top: number; left: number; width: number }>({ top: 0, left: 0, width: 0 })\n\n // Position the portal dropdown\n useEffect(() => {\n if (!open || !triggerRef.current) return\n const rect = triggerRef.current.getBoundingClientRect()\n setPos({ top: rect.bottom + 4, left: rect.left, width: Math.max(rect.width, 120) })\n }, [open])\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n const target = e.target as Node\n if (ref.current?.contains(target)) return\n if (listRef.current?.contains(target)) return\n setOpen(false)\n onOpenChange?.(false)\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n // Scroll to selected time when opening\n useEffect(() => {\n if (!open || !listRef.current || !value) return\n const el = listRef.current.querySelector('[data-selected=\"true\"]')\n if (el) el.scrollIntoView({ block: 'center' })\n }, [open, value])\n\n const slots = useMemo(() => {\n const [minH, minM] = min.split(':').map(Number)\n const [maxH, maxM] = max.split(':').map(Number)\n const minTotal = minH * 60 + minM\n const maxTotal = maxH * 60 + maxM\n const result: { value: string; label: string }[] = []\n\n for (let t = minTotal; t <= maxTotal; t += interval) {\n const h = Math.floor(t / 60)\n const m = t % 60\n result.push({\n value: formatTime24(h, m),\n label: use12h ? formatTime12(h, m) : formatTime24(h, m),\n })\n }\n return result\n }, [interval, min, max, use12h])\n\n const displayValue = useMemo(() => {\n if (!value) return ''\n const [h, m] = value.split(':').map(Number)\n return use12h ? formatTime12(h, m) : formatTime24(h, m)\n }, [value, use12h])\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (readOnly) return\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault()\n const idx = slots.findIndex((s) => s.value === value)\n const next = e.key === 'ArrowDown'\n ? Math.min(idx + 1, slots.length - 1)\n : Math.max(idx - 1, 0)\n if (slots[next]) onChange(slots[next].value)\n } else if (e.key === 'Enter' || e.key === 'Escape') {\n setOpen(false)\n }\n }\n\n return (\n <div ref={ref} className={`relative ${className ?? ''}`}>\n {/* Trigger */}\n <button ref={triggerRef} type=\"button\"\n onClick={() => !readOnly && setOpen((p) => !p)}\n onKeyDown={handleKeyDown}\n disabled={readOnly}\n className={`flex items-center gap-2 rounded-lg border px-3 py-2 text-sm w-full text-left transition-colors ${\n readOnly ? 'bg-muted/40 text-muted-foreground cursor-default' : 'bg-background hover:bg-muted/30'\n }`}>\n <Clock className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n <span>{displayValue || '--:--'}</span>\n </button>\n\n {/* Dropdown — portal to escape overflow containers */}\n {open && !readOnly && createPortal(\n <div ref={listRef} data-modal-passthrough\n style={{ position: 'fixed', top: pos.top, left: pos.left, width: pos.width, zIndex: 9999, pointerEvents: 'auto' }}\n className=\"fayz-glass-surface min-w-[120px] max-h-48 overflow-y-auto rounded-xl border bg-popover shadow-xl py-1\">\n {slots.map((slot) => {\n const selected = slot.value === value\n return (\n <button key={slot.value} type=\"button\" data-selected={selected}\n onClick={() => { onChange(slot.value); setOpen(false) }}\n className={`block w-full px-3 py-1.5 text-sm text-left transition-colors ${\n selected ? 'bg-primary/10 text-primary font-medium' : 'hover:bg-muted/50'\n }`}>\n {slot.label}\n </button>\n )\n })}\n </div>,\n document.body,\n )}\n </div>\n )\n}\n","import { cn } from '../utils/cn'\n\nfunction Skeleton({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('animate-pulse rounded-md bg-muted', className)}\n {...props}\n />\n )\n}\n\n/**\n * Skeleton loader that mimics a table with rows and columns.\n * Drop-in replacement for \"Loading...\" text in list views.\n */\nfunction TableSkeleton({ columns = 4, rows = 2 }: { columns?: number; rows?: number }) {\n return (\n <div className=\"rounded-lg border overflow-hidden\">\n <div className=\"border-b bg-muted/30 flex gap-4 px-4 py-2.5\">\n {Array.from({ length: columns }).map((_, i) => (\n <Skeleton key={i} className=\"h-3 flex-1 rounded bg-muted-foreground/10\" />\n ))}\n </div>\n <div className=\"divide-y\">\n {Array.from({ length: rows }).map((_, r) => (\n <div key={r} className=\"flex items-center gap-4 px-4 py-3.5\">\n {Array.from({ length: columns }).map((_, c) => (\n <Skeleton\n key={c}\n className={cn(\n 'h-3 rounded',\n c === 0 ? 'flex-[2]' : 'flex-1',\n )}\n />\n ))}\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nexport { Skeleton, TableSkeleton }\n","import * as React from 'react'\nimport { useState, useCallback, useRef, useEffect } from 'react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Search, Plus, ChevronLeft, ChevronRight } from 'lucide-react'\nimport { DataTable } from './data-table'\nimport { Button } from './button'\nimport { cn } from '../utils/cn'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TagFilter {\n value: string\n label: string\n}\n\nexport interface ListViewProps<TData> {\n /** TanStack column definitions */\n columns: ColumnDef<TData, any>[]\n /** Data rows */\n data: TData[]\n /** Loading state — shows skeleton */\n loading?: boolean\n\n // ── Search ──\n /** Placeholder for search input (default: \"Search...\") */\n searchPlaceholder?: string\n /** Controlled search value */\n search?: string\n /** Called on search change (debounced internally if onSearchDebounced is used) */\n onSearchChange?: (value: string) => void\n /** Debounce delay in ms (default: 300). Set 0 for no debounce. */\n searchDebounce?: number\n\n // ── Tag filters ──\n /** Available filter tags (e.g. status values, types) */\n tags?: TagFilter[]\n /** \"All\" label (default: \"All\") */\n allTagLabel?: string\n /** Currently active tag value (undefined = all) */\n activeTag?: string\n /** Called when a tag is selected (undefined = all) */\n onTagChange?: (value: string | undefined) => void\n\n // ── CTA button ──\n /** Label for the \"New\" button (e.g. \"New Product\") */\n newLabel?: string\n /** Called when the \"New\" button is clicked */\n onNew?: () => void\n\n // ── Row interaction ──\n /** Called when a row is clicked */\n onRowClick?: (row: TData) => void\n\n // ── Empty state ──\n /** Icon component for the empty state */\n emptyIcon?: React.ComponentType<{ className?: string }>\n /** Empty state message */\n emptyMessage?: string\n /** Empty state action label (e.g. \"Create your first product\") */\n emptyActionLabel?: string\n /** Called when the empty action is clicked */\n onEmptyAction?: () => void\n\n // ── Pagination ──\n /** Total item count (enables pagination when > pageSize) */\n total?: number\n /** Current page (1-indexed) */\n page?: number\n /** Page size (default: 25) */\n pageSize?: number\n /** Called when page changes */\n onPageChange?: (page: number) => void\n\n // ── Extra ──\n /** Additional content rendered between filters and table */\n toolbar?: React.ReactNode\n /** CSS class for the outer wrapper */\n className?: string\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function ListView<TData>({\n columns,\n data,\n loading = false,\n searchPlaceholder = 'Search...',\n search: controlledSearch,\n onSearchChange,\n searchDebounce = 300,\n tags,\n allTagLabel = 'All',\n activeTag,\n onTagChange,\n newLabel,\n onNew,\n onRowClick,\n emptyIcon: EmptyIcon,\n emptyMessage = 'No results found.',\n emptyActionLabel,\n onEmptyAction,\n total,\n page = 1,\n pageSize = 25,\n onPageChange,\n toolbar,\n className,\n}: ListViewProps<TData>) {\n // Internal search state for debouncing\n const [internalSearch, setInternalSearch] = useState(controlledSearch ?? '')\n const debounceRef = useRef<ReturnType<typeof setTimeout>>()\n\n // Sync controlled → internal\n useEffect(() => {\n if (controlledSearch !== undefined) setInternalSearch(controlledSearch)\n }, [controlledSearch])\n\n const handleSearchChange = useCallback((value: string) => {\n setInternalSearch(value)\n if (searchDebounce === 0) {\n onSearchChange?.(value)\n } else {\n if (debounceRef.current) clearTimeout(debounceRef.current)\n debounceRef.current = setTimeout(() => onSearchChange?.(value), searchDebounce)\n }\n }, [onSearchChange, searchDebounce])\n\n // Pagination\n const totalItems = total ?? data.length\n const totalPages = Math.max(1, Math.ceil(totalItems / pageSize))\n const showPagination = onPageChange && totalItems > pageSize\n\n const showSearch = !!onSearchChange\n const showTags = tags && tags.length > 0 && onTagChange\n const showToolbar = showSearch || onNew || showTags\n\n return (\n <div className={cn('space-y-4', className)}>\n {/* ── Search + CTA row ── */}\n {showToolbar && (\n <div className=\"flex flex-col sm:flex-row gap-3 sm:items-center sm:justify-between\">\n {showSearch && (\n <div className=\"relative flex-1 max-w-sm\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground\" />\n <input\n type=\"text\"\n placeholder={searchPlaceholder}\n value={internalSearch}\n onChange={(e) => handleSearchChange(e.target.value)}\n className=\"w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] pl-8 pr-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n )}\n {onNew && newLabel && (\n <Button variant=\"default\" size=\"default\" onClick={onNew} className=\"shrink-0\">\n <Plus className=\"h-3.5 w-3.5\" />\n {newLabel}\n </Button>\n )}\n </div>\n )}\n\n {/* ── Tag filters ── */}\n {showTags && (\n <div className=\"flex gap-1.5 flex-wrap\">\n <button\n onClick={() => onTagChange!(undefined)}\n className={cn(\n 'rounded-full px-2.5 py-1 text-xs font-medium transition-colors',\n !activeTag\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted/50 text-muted-foreground hover:bg-muted'\n )}\n >\n {allTagLabel}\n </button>\n {tags!.map((tag) => (\n <button\n key={tag.value}\n onClick={() => onTagChange!(tag.value)}\n className={cn(\n 'rounded-full px-2.5 py-1 text-xs font-medium transition-colors',\n activeTag === tag.value\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted/50 text-muted-foreground hover:bg-muted'\n )}\n >\n {tag.label}\n </button>\n ))}\n </div>\n )}\n\n {/* ── Extra toolbar ── */}\n {toolbar}\n\n {/* ── Table / Empty / Loading ── */}\n {loading ? (\n <DataTable columns={columns} data={[]} loading variant=\"card\" />\n ) : data.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-center rounded-lg border-2 border-dashed border-muted\">\n {EmptyIcon && <EmptyIcon className=\"h-8 w-8 text-muted-foreground/30 mb-2\" />}\n <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>\n {emptyActionLabel && onEmptyAction && (\n <button onClick={onEmptyAction} className=\"text-xs text-primary hover:underline mt-1\">\n {emptyActionLabel}\n </button>\n )}\n </div>\n ) : (\n <DataTable\n columns={columns}\n data={data}\n onRowClick={onRowClick}\n variant=\"card\"\n />\n )}\n\n {/* ── Pagination ── */}\n {showPagination && (\n <div className=\"flex items-center justify-between px-1\">\n <p className=\"text-xs text-muted-foreground\">\n {((page - 1) * pageSize) + 1}–{Math.min(page * pageSize, totalItems)} of {totalItems}\n </p>\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => onPageChange!(page - 1)}\n disabled={page <= 1}\n className=\"flex h-7 w-7 items-center justify-center rounded-md border hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n <ChevronLeft className=\"h-3.5 w-3.5\" />\n </button>\n <span className=\"text-xs text-muted-foreground px-2\">\n {page} / {totalPages}\n </span>\n <button\n onClick={() => onPageChange!(page + 1)}\n disabled={page >= totalPages}\n className=\"flex h-7 w-7 items-center justify-center rounded-md border hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n <ChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n )}\n </div>\n )\n}\n","import React, { useState, useEffect, useRef, useMemo } from 'react'\nimport { createPortal } from 'react-dom'\nimport { ChevronLeft, ChevronRight, Calendar } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getCurrentLocale } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// DatePicker — custom dropdown calendar, Google Calendar style\n// ---------------------------------------------------------------------------\n\nconst DAY_LABELS: Record<string, string[]> = {\n en: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n 'pt-BR': ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n}\n\nfunction toDateLocale(locale: string): string {\n if (locale === 'pt-BR') return 'pt-BR'\n return 'en-US'\n}\n\nfunction isSameDay(a: Date, b: Date) {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate()\n}\n\nfunction isToday(d: Date) { return isSameDay(d, new Date()) }\n\nfunction formatDate(date: Date, locale: string) {\n return date.toLocaleDateString(toDateLocale(locale), { month: 'short', day: 'numeric', year: 'numeric' })\n}\n\nfunction toDateStr(d: Date) {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`\n}\n\nfunction parseDate(s: string): Date {\n const [y, m, d] = s.split('-').map(Number)\n return new Date(y, m - 1, d)\n}\n\ninterface DatePickerProps {\n /** Value as YYYY-MM-DD string */\n value: string\n onChange: (value: string) => void\n className?: string\n /** Open the dropdown immediately on mount */\n defaultOpen?: boolean\n /** Called when the dropdown opens or closes */\n onOpenChange?: (open: boolean) => void\n}\n\nexport function DatePicker({ value, onChange, className, defaultOpen, onOpenChange }: DatePickerProps) {\n const t = useTranslation()\n const locale = getCurrentLocale()\n const [open, setOpen] = useState(defaultOpen ?? false)\n const ref = useRef<HTMLDivElement>(null)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const selectedDate = value ? parseDate(value) : new Date()\n const [viewMonth, setViewMonth] = useState(new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1))\n const [pos, setPos] = useState<{ top: number; left: number }>({ top: 0, left: 0 })\n\n const dayLabels = DAY_LABELS[locale] ?? DAY_LABELS.en\n const dateLocale = toDateLocale(locale)\n\n // Position the portal dropdown relative to the trigger\n useEffect(() => {\n if (!open || !triggerRef.current) return\n const rect = triggerRef.current.getBoundingClientRect()\n const dropW = 260\n let left = rect.left\n if (left + dropW > window.innerWidth - 12) left = window.innerWidth - dropW - 12\n if (left < 8) left = 8\n setPos({ top: rect.bottom + 4, left })\n }, [open])\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n const target = e.target as Node\n if (ref.current?.contains(target)) return\n if (dropdownRef.current?.contains(target)) return\n setOpen(false)\n onOpenChange?.(false)\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open, onOpenChange])\n\n // Sync view month when value changes externally\n useEffect(() => {\n if (value) {\n const d = parseDate(value)\n setViewMonth(new Date(d.getFullYear(), d.getMonth(), 1))\n }\n }, [value])\n\n const monthLabel = viewMonth.toLocaleDateString(dateLocale, { month: 'long', year: 'numeric' })\n\n const weeks = useMemo(() => {\n const year = viewMonth.getFullYear()\n const month = viewMonth.getMonth()\n const firstDay = new Date(year, month, 1)\n const startOffset = firstDay.getDay()\n const daysInMonth = new Date(year, month + 1, 0).getDate()\n const prevMonthDays = new Date(year, month, 0).getDate()\n\n const cells: { date: Date; inMonth: boolean }[] = []\n for (let i = startOffset - 1; i >= 0; i--) {\n cells.push({ date: new Date(year, month - 1, prevMonthDays - i), inMonth: false })\n }\n for (let d = 1; d <= daysInMonth; d++) {\n cells.push({ date: new Date(year, month, d), inMonth: true })\n }\n while (cells.length % 7 !== 0) {\n cells.push({ date: new Date(year, month + 1, cells.length - startOffset - daysInMonth + 1), inMonth: false })\n }\n\n const rows: typeof cells[] = []\n for (let i = 0; i < cells.length; i += 7) rows.push(cells.slice(i, i + 7))\n return rows\n }, [viewMonth])\n\n function handleSelect(date: Date) {\n onChange(toDateStr(date))\n setOpen(false)\n }\n\n return (\n <div ref={ref} className={`relative ${className ?? ''}`}>\n {/* Trigger */}\n <button ref={triggerRef} type=\"button\" onClick={() => setOpen((p) => !p)}\n className=\"flex items-center gap-2 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm hover:bg-muted/30 transition-colors w-full text-left\">\n <Calendar className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n <span>{value ? formatDate(selectedDate, locale) : t('common.selectDate')}</span>\n </button>\n\n {/* Dropdown — portal to escape overflow containers */}\n {open && createPortal(\n <div ref={dropdownRef} data-modal-passthrough\n style={{ position: 'fixed', top: pos.top, left: pos.left, zIndex: 9999, pointerEvents: 'auto' }}\n className=\"fayz-glass-surface rounded-xl border bg-popover shadow-xl p-3 w-[260px]\">\n {/* Month nav */}\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium capitalize\">{monthLabel}</span>\n <div className=\"flex items-center gap-0.5\">\n <button type=\"button\" onClick={() => setViewMonth(new Date(viewMonth.getFullYear(), viewMonth.getMonth() - 1, 1))}\n className=\"flex h-7 w-7 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <button type=\"button\" onClick={() => setViewMonth(new Date(viewMonth.getFullYear(), viewMonth.getMonth() + 1, 1))}\n className=\"flex h-7 w-7 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n\n {/* Day labels */}\n <div className=\"grid grid-cols-7 mb-1\">\n {dayLabels.map((l, i) => (\n <div key={i} className=\"flex h-8 items-center justify-center text-[11px] font-medium text-muted-foreground\">{l}</div>\n ))}\n </div>\n\n {/* Dates */}\n {weeks.map((week, wi) => (\n <div key={wi} className=\"grid grid-cols-7\">\n {week.map(({ date, inMonth }, di) => {\n const sel = value && isSameDay(date, selectedDate)\n const today = isToday(date)\n return (\n <button key={di} type=\"button\"\n onClick={() => handleSelect(date)}\n className={`flex h-8 w-8 items-center justify-center rounded-full text-xs mx-auto transition-colors ${\n sel\n ? 'bg-primary text-primary-foreground font-semibold'\n : today\n ? 'bg-primary/10 text-primary font-semibold'\n : inMonth\n ? 'hover:bg-muted text-foreground'\n : 'text-muted-foreground/40 hover:bg-muted/50'\n }`}>\n {date.getDate()}\n </button>\n )\n })}\n </div>\n ))}\n\n {/* Today shortcut */}\n <div className=\"mt-2 pt-2 border-t\">\n <button type=\"button\" onClick={() => { handleSelect(new Date()) }}\n className=\"text-xs text-primary font-medium hover:underline\">{t('agenda.calendar.today')}</button>\n </div>\n </div>,\n document.body,\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { Search, X, ChevronDown, Loader2 } from 'lucide-react'\nimport { cn } from '../utils/cn'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SearchSelectOption {\n id: string\n label: string\n subtitle?: string\n icon?: React.ReactNode\n group?: string\n disabled?: boolean\n data?: any\n}\n\nexport interface SearchSelectProps {\n /** Currently selected option ID */\n value?: string\n /** Display text when a value is selected (overrides auto-lookup) */\n displayValue?: string\n /** Callback when an option is selected */\n onChange: (id: string, option: SearchSelectOption | null) => void\n /** Search function — async or sync. Called with debounced query. */\n onSearch: (query: string) => Promise<SearchSelectOption[]> | SearchSelectOption[]\n /** Placeholder text */\n placeholder?: string\n /** Label above the input */\n label?: string\n /** Required field indicator */\n required?: boolean\n /** Debounce delay in ms (default: 250) */\n debounce?: number\n /** Minimum characters before searching (default: 1) */\n minChars?: number\n /** Show a \"Create new\" action at the bottom */\n allowCreate?: boolean\n /** Label for create action (default: \"Add\") */\n createLabel?: string\n /** Callback when create is clicked. Can be async — component shows optimistic state while waiting. */\n onCreate?: (query: string) => void | Promise<void>\n /** Custom render for each option */\n renderOption?: (option: SearchSelectOption) => React.ReactNode\n /** Load initial results when dropdown opens (calls onSearch('')) */\n loadOnOpen?: boolean\n /** Additional className for the container */\n className?: string\n /** Disabled state */\n disabled?: boolean\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function SearchSelect({\n value,\n displayValue,\n onChange,\n onSearch,\n placeholder = 'Search...',\n label,\n required,\n debounce = 250,\n minChars = 1,\n allowCreate,\n createLabel = 'Add',\n onCreate,\n renderOption,\n loadOnOpen,\n className,\n disabled,\n}: SearchSelectProps) {\n const [open, setOpen] = React.useState(false)\n const [query, setQuery] = React.useState('')\n const [results, setResults] = React.useState<SearchSelectOption[]>([])\n const [loading, setLoading] = React.useState(false)\n const [creating, setCreating] = React.useState(false)\n const [selectedLabel, setSelectedLabel] = React.useState(displayValue ?? '')\n const containerRef = React.useRef<HTMLDivElement>(null)\n const inputRef = React.useRef<HTMLInputElement>(null)\n const timerRef = React.useRef<ReturnType<typeof setTimeout>>()\n\n // Close on outside click\n React.useEffect(() => {\n function handler(e: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false)\n }\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [])\n\n // Update display when value/displayValue changes externally\n React.useEffect(() => {\n if (displayValue !== undefined) setSelectedLabel(displayValue)\n }, [displayValue])\n\n // Load initial results when dropdown opens with empty query\n React.useEffect(() => {\n if (open && loadOnOpen && query.length === 0 && results.length === 0 && !loading) {\n setLoading(true)\n Promise.resolve(onSearch('')).then(setResults).catch(() => setResults([])).finally(() => setLoading(false))\n }\n }, [open, loadOnOpen])\n\n function handleQueryChange(q: string) {\n setQuery(q)\n if (timerRef.current) clearTimeout(timerRef.current)\n\n if (q.length < minChars && !(loadOnOpen && q.length === 0)) {\n setResults([])\n setLoading(false)\n return\n }\n\n setLoading(true)\n timerRef.current = setTimeout(async () => {\n try {\n const res = await onSearch(q)\n setResults(res)\n } catch {\n setResults([])\n }\n setLoading(false)\n }, debounce)\n }\n\n function handleSelect(option: SearchSelectOption) {\n onChange(option.id, option)\n setSelectedLabel(option.label)\n setOpen(false)\n setQuery('')\n setResults([])\n }\n\n function handleClear() {\n onChange('', null)\n setSelectedLabel('')\n setQuery('')\n setResults([])\n }\n\n async function handleCreate(name: string) {\n if (!onCreate) return\n setCreating(true)\n setSelectedLabel(name)\n setOpen(false)\n setQuery('')\n setResults([])\n try {\n await onCreate(name)\n } finally {\n setCreating(false)\n }\n }\n\n function handleOpen() {\n if (disabled || creating) return\n setOpen(true)\n setQuery('')\n setTimeout(() => inputRef.current?.focus(), 0)\n }\n\n // Group results\n const groups = React.useMemo(() => {\n const map = new Map<string, SearchSelectOption[]>()\n for (const opt of results) {\n const group = opt.group ?? ''\n if (!map.has(group)) map.set(group, [])\n map.get(group)!.push(opt)\n }\n return map\n }, [results])\n\n const hasValue = !!value && !!selectedLabel\n const showDropdown = open && query.length >= minChars\n\n return (\n <div ref={containerRef} className={cn('relative', className)}>\n {label && (\n <label className=\"text-xs font-medium text-muted-foreground\">\n {label}{required && ' *'}\n </label>\n )}\n\n {/* Trigger — shows selected value or search input */}\n <div\n className={cn(\n 'mt-1 flex items-center gap-2 rounded-lg border bg-background transition-colors',\n open ? 'ring-2 ring-primary/20' : 'hover:bg-muted/30',\n disabled && 'opacity-50 cursor-not-allowed',\n )}\n >\n <Search className=\"h-3.5 w-3.5 text-muted-foreground ml-3 shrink-0\" />\n {open ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => handleQueryChange(e.target.value)}\n placeholder={placeholder}\n className=\"flex-1 bg-transparent py-2 pr-3 text-sm outline-none\"\n onKeyDown={(e) => {\n if (e.key === 'Escape') setOpen(false)\n }}\n />\n ) : (\n <button\n type=\"button\"\n onClick={handleOpen}\n className=\"flex-1 text-left py-2 pr-3 text-sm outline-none\"\n disabled={disabled || creating}\n >\n {creating ? (\n <span className=\"flex items-center gap-1.5 text-muted-foreground\">\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n <span className=\"font-medium text-foreground\">{selectedLabel}</span>\n </span>\n ) : hasValue ? (\n <span className=\"font-medium\">{selectedLabel}</span>\n ) : (\n <span className=\"text-muted-foreground\">{placeholder}</span>\n )}\n </button>\n )}\n {hasValue && !open && (\n <button onClick={handleClear} className=\"pr-3 text-muted-foreground hover:text-foreground\">\n <X className=\"h-3 w-3\" />\n </button>\n )}\n {!hasValue && !open && (\n <ChevronDown className=\"h-3 w-3 text-muted-foreground mr-3 shrink-0\" />\n )}\n </div>\n\n {/* Dropdown */}\n {showDropdown && (\n <div className=\"fayz-glass-surface absolute top-full left-0 right-0 z-50 mt-1 rounded-lg border bg-popover shadow-lg overflow-hidden\">\n {loading ? (\n <div className=\"flex items-center justify-center gap-2 px-4 py-6 text-xs text-muted-foreground\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" /> Searching...\n </div>\n ) : results.length === 0 ? (\n <div className=\"px-4 py-4 text-center\">\n <p className=\"text-xs text-muted-foreground\">No results for \"{query}\"</p>\n {allowCreate && onCreate && (\n <button\n onClick={() => handleCreate(query)}\n className=\"mt-2 text-xs text-primary hover:underline\"\n >\n + {createLabel} \"{query}\"\n </button>\n )}\n </div>\n ) : (\n <div className=\"max-h-64 overflow-auto py-1\">\n {[...groups.entries()].map(([group, options]) => (\n <React.Fragment key={group}>\n {group && (\n <div className=\"sticky top-0 bg-muted/50 px-3 py-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n {group}\n </div>\n )}\n {options.map((opt) => (\n <button\n key={opt.id}\n onClick={() => handleSelect(opt)}\n disabled={opt.disabled}\n className={cn(\n 'w-full text-left px-3 py-2 hover:bg-muted/50 transition-colors flex items-center gap-2.5',\n opt.disabled && 'opacity-40 cursor-not-allowed',\n opt.id === value && 'bg-muted/30',\n )}\n >\n {renderOption ? renderOption(opt) : (\n <>\n {opt.icon}\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm truncate\">{opt.label}</p>\n {opt.subtitle && <p className=\"text-[10px] text-muted-foreground truncate\">{opt.subtitle}</p>}\n </div>\n </>\n )}\n </button>\n ))}\n </React.Fragment>\n ))}\n {allowCreate && onCreate && (\n <button\n onClick={() => handleCreate(query)}\n className=\"w-full text-left px-3 py-2 text-xs text-primary hover:bg-muted/50 transition-colors border-t\"\n >\n + {createLabel} \"{query}\"\n </button>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../utils/cn'\n\ninterface CurrencyInputProps {\n value: number\n onChange: (value: number) => void\n symbol?: string\n locale?: string\n currencyCode?: string\n label?: string\n placeholder?: string\n className?: string\n disabled?: boolean\n}\n\n/**\n * Currency input with automatic decimal formatting.\n *\n * - Always displays the value with 2 decimal places using the project's locale\n * - Input works like an ATM: digits push from right, decimals are fixed\n * - Typing \"12345\" shows \"123,45\" (or \"123.45\" depending on locale)\n * - Backspace removes the last digit\n * - Supports the project currency symbol\n */\nexport function CurrencyInput({\n value,\n onChange,\n symbol = 'R$',\n locale = 'pt-BR',\n currencyCode = 'BRL',\n label,\n placeholder,\n className,\n disabled,\n}: CurrencyInputProps) {\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [focused, setFocused] = React.useState(false)\n\n // Format number to locale string with 2 decimals\n const format = React.useCallback((v: number) => {\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(v)\n }, [locale])\n\n const displayValue = format(value)\n\n // Handle key-by-key input — ATM-style (digits push from right)\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n if (disabled) return\n\n // Allow tab, arrow keys, etc.\n if (['Tab', 'Escape', 'ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(e.key)) return\n\n e.preventDefault()\n\n if (e.key === 'Backspace' || e.key === 'Delete') {\n // Remove last digit: 123.45 → 12.34\n const cents = Math.floor(Math.round(value * 100) / 10)\n onChange(cents / 100)\n return\n }\n\n // Only accept digits\n if (!/^\\d$/.test(e.key)) return\n\n // Append digit: 12.34 + '5' → 123.45\n const currentCents = Math.round(value * 100)\n const newCents = currentCents * 10 + parseInt(e.key, 10)\n // Cap at 999,999,999.99\n if (newCents > 99999999999) return\n onChange(newCents / 100)\n }\n\n // Handle paste — parse number from pasted text\n function handlePaste(e: React.ClipboardEvent) {\n e.preventDefault()\n const text = e.clipboardData.getData('text')\n // Remove everything except digits, dots, commas\n const cleaned = text.replace(/[^\\d.,]/g, '')\n // Replace comma with dot for parsing\n const normalized = cleaned.replace(',', '.')\n const parsed = parseFloat(normalized)\n if (!isNaN(parsed)) {\n onChange(Math.round(parsed * 100) / 100)\n }\n }\n\n return (\n <div className={className}>\n {label && <label className=\"text-xs font-medium text-muted-foreground\">{label}</label>}\n <div\n className={cn(\n 'flex items-center rounded-lg border border-input bg-background ring-offset-background transition-colors cursor-text',\n label && 'mt-1',\n focused && 'border-ring ring-2 ring-ring ring-offset-2',\n disabled && 'opacity-50 cursor-not-allowed',\n )}\n onClick={() => inputRef.current?.focus()}\n >\n <span className=\"pl-3 pr-1 text-sm font-medium text-muted-foreground select-none\">{symbol}</span>\n <input\n ref={inputRef}\n type=\"text\"\n inputMode=\"numeric\"\n value={displayValue}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n placeholder={placeholder ?? format(0)}\n disabled={disabled}\n readOnly={false}\n className=\"flex-1 bg-transparent px-2 py-2 text-sm outline-none text-right tabular-nums caret-primary selection:bg-primary/20\"\n onChange={() => {}}\n />\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { AlertTriangle, Info, CheckCircle2, XCircle } from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { Button } from './button'\n\ntype ConfirmVariant = 'default' | 'destructive' | 'warning' | 'success'\n\ninterface ConfirmDialogProps {\n open: boolean\n onConfirm: () => void\n onCancel: () => void\n title: string\n description?: string\n confirmLabel?: string\n cancelLabel?: string\n variant?: ConfirmVariant\n loading?: boolean\n}\n\nconst VARIANT_CONFIG: Record<\n ConfirmVariant,\n {\n icon: React.ElementType\n iconBg: string\n iconColor: string\n buttonVariant: 'default' | 'destructive'\n }\n> = {\n default: {\n icon: Info,\n iconBg: 'bg-info/10',\n iconColor: 'text-info',\n buttonVariant: 'default',\n },\n destructive: {\n icon: XCircle,\n iconBg: 'bg-destructive/10',\n iconColor: 'text-destructive',\n buttonVariant: 'destructive',\n },\n warning: {\n icon: AlertTriangle,\n iconBg: 'bg-warning/10',\n iconColor: 'text-warning',\n buttonVariant: 'destructive',\n },\n success: {\n icon: CheckCircle2,\n iconBg: 'bg-success/10',\n iconColor: 'text-success',\n buttonVariant: 'default',\n },\n}\n\nexport function ConfirmDialog({\n open,\n onConfirm,\n onCancel,\n title,\n description,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n variant = 'default',\n loading = false,\n}: ConfirmDialogProps) {\n const config = VARIANT_CONFIG[variant]\n const Icon = config.icon\n\n React.useEffect(() => {\n if (!open) return\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') onCancel()\n }\n document.addEventListener('keydown', handleKey)\n return () => document.removeEventListener('keydown', handleKey)\n }, [open, onCancel])\n\n if (!open) return null\n\n return createPortal(\n <div className=\"fixed inset-0 z-[60] flex items-center justify-center\">\n <div\n className=\"absolute inset-0 bg-black/50 backdrop-blur-[2px] animate-fade-in\"\n onClick={onCancel}\n />\n\n <div\n className=\"relative z-10 w-full max-w-sm mx-4 rounded-modal border border-border bg-card shadow-lg animate-zoom-in\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"confirm-title\"\n aria-describedby={description ? 'confirm-desc' : undefined}\n >\n <div className=\"p-6\">\n <div className=\"flex gap-4\">\n <div className={cn('flex h-10 w-10 items-center justify-center rounded-full shrink-0', config.iconBg)}>\n <Icon className={cn('h-5 w-5', config.iconColor)} />\n </div>\n <div className=\"min-w-0 pt-0.5\">\n <h3 id=\"confirm-title\" className=\"text-sm font-semibold text-foreground\">\n {title}\n </h3>\n {description && (\n <p id=\"confirm-desc\" className=\"text-xs text-muted-foreground mt-1 leading-relaxed\">\n {description}\n </p>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 mt-5\">\n <Button variant=\"outline\" size=\"sm\" onClick={onCancel} disabled={loading}>\n {cancelLabel}\n </Button>\n <Button variant={config.buttonVariant} size=\"sm\" onClick={onConfirm} disabled={loading}>\n {loading ? 'Processing...' : confirmLabel}\n </Button>\n </div>\n </div>\n </div>\n </div>,\n document.body,\n )\n}\n","import * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { cn } from '../utils/cn'\n\nconst Popover = PopoverPrimitive.Root\nconst PopoverTrigger = PopoverPrimitive.Trigger\nconst PopoverAnchor = PopoverPrimitive.Anchor\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = 'start', sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'fayz-glass-surface z-[110] w-72 rounded-xl border bg-popover p-0 text-popover-foreground shadow-lg outline-none',\n 'data-[state=open]:animate-zoom-in data-[state=closed]:animate-zoom-out',\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n))\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverAnchor, PopoverContent }\n"]}
|