@fayz-ai/ui 0.10.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/analytics/AnalyticsCard.d.ts.map +1 -1
  2. package/dist/analytics/AnalyticsControls.d.ts.map +1 -1
  3. package/dist/analytics/batch.d.ts +19 -0
  4. package/dist/analytics/batch.d.ts.map +1 -0
  5. package/dist/analytics/context.d.ts.map +1 -1
  6. package/dist/analytics/index.d.ts +2 -0
  7. package/dist/analytics/index.d.ts.map +1 -1
  8. package/dist/{chunk-I6CPKAOD.js → chunk-7BMXN7MP.js} +215 -99
  9. package/dist/chunk-7BMXN7MP.js.map +1 -0
  10. package/dist/{chunk-6V5MGYXH.js → chunk-JGJNRNQW.js} +142 -31
  11. package/dist/chunk-JGJNRNQW.js.map +1 -0
  12. package/dist/{chunk-H63TOSQ7.js → chunk-QSHA2Q27.js} +475 -134
  13. package/dist/chunk-QSHA2Q27.js.map +1 -0
  14. package/dist/{chunk-SEIY2F5F.js → chunk-XRDCYOND.js} +231 -41
  15. package/dist/chunk-XRDCYOND.js.map +1 -0
  16. package/dist/chunk-ZBQ772DU.js +17 -0
  17. package/dist/chunk-ZBQ772DU.js.map +1 -0
  18. package/dist/dashboard/ChartWidget.d.ts.map +1 -1
  19. package/dist/dashboard/KpiCard.d.ts.map +1 -1
  20. package/dist/dashboard/SidebarOnboarding.d.ts +16 -11
  21. package/dist/dashboard/SidebarOnboarding.d.ts.map +1 -1
  22. package/dist/dashboard/Sparkline.d.ts +13 -0
  23. package/dist/dashboard/Sparkline.d.ts.map +1 -0
  24. package/dist/dashboard/index.d.ts +1 -0
  25. package/dist/dashboard/index.d.ts.map +1 -1
  26. package/dist/dashboard/index.js +3 -2
  27. package/dist/index.d.ts +2 -2
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +234 -115
  30. package/dist/index.js.map +1 -1
  31. package/dist/layout/AppShell.d.ts +4 -1
  32. package/dist/layout/AppShell.d.ts.map +1 -1
  33. package/dist/layout/AppShellSkeleton.d.ts +23 -0
  34. package/dist/layout/AppShellSkeleton.d.ts.map +1 -0
  35. package/dist/layout/ModulePage.d.ts +5 -1
  36. package/dist/layout/ModulePage.d.ts.map +1 -1
  37. package/dist/layout/Sidebar.d.ts +19 -1
  38. package/dist/layout/Sidebar.d.ts.map +1 -1
  39. package/dist/layout/Topbar.d.ts +4 -1
  40. package/dist/layout/Topbar.d.ts.map +1 -1
  41. package/dist/layout/index.d.ts +2 -0
  42. package/dist/layout/index.d.ts.map +1 -1
  43. package/dist/layout/index.js +2 -1
  44. package/dist/layout/page-trail.d.ts +23 -0
  45. package/dist/layout/page-trail.d.ts.map +1 -0
  46. package/dist/layout/rail-flyout.d.ts +39 -0
  47. package/dist/layout/rail-flyout.d.ts.map +1 -0
  48. package/dist/primitives/bulk-action-bar.d.ts +30 -0
  49. package/dist/primitives/bulk-action-bar.d.ts.map +1 -0
  50. package/dist/primitives/checkbox.d.ts +5 -0
  51. package/dist/primitives/checkbox.d.ts.map +1 -1
  52. package/dist/primitives/data-table.d.ts +11 -1
  53. package/dist/primitives/data-table.d.ts.map +1 -1
  54. package/dist/primitives/dropdown.d.ts.map +1 -1
  55. package/dist/primitives/index.d.ts +4 -0
  56. package/dist/primitives/index.d.ts.map +1 -1
  57. package/dist/primitives/index.js +2 -2
  58. package/dist/primitives/list-chrome.d.ts +20 -0
  59. package/dist/primitives/list-chrome.d.ts.map +1 -0
  60. package/dist/primitives/modal.d.ts.map +1 -1
  61. package/dist/primitives/phone-field.d.ts +19 -0
  62. package/dist/primitives/phone-field.d.ts.map +1 -0
  63. package/dist/primitives/search-select.d.ts +6 -1
  64. package/dist/primitives/search-select.d.ts.map +1 -1
  65. package/dist/primitives/thumbnail.d.ts +19 -0
  66. package/dist/primitives/thumbnail.d.ts.map +1 -0
  67. package/dist/styles.css +111 -1
  68. package/dist/tailwind.cjs +7 -2
  69. package/dist/tailwind.cjs.map +1 -1
  70. package/dist/tailwind.d.ts.map +1 -1
  71. package/dist/tailwind.js +7 -2
  72. package/dist/tailwind.js.map +1 -1
  73. package/package.json +2 -2
  74. package/dist/chunk-6V5MGYXH.js.map +0 -1
  75. package/dist/chunk-H63TOSQ7.js.map +0 -1
  76. package/dist/chunk-I6CPKAOD.js.map +0 -1
  77. package/dist/chunk-SEIY2F5F.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/dashboard/DashboardGrid.tsx","../src/dashboard/layout.ts","../src/dashboard/preferences.ts","../src/dashboard/DashboardRange.tsx","../src/dashboard/DashboardCustomizeMenu.tsx","../src/dashboard/DashboardCanvas.tsx","../src/dashboard/GoldCard.tsx","../src/dashboard/icon.ts","../src/dashboard/Sparkline.tsx","../src/dashboard/KpiCard.tsx","../src/dashboard/ChartWidget.tsx","../src/dashboard/TableWidget.tsx","../src/dashboard/useOnboardingProgress.ts","../src/dashboard/OnboardingWidget.tsx","../src/dashboard/SidebarOnboarding.tsx","../src/dashboard/define.ts"],"names":["React2","jsx","jsxs","Component","React3","React4","React5","React6","React7","Fragment","React8","React9","React10","Check","Circle"],"mappings":"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","file":"chunk-7BMXN7MP.js","sourcesContent":["import * as React from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface DashboardGridItem {\n id: string\n /** Column span on the 4-col grid (defaults to 1). */\n span?: number\n node: React.ReactNode\n}\n\n/** Literal span → Tailwind classes (kept literal so the JIT compiler picks them up). */\nconst SPAN_CLASS: Record<number, string> = {\n 1: '',\n 2: 'sm:col-span-2',\n 3: 'sm:col-span-2 lg:col-span-3',\n 4: 'sm:col-span-2 lg:col-span-4',\n}\n\nexport interface DashboardGridProps {\n items: DashboardGridItem[]\n className?: string\n}\n\n/** Responsive 4-col dashboard grid — the layout every dashboard shares. */\nexport function DashboardGrid({ items, className }: DashboardGridProps) {\n return (\n <div className={cn('grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4', className)}>\n {items.map((item) => (\n <div key={item.id} className={SPAN_CLASS[Math.min(Math.max(item.span ?? 1, 1), 4)] ?? ''}>\n {item.node}\n </div>\n ))}\n </div>\n )\n}\n","import type { DashboardLayoutConfig, DashboardWidgetDef } from '@fayz-ai/core'\n\nexport interface LaidOutWidget {\n def: DashboardWidgetDef\n /** Effective span after applying overrides (1–4). */\n span: number\n order: number\n}\n\n/**\n * Resolve the widgets to render on a surface, in order, applying three layers:\n * 1. registration defaults (defaultVisible / defaultOrder / span)\n * 2. app config (the app curates the home surface)\n * 3. user preferences (show/hide/reorder — read but currently empty)\n *\n * Later layers win. Returns only visible widgets, sorted by effective order.\n * Accepts any DashboardWidgetDef (registry-resolved or shim-built).\n */\nexport function resolveDashboardLayout(\n registered: DashboardWidgetDef[],\n appConfig?: DashboardLayoutConfig,\n userPrefs?: DashboardLayoutConfig,\n /** When true, widgets are visible by default regardless of their\n * `defaultVisible` (used on a plugin-home to show everything; the global\n * home leaves this false so `defaultVisible:false` curates the start set). */\n forceVisibleByDefault = false,\n): LaidOutWidget[] {\n type Override = { visible?: boolean; order?: number; span?: number }\n const overrides = new Map<string, Override>()\n const merge = (cfg?: DashboardLayoutConfig) => {\n for (const w of cfg?.widgets ?? []) {\n overrides.set(w.id, { ...overrides.get(w.id), ...w })\n }\n }\n merge(appConfig)\n merge(userPrefs)\n\n return registered\n .map((def, index) => {\n const o = overrides.get(def.id)\n const baseVisible = forceVisibleByDefault ? true : (def.defaultVisible ?? true)\n const visible = o?.visible ?? baseVisible\n const order = o?.order ?? def.defaultOrder ?? index\n const span = Math.min(Math.max(o?.span ?? def.span ?? 1, 1), 4)\n return { def, visible, order, span }\n })\n .filter((x) => x.visible)\n .sort((a, b) => a.order - b.order)\n .map(({ def, span, order }) => ({ def, span, order }))\n}\n","import * as React from 'react'\nimport type { DashboardLayoutConfig, DashboardSurface } from '@fayz-ai/core'\n\nexport interface DashboardPreferencesState {\n /** User-level layout overrides for this surface (null when none saved). */\n prefs: DashboardLayoutConfig | null\n /** Persist updated overrides. */\n save: (next: DashboardLayoutConfig) => void\n /** Toggle a single widget's visibility and persist. */\n setVisible: (widgetId: string, visible: boolean) => void\n /** Clear all overrides (reset to registration + app defaults). */\n reset: () => void\n}\n\nconst KEY = (surface: DashboardSurface, scope: string) => `fayz.dashboard.prefs.${scope}.${surface}`\n\nfunction read(key: string): DashboardLayoutConfig | null {\n if (typeof window === 'undefined') return null\n try {\n const raw = window.localStorage.getItem(key)\n return raw ? (JSON.parse(raw) as DashboardLayoutConfig) : null\n } catch {\n return null\n }\n}\n\n/**\n * Per-user dashboard preferences, persisted to localStorage.\n *\n * `scope` lets a plugin-home keep its own prefs separate from the global home\n * (pass the domain). A future pass can swap the storage for the tenant/plugin\n * binding store without touching callers — `resolveDashboardLayout` already\n * consumes whatever this returns as the `userPrefs` layer.\n */\nexport function useDashboardPreferences(surface: DashboardSurface, scope = 'home'): DashboardPreferencesState {\n const key = KEY(surface, scope)\n const [prefs, setPrefs] = React.useState<DashboardLayoutConfig | null>(() => read(key))\n\n // Re-read when the target surface/scope changes.\n React.useEffect(() => { setPrefs(read(key)) }, [key])\n\n const save = React.useCallback((next: DashboardLayoutConfig) => {\n setPrefs(next)\n if (typeof window !== 'undefined') {\n try { window.localStorage.setItem(key, JSON.stringify(next)) } catch { /* ignore quota/availability */ }\n }\n }, [key])\n\n const setVisible = React.useCallback((widgetId: string, visible: boolean) => {\n setPrefs((cur) => {\n const widgets = [...(cur?.widgets ?? [])]\n const i = widgets.findIndex((w) => w.id === widgetId)\n if (i >= 0) widgets[i] = { ...widgets[i]!, visible }\n else widgets.push({ id: widgetId, visible })\n const next = { ...cur, widgets }\n if (typeof window !== 'undefined') {\n try { window.localStorage.setItem(key, JSON.stringify(next)) } catch { /* ignore */ }\n }\n return next\n })\n }, [key])\n\n const reset = React.useCallback(() => {\n setPrefs(null)\n if (typeof window !== 'undefined') {\n try { window.localStorage.removeItem(key) } catch { /* ignore */ }\n }\n }, [key])\n\n return { prefs, save, setVisible, reset }\n}\n","import * as React from 'react'\nimport { SegmentedControl } from '../primitives/segmented-control'\n\n// ---------------------------------------------------------------------------\n// Shared dashboard time range. The canvas provides it; widgets read it via\n// useDashboardRange() and refetch/filter their data accordingly.\n// ---------------------------------------------------------------------------\n\nexport type DashboardRange = string\n\nexport const DEFAULT_RANGE_OPTIONS: DashboardRange[] = ['7d', '30d', '90d']\n\ninterface DashboardRangeContextValue {\n range: DashboardRange\n setRange: (range: DashboardRange) => void\n options: DashboardRange[]\n}\n\nconst DashboardRangeContext = React.createContext<DashboardRangeContextValue | null>(null)\n\n/**\n * Read the shared dashboard range. Returns null when no range control is\n * mounted, so widgets can stay range-agnostic.\n */\nexport function useDashboardRange(): DashboardRangeContextValue | null {\n return React.useContext(DashboardRangeContext)\n}\n\nexport interface DashboardRangeProviderProps {\n options?: DashboardRange[]\n defaultRange?: DashboardRange\n onChange?: (range: DashboardRange) => void\n children: React.ReactNode\n}\n\nexport function DashboardRangeProvider({\n options = DEFAULT_RANGE_OPTIONS, defaultRange, onChange, children,\n}: DashboardRangeProviderProps) {\n const [range, setRangeState] = React.useState<DashboardRange>(defaultRange ?? options[1] ?? options[0] ?? '30d')\n const setRange = React.useCallback((r: DashboardRange) => {\n setRangeState(r)\n onChange?.(r)\n }, [onChange])\n const value = React.useMemo(() => ({ range, setRange, options }), [range, setRange, options])\n return <DashboardRangeContext.Provider value={value}>{children}</DashboardRangeContext.Provider>\n}\n\n/** Segmented 7d / 30d / 90d control bound to the shared dashboard range.\n * Thin wrapper over the canonical SegmentedControl primitive. */\nexport function DashboardRangeControl({ className }: { className?: string }) {\n const ctx = useDashboardRange()\n if (!ctx) return null\n return (\n <SegmentedControl\n options={ctx.options}\n value={ctx.range}\n onChange={ctx.setRange}\n className={className}\n aria-label=\"Time range\"\n />\n )\n}\n","import * as React from 'react'\nimport { SlidersHorizontal, RotateCcw } from 'lucide-react'\nimport type { DashboardWidgetDef } from '@fayz-ai/core'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Button } from '../primitives/button'\nimport {\n Dropdown, DropdownTrigger, DropdownContent, DropdownLabel, DropdownSeparator, DropdownCheckboxItem, DropdownItem,\n} from '../primitives/dropdown'\n\nexport interface DashboardCustomizeMenuProps {\n /** Full set of registered widgets for this surface. */\n widgets: DashboardWidgetDef[]\n /** Ids currently visible. */\n visibleIds: Set<string>\n onToggle: (widgetId: string, visible: boolean) => void\n onReset: () => void\n label?: string\n}\n\n/** Gear menu to choose which widgets appear on the dashboard (persisted). */\nexport function DashboardCustomizeMenu({ widgets, visibleIds, onToggle, onReset, label }: DashboardCustomizeMenuProps) {\n const t = useTranslation()\n if (widgets.length === 0) return null\n return (\n <Dropdown>\n <DropdownTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"gap-1.5\">\n <SlidersHorizontal className=\"h-3.5 w-3.5\" />\n {label ?? 'Customize'}\n </Button>\n </DropdownTrigger>\n <DropdownContent align=\"end\" className=\"max-h-[70vh] w-60 overflow-y-auto\">\n <DropdownLabel>{label ?? 'Show widgets'}</DropdownLabel>\n <DropdownSeparator />\n {widgets.map((w) => (\n <DropdownCheckboxItem\n key={w.id}\n checked={visibleIds.has(w.id)}\n onCheckedChange={(checked) => onToggle(w.id, Boolean(checked))}\n onSelect={(e) => e.preventDefault()}\n >\n {t(w.title)}\n </DropdownCheckboxItem>\n ))}\n <DropdownSeparator />\n <DropdownItem onSelect={() => onReset()}>\n <RotateCcw className=\"mr-2 h-3.5 w-3.5\" />\n {'Reset to defaults'}\n </DropdownItem>\n </DropdownContent>\n </Dropdown>\n )\n}\n","import * as React from 'react'\nimport { EyeOff } from 'lucide-react'\nimport {\n usePluginRuntime,\n getDashboardWidgets,\n resolvePluginComponent,\n hashRouterAdapter,\n type DashboardLayoutConfig,\n type DashboardSurface,\n type DashboardWidgetDef,\n} from '@fayz-ai/core'\nimport { Card, CardHeader, CardTitle, CardDescription, CardContent } from '../primitives/card'\nimport { DashboardGrid, type DashboardGridItem } from './DashboardGrid'\nimport { resolveDashboardLayout, type LaidOutWidget } from './layout'\nimport { useDashboardPreferences } from './preferences'\nimport { DashboardRangeProvider, DashboardRangeControl, type DashboardRange } from './DashboardRange'\nimport { DashboardCustomizeMenu } from './DashboardCustomizeMenu'\n\n/** Wrap a widget so a hide button fades in on hover (top-right corner). */\nfunction HoverHide({ id, onHide, children }: { id: string; onHide?: (id: string) => void; children: React.ReactNode }) {\n if (!onHide) return <>{children}</>\n return (\n <div className=\"group relative h-full\">\n {children}\n <button\n type=\"button\"\n onClick={() => onHide(id)}\n title=\"Hide widget\"\n aria-label=\"Hide widget\"\n className=\"absolute right-2 top-2 z-10 inline-flex h-6 w-6 items-center justify-center rounded-md border border-border bg-background/90 text-muted-foreground opacity-0 shadow-sm transition-opacity hover:text-foreground group-hover:opacity-100\"\n >\n <EyeOff className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n )\n}\n\nfunction toGridItems(laidOut: LaidOutWidget[], onHide?: (id: string) => void): DashboardGridItem[] {\n return laidOut.map(({ def, span }) => {\n const Component = resolvePluginComponent(def)\n const node = Component ? <Component {...(def.props ?? {})} /> : null\n return { id: def.id, span, node: <HoverHide id={def.id} onHide={onHide}>{node}</HoverHide> }\n })\n}\n\n// ---------------------------------------------------------------------------\n// Navigation — widgets (e.g. onboarding) call useDashboardNavigate() to route.\n// Defaults to the shared hash router so widgets work without explicit wiring.\n// ---------------------------------------------------------------------------\n\nconst DashboardNavigateContext = React.createContext<(path: string) => void>((path) =>\n hashRouterAdapter().navigate(path),\n)\n\nexport const DashboardNavigateProvider = DashboardNavigateContext.Provider\n\nexport function useDashboardNavigate(): (path: string) => void {\n return React.useContext(DashboardNavigateContext)\n}\n\n// ---------------------------------------------------------------------------\n// Shared widget grid — used by DashboardCanvas (registry) and by standalone\n// callers (e.g. the dashboard plugin's legacy DashboardPage shim). Resolves the\n// layout, then renders each widget by span.\n// ---------------------------------------------------------------------------\n\nexport function WidgetGrid({ widgets, appLayout, surface }: {\n widgets: DashboardWidgetDef[]\n appLayout?: DashboardLayoutConfig\n surface: DashboardSurface\n}) {\n const { prefs, setVisible } = useDashboardPreferences(surface)\n const laidOut = resolveDashboardLayout(widgets, appLayout, prefs ?? undefined)\n return <DashboardGrid items={toGridItems(laidOut, (id) => setVisible(id, false))} />\n}\n\n// ---------------------------------------------------------------------------\n// DashboardCanvas — the registry-driven renderer. Serves the global app home\n// (surface=\"home\", all domains) and a plugin's own overview (surface=\"plugin-home\"\n// + domain). Widgets a plugin registers once appear on both.\n// ---------------------------------------------------------------------------\n\nexport interface DashboardCanvasProps {\n surface: DashboardSurface\n /** Restrict to one plugin's widgets (used for plugin-home). */\n domain?: string\n title?: string\n subtitle?: string\n /** Render the in-content title/subtitle. Default: true. */\n showHeader?: boolean\n /** App-level curation of which widgets show, their order and span. */\n appLayout?: DashboardLayoutConfig\n /** App-level widgets injected into this surface's grid without a plugin — e.g.\n * an \"Ask the assistant\" CTA. Merged with the registry widgets, then laid out\n * (respects each widget's span/defaultOrder). Filtered to this surface. */\n extraWidgets?: DashboardWidgetDef[]\n /** Show a shared time-range control (sticky, top-right). Widgets read it via\n * useDashboardRange(). Pass `true` for defaults or an options object. */\n range?: boolean | DashboardRangeOptions\n /** Show the \"Customize\" menu so users can choose which widgets appear\n * (persisted per surface). Default: true. */\n customizable?: boolean\n /** Label for the customize menu trigger. */\n customizeLabel?: string\n /** Initial visibility before user prefs: 'default' honors each widget's\n * `defaultVisible` (used by the global home to curate a starting set); 'all'\n * shows every eligible widget. Defaults to 'all' on a plugin-home, 'default'\n * on the global home. */\n initialVisibility?: 'default' | 'all'\n /** Route handler for widgets that navigate (defaults to the hash router). */\n onNavigate?: (path: string) => void\n className?: string\n}\n\nexport interface DashboardRangeOptions {\n options?: DashboardRange[]\n default?: DashboardRange\n onChange?: (range: DashboardRange) => void\n}\n\nexport function DashboardCanvas({\n surface, domain, title, subtitle, showHeader = true, appLayout, extraWidgets, range,\n customizable = true, customizeLabel, initialVisibility, onNavigate, className,\n}: DashboardCanvasProps) {\n const runtime = usePluginRuntime()\n const registryWidgets = getDashboardWidgets(runtime, { surface, domain })\n const widgets = React.useMemo<DashboardWidgetDef[]>(() => {\n const extra = (extraWidgets ?? []).filter((w) => {\n if (!(w.surfaces ?? ['home', 'plugin-home']).includes(surface)) return false\n return !domain || w.domain === domain\n })\n return extra.length ? [...registryWidgets, ...extra] : registryWidgets\n }, [registryWidgets, extraWidgets, surface, domain])\n const rangeOpts: DashboardRangeOptions | null = range ? (range === true ? {} : range) : null\n\n const forceAll = (initialVisibility ?? (surface === 'plugin-home' ? 'all' : 'default')) === 'all'\n const { prefs, setVisible, reset } = useDashboardPreferences(surface, domain ?? 'home')\n const laidOut = resolveDashboardLayout(widgets, appLayout, prefs ?? undefined, forceAll)\n const visibleIds = React.useMemo(() => new Set(laidOut.map((w) => w.def.id)), [laidOut])\n\n const hasControls = Boolean(rangeOpts) || (customizable && widgets.length > 0)\n const headerBlock = showHeader && (title || subtitle) ? (\n <div>\n {title ? <h1 className=\"text-2xl font-semibold tracking-tight\">{title}</h1> : null}\n {subtitle ? <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p> : null}\n </div>\n ) : null\n\n // Controls sit inline on the header row (right-aligned) — no separate band, so\n // there's no empty gap above the content.\n const topRow = (headerBlock || hasControls) ? (\n <div className=\"flex items-start justify-between gap-4\">\n {headerBlock ?? <span />}\n {hasControls ? (\n <div className=\"flex shrink-0 items-center gap-2\">\n {customizable && widgets.length > 0 ? (\n <DashboardCustomizeMenu\n widgets={widgets}\n visibleIds={visibleIds}\n onToggle={setVisible}\n onReset={reset}\n label={customizeLabel}\n />\n ) : null}\n {rangeOpts ? <DashboardRangeControl /> : null}\n </div>\n ) : null}\n </div>\n ) : null\n\n const content = (\n <div className={className ?? 'space-y-6 p-6'}>\n {topRow}\n\n {widgets.length === 0 ? (\n <Card>\n <CardHeader>\n <CardTitle>Welcome!</CardTitle>\n <CardDescription>Your dashboard will show key metrics and information here.</CardDescription>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm text-muted-foreground\">\n Enable plugins or register dashboard widgets to populate this view.\n </p>\n </CardContent>\n </Card>\n ) : laidOut.length === 0 ? (\n <Card>\n <CardContent className=\"p-6 text-sm text-muted-foreground\">\n All widgets are hidden. Use “Customize” to choose what to show.\n </CardContent>\n </Card>\n ) : (\n <DashboardGrid items={toGridItems(laidOut)} />\n )}\n </div>\n )\n\n const navWrapped = onNavigate\n ? <DashboardNavigateProvider value={onNavigate}>{content}</DashboardNavigateProvider>\n : content\n\n return rangeOpts\n ? (\n <DashboardRangeProvider options={rangeOpts.options} defaultRange={rangeOpts.default} onChange={rangeOpts.onChange}>\n {navWrapped}\n </DashboardRangeProvider>\n )\n : navWrapped\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface GoldCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Brand-colored hero variant — `bg-primary text-primary-foreground` with a\n * soft branded shadow. Use for the headline card (e.g. a balance hero). When\n * false (default) it's a plain surface card (`bg-card` + border).\n */\n branded?: boolean\n}\n\n/**\n * GoldCard — a generic, reusable rounded card wrapper for dashboard surfaces.\n *\n * The `branded` variant paints the card in the app's primary color so a single\n * hero (balance, headline KPI, CTA) pops against the neutral grid. Both variants\n * are internally full-width so they reflow cleanly inside the responsive\n * DashboardGrid (full-width on mobile, cell-width on desktop).\n */\nexport const GoldCard = React.forwardRef<HTMLDivElement, GoldCardProps>(\n ({ branded = false, className, children, ...rest }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'h-full rounded-3xl p-5',\n branded\n ? 'bg-primary text-primary-foreground shadow-lg shadow-primary/20'\n : 'border border-border bg-card text-card-foreground shadow-sm',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n ),\n)\nGoldCard.displayName = 'GoldCard'\n","import * as React from 'react'\nimport { getLucideIcon } from '../icons'\nimport type { IconRef } from './types'\n\n/** Resolve an IconRef (lucide name or component) to a renderable element. */\nexport function renderIcon(icon: IconRef | undefined, className = 'h-4 w-4'): React.ReactNode {\n if (!icon) return null\n if (typeof icon === 'string') {\n const Comp = getLucideIcon(icon)\n return Comp ? React.createElement(Comp, { className }) : null\n }\n return React.createElement(icon, { className })\n}\n","import * as React from 'react'\n\n// ---------------------------------------------------------------------------\n// The one sparkline. Dependency-free SVG, oldest → newest, soft area fill.\n//\n// It lived twice — once in KpiCard, once inside the analytics card — and the\n// second copy's comment said \"mirrors the dashboard KpiCard's so tiles read\n// alike\", which is a promise a copy cannot keep. Only the box differs between\n// the two callers, so the box is a prop.\n// ---------------------------------------------------------------------------\n\nexport interface SparklineProps {\n data: number[]\n color: string\n /** viewBox width/height — the aspect the path is drawn into. */\n width?: number\n height?: number\n /** Inset so the stroke is not clipped at the extremes. */\n padding?: number\n className?: string\n}\n\nexport function Sparkline({\n data, color, width = 96, height = 32, padding = 3, className = 'h-8 w-24 shrink-0 overflow-visible',\n}: SparklineProps) {\n const gid = React.useId()\n if (!data || data.length < 2) return null\n\n const min = Math.min(...data)\n const max = Math.max(...data)\n const span = max - min || 1\n const step = (width - padding * 2) / (data.length - 1)\n const pts = data.map((d, i) => [\n padding + i * step,\n padding + (height - padding * 2) * (1 - (d - min) / span),\n ] as const)\n const line = pts.map(([x, y], i) => `${i === 0 ? 'M' : 'L'}${x.toFixed(1)},${y.toFixed(1)}`).join(' ')\n const area = `${line} L${pts[pts.length - 1]![0].toFixed(1)},${height} L${pts[0]![0].toFixed(1)},${height} Z`\n\n return (\n <svg viewBox={`0 0 ${width} ${height}`} className={className} preserveAspectRatio=\"none\" aria-hidden>\n <defs>\n <linearGradient id={gid} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity=\"0.22\" />\n <stop offset=\"100%\" stopColor={color} stopOpacity=\"0\" />\n </linearGradient>\n </defs>\n <path d={area} fill={`url(#${gid})`} />\n <path\n d={line} fill=\"none\" stroke={color} strokeWidth=\"1.5\"\n strokeLinecap=\"round\" strokeLinejoin=\"round\" vectorEffect=\"non-scaling-stroke\"\n />\n </svg>\n )\n}\n","import * as React from 'react'\nimport { TrendingUp, TrendingDown, Minus } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Card, CardContent } from '../primitives/card'\nimport { renderIcon } from './icon'\nimport { Sparkline } from './Sparkline'\nimport type { KpiCurrency, IconRef, KpiFormat, KpiValue, KpiTrend } from './types'\n\nexport function formatKpiValue(value: number, format?: KpiFormat, currency?: KpiCurrency): string {\n const locale = currency?.locale ?? 'pt-BR'\n switch (format) {\n case 'currency':\n return new Intl.NumberFormat(locale, { style: 'currency', currency: currency?.code ?? 'BRL', maximumFractionDigits: 0 }).format(value)\n case 'percent':\n return `${new Intl.NumberFormat(locale, { maximumFractionDigits: 1 }).format(value)}%`\n case 'duration':\n return `${Math.round(value)} min`\n default:\n return new Intl.NumberFormat(locale, { maximumFractionDigits: 1 }).format(value)\n }\n}\n\nfunction deriveTrend(current: number, previous: number | undefined, explicit: KpiTrend | undefined): KpiTrend | undefined {\n if (explicit) return explicit\n if (previous == null) return undefined\n return current > previous ? 'up' : current < previous ? 'down' : 'neutral'\n}\n\nfunction TrendChip({ trend, delta, invert }: { trend: KpiTrend; delta: number | null; invert?: boolean }) {\n if (trend === 'neutral') return null\n const good = invert ? trend === 'down' : trend === 'up'\n const Icon = trend === 'up' ? TrendingUp : TrendingDown\n return (\n <span className={cn(\n 'inline-flex items-center gap-0.5 text-xs font-medium',\n good ? 'text-emerald-600' : 'text-rose-600',\n )}>\n <Icon className=\"h-3 w-3\" />\n {delta != null ? `${delta > 0 ? '+' : ''}${delta}%` : null}\n </span>\n )\n}\n\n/** Trend-aware accent: green when good, red when bad, theme-info when flat. */\nfunction trendColor(trend: KpiTrend | undefined, invert?: boolean): string {\n if (!trend || trend === 'neutral') return 'hsl(var(--info))'\n const good = invert ? trend === 'down' : trend === 'up'\n return good ? '#10b981' : '#f43f5e'\n}\n\n/** Semicircular radial gauge showing `value` as a fraction of `goal`. */\nfunction Gauge({ value, goal, color, children }: { value: number; goal: number; color: string; children: React.ReactNode }) {\n const pct = goal > 0 ? Math.min(1, Math.max(0, value / goal)) : 0\n const R = 40, CX = 50, CY = 46, SW = 9\n const len = Math.PI * R\n const d = `M ${CX - R} ${CY} A ${R} ${R} 0 0 1 ${CX + R} ${CY}`\n return (\n <div className=\"relative mx-auto w-full max-w-[160px]\">\n <svg viewBox=\"0 0 100 52\" className=\"w-full\" aria-hidden>\n <path d={d} fill=\"none\" stroke=\"hsl(var(--muted))\" strokeWidth={SW} strokeLinecap=\"round\" />\n <path\n d={d} fill=\"none\" stroke={color} strokeWidth={SW} strokeLinecap=\"round\"\n strokeDasharray={len} strokeDashoffset={len * (1 - pct)}\n />\n </svg>\n <div className=\"absolute inset-x-0 bottom-0 text-center text-2xl font-semibold tracking-tight text-foreground\">\n {children}\n </div>\n </div>\n )\n}\n\nexport interface KpiCardProps {\n label: string\n icon?: IconRef\n /** Pre-formatted/sync value. Provide this OR `compute`. */\n value?: React.ReactNode\n /** Numeric value formatted via `format`. Ignored when `value` is set. */\n amount?: number\n /** Async loader; the card shows a skeleton until it resolves. */\n compute?: () => Promise<KpiValue>\n format?: KpiFormat\n currency?: KpiCurrency\n sub?: React.ReactNode\n /** Trend chip inputs (for sync usage). */\n current?: number\n previous?: number\n trend?: KpiTrend\n /** For cost-style metrics where down is good (e.g. CPA). */\n invertTrend?: boolean\n /** Inline sparkline series (oldest → newest). Async usage: return via KpiValue.spark. */\n spark?: number[]\n /** Render the card as a radial gauge toward this goal value. */\n goal?: number\n /** Accent color for the sparkline/gauge. Defaults to a trend-aware color. */\n accent?: string\n loading?: boolean\n}\n\n/**\n * Canonical KPI card — consolidates the trend-chip card from plugin-marketing\n * and the async MetricCard from plugin-dashboard. Use directly, or via a\n * registered KPI widget (see defineKpiWidget).\n */\nexport function KpiCard(props: KpiCardProps) {\n const { label, icon, sub, format, currency, invertTrend } = props\n const [computed, setComputed] = React.useState<KpiValue | null>(null)\n const [errored, setErrored] = React.useState(false)\n\n React.useEffect(() => {\n if (!props.compute) return\n let cancelled = false\n props.compute()\n .then((v) => { if (!cancelled) setComputed(v) })\n .catch(() => { if (!cancelled) setErrored(true) })\n return () => { cancelled = true }\n }, [props.compute])\n\n const isAsync = Boolean(props.compute)\n const loading = props.loading || (isAsync && computed === null && !errored)\n\n let display: React.ReactNode = props.value\n let current = props.current\n let previous = props.previous\n let trend = props.trend\n let unit: string | undefined\n let spark = props.spark\n\n if (isAsync && computed) {\n display = formatKpiValue(computed.value, format, currency)\n current = computed.value\n previous = computed.previousValue\n trend = computed.trend\n unit = computed.unit\n spark = computed.spark ?? spark\n } else if (display == null && props.amount != null) {\n display = formatKpiValue(props.amount, format, currency)\n current = current ?? props.amount\n }\n\n const resolvedTrend = current != null ? deriveTrend(current, previous, trend) : trend\n const delta = current != null && previous != null && previous !== 0\n ? Math.round(((current - previous) / previous) * 100)\n : null\n const accent = props.accent ?? trendColor(resolvedTrend, invertTrend)\n\n const valueText = (\n <>\n {display}\n {unit ? <span className=\"ml-1 text-sm font-normal text-muted-foreground\">{unit}</span> : null}\n </>\n )\n const trendChip = resolvedTrend ? <TrendChip trend={resolvedTrend} delta={delta} invert={invertTrend} /> : null\n\n // Pick a body layout: gauge (goal set) → sparkline (series set) → plain.\n const isGauge = props.goal != null && current != null\n const hasSpark = Boolean(spark && spark.length >= 2)\n\n let body: React.ReactNode\n if (errored) {\n body = <span className=\"text-sm text-muted-foreground\">—</span>\n } else if (loading) {\n body = isGauge\n ? <div className=\"mx-auto h-16 w-32 animate-pulse rounded bg-muted\" />\n : <div className=\"h-7 w-20 animate-pulse rounded bg-muted\" />\n } else if (isGauge) {\n body = (\n <div>\n <Gauge value={current!} goal={props.goal!} color={accent}>{valueText}</Gauge>\n <div className=\"mt-1 flex items-center justify-center gap-2 text-xs text-muted-foreground\">\n {trendChip}\n <span>{sub ?? `out of ${formatKpiValue(props.goal!, format, currency)}`}</span>\n </div>\n </div>\n )\n } else if (hasSpark) {\n body = (\n <div className=\"flex items-end justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"text-2xl font-semibold tracking-tight text-foreground\">{valueText}</div>\n {trendChip ? <div className=\"mt-0.5\">{trendChip}</div> : null}\n </div>\n <Sparkline data={spark!} color={accent} />\n </div>\n )\n } else {\n body = (\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-2xl font-semibold tracking-tight text-foreground\">{valueText}</span>\n {trendChip ? <span className=\"mb-0.5\">{trendChip}</span> : null}\n </div>\n )\n }\n\n return (\n // h-full so cards fill the (stretch) grid cell and every card in a row matches\n // the tallest — labels/subtitles of different lengths no longer misalign them.\n <Card className=\"h-full\">\n <CardContent className=\"flex h-full flex-col p-4\">\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <span className=\"text-sm text-muted-foreground\">{label}</span>\n <span className=\"text-muted-foreground\">{renderIcon(icon)}</span>\n </div>\n {body}\n {sub && !isGauge ? <p className=\"mt-0.5 text-xs text-muted-foreground\">{sub}</p> : null}\n </CardContent>\n </Card>\n )\n}\n","import * as React from 'react'\nimport { Card, CardContent, CardHeader, CardTitle } from '../primitives/card'\nimport { renderIcon } from './icon'\nimport type { ChartSeries, ChartType, IconRef } from './types'\n\nexport interface ChartWidgetProps {\n type: ChartType\n /** Rows of data; each key referenced by a series.dataKey. */\n data: Array<Record<string, string | number>>\n series: ChartSeries[]\n /** Key for the category axis (x-axis / pie label). */\n categoryKey?: string\n title?: string\n icon?: IconRef\n /** Right-aligned header content (e.g. a range selector). */\n headerAction?: React.ReactNode\n height?: number\n className?: string\n}\n\n// The recharts body is lazy so recharts ships as an async chunk instead of in\n// every consumer's entry bundle; the Card shell renders immediately and the\n// fallback reserves the chart's height to avoid layout shift.\nconst ChartWidgetInner = React.lazy(() => import('./ChartWidgetInner'))\n\n/**\n * One chart failing must cost one chart.\n *\n * A lazy body has two ways to fail — the chunk never arrives, or recharts\n * throws on the data — and with no boundary either one unmounts the whole page\n * up to the app root, so a page of twenty cards goes blank because one of them\n * had a bad row. It also swallowed the *reason*: the console showed a component\n * stack ending at `Lazy` and nothing about what actually broke. This prints it\n * where the chart was.\n */\nclass ChartBoundary extends React.Component<\n { height: number; children: React.ReactNode },\n { error: Error | null }\n> {\n state: { error: Error | null } = { error: null }\n\n static getDerivedStateFromError(error: Error) {\n return { error }\n }\n\n render() {\n if (!this.state.error) return this.props.children\n return (\n <div\n className=\"flex items-center justify-center px-3 text-center text-xs text-muted-foreground\"\n style={{ height: this.props.height }}\n >\n {this.state.error.message || 'Chart failed to render'}\n </div>\n )\n }\n}\n\n/** recharts-backed chart in a Card. Replaces the hand-rolled CSS bar charts. */\nexport function ChartWidget({\n type, data, series, categoryKey = 'name', title, icon, headerAction, height = 240, className,\n}: ChartWidgetProps) {\n return (\n <Card className={className}>\n {(title || headerAction) && (\n <CardHeader className=\"flex-row items-center justify-between space-y-0\">\n {title ? (\n <CardTitle className=\"flex items-center gap-2\">\n {renderIcon(icon)}\n {title}\n </CardTitle>\n ) : <span />}\n {headerAction}\n </CardHeader>\n )}\n <CardContent className=\"p-4 pt-2\">\n <ChartBoundary height={height}>\n <React.Suspense fallback={<div style={{ height }} />}>\n <ChartWidgetInner type={type} data={data} series={series} categoryKey={categoryKey} height={height} />\n </React.Suspense>\n </ChartBoundary>\n </CardContent>\n </Card>\n )\n}\n","import * as React from 'react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Card, CardContent, CardHeader, CardTitle } from '../primitives/card'\nimport { DataTable } from '../primitives/data-table'\nimport { renderIcon } from './icon'\nimport type { IconRef } from './types'\n\nexport interface TableWidgetProps<TData> {\n title?: string\n icon?: IconRef\n columns: ColumnDef<TData, unknown>[]\n data: TData[]\n loading?: boolean\n emptyMessage?: string\n onRowClick?: (row: TData) => void\n /** Right-aligned header content (e.g. a \"view all\" link). */\n headerAction?: React.ReactNode\n className?: string\n}\n\n/** \"Recent N\" table in a Card — wraps the shared DataTable primitive. */\nexport function TableWidget<TData>({\n title, icon, columns, data, loading, emptyMessage, onRowClick, headerAction, className,\n}: TableWidgetProps<TData>) {\n return (\n <Card className={className}>\n {(title || headerAction) && (\n <CardHeader className=\"flex-row items-center justify-between space-y-0\">\n {title ? (\n <CardTitle className=\"flex items-center gap-2\">\n {renderIcon(icon)}\n {title}\n </CardTitle>\n ) : <span />}\n {headerAction}\n </CardHeader>\n )}\n <CardContent className=\"p-0\">\n <DataTable\n columns={columns}\n data={data}\n loading={loading}\n emptyMessage={emptyMessage}\n onRowClick={onRowClick}\n variant=\"flat\"\n compact\n />\n </CardContent>\n </Card>\n )\n}\n","import * as React from 'react'\nimport type { OnboardingStepInput } from './types'\n\nexport interface OnboardingProgress {\n /** Per-step completion, keyed by step id. */\n completed: Record<string, boolean>\n /** False until every async `check` has settled — render a skeleton until then. */\n resolved: boolean\n doneCount: number\n total: number\n allDone: boolean\n /** First step still pending — the one a compact UI should offer to start. */\n nextStep: OnboardingStepInput | undefined\n /** Run a step's `action`, routing string actions through `onNavigate`. */\n run: (action: OnboardingStepInput['action']) => void\n}\n\n/**\n * The onboarding checklist's whole behaviour, minus the rendering: resolve each\n * step's async `check`, hold back the paint until they all settle, and count.\n *\n * Extracted so the dashboard card (OnboardingWidget) and the sidebar card\n * (SidebarOnboarding) are two skins over ONE source of truth — otherwise the\n * two would drift, and a store could plausibly read \"2 of 5\" in the sidebar\n * while the dashboard said 3.\n *\n * `steps` is the effect's dependency by identity, so callers must build the\n * array once (module scope or useMemo) rather than inline per render.\n */\nexport function useOnboardingProgress(\n steps: OnboardingStepInput[],\n onNavigate?: (path: string) => void,\n): OnboardingProgress {\n const [completed, setCompleted] = React.useState<Record<string, boolean>>(() =>\n Object.fromEntries(steps.map((s) => [s.id, Boolean(s.done)])),\n )\n // Async checks start unresolved: don't paint until they settle, or an\n // already-onboarded tenant flashes the checklist for the query round-trip.\n const [resolved, setResolved] = React.useState(() => steps.every((s) => s.done != null || !s.check))\n\n React.useEffect(() => {\n let cancelled = false\n Promise.all(steps.map(async (s) => {\n if (s.done != null) return [s.id, s.done] as const\n if (!s.check) return [s.id, false] as const\n try { return [s.id, await s.check()] as const } catch { return [s.id, false] as const }\n })).then((entries) => {\n if (cancelled) return\n setCompleted(Object.fromEntries(entries))\n setResolved(true)\n })\n return () => { cancelled = true }\n }, [steps])\n\n const doneCount = steps.filter((s) => completed[s.id]).length\n\n const run = React.useCallback((action: OnboardingStepInput['action']) => {\n if (!action) return\n if (typeof action === 'string') onNavigate?.(action)\n else action()\n }, [onNavigate])\n\n return {\n completed,\n resolved,\n doneCount,\n total: steps.length,\n allDone: doneCount === steps.length,\n nextStep: steps.find((s) => !completed[s.id]),\n run,\n }\n}\n","import * as React from 'react'\nimport { Check, Circle } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Card, CardContent, CardHeader, CardTitle, CardDescription } from '../primitives/card'\nimport { Button } from '../primitives/button'\nimport { Skeleton } from '../primitives/skeleton'\nimport { renderIcon } from './icon'\nimport { useOnboardingProgress } from './useOnboardingProgress'\nimport type { OnboardingStepInput } from './types'\n\nexport type { OnboardingStepInput }\n\nexport interface OnboardingWidgetProps {\n title?: string\n subtitle?: string\n steps: OnboardingStepInput[]\n onNavigate?: (path: string) => void\n /** Hide the whole widget once every step is complete. Default: true. */\n hideWhenComplete?: boolean\n className?: string\n}\n\n/** Placeholder mirroring the widget's layout while the async checks resolve. */\nfunction OnboardingSkeleton({ rows, className }: { rows: number; className?: string }) {\n return (\n <Card className={className} aria-busy=\"true\">\n <CardHeader>\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"mt-1.5 h-3.5 w-64 max-w-full\" />\n <div className=\"mt-2 flex items-center gap-3\">\n <Skeleton className=\"h-1.5 flex-1 rounded-full\" />\n <Skeleton className=\"h-3 w-8\" />\n </div>\n </CardHeader>\n <CardContent className=\"space-y-1 pt-0\">\n {Array.from({ length: Math.max(rows, 1) }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-3 px-2 py-2.5\">\n <Skeleton className=\"h-7 w-7 shrink-0 rounded-full\" />\n <div className=\"min-w-0 flex-1 space-y-1.5\">\n <Skeleton className=\"h-3.5 w-1/2\" />\n <Skeleton className=\"h-3 w-3/4\" />\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n )\n}\n\n/** Getting-started checklist (\"first steps to set up\") with progress. */\nexport function OnboardingWidget({\n title = 'Getting started', subtitle, steps, onNavigate, hideWhenComplete = true, className,\n}: OnboardingWidgetProps) {\n const { completed, resolved, doneCount, allDone, run: runAction } = useOnboardingProgress(steps, onNavigate)\n\n // Hold the card's real shape while the checks settle. Painting the resolved\n // checklist here would flash 0/N at an already-onboarded tenant, and painting\n // nothing collapsed the row and shifted the dashboard on resolve.\n if (!resolved) return <OnboardingSkeleton rows={steps.length} className={className} />\n if (allDone && hideWhenComplete) return null\n\n return (\n <Card className={className}>\n <CardHeader>\n <CardTitle>{title}</CardTitle>\n {subtitle ? <CardDescription>{subtitle}</CardDescription> : null}\n <div className=\"mt-2 flex items-center gap-3\">\n <div className=\"h-1.5 flex-1 overflow-hidden rounded-full bg-muted\">\n <div className=\"h-full rounded-full bg-primary transition-all\"\n style={{ width: `${steps.length ? (doneCount / steps.length) * 100 : 0}%` }} />\n </div>\n <span className=\"text-xs font-medium text-muted-foreground\">{doneCount}/{steps.length}</span>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-1 pt-0\">\n {steps.map((step) => {\n const isDone = completed[step.id]\n return (\n <div key={step.id} className=\"flex items-center gap-3 rounded-lg px-2 py-2.5 hover:bg-muted/50\">\n <span className={cn(\n 'flex h-7 w-7 shrink-0 items-center justify-center rounded-full',\n isDone ? 'bg-emerald-100 text-emerald-600' : 'bg-muted text-muted-foreground',\n )}>\n {isDone ? <Check className=\"h-4 w-4\" /> : (renderIcon(step.icon, 'h-4 w-4') ?? <Circle className=\"h-4 w-4\" />)}\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className={cn('text-sm font-medium', isDone && 'text-muted-foreground line-through')}>{step.title}</p>\n {step.description ? <p className=\"truncate text-xs text-muted-foreground\">{step.description}</p> : null}\n </div>\n {!isDone && step.action ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => runAction(step.action)}>\n {step.actionLabel ?? 'Start'}\n </Button>\n ) : null}\n </div>\n )\n })}\n </CardContent>\n </Card>\n )\n}\n","import * as React from 'react'\nimport { ArrowRight, Check, Circle } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Skeleton } from '../primitives/skeleton'\nimport { useLayoutStore } from '../stores/layout.store'\nimport { useOnboardingProgress } from './useOnboardingProgress'\nimport type { OnboardingStepInput } from './types'\n\nexport interface SidebarOnboardingProps {\n title?: string\n steps: OnboardingStepInput[]\n onNavigate?: (path: string) => void\n /** Hide the whole card once every step is complete. Default: true. */\n hideWhenComplete?: boolean\n /**\n * @deprecated The checklist no longer folds inline — it is always one line in\n * the rail and opens its steps in a panel on hover, so there is no collapsed\n * state left to remember. Still accepted so existing hosts keep compiling.\n */\n storageKey?: string\n className?: string\n}\n\nconst COUNT_LABEL = (done: number, total: number) => `${done} de ${total}`\n\n/** Ring geometry for the collapsed rail's badge. */\nconst RING_SIZE = 30\nconst RING_RADIUS = 12\nconst RING_CIRCUMFERENCE = 2 * Math.PI * RING_RADIUS\n\n/**\n * The getting-started checklist as it fits a sidebar — a single line, not a\n * card.\n *\n * It used to print every step inline, which cost the rail a third of its height\n * to say things the user reads once; and it was painted in the PAGE's tones, so\n * a white card sat in the middle of a dark menu (and in a 4rem rail it was a\n * white block with \"4 de 5\" floating in it). Now the rail carries the progress\n * only — a count and a hairline expanded, a ring collapsed — and the steps come\n * out to the right on hover, in the menu's own colours.\n *\n * Same steps and same resolution logic as the dashboard's OnboardingWidget\n * (both run useOnboardingProgress); deliberately NOT a variant prop on it —\n * they share behaviour, not layout.\n */\nexport function SidebarOnboarding({\n title = 'Primeiros passos',\n steps,\n onNavigate,\n hideWhenComplete = true,\n className,\n}: SidebarOnboardingProps) {\n const { completed, resolved, doneCount, allDone, nextStep, run } = useOnboardingProgress(steps, onNavigate)\n const railCollapsed = useLayoutStore((s) => s.sidebarCollapsed)\n const [open, setOpen] = React.useState(false)\n const closeTimer = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const cancelClose = () => {\n if (closeTimer.current) {\n clearTimeout(closeTimer.current)\n closeTimer.current = null\n }\n }\n const show = () => {\n cancelClose()\n setOpen(true)\n }\n // A small delay so crossing the gap between the row and the panel doesn't\n // close what you are reaching for.\n const hide = () => {\n cancelClose()\n closeTimer.current = setTimeout(() => setOpen(false), 140)\n }\n React.useEffect(() => () => cancelClose(), [])\n\n if (!resolved) {\n return railCollapsed ? (\n <div className=\"flex justify-center py-1\" aria-busy=\"true\">\n <Skeleton className=\"h-8 w-8 rounded-full bg-sidebar-accent\" />\n </div>\n ) : (\n <div className={cn('px-1 py-1.5', className)} aria-busy=\"true\">\n <Skeleton className=\"h-3 w-24 bg-sidebar-accent\" />\n <Skeleton className=\"mt-2 h-1 w-full rounded-full bg-sidebar-accent\" />\n </div>\n )\n }\n if (allDone && hideWhenComplete) return null\n\n const pct = steps.length ? (doneCount / steps.length) * 100 : 0\n\n const trigger = railCollapsed ? (\n <button\n type=\"button\"\n onClick={() => (open ? hide() : show())}\n title={`${title} — ${COUNT_LABEL(doneCount, steps.length)}`}\n aria-label={`${title} — ${COUNT_LABEL(doneCount, steps.length)}`}\n className=\"flex w-full items-center justify-center rounded-button p-1 text-sidebar-foreground/80 transition-colors hover:bg-sidebar-accent/60\"\n >\n <span className=\"relative flex items-center justify-center\">\n <svg width={RING_SIZE} height={RING_SIZE} viewBox={`0 0 ${RING_SIZE} ${RING_SIZE}`} className=\"-rotate-90\">\n <circle\n cx={RING_SIZE / 2} cy={RING_SIZE / 2} r={RING_RADIUS}\n fill=\"none\" strokeWidth=\"2.5\"\n className=\"stroke-sidebar-border\"\n />\n <circle\n cx={RING_SIZE / 2} cy={RING_SIZE / 2} r={RING_RADIUS}\n fill=\"none\" strokeWidth=\"2.5\" strokeLinecap=\"round\"\n strokeDasharray={RING_CIRCUMFERENCE}\n strokeDashoffset={RING_CIRCUMFERENCE * (1 - pct / 100)}\n className=\"stroke-current text-sidebar-foreground transition-[stroke-dashoffset] duration-300\"\n />\n </svg>\n <span className=\"absolute text-[9px] font-semibold tabular-nums text-sidebar-foreground\">\n {doneCount}/{steps.length}\n </span>\n </span>\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={() => (open ? hide() : show())}\n aria-expanded={open}\n className={cn(\n 'w-full rounded-button px-1.5 py-1.5 text-left transition-colors hover:bg-sidebar-accent/50',\n className,\n )}\n >\n <span className=\"flex items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-[12px] font-medium text-sidebar-foreground/90\">{title}</span>\n <span className=\"shrink-0 text-[11px] tabular-nums text-sidebar-muted\">\n {COUNT_LABEL(doneCount, steps.length)}\n </span>\n </span>\n <span className=\"mt-1.5 block h-1 overflow-hidden rounded-full bg-sidebar-accent\">\n <span\n className=\"block h-full rounded-full bg-sidebar-foreground/70 transition-all\"\n style={{ width: `${pct}%` }}\n />\n </span>\n </button>\n )\n\n return (\n <div className=\"relative\" onMouseEnter={show} onMouseLeave={hide}>\n {trigger}\n <div\n onMouseEnter={cancelClose}\n onMouseLeave={hide}\n aria-hidden={!open}\n className={cn(\n 'absolute bottom-0 left-full z-50 ml-2 hidden w-64 md:block',\n 'motion-safe:transition-opacity motion-safe:duration-150',\n open ? 'opacity-100' : 'pointer-events-none opacity-0',\n )}\n >\n {/* Menu tones, like every other panel that leans out of the rail. */}\n <div className=\"rounded-lg border border-sidebar-border bg-sidebar p-2 text-sidebar-foreground shadow-xl shadow-black/25\">\n <div className=\"flex items-center gap-2 px-1 pb-1.5\">\n <span className=\"min-w-0 flex-1 truncate text-[12.5px] font-semibold\">{title}</span>\n <span className=\"shrink-0 text-[11px] tabular-nums text-sidebar-muted\">\n {COUNT_LABEL(doneCount, steps.length)}\n </span>\n </div>\n <div className=\"mx-1 h-1 overflow-hidden rounded-full bg-sidebar-accent\">\n <div className=\"h-full rounded-full bg-sidebar-foreground/70 transition-all\" style={{ width: `${pct}%` }} />\n </div>\n <ul className=\"mt-1.5 space-y-0.5\">\n {steps.map((step) => {\n const isDone = completed[step.id]\n // Only the first pending step offers its action. Five simultaneous\n // \"Start\" buttons is noise, and the checklist is ordered — the next\n // thing to do is the next thing to do.\n const isNext = !isDone && step.id === nextStep?.id\n return (\n <li key={step.id}>\n <button\n type=\"button\"\n disabled={isDone || !step.action}\n onClick={() => {\n setOpen(false)\n run(step.action)\n }}\n className={cn(\n 'group flex w-full items-center gap-2 rounded-md px-1.5 py-1.5 text-left transition-colors',\n !isDone && step.action && 'hover:bg-sidebar-accent/60',\n isDone && 'cursor-default',\n )}\n >\n {isDone\n ? <Check className=\"h-3.5 w-3.5 shrink-0 rounded-full bg-sidebar-accent p-[1px] text-sidebar-muted\" />\n : <Circle className=\"h-3.5 w-3.5 shrink-0 text-sidebar-muted\" />}\n <span className={cn(\n 'min-w-0 flex-1 text-[12.5px] leading-snug',\n isDone ? 'text-sidebar-muted line-through' : 'text-sidebar-foreground',\n )}>\n {step.title}\n </span>\n {isNext && step.action && (\n <span\n aria-hidden\n className=\"flex h-5 w-5 shrink-0 items-center justify-center rounded-md border border-sidebar-border text-sidebar-muted opacity-0 transition-opacity group-hover:opacity-100\"\n >\n <ArrowRight className=\"h-3 w-3\" />\n </span>\n )}\n </button>\n </li>\n )\n })}\n </ul>\n </div>\n </div>\n </div>\n )\n}\n","import type { DashboardWidgetDef, DashboardWidgetKind, DashboardSurface } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Widget-definition builders. Each sets the right `kind` + default `span` so a\n// plugin author writes data, not layout. The widget's component renders the\n// presentational primitives (KpiCard, ChartWidget, TableWidget, ...).\n// ---------------------------------------------------------------------------\n\nexport interface DefineWidgetInput {\n id: string\n title: string\n component: React.ComponentType<unknown>\n description?: string\n icon?: string\n domain?: string\n span?: 1 | 2 | 3 | 4\n defaultVisible?: boolean\n defaultOrder?: number\n surfaces?: DashboardSurface[]\n verticalId?: DashboardWidgetDef['verticalId']\n permission?: DashboardWidgetDef['permission']\n props?: Record<string, unknown>\n}\n\nfunction build(kind: DashboardWidgetKind, defaultSpan: 1 | 2 | 3 | 4, input: DefineWidgetInput): DashboardWidgetDef {\n return {\n kind,\n span: input.span ?? defaultSpan,\n defaultVisible: input.defaultVisible ?? true,\n id: input.id,\n title: input.title,\n description: input.description,\n icon: input.icon,\n domain: input.domain,\n defaultOrder: input.defaultOrder,\n surfaces: input.surfaces,\n verticalId: input.verticalId,\n permission: input.permission,\n component: input.component,\n props: input.props,\n }\n}\n\n/** KPI card widget — spans 1 column (forms the 4-up top row). */\nexport const defineKpiWidget = (input: DefineWidgetInput): DashboardWidgetDef => build('kpi', 1, input)\n/** Chart widget — spans 2 columns by default. */\nexport const defineChartWidget = (input: DefineWidgetInput): DashboardWidgetDef => build('chart', 2, input)\n/** Table widget — spans the full row by default. */\nexport const defineTableWidget = (input: DefineWidgetInput): DashboardWidgetDef => build('table', 4, input)\n/** Onboarding checklist widget — spans half the row (2 cols) by default. */\nexport const defineOnboardingWidget = (input: DefineWidgetInput): DashboardWidgetDef => build('onboarding', 2, input)\n/** Custom client-provided widget — spans 2 columns by default. */\nexport const defineCustomWidget = (input: DefineWidgetInput): DashboardWidgetDef => build('custom', 2, input)\n"]}
@@ -2,8 +2,9 @@ import { cn } from './chunk-OKZ6WQB3.js';
2
2
  import * as React2 from 'react';
3
3
  import { jsx, jsxs } from 'react/jsx-runtime';
4
4
  import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
5
- import { ChevronRight, Check, Circle, ArrowDown, ArrowUp, ArrowUpDown } from 'lucide-react';
5
+ import { ChevronRight, Check, Circle, Minus, ArrowDown, ArrowUp, ArrowUpDown } from 'lucide-react';
6
6
  import { useReactTable, getSortedRowModel, getCoreRowModel, flexRender } from '@tanstack/react-table';
7
+ import { useTranslation } from '@fayz-ai/core';
7
8
 
8
9
  var Card = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
9
10
  "div",
@@ -81,16 +82,21 @@ var DropdownSubTrigger = React2.forwardRef(({ className, inset, children, ...pro
81
82
  }
82
83
  ));
83
84
  DropdownSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
84
- var DropdownSubContent = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
85
- DropdownMenuPrimitive.SubContent,
86
- {
87
- ref,
88
- className: cn(
89
- "fayz-glass-surface z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
90
- className
91
- ),
92
- ...props
93
- }
85
+ var DropdownSubContent = React2.forwardRef(({ className, ...props }, ref) => (
86
+ // Portaled, like DropdownContent. Without it the submenu renders inside the
87
+ // parent panel's DOM — and that panel is `overflow-hidden`, so the submenu
88
+ // was clipped to its box: a flyout you could open and never reach.
89
+ /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
90
+ DropdownMenuPrimitive.SubContent,
91
+ {
92
+ ref,
93
+ className: cn(
94
+ "fayz-glass-surface z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
95
+ className
96
+ ),
97
+ ...props
98
+ }
99
+ ) })
94
100
  ));
