@craftzbay/ui 0.10.0 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/README.md +18 -12
  2. package/dist-lib/__tests__/helpers/color.d.ts +9 -0
  3. package/dist-lib/__tests__/helpers/theme.d.ts +18 -0
  4. package/dist-lib/components/ui/Accordion.js +18 -7
  5. package/dist-lib/components/ui/Accordion.js.map +1 -1
  6. package/dist-lib/components/ui/Alert.d.ts +16 -0
  7. package/dist-lib/components/ui/Alert.js +47 -34
  8. package/dist-lib/components/ui/Alert.js.map +1 -1
  9. package/dist-lib/components/ui/Avatar.d.ts +1 -1
  10. package/dist-lib/components/ui/Avatar.js +45 -47
  11. package/dist-lib/components/ui/Avatar.js.map +1 -1
  12. package/dist-lib/components/ui/Badge.d.ts +3 -1
  13. package/dist-lib/components/ui/Badge.js +24 -15
  14. package/dist-lib/components/ui/Badge.js.map +1 -1
  15. package/dist-lib/components/ui/Breadcrumbs.d.ts +2 -0
  16. package/dist-lib/components/ui/Breadcrumbs.js +46 -28
  17. package/dist-lib/components/ui/Breadcrumbs.js.map +1 -1
  18. package/dist-lib/components/ui/Button.d.ts +5 -3
  19. package/dist-lib/components/ui/Button.js +59 -45
  20. package/dist-lib/components/ui/Button.js.map +1 -1
  21. package/dist-lib/components/ui/Calendar.d.ts +1 -1
  22. package/dist-lib/components/ui/Calendar.js +87 -59
  23. package/dist-lib/components/ui/Calendar.js.map +1 -1
  24. package/dist-lib/components/ui/Card.d.ts +2 -0
  25. package/dist-lib/components/ui/Card.js +48 -67
  26. package/dist-lib/components/ui/Card.js.map +1 -1
  27. package/dist-lib/components/ui/Carousel.d.ts +6 -6
  28. package/dist-lib/components/ui/Carousel.js +133 -102
  29. package/dist-lib/components/ui/Carousel.js.map +1 -1
  30. package/dist-lib/components/ui/Chart.d.ts +49 -10
  31. package/dist-lib/components/ui/Chart.js +415 -181
  32. package/dist-lib/components/ui/Chart.js.map +1 -1
  33. package/dist-lib/components/ui/Checkbox.js +42 -28
  34. package/dist-lib/components/ui/Checkbox.js.map +1 -1
  35. package/dist-lib/components/ui/Combobox.d.ts +2 -0
  36. package/dist-lib/components/ui/Combobox.js +142 -111
  37. package/dist-lib/components/ui/Combobox.js.map +1 -1
  38. package/dist-lib/components/ui/CommandPalette.d.ts +6 -3
  39. package/dist-lib/components/ui/CommandPalette.js +92 -87
  40. package/dist-lib/components/ui/CommandPalette.js.map +1 -1
  41. package/dist-lib/components/ui/ContextMenu.d.ts +7 -2
  42. package/dist-lib/components/ui/ContextMenu.js +77 -62
  43. package/dist-lib/components/ui/ContextMenu.js.map +1 -1
  44. package/dist-lib/components/ui/DataGrid.d.ts +17 -4
  45. package/dist-lib/components/ui/DataGrid.js +65 -50
  46. package/dist-lib/components/ui/DataGrid.js.map +1 -1
  47. package/dist-lib/components/ui/DatePicker.js +118 -99
  48. package/dist-lib/components/ui/DatePicker.js.map +1 -1
  49. package/dist-lib/components/ui/DesignSystemProvider.d.ts +94 -40
  50. package/dist-lib/components/ui/DesignSystemProvider.js +111 -55
  51. package/dist-lib/components/ui/DesignSystemProvider.js.map +1 -1
  52. package/dist-lib/components/ui/Dialog.d.ts +18 -3
  53. package/dist-lib/components/ui/Dialog.js +105 -80
  54. package/dist-lib/components/ui/Dialog.js.map +1 -1
  55. package/dist-lib/components/ui/Drawer.d.ts +17 -2
  56. package/dist-lib/components/ui/Drawer.js +89 -55
  57. package/dist-lib/components/ui/Drawer.js.map +1 -1
  58. package/dist-lib/components/ui/DropdownMenu.js +14 -9
  59. package/dist-lib/components/ui/DropdownMenu.js.map +1 -1
  60. package/dist-lib/components/ui/EmptyState.d.ts +2 -0
  61. package/dist-lib/components/ui/EmptyState.js +30 -16
  62. package/dist-lib/components/ui/EmptyState.js.map +1 -1
  63. package/dist-lib/components/ui/ErrorState.d.ts +13 -2
  64. package/dist-lib/components/ui/ErrorState.js +44 -23
  65. package/dist-lib/components/ui/ErrorState.js.map +1 -1
  66. package/dist-lib/components/ui/FileUpload.js +59 -56
  67. package/dist-lib/components/ui/FileUpload.js.map +1 -1
  68. package/dist-lib/components/ui/Form.d.ts +15 -2
  69. package/dist-lib/components/ui/Form.js +97 -71
  70. package/dist-lib/components/ui/Form.js.map +1 -1
  71. package/dist-lib/components/ui/Icon.d.ts +1 -1
  72. package/dist-lib/components/ui/Icon.js +20 -14
  73. package/dist-lib/components/ui/Icon.js.map +1 -1
  74. package/dist-lib/components/ui/IconButton.d.ts +2 -2
  75. package/dist-lib/components/ui/IconButton.js +28 -20
  76. package/dist-lib/components/ui/IconButton.js.map +1 -1
  77. package/dist-lib/components/ui/Input.d.ts +3 -1
  78. package/dist-lib/components/ui/Input.js +102 -79
  79. package/dist-lib/components/ui/Input.js.map +1 -1
  80. package/dist-lib/components/ui/Kbd.js +1 -1
  81. package/dist-lib/components/ui/Kbd.js.map +1 -1
  82. package/dist-lib/components/ui/MultiSelect.js +121 -107
  83. package/dist-lib/components/ui/MultiSelect.js.map +1 -1
  84. package/dist-lib/components/ui/Pagination.js +67 -62
  85. package/dist-lib/components/ui/Pagination.js.map +1 -1
  86. package/dist-lib/components/ui/Popover.js +14 -14
  87. package/dist-lib/components/ui/Popover.js.map +1 -1
  88. package/dist-lib/components/ui/Progress.d.ts +3 -3
  89. package/dist-lib/components/ui/Progress.js +77 -72
  90. package/dist-lib/components/ui/Progress.js.map +1 -1
  91. package/dist-lib/components/ui/RadioGroup.d.ts +1 -1
  92. package/dist-lib/components/ui/RadioGroup.js +69 -52
  93. package/dist-lib/components/ui/RadioGroup.js.map +1 -1
  94. package/dist-lib/components/ui/RelativeTime.d.ts +19 -0
  95. package/dist-lib/components/ui/RelativeTime.js +31 -0
  96. package/dist-lib/components/ui/RelativeTime.js.map +1 -0
  97. package/dist-lib/components/ui/ScrollArea.d.ts +9 -1
  98. package/dist-lib/components/ui/ScrollArea.js +43 -27
  99. package/dist-lib/components/ui/ScrollArea.js.map +1 -1
  100. package/dist-lib/components/ui/Select.d.ts +6 -1
  101. package/dist-lib/components/ui/Select.js +79 -71
  102. package/dist-lib/components/ui/Select.js.map +1 -1
  103. package/dist-lib/components/ui/Separator.js +1 -1
  104. package/dist-lib/components/ui/Separator.js.map +1 -1
  105. package/dist-lib/components/ui/Sheet.d.ts +9 -0
  106. package/dist-lib/components/ui/Sheet.js +69 -46
  107. package/dist-lib/components/ui/Sheet.js.map +1 -1
  108. package/dist-lib/components/ui/Sidebar.d.ts +12 -9
  109. package/dist-lib/components/ui/Sidebar.js +152 -109
  110. package/dist-lib/components/ui/Sidebar.js.map +1 -1
  111. package/dist-lib/components/ui/Skeleton.d.ts +13 -2
  112. package/dist-lib/components/ui/Skeleton.js +15 -14
  113. package/dist-lib/components/ui/Skeleton.js.map +1 -1
  114. package/dist-lib/components/ui/Slider.js +41 -29
  115. package/dist-lib/components/ui/Slider.js.map +1 -1
  116. package/dist-lib/components/ui/Snackbar.js +23 -22
  117. package/dist-lib/components/ui/Snackbar.js.map +1 -1
  118. package/dist-lib/components/ui/Spinner.js +18 -6
  119. package/dist-lib/components/ui/Spinner.js.map +1 -1
  120. package/dist-lib/components/ui/Stepper.d.ts +6 -0
  121. package/dist-lib/components/ui/Stepper.js +71 -48
  122. package/dist-lib/components/ui/Stepper.js.map +1 -1
  123. package/dist-lib/components/ui/Switch.js +46 -43
  124. package/dist-lib/components/ui/Switch.js.map +1 -1
  125. package/dist-lib/components/ui/Table.d.ts +33 -5
  126. package/dist-lib/components/ui/Table.js +141 -119
  127. package/dist-lib/components/ui/Table.js.map +1 -1
  128. package/dist-lib/components/ui/Tabs.js +50 -48
  129. package/dist-lib/components/ui/Tabs.js.map +1 -1
  130. package/dist-lib/components/ui/TagInput.js +45 -45
  131. package/dist-lib/components/ui/TagInput.js.map +1 -1
  132. package/dist-lib/components/ui/Textarea.js +65 -54
  133. package/dist-lib/components/ui/Textarea.js.map +1 -1
  134. package/dist-lib/components/ui/Timeline.js +39 -35
  135. package/dist-lib/components/ui/Timeline.js.map +1 -1
  136. package/dist-lib/components/ui/Toast.js +44 -57
  137. package/dist-lib/components/ui/Toast.js.map +1 -1
  138. package/dist-lib/components/ui/Tooltip.d.ts +4 -1
  139. package/dist-lib/components/ui/Tooltip.js +24 -22
  140. package/dist-lib/components/ui/Tooltip.js.map +1 -1
  141. package/dist-lib/components/ui/TopNav.d.ts +7 -3
  142. package/dist-lib/components/ui/TopNav.js +39 -22
  143. package/dist-lib/components/ui/TopNav.js.map +1 -1
  144. package/dist-lib/components/ui/Tree.d.ts +15 -10
  145. package/dist-lib/components/ui/Tree.js +82 -79
  146. package/dist-lib/components/ui/Tree.js.map +1 -1
  147. package/dist-lib/hooks/use-debounce.d.ts +19 -0
  148. package/dist-lib/hooks/use-debounce.js +36 -0
  149. package/dist-lib/hooks/use-debounce.js.map +1 -0
  150. package/dist-lib/hooks/use-delayed-loading.d.ts +21 -0
  151. package/dist-lib/hooks/use-delayed-loading.js +20 -0
  152. package/dist-lib/hooks/use-delayed-loading.js.map +1 -0
  153. package/dist-lib/hooks/use-field-ids.d.ts +2 -1
  154. package/dist-lib/hooks/use-field-ids.js +9 -9
  155. package/dist-lib/hooks/use-field-ids.js.map +1 -1
  156. package/dist-lib/hooks/use-media-query.d.ts +3 -1
  157. package/dist-lib/hooks/use-media-query.js +16 -12
  158. package/dist-lib/hooks/use-media-query.js.map +1 -1
  159. package/dist-lib/hooks/use-modifier-key.d.ts +13 -0
  160. package/dist-lib/hooks/use-modifier-key.js +19 -0
  161. package/dist-lib/hooks/use-modifier-key.js.map +1 -0
  162. package/dist-lib/hooks/use-toast.d.ts +7 -2
  163. package/dist-lib/hooks/use-toast.js +61 -30
  164. package/dist-lib/hooks/use-toast.js.map +1 -1
  165. package/dist-lib/icons/index.d.ts +9 -0
  166. package/dist-lib/icons/index.js +148 -130
  167. package/dist-lib/icons/index.js.map +1 -1
  168. package/dist-lib/illustrations/index.d.ts +1 -0
  169. package/dist-lib/illustrations/index.js +15 -6
  170. package/dist-lib/illustrations/index.js.map +1 -1
  171. package/dist-lib/index.d.ts +6 -0
  172. package/dist-lib/index.js +280 -260
  173. package/dist-lib/index.js.map +1 -1
  174. package/dist-lib/lib/format.d.ts +65 -0
  175. package/dist-lib/lib/format.js +95 -0
  176. package/dist-lib/lib/format.js.map +1 -0
  177. package/dist-lib/lib/return-focus.d.ts +11 -0
  178. package/dist-lib/lib/return-focus.js +12 -0
  179. package/dist-lib/lib/return-focus.js.map +1 -0
  180. package/dist-lib/lib/strings.d.ts +62 -1
  181. package/dist-lib/lib/strings.js +75 -19
  182. package/dist-lib/lib/strings.js.map +1 -1
  183. package/dist-lib/lib/strings.mn.js +50 -5
  184. package/dist-lib/lib/strings.mn.js.map +1 -1
  185. package/dist-lib/styles.css +1 -1
  186. package/dist-lib/theme.css +141 -78
  187. package/package.json +11 -4
