@fayz-ai/ui 0.8.3 → 0.8.4

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 (50) hide show
  1. package/dist/{chunk-XIRJGVDK.cjs → chunk-7ZQQZD4Q.cjs} +34 -37
  2. package/dist/{chunk-ID2HQK2Q.js.map → chunk-7ZQQZD4Q.cjs.map} +1 -1
  3. package/dist/{chunk-SVVKUMSL.cjs → chunk-B3BTZDTA.cjs} +10 -42
  4. package/dist/chunk-B3BTZDTA.cjs.map +1 -0
  5. package/dist/{chunk-O5F4LLSL.js → chunk-DYMBFHD7.js} +8 -7
  6. package/dist/chunk-DYMBFHD7.js.map +1 -0
  7. package/dist/{chunk-BVF2KPTT.js → chunk-G6OKZ7WL.js} +30 -3
  8. package/dist/chunk-G6OKZ7WL.js.map +1 -0
  9. package/dist/{chunk-A7O7KGNL.js → chunk-M34ACV5E.js} +23 -4
  10. package/dist/chunk-M34ACV5E.js.map +1 -0
  11. package/dist/{chunk-WF3STNDX.cjs → chunk-MUGRP5DD.cjs} +53 -34
  12. package/dist/chunk-MUGRP5DD.cjs.map +1 -0
  13. package/dist/{chunk-MI6FOB4O.cjs → chunk-NZV47HWO.cjs} +31 -2
  14. package/dist/chunk-NZV47HWO.cjs.map +1 -0
  15. package/dist/{chunk-2GDQUARM.js → chunk-R4LPSXTT.js} +8 -38
  16. package/dist/chunk-R4LPSXTT.js.map +1 -0
  17. package/dist/{chunk-TDGSY5W6.cjs → chunk-R4SQ2GVD.cjs} +8 -7
  18. package/dist/chunk-R4SQ2GVD.cjs.map +1 -0
  19. package/dist/{chunk-ID2HQK2Q.js → chunk-VVQ45ZDZ.js} +35 -38
  20. package/dist/chunk-VVQ45ZDZ.js.map +1 -0
  21. package/dist/dashboard/OnboardingWidget.d.ts.map +1 -1
  22. package/dist/dashboard/index.cjs +26 -26
  23. package/dist/dashboard/index.js +2 -2
  24. package/dist/index.cjs +137 -137
  25. package/dist/index.js +5 -5
  26. package/dist/layout/Sidebar.d.ts +4 -0
  27. package/dist/layout/Sidebar.d.ts.map +1 -1
  28. package/dist/layout/index.cjs +19 -19
  29. package/dist/layout/index.js +1 -1
  30. package/dist/primitives/index.cjs +83 -83
  31. package/dist/primitives/index.js +2 -2
  32. package/dist/primitives/search-select.d.ts +3 -1
  33. package/dist/primitives/search-select.d.ts.map +1 -1
  34. package/dist/theme/index.cjs +8 -8
  35. package/dist/theme/index.d.ts.map +1 -1
  36. package/dist/theme/index.js +1 -1
  37. package/package.json +3 -3
  38. package/src/dashboard/OnboardingWidget.tsx +32 -1
  39. package/src/layout/Sidebar.tsx +69 -29
  40. package/src/primitives/search-select.tsx +12 -4
  41. package/src/theme/index.ts +9 -6
  42. package/dist/chunk-2GDQUARM.js.map +0 -1
  43. package/dist/chunk-A7O7KGNL.js.map +0 -1
  44. package/dist/chunk-BVF2KPTT.js.map +0 -1
  45. package/dist/chunk-MI6FOB4O.cjs.map +0 -1
  46. package/dist/chunk-O5F4LLSL.js.map +0 -1
  47. package/dist/chunk-SVVKUMSL.cjs.map +0 -1
  48. package/dist/chunk-TDGSY5W6.cjs.map +0 -1
  49. package/dist/chunk-WF3STNDX.cjs.map +0 -1
  50. package/dist/chunk-XIRJGVDK.cjs.map +0 -1
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkOW73RZOU_cjs = require('./chunk-OW73RZOU.cjs');
4
- var chunkMI6FOB4O_cjs = require('./chunk-MI6FOB4O.cjs');
4
+ var chunkNZV47HWO_cjs = require('./chunk-NZV47HWO.cjs');
5
5
  var chunkH6OULCHF_cjs = require('./chunk-H6OULCHF.cjs');
6
6
  var React10 = require('react');
7
7
  var jsxRuntime = require('react/jsx-runtime');
@@ -576,33 +576,6 @@ function TimePicker({ value, onChange, interval = 15, min = "00:00", max = "23:4
576
576
  )
577
577
  ] });
578
578
  }
579
- function Skeleton({
580
- className,
581
- ...props
582
- }) {
583
- return /* @__PURE__ */ jsxRuntime.jsx(
584
- "div",
585
- {
586
- className: chunkH6OULCHF_cjs.cn("animate-pulse rounded-md bg-muted", className),
587
- ...props
588
- }
589
- );
590
- }
591
- function TableSkeleton({ columns = 4, rows = 2 }) {
592
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border overflow-hidden", children: [
593
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-b bg-muted/30 flex gap-4 px-4 py-2.5", children: Array.from({ length: columns }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { className: "h-3 flex-1 rounded bg-muted-foreground/10" }, i)) }),
594
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "divide-y", children: Array.from({ length: rows }).map((_, r) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-4 px-4 py-3.5", children: Array.from({ length: columns }).map((_2, c) => /* @__PURE__ */ jsxRuntime.jsx(
595
- Skeleton,
596
- {
597
- className: chunkH6OULCHF_cjs.cn(
598
- "h-3 rounded",
599
- c === 0 ? "flex-[2]" : "flex-1"
600
- )
601
- },
602
- c
603
- )) }, r)) })
604
- ] });
605
- }
606
579
  function ListView({
607
580
  columns,
608
581
  data,
@@ -695,12 +668,12 @@ function ListView({
695
668
  ))
696
669
  ] }),
697
670
  toolbar,
698
- loading ? /* @__PURE__ */ jsxRuntime.jsx(chunkMI6FOB4O_cjs.DataTable, { columns, data: [], loading: true, variant: "card" }) : data.length === 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center py-12 text-center rounded-lg border-2 border-dashed border-muted", children: [
671
+ loading ? /* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.DataTable, { columns, data: [], loading: true, variant: "card" }) : data.length === 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center py-12 text-center rounded-lg border-2 border-dashed border-muted", children: [
699
672
  EmptyIcon && /* @__PURE__ */ jsxRuntime.jsx(EmptyIcon, { className: "h-8 w-8 text-muted-foreground/30 mb-2" }),
700
673
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: emptyMessage }),
701
674
  emptyActionLabel && onEmptyAction && /* @__PURE__ */ jsxRuntime.jsx("button", { onClick: onEmptyAction, className: "text-xs text-primary hover:underline mt-1", children: emptyActionLabel })