95
101
  DropdownSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
96
102
  var DropdownContent = React2.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
@@ -187,6 +193,39 @@ var DropdownShortcut = ({
187
193
  );
188
194
  };
189
195
  DropdownShortcut.displayName = "DropdownShortcut";
196
+ var COLOR_CLASSES = {
197
+ primary: "border-primary bg-primary text-primary-foreground",
198
+ success: "border-success bg-success text-white dark:border-success dark:bg-success",
199
+ warning: "border-warning bg-warning text-white",
200
+ destructive: "border-destructive bg-destructive text-destructive-foreground"
201
+ };
202
+ var Checkbox = React2.forwardRef(
203
+ ({ checked = false, onChange, disabled, className, color = "primary", id, indeterminate = false, ...props }, ref) => {
204
+ const filled = checked || indeterminate;
205
+ return /* @__PURE__ */ jsx(
206
+ "button",
207
+ {
208
+ ref,
209
+ id,
210
+ type: "button",
211
+ role: "checkbox",
212
+ "aria-checked": indeterminate ? "mixed" : checked,
213
+ disabled,
214
+ onClick: () => onChange?.(!checked),
215
+ className: cn(
216
+ "peer inline-flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-[5px] border-2 transition-all duration-150",
217
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
218
+ "disabled:cursor-not-allowed disabled:opacity-50",
219
+ filled ? `${COLOR_CLASSES[color]} shadow-sm` : "border-muted-foreground/40 bg-background hover:border-muted-foreground/60",
220
+ className
221
+ ),
222
+ ...props,
223
+ children: indeterminate ? /* @__PURE__ */ jsx(Minus, { className: "h-3.5 w-3.5", strokeWidth: 3 }) : checked && /* @__PURE__ */ jsx(Check, { className: "h-3.5 w-3.5", strokeWidth: 3 })
224
+ }
225
+ );
226
+ }
227
+ );
228
+ Checkbox.displayName = "Checkbox";
190
229
  function DataTable({
191
230
  columns,
192
231
  data,
@@ -196,8 +235,13 @@ function DataTable({
196
235
  onRowClick,
197
236
  variant = "card",
198
237
  compact = false,
199
- sortIndicator
238
+ sortIndicator,
239
+ selectable = false,
240
+ selectedIds,
241
+ onSelectedIdsChange,
242
+ getRowId
200
243
  }) {
244
+ const t = useTranslation();
201
245
  const isCard = variant === "card";
202
246
  const wrapperCls = isCard ? "overflow-hidden rounded-lg border bg-card shadow-sm" : variant === "bare" ? "" : "overflow-hidden rounded-lg border";
203
247
  const headerCls = isCard ? "border-b bg-muted/50" : variant === "bare" ? "border-b bg-muted/30 rounded-none" : "border-b bg-muted/30";
@@ -206,9 +250,60 @@ function DataTable({
206
250
  const tableCls = compact ? "w-full text-xs min-w-max" : "w-full text-sm min-w-max";
207
251
  const rowHoverCls = isCard ? "hover:bg-muted/30" : "hover:bg-muted/20";
208
252
  const [sorting, setSorting] = React2.useState([]);
253
+ const rowId = React2.useCallback(
254
+ (row) => getRowId ? getRowId(row) : String(row.id ?? ""),
255
+ [getRowId]
256
+ );
257
+ const selected = React2.useMemo(() => new Set(selectedIds ?? []), [selectedIds]);
258
+ const pageIds = React2.useMemo(() => data.map(rowId), [data, rowId]);
259
+ const selectedOnPage = pageIds.filter((id) => selected.has(id)).length;
260
+ const allOnPageSelected = pageIds.length > 0 && selectedOnPage === pageIds.length;
261
+ const toggleRow = React2.useCallback((id) => {
262
+ const next = new Set(selected);
263
+ if (next.has(id)) next.delete(id);
264
+ else next.add(id);
265
+ onSelectedIdsChange?.([...next]);
266
+ }, [selected, onSelectedIdsChange]);
267
+ const toggleAllOnPage = React2.useCallback(() => {
268
+ const next = new Set(selected);
269
+ if (allOnPageSelected) pageIds.forEach((id) => next.delete(id));
270
+ else pageIds.forEach((id) => next.add(id));
271
+ onSelectedIdsChange?.([...next]);
272
+ }, [selected, allOnPageSelected, pageIds, onSelectedIdsChange]);
273
+ const selectionColumn = React2.useMemo(() => ({
274
+ id: "__select__",
275
+ enableSorting: false,
276
+ header: () => /* @__PURE__ */ jsx(
277
+ Checkbox,
278
+ {
279
+ checked: allOnPageSelected,
280
+ indeterminate: selectedOnPage > 0 && !allOnPageSelected,
281
+ onChange: toggleAllOnPage,
282
+ "aria-label": t("crud.list.selectAllRows")
283
+ }
284
+ ),
285
+ cell: ({ row }) => {
286
+ const id = rowId(row.original);
287
+ return /* @__PURE__ */ jsx(
288
+ Checkbox,
289
+ {
290
+ checked: selected.has(id),
291
+ onChange: () => toggleRow(id),
292
+ "aria-label": t("crud.list.selectRow")
293
+ }
294
+ );
295
+ }
296
+ // `toggleAllOnPage` is in the deps because it closes over the CURRENT page's
297
+ // ids: turning the page with nothing selected changes no other dep, and the
298
+ // memo would hand the header a button that ticks the previous page's rows.
299
+ }), [allOnPageSelected, selectedOnPage, selected, rowId, toggleRow, toggleAllOnPage, t]);
300
+ const allColumns = React2.useMemo(
301
+ () => selectable ? [selectionColumn, ...columns] : columns,
302
+ [selectable, selectionColumn, columns]
303
+ );
209
304
  const table = useReactTable({
210
305
  data,
211
- columns,
306
+ columns: allColumns,
212
307
  getCoreRowModel: getCoreRowModel(),
213
308
  getSortedRowModel: getSortedRowModel(),
214
309
  onSortingChange: setSorting,
@@ -216,8 +311,8 @@ function DataTable({
216
311
  });
217
312
  if (loading) {
218
313
  return /* @__PURE__ */ jsx("div", { className: wrapperCls, children: /* @__PURE__ */ jsx("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxs("table", { className: tableCls, children: [
219
- /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { className: headerCls, children: columns.map((_, i) => /* @__PURE__ */ jsx("th", { className: thCls, children: /* @__PURE__ */ jsx("div", { className: "h-3.5 w-20 animate-pulse rounded bg-muted" }) }, i)) }) }),
220
- /* @__PURE__ */ jsx("tbody", { children: Array.from({ length: skeletonRows }).map((_, i) => /* @__PURE__ */ jsx("tr", { className: "border-b last:border-0", children: columns.map((_2, j) => /* @__PURE__ */ jsx("td", { className: tdCls, children: /* @__PURE__ */ jsx("div", { className: "h-3.5 w-full animate-pulse rounded bg-muted" }) }, j)) }, i)) })
314
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { className: headerCls, children: allColumns.map((_, i) => /* @__PURE__ */ jsx("th", { className: thCls, children: /* @__PURE__ */ jsx("div", { className: "h-3.5 w-20 animate-pulse rounded bg-muted" }) }, i)) }) }),
315
+ /* @__PURE__ */ jsx("tbody", { children: Array.from({ length: skeletonRows }).map((_, i) => /* @__PURE__ */ jsx("tr", { className: "border-b last:border-0", children: allColumns.map((_2, j) => /* @__PURE__ */ jsx("td", { className: tdCls, children: /* @__PURE__ */ jsx("div", { className: "h-3.5 w-full animate-pulse rounded bg-muted" }) }, j)) }, i)) })
221
316
  ] }) }) });