@@ -1 +1 @@
1
- {"version":3,"file":"ContextMenu.js","sources":["../../../src/components/ui/ContextMenu.tsx"],"sourcesContent":["'use client';\n\nimport {\n forwardRef,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type HTMLAttributes,\n} from 'react';\nimport * as ContextMenuPrimitive from '@radix-ui/react-context-menu';\nimport { Check, ChevronRight, Circle } from '@/icons';\nimport { cn } from '@/lib/utils';\n\n/**\n * Right-click (or two-finger tap) menu. Visual surface mirrors DropdownMenu\n * for consistency.\n *\n * @example\n * <ContextMenu>\n * <ContextMenuTrigger asChild>\n * <div className=\"grid h-32 place-items-center rounded-lg border border-border\">\n * Right-click me\n * </div>\n * </ContextMenuTrigger>\n * <ContextMenuContent>\n * <ContextMenuItem>Open</ContextMenuItem>\n * <ContextMenuSeparator />\n * <ContextMenuItem destructive>Delete</ContextMenuItem>\n * </ContextMenuContent>\n * </ContextMenu>\n *\n * @do Mirror DropdownMenu items for the same surface — users expect the same\n * operations from both.\n * @dont Hide critical actions behind right-click — they must also exist in\n * a visible button or menu.\n */\nexport const ContextMenu = ContextMenuPrimitive.Root;\nexport const ContextMenuTrigger = ContextMenuPrimitive.Trigger;\nexport const ContextMenuGroup = ContextMenuPrimitive.Group;\nexport const ContextMenuPortal = ContextMenuPrimitive.Portal;\nexport const ContextMenuSub = ContextMenuPrimitive.Sub;\nexport const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup;\n\nconst itemClasses = cn(\n 'relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm text-foreground outline-none',\n 'data-[highlighted]:bg-background-muted data-[highlighted]:text-foreground',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n);\n\nexport const ContextMenuSubTrigger = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.SubTrigger>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubTrigger>\n>(function ContextMenuSubTrigger({ className, children, ...props }, ref) {\n return (\n <ContextMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(itemClasses, 'data-[state=open]:bg-background-muted', className)}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto size-4 text-foreground-subtle\" aria-hidden />\n </ContextMenuPrimitive.SubTrigger>\n );\n});\nContextMenuSubTrigger.displayName = 'ContextMenuSubTrigger';\n\nexport const ContextMenuSubContent = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.SubContent>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubContent>\n>(function ContextMenuSubContent({ className, ...props }, ref) {\n return (\n <ContextMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'z-[var(--z-popover)] min-w-[8rem] overflow-hidden rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-md',\n className,\n )}\n {...props}\n />\n );\n});\nContextMenuSubContent.displayName = 'ContextMenuSubContent';\n\nexport const ContextMenuContent = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.Content>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Content>\n>(function ContextMenuContent({ className, ...props }, ref) {\n return (\n <ContextMenuPortal>\n <ContextMenuPrimitive.Content\n ref={ref}\n className={cn(\n 'z-[var(--z-popover)] min-w-[12rem] overflow-hidden rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-md',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n />\n </ContextMenuPortal>\n );\n});\nContextMenuContent.displayName = 'ContextMenuContent';\n\nexport const ContextMenuItem = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.Item>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Item> & { destructive?: boolean }\n>(function ContextMenuItem({ className, destructive, ...props }, ref) {\n return (\n <ContextMenuPrimitive.Item\n ref={ref}\n className={cn(\n itemClasses,\n destructive &&\n 'text-danger-text data-[highlighted]:bg-danger-soft data-[highlighted]:text-danger-text',\n className,\n )}\n {...props}\n />\n );\n});\nContextMenuItem.displayName = 'ContextMenuItem';\n\nexport const ContextMenuCheckboxItem = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.CheckboxItem>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.CheckboxItem>\n>(function ContextMenuCheckboxItem({ className, children, ...props }, ref) {\n return (\n <ContextMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(itemClasses, 'pl-8', className)}\n {...props}\n >\n <span className=\"absolute left-2 flex size-4 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Check className=\"size-4 text-accent\" aria-hidden />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n );\n});\nContextMenuCheckboxItem.displayName = 'ContextMenuCheckboxItem';\n\nexport const ContextMenuRadioItem = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.RadioItem>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.RadioItem>\n>(function ContextMenuRadioItem({ className, children, ...props }, ref) {\n return (\n <ContextMenuPrimitive.RadioItem\n ref={ref}\n className={cn(itemClasses, 'pl-8', className)}\n {...props}\n >\n <span className=\"absolute left-2 flex size-4 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Circle className=\"size-2 fill-accent text-accent\" aria-hidden />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n );\n});\nContextMenuRadioItem.displayName = 'ContextMenuRadioItem';\n\nexport const ContextMenuLabel = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.Label>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Label>\n>(function ContextMenuLabel({ className, ...props }, ref) {\n return (\n <ContextMenuPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 text-xs font-medium text-foreground-subtle', className)}\n {...props}\n />\n );\n});\nContextMenuLabel.displayName = 'ContextMenuLabel';\n\nexport const ContextMenuSeparator = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.Separator>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Separator>\n>(function ContextMenuSeparator({ className, ...props }, ref) {\n return (\n <ContextMenuPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-border', className)}\n {...props}\n />\n );\n});\nContextMenuSeparator.displayName = 'ContextMenuSeparator';\n\nexport function ContextMenuShortcut({ className, ...props }: HTMLAttributes<HTMLSpanElement>) {\n return (\n <span\n className={cn('ml-auto text-xs tracking-widest text-foreground-subtle font-mono', className)}\n {...props}\n />\n );\n}\nContextMenuShortcut.displayName = 'ContextMenuShortcut';\n"],"names":["ContextMenu","ContextMenuPrimitive","ContextMenuTrigger","ContextMenuGroup","ContextMenuPortal","ContextMenuSub","ContextMenuRadioGroup","itemClasses","cn","ContextMenuSubTrigger","forwardRef","className","children","props","ref","jsxs","jsx","ChevronRight","ContextMenuSubContent","ContextMenuContent","ContextMenuItem","destructive","ContextMenuCheckboxItem","Check","ContextMenuRadioItem","Circle","ContextMenuLabel","ContextMenuSeparator","ContextMenuShortcut"],"mappings":"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"}
1
+ {"version":3,"file":"ContextMenu.js","sources":["../../../src/components/ui/ContextMenu.tsx"],"sourcesContent":["'use client';\n\nimport {\n forwardRef,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type HTMLAttributes,\n} from 'react';\nimport * as ContextMenuPrimitive from '@radix-ui/react-context-menu';\nimport { Check, ChevronRight, Circle } from '@/icons';\nimport { cn } from '@/lib/utils';\n\n/**\n * Right-click (or two-finger tap) menu. Visual surface mirrors DropdownMenu\n * for consistency.\n *\n * @example\n * <ContextMenu>\n * <ContextMenuTrigger asChild>\n * <div className=\"grid h-32 place-items-center rounded-lg border border-border\">\n * Right-click me\n * </div>\n * </ContextMenuTrigger>\n * <ContextMenuContent>\n * <ContextMenuItem>Open</ContextMenuItem>\n * <ContextMenuSeparator />\n * <ContextMenuItem destructive>Delete</ContextMenuItem>\n * </ContextMenuContent>\n * </ContextMenu>\n *\n * @do Mirror DropdownMenu items for the same surface — users expect the same\n * operations from both.\n * @dont Hide critical actions behind right-click — they must also exist in\n * a visible button or menu.\n */\nexport const ContextMenu = ContextMenuPrimitive.Root;\nexport const ContextMenuTrigger = ContextMenuPrimitive.Trigger;\nexport const ContextMenuGroup = ContextMenuPrimitive.Group;\nexport const ContextMenuPortal = ContextMenuPrimitive.Portal;\nexport const ContextMenuSub = ContextMenuPrimitive.Sub;\nexport const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup;\n\nconst itemClasses = cn(\n 'relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm text-foreground outline-none',\n 'data-[highlighted]:bg-background-muted data-[highlighted]:text-foreground',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n 'transition-colors duration-[var(--duration-fast)]',\n);\n\nexport const ContextMenuSubTrigger = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.SubTrigger>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubTrigger> & { inset?: boolean }\n>(function ContextMenuSubTrigger({ className, inset, children, ...props }, ref) {\n return (\n <ContextMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n itemClasses,\n 'data-[state=open]:bg-background-muted',\n inset && 'pl-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"text-foreground-subtle ml-auto size-4\" aria-hidden />\n </ContextMenuPrimitive.SubTrigger>\n );\n});\nContextMenuSubTrigger.displayName = 'ContextMenuSubTrigger';\n\nexport const ContextMenuSubContent = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.SubContent>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubContent>\n>(function ContextMenuSubContent({ className, ...props }, ref) {\n return (\n <ContextMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'border-border bg-popover text-popover-foreground z-[var(--z-popover)] min-w-[8rem] overflow-hidden rounded-lg border p-1 shadow-md',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n className,\n )}\n {...props}\n />\n );\n});\nContextMenuSubContent.displayName = 'ContextMenuSubContent';\n\nexport const ContextMenuContent = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.Content>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Content>\n>(function ContextMenuContent({ className, ...props }, ref) {\n return (\n <ContextMenuPortal>\n <ContextMenuPrimitive.Content\n ref={ref}\n className={cn(\n 'border-border bg-popover text-popover-foreground z-[var(--z-popover)] min-w-[12rem] overflow-hidden rounded-lg border p-1 shadow-md',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n className,\n )}\n {...props}\n />\n </ContextMenuPortal>\n );\n});\nContextMenuContent.displayName = 'ContextMenuContent';\n\nexport const ContextMenuItem = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.Item>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Item> & {\n inset?: boolean;\n destructive?: boolean;\n }\n>(function ContextMenuItem({ className, inset, destructive, ...props }, ref) {\n return (\n <ContextMenuPrimitive.Item\n ref={ref}\n className={cn(\n itemClasses,\n inset && 'pl-8',\n destructive &&\n 'text-danger-text data-[highlighted]:bg-danger-soft data-[highlighted]:text-danger-text',\n className,\n )}\n {...props}\n />\n );\n});\nContextMenuItem.displayName = 'ContextMenuItem';\n\nexport const ContextMenuCheckboxItem = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.CheckboxItem>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.CheckboxItem>\n>(function ContextMenuCheckboxItem({ className, children, ...props }, ref) {\n return (\n <ContextMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(itemClasses, 'pl-8', className)}\n {...props}\n >\n <span className=\"absolute left-2 flex size-4 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Check className=\"text-accent size-4\" aria-hidden />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n );\n});\nContextMenuCheckboxItem.displayName = 'ContextMenuCheckboxItem';\n\nexport const ContextMenuRadioItem = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.RadioItem>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.RadioItem>\n>(function ContextMenuRadioItem({ className, children, ...props }, ref) {\n return (\n <ContextMenuPrimitive.RadioItem\n ref={ref}\n className={cn(itemClasses, 'pl-8', className)}\n {...props}\n >\n <span className=\"absolute left-2 flex size-4 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Circle className=\"fill-accent text-accent size-2\" aria-hidden />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n );\n});\nContextMenuRadioItem.displayName = 'ContextMenuRadioItem';\n\nexport const ContextMenuLabel = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.Label>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Label> & { inset?: boolean }\n>(function ContextMenuLabel({ className, inset, ...props }, ref) {\n return (\n <ContextMenuPrimitive.Label\n ref={ref}\n className={cn(\n 'text-foreground-subtle px-2 py-1.5 text-xs font-medium',\n inset && 'pl-8',\n className,\n )}\n {...props}\n />\n );\n});\nContextMenuLabel.displayName = 'ContextMenuLabel';\n\nexport const ContextMenuSeparator = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.Separator>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Separator>\n>(function ContextMenuSeparator({ className, ...props }, ref) {\n return (\n <ContextMenuPrimitive.Separator\n ref={ref}\n className={cn('bg-border -mx-1 my-1 h-px', className)}\n {...props}\n />\n );\n});\nContextMenuSeparator.displayName = 'ContextMenuSeparator';\n\nexport function ContextMenuShortcut({ className, ...props }: HTMLAttributes<HTMLSpanElement>) {\n return (\n <span\n className={cn('text-foreground-subtle ml-auto font-mono text-xs tracking-widest', className)}\n {...props}\n />\n );\n}\nContextMenuShortcut.displayName = 'ContextMenuShortcut';\n"],"names":["ContextMenu","ContextMenuPrimitive","ContextMenuTrigger","ContextMenuGroup","ContextMenuPortal","ContextMenuSub","ContextMenuRadioGroup","itemClasses","cn","ContextMenuSubTrigger","forwardRef","className","inset","children","props","ref","jsxs","jsx","ChevronRight","ContextMenuSubContent","ContextMenuContent","ContextMenuItem","destructive","ContextMenuCheckboxItem","Check","ContextMenuRadioItem","Circle","ContextMenuLabel","ContextMenuSeparator","ContextMenuShortcut"],"mappings":"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"}
@@ -1,10 +1,17 @@
1
1
  import { ReactNode } from 'react';