702
675
  ] }) : /* @__PURE__ */ jsxRuntime.jsx(
703
- chunkMI6FOB4O_cjs.DataTable,
676
+ chunkNZV47HWO_cjs.DataTable,
704
677
  {
705
678
  columns,
706
679
  data,
@@ -926,7 +899,7 @@ function SearchSelect({
926
899
  createLabel = "Add",
927
900
  onCreate,
928
901
  renderOption,
929
- loadOnOpen,
902
+ loadOnOpen = true,
930
903
  className,
931
904
  disabled
932
905
  }) {
@@ -1006,6 +979,7 @@ function SearchSelect({
1006
979
  if (disabled || creating) return;
1007
980
  setOpen(true);
1008
981
  setQuery("");
982
+ setResults([]);
1009
983
  setTimeout(() => inputRef.current?.focus(), 0);
1010
984
  }
1011
985
  const groups = React10__namespace.useMemo(() => {
@@ -1018,7 +992,7 @@ function SearchSelect({
1018
992
  return map;
1019
993
  }, [results]);
1020
994
  const hasValue = !!value && !!selectedLabel;
1021
- const showDropdown = open && query.length >= minChars;
995
+ const showDropdown = open && (query.length >= minChars || loadOnOpen);
1022
996
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: containerRef, className: chunkH6OULCHF_cjs.cn("relative", className), children: [
1023
997
  label && /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "text-xs font-medium text-muted-foreground", children: [
1024
998
  label,
@@ -1069,11 +1043,7 @@ function SearchSelect({
1069
1043
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "h-3.5 w-3.5 animate-spin" }),
1070
1044
  " Searching..."
1071
1045
  ] }) : results.length === 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-4 py-4 text-center", children: [
1072
- /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-muted-foreground", children: [
1073
- 'No results for "',
1074
- query,
1075
- '"'
1076
- ] }),
1046
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: query ? `No results for "${query}"` : "No results" }),
1077
1047
  allowCreate && onCreate && /* @__PURE__ */ jsxRuntime.jsxs(
1078
1048
  "button",
1079
1049
  {
@@ -1436,7 +1406,7 @@ function MarkdownEditor({
1436
1406
  );
1437
1407
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkH6OULCHF_cjs.cn("flex flex-col gap-2", className), children: [
1438
1408
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-end", children: /* @__PURE__ */ jsxRuntime.jsx(
1439
- chunkMI6FOB4O_cjs.SegmentedControl,
1409
+ chunkNZV47HWO_cjs.SegmentedControl,
1440
1410
  {
1441
1411
  "aria-label": "Markdown mode",
1442
1412
  options: [
@@ -1715,8 +1685,6 @@ exports.SelectSeparator = SelectSeparator;
1715
1685
  exports.SelectTrigger = SelectTrigger;
1716
1686
  exports.SelectValue = SelectValue;
1717
1687
  exports.Separator = Separator2;
1718
- exports.Skeleton = Skeleton;
1719
- exports.TableSkeleton = TableSkeleton;
1720
1688
  exports.Tabs = Tabs;
1721
1689
  exports.TabsContent = TabsContent;
1722
1690
  exports.TabsList = TabsList;
@@ -1729,5 +1697,5 @@ exports.TooltipProvider = TooltipProvider;
1729
1697
  exports.TooltipTrigger = TooltipTrigger;
1730
1698
  exports.badgeVariants = badgeVariants;
1731
1699
  exports.renderMarkdown = renderMarkdown;
1732
- //# sourceMappingURL=chunk-SVVKUMSL.cjs.map
1733
- //# sourceMappingURL=chunk-SVVKUMSL.cjs.map
1700
+ //# sourceMappingURL=chunk-B3BTZDTA.cjs.map
1701
+ //# sourceMappingURL=chunk-B3BTZDTA.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/primitives/input.tsx","../src/primitives/badge.tsx","../src/primitives/modal.tsx","../src/primitives/checkbox.tsx","../src/primitives/select.tsx","../src/primitives/toast.tsx","../src/primitives/tabs.tsx","../src/primitives/separator.tsx","../src/primitives/breadcrumb.tsx","../src/primitives/tooltip.tsx","../src/primitives/time-picker.tsx","../src/primitives/list-view.tsx","../src/primitives/date-picker.tsx","../src/primitives/search-select.tsx","../src/primitives/currency-input.tsx","../src/primitives/confirm-dialog.tsx","../src/primitives/popover.tsx","../src/primitives/markdown.tsx","../src/primitives/markdown-editor.tsx","../src/primitives/SearchCombobox.tsx"],"names":["React","jsxs","jsx","cn","cva","DialogPrimitive","React2","X","React3","Check","SelectPrimitive","React4","ChevronDown","ChevronUp","useSaveBarVisible","Toaster","TabsPrimitive","React5","Separator","React6","SeparatorPrimitive","useCrossModuleBack","useBackHandler","ArrowLeft","Fragment","TooltipPrimitive","React7","useState","useRef","useEffect","useMemo","Clock","createPortal","useCallback","Search","Button","Plus","DataTable","ChevronLeft","ChevronRight","useTranslation","getCurrentLocale","Calendar","React10","Loader2","React11","Info","XCircle","AlertTriangle","CheckCircle2","Icon","React12","PopoverPrimitive","React13","React14","React15","SegmentedControl"],"mappings":"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","file":"chunk-B3BTZDTA.cjs","sourcesContent":["import * as React from 'react'\n\nimport { cn } from '../utils/cn'\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {\n error?: string\n description?: string\n}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, error, description, id, ...props }, ref) => {\n const inputId = id ?? React.useId()\n const descriptionId = description ? `${inputId}-description` : undefined\n const errorId = error ? `${inputId}-error` : undefined\n\n return (\n <div className=\"w-full\">\n <input\n type={type}\n id={inputId}\n className={cn(\n 'flex h-8 w-full rounded-input border border-input bg-card px-2 py-1 text-sm text-foreground shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n error && 'border-destructive focus-visible:ring-destructive',\n className,\n )}\n ref={ref}\n aria-invalid={error ? true : undefined}\n aria-describedby={\n [descriptionId, errorId].filter(Boolean).join(' ') || undefined\n }\n {...props}\n />\n {description && !error && (\n <p id={descriptionId} className=\"mt-1.5 text-xs text-muted-foreground\">\n {description}\n </p>\n )}\n {error && (\n <p id={errorId} className=\"mt-1.5 text-xs text-destructive\">\n {error}\n </p>\n )}\n </div>\n )\n }\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../utils/cn'\n\nconst badgeVariants = cva(\n 'inline-flex items-center gap-1.5 rounded px-2 py-0.5 text-xs font-medium leading-[18px] transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n default: 'bg-muted text-muted-foreground',\n secondary: 'bg-muted text-muted-foreground',\n info: 'bg-info-soft text-info-soft-foreground',\n success: 'bg-success-soft text-success-soft-foreground',\n warning: 'bg-warning-soft text-warning-soft-foreground',\n destructive: 'bg-destructive-soft text-destructive-soft-foreground',\n magic: 'bg-magic-soft text-magic-soft-foreground',\n strong: 'bg-primary text-primary-foreground',\n outline: 'border border-border text-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\nconst VARIANTS_WITH_DOT = new Set([\n 'info',\n 'success',\n 'warning',\n 'destructive',\n 'magic',\n])\n\nconst DOT_COLOR: Record<string, string> = {\n info: 'hsl(var(--info))',\n success: 'hsl(var(--success))',\n warning: 'hsl(var(--warning))',\n destructive: 'hsl(var(--destructive))',\n magic: 'hsl(var(--magic))',\n}\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {\n // Show a leading status dot. Defaults to true for status variants\n // (info/success/warning/destructive/magic), false for neutral/outline/strong.\n dot?: boolean\n}\n\nfunction Badge({ className, variant, dot, children, ...props }: BadgeProps) {\n const v = variant ?? 'default'\n const showDot = dot ?? VARIANTS_WITH_DOT.has(v)\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props}>\n {showDot && (\n <span\n className=\"inline-block size-1.5 rounded-full\"\n style={{ background: DOT_COLOR[v] ?? 'currentColor' }}\n />\n )}\n {children}\n </div>\n )\n}\n\nexport { Badge, badgeVariants }\n","import * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { X } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\n\n// ---------------------------------------------------------------------------\n// Animations are defined in styles.css under .saas-mdl-ov / .saas-mdl-ct\n// selectors with [data-state=\"open\"/\"closed\"]. Radix defers unmount when\n// it detects animationName on the element — CSS must be loaded before render.\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Sizes\n// ---------------------------------------------------------------------------\n\nconst SIZE_MAP = {\n sm: 'sm:max-w-sm',\n md: 'sm:max-w-md',\n lg: 'sm:max-w-lg',\n xl: 'sm:max-w-xl',\n '2xl': 'sm:max-w-2xl',\n '3xl': 'sm:max-w-3xl',\n full: 'sm:max-w-[calc(100vw-4rem)]',\n} as const\n\ntype ModalSize = keyof typeof SIZE_MAP\n\n// ---------------------------------------------------------------------------\n// Primitives re-export\n// ---------------------------------------------------------------------------\n\nconst Modal = DialogPrimitive.Root\nconst ModalTrigger = DialogPrimitive.Trigger\nconst ModalClose = DialogPrimitive.Close\nconst ModalPortal = DialogPrimitive.Portal\n\n// ---------------------------------------------------------------------------\n// Overlay — also serves as the flex centering wrapper\n// ---------------------------------------------------------------------------\n\nconst ModalOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fayz-modal-overlay saas-mdl-ov fixed inset-0 z-50',\n 'flex items-center justify-center p-0 sm:p-6',\n className,\n )}\n {...props}\n />\n))\nModalOverlay.displayName = 'ModalOverlay'\n\n// ---------------------------------------------------------------------------\n// Content — rendered INSIDE the overlay (flex-centered)\n// ---------------------------------------------------------------------------\n\nconst ModalContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n size?: ModalSize\n hideClose?: boolean\n noPadding?: boolean\n }\n>(({ className, children, size = 'lg', hideClose, noPadding, onPointerDownOutside, onInteractOutside, onCloseAutoFocus, ...props }, ref) => (\n <ModalPortal>\n <ModalOverlay>\n <DialogPrimitive.Content\n ref={ref}\n onCloseAutoFocus={(e) => {\n // Prevent Radix from stealing focus back to the trigger element on close.\n // This interferes with FullCalendar's selection and other interactive components.\n e.preventDefault()\n onCloseAutoFocus?.(e)\n }}\n onPointerDownOutside={(e) => {\n // Prevent Radix from intercepting clicks on portaled dropdowns (DatePicker, TimePicker, etc.)\n const target = e.target as HTMLElement\n if (target.closest('[data-modal-passthrough]') || target.closest('[data-radix-popper-content-wrapper]')) {\n e.preventDefault()\n }\n onPointerDownOutside?.(e)\n }}\n onInteractOutside={(e) => {\n const target = e.target as HTMLElement\n if (target.closest('[data-modal-passthrough]') || target.closest('[data-radix-popper-content-wrapper]')) {\n e.preventDefault()\n }\n onInteractOutside?.(e)\n }}\n className={cn(\n 'fayz-glass-surface fayz-modal-content saas-mdl-ct relative z-50 flex flex-col w-full outline-none',\n // Mobile fullscreen\n 'h-full rounded-none border-0',\n // Desktop centered card\n 'sm:h-auto sm:max-h-[85vh] sm:rounded-2xl sm:border',\n SIZE_MAP[size],\n noPadding ? '' : 'p-6 gap-4',\n className,\n )}\n {...props}\n >\n {children}\n {!hideClose && (\n <DialogPrimitive.Close className=\"absolute right-4 top-4 z-10 flex h-7 w-7 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus:outline-none focus:ring-2 focus:ring-ring\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </ModalOverlay>\n </ModalPortal>\n))\nModalContent.displayName = 'ModalContent'\n\n// ---------------------------------------------------------------------------\n// Sections\n// ---------------------------------------------------------------------------\n\nfunction ModalHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex flex-col space-y-1.5 text-center sm:text-left shrink-0', className)} {...props} />\n}\n\nfunction ModalBody({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex-1 overflow-y-auto min-h-0', className)} {...props} />\n}\n\nfunction ModalFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2 shrink-0', className)} {...props} />\n}\n\nconst ModalTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title ref={ref} className={cn('text-lg font-semibold leading-none tracking-tight', className)} {...props} />\n))\nModalTitle.displayName = 'ModalTitle'\n\nconst ModalDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n))\nModalDescription.displayName = 'ModalDescription'\n\nexport {\n Modal, ModalPortal, ModalOverlay, ModalClose, ModalTrigger,\n ModalContent, ModalHeader, ModalBody, ModalFooter, ModalTitle, ModalDescription,\n}\nexport type { ModalSize }\n","import * as React from 'react'\nimport { Check } from 'lucide-react'\nimport { cn } from '../utils/cn'\n\ntype CheckboxColor = 'primary' | 'success' | 'warning' | 'destructive'\n\ninterface CheckboxProps {\n checked?: boolean\n onChange?: (checked: boolean) => void\n disabled?: boolean\n className?: string\n color?: CheckboxColor\n id?: string\n}\n\nconst COLOR_CLASSES: Record<CheckboxColor, string> = {\n primary: 'border-primary bg-primary text-primary-foreground',\n success: 'border-success bg-success text-white dark:border-success dark:bg-success',\n warning: 'border-warning bg-warning text-white',\n destructive: 'border-destructive bg-destructive text-destructive-foreground',\n}\n\nconst Checkbox = React.forwardRef<HTMLButtonElement, CheckboxProps>(\n ({ checked = false, onChange, disabled, className, color = 'primary', id, ...props }, ref) => {\n return (\n <button\n ref={ref}\n id={id}\n type=\"button\"\n role=\"checkbox\"\n aria-checked={checked}\n disabled={disabled}\n onClick={() => onChange?.(!checked)}\n className={cn(\n 'peer inline-flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-[5px] border-2 transition-all duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n checked\n ? `${COLOR_CLASSES[color]} shadow-sm`\n : 'border-muted-foreground/40 bg-background hover:border-muted-foreground/60',\n className,\n )}\n {...props}\n >\n {checked && <Check className=\"h-3.5 w-3.5\" strokeWidth={3} />}\n </button>\n )\n },\n)\nCheckbox.displayName = 'Checkbox'\n\nexport { Checkbox }\nexport type { CheckboxColor, CheckboxProps }\n","import * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { ChevronDown, ChevronUp, Check } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex h-10 w-full items-center justify-between rounded-input border border-input bg-background px-3 py-2 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n 'flex cursor-default items-center justify-center py-1',\n className\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n 'flex cursor-default items-center justify-center py-1',\n className\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'fayz-glass-surface relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-card border bg-popover text-popover-foreground shadow-md',\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]'\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn('py-1.5 pl-8 pr-2 text-sm font-semibold', className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded-button py-1.5 pl-8 pr-2 text-sm outline-none data-[highlighted]:bg-muted focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","import * as React from 'react'\nimport { Toaster, toast } from 'sonner'\nimport { useSaveBarVisible } from '../layout/SaveBar'\n\ninterface ToastProviderProps {\n position?:\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right'\n theme?: 'light' | 'dark' | 'system'\n}\n\nfunction ToastProvider({\n position = 'bottom-center',\n theme = 'system',\n}: ToastProviderProps) {\n // Stack toasts ABOVE the floating SaveBar (instead of overlapping it) by\n // lifting the bottom offset while the bar is on screen.\n const saveBarVisible = useSaveBarVisible()\n const bottomOffset = position.startsWith('bottom') && saveBarVisible ? 84 : 24\n return (\n <Toaster\n position={position}\n theme={theme}\n offset={bottomOffset}\n closeButton\n richColors\n toastOptions={{\n classNames: {\n // Format harmonized with the SaveBar island: soft ring + xl shadow,\n // generous rounded-2xl radius (full-pill looks wrong on multi-line\n // toasts). Colors stay semantic (richColors).\n toast: 'group !gap-3 !rounded-3xl !border !px-4 !py-3 !shadow-xl !ring-1 !ring-black/5',\n title: '!text-sm !font-semibold',\n description: '!text-xs !mt-0.5',\n closeButton: '!opacity-0 group-hover:!opacity-60 hover:!opacity-100 !transition-opacity',\n },\n }}\n />\n )\n}\n\nexport { ToastProvider, toast }\n","import * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\n\nimport { cn } from '../utils/cn'\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n 'inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground',\n className\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm',\n className\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n className\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","import * as React from 'react'\nimport * as SeparatorPrimitive from '@radix-ui/react-separator'\n\nimport { cn } from '../utils/cn'\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = 'horizontal', decorative = true, ...props },\n ref\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'shrink-0 bg-border',\n orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]',\n className\n )}\n {...props}\n />\n )\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n","import * as React from 'react'\nimport { ArrowLeft } from 'lucide-react'\nimport { useBackHandler } from '../layout/SaveBar'\nimport { useCrossModuleBack } from '../layout/useCrossModuleBack'\n\ninterface BreadcrumbProps {\n /** Parent label (e.g. \"Invoices\", \"Clients\") — clicking navigates back */\n parent: string\n /** Current item name (e.g. \"Invoice #123\", \"John Doe\") */\n current?: string\n /** Navigate back handler */\n onBack: () => void\n}\n\nexport function Breadcrumb({ parent, current, onBack }: BreadcrumbProps) {\n // When the user came from another module, point \"back\" at that actual\n // previous page; otherwise keep this page's own parent/onBack.\n const { onBack: effectiveOnBack, parentLabel: effectiveParent } = useCrossModuleBack(onBack, parent)\n // Wire this page's back action into the app-wide Escape key (no per-plugin code).\n useBackHandler(effectiveOnBack)\n return (\n <nav className=\"flex items-center gap-1.5 text-sm text-muted-foreground\">\n <button\n type=\"button\"\n onClick={effectiveOnBack}\n className=\"inline-flex items-center gap-1 hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n {effectiveParent}\n </button>\n {current !== undefined && (\n <>\n <span>/</span>\n {current ? (\n <span className=\"text-foreground font-medium truncate max-w-[200px]\">{current}</span>\n ) : (\n <span className=\"inline-block h-4 w-24 rounded bg-muted animate-pulse align-middle\" />\n )}\n </>\n )}\n </nav>\n )\n}\n","import * as React from 'react'\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip'\n\nimport { cn } from '../utils/cn'\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'fayz-glass-surface z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import React, { useState, useEffect, useRef, useMemo } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Clock } from 'lucide-react'\n\n// ---------------------------------------------------------------------------\n// TimePicker — dropdown time slot selector, Google Calendar style\n// ---------------------------------------------------------------------------\n\nfunction formatTime12(h: number, m: number) {\n const period = h >= 12 ? 'pm' : 'am'\n const h12 = h % 12 || 12\n return `${h12}:${String(m).padStart(2, '0')}${period}`\n}\n\nfunction formatTime24(h: number, m: number) {\n return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`\n}\n\ninterface TimePickerProps {\n /** Value as HH:MM (24h) */\n value: string\n onChange: (value: string) => void\n /** Interval in minutes between slots (default: 15) */\n interval?: number\n /** Min time as HH:MM (default: '00:00') */\n min?: string\n /** Max time as HH:MM (default: '23:45') */\n max?: string\n /** Use 12h format for display (default: false) */\n use12h?: boolean\n /** Read-only mode */\n readOnly?: boolean\n className?: string\n /** Open the dropdown immediately on mount */\n defaultOpen?: boolean\n /** Called when the dropdown opens or closes */\n onOpenChange?: (open: boolean) => void\n}\n\nexport function TimePicker({ value, onChange, interval = 15, min = '00:00', max = '23:45', use12h = false, readOnly, className, defaultOpen, onOpenChange }: TimePickerProps) {\n const [open, setOpen] = useState(defaultOpen ?? false)\n const ref = useRef<HTMLDivElement>(null)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n const [pos, setPos] = useState<{ top: number; left: number; width: number }>({ top: 0, left: 0, width: 0 })\n\n // Position the portal dropdown\n useEffect(() => {\n if (!open || !triggerRef.current) return\n const rect = triggerRef.current.getBoundingClientRect()\n setPos({ top: rect.bottom + 4, left: rect.left, width: Math.max(rect.width, 120) })\n }, [open])\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n const target = e.target as Node\n if (ref.current?.contains(target)) return\n if (listRef.current?.contains(target)) return\n setOpen(false)\n onOpenChange?.(false)\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n // Scroll to selected time when opening\n useEffect(() => {\n if (!open || !listRef.current || !value) return\n const el = listRef.current.querySelector('[data-selected=\"true\"]')\n if (el) el.scrollIntoView({ block: 'center' })\n }, [open, value])\n\n const slots = useMemo(() => {\n const [minH, minM] = min.split(':').map(Number)\n const [maxH, maxM] = max.split(':').map(Number)\n const minTotal = minH * 60 + minM\n const maxTotal = maxH * 60 + maxM\n const result: { value: string; label: string }[] = []\n\n for (let t = minTotal; t <= maxTotal; t += interval) {\n const h = Math.floor(t / 60)\n const m = t % 60\n result.push({\n value: formatTime24(h, m),\n label: use12h ? formatTime12(h, m) : formatTime24(h, m),\n })\n }\n return result\n }, [interval, min, max, use12h])\n\n const displayValue = useMemo(() => {\n if (!value) return ''\n const [h, m] = value.split(':').map(Number)\n return use12h ? formatTime12(h, m) : formatTime24(h, m)\n }, [value, use12h])\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (readOnly) return\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault()\n const idx = slots.findIndex((s) => s.value === value)\n const next = e.key === 'ArrowDown'\n ? Math.min(idx + 1, slots.length - 1)\n : Math.max(idx - 1, 0)\n if (slots[next]) onChange(slots[next].value)\n } else if (e.key === 'Enter' || e.key === 'Escape') {\n setOpen(false)\n }\n }\n\n return (\n <div ref={ref} className={`relative ${className ?? ''}`}>\n {/* Trigger */}\n <button ref={triggerRef} type=\"button\"\n onClick={() => !readOnly && setOpen((p) => !p)}\n onKeyDown={handleKeyDown}\n disabled={readOnly}\n className={`flex items-center gap-2 rounded-lg border px-3 py-2 text-sm w-full text-left transition-colors ${\n readOnly ? 'bg-muted/40 text-muted-foreground cursor-default' : 'bg-background hover:bg-muted/30'\n }`}>\n <Clock className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n <span>{displayValue || '--:--'}</span>\n </button>\n\n {/* Dropdown — portal to escape overflow containers */}\n {open && !readOnly && createPortal(\n <div ref={listRef} data-modal-passthrough\n style={{ position: 'fixed', top: pos.top, left: pos.left, width: pos.width, zIndex: 9999, pointerEvents: 'auto' }}\n className=\"fayz-glass-surface min-w-[120px] max-h-48 overflow-y-auto rounded-xl border bg-popover shadow-xl py-1\">\n {slots.map((slot) => {\n const selected = slot.value === value\n return (\n <button key={slot.value} type=\"button\" data-selected={selected}\n onClick={() => { onChange(slot.value); setOpen(false) }}\n className={`block w-full px-3 py-1.5 text-sm text-left transition-colors ${\n selected ? 'bg-primary/10 text-primary font-medium' : 'hover:bg-muted/50'\n }`}>\n {slot.label}\n </button>\n )\n })}\n </div>,\n document.body,\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { useState, useCallback, useRef, useEffect } from 'react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Search, Plus, ChevronLeft, ChevronRight } from 'lucide-react'\nimport { DataTable } from './data-table'\nimport { Button } from './button'\nimport { cn } from '../utils/cn'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TagFilter {\n value: string\n label: string\n}\n\nexport interface ListViewProps<TData> {\n /** TanStack column definitions */\n columns: ColumnDef<TData, any>[]\n /** Data rows */\n data: TData[]\n /** Loading state — shows skeleton */\n loading?: boolean\n\n // ── Search ──\n /** Placeholder for search input (default: \"Search...\") */\n searchPlaceholder?: string\n /** Controlled search value */\n search?: string\n /** Called on search change (debounced internally if onSearchDebounced is used) */\n onSearchChange?: (value: string) => void\n /** Debounce delay in ms (default: 300). Set 0 for no debounce. */\n searchDebounce?: number\n\n // ── Tag filters ──\n /** Available filter tags (e.g. status values, types) */\n tags?: TagFilter[]\n /** \"All\" label (default: \"All\") */\n allTagLabel?: string\n /** Currently active tag value (undefined = all) */\n activeTag?: string\n /** Called when a tag is selected (undefined = all) */\n onTagChange?: (value: string | undefined) => void\n\n // ── CTA button ──\n /** Label for the \"New\" button (e.g. \"New Product\") */\n newLabel?: string\n /** Called when the \"New\" button is clicked */\n onNew?: () => void\n\n // ── Row interaction ──\n /** Called when a row is clicked */\n onRowClick?: (row: TData) => void\n\n // ── Empty state ──\n /** Icon component for the empty state */\n emptyIcon?: React.ComponentType<{ className?: string }>\n /** Empty state message */\n emptyMessage?: string\n /** Empty state action label (e.g. \"Create your first product\") */\n emptyActionLabel?: string\n /** Called when the empty action is clicked */\n onEmptyAction?: () => void\n\n // ── Pagination ──\n /** Total item count (enables pagination when > pageSize) */\n total?: number\n /** Current page (1-indexed) */\n page?: number\n /** Page size (default: 25) */\n pageSize?: number\n /** Called when page changes */\n onPageChange?: (page: number) => void\n\n // ── Extra ──\n /** Additional content rendered between filters and table */\n toolbar?: React.ReactNode\n /** CSS class for the outer wrapper */\n className?: string\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function ListView<TData>({\n columns,\n data,\n loading = false,\n searchPlaceholder = 'Search...',\n search: controlledSearch,\n onSearchChange,\n searchDebounce = 300,\n tags,\n allTagLabel = 'All',\n activeTag,\n onTagChange,\n newLabel,\n onNew,\n onRowClick,\n emptyIcon: EmptyIcon,\n emptyMessage = 'No results found.',\n emptyActionLabel,\n onEmptyAction,\n total,\n page = 1,\n pageSize = 25,\n onPageChange,\n toolbar,\n className,\n}: ListViewProps<TData>) {\n // Internal search state for debouncing\n const [internalSearch, setInternalSearch] = useState(controlledSearch ?? '')\n const debounceRef = useRef<ReturnType<typeof setTimeout>>()\n\n // Sync controlled → internal\n useEffect(() => {\n if (controlledSearch !== undefined) setInternalSearch(controlledSearch)\n }, [controlledSearch])\n\n const handleSearchChange = useCallback((value: string) => {\n setInternalSearch(value)\n if (searchDebounce === 0) {\n onSearchChange?.(value)\n } else {\n if (debounceRef.current) clearTimeout(debounceRef.current)\n debounceRef.current = setTimeout(() => onSearchChange?.(value), searchDebounce)\n }\n }, [onSearchChange, searchDebounce])\n\n // Pagination\n const totalItems = total ?? data.length\n const totalPages = Math.max(1, Math.ceil(totalItems / pageSize))\n const showPagination = onPageChange && totalItems > pageSize\n\n const showSearch = !!onSearchChange\n const showTags = tags && tags.length > 0 && onTagChange\n const showToolbar = showSearch || onNew || showTags\n\n return (\n <div className={cn('space-y-4', className)}>\n {/* ── Search + CTA row ── */}\n {showToolbar && (\n <div className=\"flex flex-col sm:flex-row gap-3 sm:items-center sm:justify-between\">\n {showSearch && (\n <div className=\"relative flex-1 max-w-sm\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground\" />\n <input\n type=\"text\"\n placeholder={searchPlaceholder}\n value={internalSearch}\n onChange={(e) => handleSearchChange(e.target.value)}\n className=\"w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] pl-8 pr-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n )}\n {onNew && newLabel && (\n <Button variant=\"default\" size=\"default\" onClick={onNew} className=\"shrink-0\">\n <Plus className=\"h-3.5 w-3.5\" />\n {newLabel}\n </Button>\n )}\n </div>\n )}\n\n {/* ── Tag filters ── */}\n {showTags && (\n <div className=\"flex gap-1.5 flex-wrap\">\n <button\n onClick={() => onTagChange!(undefined)}\n className={cn(\n 'rounded-full px-2.5 py-1 text-xs font-medium transition-colors',\n !activeTag\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted/50 text-muted-foreground hover:bg-muted'\n )}\n >\n {allTagLabel}\n </button>\n {tags!.map((tag) => (\n <button\n key={tag.value}\n onClick={() => onTagChange!(tag.value)}\n className={cn(\n 'rounded-full px-2.5 py-1 text-xs font-medium transition-colors',\n activeTag === tag.value\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted/50 text-muted-foreground hover:bg-muted'\n )}\n >\n {tag.label}\n </button>\n ))}\n </div>\n )}\n\n {/* ── Extra toolbar ── */}\n {toolbar}\n\n {/* ── Table / Empty / Loading ── */}\n {loading ? (\n <DataTable columns={columns} data={[]} loading variant=\"card\" />\n ) : data.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-center rounded-lg border-2 border-dashed border-muted\">\n {EmptyIcon && <EmptyIcon className=\"h-8 w-8 text-muted-foreground/30 mb-2\" />}\n <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>\n {emptyActionLabel && onEmptyAction && (\n <button onClick={onEmptyAction} className=\"text-xs text-primary hover:underline mt-1\">\n {emptyActionLabel}\n </button>\n )}\n </div>\n ) : (\n <DataTable\n columns={columns}\n data={data}\n onRowClick={onRowClick}\n variant=\"card\"\n />\n )}\n\n {/* ── Pagination ── */}\n {showPagination && (\n <div className=\"flex items-center justify-between px-1\">\n <p className=\"text-xs text-muted-foreground\">\n {((page - 1) * pageSize) + 1}–{Math.min(page * pageSize, totalItems)} of {totalItems}\n </p>\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => onPageChange!(page - 1)}\n disabled={page <= 1}\n className=\"flex h-7 w-7 items-center justify-center rounded-md border hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n <ChevronLeft className=\"h-3.5 w-3.5\" />\n </button>\n <span className=\"text-xs text-muted-foreground px-2\">\n {page} / {totalPages}\n </span>\n <button\n onClick={() => onPageChange!(page + 1)}\n disabled={page >= totalPages}\n className=\"flex h-7 w-7 items-center justify-center rounded-md border hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n <ChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n )}\n </div>\n )\n}\n","import React, { useState, useEffect, useRef, useMemo } from 'react'\nimport { createPortal } from 'react-dom'\nimport { ChevronLeft, ChevronRight, Calendar } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getCurrentLocale } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// DatePicker — custom dropdown calendar, Google Calendar style\n// ---------------------------------------------------------------------------\n\nconst DAY_LABELS: Record<string, string[]> = {\n en: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n 'pt-BR': ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n}\n\nfunction toDateLocale(locale: string): string {\n if (locale === 'pt-BR') return 'pt-BR'\n return 'en-US'\n}\n\nfunction isSameDay(a: Date, b: Date) {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate()\n}\n\nfunction isToday(d: Date) { return isSameDay(d, new Date()) }\n\nfunction formatDate(date: Date, locale: string) {\n return date.toLocaleDateString(toDateLocale(locale), { month: 'short', day: 'numeric', year: 'numeric' })\n}\n\nfunction toDateStr(d: Date) {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`\n}\n\nfunction parseDate(s: string): Date {\n const [y, m, d] = s.split('-').map(Number)\n return new Date(y, m - 1, d)\n}\n\ninterface DatePickerProps {\n /** Value as YYYY-MM-DD string */\n value: string\n onChange: (value: string) => void\n className?: string\n /** Open the dropdown immediately on mount */\n defaultOpen?: boolean\n /** Called when the dropdown opens or closes */\n onOpenChange?: (open: boolean) => void\n}\n\nexport function DatePicker({ value, onChange, className, defaultOpen, onOpenChange }: DatePickerProps) {\n const t = useTranslation()\n const locale = getCurrentLocale()\n const [open, setOpen] = useState(defaultOpen ?? false)\n const ref = useRef<HTMLDivElement>(null)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const selectedDate = value ? parseDate(value) : new Date()\n const [viewMonth, setViewMonth] = useState(new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1))\n const [pos, setPos] = useState<{ top: number; left: number }>({ top: 0, left: 0 })\n\n const dayLabels = DAY_LABELS[locale] ?? DAY_LABELS.en\n const dateLocale = toDateLocale(locale)\n\n // Position the portal dropdown relative to the trigger\n useEffect(() => {\n if (!open || !triggerRef.current) return\n const rect = triggerRef.current.getBoundingClientRect()\n const dropW = 260\n let left = rect.left\n if (left + dropW > window.innerWidth - 12) left = window.innerWidth - dropW - 12\n if (left < 8) left = 8\n setPos({ top: rect.bottom + 4, left })\n }, [open])\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n const target = e.target as Node\n if (ref.current?.contains(target)) return\n if (dropdownRef.current?.contains(target)) return\n setOpen(false)\n onOpenChange?.(false)\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open, onOpenChange])\n\n // Sync view month when value changes externally\n useEffect(() => {\n if (value) {\n const d = parseDate(value)\n setViewMonth(new Date(d.getFullYear(), d.getMonth(), 1))\n }\n }, [value])\n\n const monthLabel = viewMonth.toLocaleDateString(dateLocale, { month: 'long', year: 'numeric' })\n\n const weeks = useMemo(() => {\n const year = viewMonth.getFullYear()\n const month = viewMonth.getMonth()\n const firstDay = new Date(year, month, 1)\n const startOffset = firstDay.getDay()\n const daysInMonth = new Date(year, month + 1, 0).getDate()\n const prevMonthDays = new Date(year, month, 0).getDate()\n\n const cells: { date: Date; inMonth: boolean }[] = []\n for (let i = startOffset - 1; i >= 0; i--) {\n cells.push({ date: new Date(year, month - 1, prevMonthDays - i), inMonth: false })\n }\n for (let d = 1; d <= daysInMonth; d++) {\n cells.push({ date: new Date(year, month, d), inMonth: true })\n }\n while (cells.length % 7 !== 0) {\n cells.push({ date: new Date(year, month + 1, cells.length - startOffset - daysInMonth + 1), inMonth: false })\n }\n\n const rows: typeof cells[] = []\n for (let i = 0; i < cells.length; i += 7) rows.push(cells.slice(i, i + 7))\n return rows\n }, [viewMonth])\n\n function handleSelect(date: Date) {\n onChange(toDateStr(date))\n setOpen(false)\n }\n\n return (\n <div ref={ref} className={`relative ${className ?? ''}`}>\n {/* Trigger */}\n <button ref={triggerRef} type=\"button\" onClick={() => setOpen((p) => !p)}\n className=\"flex items-center gap-2 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm hover:bg-muted/30 transition-colors w-full text-left\">\n <Calendar className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n <span>{value ? formatDate(selectedDate, locale) : t('common.selectDate')}</span>\n </button>\n\n {/* Dropdown — portal to escape overflow containers */}\n {open && createPortal(\n <div ref={dropdownRef} data-modal-passthrough\n style={{ position: 'fixed', top: pos.top, left: pos.left, zIndex: 9999, pointerEvents: 'auto' }}\n className=\"fayz-glass-surface rounded-xl border bg-popover shadow-xl p-3 w-[260px]\">\n {/* Month nav */}\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium capitalize\">{monthLabel}</span>\n <div className=\"flex items-center gap-0.5\">\n <button type=\"button\" onClick={() => setViewMonth(new Date(viewMonth.getFullYear(), viewMonth.getMonth() - 1, 1))}\n className=\"flex h-7 w-7 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <button type=\"button\" onClick={() => setViewMonth(new Date(viewMonth.getFullYear(), viewMonth.getMonth() + 1, 1))}\n className=\"flex h-7 w-7 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n\n {/* Day labels */}\n <div className=\"grid grid-cols-7 mb-1\">\n {dayLabels.map((l, i) => (\n <div key={i} className=\"flex h-8 items-center justify-center text-[11px] font-medium text-muted-foreground\">{l}</div>\n ))}\n </div>\n\n {/* Dates */}\n {weeks.map((week, wi) => (\n <div key={wi} className=\"grid grid-cols-7\">\n {week.map(({ date, inMonth }, di) => {\n const sel = value && isSameDay(date, selectedDate)\n const today = isToday(date)\n return (\n <button key={di} type=\"button\"\n onClick={() => handleSelect(date)}\n className={`flex h-8 w-8 items-center justify-center rounded-full text-xs mx-auto transition-colors ${\n sel\n ? 'bg-primary text-primary-foreground font-semibold'\n : today\n ? 'bg-primary/10 text-primary font-semibold'\n : inMonth\n ? 'hover:bg-muted text-foreground'\n : 'text-muted-foreground/40 hover:bg-muted/50'\n }`}>\n {date.getDate()}\n </button>\n )\n })}\n </div>\n ))}\n\n {/* Today shortcut */}\n <div className=\"mt-2 pt-2 border-t\">\n <button type=\"button\" onClick={() => { handleSelect(new Date()) }}\n className=\"text-xs text-primary font-medium hover:underline\">{t('agenda.calendar.today')}</button>\n </div>\n </div>,\n document.body,\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { Search, X, ChevronDown, Loader2 } from 'lucide-react'\nimport { cn } from '../utils/cn'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SearchSelectOption {\n id: string\n label: string\n subtitle?: string\n icon?: React.ReactNode\n group?: string\n disabled?: boolean\n data?: any\n}\n\nexport interface SearchSelectProps {\n /** Currently selected option ID */\n value?: string\n /** Display text when a value is selected (overrides auto-lookup) */\n displayValue?: string\n /** Callback when an option is selected */\n onChange: (id: string, option: SearchSelectOption | null) => void\n /** Search function — async or sync. Called with debounced query. */\n onSearch: (query: string) => Promise<SearchSelectOption[]> | SearchSelectOption[]\n /** Placeholder text */\n placeholder?: string\n /** Label above the input */\n label?: string\n /** Required field indicator */\n required?: boolean\n /** Debounce delay in ms (default: 250) */\n debounce?: number\n /** Minimum characters before searching (default: 1) */\n minChars?: number\n /** Show a \"Create new\" action at the bottom */\n allowCreate?: boolean\n /** Label for create action (default: \"Add\") */\n createLabel?: string\n /** Callback when create is clicked. Can be async — component shows optimistic state while waiting. */\n onCreate?: (query: string) => void | Promise<void>\n /** Custom render for each option */\n renderOption?: (option: SearchSelectOption) => React.ReactNode\n /** Load initial results when dropdown opens (calls onSearch('')). Default\n * true — clicking lists options before any typing; pass false to require\n * a query first (e.g. very large datasets with no cheap top-N). */\n loadOnOpen?: boolean\n /** Additional className for the container */\n className?: string\n /** Disabled state */\n disabled?: boolean\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function SearchSelect({\n value,\n displayValue,\n onChange,\n onSearch,\n placeholder = 'Search...',\n label,\n required,\n debounce = 250,\n minChars = 1,\n allowCreate,\n createLabel = 'Add',\n onCreate,\n renderOption,\n loadOnOpen = true,\n className,\n disabled,\n}: SearchSelectProps) {\n const [open, setOpen] = React.useState(false)\n const [query, setQuery] = React.useState('')\n const [results, setResults] = React.useState<SearchSelectOption[]>([])\n const [loading, setLoading] = React.useState(false)\n const [creating, setCreating] = React.useState(false)\n const [selectedLabel, setSelectedLabel] = React.useState(displayValue ?? '')\n const containerRef = React.useRef<HTMLDivElement>(null)\n const inputRef = React.useRef<HTMLInputElement>(null)\n const timerRef = React.useRef<ReturnType<typeof setTimeout>>()\n\n // Close on outside click\n React.useEffect(() => {\n function handler(e: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false)\n }\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [])\n\n // Update display when value/displayValue changes externally\n React.useEffect(() => {\n if (displayValue !== undefined) setSelectedLabel(displayValue)\n }, [displayValue])\n\n // Load initial results when dropdown opens with empty query\n React.useEffect(() => {\n if (open && loadOnOpen && query.length === 0 && results.length === 0 && !loading) {\n setLoading(true)\n Promise.resolve(onSearch('')).then(setResults).catch(() => setResults([])).finally(() => setLoading(false))\n }\n }, [open, loadOnOpen])\n\n function handleQueryChange(q: string) {\n setQuery(q)\n if (timerRef.current) clearTimeout(timerRef.current)\n\n if (q.length < minChars && !(loadOnOpen && q.length === 0)) {\n setResults([])\n setLoading(false)\n return\n }\n\n setLoading(true)\n timerRef.current = setTimeout(async () => {\n try {\n const res = await onSearch(q)\n setResults(res)\n } catch {\n setResults([])\n }\n setLoading(false)\n }, debounce)\n }\n\n function handleSelect(option: SearchSelectOption) {\n onChange(option.id, option)\n setSelectedLabel(option.label)\n setOpen(false)\n setQuery('')\n setResults([])\n }\n\n function handleClear() {\n onChange('', null)\n setSelectedLabel('')\n setQuery('')\n setResults([])\n }\n\n async function handleCreate(name: string) {\n if (!onCreate) return\n setCreating(true)\n setSelectedLabel(name)\n setOpen(false)\n setQuery('')\n setResults([])\n try {\n await onCreate(name)\n } finally {\n setCreating(false)\n }\n }\n\n function handleOpen() {\n if (disabled || creating) return\n setOpen(true)\n setQuery('')\n // Stale results from a previous typed query would render for the empty\n // query now that the dropdown shows immediately — drop them so the\n // loadOnOpen effect refetches the initial listing.\n setResults([])\n setTimeout(() => inputRef.current?.focus(), 0)\n }\n\n // Group results\n const groups = React.useMemo(() => {\n const map = new Map<string, SearchSelectOption[]>()\n for (const opt of results) {\n const group = opt.group ?? ''\n if (!map.has(group)) map.set(group, [])\n map.get(group)!.push(opt)\n }\n return map\n }, [results])\n\n const hasValue = !!value && !!selectedLabel\n // With loadOnOpen the dropdown must show for the EMPTY query too — gating it\n // on minChars silently hid the initial listing loadOnOpen had just fetched.\n const showDropdown = open && (query.length >= minChars || loadOnOpen)\n\n return (\n <div ref={containerRef} className={cn('relative', className)}>\n {label && (\n <label className=\"text-xs font-medium text-muted-foreground\">\n {label}{required && ' *'}\n </label>\n )}\n\n {/* Trigger — shows selected value or search input */}\n <div\n className={cn(\n 'mt-1 flex items-center gap-2 rounded-lg border bg-background transition-colors',\n open ? 'ring-2 ring-primary/20' : 'hover:bg-muted/30',\n disabled && 'opacity-50 cursor-not-allowed',\n )}\n >\n <Search className=\"h-3.5 w-3.5 text-muted-foreground ml-3 shrink-0\" />\n {open ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => handleQueryChange(e.target.value)}\n placeholder={placeholder}\n className=\"flex-1 bg-transparent py-2 pr-3 text-sm outline-none\"\n onKeyDown={(e) => {\n if (e.key === 'Escape') setOpen(false)\n }}\n />\n ) : (\n <button\n type=\"button\"\n onClick={handleOpen}\n className=\"flex-1 text-left py-2 pr-3 text-sm outline-none\"\n disabled={disabled || creating}\n >\n {creating ? (\n <span className=\"flex items-center gap-1.5 text-muted-foreground\">\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n <span className=\"font-medium text-foreground\">{selectedLabel}</span>\n </span>\n ) : hasValue ? (\n <span className=\"font-medium\">{selectedLabel}</span>\n ) : (\n <span className=\"text-muted-foreground\">{placeholder}</span>\n )}\n </button>\n )}\n {hasValue && !open && (\n <button onClick={handleClear} className=\"pr-3 text-muted-foreground hover:text-foreground\">\n <X className=\"h-3 w-3\" />\n </button>\n )}\n {!hasValue && !open && (\n <ChevronDown className=\"h-3 w-3 text-muted-foreground mr-3 shrink-0\" />\n )}\n </div>\n\n {/* Dropdown */}\n {showDropdown && (\n <div className=\"fayz-glass-surface absolute top-full left-0 right-0 z-50 mt-1 rounded-lg border bg-popover shadow-lg overflow-hidden\">\n {loading ? (\n <div className=\"flex items-center justify-center gap-2 px-4 py-6 text-xs text-muted-foreground\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" /> Searching...\n </div>\n ) : results.length === 0 ? (\n <div className=\"px-4 py-4 text-center\">\n <p className=\"text-xs text-muted-foreground\">{query ? `No results for \"${query}\"` : 'No results'}</p>\n {allowCreate && onCreate && (\n <button\n onClick={() => handleCreate(query)}\n className=\"mt-2 text-xs text-primary hover:underline\"\n >\n + {createLabel} \"{query}\"\n </button>\n )}\n </div>\n ) : (\n <div className=\"max-h-64 overflow-auto py-1\">\n {[...groups.entries()].map(([group, options]) => (\n <React.Fragment key={group}>\n {group && (\n <div className=\"sticky top-0 bg-muted/50 px-3 py-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n {group}\n </div>\n )}\n {options.map((opt) => (\n <button\n key={opt.id}\n onClick={() => handleSelect(opt)}\n disabled={opt.disabled}\n className={cn(\n 'w-full text-left px-3 py-2 hover:bg-muted/50 transition-colors flex items-center gap-2.5',\n opt.disabled && 'opacity-40 cursor-not-allowed',\n opt.id === value && 'bg-muted/30',\n )}\n >\n {renderOption ? renderOption(opt) : (\n <>\n {opt.icon}\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm truncate\">{opt.label}</p>\n {opt.subtitle && <p className=\"text-[10px] text-muted-foreground truncate\">{opt.subtitle}</p>}\n </div>\n </>\n )}\n </button>\n ))}\n </React.Fragment>\n ))}\n {allowCreate && onCreate && (\n <button\n onClick={() => handleCreate(query)}\n className=\"w-full text-left px-3 py-2 text-xs text-primary hover:bg-muted/50 transition-colors border-t\"\n >\n + {createLabel} \"{query}\"\n </button>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../utils/cn'\n\ninterface CurrencyInputProps {\n value: number\n onChange: (value: number) => void\n symbol?: string\n locale?: string\n currencyCode?: string\n label?: string\n placeholder?: string\n className?: string\n disabled?: boolean\n}\n\n/**\n * Currency input with automatic decimal formatting.\n *\n * - Always displays the value with 2 decimal places using the project's locale\n * - Input works like an ATM: digits push from right, decimals are fixed\n * - Typing \"12345\" shows \"123,45\" (or \"123.45\" depending on locale)\n * - Backspace removes the last digit\n * - Supports the project currency symbol\n */\nexport function CurrencyInput({\n value,\n onChange,\n symbol = 'R$',\n locale = 'pt-BR',\n currencyCode = 'BRL',\n label,\n placeholder,\n className,\n disabled,\n}: CurrencyInputProps) {\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [focused, setFocused] = React.useState(false)\n\n // Format number to locale string with 2 decimals\n const format = React.useCallback((v: number) => {\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(v)\n }, [locale])\n\n const displayValue = format(value)\n\n // Handle key-by-key input — ATM-style (digits push from right)\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n if (disabled) return\n\n // Allow tab, arrow keys, etc.\n if (['Tab', 'Escape', 'ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(e.key)) return\n\n e.preventDefault()\n\n if (e.key === 'Backspace' || e.key === 'Delete') {\n // Remove last digit: 123.45 → 12.34\n const cents = Math.floor(Math.round(value * 100) / 10)\n onChange(cents / 100)\n return\n }\n\n // Only accept digits\n if (!/^\\d$/.test(e.key)) return\n\n // Append digit: 12.34 + '5' → 123.45\n const currentCents = Math.round(value * 100)\n const newCents = currentCents * 10 + parseInt(e.key, 10)\n // Cap at 999,999,999.99\n if (newCents > 99999999999) return\n onChange(newCents / 100)\n }\n\n // Handle paste — parse number from pasted text\n function handlePaste(e: React.ClipboardEvent) {\n e.preventDefault()\n const text = e.clipboardData.getData('text')\n // Remove everything except digits, dots, commas\n const cleaned = text.replace(/[^\\d.,]/g, '')\n // Replace comma with dot for parsing\n const normalized = cleaned.replace(',', '.')\n const parsed = parseFloat(normalized)\n if (!isNaN(parsed)) {\n onChange(Math.round(parsed * 100) / 100)\n }\n }\n\n return (\n <div className={className}>\n {label && <label className=\"text-xs font-medium text-muted-foreground\">{label}</label>}\n <div\n className={cn(\n 'flex items-center rounded-lg border border-input bg-background ring-offset-background transition-colors cursor-text',\n label && 'mt-1',\n focused && 'border-ring ring-2 ring-ring ring-offset-2',\n disabled && 'opacity-50 cursor-not-allowed',\n )}\n onClick={() => inputRef.current?.focus()}\n >\n <span className=\"pl-3 pr-1 text-sm font-medium text-muted-foreground select-none\">{symbol}</span>\n <input\n ref={inputRef}\n type=\"text\"\n inputMode=\"numeric\"\n value={displayValue}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n placeholder={placeholder ?? format(0)}\n disabled={disabled}\n readOnly={false}\n className=\"flex-1 bg-transparent px-2 py-2 text-sm outline-none text-right tabular-nums caret-primary selection:bg-primary/20\"\n onChange={() => {}}\n />\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { AlertTriangle, Info, CheckCircle2, XCircle } from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { Button } from './button'\n\ntype ConfirmVariant = 'default' | 'destructive' | 'warning' | 'success'\n\ninterface ConfirmDialogProps {\n open: boolean\n onConfirm: () => void\n onCancel: () => void\n title: string\n description?: string\n confirmLabel?: string\n cancelLabel?: string\n variant?: ConfirmVariant\n loading?: boolean\n}\n\nconst VARIANT_CONFIG: Record<\n ConfirmVariant,\n {\n icon: React.ElementType\n iconBg: string\n iconColor: string\n buttonVariant: 'default' | 'destructive'\n }\n> = {\n default: {\n icon: Info,\n iconBg: 'bg-info/10',\n iconColor: 'text-info',\n buttonVariant: 'default',\n },\n destructive: {\n icon: XCircle,\n iconBg: 'bg-destructive/10',\n iconColor: 'text-destructive',\n buttonVariant: 'destructive',\n },\n warning: {\n icon: AlertTriangle,\n iconBg: 'bg-warning/10',\n iconColor: 'text-warning',\n buttonVariant: 'destructive',\n },\n success: {\n icon: CheckCircle2,\n iconBg: 'bg-success/10',\n iconColor: 'text-success',\n buttonVariant: 'default',\n },\n}\n\nexport function ConfirmDialog({\n open,\n onConfirm,\n onCancel,\n title,\n description,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n variant = 'default',\n loading = false,\n}: ConfirmDialogProps) {\n const config = VARIANT_CONFIG[variant]\n const Icon = config.icon\n\n React.useEffect(() => {\n if (!open) return\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') onCancel()\n }\n document.addEventListener('keydown', handleKey)\n return () => document.removeEventListener('keydown', handleKey)\n }, [open, onCancel])\n\n if (!open) return null\n\n return createPortal(\n <div className=\"fixed inset-0 z-[60] flex items-center justify-center\">\n <div\n className=\"absolute inset-0 bg-black/50 backdrop-blur-[2px] animate-fade-in\"\n onClick={onCancel}\n />\n\n <div\n className=\"relative z-10 w-full max-w-sm mx-4 rounded-modal border border-border bg-card shadow-lg animate-zoom-in\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"confirm-title\"\n aria-describedby={description ? 'confirm-desc' : undefined}\n >\n <div className=\"p-6\">\n <div className=\"flex gap-4\">\n <div className={cn('flex h-10 w-10 items-center justify-center rounded-full shrink-0', config.iconBg)}>\n <Icon className={cn('h-5 w-5', config.iconColor)} />\n </div>\n <div className=\"min-w-0 pt-0.5\">\n <h3 id=\"confirm-title\" className=\"text-sm font-semibold text-foreground\">\n {title}\n </h3>\n {description && (\n <p id=\"confirm-desc\" className=\"text-xs text-muted-foreground mt-1 leading-relaxed\">\n {description}\n </p>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 mt-5\">\n <Button variant=\"outline\" size=\"sm\" onClick={onCancel} disabled={loading}>\n {cancelLabel}\n </Button>\n <Button variant={config.buttonVariant} size=\"sm\" onClick={onConfirm} disabled={loading}>\n {loading ? 'Processing...' : confirmLabel}\n </Button>\n </div>\n </div>\n </div>\n </div>,\n document.body,\n )\n}\n","import * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { cn } from '../utils/cn'\n\nconst Popover = PopoverPrimitive.Root\nconst PopoverTrigger = PopoverPrimitive.Trigger\nconst PopoverAnchor = PopoverPrimitive.Anchor\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = 'start', sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'fayz-glass-surface z-[110] w-72 rounded-xl border bg-popover p-0 text-popover-foreground shadow-lg outline-none',\n 'data-[state=open]:animate-zoom-in data-[state=closed]:animate-zoom-out',\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n))\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverAnchor, PopoverContent }\n","import * as React from 'react'\nimport { cn } from '../utils/cn'\n\n/**\n * Minimal markdown renderer — builds React elements directly (no HTML string,\n * no dangerouslySetInnerHTML), so untrusted content is safe by construction.\n * Supports the subset content docs actually use: h1–h3, ---, blockquote,\n * ul/ol, paragraphs, and inline **bold** / *italic* / `code`.\n */\n\nconst INLINE_TOKEN = /(\\*\\*[^*]+\\*\\*|\\*[^*]+\\*|`[^`]+`)/g\n\nfunction renderInline(text: string, keyPrefix: string): React.ReactNode[] {\n return text.split(INLINE_TOKEN).map((part, i) => {\n const key = `${keyPrefix}-${i}`\n if (part.startsWith('**') && part.endsWith('**') && part.length > 4) {\n return <strong key={key}>{part.slice(2, -2)}</strong>\n }\n if (part.startsWith('*') && part.endsWith('*') && part.length > 2) {\n return <em key={key}>{part.slice(1, -1)}</em>\n }\n if (part.startsWith('`') && part.endsWith('`') && part.length > 2) {\n return (\n <code key={key} className=\"rounded bg-muted px-1 py-0.5 font-mono text-[0.85em]\">\n {part.slice(1, -1)}\n </code>\n )\n }\n return part === '' ? null : <React.Fragment key={key}>{part}</React.Fragment>\n })\n}\n\ntype Block =\n | { type: 'heading'; level: 1 | 2 | 3; text: string }\n | { type: 'hr' }\n | { type: 'blockquote'; lines: string[] }\n | { type: 'ul'; items: string[] }\n | { type: 'ol'; items: string[] }\n | { type: 'p'; lines: string[] }\n\nfunction parseBlocks(source: string): Block[] {\n const lines = source.replace(/\\r\\n/g, '\\n').split('\\n')\n const blocks: Block[] = []\n let i = 0\n while (i < lines.length) {\n const line = lines[i]\n const trimmed = line.trim()\n if (trimmed === '') { i++; continue }\n const heading = /^(#{1,3})\\s+(.*)$/.exec(trimmed)\n if (heading) {\n blocks.push({ type: 'heading', level: heading[1].length as 1 | 2 | 3, text: heading[2] })\n i++\n continue\n }\n if (/^(-{3,}|\\*{3,})$/.test(trimmed)) {\n blocks.push({ type: 'hr' })\n i++\n continue\n }\n if (trimmed.startsWith('>')) {\n const quote: string[] = []\n while (i < lines.length && lines[i].trim().startsWith('>')) {\n quote.push(lines[i].trim().replace(/^>\\s?/, ''))\n i++\n }\n blocks.push({ type: 'blockquote', lines: quote })\n continue\n }\n if (/^[-*]\\s+/.test(trimmed)) {\n const items: string[] = []\n while (i < lines.length && /^[-*]\\s+/.test(lines[i].trim())) {\n items.push(lines[i].trim().replace(/^[-*]\\s+/, ''))\n i++\n }\n blocks.push({ type: 'ul', items })\n continue\n }\n if (/^\\d+[.)]\\s+/.test(trimmed)) {\n const items: string[] = []\n while (i < lines.length && /^\\d+[.)]\\s+/.test(lines[i].trim())) {\n items.push(lines[i].trim().replace(/^\\d+[.)]\\s+/, ''))\n i++\n }\n blocks.push({ type: 'ol', items })\n continue\n }\n const para: string[] = []\n while (i < lines.length && lines[i].trim() !== '' && !/^(#{1,3}\\s|>|[-*]\\s|\\d+[.)]\\s|-{3,}$|\\*{3,}$)/.test(lines[i].trim())) {\n para.push(lines[i].trim())\n i++\n }\n blocks.push({ type: 'p', lines: para })\n }\n return blocks\n}\n\nconst HEADING_CLASS: Record<1 | 2 | 3, string> = {\n 1: 'text-xl font-semibold tracking-tight',\n 2: 'text-base font-semibold tracking-tight',\n 3: 'text-sm font-semibold',\n}\n\nexport function renderMarkdown(source: string): React.ReactNode {\n const blocks = parseBlocks(source)\n return blocks.map((block, bi) => {\n const key = `md-${bi}`\n switch (block.type) {\n case 'heading': {\n const Tag = (`h${block.level}`) as 'h1' | 'h2' | 'h3'\n return (\n <Tag key={key} className={HEADING_CLASS[block.level]}>\n {renderInline(block.text, key)}\n </Tag>\n )\n }\n case 'hr':\n return <hr key={key} className=\"border-border\" />\n case 'blockquote':\n return (\n <blockquote key={key} className=\"border-l-2 border-border pl-3 text-muted-foreground\">\n {block.lines.map((l, li) => (\n <p key={`${key}-${li}`}>{renderInline(l, `${key}-${li}`)}</p>\n ))}\n </blockquote>\n )\n case 'ul':\n return (\n <ul key={key} className=\"list-disc space-y-1 pl-5\">\n {block.items.map((item, li) => (\n <li key={`${key}-${li}`}>{renderInline(item, `${key}-${li}`)}</li>\n ))}\n </ul>\n )\n case 'ol':\n return (\n <ol key={key} className=\"list-decimal space-y-1 pl-5\">\n {block.items.map((item, li) => (\n <li key={`${key}-${li}`}>{renderInline(item, `${key}-${li}`)}</li>\n ))}\n </ol>\n )\n case 'p':\n return (\n <p key={key}>\n {block.lines.map((l, li) => (\n <React.Fragment key={`${key}-${li}`}>\n {li > 0 && <br />}\n {renderInline(l, `${key}-${li}`)}\n </React.Fragment>\n ))}\n </p>\n )\n }\n })\n}\n\nexport interface MarkdownProps {\n source: string\n className?: string\n}\n\n/** Rendered markdown block — spacing tuned for script/brief documents. */\nexport function Markdown({ source, className }: MarkdownProps) {\n return (\n <div className={cn('space-y-3 text-sm leading-relaxed text-foreground', className)}>\n {renderMarkdown(source)}\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../utils/cn'\nimport { SegmentedControl } from './segmented-control'\nimport { Markdown } from './markdown'\n\nexport interface MarkdownEditorProps {\n value: string\n onChange: (value: string) => void\n placeholder?: string\n /** Minimum visible rows for the textarea. */\n minRows?: number\n defaultMode?: 'edit' | 'preview'\n /** i18n injection — ui stays locale-agnostic. */\n editLabel?: string\n previewLabel?: string\n /** Custom preview renderer — e.g. a social-post mockup instead of plain\n * markdown. Defaults to the built-in Markdown renderer. */\n renderPreview?: (value: string) => React.ReactNode\n className?: string\n}\n\n/**\n * Markdown editor with an edit/preview toggle. Plain textarea + the zero-dep\n * Markdown renderer — deliberately not a block/WYSIWYG editor (that's a later\n * milestone); this covers script/brief documents today.\n */\nexport function MarkdownEditor({\n value,\n onChange,\n placeholder,\n minRows = 16,\n defaultMode = 'preview',\n editLabel = 'Edit',\n previewLabel = 'Preview',\n renderPreview,\n className,\n}: MarkdownEditorProps) {\n const [mode, setMode] = React.useState<'edit' | 'preview'>(\n defaultMode === 'preview' && value.trim() === '' ? 'edit' : defaultMode,\n )\n return (\n <div className={cn('flex flex-col gap-2', className)}>\n <div className=\"flex justify-end\">\n <SegmentedControl\n aria-label=\"Markdown mode\"\n options={[\n { value: 'edit', label: editLabel },\n { value: 'preview', label: previewLabel },\n ]}\n value={mode}\n onChange={(m) => setMode(m as 'edit' | 'preview')}\n />\n </div>\n {mode === 'edit' ? (\n <textarea\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n rows={Math.max(minRows, value.split('\\n').length + 1)}\n className={cn(\n 'w-full resize-y rounded-md border border-border bg-card p-3',\n 'font-mono text-[13px] leading-relaxed text-foreground',\n 'placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring',\n )}\n />\n ) : renderPreview ? (\n renderPreview(value)\n ) : (\n <div className=\"rounded-md border border-border bg-card p-4\">\n <Markdown source={value} />\n </div>\n )}\n </div>\n )\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Search, Plus } from 'lucide-react'\n\n// ---------------------------------------------------------------------------\n// Reusable search combobox with keyboard navigation + optional create\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxOption {\n id: string\n label: string\n subtitle?: string\n price?: number\n data?: Record<string, unknown>\n}\n\ninterface SearchComboboxProps {\n value: string\n onChange: (value: string) => void\n onSelect: (option: ComboboxOption) => void\n options: ComboboxOption[]\n placeholder?: string\n autoFocus?: boolean\n onBlurEmpty?: () => void\n renderRight?: (option: ComboboxOption) => React.ReactNode\n /** Show a \"+ Create ...\" option when search has no exact match */\n allowCreate?: boolean\n /** Called when user clicks the create option. Receives the current search text. */\n onCreateNew?: (searchText: string) => void\n /** Label for the create option (default: 'Create') */\n createLabel?: string\n className?: string\n /** Minimal style — no border/bg, just underline on focus. For inline use. */\n minimal?: boolean\n /** Inline label shown when collapsed. Click reveals the search input. */\n inlineLabel?: string\n /** Icon for the inline label: 'search' (default) or 'plus' (for \"add\" actions) */\n inlineIcon?: 'search' | 'plus'\n /** Show a loading skeleton in the dropdown while results are being fetched */\n loading?: boolean\n /** Called when the input gains focus */\n onFocus?: () => void\n}\n\nexport function SearchCombobox({\n value, onChange, onSelect, options, placeholder, autoFocus, onBlurEmpty,\n renderRight, allowCreate, onCreateNew, createLabel = 'Create', className, minimal, inlineLabel, inlineIcon = 'search',\n loading, onFocus: onFocusProp,\n}: SearchComboboxProps) {\n const [open, setOpen] = useState(false)\n const [activeIndex, setActiveIndex] = useState(-1)\n const [expanded, setExpanded] = useState(!inlineLabel)\n const [dropRect, setDropRect] = useState<DOMRect | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const wrapperRef = useRef<HTMLDivElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n\n // When value is set externally (e.g. edit mode), auto-expand; collapse when cleared\n useEffect(() => {\n if (value && inlineLabel) setExpanded(true)\n if (!value && inlineLabel && !open) setExpanded(false)\n }, [value, open])\n\n function updateRect() {\n if (wrapperRef.current) setDropRect(wrapperRef.current.getBoundingClientRect())\n }\n\n // Show create option only when dropdown is open, has text, and no exact match\n const showCreate = open && allowCreate && onCreateNew && value.trim().length > 0 &&\n !options.some((o) => o.label.toLowerCase() === value.trim().toLowerCase())\n\n const totalItems = options.length + (showCreate ? 1 : 0)\n\n useEffect(() => { setActiveIndex(-1) }, [options])\n useEffect(() => {\n if ((options.length > 0 || showCreate || loading) && document.activeElement === inputRef.current) setOpen(true)\n }, [options, showCreate, loading])\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (!open || totalItems === 0) {\n if (e.key === 'ArrowDown' && totalItems > 0) {\n e.preventDefault()\n setOpen(true)\n setActiveIndex(0)\n }\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setActiveIndex((prev) => (prev + 1) % totalItems)\n break\n case 'ArrowUp':\n e.preventDefault()\n setActiveIndex((prev) => (prev <= 0 ? totalItems - 1 : prev - 1))\n break\n case 'Enter':\n e.preventDefault()\n if (activeIndex >= 0 && activeIndex < options.length) {\n onSelect(options[activeIndex])\n setOpen(false)\n setActiveIndex(-1)\n } else if (showCreate && activeIndex === options.length) {\n onCreateNew?.(value.trim())\n setOpen(false)\n setActiveIndex(-1)\n }\n break\n case 'Escape':\n e.preventDefault()\n setOpen(false)\n setActiveIndex(-1)\n break\n }\n }, [open, options, totalItems, activeIndex, onSelect, showCreate, onCreateNew, value])\n\n useEffect(() => {\n if (activeIndex < 0 || !listRef.current) return\n const items = listRef.current.children\n if (items[activeIndex]) (items[activeIndex] as HTMLElement).scrollIntoView({ block: 'nearest' })\n }, [activeIndex])\n\n function handleBlur() {\n setTimeout(() => {\n setOpen(false)\n setActiveIndex(-1)\n if (!value && onBlurEmpty) onBlurEmpty()\n if (!value && inlineLabel) setExpanded(false)\n }, 200)\n }\n\n const hasDropdown = open && (options.length > 0 || showCreate || loading)\n\n // Collapsed inline label — click to expand\n if (!expanded && inlineLabel) {\n const isPlus = inlineIcon === 'plus'\n return (\n <button type=\"button\" onClick={() => { setExpanded(true); setTimeout(() => inputRef.current?.focus(), 50) }}\n className={`flex items-center gap-1.5 w-full text-left text-sm py-1.5 pl-2 transition-colors ${\n isPlus ? 'text-primary hover:text-primary/80' : 'text-muted-foreground hover:text-foreground'\n } ${className ?? ''}`}>\n {isPlus && <Plus className=\"h-3.5 w-3.5 shrink-0\" />}\n {inlineLabel}\n </button>\n )\n }\n\n return (\n <div ref={wrapperRef} className={`relative ${className ?? ''}`}>\n {!minimal && (\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground pointer-events-none\" />\n )}\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n onChange={(e) => { onChange(e.target.value); updateRect(); setOpen(true) }}\n onFocus={() => { updateRect(); onFocusProp?.(); if (options.length > 0 || showCreate || loading) setOpen(true) }}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n autoFocus={autoFocus}\n className={minimal\n ? 'w-full bg-transparent pl-2 pr-3 py-1.5 text-sm placeholder:text-muted-foreground focus:outline-none border-b border-transparent hover:border-border focus:border-foreground transition-colors'\n : 'w-full rounded-lg border bg-background pl-8 pr-3 py-2 text-sm placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring'\n }\n role=\"combobox\"\n aria-expanded={hasDropdown}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeIndex >= 0 ? `combobox-opt-${activeIndex}` : undefined}\n />\n {hasDropdown && dropRect && createPortal(\n <div ref={listRef} role=\"listbox\" data-modal-passthrough\n style={{ position: 'fixed', left: dropRect.left, top: dropRect.bottom + 4, width: dropRect.width, zIndex: 9999, pointerEvents: 'auto' }}\n className=\"fayz-glass-surface max-h-52 overflow-y-auto rounded-lg border bg-popover shadow-lg py-0.5 animate-in fade-in zoom-in-95 duration-100\">\n {loading && options.length === 0 && (\n <div className=\"flex items-center gap-2 px-3 py-2 text-sm text-muted-foreground\">\n <svg className=\"h-3.5 w-3.5 animate-spin shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" opacity=\"0.25\" />\n <path d=\"M14.5 8a6.5 6.5 0 00-6.5-6.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n <span>Buscando…</span>\n </div>\n )}\n {options.map((opt, i) => (\n <div key={opt.id} id={`combobox-opt-${i}`} role=\"option\" aria-selected={i === activeIndex}\n onMouseDown={(e) => { e.preventDefault(); onSelect(opt); setOpen(false) }}\n onMouseEnter={() => setActiveIndex(i)}\n className={`flex w-full items-center gap-2 px-3 py-2 text-sm cursor-pointer transition-colors ${\n i === activeIndex ? 'bg-primary/10 text-primary' : 'hover:bg-muted/50'\n }`}>\n <div className=\"flex-1 min-w-0\">\n <p className=\"truncate font-medium\">{opt.label}</p>\n {opt.subtitle && <p className=\"truncate text-[11px] text-muted-foreground\">{opt.subtitle}</p>}\n </div>\n {renderRight && <div className=\"shrink-0\">{renderRight(opt)}</div>}\n </div>\n ))}\n {showCreate && (\n <div id={`combobox-opt-${options.length}`} role=\"option\" aria-selected={activeIndex === options.length}\n onMouseDown={(e) => { e.preventDefault(); onCreateNew?.(value.trim()); setOpen(false) }}\n onMouseEnter={() => setActiveIndex(options.length)}\n className={`flex w-full items-center gap-2 px-3 py-2 text-sm cursor-pointer transition-colors border-t ${\n activeIndex === options.length ? 'bg-primary/10 text-primary' : 'hover:bg-muted/50'\n }`}>\n <Plus className=\"h-3.5 w-3.5 shrink-0\" />\n <span>{createLabel} &ldquo;<span className=\"font-medium\">{value.trim()}</span>&rdquo;</span>\n </div>\n )}\n </div>,\n document.body,\n )}\n </div>\n )\n}\n"]}
@@ -420,14 +420,15 @@ function useTheme() {
420
420
  function createTheme(overrides) {
421
421
  const colors = { ...lightTheme.colors, ...overrides.colors };
422
422
  if (overrides.brand) {
423
- colors.primary = overrides.brand;
424
- colors.primaryForeground = "0 0% 100%";
425
- colors.ring = overrides.brand;
423
+ const given = overrides.colors ?? {};
424
+ if (given.primary == null) colors.primary = overrides.brand;
425
+ if (given.primaryForeground == null) colors.primaryForeground = "0 0% 100%";
426
+ if (given.ring == null) colors.ring = overrides.brand;
426
427
  const parts = overrides.brand.split(" ");
427
428
  if (parts.length >= 3) {
428
429
  const hue = (parseFloat(parts[0]) - 50 + 360) % 360;
429
- colors.accent = `${hue} ${parts[1]} ${parts[2]}`;
430
- colors.accentForeground = "0 0% 100%";
430
+ if (given.accent == null) colors.accent = `${hue} ${parts[1]} ${parts[2]}`;
431
+ if (given.accentForeground == null) colors.accentForeground = "0 0% 100%";
431
432
  }
432
433
  }
433
434
  return {
@@ -441,5 +442,5 @@ function createTheme(overrides) {
441
442
  }
442
443
 
443
444
  export { ThemeProvider, createFayzTheme, createTheme, darkTheme, fayzThemePresets, lightTheme, useTheme, useThemeStore };
444
- //# sourceMappingURL=chunk-O5F4LLSL.js.map
445
- //# sourceMappingURL=chunk-O5F4LLSL.js.map
445
+ //# sourceMappingURL=chunk-DYMBFHD7.js.map
446
+ //# sourceMappingURL=chunk-DYMBFHD7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stores/theme.store.ts","../src/theme/presets.ts","../src/theme/index.ts"],"names":[],"mappings":"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","file":"chunk-DYMBFHD7.js","sourcesContent":["import { create, type StoreApi, type UseBoundStore } from 'zustand'\n\n// ---------------------------------------------------------------------------\n// Theme token types\n// ---------------------------------------------------------------------------\n\nexport interface SemanticColors {\n primary: string\n primaryForeground: string\n secondary: string\n secondaryForeground: string\n accent: string\n accentForeground: string\n background: string\n foreground: string\n card: string\n cardForeground: string\n muted: string\n mutedForeground: string\n border: string\n input: string\n ring: string\n popover: string\n popoverForeground: string\n destructive: string\n destructiveForeground: string\n success: string\n successForeground: string\n warning: string\n warningForeground: string\n // Layout surface colors\n sidebar: string\n sidebarForeground: string\n sidebarBorder: string\n sidebarAccent: string\n sidebarAccentForeground: string\n sidebarMuted: string\n content: string\n}\n\nexport interface UIPerceptionTokens {\n buttonRadius: string\n cardRadius: string\n inputRadius: string\n modalRadius: string\n fontFamily: string\n fontFamilyMono: string\n shadowSm: string\n shadowMd: string\n shadowLg: string\n shadowButton?: string\n shadowButtonPrimary?: string\n shadowButtonInset?: string\n surfaceBackdropFilter?: string\n modalBackground?: string\n modalBorder?: string\n modalOverlayBackground?: string\n modalOverlayBackdropFilter?: string\n modalShadow?: string\n glassEdgeGradient?: string\n glassPrimaryEdgeGradient?: string\n glassInnerHighlight?: string\n fieldBackground?: string\n fieldBorder?: string\n fieldShadow?: string\n buttonBackground?: string\n buttonBackgroundHover?: string\n buttonBorder?: string\n buttonPrimaryBackground?: string\n buttonPrimaryBackgroundHover?: string\n buttonPrimaryBorder?: string\n buttonBackdropFilter?: string\n}\n\nexport interface ThemeTokens {\n name: string\n colors: SemanticColors\n perception: UIPerceptionTokens\n}\n\nexport interface CreateThemeOptions {\n name?: string\n colors?: Partial<SemanticColors>\n /** Dark mode color overrides — applied instead of `colors` when in dark mode */\n darkColors?: Partial<SemanticColors>\n perception?: Partial<UIPerceptionTokens>\n /** Shorthand: single HSL value that auto-derives primary, ring, and accent */\n brand?: string\n}\n\n// ---------------------------------------------------------------------------\n// Built-in themes\n// ---------------------------------------------------------------------------\n\nexport const lightTheme: ThemeTokens = {\n name: 'light',\n colors: {\n primary: '0 0% 18.8%',\n primaryForeground: '0 0% 100%',\n secondary: '0 0% 96.9%',\n secondaryForeground: '0 0% 18.8%',\n accent: '0 0% 94.5%',\n accentForeground: '0 0% 18.8%',\n background: '0 0% 94.5%',\n foreground: '0 0% 18.8%',\n card: '0 0% 100%',\n cardForeground: '0 0% 18.8%',\n muted: '0 0% 96.9%',\n mutedForeground: '0 0% 38%',\n border: '0 0% 89%',\n input: '0 0% 54.1%',\n ring: '214 100% 41.4%',\n popover: '0 0% 100%',\n popoverForeground: '0 0% 18.8%',\n destructive: '354 92% 41%',\n destructiveForeground: '0 0% 100%',\n success: '167 95% 25.1%',\n successForeground: '0 0% 100%',\n warning: '43 100% 50%',\n warningForeground: '0 0% 18.8%',\n sidebar: '0 0% 92.2%',\n sidebarForeground: '0 0% 18.8%',\n sidebarBorder: '0 0% 86.3%',\n sidebarAccent: '0 0% 100%',\n sidebarAccentForeground: '0 0% 18.8%',\n sidebarMuted: '0 0% 38%',\n content: '0 0% 94.5%',\n },\n perception: {\n buttonRadius: '0.5rem',\n cardRadius: '0.5rem',\n inputRadius: '0.5rem',\n modalRadius: '1rem',\n fontFamily: 'Inter, ui-sans-serif, system-ui, -apple-system, sans-serif',\n fontFamilyMono: 'JetBrains Mono, ui-monospace, SFMono-Regular, monospace',\n shadowSm: '0 1px 0 rgba(0, 0, 0, 0.05), 0 1px 3px 0 rgba(26, 26, 26, 0.06), 0 1px 2px -1px rgba(26, 26, 26, 0.06)',\n shadowMd: '0 1px 1px -1px rgba(26, 26, 26, 0.07), 0 4px 8px -2px rgba(26, 26, 26, 0.10)',\n shadowLg: '0 4px 12px -2px rgba(26, 26, 26, 0.15), 0 1px 3px rgba(26, 26, 26, 0.08)',\n shadowButton:\n 'inset 0 -1px 0 rgba(0,0,0,0.10), inset 0 1px 0 rgba(255,255,255,0.50), 0 1px 0 rgba(0,0,0,0.05)',\n shadowButtonPrimary:\n 'inset 0 -1px 0 rgba(0,0,0,0.20), inset 0 1px 0 rgba(255,255,255,0.20), 0 1px 1.5px rgba(0,0,0,0.20)',\n shadowButtonInset:\n 'inset 0 2px 1px -1px rgba(0,0,0,0.20), inset 0 0 0 1px rgba(0,0,0,0.05)',\n surfaceBackdropFilter: 'none',\n buttonBackground: 'hsl(var(--card))',\n buttonBackgroundHover: 'hsl(var(--muted))',\n buttonBorder: 'hsl(var(--border))',\n buttonPrimaryBackground: 'hsl(var(--primary))',\n buttonPrimaryBackgroundHover: 'hsl(var(--primary) / 0.9)',\n buttonPrimaryBorder: 'hsl(var(--primary))',\n buttonBackdropFilter: 'none',\n },\n}\n\nexport const darkTheme: ThemeTokens = {\n name: 'dark',\n colors: {\n primary: '0 0% 100%',\n primaryForeground: '0 0% 10.2%',\n secondary: '0 0% 18.8%',\n secondaryForeground: '0 0% 89%',\n accent: '0 0% 22.7%',\n accentForeground: '0 0% 100%',\n background: '0 0% 10.2%',\n foreground: '0 0% 89%',\n card: '0 0% 14.9%',\n cardForeground: '0 0% 89%',\n muted: '0 0% 18.8%',\n mutedForeground: '0 0% 64.7%',\n border: '0 0% 22.7%',\n input: '0 0% 32.2%',\n ring: '217 100% 68.4%',\n popover: '0 0% 18.8%',\n popoverForeground: '0 0% 89%',\n destructive: '7 100% 44.9%',\n destructiveForeground: '0 0% 100%',\n success: '156 71% 42.5%',\n successForeground: '0 0% 0%',\n warning: '41 100% 65.1%',\n warningForeground: '0 0% 10.2%',\n sidebar: '0 0% 10.2%',\n sidebarForeground: '0 0% 89%',\n sidebarBorder: '0 0% 16.5%',\n sidebarAccent: '0 0% 18.8%',\n sidebarAccentForeground: '0 0% 100%',\n sidebarMuted: '0 0% 64.7%',\n content: '0 0% 10.2%',\n },\n perception: {\n buttonRadius: '0.5rem',\n cardRadius: '0.5rem',\n inputRadius: '0.5rem',\n modalRadius: '1rem',\n fontFamily: 'Inter, ui-sans-serif, system-ui, -apple-system, sans-serif',\n fontFamilyMono: 'JetBrains Mono, ui-monospace, SFMono-Regular, monospace',\n shadowSm: '0 1px 0 rgba(0, 0, 0, 0.4), 0 1px 3px 0 rgba(0, 0, 0, 0.35), 0 1px 2px -1px rgba(0, 0, 0, 0.35)',\n shadowMd: '0 1px 1px -1px rgba(0, 0, 0, 0.5), 0 4px 8px -2px rgba(0, 0, 0, 0.6)',\n shadowLg: '0 4px 12px -2px rgba(0, 0, 0, 0.6), 0 1px 3px rgba(0, 0, 0, 0.4)',\n shadowButton:\n 'inset 0 -1px 0 rgba(0,0,0,0.40), inset 0 1px 0 rgba(255,255,255,0.08), 0 1px 0 rgba(0,0,0,0.30)',\n shadowButtonPrimary:\n 'inset 0 -1px 0 rgba(0,0,0,0.20), inset 0 1px 0 rgba(255,255,255,0.40), 0 1px 1.5px rgba(0,0,0,0.40)',\n shadowButtonInset:\n 'inset 0 2px 1px -1px rgba(0,0,0,0.50), inset 0 0 0 1px rgba(0,0,0,0.20)',\n surfaceBackdropFilter: 'none',\n buttonBackground: 'hsl(var(--card))',\n buttonBackgroundHover: 'hsl(var(--muted))',\n buttonBorder: 'hsl(var(--border))',\n buttonPrimaryBackground: 'hsl(var(--primary))',\n buttonPrimaryBackgroundHover: 'hsl(var(--primary) / 0.9)',\n buttonPrimaryBorder: 'hsl(var(--primary))',\n buttonBackdropFilter: 'none',\n },\n}\n\n// ---------------------------------------------------------------------------\n// CSS variable maps\n// ---------------------------------------------------------------------------\n\nconst colorVarMap: Record<string, string> = {\n primary: '--primary',\n primaryForeground: '--primary-foreground',\n secondary: '--secondary',\n secondaryForeground: '--secondary-foreground',\n accent: '--accent',\n accentForeground: '--accent-foreground',\n background: '--background',\n foreground: '--foreground',\n card: '--card',\n cardForeground: '--card-foreground',\n muted: '--muted',\n mutedForeground: '--muted-foreground',\n border: '--border',\n input: '--input',\n ring: '--ring',\n popover: '--popover',\n popoverForeground: '--popover-foreground',\n destructive: '--destructive',\n destructiveForeground: '--destructive-foreground',\n success: '--success',\n successForeground: '--success-foreground',\n warning: '--warning',\n warningForeground: '--warning-foreground',\n sidebar: '--sidebar',\n sidebarForeground: '--sidebar-foreground',\n sidebarBorder: '--sidebar-border',\n sidebarAccent: '--sidebar-accent',\n sidebarAccentForeground: '--sidebar-accent-foreground',\n sidebarMuted: '--sidebar-muted',\n content: '--content',\n}\n\nconst perceptionVarMap: Record<string, string> = {\n buttonRadius: '--button-radius',\n cardRadius: '--card-radius',\n inputRadius: '--input-radius',\n modalRadius: '--modal-radius',\n fontFamily: '--font-family',\n fontFamilyMono: '--font-family-mono',\n shadowSm: '--shadow-sm',\n shadowMd: '--shadow-md',\n shadowLg: '--shadow-lg',\n shadowButton: '--shadow-button',\n shadowButtonPrimary: '--shadow-button-primary',\n shadowButtonInset: '--shadow-button-inset',\n surfaceBackdropFilter: '--surface-backdrop-filter',\n modalBackground: '--modal-bg',\n modalBorder: '--modal-border',\n modalOverlayBackground: '--modal-overlay-bg',\n modalOverlayBackdropFilter: '--modal-overlay-backdrop-filter',\n modalShadow: '--modal-shadow',\n glassEdgeGradient: '--glass-edge-gradient',\n glassPrimaryEdgeGradient: '--glass-primary-edge-gradient',\n glassInnerHighlight: '--glass-inner-highlight',\n fieldBackground: '--field-bg',\n fieldBorder: '--field-border',\n fieldShadow: '--field-shadow',\n buttonBackground: '--button-bg',\n buttonBackgroundHover: '--button-hover-bg',\n buttonBorder: '--button-border',\n buttonPrimaryBackground: '--button-primary-bg',\n buttonPrimaryBackgroundHover: '--button-primary-hover-bg',\n buttonPrimaryBorder: '--button-primary-border',\n buttonBackdropFilter: '--button-backdrop-filter',\n}\n\nfunction applyTheme(theme: ThemeTokens, element?: HTMLElement): void {\n const target = element ?? document.documentElement\n\n for (const [key, cssVar] of Object.entries(colorVarMap)) {\n const value = theme.colors[key as keyof typeof theme.colors]\n if (value) {\n target.style.setProperty(cssVar, value)\n }\n }\n\n for (const [key, cssVar] of Object.entries(perceptionVarMap)) {\n const value = theme.perception[key as keyof typeof theme.perception]\n if (value) {\n target.style.setProperty(cssVar, value)\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Store\n// ---------------------------------------------------------------------------\n\ntype ThemeMode = 'light' | 'dark' | 'system'\n\nconst STORAGE_KEY = 'fayz-ui:theme-mode'\n\ninterface ThemeState {\n mode: ThemeMode\n resolvedMode: 'light' | 'dark'\n /** Only the user's partial overrides — NOT a full theme */\n overrides: CreateThemeOptions | null\n setMode: (mode: ThemeMode) => void\n setOverrides: (overrides: CreateThemeOptions | null) => void\n initialize: () => void\n // Keep old API name working\n setCustomTheme: (theme: ThemeTokens | null) => void\n}\n\nfunction getSystemPreference(): 'light' | 'dark' {\n if (typeof window === 'undefined') return 'light'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\nfunction getSavedMode(): ThemeMode {\n if (typeof window === 'undefined') return 'light'\n const saved = localStorage.getItem(STORAGE_KEY)\n if (saved === 'light' || saved === 'dark' || saved === 'system') return saved\n return 'light'\n}\n\nfunction resolveMode(mode: ThemeMode): 'light' | 'dark' {\n return mode === 'system' ? getSystemPreference() : mode\n}\n\n/** Merge base theme (light or dark) with user's partial overrides */\nfunction buildTheme(base: ThemeTokens, overrides: CreateThemeOptions | null): ThemeTokens {\n if (!overrides) return base\n\n const isDark = base.name === 'dark'\n const colors = { ...base.colors }\n\n // Brand shorthand: derive primary, ring, accent from single HSL\n if (overrides.brand) {\n colors.primary = overrides.brand\n colors.primaryForeground = '0 0% 100%'\n colors.ring = overrides.brand\n const parts = overrides.brand.split(' ')\n if (parts.length >= 3) {\n const hue = (parseFloat(parts[0]) - 50 + 360) % 360\n colors.accent = `${hue} ${parts[1]} ${parts[2]}`\n colors.accentForeground = '0 0% 100%'\n }\n }\n\n // Apply explicit color overrides.\n const colorOverrides = isDark && overrides.darkColors\n ? overrides.darkColors\n : overrides.colors\n\n if (colorOverrides) {\n for (const [key, value] of Object.entries(colorOverrides)) {\n if (value !== undefined) {\n (colors as any)[key] = value\n }\n }\n }\n\n return {\n name: overrides.name ?? base.name,\n colors,\n perception: {\n ...base.perception,\n ...(overrides.perception ?? {}),\n },\n }\n}\n\nconst STORE_KEY = '__fayz_ui_theme_store__'\n\nfunction createThemeStore(): UseBoundStore<StoreApi<ThemeState>> {\n // Window-level singleton to survive linked-package dual-module loading\n if (typeof window !== 'undefined' && (window as any)[STORE_KEY]) {\n return (window as any)[STORE_KEY]\n }\n\n const store = create<ThemeState>((set, get) => ({\n mode: getSavedMode(),\n resolvedMode: 'light',\n overrides: null,\n\n setMode: (mode) => {\n const resolved = resolveMode(mode)\n set({ mode, resolvedMode: resolved })\n\n if (typeof window !== 'undefined') {\n localStorage.setItem(STORAGE_KEY, mode)\n }\n\n const { overrides } = get()\n const baseTheme = resolved === 'dark' ? darkTheme : lightTheme\n const theme = buildTheme(baseTheme, overrides)\n\n if (typeof document !== 'undefined') {\n document.documentElement.classList.add('theme-transitioning')\n applyTheme(theme)\n document.documentElement.classList.toggle('dark', resolved === 'dark')\n setTimeout(() => {\n document.documentElement.classList.remove('theme-transitioning')\n }, 450)\n } else {\n applyTheme(theme)\n }\n },\n\n setOverrides: (overrides) => {\n set({ overrides })\n const { resolvedMode } = get()\n const baseTheme = resolvedMode === 'dark' ? darkTheme : lightTheme\n const theme = buildTheme(baseTheme, overrides)\n applyTheme(theme)\n },\n\n // Legacy compat\n setCustomTheme: (_theme) => {\n // Ignore — callers should use setOverrides now\n },\n\n initialize: () => {\n const { mode, setMode } = get()\n setMode(mode)\n\n if (typeof window !== 'undefined') {\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {\n const current = get()\n if (current.mode === 'system') {\n current.setMode('system')\n }\n })\n }\n },\n }))\n\n if (typeof window !== 'undefined') {\n (window as any)[STORE_KEY] = store\n }\n\n return store\n}\n\nexport const useThemeStore = createThemeStore()\n","import { darkTheme, lightTheme, type CreateThemeOptions } from '../stores/theme.store'\n\nexport type FayzThemePresetId = 'classic_admin' | 'liquid_glass'\n\nfunction mergeThemeOptions(base: CreateThemeOptions, overrides: CreateThemeOptions = {}): CreateThemeOptions {\n return {\n ...base,\n ...overrides,\n colors: {\n ...(base.colors ?? {}),\n ...(overrides.colors ?? {}),\n },\n darkColors: {\n ...(base.darkColors ?? {}),\n ...(overrides.darkColors ?? {}),\n },\n perception: {\n ...(base.perception ?? {}),\n ...(overrides.perception ?? {}),\n },\n }\n}\n\nexport const fayzThemePresets: Record<FayzThemePresetId, CreateThemeOptions> = {\n classic_admin: {\n name: 'classic_admin',\n colors: lightTheme.colors,\n darkColors: darkTheme.colors,\n perception: lightTheme.perception,\n },\n liquid_glass: {\n name: 'liquid_glass',\n colors: {\n background: '260 38% 96%',\n content: '260 36% 96.5%',\n card: '0 0% 100% / 0.84',\n popover: '0 0% 100% / 0.96',\n secondary: '260 34% 93% / 0.82',\n muted: '260 30% 91% / 0.78',\n border: '260 26% 76% / 0.58',\n input: '260 24% 68% / 0.62',\n },\n darkColors: {\n background: '260 28% 9%',\n content: '260 28% 10%',\n card: '260 24% 16% / 0.72',\n popover: '260 24% 14% / 0.9',\n secondary: '260 20% 22% / 0.72',\n muted: '260 18% 20% / 0.68',\n border: '260 20% 35% / 0.58',\n input: '260 20% 38% / 0.68',\n },\n perception: {\n buttonRadius: '9999px',\n cardRadius: '1.25rem',\n inputRadius: '1rem',\n modalRadius: '1.5rem',\n surfaceBackdropFilter: 'blur(16px) saturate(1.24) brightness(1.03)',\n modalBackground:\n 'linear-gradient(145deg, rgb(255 255 255 / 0.82), rgb(249 247 255 / 0.72) 48%, rgb(255 255 255 / 0.64))',\n modalBorder: 'rgb(255 255 255 / 0.74)',\n modalOverlayBackground: 'rgb(26 20 38 / 0.22)',\n modalOverlayBackdropFilter: 'blur(5px) saturate(1.08)',\n modalShadow:\n '0 32px 82px -46px rgb(31 18 61 / 0.38), 0 1px 4px rgb(31 18 61 / 0.08), inset 0 1px 0 rgb(255 255 255 / 0.78), inset 0 0 0 1px rgb(255 255 255 / 0.28)',\n glassEdgeGradient:\n 'linear-gradient(145deg, rgb(255 255 255 / 0.96) 0%, rgb(255 255 255 / 0.44) 24%, rgb(171 151 211 / 0.34) 48%, rgb(45 35 76 / 0.22) 62%, rgb(255 255 255 / 0.7) 100%)',\n glassPrimaryEdgeGradient:\n 'linear-gradient(145deg, rgb(255 255 255 / 0.74) 0%, rgb(255 255 255 / 0.2) 28%, rgb(45 35 76 / 0.34) 58%, rgb(255 255 255 / 0.5) 100%)',\n glassInnerHighlight:\n 'inset 0 1px 0 rgb(255 255 255 / 0.72), inset 1px 0 0 rgb(255 255 255 / 0.28), inset 0 -1px 0 rgb(45 35 76 / 0.1)',\n fieldBackground:\n 'linear-gradient(135deg, rgb(255 255 255 / 0.9) 0%, rgb(250 248 255 / 0.82) 46%, rgb(242 238 252 / 0.74) 100%)',\n fieldBorder: 'rgb(174 158 205 / 0.58)',\n fieldShadow:\n 'inset 0 1px 0 rgb(255 255 255 / 0.8), inset 0 -1px 0 rgb(45 35 76 / 0.08), 0 12px 28px -24px rgb(31 18 61 / 0.28)',\n shadowSm: '0 10px 28px -20px rgb(31 18 61 / 0.34), inset 0 1px 0 rgb(255 255 255 / 0.54)',\n shadowMd: '0 22px 54px -32px rgb(31 18 61 / 0.42), inset 0 1px 0 rgb(255 255 255 / 0.58)',\n shadowLg: '0 34px 88px -42px rgb(31 18 61 / 0.48), inset 0 1px 0 rgb(255 255 255 / 0.62)',\n shadowButton:\n 'inset 0 1px 0 rgb(255 255 255 / 0.82), inset 0 -1px 0 rgb(31 18 61 / 0.08), 0 14px 30px -18px rgb(31 18 61 / 0.56)',\n shadowButtonPrimary:\n 'inset 0 1px 0 rgb(255 255 255 / 0.5), inset 0 -1px 0 rgb(31 18 61 / 0.26), 0 18px 36px -18px rgb(31 18 61 / 0.86)',\n shadowButtonInset:\n 'inset 0 2px 4px rgb(31 18 61 / 0.22), inset 0 0 0 1px rgb(255 255 255 / 0.24)',\n buttonBackground:\n 'linear-gradient(135deg, rgb(255 255 255 / 0.92) 0%, rgb(247 242 255 / 0.74) 48%, rgb(229 220 248 / 0.64) 100%)',\n buttonBackgroundHover:\n 'linear-gradient(135deg, rgb(255 255 255 / 0.98) 0%, rgb(249 244 255 / 0.86) 46%, rgb(231 222 250 / 0.78) 100%)',\n buttonBorder: 'rgb(194 178 221 / 0.86)',\n buttonPrimaryBackground:\n 'linear-gradient(135deg, rgb(255 255 255 / 0.28) 0%, hsl(var(--primary) / 0.94) 36%, hsl(278 42% 58% / 0.88) 100%)',\n buttonPrimaryBackgroundHover:\n 'linear-gradient(135deg, rgb(255 255 255 / 0.36) 0%, hsl(var(--primary) / 1) 34%, hsl(278 52% 62% / 0.94) 100%)',\n buttonPrimaryBorder: 'rgb(255 255 255 / 0.38)',\n buttonBackdropFilter: 'blur(18px) saturate(1.45)',\n },\n },\n}\n\nexport function createFayzTheme(\n preset: FayzThemePresetId = 'classic_admin',\n overrides: CreateThemeOptions = {},\n): CreateThemeOptions {\n return mergeThemeOptions(fayzThemePresets[preset] ?? fayzThemePresets.classic_admin, overrides)\n}\n","import * as React from 'react'\nimport { useThemeStore, type CreateThemeOptions, type ThemeTokens, lightTheme, darkTheme } from '../stores/theme.store'\n\n// ---------------------------------------------------------------------------\n// ThemeProvider\n// ---------------------------------------------------------------------------\n\nexport interface ThemeProviderProps {\n children: React.ReactNode\n /** Initial theme overrides to apply on mount */\n overrides?: CreateThemeOptions | null\n /** Default mode. Defaults to 'light'. */\n defaultMode?: 'light' | 'dark' | 'system'\n}\n\nexport function ThemeProvider({ children, overrides, defaultMode }: ThemeProviderProps) {\n const initialize = useThemeStore((s) => s.initialize)\n const setMode = useThemeStore((s) => s.setMode)\n const setOverrides = useThemeStore((s) => s.setOverrides)\n\n React.useEffect(() => {\n if (defaultMode) {\n setMode(defaultMode)\n }\n if (overrides !== undefined) {\n setOverrides(overrides)\n }\n initialize()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n return children as React.ReactElement\n}\n\n// ---------------------------------------------------------------------------\n// useTheme\n// ---------------------------------------------------------------------------\n\nexport function useTheme() {\n const mode = useThemeStore((s) => s.mode)\n const resolvedMode = useThemeStore((s) => s.resolvedMode)\n const overrides = useThemeStore((s) => s.overrides)\n const setMode = useThemeStore((s) => s.setMode)\n const setOverrides = useThemeStore((s) => s.setOverrides)\n\n return {\n mode,\n resolvedMode,\n isDark: resolvedMode === 'dark',\n overrides,\n setMode,\n setOverrides,\n }\n}\n\n// ---------------------------------------------------------------------------\n// createTheme — build a ThemeTokens object from partial overrides\n// ---------------------------------------------------------------------------\n\nexport function createTheme(overrides: CreateThemeOptions): ThemeTokens {\n const colors = { ...lightTheme.colors, ...overrides.colors }\n\n // Brand shorthand: auto-derive primary, ring, accent from single HSL.\n // Explicit `colors.*` overrides win — the shorthand is a default, not a\n // mandate, so an app can pin any one of these without dropping the rest.\n if (overrides.brand) {\n const given = overrides.colors ?? {}\n if (given.primary == null) colors.primary = overrides.brand\n if (given.primaryForeground == null) colors.primaryForeground = '0 0% 100%'\n if (given.ring == null) colors.ring = overrides.brand\n const parts = overrides.brand.split(' ')\n if (parts.length >= 3) {\n const hue = (parseFloat(parts[0]) - 50 + 360) % 360\n if (given.accent == null) colors.accent = `${hue} ${parts[1]} ${parts[2]}`\n if (given.accentForeground == null) colors.accentForeground = '0 0% 100%'\n }\n }\n\n return {\n name: overrides.name ?? lightTheme.name,\n colors,\n perception: {\n ...lightTheme.perception,\n ...overrides.perception,\n },\n }\n}\n\n// Re-export types for convenience\nexport type { CreateThemeOptions, ThemeTokens }\nexport { lightTheme, darkTheme }\nexport { fayzUiPreset } from './preset'\nexport { createFayzTheme, fayzThemePresets } from './presets'\nexport type { FayzThemePresetId } from './presets'\n"]}