222
317
  }
223
318
  return /* @__PURE__ */ jsx("div", { className: wrapperCls, children: /* @__PURE__ */ jsx("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxs("table", { className: tableCls, children: [
@@ -226,7 +321,7 @@ function DataTable({
226
321
  return /* @__PURE__ */ jsx(
227
322
  "th",
228
323
  {
229
- className: thCls,
324
+ className: cn(thCls, header.column.id === "__select__" && "w-10 pr-0"),
230
325
  children: header.isPlaceholder ? null : sortIndicator?.columnId === header.column.id ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 text-foreground", children: [
231
326
  flexRender(header.column.columnDef.header, header.getContext()),
232
327
  sortIndicator.dir === "desc" ? /* @__PURE__ */ jsx(ArrowDown, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx(ArrowUp, { className: "h-3 w-3" })
@@ -245,18 +340,34 @@ function DataTable({
245
340
  header.id
246
341
  );
247
342
  }) }, headerGroup.id)) }),
248
- /* @__PURE__ */ jsx("tbody", { children: table.getRowModel().rows?.length ? table.getRowModel().rows.map((row) => /* @__PURE__ */ jsx(
249
- "tr",
250
- {
251
- className: cn(
252
- `border-b last:border-0 transition-colors ${rowHoverCls}`,
253
- onRowClick && "cursor-pointer"
254
- ),
255
- onClick: () => onRowClick?.(row.original),
256
- children: row.getVisibleCells().map((cell) => /* @__PURE__ */ jsx("td", { className: tdCls, children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id))
257
- },
258
- row.id
259
- )) : /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: columns.length, className: "h-64 px-6 text-center align-middle text-muted-foreground", children: emptyMessage }) }) })
343
+ /* @__PURE__ */ jsx("tbody", { children: table.getRowModel().rows?.length ? table.getRowModel().rows.map((row) => {
344
+ const isSelected = selectable && selected.has(rowId(row.original));
345
+ return /* @__PURE__ */ jsx(
346
+ "tr",
347
+ {
348
+ className: cn(
349
+ `border-b last:border-0 transition-colors ${rowHoverCls}`,
350
+ onRowClick && "cursor-pointer",
351
+ isSelected && "bg-muted/40"
352
+ ),
353
+ onClick: () => onRowClick?.(row.original),
354
+ "data-selected": isSelected || void 0,
355
+ children: row.getVisibleCells().map((cell) => {
356
+ const isSelectCell = cell.column.id === "__select__";
357
+ return /* @__PURE__ */ jsx(
358
+ "td",
359
+ {
360
+ className: cn(tdCls, isSelectCell && "w-10 pr-0"),
361
+ onClick: isSelectCell ? (e) => e.stopPropagation() : void 0,
362
+ children: flexRender(cell.column.columnDef.cell, cell.getContext())
363
+ },
364
+ cell.id
365
+ );
366
+ })
367
+ },
368
+ row.id
369
+ );
370
+ }) : /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: allColumns.length, className: "h-64 px-6 text-center align-middle text-muted-foreground", children: emptyMessage }) }) })
260
371
  ] }) }) });