2
2
  export interface DataGridColumn<TRow> {
3
- /** Stable key used for visibility, sort, and React lists. */
4
- key: string;
3
+ /**
4
+ * Stable key used for visibility, sort, and React lists. Autocompletes
5
+ * row fields; any string is allowed for computed columns (with `cell`).
6
+ */
7
+ key: (keyof TRow & string) | (string & {});
5
8
  /** Header label. */
6
9
  header: ReactNode;
7
- /** Render the cell. Defaults to the value at `row[key]`. */
10
+ /**
11
+ * Render the cell. Defaults to the value at `row[key]`: `Date` →
12
+ * `formatDate` (yyyy-MM-dd HH:mm), primitives as-is, other objects via
13
+ * `String()`.
14
+ */
8
15
  cell?: (row: TRow) => ReactNode;
9
16
  /** Cell width — passed to `<col>` so the grid keeps shape during loading. */
10
17
  width?: string;
@@ -36,6 +43,12 @@ export interface DataGridProps<TRow extends {
36
43
  };
37
44
  /** Empty-state node when no rows are visible. */
38
45
  emptyState?: ReactNode;
46
+ /**
47
+ * Controlled column visibility: `{ [key]: boolean }` (missing = visible).
48
+ * Omit for internal state. At least one column always stays visible.
49
+ */
50
+ columnVisibility?: Record<string, boolean>;
51
+ onColumnVisibilityChange?: (next: Record<string, boolean>) => void;
39
52
  className?: string;
40
53
  }