261
372
  }
262
373
  function Skeleton({
@@ -332,6 +443,6 @@ function SegmentedControl({
332
443
  );
333
444
  }
334
445
 
335
- export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, DataTable, Dropdown, DropdownCheckboxItem, DropdownContent, DropdownGroup, DropdownItem, DropdownLabel, DropdownPortal, DropdownRadioGroup, DropdownRadioItem, DropdownSeparator, DropdownShortcut, DropdownSub, DropdownSubContent, DropdownSubTrigger, DropdownTrigger, SegmentedControl, Skeleton, TableSkeleton };
336
- //# sourceMappingURL=chunk-6V5MGYXH.js.map
337
- //# sourceMappingURL=chunk-6V5MGYXH.js.map
446
+ export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, DataTable, Dropdown, DropdownCheckboxItem, DropdownContent, DropdownGroup, DropdownItem, DropdownLabel, DropdownPortal, DropdownRadioGroup, DropdownRadioItem, DropdownSeparator, DropdownShortcut, DropdownSub, DropdownSubContent, DropdownSubTrigger, DropdownTrigger, SegmentedControl, Skeleton, TableSkeleton };
447
+ //# sourceMappingURL=chunk-JGJNRNQW.js.map
448
+ //# sourceMappingURL=chunk-JGJNRNQW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/primitives/card.tsx","../src/primitives/dropdown.tsx","../src/primitives/checkbox.tsx","../src/primitives/data-table.tsx","../src/primitives/skeleton.tsx","../src/primitives/segmented-control.tsx"],"names":["React","jsx","React3","Check","React4","jsxs","_"],"mappings":";;;;;;;;AAIA,IAAM,IAAA,GAAaA,kBAGjB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,+EAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,IAAA,CAAK,WAAA,GAAc,MAAA;AAEnB,IAAM,UAAA,GAAmBA,kBAGvB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,SAAS,CAAA;AAAA,IACrD,GAAG;AAAA;AACN,CACD;AACD,UAAA,CAAW,WAAA,GAAc,YAAA;AAEzB,IAAM,SAAA,GAAkBA,kBAGtB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA;AAAA,EAAC,IAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,oDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,SAAA,CAAU,WAAA,GAAc,WAAA;AAExB,IAAM,eAAA,GAAwBA,kBAG5B,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA;AAAA,EAAC,GAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA,CAAG,+BAAA,EAAiC,SAAS,CAAA;AAAA,IACvD,GAAG;AAAA;AACN,CACD;AACD,eAAA,CAAgB,WAAA,GAAc,iBAAA;AAE9B,IAAM,cAAoBA,MAAA,CAAA,UAAA,CAGxB,CAAC,EAAE,SAAA,EAAW,GAAG,OAAM,EAAG,GAAA,yBACzB,KAAA,EAAA,EAAI,GAAA,EAAU,WAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA,EAAI,GAAG,OAAO,CACjE;AACD,WAAA,CAAY,WAAA,GAAc,aAAA;AAE1B,IAAM,UAAA,GAAmBA,kBAGvB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA,CAAG,4BAAA,EAA8B,SAAS,CAAA;AAAA,IACpD,GAAG;AAAA;AACN,CACD;AACD,UAAA,CAAW,WAAA,GAAc,YAAA;ACtEzB,IAAM,QAAA,GAAiC,qBAAA,CAAA;AAEvC,IAAM,eAAA,GAAwC,qBAAA,CAAA;AAE9C,IAAM,aAAA,GAAsC,qBAAA,CAAA;AAE5C,IAAM,cAAA,GAAuC,qBAAA,CAAA;AAE7C,IAAM,WAAA,GAAoC,qBAAA,CAAA;AAE1C,IAAM,kBAAA,GAA2C,qBAAA,CAAA;AAEjD,IAAM,kBAAA,GAA2B,MAAA,CAAA,UAAA,CAK/B,CAAC,EAAE,SAAA,EAAW,OAAO,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC3C,IAAA;AAAA,EAAuB,qBAAA,CAAA,UAAA;AAAA,EAAtB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,wIAAA;AAAA,MACA,KAAA,IAAS,MAAA;AAAA,MACT;AAAA,KACF;AAAA,IACC,GAAG,KAAA;AAAA,IAEH,QAAA,EAAA;AAAA,MAAA,QAAA;AAAA,sBACDC,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,iBAAA,EAAkB;AAAA;AAAA;AAC5C,CACD;AACD,kBAAA,CAAmB,cAAoC,qBAAA,CAAA,UAAA,CAAW,WAAA;AAElE,IAAM,qBAA2B,MAAA,CAAA,UAAA,CAG/B,CAAC,EAAE,SAAA,EAAW,GAAG,OAAM,EAAG,GAAA;AAAA;AAAA;AAAA;AAAA,kBAI1BA,GAAAA,CAAuB,qBAAA,CAAA,MAAA,EAAtB,EACC,QAAA,kBAAAA,GAAAA;AAAA,IAAuB,qBAAA,CAAA,UAAA;AAAA,IAAtB;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,0cAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN,EACF;AAAA,CACD;AACD,kBAAA,CAAmB,cAAoC,qBAAA,CAAA,UAAA,CAAW,WAAA;AAElE,IAAM,eAAA,GAAwB,MAAA,CAAA,UAAA,CAG5B,CAAC,EAAE,WAAW,UAAA,GAAa,CAAA,EAAG,GAAG,KAAA,IAAS,GAAA,qBAC1CA,GAAAA,CAAuB,qBAAA,CAAA,MAAA,EAAtB,EACC,QAAA,kBAAAA,GAAAA;AAAA,EAAuB,qBAAA,CAAA,OAAA;AAAA,EAAtB;AAAA,IACC,GAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,0cAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CAAA,EACF,CACD;AACD,eAAA,CAAgB,cAAoC,qBAAA,CAAA,OAAA,CAAQ,WAAA;AAE5D,IAAM,YAAA,GAAqB,MAAA,CAAA,UAAA,CAKzB,CAAC,EAAE,SAAA,EAAW,OAAO,GAAG,KAAA,EAAM,EAAG,GAAA,qBACjCA,GAAAA;AAAA,EAAuB,qBAAA,CAAA,IAAA;AAAA,EAAtB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,uMAAA;AAAA,MACA,KAAA,IAAS,MAAA;AAAA,MACT;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,YAAA,CAAa,cAAoC,qBAAA,CAAA,IAAA,CAAK,WAAA;AAEtD,IAAM,oBAAA,GAA6B,MAAA,CAAA,UAAA,CAGjC,CAAC,EAAE,SAAA,EAAW,UAAU,OAAA,EAAS,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC7C,IAAA;AAAA,EAAuB,qBAAA,CAAA,YAAA;AAAA,EAAtB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,4MAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAA;AAAA,IACC,GAAG,KAAA;AAAA,IAEJ,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8DAAA,EACd,0BAAAA,GAAAA,CAAuB,qBAAA,CAAA,aAAA,EAAtB,EACC,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,SAAA,EAAU,GAC7B,CAAA,EACF,CAAA;AAAA,MACC;AAAA;AAAA;AACH,CACD;AACD,oBAAA,CAAqB,cACG,qBAAA,CAAA,YAAA,CAAa,WAAA;AAErC,IAAM,iBAAA,GAA0B,kBAG9B,CAAC,EAAE,WAAW,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,qBACpC,IAAA;AAAA,EAAuB,qBAAA,CAAA,SAAA;AAAA,EAAtB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,4MAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG,KAAA;AAAA,IAEJ,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8DAAA,EACd,0BAAAA,GAAAA,CAAuB,qBAAA,CAAA,aAAA,EAAtB,EACC,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,sBAAA,EAAuB,GAC3C,CAAA,EACF,CAAA;AAAA,MACC;AAAA;AAAA;AACH,CACD;AACD,iBAAA,CAAkB,cAAoC,qBAAA,CAAA,SAAA,CAAU,WAAA;AAEhE,IAAM,aAAA,GAAsB,MAAA,CAAA,UAAA,CAK1B,CAAC,EAAE,SAAA,EAAW,OAAO,GAAG,KAAA,EAAM,EAAG,GAAA,qBACjCA,GAAAA;AAAA,EAAuB,qBAAA,CAAA,KAAA;AAAA,EAAtB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,mCAAA;AAAA,MACA,KAAA,IAAS,MAAA;AAAA,MACT;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,aAAA,CAAc,cAAoC,qBAAA,CAAA,KAAA,CAAM,WAAA;AAExD,IAAM,iBAAA,GAA0B,kBAG9B,CAAC,EAAE,WAAW,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1BA,GAAAA;AAAA,EAAuB,qBAAA,CAAA,SAAA;AAAA,EAAtB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA,CAAG,0BAAA,EAA4B,SAAS,CAAA;AAAA,IAClD,GAAG;AAAA;AACN,CACD;AACD,iBAAA,CAAkB,cAAoC,qBAAA,CAAA,SAAA,CAAU,WAAA;AAEhE,IAAM,mBAAmB,CAAC;AAAA,EACxB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,KAA6C;AAC3C,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,4CAAA,EAA8C,SAAS,CAAA;AAAA,MACpE,GAAG;AAAA;AAAA,GACN;AAEJ;AACA,gBAAA,CAAiB,WAAA,GAAc,kBAAA;AClK/B,IAAM,aAAA,GAA+C;AAAA,EACnD,OAAA,EAAS,mDAAA;AAAA,EACT,OAAA,EAAS,0EAAA;AAAA,EACT,OAAA,EAAS,sCAAA;AAAA,EACT,WAAA,EAAa;AACf,CAAA;AAEA,IAAM,QAAA,GAAiBC,MAAA,CAAA,UAAA;AAAA,EACrB,CAAC,EAAE,OAAA,GAAU,KAAA,EAAO,UAAU,QAAA,EAAU,SAAA,EAAW,KAAA,GAAQ,SAAA,EAAW,IAAI,aAAA,GAAgB,KAAA,EAAO,GAAG,KAAA,IAAS,GAAA,KAAQ;AACnH,IAAA,MAAM,SAAS,OAAA,IAAW,aAAA;AAC1B,IAAA,uBACED,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,EAAA;AAAA,QACA,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,UAAA;AAAA,QACL,cAAA,EAAc,gBAAgB,OAAA,GAAU,OAAA;AAAA,QACxC,QAAA;AAAA,QACA,OAAA,EAAS,MAAM,QAAA,GAAW,CAAC,OAAO,CAAA;AAAA,QAClC,SAAA,EAAW,EAAA;AAAA,UACT,4HAAA;AAAA,UACA,0IAAA;AAAA,UACA,iDAAA;AAAA,UACA,MAAA,GACI,CAAA,EAAG,aAAA,CAAc,KAAK,CAAC,CAAA,UAAA,CAAA,GACvB,2EAAA;AAAA,UACJ;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,0CACGA,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,eAAc,WAAA,EAAa,CAAA,EAAG,CAAA,GAC/C,OAAA,oBAAWA,GAAAA,CAACE,KAAAA,EAAA,EAAM,SAAA,EAAU,aAAA,EAAc,aAAa,CAAA,EAAG;AAAA;AAAA,KAChE;AAAA,EAEJ;AACF;AACA,QAAA,CAAS,WAAA,GAAc,UAAA;ACPvB,SAAS,SAAA,CAAyB;AAAA,EAChC,OAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,YAAA,GAAe,CAAA;AAAA,EACf,YAAA,GAAe,aAAA;AAAA,EACf,UAAA;AAAA,EACA,OAAA,GAAU,MAAA;AAAA,EACV,OAAA,GAAU,KAAA;AAAA,EACV,aAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,WAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAA,EAAkC;AAChC,EAAA,MAAM,IAAI,cAAA,EAAe;AACzB,EAAA,MAAM,SAAS,OAAA,KAAY,MAAA;AAI3B,EAAA,MAAM,UAAA,GAAa,MAAA,GACf,qDAAA,GACA,OAAA,KAAY,SACV,EAAA,GACA,mCAAA;AAIN,EAAA,MAAM,SAAA,GAAY,MAAA,GACd,sBAAA,GACA,OAAA,KAAY,SACV,mCAAA,GACA,sBAAA;AACN,EAAA,MAAM,KAAA,GAAQ,UAAU,qEAAA,GAAwE,yDAAA;AAChG,EAAA,MAAM,KAAA,GAAQ,UAAU,kCAAA,GAAqC,wBAAA;AAC7D,EAAA,MAAM,QAAA,GAAW,UAAU,0BAAA,GAA6B,0BAAA;AACxD,EAAA,MAAM,WAAA,GAAc,SAAS,mBAAA,GAAsB,mBAAA;AACnD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUC,MAAA,CAAA,QAAA,CAAuB,EAAE,CAAA;AAE7D,EAAA,MAAM,KAAA,GAAcA,MAAA,CAAA,WAAA;AAAA,IAClB,CAAC,QAAgB,QAAA,GAAW,QAAA,CAAS,GAAG,CAAA,GAAI,MAAA,CAAQ,GAAA,CAAyB,EAAA,IAAM,EAAE,CAAA;AAAA,IACrF,CAAC,QAAQ;AAAA,GACX;AACA,EAAA,MAAM,QAAA,GAAiBA,MAAA,CAAA,OAAA,CAAQ,MAAM,IAAI,GAAA,CAAI,WAAA,IAAe,EAAE,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAC9E,EAAA,MAAM,OAAA,GAAgBA,MAAA,CAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAClE,EAAA,MAAM,cAAA,GAAiB,QAAQ,MAAA,CAAO,CAAC,OAAO,QAAA,CAAS,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,MAAA;AAChE,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,mBAAmB,OAAA,CAAQ,MAAA;AAE3E,EAAA,MAAM,SAAA,GAAkBA,MAAA,CAAA,WAAA,CAAY,CAAC,EAAA,KAAe;AAClD,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC7B,IAAA,IAAI,KAAK,GAAA,CAAI,EAAE,CAAA,EAAG,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,SAC3B,IAAA,CAAK,IAAI,EAAE,CAAA;AAChB,IAAA,mBAAA,GAAsB,CAAC,GAAG,IAAI,CAAC,CAAA;AAAA,EACjC,CAAA,EAAG,CAAC,QAAA,EAAU,mBAAmB,CAAC,CAAA;AAIlC,EAAA,MAAM,eAAA,GAAwBA,mBAAY,MAAM;AAC9C,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC7B,IAAA,IAAI,iBAAA,UAA2B,OAAA,CAAQ,CAAC,OAAO,IAAA,CAAK,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,iBACjD,OAAA,CAAQ,CAAC,OAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA;AACzC,IAAA,mBAAA,GAAsB,CAAC,GAAG,IAAI,CAAC,CAAA;AAAA,EACjC,GAAG,CAAC,QAAA,EAAU,iBAAA,EAAmB,OAAA,EAAS,mBAAmB,CAAC,CAAA;AAI9D,EAAA,MAAM,eAAA,GAAwBA,eAAkC,OAAO;AAAA,IACrE,EAAA,EAAI,YAAA;AAAA,IACJ,aAAA,EAAe,KAAA;AAAA,IACf,MAAA,EAAQ,sBACNH,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,iBAAA;AAAA,QACT,aAAA,EAAe,cAAA,GAAiB,CAAA,IAAK,CAAC,iBAAA;AAAA,QACtC,QAAA,EAAU,eAAA;AAAA,QACV,YAAA,EAAY,EAAE,yBAAyB;AAAA;AAAA,KACzC;AAAA,IAEF,IAAA,EAAM,CAAC,EAAE,GAAA,EAAI,KAAM;AACjB,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AAC7B,MAAA,uBACEA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAAA,UACxB,QAAA,EAAU,MAAM,SAAA,CAAU,EAAE,CAAA;AAAA,UAC5B,YAAA,EAAY,EAAE,qBAAqB;AAAA;AAAA,OACrC;AAAA,IAEJ;AAAA;AAAA;AAAA;AAAA,GAIF,CAAA,EAAI,CAAC,iBAAA,EAAmB,cAAA,EAAgB,UAAU,KAAA,EAAO,SAAA,EAAW,eAAA,EAAiB,CAAC,CAAC,CAAA;AAEvF,EAAA,MAAM,UAAA,GAAmBG,MAAA,CAAA,OAAA;AAAA,IACvB,MAAO,UAAA,GAAa,CAAC,eAAA,EAAiB,GAAG,OAAO,CAAA,GAAI,OAAA;AAAA,IACpD,CAAC,UAAA,EAAY,eAAA,EAAiB,OAAO;AAAA,GACvC;AAEA,EAAA,MAAM,QAAQ,aAAA,CAAc;AAAA,IAC1B,IAAA;AAAA,IACA,OAAA,EAAS,UAAA;AAAA,IACT,iBAAiB,eAAA,EAAgB;AAAA,IACjC,mBAAmB,iBAAA,EAAkB;AAAA,IACrC,eAAA,EAAiB,UAAA;AAAA,IACjB,KAAA,EAAO,EAAE,OAAA;AAAQ,GAClB,CAAA;AAED,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACEH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,YACd,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACf,QAAA,kBAAAI,IAAAA,CAAC,OAAA,EAAA,EAAM,WAAW,QAAA,EAChB,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,OAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,SAAA,EACZ,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBAClBA,IAAC,IAAA,EAAA,EAAW,SAAA,EAAW,KAAA,EACrB,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EAA4C,CAAA,EAAA,EADpD,CAET,CACD,CAAA,EACH,CAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,OAAA,EAAA,EACE,gBAAM,IAAA,CAAK,EAAE,QAAQ,YAAA,EAAc,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBAC5CA,GAAAA,CAAC,IAAA,EAAA,EAAW,WAAU,wBAAA,EACnB,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAACK,IAAG,CAAA,qBAClBL,IAAC,IAAA,EAAA,EAAW,SAAA,EAAW,OACrB,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAA8C,CAAA,EAAA,EADtD,CAET,CACD,CAAA,EAAA,EALM,CAMT,CACD,CAAA,EACH;AAAA,KAAA,EACF,GACA,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,YACd,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACf,QAAA,kBAAAI,IAAAA,CAAC,OAAA,EAAA,EAAM,WAAW,QAAA,EAChB,QAAA,EAAA;AAAA,oBAAAJ,IAAC,OAAA,EAAA,EACE,QAAA,EAAA,KAAA,CAAM,eAAA,EAAgB,CAAE,IAAI,CAAC,WAAA,qBAC5BA,GAAAA,CAAC,QAAwB,SAAA,EAAW,SAAA,EACjC,sBAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACnC,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,WAAA,EAAY;AACzC,MAAA,uBACEA,GAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,WAAW,EAAA,CAAG,KAAA,EAAO,OAAO,MAAA,CAAO,EAAA,KAAO,gBAAgB,WAAW,CAAA;AAAA,UAEpE,QAAA,EAAA,MAAA,CAAO,aAAA,GAAgB,IAAA,GAAO,aAAA,EAAe,QAAA,KAAa,MAAA,CAAO,MAAA,CAAO,EAAA,mBACvEI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EACb,QAAA,EAAA;AAAA,YAAA,UAAA,CAAW,OAAO,MAAA,CAAO,SAAA,CAAU,MAAA,EAAQ,MAAA,CAAO,YAAY,CAAA;AAAA,YAC9D,aAAA,CAAc,GAAA,KAAQ,MAAA,mBACnBJ,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU,CAAA,mBAC/BA,GAAAA,CAAC,OAAA,EAAA,EAAQ,WAAU,SAAA,EAAU;AAAA,WAAA,EACnC,CAAA,GACE,MAAA,CAAO,MAAA,CAAO,UAAA,qBAChBI,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,iEAAA;AAAA,cACV,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,uBAAA,EAAwB;AAAA,cAE9C,QAAA,EAAA;AAAA,gBAAA,UAAA,CAAW,OAAO,MAAA,CAAO,SAAA,CAAU,MAAA,EAAQ,MAAA,CAAO,YAAY,CAAA;AAAA,gBAC9D,MAAA,KAAW,wBACVJ,GAAAA,CAAC,WAAQ,SAAA,EAAU,SAAA,EAAU,IAC3B,MAAA,KAAW,MAAA,mBACbA,GAAAA,CAAC,SAAA,EAAA,EAAU,WAAU,SAAA,EAAU,CAAA,mBAE/BA,GAAAA,CAAC,WAAA,EAAA,EAAY,WAAU,oBAAA,EAAqB;AAAA;AAAA;AAAA,WAEhD,GAEA,WAAW,MAAA,CAAO,MAAA,CAAO,UAAU,MAAA,EAAQ,MAAA,CAAO,YAAY;AAAA,SAAA;AAAA,QAzB3D,MAAA,CAAO;AAAA,OA2Bd;AAAA,IAEJ,CAAC,CAAA,EAAA,EAlCM,WAAA,CAAY,EAmCrB,CACD,CAAA,EACH,CAAA;AAAA,oBACAA,GAAAA,CAAC,OAAA,EAAA,EACE,QAAA,EAAA,KAAA,CAAM,aAAY,CAAE,IAAA,EAAM,MAAA,GACzB,KAAA,CAAM,WAAA,EAAY,CAAE,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACpC,MAAA,MAAM,aAAa,UAAA,IAAc,QAAA,CAAS,IAAI,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAC,CAAA;AACjE,MAAA,uBACEA,GAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAW,EAAA;AAAA,YACT,4CAA4C,WAAW,CAAA,CAAA;AAAA,YACvD,UAAA,IAAc,gBAAA;AAAA,YACd,UAAA,IAAc;AAAA,WAChB;AAAA,UACA,OAAA,EAAS,MAAM,UAAA,GAAa,GAAA,CAAI,QAAQ,CAAA;AAAA,UACxC,iBAAe,UAAA,IAAc,MAAA;AAAA,UAE5B,QAAA,EAAA,GAAA,CAAI,eAAA,EAAgB,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS;AACnC,YAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,EAAA,KAAO,YAAA;AACxC,YAAA,uBACEA,GAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAW,EAAA,CAAG,KAAA,EAAO,YAAA,IAAgB,WAAW,CAAA;AAAA,gBAIhD,SAAS,YAAA,GAAe,CAAC,CAAA,KAAM,CAAA,CAAE,iBAAgB,GAAI,MAAA;AAAA,gBAEpD,qBAAW,IAAA,CAAK,MAAA,CAAO,UAAU,IAAA,EAAM,IAAA,CAAK,YAAY;AAAA,eAAA;AAAA,cAPpD,IAAA,CAAK;AAAA,aAQZ;AAAA,UAEJ,CAAC;AAAA,SAAA;AAAA,QAvBI,GAAA,CAAI;AAAA,OAwBX;AAAA,IAEJ,CAAC,CAAA,mBAEDA,GAAAA,CAAC,QAKC,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAG,OAAA,EAAS,WAAW,MAAA,EAAQ,SAAA,EAAU,0DAAA,EACvC,QAAA,EAAA,YAAA,EACH,GACF,CAAA,EAEJ;AAAA,GAAA,EACF,GACA,CAAA,EACF,CAAA;AAEJ;ACtRA,SAAS,QAAA,CAAS;AAAA,EAChB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyC;AACvC,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,mCAAA,EAAqC,SAAS,CAAA;AAAA,MAC3D,GAAG;AAAA;AAAA,GACN;AAEJ;AAMA,SAAS,cAAc,EAAE,OAAA,GAAU,CAAA,EAAG,IAAA,GAAO,GAAE,EAAwC;AACrF,EAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,oBAAAJ,GAAAA,CAAC,SAAI,SAAA,EAAU,6CAAA,EACZ,gBAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,OAAA,EAAS,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,sBACvCA,GAAAA,CAAC,YAAiB,SAAA,EAAU,2CAAA,EAAA,EAAb,CAAyD,CACzE,CAAA,EACH,CAAA;AAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YACZ,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACpCA,GAAAA,CAAC,KAAA,EAAA,EAAY,SAAA,EAAU,qCAAA,EACpB,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAACK,EAAAA,EAAG,sBACvCL,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAW,EAAA;AAAA,UACT,aAAA;AAAA,UACA,CAAA,KAAM,IAAI,UAAA,GAAa;AAAA;AACzB,OAAA;AAAA,MAJK;AAAA,KAMR,CAAA,EAAA,EATO,CAUV,CACD,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;ACxBA,IAAM,IAAA,GAAoE;AAAA,EACxE,EAAA,EAAI,EAAE,SAAA,EAAW,UAAA,EAAY,SAAS,gBAAA,EAAiB;AAAA,EACvD,EAAA,EAAI,EAAE,SAAA,EAAW,UAAA,EAAY,SAAS,cAAA;AACxC,CAAA;AAQO,SAAS,gBAAA,CAA4C;AAAA,EAC1D,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,IAAA,GAAO,IAAA;AAAA,EAAM,SAAA;AAAA,EAAW,GAAG;AACvD,CAAA,EAA6B;AAC3B,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAO,OAAO,CAAA,KAAM,QAAA,GAAW,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,KAAM,CAAE,CAAA;AACrF,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAY,KAAK,YAAY,CAAA;AAAA,MAC7B,SAAA,EAAW,EAAA;AAAA,QACT,0FAAA;AAAA,QACA,IAAA,CAAK,IAAI,CAAA,CAAE,SAAA;AAAA,QACX;AAAA,OACF;AAAA,MAEC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,QAAA,MAAM,MAAA,GAAS,KAAK,KAAA,KAAU,KAAA;AAC9B,QAAA,uBACEA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,IAAA,EAAK,KAAA;AAAA,YACL,eAAA,EAAe,MAAA;AAAA,YACf,OAAA,EAAS,MAAM,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAAA,YAClC,SAAA,EAAW,EAAA;AAAA,cACT,yEAAA;AAAA,cACA,IAAA,CAAK,IAAI,CAAA,CAAE,OAAA;AAAA,cACX,SAAS,+BAAA,GAAkC;AAAA,aAC7C;AAAA,YAEC,QAAA,EAAA,IAAA,CAAK;AAAA,WAAA;AAAA,UAXD,IAAA,CAAK;AAAA,SAYZ;AAAA,MAEJ,CAAC;AAAA;AAAA,GACH;AAEJ","file":"chunk-JGJNRNQW.js","sourcesContent":["import * as React from 'react'\n\nimport { cn } from '../lib/cn'\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'fayz-glass-surface rounded-card border bg-card text-card-foreground shadow-sm',\n className\n )}\n {...props}\n />\n))\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex flex-col space-y-1 p-4', className)}\n {...props}\n />\n))\nCardHeader.displayName = 'CardHeader'\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n 'text-sm font-semibold leading-tight tracking-tight',\n className\n )}\n {...props}\n />\n))\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn('text-xs text-muted-foreground', className)}\n {...props}\n />\n))\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-4 pt-0', className)} {...props} />\n))\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex items-center p-4 pt-0', className)}\n {...props}\n />\n))\nCardFooter.displayName = 'CardFooter'\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","import * as React from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { Check, ChevronRight, Circle } from 'lucide-react'\n\nimport { cn } from '../lib/cn'\n\nconst Dropdown = DropdownMenuPrimitive.Root\n\nconst DropdownTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownGroup = DropdownMenuPrimitive.Group\n\nconst DropdownPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownSub = DropdownMenuPrimitive.Sub\n\nconst DropdownRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center rounded-button px-2 py-1.5 text-sm outline-none focus:bg-muted data-[state=open]:bg-muted',\n inset && 'pl-8',\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n // Portaled, like DropdownContent. Without it the submenu renders inside the\n // parent panel's DOM — and that panel is `overflow-hidden`, so the submenu\n // was clipped to its box: a flyout you could open and never reach.\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'fayz-glass-surface z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'fayz-glass-surface z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-button px-2 py-1.5 text-sm outline-none transition-colors focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n inset && 'pl-8',\n className\n )}\n {...props}\n />\n))\nDropdownItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-button py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-button py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n 'px-2 py-1.5 text-sm font-semibold',\n inset && 'pl-8',\n className\n )}\n {...props}\n />\n))\nDropdownLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n))\nDropdownSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn('ml-auto text-xs tracking-widest opacity-60', className)}\n {...props}\n />\n )\n}\nDropdownShortcut.displayName = 'DropdownShortcut'\n\nexport {\n Dropdown,\n DropdownTrigger,\n DropdownContent,\n DropdownItem,\n DropdownCheckboxItem,\n DropdownRadioItem,\n DropdownLabel,\n DropdownSeparator,\n DropdownShortcut,\n DropdownGroup,\n DropdownPortal,\n DropdownSub,\n DropdownSubContent,\n DropdownSubTrigger,\n DropdownRadioGroup,\n}\n","import * as React from 'react'\nimport { Check, Minus } from 'lucide-react'\nimport { cn } from '../lib/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 /** Some but not all of what this box stands for is checked (a table header\n * over a partly selected page). Painted filled with a dash, and announced as\n * \"mixed\" — an empty box would claim nothing is selected. */\n indeterminate?: boolean\n 'aria-label'?: 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, indeterminate = false, ...props }, ref) => {\n const filled = checked || indeterminate\n return (\n <button\n ref={ref}\n id={id}\n type=\"button\"\n role=\"checkbox\"\n aria-checked={indeterminate ? 'mixed' : 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 filled\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 {indeterminate\n ? <Minus className=\"h-3.5 w-3.5\" strokeWidth={3} />\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 {\n type ColumnDef,\n type SortingState,\n flexRender,\n getCoreRowModel,\n getSortedRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport { ArrowUpDown, ArrowUp, ArrowDown } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\n\nimport { cn } from '../lib/cn'\nimport { Checkbox } from './checkbox'\n\ninterface DataTableProps<TData, TValue> {\n columns: ColumnDef<TData, TValue>[]\n data: TData[]\n loading?: boolean\n skeletonRows?: number\n emptyMessage?: React.ReactNode\n onRowClick?: (row: TData) => void\n /** Visual variant: 'card' (white bg, card wrapper — default), 'flat'\n * (transparent bg, still bordered), or 'bare' — no wrapper chrome at all,\n * for a table already inside a card that owns the border and radius. */\n variant?: 'card' | 'flat' | 'bare'\n /** Compact mode: smaller padding and font size */\n compact?: boolean\n /**\n * Qual coluna está ordenada e para que lado, quando quem ordena é OUTRO\n * controle (o menu \"Ordenar\" da barra de ferramentas).\n *\n * Marca o cabeçalho sem torná-lo clicável: com a ordenação fora da tabela,\n * a seta é INFORMAÇÃO (\"está ordenado por isto, assim\"), não um botão. Sem\n * ela, mudar a ordem por um menu que fecha em seguida não deixava rastro\n * nenhum na tela.\n */\n sortIndicator?: { columnId: string; dir: 'asc' | 'desc' }\n /**\n * Turns on the checkbox column on the left. Selection is CONTROLLED by ids:\n * what a bulk action needs is \"which records\", and the table's own row indexes\n * stop meaning that the moment the list refetches, sorts or pages.\n */\n selectable?: boolean\n selectedIds?: string[]\n onSelectedIdsChange?: (ids: string[]) => void\n /** Row identity for selection. Defaults to `row.id`. */\n getRowId?: (row: TData) => string\n}\n\nfunction DataTable<TData, TValue>({\n columns,\n data,\n loading = false,\n skeletonRows = 3,\n emptyMessage = 'No results.',\n onRowClick,\n variant = 'card',\n compact = false,\n sortIndicator,\n selectable = false,\n selectedIds,\n onSelectedIdsChange,\n getRowId,\n}: DataTableProps<TData, TValue>) {\n const t = useTranslation()\n const isCard = variant === 'card'\n // Rounded box and scroll container must be SEPARATE elements: a scroll\n // container paints its content over its own border-radius, which squared\n // the corners the moment a row background met them.\n const wrapperCls = isCard\n ? 'overflow-hidden rounded-lg border bg-card shadow-sm'\n : variant === 'bare'\n ? ''\n : 'overflow-hidden rounded-lg border'\n // 'bare' sits below something else inside its parent card (a search/tools\n // toolbar), so its header is a mid-card band: no rounding, and it keeps the\n // card's own surface rather than starting a new tinted block.\n const headerCls = isCard\n ? 'border-b bg-muted/50'\n : variant === 'bare'\n ? 'border-b bg-muted/30 rounded-none'\n : 'border-b bg-muted/30'\n const thCls = compact ? 'px-3 py-1.5 text-left text-[11px] font-medium text-muted-foreground' : 'px-4 py-2.5 text-left font-medium text-muted-foreground'\n const tdCls = compact ? 'px-3 py-1.5 align-middle text-xs' : 'px-4 py-3 align-middle'\n const tableCls = compact ? 'w-full text-xs min-w-max' : 'w-full text-sm min-w-max'\n const rowHoverCls = isCard ? 'hover:bg-muted/30' : 'hover:bg-muted/20'\n const [sorting, setSorting] = React.useState<SortingState>([])\n\n const rowId = React.useCallback(\n (row: TData) => (getRowId ? getRowId(row) : String((row as { id?: unknown }).id ?? '')),\n [getRowId],\n )\n const selected = React.useMemo(() => new Set(selectedIds ?? []), [selectedIds])\n const pageIds = React.useMemo(() => data.map(rowId), [data, rowId])\n const selectedOnPage = pageIds.filter((id) => selected.has(id)).length\n const allOnPageSelected = pageIds.length > 0 && selectedOnPage === pageIds.length\n\n const toggleRow = React.useCallback((id: string) => {\n const next = new Set(selected)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n onSelectedIdsChange?.([...next])\n }, [selected, onSelectedIdsChange])\n // The header box acts on THIS page only — it must not silently drop a\n // selection made on another page, nor claim to have selected rows that were\n // never loaded.\n const toggleAllOnPage = React.useCallback(() => {\n const next = new Set(selected)\n if (allOnPageSelected) pageIds.forEach((id) => next.delete(id))\n else pageIds.forEach((id) => next.add(id))\n onSelectedIdsChange?.([...next])\n }, [selected, allOnPageSelected, pageIds, onSelectedIdsChange])\n\n // Built here rather than asked of every caller: the column is pure chrome, and\n // a hand-rolled copy per list is where the checkbox column drifts.\n const selectionColumn = React.useMemo<ColumnDef<TData, TValue>>(() => ({\n id: '__select__',\n enableSorting: false,\n header: () => (\n <Checkbox\n checked={allOnPageSelected}\n indeterminate={selectedOnPage > 0 && !allOnPageSelected}\n onChange={toggleAllOnPage}\n aria-label={t('crud.list.selectAllRows')}\n />\n ),\n cell: ({ row }) => {\n const id = rowId(row.original)\n return (\n <Checkbox\n checked={selected.has(id)}\n onChange={() => toggleRow(id)}\n aria-label={t('crud.list.selectRow')}\n />\n )\n },\n // `toggleAllOnPage` is in the deps because it closes over the CURRENT page's\n // ids: turning the page with nothing selected changes no other dep, and the\n // memo would hand the header a button that ticks the previous page's rows.\n }), [allOnPageSelected, selectedOnPage, selected, rowId, toggleRow, toggleAllOnPage, t])\n\n const allColumns = React.useMemo(\n () => (selectable ? [selectionColumn, ...columns] : columns),\n [selectable, selectionColumn, columns],\n )\n\n const table = useReactTable({\n data,\n columns: allColumns,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n onSortingChange: setSorting,\n state: { sorting },\n })\n\n if (loading) {\n return (\n <div className={wrapperCls}>\n <div className=\"overflow-x-auto\">\n <table className={tableCls}>\n <thead>\n <tr className={headerCls}>\n {allColumns.map((_, i) => (\n <th key={i} className={thCls}>\n <div className=\"h-3.5 w-20 animate-pulse rounded bg-muted\" />\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {Array.from({ length: skeletonRows }).map((_, i) => (\n <tr key={i} className=\"border-b last:border-0\">\n {allColumns.map((_, j) => (\n <td key={j} className={tdCls}>\n <div className=\"h-3.5 w-full animate-pulse rounded bg-muted\" />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )\n }\n\n return (\n <div className={wrapperCls}>\n <div className=\"overflow-x-auto\">\n <table className={tableCls}>\n <thead>\n {table.getHeaderGroups().map((headerGroup) => (\n <tr key={headerGroup.id} className={headerCls}>\n {headerGroup.headers.map((header) => {\n const sorted = header.column.getIsSorted()\n return (\n <th\n key={header.id}\n className={cn(thCls, header.column.id === '__select__' && 'w-10 pr-0')}\n >\n {header.isPlaceholder ? null : sortIndicator?.columnId === header.column.id ? (\n <span className=\"inline-flex items-center gap-1 text-foreground\">\n {flexRender(header.column.columnDef.header, header.getContext())}\n {sortIndicator.dir === 'desc'\n ? <ArrowDown className=\"h-3 w-3\" />\n : <ArrowUp className=\"h-3 w-3\" />}\n </span>\n ) : header.column.getCanSort() ? (\n <button\n className=\"flex items-center gap-1 hover:text-foreground transition-colors\"\n onClick={header.column.getToggleSortingHandler()}\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n {sorted === 'asc' ? (\n <ArrowUp className=\"h-3 w-3\" />\n ) : sorted === 'desc' ? (\n <ArrowDown className=\"h-3 w-3\" />\n ) : (\n <ArrowUpDown className=\"h-3 w-3 opacity-40\" />\n )}\n </button>\n ) : (\n flexRender(header.column.columnDef.header, header.getContext())\n )}\n </th>\n )\n })}\n </tr>\n ))}\n </thead>\n <tbody>\n {table.getRowModel().rows?.length ? (\n table.getRowModel().rows.map((row) => {\n const isSelected = selectable && selected.has(rowId(row.original))\n return (\n <tr\n key={row.id}\n className={cn(\n `border-b last:border-0 transition-colors ${rowHoverCls}`,\n onRowClick && 'cursor-pointer',\n isSelected && 'bg-muted/40',\n )}\n onClick={() => onRowClick?.(row.original)}\n data-selected={isSelected || undefined}\n >\n {row.getVisibleCells().map((cell) => {\n const isSelectCell = cell.column.id === '__select__'\n return (\n <td\n key={cell.id}\n className={cn(tdCls, isSelectCell && 'w-10 pr-0')}\n // Ticking a box is not opening the record: without this\n // the row's own click handler fired underneath and the\n // list navigated away from the selection just made.\n onClick={isSelectCell ? (e) => e.stopPropagation() : undefined}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n )\n })}\n </tr>\n )\n })\n ) : (\n <tr>\n {/* Height, not just padding: an empty table that collapses to one\n thin row reads as a rendering glitch rather than \"nothing\n here yet\". `emptyMessage` takes a node so callers can hand in\n a full empty state (icon, headline, create action). */}\n <td colSpan={allColumns.length} className=\"h-64 px-6 text-center align-middle text-muted-foreground\">\n {emptyMessage}\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </div>\n )\n}\n\nexport { DataTable, type DataTableProps }\n","import { cn } from '../lib/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 { cn } from '../lib/cn'\n\nexport interface SegmentedOption<T extends string = string> {\n value: T\n label: React.ReactNode\n}\n\nexport interface SegmentedControlProps<T extends string = string> {\n /** Options as plain values (label = value) or `{ value, label }` objects. */\n options: ReadonlyArray<T | SegmentedOption<T>>\n value: T\n onChange: (value: T) => void\n /** Matches the equivalent Button heights: sm = 26px, md = 30px. */\n size?: 'sm' | 'md'\n className?: string\n 'aria-label'?: string\n}\n\nconst SIZE: Record<'sm' | 'md', { container: string; segment: string }> = {\n sm: { container: 'h-[26px]', segment: 'px-2.5 text-xs' },\n md: { container: 'h-[30px]', segment: 'px-3 text-sm' },\n}\n\n/**\n * Canonical segmented (pill) control — same chrome as Button (rounded-button\n * radius, hairline border + shadow-button bevel on a card surface). Use this for\n * any 7d/30d/90d-style toggle so every surface stays visually consistent instead\n * of hand-rolling a styled toggle group.\n */\nexport function SegmentedControl<T extends string = string>({\n options, value, onChange, size = 'sm', className, ...rest\n}: SegmentedControlProps<T>) {\n const items = options.map((o) => (typeof o === 'string' ? { value: o, label: o } : o)) as SegmentedOption<T>[]\n return (\n <div\n role=\"tablist\"\n aria-label={rest['aria-label']}\n className={cn(\n 'inline-flex items-center rounded-button border border-border bg-card p-0.5 shadow-button',\n SIZE[size].container,\n className,\n )}\n >\n {items.map((item) => {\n const active = item.value === value\n return (\n <button\n key={item.value}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={() => onChange(item.value)}\n className={cn(\n 'flex h-full items-center rounded-button font-semibold transition-colors',\n SIZE[size].segment,\n active ? 'bg-foreground text-background' : 'text-muted-foreground hover:bg-muted/60',\n )}\n >\n {item.label}\n </button>\n )\n })}\n </div>\n )\n}\n"]}