41
54
  /**
@@ -63,4 +76,4 @@ export interface DataGridProps<TRow extends {
63
76
  */
64
77
  export declare function DataGrid<TRow extends {
65
78
  id: string | number;
66
- }>({ columns, rows, loading, sort, onSortChange, filter, emptyState, className, }: DataGridProps<TRow>): import("react/jsx-runtime").JSX.Element;
79
+ }>({ columns, rows, loading, sort, onSortChange, filter, emptyState, columnVisibility, onColumnVisibilityChange, className, }: DataGridProps<TRow>): import("react/jsx-runtime").JSX.Element;
@@ -1,58 +1,72 @@
1
1
  "use client";
2
2
  import { jsxs as d, jsx as r } from "react/jsx-runtime";
3
- import { useState as x, useMemo as v } from "react";
3
+ import { useState as M, useMemo as T, isValidElement as G } from "react";
4
4
  import { Settings as C } from "../../icons/index.js";
5
- import { cn as c } from "../../lib/utils.js";
6
- import { useStrings as N } from "../../hooks/use-strings.js";
7
- import { DropdownMenu as S, DropdownMenuTrigger as T, DropdownMenuContent as D, DropdownMenuLabel as M, DropdownMenuSeparator as G, DropdownMenuCheckboxItem as H } from "./DropdownMenu.js";
8
- import { IconButton as j } from "./IconButton.js";
9
- import { Input as I } from "./Input.js";
10
- import { Table as R, TableHeader as B, TableRow as o, TableSortHeader as L, TableHead as A, TableBody as K, TableCell as m } from "./Table.js";
11
- import { Skeleton as P } from "./Skeleton.js";
12
- function U({
13
- columns: h,
14
- rows: p,
15
- loading: g,
16
- sort: b,
5
+ import { cn as j } from "../../lib/utils.js";
6
+ import { formatDate as v } from "../../lib/format.js";
7
+ import { useStrings as I } from "../../hooks/use-strings.js";
8
+ import { DropdownMenu as H, DropdownMenuTrigger as R, DropdownMenuContent as B, DropdownMenuLabel as L, DropdownMenuSeparator as V, DropdownMenuCheckboxItem as A } from "./DropdownMenu.js";
9
+ import { IconButton as E } from "./IconButton.js";
10
+ import { Input as K } from "./Input.js";
11
+ import { Table as P, TableHeader as _, TableRow as m, TableSortHeader as $, TableHead as q, TableBody as z, TableCell as p } from "./Table.js";
12
+ import { Skeleton as F } from "./Skeleton.js";
13
+ function J(t, s) {
14
+ return t == null || t === "" ? /* @__PURE__ */ r("span", { "aria-label": s, className: "text-foreground-subtle", children: "—" }) : t instanceof Date ? v(t) : typeof t == "object" ? G(t) ? t : String(t) : t;
15
+ }
16
+ function ae({
17
+ columns: t,
18
+ rows: s,
19
+ loading: b,
20
+ sort: y,
17
21
  onSortChange: u,
18
- filter: a,
19
- emptyState: f,
20
- className: y
22
+ filter: o,
23
+ emptyState: k,
24
+ columnVisibility: f,
25
+ onColumnVisibilityChange: h,
26
+ className: x
21
27
  }) {
22
- const n = N(), [s, k] = x({}), t = v(() => h.filter((e) => !s[e.key]), [h, s]), w = () => g ? Array.from({ length: 5 }).map((e, l) => /* @__PURE__ */ r(o, { children: t.map((i) => /* @__PURE__ */ r(m, { children: /* @__PURE__ */ r(P, { variant: "text", className: "w-3/4" }) }, i.key)) }, `skel-${l}`)) : p.length === 0 ? /* @__PURE__ */ r(o, { children: /* @__PURE__ */ r(m, { colSpan: t.length, className: "h-32 text-center", children: f ?? /* @__PURE__ */ r("span", { className: "text-foreground-subtle", children: n.dataGrid.empty }) }) }) : p.map((e) => /* @__PURE__ */ r(o, { children: t.map((l) => /* @__PURE__ */ r(
23
- m,
24
- {
25
- className: c(l.align === "right" && "text-right tabular"),
26
- children: l.cell ? l.cell(e) : e[l.key]
27
- },
28
- l.key
29
- )) }, e.id));
30
- return /* @__PURE__ */ d("div", { className: c("flex flex-col gap-3", y), children: [
28
+ const n = I(), [w, D] = M({}), c = f ?? w, g = (e) => c[e] !== !1, a = T(
29
+ () => t.filter((e) => c[e.key] !== !1),
30
+ [t, c]
31
+ ), N = (e, l) => {
32
+ if (!l && a.length <= 1) return;
33
+ const i = { ...c, [e]: l };
34
+ f === void 0 && D(i), h == null || h(i);
35
+ }, S = () => b ? Array.from({ length: 5 }).map((e, l) => /* @__PURE__ */ r(m, { children: a.map((i) => /* @__PURE__ */ r(p, { children: /* @__PURE__ */ r(F, { variant: "text", className: "w-3/4" }) }, i.key)) }, `skel-${l}`)) : s.length === 0 ? /* @__PURE__ */ r(m, { children: /* @__PURE__ */ r(p, { colSpan: Math.max(1, a.length), className: "h-32 text-center", children: k ?? /* @__PURE__ */ r("span", { className: "text-foreground-subtle", children: n.dataGrid.empty }) }) }) : s.map((e) => /* @__PURE__ */ r(m, { children: a.map((l) => /* @__PURE__ */ r(p, { align: l.align ?? "left", children: l.cell ? l.cell(e) : J(e[l.key], n.dataGrid.emptyCell) }, l.key)) }, e.id));
36
+ return /* @__PURE__ */ d("div", { className: j("flex flex-col gap-3", x), children: [
31
37
  /* @__PURE__ */ d("div", { className: "flex items-center justify-between gap-2", children: [
32
- a ? /* @__PURE__ */ r(
33
- I,
38
+ o ? /* @__PURE__ */ r(
39
+ K,
34
40
  {
35
41
  type: "search",
36
- placeholder: a.placeholder ?? n.dataGrid.filterPlaceholder,
37
- value: a.value,
38
- onChange: (e) => a.onChange(e.target.value),
42
+ placeholder: o.placeholder ?? n.dataGrid.filterPlaceholder,
43
+ value: o.value,
44
+ onChange: (e) => o.onChange(e.target.value),
39
45
  clearable: !0,
40
- onClear: () => a.onChange(""),
41
- className: "max-w-sm w-full",
46
+ onClear: () => o.onChange(""),
47
+ className: "w-full max-w-sm",
42
48
  hideLabel: !0,
43
49
  label: n.dataGrid.filterRows
44
50
  }
45
51
  ) : /* @__PURE__ */ r("div", {}),
46
- /* @__PURE__ */ r("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ d(S, { children: [
47
- /* @__PURE__ */ r(T, { asChild: !0, children: /* @__PURE__ */ r(j, { "aria-label": n.dataGrid.columnVisibility, icon: /* @__PURE__ */ r(C, {}), variant: "outline" }) }),
48
- /* @__PURE__ */ d(D, { children: [
49
- /* @__PURE__ */ r(M, { children: n.dataGrid.columns }),
50
- /* @__PURE__ */ r(G, {}),
51
- h.map((e) => /* @__PURE__ */ r(
52
- H,
52
+ /* @__PURE__ */ r("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ d(H, { children: [
53
+ /* @__PURE__ */ r(R, { asChild: !0, children: /* @__PURE__ */ r(
54
+ E,
55
+ {
56
+ "aria-label": n.dataGrid.columnVisibility,
57
+ icon: /* @__PURE__ */ r(C, {}),
58
+ variant: "outline"
59
+ }
60
+ ) }),
61
+ /* @__PURE__ */ d(B, { children: [
62
+ /* @__PURE__ */ r(L, { children: n.dataGrid.columns }),
63
+ /* @__PURE__ */ r(V, {}),
64
+ t.map((e) => /* @__PURE__ */ r(
65
+ A,
53
66
  {
54
- checked: !s[e.key],
55
- onCheckedChange: (l) => k((i) => ({ ...i, [e.key]: !l })),
67
+ checked: g(e.key),
68
+ disabled: g(e.key) && a.length <= 1,
69
+ onCheckedChange: (l) => N(e.key, l === !0),
56
70
  children: e.header
57
71
  },
58
72
  e.key
@@ -60,25 +74,26 @@ function U({
60
74
  ] })
61
75
  ] }) })
62
76
  ] }),
63
- /* @__PURE__ */ r("div", { className: "rounded-lg border border-border overflow-hidden", children: /* @__PURE__ */ d(R, { children: [
64
- /* @__PURE__ */ r("colgroup", { children: t.map((e) => /* @__PURE__ */ r("col", { style: e.width ? { width: e.width } : void 0 }, e.key)) }),
65
- /* @__PURE__ */ r(B, { children: /* @__PURE__ */ r(o, { children: t.map(
77
+ /* @__PURE__ */ d(P, { containerClassName: "rounded-lg border border-border", children: [
78
+ /* @__PURE__ */ r("colgroup", { children: a.map((e) => /* @__PURE__ */ r("col", { style: e.width ? { width: e.width } : void 0 }, e.key)) }),
79
+ /* @__PURE__ */ r(_, { children: /* @__PURE__ */ r(m, { children: a.map(
66
80
  (e) => e.sortable && u ? /* @__PURE__ */ r(
67
- L,
81
+ $,
68
82
  {
83
+ align: e.align ?? "left",
69
84
  sortKey: e.key,
70
- currentSort: b ?? null,
85
+ currentSort: y ?? null,
71
86
  onSortChange: (l, i) => u({ key: l, direction: i }),
72
87
  children: e.header
73
88
  },
74
89
  e.key
75
- ) : /* @__PURE__ */ r(A, { className: c(e.align === "right" && "text-right"), children: e.header }, e.key)
90
+ ) : /* @__PURE__ */ r(q, { align: e.align ?? "left", children: e.header }, e.key)
76
91
  ) }) }),
77
- /* @__PURE__ */ r(K, { children: w() })
78
- ] }) })
92
+ /* @__PURE__ */ r(z, { children: S() })
93
+ ] })
79
94
  ] });
80
95
  }
81
96
  export {
82
- U as DataGrid
97
+ ae as DataGrid
83
98
  };
84
99
  //# sourceMappingURL=DataGrid.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataGrid.js","sources":["../../../src/components/ui/DataGrid.tsx"],"sourcesContent":["'use client';\n\nimport { useMemo, useState, type ReactNode } from 'react';\nimport { Settings } from '@/icons';\nimport { cn } from '@/lib/utils';\nimport { useStrings } from '@/hooks/use-strings';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from './DropdownMenu';\nimport { IconButton } from './IconButton';\nimport { Input } from './Input';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n TableSortHeader,\n} from './Table';\nimport { Skeleton } from './Skeleton';\n\nexport interface DataGridColumn<TRow> {\n /** Stable key used for visibility, sort, and React lists. */\n key: string;\n /** Header label. */\n header: ReactNode;\n /** Render the cell. Defaults to the value at `row[key]`. */\n cell?: (row: TRow) => ReactNode;\n /** Cell width — passed to `<col>` so the grid keeps shape during loading. */\n width?: string;\n /** Allow sorting on this column. */\n sortable?: boolean;\n /** Right-align numeric / monetary columns. */\n align?: 'left' | 'right';\n}\n\nexport interface DataGridProps<TRow extends { id: string | number }> {\n columns: DataGridColumn<TRow>[];\n rows: TRow[];\n loading?: boolean;\n /** Initial sort state. */\n sort?: { key: string; direction: 'asc' | 'desc' } | null;\n onSortChange?: (sort: { key: string; direction: 'asc' | 'desc' }) => void;\n /** Show a filter input row above the grid. */\n filter?: { value: string; onChange: (q: string) => void; placeholder?: string };\n /** Empty-state node when no rows are visible. */\n emptyState?: ReactNode;\n className?: string;\n}\n\n/**\n * Composite grid built from `Table` + DropdownMenu + Input. Provides\n * column visibility toggle, an inline filter, sortable headers, and\n * loading / empty states.\n *\n * @example\n * <DataGrid\n * columns={[\n * { key: 'name', header: 'Name', sortable: true },\n * { key: 'status', header: 'Status', cell: r => <Badge tone={...}>{r.status}</Badge> },\n * { key: 'updatedAt', header: 'Updated', align: 'right' },\n * ]}\n * rows={rows}\n * filter={{ value: q, onChange: setQ }}\n * sort={sort}\n * onSortChange={setSort}\n * />\n *\n * @do Provide a meaningful empty state with a primary action when the grid\n * starts empty (no items at all, not just filtered out).\n * @dont Render thousands of rows synchronously — virtualise with `@tanstack/react-virtual`\n * and wrap with this component's headers as a shell.\n */\nexport function DataGrid<TRow extends { id: string | number }>({\n columns,\n rows,\n loading,\n sort,\n onSortChange,\n filter,\n emptyState,\n className,\n}: DataGridProps<TRow>) {\n const strings = useStrings();\n const [hidden, setHidden] = useState<Record<string, boolean>>({});\n const visibleColumns = useMemo(() => columns.filter((c) => !hidden[c.key]), [columns, hidden]);\n\n const renderRows = () => {\n if (loading) {\n return Array.from({ length: 5 }).map((_, i) => (\n <TableRow key={`skel-${i}`}>\n {visibleColumns.map((c) => (\n <TableCell key={c.key}>\n <Skeleton variant=\"text\" className=\"w-3/4\" />\n </TableCell>\n ))}\n </TableRow>\n ));\n }\n if (rows.length === 0) {\n return (\n <TableRow>\n <TableCell colSpan={visibleColumns.length} className=\"h-32 text-center\">\n {emptyState ?? (\n <span className=\"text-foreground-subtle\">{strings.dataGrid.empty}</span>\n )}\n </TableCell>\n </TableRow>\n );\n }\n return rows.map((row) => (\n <TableRow key={row.id}>\n {visibleColumns.map((c) => (\n <TableCell\n key={c.key}\n className={cn(c.align === 'right' && 'text-right tabular')}\n >\n {c.cell ? c.cell(row) : (row as Record<string, unknown>)[c.key] as ReactNode}\n </TableCell>\n ))}\n </TableRow>\n ));\n };\n\n return (\n <div className={cn('flex flex-col gap-3', className)}>\n <div className=\"flex items-center justify-between gap-2\">\n {filter ? (\n <Input\n type=\"search\"\n placeholder={filter.placeholder ?? strings.dataGrid.filterPlaceholder}\n value={filter.value}\n onChange={(e) => filter.onChange(e.target.value)}\n clearable\n onClear={() => filter.onChange('')}\n className=\"max-w-sm w-full\"\n hideLabel\n label={strings.dataGrid.filterRows}\n />\n ) : (\n <div />\n )}\n <div className=\"flex items-center gap-2\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <IconButton aria-label={strings.dataGrid.columnVisibility} icon={<Settings />} variant=\"outline\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuLabel>{strings.dataGrid.columns}</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {columns.map((c) => (\n <DropdownMenuCheckboxItem\n key={c.key}\n checked={!hidden[c.key]}\n onCheckedChange={(v) =>\n setHidden((prev) => ({ ...prev, [c.key]: !v }))\n }\n >\n {c.header}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border overflow-hidden\">\n <Table>\n <colgroup>\n {visibleColumns.map((c) => (\n <col key={c.key} style={c.width ? { width: c.width } : undefined} />\n ))}\n </colgroup>\n <TableHeader>\n <TableRow>\n {visibleColumns.map((c) =>\n c.sortable && onSortChange ? (\n <TableSortHeader\n key={c.key}\n sortKey={c.key}\n currentSort={sort ?? null}\n onSortChange={(k, d) => onSortChange({ key: k, direction: d })}\n >\n {c.header}\n </TableSortHeader>\n ) : (\n <TableHead key={c.key} className={cn(c.align === 'right' && 'text-right')}>\n {c.header}\n </TableHead>\n ),\n )}\n </TableRow>\n </TableHeader>\n <TableBody>{renderRows()}</TableBody>\n </Table>\n </div>\n </div>\n );\n}\n"],"names":["DataGrid","columns","rows","loading","sort","onSortChange","filter","emptyState","className","strings","useStrings","hidden","setHidden","useState","visibleColumns","useMemo","c","renderRows","_","i","jsx","TableRow","TableCell","Skeleton","row","cn","jsxs","Input","DropdownMenu","DropdownMenuTrigger","IconButton","Settings","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuCheckboxItem","v","prev","Table","TableHeader","TableSortHeader","k","d","TableHead","TableBody"],"mappings":"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"}
1
+ {"version":3,"file":"DataGrid.js","sources":["../../../src/components/ui/DataGrid.tsx"],"sourcesContent":["'use client';\n\nimport { isValidElement, useMemo, useState, type ReactNode } from 'react';\nimport { Settings } from '@/icons';\nimport { cn } from '@/lib/utils';\nimport { formatDate } from '@/lib/format';\nimport { useStrings } from '@/hooks/use-strings';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from './DropdownMenu';\nimport { IconButton } from './IconButton';\nimport { Input } from './Input';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n TableSortHeader,\n} from './Table';\nimport { Skeleton } from './Skeleton';\n\nexport interface DataGridColumn<TRow> {\n /**\n * Stable key used for visibility, sort, and React lists. Autocompletes\n * row fields; any string is allowed for computed columns (with `cell`).\n */\n key: (keyof TRow & string) | (string & {});\n /** Header label. */\n header: ReactNode;\n /**\n * Render the cell. Defaults to the value at `row[key]`: `Date` →\n * `formatDate` (yyyy-MM-dd HH:mm), primitives as-is, other objects via\n * `String()`.\n */\n cell?: (row: TRow) => ReactNode;\n /** Cell width — passed to `<col>` so the grid keeps shape during loading. */\n width?: string;\n /** Allow sorting on this column. */\n sortable?: boolean;\n /** Right-align numeric / monetary columns. */\n align?: 'left' | 'right';\n}\n\nexport interface DataGridProps<TRow extends { id: string | number }> {\n columns: DataGridColumn<TRow>[];\n rows: TRow[];\n loading?: boolean;\n /** Initial sort state. */\n sort?: { key: string; direction: 'asc' | 'desc' } | null;\n onSortChange?: (sort: { key: string; direction: 'asc' | 'desc' }) => void;\n /** Show a filter input row above the grid. */\n filter?: { value: string; onChange: (q: string) => void; placeholder?: string };\n /** Empty-state node when no rows are visible. */\n emptyState?: ReactNode;\n /**\n * Controlled column visibility: `{ [key]: boolean }` (missing = visible).\n * Omit for internal state. At least one column always stays visible.\n */\n columnVisibility?: Record<string, boolean>;\n onColumnVisibilityChange?: (next: Record<string, boolean>) => void;\n className?: string;\n}\n\n/** Default cell renderer for `row[key]` when no `cell` is given. */\nfunction renderValue(v: unknown, emptyLabel: string): ReactNode {\n if (v === null || v === undefined || v === '') {\n return (\n <span aria-label={emptyLabel} className=\"text-foreground-subtle\">\n —\n </span>\n );\n }\n if (v instanceof Date) return formatDate(v);\n if (typeof v === 'object') return isValidElement(v) ? v : String(v);\n return v as ReactNode;\n}\n\n/**\n * Composite grid built from `Table` + DropdownMenu + Input. Provides\n * column visibility toggle, an inline filter, sortable headers, and\n * loading / empty states.\n *\n * @example\n * <DataGrid\n * columns={[\n * { key: 'name', header: 'Name', sortable: true },\n * { key: 'status', header: 'Status', cell: r => <Badge tone={...}>{r.status}</Badge> },\n * { key: 'updatedAt', header: 'Updated', align: 'right' },\n * ]}\n * rows={rows}\n * filter={{ value: q, onChange: setQ }}\n * sort={sort}\n * onSortChange={setSort}\n * />\n *\n * @do Provide a meaningful empty state with a primary action when the grid\n * starts empty (no items at all, not just filtered out).\n * @dont Render thousands of rows synchronously — virtualise with `@tanstack/react-virtual`\n * and wrap with this component's headers as a shell.\n */\nexport function DataGrid<TRow extends { id: string | number }>({\n columns,\n rows,\n loading,\n sort,\n onSortChange,\n filter,\n emptyState,\n columnVisibility,\n onColumnVisibilityChange,\n className,\n}: DataGridProps<TRow>) {\n const strings = useStrings();\n const [internalVisibility, setInternalVisibility] = useState<Record<string, boolean>>({});\n const visibility = columnVisibility ?? internalVisibility;\n const isVisible = (key: string) => visibility[key] !== false;\n const visibleColumns = useMemo(\n () => columns.filter((c) => visibility[c.key] !== false),\n [columns, visibility],\n );\n const setColumnVisible = (key: string, visible: boolean) => {\n // Never let the user hide the last visible column — an empty grid has no\n // affordance to bring columns back.\n if (!visible && visibleColumns.length <= 1) return;\n const next = { ...visibility, [key]: visible };\n if (columnVisibility === undefined) setInternalVisibility(next);\n onColumnVisibilityChange?.(next);\n };\n\n const renderRows = () => {\n if (loading) {\n return Array.from({ length: 5 }).map((_, i) => (\n <TableRow key={`skel-${i}`}>\n {visibleColumns.map((c) => (\n <TableCell key={c.key}>\n <Skeleton variant=\"text\" className=\"w-3/4\" />\n </TableCell>\n ))}\n </TableRow>\n ));\n }\n if (rows.length === 0) {\n return (\n <TableRow>\n <TableCell colSpan={Math.max(1, visibleColumns.length)} className=\"h-32 text-center\">\n {emptyState ?? <span className=\"text-foreground-subtle\">{strings.dataGrid.empty}</span>}\n </TableCell>\n </TableRow>\n );\n }\n return rows.map((row) => (\n <TableRow key={row.id}>\n {visibleColumns.map((c) => (\n <TableCell key={c.key} align={c.align ?? 'left'}>\n {c.cell\n ? c.cell(row)\n : renderValue((row as Record<string, unknown>)[c.key], strings.dataGrid.emptyCell)}\n </TableCell>\n ))}\n </TableRow>\n ));\n };\n\n return (\n <div className={cn('flex flex-col gap-3', className)}>\n <div className=\"flex items-center justify-between gap-2\">\n {filter ? (\n <Input\n type=\"search\"\n placeholder={filter.placeholder ?? strings.dataGrid.filterPlaceholder}\n value={filter.value}\n onChange={(e) => filter.onChange(e.target.value)}\n clearable\n onClear={() => filter.onChange('')}\n className=\"w-full max-w-sm\"\n hideLabel\n label={strings.dataGrid.filterRows}\n />\n ) : (\n <div />\n )}\n <div className=\"flex items-center gap-2\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <IconButton\n aria-label={strings.dataGrid.columnVisibility}\n icon={<Settings />}\n variant=\"outline\"\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuLabel>{strings.dataGrid.columns}</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {columns.map((c) => (\n <DropdownMenuCheckboxItem\n key={c.key}\n checked={isVisible(c.key)}\n disabled={isVisible(c.key) && visibleColumns.length <= 1}\n onCheckedChange={(v) => setColumnVisible(c.key, v === true)}\n >\n {c.header}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n\n <Table containerClassName=\"rounded-lg border border-border\">\n <colgroup>\n {visibleColumns.map((c) => (\n <col key={c.key} style={c.width ? { width: c.width } : undefined} />\n ))}\n </colgroup>\n <TableHeader>\n <TableRow>\n {visibleColumns.map((c) =>\n c.sortable && onSortChange ? (\n <TableSortHeader\n key={c.key}\n align={c.align ?? 'left'}\n sortKey={c.key}\n currentSort={sort ?? null}\n onSortChange={(k, d) => onSortChange({ key: k, direction: d })}\n >\n {c.header}\n </TableSortHeader>\n ) : (\n <TableHead key={c.key} align={c.align ?? 'left'}>\n {c.header}\n </TableHead>\n ),\n )}\n </TableRow>\n </TableHeader>\n <TableBody>{renderRows()}</TableBody>\n </Table>\n </div>\n );\n}\n"],"names":["renderValue","v","emptyLabel","formatDate","isValidElement","DataGrid","columns","rows","loading","sort","onSortChange","filter","emptyState","columnVisibility","onColumnVisibilityChange","className","strings","useStrings","internalVisibility","setInternalVisibility","useState","visibility","isVisible","key","visibleColumns","useMemo","c","setColumnVisible","visible","next","renderRows","_","i","jsx","TableRow","TableCell","Skeleton","row","cn","jsxs","Input","DropdownMenu","DropdownMenuTrigger","IconButton","Settings","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuCheckboxItem","Table","TableHeader","TableSortHeader","k","d","TableHead","TableBody"],"mappings":"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"}
@@ -1,164 +1,183 @@
1
1
  "use client";
2
- import { jsx as r, jsxs as b } from "react/jsx-runtime";
3
- import { forwardRef as R, useId as $, useState as M, useMemo as j } from "react";
4
- import * as l from "@radix-ui/react-popover";
2
+ import { jsx as n, jsxs as $ } from "react/jsx-runtime";
3
+ import { forwardRef as O, useId as R, useState as S, useMemo as F } from "react";
4
+ import * as f from "@radix-ui/react-popover";
5
5
  import { Calendar as A } from "../../icons/index.js";
6
- import { Calendar as v } from "./Calendar.js";
7
- import { cn as O } from "../../lib/utils.js";
6
+ import { Calendar as D } from "./Calendar.js";
7
+ import { cn as C } from "../../lib/utils.js";
8
8
  import { useStrings as w } from "../../hooks/use-strings.js";
9
- function z(t) {
10
- return t.toLocaleDateString(void 0, { year: "numeric", month: "short", day: "numeric" });
9
+ function z(t, e) {
10
+ if (e != null && e.code)
11
+ return t.toLocaleDateString(e.code, { year: "numeric", month: "short", day: "numeric" });
12
+ const o = (r) => String(r).padStart(2, "0");
13
+ return `${t.getFullYear()}-${o(t.getMonth() + 1)}-${o(t.getDate())}`;
11
14
  }
12
- function S(t, e, o) {
13
- return j(() => {
14
- const n = [];
15
- return t && n.push({ before: t }), e && n.push({ after: e }), o && n.push(...Array.isArray(o) ? o : [o]), n.length ? n : void 0;
15
+ function v(t, e, o) {
16
+ return F(() => {
17
+ const r = [];
18
+ return t && r.push({ before: t }), e && r.push({ after: e }), o && r.push(...Array.isArray(o) ? o : [o]), r.length ? r : void 0;
16
19
  }, [t, e, o]);
17
20
  }
18
21
  function B({
19
22
  label: t,
20
23
  placeholder: e,
21
24
  hasValue: o,
22
- children: n,
23
- error: i,
24
- fieldId: c,
25
- disabled: f,
26
- open: a
25
+ children: r,
26
+ error: s,
27
+ fieldId: i,
28
+ disabled: g,
29
+ open: d
27
30
  }) {
28
- const d = `${c}-error`, g = `${c}-calendar`, s = o ? n : e;
29
- return /* @__PURE__ */ b("div", { className: "flex flex-col gap-1.5", children: [
30
- t && /* @__PURE__ */ r("label", { htmlFor: c, className: "text-foreground text-sm font-medium", children: t }),
31
- /* @__PURE__ */ r(l.Trigger, { asChild: !0, children: /* @__PURE__ */ b(
31
+ const a = `${i}-error`, p = `${i}-calendar`, c = o ? r : e;
32
+ return /* @__PURE__ */ $("div", { className: "flex flex-col gap-1.5", children: [
33
+ t && /* @__PURE__ */ n(
34
+ "label",
35
+ {
36
+ id: `${i}-label`,
37
+ htmlFor: i,
38
+ className: "text-foreground text-sm font-medium",
39
+ children: t
40
+ }
41
+ ),
42
+ /* @__PURE__ */ n(f.Trigger, { asChild: !0, children: /* @__PURE__ */ $(
32
43
  "button",
33
44
  {
34
- id: c,
45
+ id: i,
35
46
  type: "button",
36
47
  role: "combobox",
37
- "aria-expanded": a,
38
- "aria-controls": g,
39
- disabled: f,
40
- "aria-invalid": !!i || void 0,
41
- "aria-describedby": i ? d : void 0,
42
- className: O(
43
- "bg-card inline-flex h-9 w-full items-center justify-start gap-2 rounded-md border px-3 text-left text-sm",
48
+ "aria-expanded": d,
49
+ "aria-controls": p,
50
+ "aria-labelledby": t ? `${i}-label` : void 0,
51
+ "aria-label": t ? void 0 : e,
52
+ disabled: g,
53
+ "aria-invalid": !!s || void 0,
54
+ "aria-describedby": s ? a : void 0,
55
+ className: C(
56
+ "bg-card inline-flex h-9 w-full items-center justify-start gap-2 rounded-md border px-3 text-left text-lg md:text-sm",
44
57
  "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out)]",
45
58
  "focus-visible:ring-offset-background outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
46
59
  "disabled:cursor-not-allowed disabled:opacity-50",
47
- i ? "border-danger focus-visible:border-danger focus-visible:ring-danger" : "border-border focus-visible:border-accent focus-visible:ring-ring",
60
+ s ? "border-danger focus-visible:border-danger focus-visible:ring-danger" : "border-border-input focus-visible:border-accent focus-visible:ring-ring",
48
61
  !o && "text-foreground-subtle"
49
62
  ),
50
63
  children: [
51
- /* @__PURE__ */ r(A, { className: "text-foreground-subtle size-4", "aria-hidden": !0 }),
52
- /* @__PURE__ */ r("span", { className: "truncate", title: typeof s == "string" ? s : void 0, children: s })
64
+ /* @__PURE__ */ n(A, { className: "text-foreground-subtle size-4", "aria-hidden": !0 }),
65
+ /* @__PURE__ */ n("span", { className: "truncate", title: typeof c == "string" ? c : void 0, children: c })
53
66
  ]
54
67
  }
55
68
  ) }),
56
- i && /* @__PURE__ */ r("p", { id: d, role: "alert", className: "text-danger-text text-xs", children: i })
69
+ s && /* @__PURE__ */ n("p", { id: a, className: "text-danger-text text-xs", children: s })
57
70
  ] });
58
71
  }
59
- const F = R(function({
72
+ const T = O(function({
60
73
  value: e,
61
74
  onChange: o,
62
- label: n,
63
- placeholder: i,
64
- error: c,
65
- disabled: f,
66
- fromDate: a,
67
- toDate: d,
68
- disabledDays: g,
69
- formatDate: s = z,
70
- locale: x,
75
+ label: r,
76
+ placeholder: s,
77
+ error: i,
78
+ disabled: g,
79
+ fromDate: d,
80
+ toDate: a,
81
+ disabledDays: p,
82
+ formatDate: c,
83
+ locale: h,
71
84
  className: P
72
85
  }, k) {
73
- const N = w(), y = i ?? N.datePicker.pickDate, p = $(), [m, h] = M(!1), C = S(a, d, g);
74
- return /* @__PURE__ */ r("div", { ref: k, className: O(P), children: /* @__PURE__ */ b(l.Root, { open: m, onOpenChange: h, children: [
75
- /* @__PURE__ */ r(
86
+ const N = w(), u = c ?? ((m) => z(m, h)), b = s ?? N.datePicker.pickDate, l = R(), [x, y] = S(!1), M = v(d, a, p);
87
+ return /* @__PURE__ */ n("div", { ref: k, className: C(P), children: /* @__PURE__ */ $(f.Root, { open: x, onOpenChange: y, children: [
88
+ /* @__PURE__ */ n(
76
89
  B,
77
90
  {
78
- label: n,
79
- placeholder: y,
91
+ label: r,
92
+ placeholder: b,
80
93
  hasValue: !!e,
81
- error: c,
82
- fieldId: p,
83
- disabled: f,
84
- open: m,
85
- children: e ? s(e) : ""
94
+ error: i,
95
+ fieldId: l,
96
+ disabled: g,
97
+ open: x,
98
+ children: e ? u(e) : ""
86
99
  }
87
100
  ),
88
- /* @__PURE__ */ r(l.Portal, { children: /* @__PURE__ */ r(
89
- l.Content,
101
+ /* @__PURE__ */ n(f.Portal, { children: /* @__PURE__ */ n(
102
+ f.Content,
90
103
  {
91
- id: `${p}-calendar`,
104
+ id: `${l}-calendar`,
105
+ "aria-labelledby": r ? `${l}-label` : void 0,
106
+ "aria-label": r ? void 0 : b,
92
107
  align: "start",
93
108
  sideOffset: 4,
94
- className: "text-popover-foreground z-[var(--z-popover)] rounded-lg shadow-lg",
95
- children: /* @__PURE__ */ r(
96
- v,
109
+ className: "text-popover-foreground z-[var(--z-popover)] rounded-lg shadow-md",
110
+ children: /* @__PURE__ */ n(
111
+ D,
97
112
  {
98
113
  mode: "single",
99
114
  selected: e,
100
- onSelect: (u) => {
101
- o(u ?? void 0), u && h(!1);
115
+ defaultMonth: e,
116
+ onSelect: (m) => {
117
+ o(m ?? void 0), m && y(!1);
102
118
  },
103
- startMonth: a,
104
- endMonth: d,
105
- disabled: C,
106
- locale: x
119
+ startMonth: d,
120
+ endMonth: a,
121
+ disabled: M,
122
+ locale: h
107
123
  }
108
124
  )
109
125
  }
110
126
  ) })
111
127
  ] }) });
112
128
  });
113
- F.displayName = "DatePicker";
114
- const I = R(
129
+ T.displayName = "DatePicker";
130
+ const L = O(
115
131
  function({
116
132
  value: e,
117
133
  onChange: o,
118
- label: n,
119
- placeholder: i,
120
- error: c,
121
- disabled: f,
122
- fromDate: a,
123
- toDate: d,
124
- disabledDays: g,
125
- formatDate: s = z,
126
- locale: x,
134
+ label: r,
135
+ placeholder: s,
136
+ error: i,
137
+ disabled: g,
138
+ fromDate: d,
139
+ toDate: a,
140
+ disabledDays: p,
141
+ formatDate: c,
142
+ locale: h,
127
143
  className: P
128
144
  }, k) {
129
- const N = w(), y = i ?? N.datePicker.pickRange, p = $(), [m, h] = M(!1), C = !!(e != null && e.from), u = S(a, d, g);
130
- return /* @__PURE__ */ r("div", { ref: k, className: O(P), children: /* @__PURE__ */ b(l.Root, { open: m, onOpenChange: h, children: [
131
- /* @__PURE__ */ r(
145
+ const N = w(), u = c ?? ((j) => z(j, h)), b = s ?? N.datePicker.pickRange, l = R(), [x, y] = S(!1), M = !!(e != null && e.from), m = v(d, a, p);
146
+ return /* @__PURE__ */ n("div", { ref: k, className: C(P), children: /* @__PURE__ */ $(f.Root, { open: x, onOpenChange: y, children: [
147
+ /* @__PURE__ */ n(
132
148
  B,
133
149
  {
134
- label: n,
135
- placeholder: y,
136
- hasValue: C,
137
- error: c,
138
- fieldId: p,
139
- disabled: f,
140
- open: m,
141
- children: e != null && e.from && e.to ? `${s(e.from)} – ${s(e.to)}` : e != null && e.from ? s(e.from) : ""
150
+ label: r,
151
+ placeholder: b,
152
+ hasValue: M,
153
+ error: i,
154
+ fieldId: l,
155
+ disabled: g,
156
+ open: x,
157
+ children: e != null && e.from && e.to ? `${u(e.from)} – ${u(e.to)}` : e != null && e.from ? u(e.from) : ""
142
158
  }
143
159
  ),
144
- /* @__PURE__ */ r(l.Portal, { children: /* @__PURE__ */ r(
145
- l.Content,
160
+ /* @__PURE__ */ n(f.Portal, { children: /* @__PURE__ */ n(
161
+ f.Content,
146
162
  {
147
- id: `${p}-calendar`,
163
+ id: `${l}-calendar`,
164
+ "aria-labelledby": r ? `${l}-label` : void 0,
165
+ "aria-label": r ? void 0 : b,
148
166
  align: "start",
149
167
  sideOffset: 4,
150
- className: "text-popover-foreground z-[var(--z-popover)] rounded-lg shadow-lg",
151
- children: /* @__PURE__ */ r(
152
- v,
168
+ className: "text-popover-foreground z-[var(--z-popover)] rounded-lg shadow-md",
169
+ children: /* @__PURE__ */ n(
170
+ D,
153
171
  {
154
172
  mode: "range",
155
173
  selected: e,
174
+ defaultMonth: e == null ? void 0 : e.from,
156
175
  onSelect: o,
157
176
  numberOfMonths: 2,
158
- startMonth: a,
159
- endMonth: d,
160
- disabled: u,
161
- locale: x
177
+ startMonth: d,
178
+ endMonth: a,
179
+ disabled: m,
180
+ locale: h
162
181
  }
163
182
  )
164
183
  }
@@ -166,9 +185,9 @@ const I = R(
166
185
  ] }) });
167
186
  }
168
187
  );
169
- I.displayName = "DateRangePicker";
188
+ L.displayName = "DateRangePicker";
170
189
  export {
171
- F as DatePicker,
172
- I as DateRangePicker
190
+ T as DatePicker,
191
+ L as DateRangePicker
173
192
  };
174
193
  //# sourceMappingURL=DatePicker.js.map