@fragments-sdk/ui 0.11.1 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/README.md +15 -0
  2. package/dist/assets/ui.css +25 -18
  3. package/dist/blocks/AccountSettings.block.d.ts +1 -1
  4. package/dist/blocks/ActivityFeed.block.d.ts +1 -1
  5. package/dist/blocks/ActivityFeedSkeleton.block.d.ts +1 -1
  6. package/dist/blocks/BlogEditor.block.d.ts +1 -1
  7. package/dist/blocks/ChatInterface.block.d.ts +1 -1
  8. package/dist/blocks/ChatMessages.block.d.ts +1 -1
  9. package/dist/blocks/CheckoutForm.block.d.ts +1 -1
  10. package/dist/blocks/CommandPalette.block.d.ts +1 -1
  11. package/dist/blocks/ContactForm.block.d.ts +1 -1
  12. package/dist/blocks/DashboardLayout.block.d.ts +1 -1
  13. package/dist/blocks/DashboardPage.block.d.ts +1 -1
  14. package/dist/blocks/DashboardSkeleton.block.d.ts +1 -1
  15. package/dist/blocks/DataTable.block.d.ts +1 -1
  16. package/dist/blocks/EmptyState.block.d.ts +1 -1
  17. package/dist/blocks/FAQSection.block.d.ts +1 -1
  18. package/dist/blocks/FeatureGrid.block.d.ts +1 -1
  19. package/dist/blocks/HeroSection.block.d.ts +1 -1
  20. package/dist/blocks/LoginForm.block.d.ts +1 -1
  21. package/dist/blocks/NavigationHeader.block.d.ts +1 -1
  22. package/dist/blocks/PaginatedTable.block.d.ts +1 -1
  23. package/dist/blocks/PricingComparison.block.d.ts +1 -1
  24. package/dist/blocks/ProductCard.block.d.ts +1 -1
  25. package/dist/blocks/RegistrationForm.block.d.ts +1 -1
  26. package/dist/blocks/SettingsDrawer.block.d.ts +1 -1
  27. package/dist/blocks/SettingsPanel.block.d.ts +1 -1
  28. package/dist/blocks/ShoppingCart.block.d.ts +1 -1
  29. package/dist/blocks/StatsCard.block.d.ts +1 -1
  30. package/dist/blocks/StatsCardSkeleton.block.d.ts +1 -1
  31. package/dist/blocks/TableSkeleton.block.d.ts +1 -1
  32. package/dist/blocks/ThinkingStates.block.d.ts +1 -1
  33. package/dist/codeblock.cjs +7 -1
  34. package/dist/codeblock.cjs.map +1 -1
  35. package/dist/codeblock.js +7 -1
  36. package/dist/codeblock.js.map +1 -1
  37. package/dist/components/Accordion/index.cjs +11 -4
  38. package/dist/components/Accordion/index.cjs.map +1 -1
  39. package/dist/components/Accordion/index.d.ts +3 -3
  40. package/dist/components/Accordion/index.d.ts.map +1 -1
  41. package/dist/components/Accordion/index.js +11 -4
  42. package/dist/components/Accordion/index.js.map +1 -1
  43. package/dist/components/Alert/index.cjs.map +1 -1
  44. package/dist/components/Alert/index.d.ts +7 -0
  45. package/dist/components/Alert/index.d.ts.map +1 -1
  46. package/dist/components/Alert/index.js.map +1 -1
  47. package/dist/components/Avatar/index.cjs.map +1 -1
  48. package/dist/components/Avatar/index.d.ts +4 -0
  49. package/dist/components/Avatar/index.d.ts.map +1 -1
  50. package/dist/components/Avatar/index.js.map +1 -1
  51. package/dist/components/Badge/index.cjs.map +1 -1
  52. package/dist/components/Badge/index.d.ts +12 -0
  53. package/dist/components/Badge/index.d.ts.map +1 -1
  54. package/dist/components/Badge/index.js.map +1 -1
  55. package/dist/components/Button/index.cjs +9 -1
  56. package/dist/components/Button/index.cjs.map +1 -1
  57. package/dist/components/Button/index.d.ts +14 -1
  58. package/dist/components/Button/index.d.ts.map +1 -1
  59. package/dist/components/Button/index.js +9 -1
  60. package/dist/components/Button/index.js.map +1 -1
  61. package/dist/components/Card/index.cjs +2 -1
  62. package/dist/components/Card/index.cjs.map +1 -1
  63. package/dist/components/Card/index.d.ts +12 -2
  64. package/dist/components/Card/index.d.ts.map +1 -1
  65. package/dist/components/Card/index.js +2 -1
  66. package/dist/components/Card/index.js.map +1 -1
  67. package/dist/components/Checkbox/index.cjs.map +1 -1
  68. package/dist/components/Checkbox/index.d.ts +6 -1
  69. package/dist/components/Checkbox/index.d.ts.map +1 -1
  70. package/dist/components/Checkbox/index.js.map +1 -1
  71. package/dist/components/Chip/index.cjs +2 -1
  72. package/dist/components/Chip/index.cjs.map +1 -1
  73. package/dist/components/Chip/index.d.ts +10 -3
  74. package/dist/components/Chip/index.d.ts.map +1 -1
  75. package/dist/components/Chip/index.js +2 -1
  76. package/dist/components/Chip/index.js.map +1 -1
  77. package/dist/components/CodeBlock/index.d.ts +1 -1
  78. package/dist/components/CodeBlock/index.d.ts.map +1 -1
  79. package/dist/components/Collapsible/index.cjs +45 -10
  80. package/dist/components/Collapsible/index.cjs.map +1 -1
  81. package/dist/components/Collapsible/index.d.ts +6 -12
  82. package/dist/components/Collapsible/index.d.ts.map +1 -1
  83. package/dist/components/Collapsible/index.js +45 -10
  84. package/dist/components/Collapsible/index.js.map +1 -1
  85. package/dist/components/Combobox/index.cjs +18 -9
  86. package/dist/components/Combobox/index.cjs.map +1 -1
  87. package/dist/components/Combobox/index.d.ts +8 -12
  88. package/dist/components/Combobox/index.d.ts.map +1 -1
  89. package/dist/components/Combobox/index.js +18 -9
  90. package/dist/components/Combobox/index.js.map +1 -1
  91. package/dist/components/Command/index.cjs +54 -21
  92. package/dist/components/Command/index.cjs.map +1 -1
  93. package/dist/components/Command/index.d.ts +2 -2
  94. package/dist/components/Command/index.d.ts.map +1 -1
  95. package/dist/components/Command/index.js +54 -21
  96. package/dist/components/Command/index.js.map +1 -1
  97. package/dist/components/DataTable/index.cjs +13 -1
  98. package/dist/components/DataTable/index.cjs.map +1 -1
  99. package/dist/components/DataTable/index.d.ts.map +1 -1
  100. package/dist/components/DataTable/index.js +13 -1
  101. package/dist/components/DataTable/index.js.map +1 -1
  102. package/dist/components/DatePicker/index.d.ts +2 -3
  103. package/dist/components/DatePicker/index.d.ts.map +1 -1
  104. package/dist/components/Dialog/index.cjs +12 -9
  105. package/dist/components/Dialog/index.cjs.map +1 -1
  106. package/dist/components/Dialog/index.d.ts +20 -12
  107. package/dist/components/Dialog/index.d.ts.map +1 -1
  108. package/dist/components/Dialog/index.js +12 -9
  109. package/dist/components/Dialog/index.js.map +1 -1
  110. package/dist/components/Drawer/index.cjs +12 -9
  111. package/dist/components/Drawer/index.cjs.map +1 -1
  112. package/dist/components/Drawer/index.d.ts +22 -12
  113. package/dist/components/Drawer/index.d.ts.map +1 -1
  114. package/dist/components/Drawer/index.js +12 -9
  115. package/dist/components/Drawer/index.js.map +1 -1
  116. package/dist/components/Grid/index.cjs +4 -1
  117. package/dist/components/Grid/index.cjs.map +1 -1
  118. package/dist/components/Grid/index.d.ts +6 -2
  119. package/dist/components/Grid/index.d.ts.map +1 -1
  120. package/dist/components/Grid/index.js +4 -1
  121. package/dist/components/Grid/index.js.map +1 -1
  122. package/dist/components/Input/index.cjs.map +1 -1
  123. package/dist/components/Input/index.d.ts +15 -1
  124. package/dist/components/Input/index.d.ts.map +1 -1
  125. package/dist/components/Input/index.js.map +1 -1
  126. package/dist/components/Menu/index.cjs +30 -16
  127. package/dist/components/Menu/index.cjs.map +1 -1
  128. package/dist/components/Menu/index.d.ts +17 -25
  129. package/dist/components/Menu/index.d.ts.map +1 -1
  130. package/dist/components/Menu/index.js +30 -16
  131. package/dist/components/Menu/index.js.map +1 -1
  132. package/dist/components/NavigationMenu/NavigationMenuContext.cjs.map +1 -1
  133. package/dist/components/NavigationMenu/NavigationMenuContext.d.ts +1 -0
  134. package/dist/components/NavigationMenu/NavigationMenuContext.d.ts.map +1 -1
  135. package/dist/components/NavigationMenu/NavigationMenuContext.js.map +1 -1
  136. package/dist/components/NavigationMenu/index.cjs +43 -11
  137. package/dist/components/NavigationMenu/index.cjs.map +1 -1
  138. package/dist/components/NavigationMenu/index.d.ts.map +1 -1
  139. package/dist/components/NavigationMenu/index.js +43 -11
  140. package/dist/components/NavigationMenu/index.js.map +1 -1
  141. package/dist/components/NavigationMenu/useNavigationMenu.cjs +2 -0
  142. package/dist/components/NavigationMenu/useNavigationMenu.cjs.map +1 -1
  143. package/dist/components/NavigationMenu/useNavigationMenu.d.ts +1 -0
  144. package/dist/components/NavigationMenu/useNavigationMenu.d.ts.map +1 -1
  145. package/dist/components/NavigationMenu/useNavigationMenu.js +2 -0
  146. package/dist/components/NavigationMenu/useNavigationMenu.js.map +1 -1
  147. package/dist/components/Popover/index.cjs +11 -10
  148. package/dist/components/Popover/index.cjs.map +1 -1
  149. package/dist/components/Popover/index.d.ts +17 -12
  150. package/dist/components/Popover/index.d.ts.map +1 -1
  151. package/dist/components/Popover/index.js +11 -10
  152. package/dist/components/Popover/index.js.map +1 -1
  153. package/dist/components/RadioGroup/index.cjs.map +1 -1
  154. package/dist/components/RadioGroup/index.d.ts +4 -0
  155. package/dist/components/RadioGroup/index.d.ts.map +1 -1
  156. package/dist/components/RadioGroup/index.js.map +1 -1
  157. package/dist/components/Select/index.cjs +7 -6
  158. package/dist/components/Select/index.cjs.map +1 -1
  159. package/dist/components/Select/index.d.ts +20 -9
  160. package/dist/components/Select/index.d.ts.map +1 -1
  161. package/dist/components/Select/index.js +7 -6
  162. package/dist/components/Select/index.js.map +1 -1
  163. package/dist/components/Sidebar/index.cjs +71 -24
  164. package/dist/components/Sidebar/index.cjs.map +1 -1
  165. package/dist/components/Sidebar/index.d.ts +21 -33
  166. package/dist/components/Sidebar/index.d.ts.map +1 -1
  167. package/dist/components/Sidebar/index.js +71 -24
  168. package/dist/components/Sidebar/index.js.map +1 -1
  169. package/dist/components/Slider/index.cjs +3 -1
  170. package/dist/components/Slider/index.cjs.map +1 -1
  171. package/dist/components/Slider/index.d.ts +10 -0
  172. package/dist/components/Slider/index.d.ts.map +1 -1
  173. package/dist/components/Slider/index.js +3 -1
  174. package/dist/components/Slider/index.js.map +1 -1
  175. package/dist/components/Stack/index.cjs +6 -0
  176. package/dist/components/Stack/index.cjs.map +1 -1
  177. package/dist/components/Stack/index.d.ts +12 -6
  178. package/dist/components/Stack/index.d.ts.map +1 -1
  179. package/dist/components/Stack/index.js +6 -0
  180. package/dist/components/Stack/index.js.map +1 -1
  181. package/dist/components/Tabs/index.cjs.map +1 -1
  182. package/dist/components/Tabs/index.d.ts +13 -1
  183. package/dist/components/Tabs/index.d.ts.map +1 -1
  184. package/dist/components/Tabs/index.js.map +1 -1
  185. package/dist/components/Text/Text.module.scss.cjs +44 -32
  186. package/dist/components/Text/Text.module.scss.cjs.map +1 -1
  187. package/dist/components/Text/Text.module.scss.js +44 -32
  188. package/dist/components/Text/Text.module.scss.js.map +1 -1
  189. package/dist/components/Text/index.cjs.map +1 -1
  190. package/dist/components/Text/index.d.ts +18 -3
  191. package/dist/components/Text/index.d.ts.map +1 -1
  192. package/dist/components/Text/index.js.map +1 -1
  193. package/dist/components/Theme/index.cjs.map +1 -1
  194. package/dist/components/Theme/index.d.ts +12 -0
  195. package/dist/components/Theme/index.d.ts.map +1 -1
  196. package/dist/components/Theme/index.js.map +1 -1
  197. package/dist/components/Toggle/index.cjs +2 -1
  198. package/dist/components/Toggle/index.cjs.map +1 -1
  199. package/dist/components/Toggle/index.d.ts +9 -0
  200. package/dist/components/Toggle/index.d.ts.map +1 -1
  201. package/dist/components/Toggle/index.js +2 -1
  202. package/dist/components/Toggle/index.js.map +1 -1
  203. package/dist/components/ToggleGroup/index.cjs +4 -1
  204. package/dist/components/ToggleGroup/index.cjs.map +1 -1
  205. package/dist/components/ToggleGroup/index.d.ts +13 -4
  206. package/dist/components/ToggleGroup/index.d.ts.map +1 -1
  207. package/dist/components/ToggleGroup/index.js +4 -1
  208. package/dist/components/ToggleGroup/index.js.map +1 -1
  209. package/dist/components/Tooltip/index.cjs +20 -10
  210. package/dist/components/Tooltip/index.cjs.map +1 -1
  211. package/dist/components/Tooltip/index.d.ts +5 -1
  212. package/dist/components/Tooltip/index.d.ts.map +1 -1
  213. package/dist/components/Tooltip/index.js +20 -10
  214. package/dist/components/Tooltip/index.js.map +1 -1
  215. package/dist/datepicker.cjs +24 -10
  216. package/dist/datepicker.cjs.map +1 -1
  217. package/dist/datepicker.js +24 -10
  218. package/dist/datepicker.js.map +1 -1
  219. package/dist/index.cjs +4 -0
  220. package/dist/index.cjs.map +1 -1
  221. package/dist/index.d.ts.map +1 -1
  222. package/dist/index.js +4 -0
  223. package/dist/index.js.map +1 -1
  224. package/dist/utils/css-warning.cjs +18 -0
  225. package/dist/utils/css-warning.cjs.map +1 -0
  226. package/dist/utils/css-warning.d.ts +2 -0
  227. package/dist/utils/css-warning.d.ts.map +1 -0
  228. package/dist/utils/css-warning.js +18 -0
  229. package/dist/utils/css-warning.js.map +1 -0
  230. package/fragments.json +1 -1
  231. package/package.json +2 -2
  232. package/src/components/Accordion/Accordion.test.tsx +33 -0
  233. package/src/components/Accordion/index.tsx +10 -3
  234. package/src/components/Alert/index.tsx +7 -0
  235. package/src/components/Avatar/index.tsx +4 -0
  236. package/src/components/Badge/Badge.fragment.tsx +10 -2
  237. package/src/components/Badge/index.tsx +12 -0
  238. package/src/components/Button/Button.fragment.tsx +12 -2
  239. package/src/components/Button/Button.test.tsx +16 -0
  240. package/src/components/Button/index.tsx +27 -2
  241. package/src/components/Card/Card.fragment.tsx +14 -2
  242. package/src/components/Card/Card.test.tsx +5 -0
  243. package/src/components/Card/index.tsx +15 -2
  244. package/src/components/Checkbox/index.tsx +6 -1
  245. package/src/components/Chip/Chip.fragment.tsx +12 -2
  246. package/src/components/Chip/Chip.test.tsx +5 -0
  247. package/src/components/Chip/index.tsx +14 -4
  248. package/src/components/CodeBlock/index.tsx +13 -2
  249. package/src/components/Collapsible/Collapsible.test.tsx +41 -0
  250. package/src/components/Collapsible/index.tsx +53 -16
  251. package/src/components/Combobox/Combobox.test.tsx +55 -0
  252. package/src/components/Combobox/index.tsx +23 -17
  253. package/src/components/Command/Command.test.tsx +93 -0
  254. package/src/components/Command/index.tsx +61 -18
  255. package/src/components/DataTable/DataTable.test.tsx +11 -2
  256. package/src/components/DataTable/index.tsx +22 -2
  257. package/src/components/DatePicker/DatePicker.test.tsx +79 -0
  258. package/src/components/DatePicker/index.tsx +29 -14
  259. package/src/components/Dialog/Dialog.test.tsx +23 -0
  260. package/src/components/Dialog/index.tsx +27 -16
  261. package/src/components/Drawer/Drawer.test.tsx +27 -0
  262. package/src/components/Drawer/index.tsx +29 -16
  263. package/src/components/Grid/Grid.fragment.tsx +14 -2
  264. package/src/components/Grid/Grid.test.tsx +6 -0
  265. package/src/components/Grid/index.tsx +12 -3
  266. package/src/components/Input/index.tsx +15 -1
  267. package/src/components/Menu/index.tsx +35 -30
  268. package/src/components/NavigationMenu/NavigationMenu.fragment.tsx +1 -1
  269. package/src/components/NavigationMenu/NavigationMenu.test.tsx +40 -4
  270. package/src/components/NavigationMenu/NavigationMenuContext.ts +3 -0
  271. package/src/components/NavigationMenu/index.tsx +49 -13
  272. package/src/components/NavigationMenu/useNavigationMenu.ts +4 -0
  273. package/src/components/Popover/Popover.test.tsx +23 -0
  274. package/src/components/Popover/index.tsx +24 -18
  275. package/src/components/RadioGroup/index.tsx +4 -0
  276. package/src/components/Select/Select.test.tsx +41 -0
  277. package/src/components/Select/index.tsx +24 -12
  278. package/src/components/Sidebar/Sidebar.test.tsx +83 -4
  279. package/src/components/Sidebar/index.tsx +87 -45
  280. package/src/components/Slider/Slider.fragment.tsx +5 -1
  281. package/src/components/Slider/Slider.test.tsx +6 -0
  282. package/src/components/Slider/index.tsx +13 -1
  283. package/src/components/Stack/Stack.fragment.tsx +22 -2
  284. package/src/components/Stack/Stack.test.tsx +6 -0
  285. package/src/components/Stack/index.tsx +20 -6
  286. package/src/components/Tabs/index.tsx +13 -1
  287. package/src/components/Text/Text.fragment.tsx +10 -8
  288. package/src/components/Text/Text.module.scss +8 -2
  289. package/src/components/Text/Text.test.tsx +15 -0
  290. package/src/components/Text/index.tsx +18 -3
  291. package/src/components/Theme/index.tsx +12 -0
  292. package/src/components/Toggle/Toggle.fragment.tsx +5 -1
  293. package/src/components/Toggle/Toggle.test.tsx +19 -0
  294. package/src/components/Toggle/index.tsx +11 -1
  295. package/src/components/ToggleGroup/ToggleGroup.fragment.tsx +5 -2
  296. package/src/components/ToggleGroup/ToggleGroup.test.tsx +20 -0
  297. package/src/components/ToggleGroup/index.tsx +15 -4
  298. package/src/components/Tooltip/Tooltip.test.tsx +17 -0
  299. package/src/components/Tooltip/index.tsx +58 -34
  300. package/src/index.ts +6 -0
  301. package/src/tokens/_seeds.scss +5 -3
  302. package/src/tokens/_variables.scss +2 -0
  303. package/src/utils/css-warning.ts +29 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/components/Command/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Command.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Controlled search value */\n search?: string;\n /** Default search value */\n defaultSearch?: string;\n /** Called when search input changes */\n onSearchChange?: (search: string) => void;\n /** Custom filter function. Return 0 to hide, >0 to show (higher = better match).\n Default: case-insensitive substring match on value + keywords */\n filter?: (value: string, search: string, keywords?: string[]) => number;\n /** Whether to loop keyboard navigation. Default: true */\n loop?: boolean;\n}\n\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n className?: string;\n}\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport interface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n children: React.ReactNode;\n /** Value used for filtering (falls back to text content) */\n value?: string;\n /** Extra keywords for filtering */\n keywords?: string[];\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Called when item is selected (Enter or click) */\n onItemSelect?: () => void;\n}\n\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Group heading text */\n heading?: string;\n}\n\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport type CommandSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\n// ============================================\n// Default filter\n// ============================================\n\nfunction defaultFilter(value: string, search: string, keywords?: string[]): number {\n if (!search) return 1;\n const searchLower = search.toLowerCase();\n const valueLower = value.toLowerCase();\n\n if (valueLower.includes(searchLower)) return 1;\n\n if (keywords) {\n for (const keyword of keywords) {\n if (keyword.toLowerCase().includes(searchLower)) return 1;\n }\n }\n\n return 0;\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface ItemRegistration {\n value: string;\n keywords?: string[];\n}\n\ninterface CommandContextValue {\n search: string;\n setSearch: (search: string) => void;\n filter: (value: string, search: string, keywords?: string[]) => number;\n scores: Map<string, number>;\n registerItem: (id: string, registration: ItemRegistration) => void;\n unregisterItem: (id: string) => void;\n activeId: string | null;\n setActiveId: (id: string | null) => void;\n loop: boolean;\n listRef: React.RefObject<HTMLDivElement | null>;\n visibleCount: number;\n}\n\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\n\nfunction useCommandContext() {\n const ctx = React.useContext(CommandContext);\n if (!ctx) throw new Error('Command sub-components must be used within <Command>');\n return ctx;\n}\n\n// ============================================\n// Search Icon\n// ============================================\n\nfunction SearchIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction CommandRoot({\n children,\n search: controlledSearch,\n defaultSearch = '',\n onSearchChange,\n filter = defaultFilter,\n loop = true,\n className,\n ...htmlProps\n}: CommandProps) {\n const [uncontrolledSearch, setUncontrolledSearch] = React.useState(defaultSearch);\n const isControlled = controlledSearch !== undefined;\n const search = isControlled ? controlledSearch : uncontrolledSearch;\n\n const [items, setItems] = React.useState<Map<string, ItemRegistration>>(new Map());\n const [activeId, setActiveId] = React.useState<string | null>(null);\n const listRef = React.useRef<HTMLDivElement | null>(null);\n\n const setSearch = React.useCallback(\n (value: string) => {\n if (!isControlled) {\n setUncontrolledSearch(value);\n }\n onSearchChange?.(value);\n },\n [isControlled, onSearchChange]\n );\n\n const registerItem = React.useCallback((id: string, registration: ItemRegistration) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.set(id, registration);\n return next;\n });\n }, []);\n\n const unregisterItem = React.useCallback((id: string) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n // Compute scores for all items\n const scores = React.useMemo(() => {\n const result = new Map<string, number>();\n for (const [id, registration] of items) {\n const score = filter(registration.value, search, registration.keywords);\n result.set(id, score);\n }\n return result;\n }, [items, search, filter]);\n\n const visibleCount = React.useMemo(() => {\n let count = 0;\n for (const score of scores.values()) {\n if (score > 0) count++;\n }\n return count;\n }, [scores]);\n\n // Reset active when search changes\n React.useEffect(() => {\n setActiveId(null);\n }, [search]);\n\n const contextValue = React.useMemo<CommandContextValue>(\n () => ({\n search,\n setSearch,\n filter,\n scores,\n registerItem,\n unregisterItem,\n activeId,\n setActiveId,\n loop,\n listRef,\n visibleCount,\n }),\n [search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount]\n );\n\n return (\n <CommandContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={[styles.command, className].filter(Boolean).join(' ')}\n role=\"search\"\n >\n {children}\n </div>\n </CommandContext.Provider>\n );\n}\n\nfunction CommandInput({ className, ...htmlProps }: CommandInputProps) {\n const { search, setSearch, listRef, setActiveId, activeId, loop } = useCommandContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const getEnabledItems = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return [];\n return Array.from(\n list.querySelectorAll<HTMLElement>('[data-command-item]:not([data-disabled=\"true\"])')\n ).filter((el) => el.style.display !== 'none');\n }, [listRef]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n htmlProps.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n const items = getEnabledItems();\n if (items.length === 0) return;\n\n const currentIndex = activeId\n ? items.findIndex((item) => item.id === activeId)\n : -1;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[0].id);\n } else if (currentIndex < items.length - 1) {\n setActiveId(items[currentIndex + 1].id);\n } else if (loop) {\n setActiveId(items[0].id);\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[items.length - 1].id);\n } else if (currentIndex > 0) {\n setActiveId(items[currentIndex - 1].id);\n } else if (loop) {\n setActiveId(items[items.length - 1].id);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n setActiveId(items[0].id);\n break;\n }\n case 'End': {\n event.preventDefault();\n setActiveId(items[items.length - 1].id);\n break;\n }\n case 'Enter': {\n event.preventDefault();\n if (activeId) {\n const activeItem = items.find((item) => item.id === activeId);\n if (activeItem) {\n activeItem.click();\n }\n }\n break;\n }\n }\n };\n\n return (\n <div className={styles.inputWrapper}>\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={true}\n aria-controls=\"command-list\"\n aria-autocomplete=\"list\"\n aria-activedescendant={activeId ?? undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n className={[styles.input, className].filter(Boolean).join(' ')}\n {...htmlProps}\n />\n </div>\n );\n}\n\nfunction CommandList({ children, className, ...htmlProps }: CommandListProps) {\n const { listRef } = useCommandContext();\n\n return (\n <div\n ref={listRef}\n id=\"command-list\"\n role=\"listbox\"\n className={[styles.list, className].filter(Boolean).join(' ')}\n {...htmlProps}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandItem({\n children,\n value: valueProp,\n keywords,\n disabled = false,\n onItemSelect,\n className,\n ...htmlProps\n}: CommandItemProps) {\n const { scores, registerItem, unregisterItem, activeId, setActiveId } = useCommandContext();\n const generatedId = React.useId();\n const itemId = (htmlProps.id as string | undefined) ?? `command-item-${generatedId}`;\n const itemRef = React.useRef<HTMLDivElement>(null);\n\n // Extract text content for filtering if no value prop\n const textValue = React.useMemo(() => {\n if (valueProp) return valueProp;\n if (typeof children === 'string') return children;\n return '';\n }, [valueProp, children]);\n\n // Register with context\n React.useEffect(() => {\n registerItem(itemId, { value: textValue, keywords });\n return () => unregisterItem(itemId);\n }, [itemId, textValue, keywords, registerItem, unregisterItem]);\n\n const score = scores.get(itemId) ?? 1;\n const isVisible = score > 0;\n const isActive = activeId === itemId;\n\n // Scroll active item into view\n React.useEffect(() => {\n if (isActive && itemRef.current) {\n itemRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const handleClick = () => {\n if (disabled) return;\n onItemSelect?.();\n };\n\n const handleMouseEnter = () => {\n if (!disabled) {\n setActiveId(itemId);\n }\n };\n\n return (\n <div\n ref={itemRef}\n {...htmlProps}\n id={itemId}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={disabled}\n data-command-item=\"\"\n data-active={isActive || undefined}\n data-disabled={disabled || undefined}\n onClick={handleClick}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleClick(); } }}\n onMouseEnter={handleMouseEnter}\n className={[\n styles.item,\n isActive && styles.itemActive,\n disabled && styles.itemDisabled,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ display: isVisible ? undefined : 'none' }}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandGroup({ children, heading, className, ...htmlProps }: CommandGroupProps) {\n const labelId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const { scores } = useCommandContext();\n const [hasVisibleChildren, setHasVisibleChildren] = React.useState(true);\n\n // Check if any children are visible after each score update\n React.useEffect(() => {\n if (!groupRef.current) return;\n const items = groupRef.current.querySelectorAll<HTMLElement>('[data-command-item]');\n const anyVisible = Array.from(items).some((item) => item.style.display !== 'none');\n setHasVisibleChildren(anyVisible);\n }, [scores]);\n\n return (\n <div\n ref={groupRef}\n {...htmlProps}\n role=\"group\"\n aria-labelledby={heading ? labelId : undefined}\n className={[styles.group, className].filter(Boolean).join(' ')}\n style={{ display: hasVisibleChildren ? undefined : 'none' }}\n >\n {heading && (\n <div id={labelId} className={styles.groupHeading}>\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nfunction CommandEmpty({ children, className, ...htmlProps }: CommandEmptyProps) {\n const { visibleCount } = useCommandContext();\n\n if (visibleCount > 0) return null;\n\n return (\n <div\n {...htmlProps}\n role=\"option\"\n aria-disabled=\"true\"\n aria-selected=\"false\"\n className={[styles.empty, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandSeparator({ className, ...htmlProps }: CommandSeparatorProps) {\n return (\n <div\n {...htmlProps}\n role=\"separator\"\n className={[styles.separator, className].filter(Boolean).join(' ')}\n />\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Item: CommandItem,\n Group: CommandGroup,\n Empty: CommandEmpty,\n Separator: CommandSeparator,\n});\n\nexport {\n CommandRoot,\n CommandInput,\n CommandList,\n CommandItem,\n CommandGroup,\n CommandEmpty,\n CommandSeparator,\n};\n"],"names":["React","jsxs","jsx","styles"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/components/Command/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Command.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Controlled search value */\n search?: string;\n /** Default search value */\n defaultSearch?: string;\n /** Called when search input changes */\n onSearchChange?: (search: string) => void;\n /** Custom filter function. Return 0 to hide, >0 to show (higher = better match).\n Default: case-insensitive substring match on value + keywords */\n filter?: (value: string, search: string, keywords?: string[]) => number;\n /** Whether to loop keyboard navigation. Default: true */\n loop?: boolean;\n}\n\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n className?: string;\n}\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport interface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n children: React.ReactNode;\n /** Value used for filtering (falls back to text content) */\n value?: string;\n /** Extra keywords for filtering */\n keywords?: string[];\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Called when item is selected (Enter or click) */\n onItemSelect?: () => void;\n}\n\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Group heading text */\n heading?: string;\n}\n\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport type CommandSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\n// ============================================\n// Default filter\n// ============================================\n\nfunction defaultFilter(value: string, search: string, keywords?: string[]): number {\n if (!search) return 1;\n const searchLower = search.toLowerCase();\n const valueLower = value.toLowerCase();\n\n if (valueLower.includes(searchLower)) return 1;\n\n if (keywords) {\n for (const keyword of keywords) {\n if (keyword.toLowerCase().includes(searchLower)) return 1;\n }\n }\n\n return 0;\n}\n\nfunction getTextContent(node: React.ReactNode): string {\n if (typeof node === 'string' || typeof node === 'number') return String(node);\n if (Array.isArray(node)) return node.map(getTextContent).join(' ');\n if (React.isValidElement(node)) {\n const childProps = node.props as { children?: React.ReactNode };\n return getTextContent(childProps.children);\n }\n return '';\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface ItemRegistration {\n value: string;\n keywords?: string[];\n}\n\ninterface CommandContextValue {\n search: string;\n setSearch: (search: string) => void;\n filter: (value: string, search: string, keywords?: string[]) => number;\n scores: Map<string, number>;\n registerItem: (id: string, registration: ItemRegistration) => void;\n unregisterItem: (id: string) => void;\n activeId: string | null;\n setActiveId: (id: string | null) => void;\n loop: boolean;\n listRef: React.RefObject<HTMLDivElement | null>;\n visibleCount: number;\n listId: string;\n}\n\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\n\nfunction useCommandContext() {\n const ctx = React.useContext(CommandContext);\n if (!ctx) throw new Error('Command sub-components must be used within <Command>');\n return ctx;\n}\n\n// ============================================\n// Search Icon\n// ============================================\n\nfunction SearchIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction CommandRoot({\n children,\n search: controlledSearch,\n defaultSearch = '',\n onSearchChange,\n filter = defaultFilter,\n loop = true,\n className,\n ...htmlProps\n}: CommandProps) {\n const [uncontrolledSearch, setUncontrolledSearch] = React.useState(defaultSearch);\n const isControlled = controlledSearch !== undefined;\n const search = isControlled ? controlledSearch : uncontrolledSearch;\n\n const [items, setItems] = React.useState<Map<string, ItemRegistration>>(new Map());\n const [activeId, setActiveId] = React.useState<string | null>(null);\n const listRef = React.useRef<HTMLDivElement | null>(null);\n const generatedListId = React.useId();\n const listId = `command-list-${generatedListId}`;\n\n const setSearch = React.useCallback(\n (value: string) => {\n if (!isControlled) {\n setUncontrolledSearch(value);\n }\n onSearchChange?.(value);\n },\n [isControlled, onSearchChange]\n );\n\n const registerItem = React.useCallback((id: string, registration: ItemRegistration) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.set(id, registration);\n return next;\n });\n }, []);\n\n const unregisterItem = React.useCallback((id: string) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n // Compute scores for all items\n const scores = React.useMemo(() => {\n const result = new Map<string, number>();\n for (const [id, registration] of items) {\n const score = filter(registration.value, search, registration.keywords);\n result.set(id, score);\n }\n return result;\n }, [items, search, filter]);\n\n const visibleCount = React.useMemo(() => {\n let count = 0;\n for (const score of scores.values()) {\n if (score > 0) count++;\n }\n return count;\n }, [scores]);\n\n // Reset active when search changes\n React.useEffect(() => {\n setActiveId(null);\n }, [search]);\n\n const contextValue = React.useMemo<CommandContextValue>(\n () => ({\n search,\n setSearch,\n filter,\n scores,\n registerItem,\n unregisterItem,\n activeId,\n setActiveId,\n loop,\n listRef,\n visibleCount,\n listId,\n }),\n [search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount, listId]\n );\n\n return (\n <CommandContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={[styles.command, className].filter(Boolean).join(' ')}\n role=\"search\"\n >\n {children}\n </div>\n </CommandContext.Provider>\n );\n}\n\nfunction CommandInput({\n className,\n onChange,\n onKeyDown,\n ...htmlProps\n}: CommandInputProps) {\n const { search, setSearch, listRef, setActiveId, activeId, loop, listId } = useCommandContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const getEnabledItems = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return [];\n return Array.from(\n list.querySelectorAll<HTMLElement>('[data-command-item]:not([data-disabled=\"true\"])')\n ).filter((el) => el.style.display !== 'none');\n }, [listRef]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n const items = getEnabledItems();\n if (items.length === 0) return;\n\n const currentIndex = activeId\n ? items.findIndex((item) => item.id === activeId)\n : -1;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[0].id);\n } else if (currentIndex < items.length - 1) {\n setActiveId(items[currentIndex + 1].id);\n } else if (loop) {\n setActiveId(items[0].id);\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[items.length - 1].id);\n } else if (currentIndex > 0) {\n setActiveId(items[currentIndex - 1].id);\n } else if (loop) {\n setActiveId(items[items.length - 1].id);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n setActiveId(items[0].id);\n break;\n }\n case 'End': {\n event.preventDefault();\n setActiveId(items[items.length - 1].id);\n break;\n }\n case 'Enter': {\n event.preventDefault();\n if (activeId) {\n const activeItem = items.find((item) => item.id === activeId);\n if (activeItem) {\n activeItem.click();\n }\n }\n break;\n }\n }\n };\n\n return (\n <div className={styles.inputWrapper}>\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={true}\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeId ?? undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n value={search}\n {...htmlProps}\n onChange={(e) => {\n onChange?.(e);\n if (e.defaultPrevented) return;\n setSearch(e.target.value);\n }}\n onKeyDown={handleKeyDown}\n className={[styles.input, className].filter(Boolean).join(' ')}\n />\n </div>\n );\n}\n\nfunction CommandList({ children, className, ...htmlProps }: CommandListProps) {\n const { listRef, listId } = useCommandContext();\n\n return (\n <div\n ref={listRef}\n {...htmlProps}\n id={listId}\n role=\"listbox\"\n className={[styles.list, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandItem({\n children,\n value: valueProp,\n keywords,\n disabled = false,\n onItemSelect,\n className,\n onClick,\n onKeyDown,\n onMouseEnter,\n style,\n ...htmlProps\n}: CommandItemProps) {\n const { scores, registerItem, unregisterItem, activeId, setActiveId } = useCommandContext();\n const generatedId = React.useId();\n const itemId = (htmlProps.id as string | undefined) ?? `command-item-${generatedId}`;\n const itemRef = React.useRef<HTMLDivElement>(null);\n\n // Extract text content for filtering if no value prop\n const textValue = React.useMemo(() => {\n if (valueProp) return valueProp;\n return getTextContent(children).trim();\n }, [valueProp, children]);\n\n // Register with context\n React.useEffect(() => {\n registerItem(itemId, { value: textValue, keywords });\n return () => unregisterItem(itemId);\n }, [itemId, textValue, keywords, registerItem, unregisterItem]);\n\n const score = scores.get(itemId) ?? 1;\n const isVisible = score > 0;\n const isActive = activeId === itemId;\n\n // Scroll active item into view\n React.useEffect(() => {\n if (isActive && itemRef.current) {\n itemRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const activateItem = () => {\n if (disabled) return;\n onItemSelect?.();\n };\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n activateItem();\n };\n\n const handleMouseEnter = (event: React.MouseEvent<HTMLDivElement>) => {\n onMouseEnter?.(event);\n if (event.defaultPrevented) return;\n if (!disabled) {\n setActiveId(itemId);\n }\n };\n\n return (\n <div\n ref={itemRef}\n {...htmlProps}\n id={itemId}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={disabled}\n data-command-item=\"\"\n data-active={isActive || undefined}\n data-disabled={disabled || undefined}\n onClick={handleClick}\n onKeyDown={(e) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n activateItem();\n }\n }}\n onMouseEnter={handleMouseEnter}\n className={[\n styles.item,\n isActive && styles.itemActive,\n disabled && styles.itemDisabled,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ ...style, display: isVisible ? undefined : 'none' }}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandGroup({ children, heading, className, ...htmlProps }: CommandGroupProps) {\n const labelId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const { scores } = useCommandContext();\n const [hasVisibleChildren, setHasVisibleChildren] = React.useState(true);\n\n // Check if any children are visible after each score update\n React.useEffect(() => {\n if (!groupRef.current) return;\n const items = groupRef.current.querySelectorAll<HTMLElement>('[data-command-item]');\n const anyVisible = Array.from(items).some((item) => item.style.display !== 'none');\n setHasVisibleChildren(anyVisible);\n }, [scores]);\n\n const { style, ...restHtmlProps } = htmlProps;\n\n return (\n <div\n ref={groupRef}\n {...restHtmlProps}\n role=\"group\"\n aria-labelledby={heading ? labelId : undefined}\n className={[styles.group, className].filter(Boolean).join(' ')}\n style={{ ...style, display: hasVisibleChildren ? undefined : 'none' }}\n >\n {heading && (\n <div id={labelId} className={styles.groupHeading}>\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nfunction CommandEmpty({ children, className, ...htmlProps }: CommandEmptyProps) {\n const { visibleCount } = useCommandContext();\n\n if (visibleCount > 0) return null;\n\n return (\n <div\n {...htmlProps}\n role=\"option\"\n aria-disabled=\"true\"\n aria-selected=\"false\"\n className={[styles.empty, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandSeparator({ className, ...htmlProps }: CommandSeparatorProps) {\n return (\n <div\n {...htmlProps}\n role=\"separator\"\n className={[styles.separator, className].filter(Boolean).join(' ')}\n />\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Item: CommandItem,\n Group: CommandGroup,\n Empty: CommandEmpty,\n Separator: CommandSeparator,\n});\n\nexport {\n CommandRoot,\n CommandInput,\n CommandList,\n CommandItem,\n CommandGroup,\n CommandEmpty,\n CommandSeparator,\n};\n"],"names":["React","jsxs","jsx","styles"],"mappings":"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"}
@@ -40,9 +40,9 @@ export interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement>
40
40
  }
41
41
  export type CommandSeparatorProps = React.HTMLAttributes<HTMLDivElement>;
42
42
  declare function CommandRoot({ children, search: controlledSearch, defaultSearch, onSearchChange, filter, loop, className, ...htmlProps }: CommandProps): import("react/jsx-runtime").JSX.Element;
43
- declare function CommandInput({ className, ...htmlProps }: CommandInputProps): import("react/jsx-runtime").JSX.Element;
43
+ declare function CommandInput({ className, onChange, onKeyDown, ...htmlProps }: CommandInputProps): import("react/jsx-runtime").JSX.Element;
44
44
  declare function CommandList({ children, className, ...htmlProps }: CommandListProps): import("react/jsx-runtime").JSX.Element;
45
- declare function CommandItem({ children, value: valueProp, keywords, disabled, onItemSelect, className, ...htmlProps }: CommandItemProps): import("react/jsx-runtime").JSX.Element;
45
+ declare function CommandItem({ children, value: valueProp, keywords, disabled, onItemSelect, className, onClick, onKeyDown, onMouseEnter, style, ...htmlProps }: CommandItemProps): import("react/jsx-runtime").JSX.Element;
46
46
  declare function CommandGroup({ children, heading, className, ...htmlProps }: CommandGroupProps): import("react/jsx-runtime").JSX.Element;
47
47
  declare function CommandEmpty({ children, className, ...htmlProps }: CommandEmptyProps): import("react/jsx-runtime").JSX.Element | null;
48
48
  declare function CommandSeparator({ className, ...htmlProps }: CommandSeparatorProps): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Command/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Command/index.tsx"],"names":[],"mappings":"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"}
@@ -13,6 +13,15 @@ function defaultFilter(value, search, keywords) {
13
13
  }
14
14
  return 0;
15
15
  }
16
+ function getTextContent(node) {
17
+ if (typeof node === "string" || typeof node === "number") return String(node);
18
+ if (Array.isArray(node)) return node.map(getTextContent).join(" ");
19
+ if (React.isValidElement(node)) {
20
+ const childProps = node.props;
21
+ return getTextContent(childProps.children);
22
+ }
23
+ return "";
24
+ }
16
25
  const CommandContext = React.createContext(null);
17
26
  function useCommandContext() {
18
27
  const ctx = React.useContext(CommandContext);
@@ -56,6 +65,8 @@ function CommandRoot({
56
65
  const [items, setItems] = React.useState(/* @__PURE__ */ new Map());
57
66
  const [activeId, setActiveId] = React.useState(null);
58
67
  const listRef = React.useRef(null);
68
+ const generatedListId = React.useId();
69
+ const listId = `command-list-${generatedListId}`;
59
70
  const setSearch = React.useCallback(
60
71
  (value) => {
61
72
  if (!isControlled) {
@@ -109,9 +120,10 @@ function CommandRoot({
109
120
  setActiveId,
110
121
  loop,
111
122
  listRef,
112
- visibleCount
123
+ visibleCount,
124
+ listId
113
125
  }),
114
- [search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount]
126
+ [search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount, listId]
115
127
  );
116
128
  return /* @__PURE__ */ jsx(CommandContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
117
129
  "div",
@@ -123,8 +135,13 @@ function CommandRoot({
123
135
  }
124
136
  ) });
125
137
  }
126
- function CommandInput({ className, ...htmlProps }) {
127
- const { search, setSearch, listRef, setActiveId, activeId, loop } = useCommandContext();
138
+ function CommandInput({
139
+ className,
140
+ onChange,
141
+ onKeyDown,
142
+ ...htmlProps
143
+ }) {
144
+ const { search, setSearch, listRef, setActiveId, activeId, loop, listId } = useCommandContext();
128
145
  const inputRef = React.useRef(null);
129
146
  const getEnabledItems = React.useCallback(() => {
130
147
  const list = listRef.current;
@@ -134,8 +151,7 @@ function CommandInput({ className, ...htmlProps }) {
134
151
  ).filter((el) => el.style.display !== "none");
135
152
  }, [listRef]);
136
153
  const handleKeyDown = (event) => {
137
- var _a;
138
- (_a = htmlProps.onKeyDown) == null ? void 0 : _a.call(htmlProps, event);
154
+ onKeyDown == null ? void 0 : onKeyDown(event);
139
155
  if (event.defaultPrevented) return;
140
156
  const items = getEnabledItems();
141
157
  if (items.length === 0) return;
@@ -194,31 +210,35 @@ function CommandInput({ className, ...htmlProps }) {
194
210
  type: "text",
195
211
  role: "combobox",
196
212
  "aria-expanded": true,
197
- "aria-controls": "command-list",
213
+ "aria-controls": listId,
198
214
  "aria-autocomplete": "list",
199
215
  "aria-activedescendant": activeId ?? void 0,
200
216
  autoComplete: "off",
201
217
  autoCorrect: "off",
202
218
  spellCheck: false,
203
219
  value: search,
204
- onChange: (e) => setSearch(e.target.value),
220
+ ...htmlProps,
221
+ onChange: (e) => {
222
+ onChange == null ? void 0 : onChange(e);
223
+ if (e.defaultPrevented) return;
224
+ setSearch(e.target.value);
225
+ },
205
226
  onKeyDown: handleKeyDown,
206
- className: [styles.input, className].filter(Boolean).join(" "),
207
- ...htmlProps
227
+ className: [styles.input, className].filter(Boolean).join(" ")
208
228
  }
209
229
  )
210
230
  ] });
211
231
  }
212
232
  function CommandList({ children, className, ...htmlProps }) {
213
- const { listRef } = useCommandContext();
233
+ const { listRef, listId } = useCommandContext();
214
234
  return /* @__PURE__ */ jsx(
215
235
  "div",
216
236
  {
217
237
  ref: listRef,
218
- id: "command-list",
238
+ ...htmlProps,
239
+ id: listId,
219
240
  role: "listbox",
220
241
  className: [styles.list, className].filter(Boolean).join(" "),
221
- ...htmlProps,
222
242
  children
223
243
  }
224
244
  );
@@ -230,6 +250,10 @@ function CommandItem({
230
250
  disabled = false,
231
251
  onItemSelect,
232
252
  className,
253
+ onClick,
254
+ onKeyDown,
255
+ onMouseEnter,
256
+ style,
233
257
  ...htmlProps
234
258
  }) {
235
259
  const { scores, registerItem, unregisterItem, activeId, setActiveId } = useCommandContext();
@@ -238,8 +262,7 @@ function CommandItem({
238
262
  const itemRef = React.useRef(null);
239
263
  const textValue = React.useMemo(() => {
240
264
  if (valueProp) return valueProp;
241
- if (typeof children === "string") return children;
242
- return "";
265
+ return getTextContent(children).trim();
243
266
  }, [valueProp, children]);
244
267
  React.useEffect(() => {
245
268
  registerItem(itemId, { value: textValue, keywords });
@@ -253,11 +276,18 @@ function CommandItem({
253
276
  itemRef.current.scrollIntoView({ block: "nearest" });
254
277
  }
255
278
  }, [isActive]);
256
- const handleClick = () => {
279
+ const activateItem = () => {
257
280
  if (disabled) return;
258
281
  onItemSelect == null ? void 0 : onItemSelect();
259
282
  };
260
- const handleMouseEnter = () => {
283
+ const handleClick = (event) => {
284
+ onClick == null ? void 0 : onClick(event);
285
+ if (event.defaultPrevented) return;
286
+ activateItem();
287
+ };
288
+ const handleMouseEnter = (event) => {
289
+ onMouseEnter == null ? void 0 : onMouseEnter(event);
290
+ if (event.defaultPrevented) return;
261
291
  if (!disabled) {
262
292
  setActiveId(itemId);
263
293
  }
@@ -276,9 +306,11 @@ function CommandItem({
276
306
  "data-disabled": disabled || void 0,
277
307
  onClick: handleClick,
278
308
  onKeyDown: (e) => {
309
+ onKeyDown == null ? void 0 : onKeyDown(e);
310
+ if (e.defaultPrevented) return;
279
311
  if (e.key === "Enter" || e.key === " ") {
280
312
  e.preventDefault();
281
- handleClick();
313
+ activateItem();
282
314
  }
283
315
  },
284
316
  onMouseEnter: handleMouseEnter,
@@ -288,7 +320,7 @@ function CommandItem({
288
320
  disabled && styles.itemDisabled,
289
321
  className
290
322
  ].filter(Boolean).join(" "),
291
- style: { display: isVisible ? void 0 : "none" },
323
+ style: { ...style, display: isVisible ? void 0 : "none" },
292
324
  children
293
325
  }
294
326
  );
@@ -304,15 +336,16 @@ function CommandGroup({ children, heading, className, ...htmlProps }) {
304
336
  const anyVisible = Array.from(items).some((item) => item.style.display !== "none");
305
337
  setHasVisibleChildren(anyVisible);
306
338
  }, [scores]);
339
+ const { style, ...restHtmlProps } = htmlProps;
307
340
  return /* @__PURE__ */ jsxs(
308
341
  "div",
309
342
  {
310
343
  ref: groupRef,
311
- ...htmlProps,
344
+ ...restHtmlProps,
312
345
  role: "group",
313
346
  "aria-labelledby": heading ? labelId : void 0,
314
347
  className: [styles.group, className].filter(Boolean).join(" "),
315
- style: { display: hasVisibleChildren ? void 0 : "none" },
348
+ style: { ...style, display: hasVisibleChildren ? void 0 : "none" },
316
349
  children: [
317
350
  heading && /* @__PURE__ */ jsx("div", { id: labelId, className: styles.groupHeading, children: heading }),
318
351
  children
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/Command/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Command.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Controlled search value */\n search?: string;\n /** Default search value */\n defaultSearch?: string;\n /** Called when search input changes */\n onSearchChange?: (search: string) => void;\n /** Custom filter function. Return 0 to hide, >0 to show (higher = better match).\n Default: case-insensitive substring match on value + keywords */\n filter?: (value: string, search: string, keywords?: string[]) => number;\n /** Whether to loop keyboard navigation. Default: true */\n loop?: boolean;\n}\n\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n className?: string;\n}\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport interface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n children: React.ReactNode;\n /** Value used for filtering (falls back to text content) */\n value?: string;\n /** Extra keywords for filtering */\n keywords?: string[];\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Called when item is selected (Enter or click) */\n onItemSelect?: () => void;\n}\n\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Group heading text */\n heading?: string;\n}\n\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport type CommandSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\n// ============================================\n// Default filter\n// ============================================\n\nfunction defaultFilter(value: string, search: string, keywords?: string[]): number {\n if (!search) return 1;\n const searchLower = search.toLowerCase();\n const valueLower = value.toLowerCase();\n\n if (valueLower.includes(searchLower)) return 1;\n\n if (keywords) {\n for (const keyword of keywords) {\n if (keyword.toLowerCase().includes(searchLower)) return 1;\n }\n }\n\n return 0;\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface ItemRegistration {\n value: string;\n keywords?: string[];\n}\n\ninterface CommandContextValue {\n search: string;\n setSearch: (search: string) => void;\n filter: (value: string, search: string, keywords?: string[]) => number;\n scores: Map<string, number>;\n registerItem: (id: string, registration: ItemRegistration) => void;\n unregisterItem: (id: string) => void;\n activeId: string | null;\n setActiveId: (id: string | null) => void;\n loop: boolean;\n listRef: React.RefObject<HTMLDivElement | null>;\n visibleCount: number;\n}\n\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\n\nfunction useCommandContext() {\n const ctx = React.useContext(CommandContext);\n if (!ctx) throw new Error('Command sub-components must be used within <Command>');\n return ctx;\n}\n\n// ============================================\n// Search Icon\n// ============================================\n\nfunction SearchIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction CommandRoot({\n children,\n search: controlledSearch,\n defaultSearch = '',\n onSearchChange,\n filter = defaultFilter,\n loop = true,\n className,\n ...htmlProps\n}: CommandProps) {\n const [uncontrolledSearch, setUncontrolledSearch] = React.useState(defaultSearch);\n const isControlled = controlledSearch !== undefined;\n const search = isControlled ? controlledSearch : uncontrolledSearch;\n\n const [items, setItems] = React.useState<Map<string, ItemRegistration>>(new Map());\n const [activeId, setActiveId] = React.useState<string | null>(null);\n const listRef = React.useRef<HTMLDivElement | null>(null);\n\n const setSearch = React.useCallback(\n (value: string) => {\n if (!isControlled) {\n setUncontrolledSearch(value);\n }\n onSearchChange?.(value);\n },\n [isControlled, onSearchChange]\n );\n\n const registerItem = React.useCallback((id: string, registration: ItemRegistration) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.set(id, registration);\n return next;\n });\n }, []);\n\n const unregisterItem = React.useCallback((id: string) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n // Compute scores for all items\n const scores = React.useMemo(() => {\n const result = new Map<string, number>();\n for (const [id, registration] of items) {\n const score = filter(registration.value, search, registration.keywords);\n result.set(id, score);\n }\n return result;\n }, [items, search, filter]);\n\n const visibleCount = React.useMemo(() => {\n let count = 0;\n for (const score of scores.values()) {\n if (score > 0) count++;\n }\n return count;\n }, [scores]);\n\n // Reset active when search changes\n React.useEffect(() => {\n setActiveId(null);\n }, [search]);\n\n const contextValue = React.useMemo<CommandContextValue>(\n () => ({\n search,\n setSearch,\n filter,\n scores,\n registerItem,\n unregisterItem,\n activeId,\n setActiveId,\n loop,\n listRef,\n visibleCount,\n }),\n [search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount]\n );\n\n return (\n <CommandContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={[styles.command, className].filter(Boolean).join(' ')}\n role=\"search\"\n >\n {children}\n </div>\n </CommandContext.Provider>\n );\n}\n\nfunction CommandInput({ className, ...htmlProps }: CommandInputProps) {\n const { search, setSearch, listRef, setActiveId, activeId, loop } = useCommandContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const getEnabledItems = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return [];\n return Array.from(\n list.querySelectorAll<HTMLElement>('[data-command-item]:not([data-disabled=\"true\"])')\n ).filter((el) => el.style.display !== 'none');\n }, [listRef]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n htmlProps.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n const items = getEnabledItems();\n if (items.length === 0) return;\n\n const currentIndex = activeId\n ? items.findIndex((item) => item.id === activeId)\n : -1;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[0].id);\n } else if (currentIndex < items.length - 1) {\n setActiveId(items[currentIndex + 1].id);\n } else if (loop) {\n setActiveId(items[0].id);\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[items.length - 1].id);\n } else if (currentIndex > 0) {\n setActiveId(items[currentIndex - 1].id);\n } else if (loop) {\n setActiveId(items[items.length - 1].id);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n setActiveId(items[0].id);\n break;\n }\n case 'End': {\n event.preventDefault();\n setActiveId(items[items.length - 1].id);\n break;\n }\n case 'Enter': {\n event.preventDefault();\n if (activeId) {\n const activeItem = items.find((item) => item.id === activeId);\n if (activeItem) {\n activeItem.click();\n }\n }\n break;\n }\n }\n };\n\n return (\n <div className={styles.inputWrapper}>\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={true}\n aria-controls=\"command-list\"\n aria-autocomplete=\"list\"\n aria-activedescendant={activeId ?? undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n className={[styles.input, className].filter(Boolean).join(' ')}\n {...htmlProps}\n />\n </div>\n );\n}\n\nfunction CommandList({ children, className, ...htmlProps }: CommandListProps) {\n const { listRef } = useCommandContext();\n\n return (\n <div\n ref={listRef}\n id=\"command-list\"\n role=\"listbox\"\n className={[styles.list, className].filter(Boolean).join(' ')}\n {...htmlProps}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandItem({\n children,\n value: valueProp,\n keywords,\n disabled = false,\n onItemSelect,\n className,\n ...htmlProps\n}: CommandItemProps) {\n const { scores, registerItem, unregisterItem, activeId, setActiveId } = useCommandContext();\n const generatedId = React.useId();\n const itemId = (htmlProps.id as string | undefined) ?? `command-item-${generatedId}`;\n const itemRef = React.useRef<HTMLDivElement>(null);\n\n // Extract text content for filtering if no value prop\n const textValue = React.useMemo(() => {\n if (valueProp) return valueProp;\n if (typeof children === 'string') return children;\n return '';\n }, [valueProp, children]);\n\n // Register with context\n React.useEffect(() => {\n registerItem(itemId, { value: textValue, keywords });\n return () => unregisterItem(itemId);\n }, [itemId, textValue, keywords, registerItem, unregisterItem]);\n\n const score = scores.get(itemId) ?? 1;\n const isVisible = score > 0;\n const isActive = activeId === itemId;\n\n // Scroll active item into view\n React.useEffect(() => {\n if (isActive && itemRef.current) {\n itemRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const handleClick = () => {\n if (disabled) return;\n onItemSelect?.();\n };\n\n const handleMouseEnter = () => {\n if (!disabled) {\n setActiveId(itemId);\n }\n };\n\n return (\n <div\n ref={itemRef}\n {...htmlProps}\n id={itemId}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={disabled}\n data-command-item=\"\"\n data-active={isActive || undefined}\n data-disabled={disabled || undefined}\n onClick={handleClick}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleClick(); } }}\n onMouseEnter={handleMouseEnter}\n className={[\n styles.item,\n isActive && styles.itemActive,\n disabled && styles.itemDisabled,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ display: isVisible ? undefined : 'none' }}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandGroup({ children, heading, className, ...htmlProps }: CommandGroupProps) {\n const labelId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const { scores } = useCommandContext();\n const [hasVisibleChildren, setHasVisibleChildren] = React.useState(true);\n\n // Check if any children are visible after each score update\n React.useEffect(() => {\n if (!groupRef.current) return;\n const items = groupRef.current.querySelectorAll<HTMLElement>('[data-command-item]');\n const anyVisible = Array.from(items).some((item) => item.style.display !== 'none');\n setHasVisibleChildren(anyVisible);\n }, [scores]);\n\n return (\n <div\n ref={groupRef}\n {...htmlProps}\n role=\"group\"\n aria-labelledby={heading ? labelId : undefined}\n className={[styles.group, className].filter(Boolean).join(' ')}\n style={{ display: hasVisibleChildren ? undefined : 'none' }}\n >\n {heading && (\n <div id={labelId} className={styles.groupHeading}>\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nfunction CommandEmpty({ children, className, ...htmlProps }: CommandEmptyProps) {\n const { visibleCount } = useCommandContext();\n\n if (visibleCount > 0) return null;\n\n return (\n <div\n {...htmlProps}\n role=\"option\"\n aria-disabled=\"true\"\n aria-selected=\"false\"\n className={[styles.empty, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandSeparator({ className, ...htmlProps }: CommandSeparatorProps) {\n return (\n <div\n {...htmlProps}\n role=\"separator\"\n className={[styles.separator, className].filter(Boolean).join(' ')}\n />\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Item: CommandItem,\n Group: CommandGroup,\n Empty: CommandEmpty,\n Separator: CommandSeparator,\n});\n\nexport {\n CommandRoot,\n CommandInput,\n CommandList,\n CommandItem,\n CommandGroup,\n CommandEmpty,\n CommandSeparator,\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/Command/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Command.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Controlled search value */\n search?: string;\n /** Default search value */\n defaultSearch?: string;\n /** Called when search input changes */\n onSearchChange?: (search: string) => void;\n /** Custom filter function. Return 0 to hide, >0 to show (higher = better match).\n Default: case-insensitive substring match on value + keywords */\n filter?: (value: string, search: string, keywords?: string[]) => number;\n /** Whether to loop keyboard navigation. Default: true */\n loop?: boolean;\n}\n\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n className?: string;\n}\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport interface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n children: React.ReactNode;\n /** Value used for filtering (falls back to text content) */\n value?: string;\n /** Extra keywords for filtering */\n keywords?: string[];\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Called when item is selected (Enter or click) */\n onItemSelect?: () => void;\n}\n\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Group heading text */\n heading?: string;\n}\n\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport type CommandSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\n// ============================================\n// Default filter\n// ============================================\n\nfunction defaultFilter(value: string, search: string, keywords?: string[]): number {\n if (!search) return 1;\n const searchLower = search.toLowerCase();\n const valueLower = value.toLowerCase();\n\n if (valueLower.includes(searchLower)) return 1;\n\n if (keywords) {\n for (const keyword of keywords) {\n if (keyword.toLowerCase().includes(searchLower)) return 1;\n }\n }\n\n return 0;\n}\n\nfunction getTextContent(node: React.ReactNode): string {\n if (typeof node === 'string' || typeof node === 'number') return String(node);\n if (Array.isArray(node)) return node.map(getTextContent).join(' ');\n if (React.isValidElement(node)) {\n const childProps = node.props as { children?: React.ReactNode };\n return getTextContent(childProps.children);\n }\n return '';\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface ItemRegistration {\n value: string;\n keywords?: string[];\n}\n\ninterface CommandContextValue {\n search: string;\n setSearch: (search: string) => void;\n filter: (value: string, search: string, keywords?: string[]) => number;\n scores: Map<string, number>;\n registerItem: (id: string, registration: ItemRegistration) => void;\n unregisterItem: (id: string) => void;\n activeId: string | null;\n setActiveId: (id: string | null) => void;\n loop: boolean;\n listRef: React.RefObject<HTMLDivElement | null>;\n visibleCount: number;\n listId: string;\n}\n\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\n\nfunction useCommandContext() {\n const ctx = React.useContext(CommandContext);\n if (!ctx) throw new Error('Command sub-components must be used within <Command>');\n return ctx;\n}\n\n// ============================================\n// Search Icon\n// ============================================\n\nfunction SearchIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction CommandRoot({\n children,\n search: controlledSearch,\n defaultSearch = '',\n onSearchChange,\n filter = defaultFilter,\n loop = true,\n className,\n ...htmlProps\n}: CommandProps) {\n const [uncontrolledSearch, setUncontrolledSearch] = React.useState(defaultSearch);\n const isControlled = controlledSearch !== undefined;\n const search = isControlled ? controlledSearch : uncontrolledSearch;\n\n const [items, setItems] = React.useState<Map<string, ItemRegistration>>(new Map());\n const [activeId, setActiveId] = React.useState<string | null>(null);\n const listRef = React.useRef<HTMLDivElement | null>(null);\n const generatedListId = React.useId();\n const listId = `command-list-${generatedListId}`;\n\n const setSearch = React.useCallback(\n (value: string) => {\n if (!isControlled) {\n setUncontrolledSearch(value);\n }\n onSearchChange?.(value);\n },\n [isControlled, onSearchChange]\n );\n\n const registerItem = React.useCallback((id: string, registration: ItemRegistration) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.set(id, registration);\n return next;\n });\n }, []);\n\n const unregisterItem = React.useCallback((id: string) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n // Compute scores for all items\n const scores = React.useMemo(() => {\n const result = new Map<string, number>();\n for (const [id, registration] of items) {\n const score = filter(registration.value, search, registration.keywords);\n result.set(id, score);\n }\n return result;\n }, [items, search, filter]);\n\n const visibleCount = React.useMemo(() => {\n let count = 0;\n for (const score of scores.values()) {\n if (score > 0) count++;\n }\n return count;\n }, [scores]);\n\n // Reset active when search changes\n React.useEffect(() => {\n setActiveId(null);\n }, [search]);\n\n const contextValue = React.useMemo<CommandContextValue>(\n () => ({\n search,\n setSearch,\n filter,\n scores,\n registerItem,\n unregisterItem,\n activeId,\n setActiveId,\n loop,\n listRef,\n visibleCount,\n listId,\n }),\n [search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount, listId]\n );\n\n return (\n <CommandContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={[styles.command, className].filter(Boolean).join(' ')}\n role=\"search\"\n >\n {children}\n </div>\n </CommandContext.Provider>\n );\n}\n\nfunction CommandInput({\n className,\n onChange,\n onKeyDown,\n ...htmlProps\n}: CommandInputProps) {\n const { search, setSearch, listRef, setActiveId, activeId, loop, listId } = useCommandContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const getEnabledItems = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return [];\n return Array.from(\n list.querySelectorAll<HTMLElement>('[data-command-item]:not([data-disabled=\"true\"])')\n ).filter((el) => el.style.display !== 'none');\n }, [listRef]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n const items = getEnabledItems();\n if (items.length === 0) return;\n\n const currentIndex = activeId\n ? items.findIndex((item) => item.id === activeId)\n : -1;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[0].id);\n } else if (currentIndex < items.length - 1) {\n setActiveId(items[currentIndex + 1].id);\n } else if (loop) {\n setActiveId(items[0].id);\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[items.length - 1].id);\n } else if (currentIndex > 0) {\n setActiveId(items[currentIndex - 1].id);\n } else if (loop) {\n setActiveId(items[items.length - 1].id);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n setActiveId(items[0].id);\n break;\n }\n case 'End': {\n event.preventDefault();\n setActiveId(items[items.length - 1].id);\n break;\n }\n case 'Enter': {\n event.preventDefault();\n if (activeId) {\n const activeItem = items.find((item) => item.id === activeId);\n if (activeItem) {\n activeItem.click();\n }\n }\n break;\n }\n }\n };\n\n return (\n <div className={styles.inputWrapper}>\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={true}\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeId ?? undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n value={search}\n {...htmlProps}\n onChange={(e) => {\n onChange?.(e);\n if (e.defaultPrevented) return;\n setSearch(e.target.value);\n }}\n onKeyDown={handleKeyDown}\n className={[styles.input, className].filter(Boolean).join(' ')}\n />\n </div>\n );\n}\n\nfunction CommandList({ children, className, ...htmlProps }: CommandListProps) {\n const { listRef, listId } = useCommandContext();\n\n return (\n <div\n ref={listRef}\n {...htmlProps}\n id={listId}\n role=\"listbox\"\n className={[styles.list, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandItem({\n children,\n value: valueProp,\n keywords,\n disabled = false,\n onItemSelect,\n className,\n onClick,\n onKeyDown,\n onMouseEnter,\n style,\n ...htmlProps\n}: CommandItemProps) {\n const { scores, registerItem, unregisterItem, activeId, setActiveId } = useCommandContext();\n const generatedId = React.useId();\n const itemId = (htmlProps.id as string | undefined) ?? `command-item-${generatedId}`;\n const itemRef = React.useRef<HTMLDivElement>(null);\n\n // Extract text content for filtering if no value prop\n const textValue = React.useMemo(() => {\n if (valueProp) return valueProp;\n return getTextContent(children).trim();\n }, [valueProp, children]);\n\n // Register with context\n React.useEffect(() => {\n registerItem(itemId, { value: textValue, keywords });\n return () => unregisterItem(itemId);\n }, [itemId, textValue, keywords, registerItem, unregisterItem]);\n\n const score = scores.get(itemId) ?? 1;\n const isVisible = score > 0;\n const isActive = activeId === itemId;\n\n // Scroll active item into view\n React.useEffect(() => {\n if (isActive && itemRef.current) {\n itemRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const activateItem = () => {\n if (disabled) return;\n onItemSelect?.();\n };\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n activateItem();\n };\n\n const handleMouseEnter = (event: React.MouseEvent<HTMLDivElement>) => {\n onMouseEnter?.(event);\n if (event.defaultPrevented) return;\n if (!disabled) {\n setActiveId(itemId);\n }\n };\n\n return (\n <div\n ref={itemRef}\n {...htmlProps}\n id={itemId}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={disabled}\n data-command-item=\"\"\n data-active={isActive || undefined}\n data-disabled={disabled || undefined}\n onClick={handleClick}\n onKeyDown={(e) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n activateItem();\n }\n }}\n onMouseEnter={handleMouseEnter}\n className={[\n styles.item,\n isActive && styles.itemActive,\n disabled && styles.itemDisabled,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ ...style, display: isVisible ? undefined : 'none' }}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandGroup({ children, heading, className, ...htmlProps }: CommandGroupProps) {\n const labelId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const { scores } = useCommandContext();\n const [hasVisibleChildren, setHasVisibleChildren] = React.useState(true);\n\n // Check if any children are visible after each score update\n React.useEffect(() => {\n if (!groupRef.current) return;\n const items = groupRef.current.querySelectorAll<HTMLElement>('[data-command-item]');\n const anyVisible = Array.from(items).some((item) => item.style.display !== 'none');\n setHasVisibleChildren(anyVisible);\n }, [scores]);\n\n const { style, ...restHtmlProps } = htmlProps;\n\n return (\n <div\n ref={groupRef}\n {...restHtmlProps}\n role=\"group\"\n aria-labelledby={heading ? labelId : undefined}\n className={[styles.group, className].filter(Boolean).join(' ')}\n style={{ ...style, display: hasVisibleChildren ? undefined : 'none' }}\n >\n {heading && (\n <div id={labelId} className={styles.groupHeading}>\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nfunction CommandEmpty({ children, className, ...htmlProps }: CommandEmptyProps) {\n const { visibleCount } = useCommandContext();\n\n if (visibleCount > 0) return null;\n\n return (\n <div\n {...htmlProps}\n role=\"option\"\n aria-disabled=\"true\"\n aria-selected=\"false\"\n className={[styles.empty, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandSeparator({ className, ...htmlProps }: CommandSeparatorProps) {\n return (\n <div\n {...htmlProps}\n role=\"separator\"\n className={[styles.separator, className].filter(Boolean).join(' ')}\n />\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Item: CommandItem,\n Group: CommandGroup,\n Empty: CommandEmpty,\n Separator: CommandSeparator,\n});\n\nexport {\n CommandRoot,\n CommandInput,\n CommandList,\n CommandItem,\n CommandGroup,\n CommandEmpty,\n CommandSeparator,\n};\n"],"names":[],"mappings":"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"}
@@ -174,7 +174,19 @@ function DataTableRoot({
174
174
  className
175
175
  ].filter(Boolean).join(" ");
176
176
  if (isEmpty) {
177
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: DataTable_module.default.emptyState, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: DataTable_module.default.emptyMessage, children: emptyMessage }) });
177
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: [DataTable_module.default.wrapper, bordered && DataTable_module.default.bordered].filter(Boolean).join(" "), children: /* @__PURE__ */ jsxRuntime.jsxs(
178
+ "table",
179
+ {
180
+ ...htmlProps,
181
+ className: rootClasses,
182
+ "aria-label": ariaLabel,
183
+ "aria-describedby": ariaDescribedBy,
184
+ children: [
185
+ caption && /* @__PURE__ */ jsxRuntime.jsx("caption", { className: captionHidden ? DataTable_module.default.captionHidden : DataTable_module.default.caption, children: caption }),
186
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { className: DataTable_module.default.tbody, children: /* @__PURE__ */ jsxRuntime.jsx("tr", { className: DataTable_module.default.row, children: /* @__PURE__ */ jsxRuntime.jsx("td", { className: DataTable_module.default.td, colSpan: Math.max(columns.length, 1), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: DataTable_module.default.emptyState, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: DataTable_module.default.emptyMessage, children: emptyMessage }) }) }) }) })
187
+ ]
188
+ }
189
+ ) });
178
190
  }
179
191
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: [DataTable_module.default.wrapper, bordered && DataTable_module.default.bordered].filter(Boolean).join(" "), children: /* @__PURE__ */ jsxRuntime.jsxs(
180
192
  "table",
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/components/DataTable/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n// Import globals to ensure CSS variables are defined\nimport '../../styles/globals.scss';\nimport styles from './DataTable.module.scss';\nimport { Checkbox } from '../Checkbox';\n\n// ============================================\n// Types (self-owned — no external dependency for types)\n// ============================================\n\n/** Column definition compatible with @tanstack/react-table */\nexport type ColumnDef<TData = unknown, TValue = unknown> = {\n id?: string;\n accessorKey?: string;\n accessorFn?: (row: TData) => TValue;\n header?: string | ((context: any) => React.ReactNode);\n cell?: string | ((context: any) => React.ReactNode);\n size?: number;\n minSize?: number;\n maxSize?: number;\n enableSorting?: boolean;\n [key: string]: unknown;\n};\n\nexport type SortingState = Array<{ id: string; desc: boolean }>;\nexport type RowSelectionState = Record<string, boolean>;\nexport type ExpandedState = true | Record<string, boolean>;\ntype OnChangeFn<T> = ((updaterOrValue: T | ((prev: T) => T)) => void);\n\nexport type DataTableColumn<T> = ColumnDef<T, unknown>;\n\n// ============================================\n// Lazy-loaded dependency (@tanstack/react-table)\n// ============================================\n\nlet _useReactTable: any = null;\nlet _getCoreRowModel: any = null;\nlet _getSortedRowModel: any = null;\nlet _getExpandedRowModel: any = null;\nlet _flexRender: any = null;\nlet _tableLoaded = false;\nlet _tableFailed = false;\n\nfunction loadTableDeps() {\n if (_tableLoaded) return;\n _tableLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rt = require('@tanstack/react-table');\n _useReactTable = rt.useReactTable;\n _getCoreRowModel = rt.getCoreRowModel;\n _getSortedRowModel = rt.getSortedRowModel;\n _getExpandedRowModel = rt.getExpandedRowModel;\n _flexRender = rt.flexRender;\n } catch {\n _tableFailed = true;\n }\n}\n\nexport interface DataTableProps<T> extends Omit<React.HTMLAttributes<HTMLTableElement>, 'onClick'> {\n /** Column definitions */\n columns: DataTableColumn<T>[];\n /** Data array */\n data: T[];\n /** Unique key extractor for each row */\n getRowId?: (row: T) => string;\n /** Enable sorting */\n sortable?: boolean;\n /** Controlled sorting state */\n sorting?: SortingState;\n /** Sorting change handler */\n onSortingChange?: OnChangeFn<SortingState>;\n /** Enable row selection */\n selectable?: boolean;\n /** Show checkbox column for row selection */\n showCheckbox?: boolean;\n /** Controlled selection state */\n rowSelection?: RowSelectionState;\n /** Selection change handler */\n onRowSelectionChange?: OnChangeFn<RowSelectionState>;\n /** Row click handler */\n onRowClick?: (row: T) => void;\n /** Extract sub-rows from a row for expandable tree tables */\n getSubRows?: (row: T) => T[] | undefined;\n /** Controlled expanded state */\n expanded?: ExpandedState;\n /** Expanded state change handler */\n onExpandedChange?: OnChangeFn<ExpandedState>;\n /** Empty state message */\n emptyMessage?: string;\n /** Size variant */\n size?: 'sm' | 'md';\n /** Visible caption for the table (recommended for accessibility) */\n caption?: string;\n /** Hide the caption visually but keep it for screen readers */\n captionHidden?: boolean;\n /** Show alternating row backgrounds */\n striped?: boolean;\n /** Wrap table in a bordered container */\n bordered?: boolean;\n}\n\nfunction getColumnSizeStyle(\n column: {\n getSize: () => number;\n columnDef: { size?: number; minSize?: number; maxSize?: number };\n }\n): React.CSSProperties | undefined {\n const { size, minSize, maxSize } = column.columnDef;\n const hasExplicitSize = size !== undefined || minSize !== undefined || maxSize !== undefined;\n\n if (!hasExplicitSize) {\n return undefined;\n }\n\n const resolvedSize = column.getSize();\n\n return {\n width: resolvedSize,\n minWidth: minSize ?? resolvedSize,\n maxWidth: maxSize ?? resolvedSize,\n };\n}\n\nfunction isInteractiveTarget(\n target: EventTarget | null,\n currentTarget: HTMLTableRowElement\n) {\n if (!(target instanceof Element)) return false;\n\n const interactiveElement = target.closest(\n 'button, a, input, select, textarea, [role=\"button\"], [role=\"link\"], [role=\"checkbox\"], [role=\"switch\"]'\n );\n\n return Boolean(interactiveElement && currentTarget.contains(interactiveElement));\n}\n\nfunction DataTableRoot<T>({\n columns: userColumns,\n data,\n getRowId,\n sortable = false,\n sorting: controlledSorting,\n onSortingChange,\n selectable = false,\n showCheckbox = false,\n rowSelection: controlledRowSelection,\n onRowSelectionChange,\n onRowClick,\n getSubRows,\n expanded: controlledExpanded,\n onExpandedChange,\n emptyMessage = 'No data available',\n size = 'md',\n className,\n caption,\n captionHidden = false,\n striped = false,\n bordered = false,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedBy,\n ...htmlProps\n}: DataTableProps<T>) {\n loadTableDeps();\n\n // Internal sorting state when uncontrolled\n const [internalSorting, setInternalSorting] = React.useState<SortingState>([]);\n const sorting = controlledSorting ?? internalSorting;\n const handleSortingChange = onSortingChange ?? setInternalSorting;\n\n // Internal selection state when uncontrolled\n const [internalRowSelection, setInternalRowSelection] = React.useState<RowSelectionState>({});\n const rowSelection = controlledRowSelection ?? internalRowSelection;\n const handleRowSelectionChange = onRowSelectionChange ?? setInternalRowSelection;\n\n // Internal expanded state when uncontrolled\n const [internalExpanded, setInternalExpanded] = React.useState<ExpandedState>({});\n const expanded = controlledExpanded ?? internalExpanded;\n const handleExpandedChange = onExpandedChange ?? setInternalExpanded;\n\n // Build columns with optional checkbox prepended\n const columns = React.useMemo(() => {\n if (!showCheckbox || !selectable) return userColumns;\n\n const checkboxColumn: DataTableColumn<T> = {\n id: '__checkbox',\n size: 40,\n minSize: 40,\n maxSize: 40,\n enableSorting: false,\n header: ({ table }: any) => (\n <Checkbox\n size=\"sm\"\n checked={table.getIsAllRowsSelected()}\n indeterminate={table.getIsSomeRowsSelected()}\n onCheckedChange={() => table.toggleAllRowsSelected()}\n aria-label=\"Select all rows\"\n />\n ),\n cell: ({ row }: any) => (\n <Checkbox\n size=\"sm\"\n checked={row.getIsSelected()}\n disabled={!row.getCanSelect()}\n onCheckedChange={() => row.toggleSelected()}\n aria-label={`Select row ${row.id}`}\n />\n ),\n };\n\n return [checkboxColumn, ...userColumns];\n }, [userColumns, showCheckbox, selectable]);\n\n const hasExplicitColumnSizing = React.useMemo(\n () =>\n columns.some((column) =>\n column.size !== undefined ||\n column.minSize !== undefined ||\n column.maxSize !== undefined\n ),\n [columns]\n );\n\n if (_tableFailed || !_useReactTable) {\n if (_tableFailed && process.env.NODE_ENV === 'development') {\n console.warn(\n '[@fragments-sdk/ui] DataTable: @tanstack/react-table is not installed. ' +\n 'Install it with: npm install @tanstack/react-table'\n );\n }\n return null;\n }\n\n const hasSubRows = !!getSubRows;\n\n const table = _useReactTable({\n data,\n columns,\n getRowId,\n getSubRows: getSubRows as any,\n getCoreRowModel: _getCoreRowModel(),\n getSortedRowModel: sortable ? _getSortedRowModel() : undefined,\n getExpandedRowModel: hasSubRows && _getExpandedRowModel ? _getExpandedRowModel() : undefined,\n state: {\n sorting: sortable ? sorting : undefined,\n rowSelection: selectable ? rowSelection : undefined,\n expanded: hasSubRows ? expanded : undefined,\n },\n onSortingChange: sortable ? handleSortingChange : undefined,\n onRowSelectionChange: selectable ? handleRowSelectionChange : undefined,\n onExpandedChange: hasSubRows ? handleExpandedChange : undefined,\n enableRowSelection: selectable,\n enableSorting: sortable,\n enableExpanding: hasSubRows,\n });\n\n const isEmpty = data.length === 0;\n\n const rootClasses = [\n styles.table,\n hasExplicitColumnSizing && styles.fixedLayout,\n styles[size],\n striped && styles.striped,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n if (isEmpty) {\n return (\n <div className={styles.emptyState}>\n <span className={styles.emptyMessage}>{emptyMessage}</span>\n </div>\n );\n }\n\n return (\n <div className={[styles.wrapper, bordered && styles.bordered].filter(Boolean).join(' ')}>\n <table\n {...htmlProps}\n className={rootClasses}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n >\n {caption && (\n <caption className={captionHidden ? styles.captionHidden : styles.caption}>\n {caption}\n </caption>\n )}\n <thead className={styles.thead}>\n {table.getHeaderGroups().map((headerGroup: any) => (\n <tr key={headerGroup.id} className={styles.headerRow}>\n {headerGroup.headers.map((header: any) => {\n const canSort = sortable && header.column.getCanSort();\n const sortDirection = header.column.getIsSorted();\n const toggleSorting = canSort ? header.column.getToggleSortingHandler() : undefined;\n\n return (\n <th\n key={header.id}\n className={[styles.th, canSort && styles.thSortable].filter(Boolean).join(' ')}\n style={getColumnSizeStyle(header.column)}\n scope=\"col\"\n aria-sort={\n sortDirection\n ? sortDirection === 'asc'\n ? 'ascending'\n : 'descending'\n : canSort\n ? 'none'\n : undefined\n }\n >\n {canSort ? (\n <button\n type=\"button\"\n className={styles.sortButton}\n onClick={toggleSorting}\n >\n <span className={styles.headerContent}>\n {header.isPlaceholder\n ? null\n : _flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </span>\n <span className={styles.sortIndicator} aria-hidden=\"true\">\n {sortDirection === 'asc' ? (\n <SortAscIcon />\n ) : sortDirection === 'desc' ? (\n <SortDescIcon />\n ) : (\n <SortIcon />\n )}\n </span>\n </button>\n ) : (\n <div className={styles.headerContent}>\n {header.isPlaceholder\n ? null\n : _flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </div>\n )}\n </th>\n );\n })}\n </tr>\n ))}\n </thead>\n <tbody className={styles.tbody}>\n {table.getRowModel().rows.map((row: any) => {\n const isClickable = !!onRowClick;\n const isSelected = selectable ? row.getIsSelected() : false;\n const depth: number = row.depth ?? 0;\n const canExpand = hasSubRows && row.getCanExpand();\n const handleRowClick = (event: React.MouseEvent<HTMLTableRowElement>) => {\n if (!onRowClick) return;\n if (isInteractiveTarget(event.target, event.currentTarget)) return;\n onRowClick(row.original);\n };\n\n const handleRowKeyDown = (event: React.KeyboardEvent<HTMLTableRowElement>) => {\n if (!onRowClick) return;\n if (isInteractiveTarget(event.target, event.currentTarget)) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onRowClick(row.original);\n }\n };\n\n return (\n <tr\n key={row.id}\n className={[\n styles.row,\n isClickable && styles.clickable,\n isSelected && styles.selected,\n depth > 0 && styles.subRow,\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={isClickable ? handleRowClick : undefined}\n onKeyDown={isClickable ? handleRowKeyDown : undefined}\n tabIndex={isClickable ? 0 : undefined}\n data-selected={isSelected || undefined}\n data-depth={depth > 0 ? depth : undefined}\n >\n {row.getVisibleCells().map((cell: any, cellIndex: number) => {\n const isFirstDataCell = hasSubRows && cellIndex === (showCheckbox && selectable ? 1 : 0);\n return (\n <td\n key={cell.id}\n className={styles.td}\n style={{\n ...getColumnSizeStyle(cell.column),\n ...(isFirstDataCell && depth > 0 ? { paddingLeft: `${depth * 24 + 12}px` } : undefined),\n }}\n >\n {isFirstDataCell && canExpand ? (\n <span className={styles.expandCell}>\n <button\n type=\"button\"\n className={styles.expandButton}\n onClick={row.getToggleExpandedHandler()}\n aria-label={row.getIsExpanded() ? 'Collapse row' : 'Expand row'}\n aria-expanded={row.getIsExpanded()}\n >\n <ExpandIcon expanded={row.getIsExpanded()} />\n </button>\n {_flexRender(cell.column.columnDef.cell, cell.getContext())}\n </span>\n ) : (\n _flexRender(cell.column.columnDef.cell, cell.getContext())\n )}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n\n// Expand/collapse icon for sub-rows\nfunction ExpandIcon({ expanded }: { expanded: boolean }) {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n style={{\n transform: expanded ? 'rotate(90deg)' : undefined,\n transition: 'transform 150ms ease',\n }}\n >\n <path d=\"M4.5 2.5L8 6L4.5 9.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\n// Sort icons - minimal and functional\nfunction SortIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 2L8.5 5H3.5L6 2Z\"\n fill=\"currentColor\"\n opacity=\"0.3\"\n />\n <path\n d=\"M6 10L3.5 7H8.5L6 10Z\"\n fill=\"currentColor\"\n opacity=\"0.3\"\n />\n </svg>\n );\n}\n\nfunction SortAscIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 2L8.5 5H3.5L6 2Z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction SortDescIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 10L3.5 7H8.5L6 10Z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n// Helper to create simple columns without TanStack's createColumnHelper\nexport function createColumns<T>(\n columns: Array<{\n key: string;\n header: string;\n width?: number;\n cell?: (row: T) => React.ReactNode;\n }>\n): DataTableColumn<T>[] {\n return columns.map((col) => ({\n id: col.key,\n accessorKey: col.key,\n header: col.header,\n size: col.width,\n minSize: col.width,\n maxSize: col.width,\n cell: col.cell\n ? ({ row }) => col.cell!(row.original)\n : ({ getValue }) => getValue() ?? '--',\n }));\n}\n\nexport const DataTable = Object.assign(DataTableRoot, {\n Root: DataTableRoot,\n Columns: createColumns,\n});\n"],"names":["React","table","jsx","Checkbox","styles","jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/components/DataTable/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n// Import globals to ensure CSS variables are defined\nimport '../../styles/globals.scss';\nimport styles from './DataTable.module.scss';\nimport { Checkbox } from '../Checkbox';\n\n// ============================================\n// Types (self-owned — no external dependency for types)\n// ============================================\n\n/** Column definition compatible with @tanstack/react-table */\nexport type ColumnDef<TData = unknown, TValue = unknown> = {\n id?: string;\n accessorKey?: string;\n accessorFn?: (row: TData) => TValue;\n header?: string | ((context: any) => React.ReactNode);\n cell?: string | ((context: any) => React.ReactNode);\n size?: number;\n minSize?: number;\n maxSize?: number;\n enableSorting?: boolean;\n [key: string]: unknown;\n};\n\nexport type SortingState = Array<{ id: string; desc: boolean }>;\nexport type RowSelectionState = Record<string, boolean>;\nexport type ExpandedState = true | Record<string, boolean>;\ntype OnChangeFn<T> = ((updaterOrValue: T | ((prev: T) => T)) => void);\n\nexport type DataTableColumn<T> = ColumnDef<T, unknown>;\n\n// ============================================\n// Lazy-loaded dependency (@tanstack/react-table)\n// ============================================\n\nlet _useReactTable: any = null;\nlet _getCoreRowModel: any = null;\nlet _getSortedRowModel: any = null;\nlet _getExpandedRowModel: any = null;\nlet _flexRender: any = null;\nlet _tableLoaded = false;\nlet _tableFailed = false;\n\nfunction loadTableDeps() {\n if (_tableLoaded) return;\n _tableLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rt = require('@tanstack/react-table');\n _useReactTable = rt.useReactTable;\n _getCoreRowModel = rt.getCoreRowModel;\n _getSortedRowModel = rt.getSortedRowModel;\n _getExpandedRowModel = rt.getExpandedRowModel;\n _flexRender = rt.flexRender;\n } catch {\n _tableFailed = true;\n }\n}\n\nexport interface DataTableProps<T> extends Omit<React.HTMLAttributes<HTMLTableElement>, 'onClick'> {\n /** Column definitions */\n columns: DataTableColumn<T>[];\n /** Data array */\n data: T[];\n /** Unique key extractor for each row */\n getRowId?: (row: T) => string;\n /** Enable sorting */\n sortable?: boolean;\n /** Controlled sorting state */\n sorting?: SortingState;\n /** Sorting change handler */\n onSortingChange?: OnChangeFn<SortingState>;\n /** Enable row selection */\n selectable?: boolean;\n /** Show checkbox column for row selection */\n showCheckbox?: boolean;\n /** Controlled selection state */\n rowSelection?: RowSelectionState;\n /** Selection change handler */\n onRowSelectionChange?: OnChangeFn<RowSelectionState>;\n /** Row click handler */\n onRowClick?: (row: T) => void;\n /** Extract sub-rows from a row for expandable tree tables */\n getSubRows?: (row: T) => T[] | undefined;\n /** Controlled expanded state */\n expanded?: ExpandedState;\n /** Expanded state change handler */\n onExpandedChange?: OnChangeFn<ExpandedState>;\n /** Empty state message */\n emptyMessage?: string;\n /** Size variant */\n size?: 'sm' | 'md';\n /** Visible caption for the table (recommended for accessibility) */\n caption?: string;\n /** Hide the caption visually but keep it for screen readers */\n captionHidden?: boolean;\n /** Show alternating row backgrounds */\n striped?: boolean;\n /** Wrap table in a bordered container */\n bordered?: boolean;\n}\n\nfunction getColumnSizeStyle(\n column: {\n getSize: () => number;\n columnDef: { size?: number; minSize?: number; maxSize?: number };\n }\n): React.CSSProperties | undefined {\n const { size, minSize, maxSize } = column.columnDef;\n const hasExplicitSize = size !== undefined || minSize !== undefined || maxSize !== undefined;\n\n if (!hasExplicitSize) {\n return undefined;\n }\n\n const resolvedSize = column.getSize();\n\n return {\n width: resolvedSize,\n minWidth: minSize ?? resolvedSize,\n maxWidth: maxSize ?? resolvedSize,\n };\n}\n\nfunction isInteractiveTarget(\n target: EventTarget | null,\n currentTarget: HTMLTableRowElement\n) {\n if (!(target instanceof Element)) return false;\n\n const interactiveElement = target.closest(\n 'button, a, input, select, textarea, [role=\"button\"], [role=\"link\"], [role=\"checkbox\"], [role=\"switch\"]'\n );\n\n return Boolean(interactiveElement && currentTarget.contains(interactiveElement));\n}\n\nfunction DataTableRoot<T>({\n columns: userColumns,\n data,\n getRowId,\n sortable = false,\n sorting: controlledSorting,\n onSortingChange,\n selectable = false,\n showCheckbox = false,\n rowSelection: controlledRowSelection,\n onRowSelectionChange,\n onRowClick,\n getSubRows,\n expanded: controlledExpanded,\n onExpandedChange,\n emptyMessage = 'No data available',\n size = 'md',\n className,\n caption,\n captionHidden = false,\n striped = false,\n bordered = false,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedBy,\n ...htmlProps\n}: DataTableProps<T>) {\n loadTableDeps();\n\n // Internal sorting state when uncontrolled\n const [internalSorting, setInternalSorting] = React.useState<SortingState>([]);\n const sorting = controlledSorting ?? internalSorting;\n const handleSortingChange = onSortingChange ?? setInternalSorting;\n\n // Internal selection state when uncontrolled\n const [internalRowSelection, setInternalRowSelection] = React.useState<RowSelectionState>({});\n const rowSelection = controlledRowSelection ?? internalRowSelection;\n const handleRowSelectionChange = onRowSelectionChange ?? setInternalRowSelection;\n\n // Internal expanded state when uncontrolled\n const [internalExpanded, setInternalExpanded] = React.useState<ExpandedState>({});\n const expanded = controlledExpanded ?? internalExpanded;\n const handleExpandedChange = onExpandedChange ?? setInternalExpanded;\n\n // Build columns with optional checkbox prepended\n const columns = React.useMemo(() => {\n if (!showCheckbox || !selectable) return userColumns;\n\n const checkboxColumn: DataTableColumn<T> = {\n id: '__checkbox',\n size: 40,\n minSize: 40,\n maxSize: 40,\n enableSorting: false,\n header: ({ table }: any) => (\n <Checkbox\n size=\"sm\"\n checked={table.getIsAllRowsSelected()}\n indeterminate={table.getIsSomeRowsSelected()}\n onCheckedChange={() => table.toggleAllRowsSelected()}\n aria-label=\"Select all rows\"\n />\n ),\n cell: ({ row }: any) => (\n <Checkbox\n size=\"sm\"\n checked={row.getIsSelected()}\n disabled={!row.getCanSelect()}\n onCheckedChange={() => row.toggleSelected()}\n aria-label={`Select row ${row.id}`}\n />\n ),\n };\n\n return [checkboxColumn, ...userColumns];\n }, [userColumns, showCheckbox, selectable]);\n\n const hasExplicitColumnSizing = React.useMemo(\n () =>\n columns.some((column) =>\n column.size !== undefined ||\n column.minSize !== undefined ||\n column.maxSize !== undefined\n ),\n [columns]\n );\n\n if (_tableFailed || !_useReactTable) {\n if (_tableFailed && process.env.NODE_ENV === 'development') {\n console.warn(\n '[@fragments-sdk/ui] DataTable: @tanstack/react-table is not installed. ' +\n 'Install it with: npm install @tanstack/react-table'\n );\n }\n return null;\n }\n\n const hasSubRows = !!getSubRows;\n\n const table = _useReactTable({\n data,\n columns,\n getRowId,\n getSubRows: getSubRows as any,\n getCoreRowModel: _getCoreRowModel(),\n getSortedRowModel: sortable ? _getSortedRowModel() : undefined,\n getExpandedRowModel: hasSubRows && _getExpandedRowModel ? _getExpandedRowModel() : undefined,\n state: {\n sorting: sortable ? sorting : undefined,\n rowSelection: selectable ? rowSelection : undefined,\n expanded: hasSubRows ? expanded : undefined,\n },\n onSortingChange: sortable ? handleSortingChange : undefined,\n onRowSelectionChange: selectable ? handleRowSelectionChange : undefined,\n onExpandedChange: hasSubRows ? handleExpandedChange : undefined,\n enableRowSelection: selectable,\n enableSorting: sortable,\n enableExpanding: hasSubRows,\n });\n\n const isEmpty = data.length === 0;\n\n const rootClasses = [\n styles.table,\n hasExplicitColumnSizing && styles.fixedLayout,\n styles[size],\n striped && styles.striped,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n if (isEmpty) {\n return (\n <div className={[styles.wrapper, bordered && styles.bordered].filter(Boolean).join(' ')}>\n <table\n {...htmlProps}\n className={rootClasses}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n >\n {caption && (\n <caption className={captionHidden ? styles.captionHidden : styles.caption}>\n {caption}\n </caption>\n )}\n <tbody className={styles.tbody}>\n <tr className={styles.row}>\n <td className={styles.td} colSpan={Math.max(columns.length, 1)}>\n <div className={styles.emptyState}>\n <span className={styles.emptyMessage}>{emptyMessage}</span>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n );\n }\n\n return (\n <div className={[styles.wrapper, bordered && styles.bordered].filter(Boolean).join(' ')}>\n <table\n {...htmlProps}\n className={rootClasses}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n >\n {caption && (\n <caption className={captionHidden ? styles.captionHidden : styles.caption}>\n {caption}\n </caption>\n )}\n <thead className={styles.thead}>\n {table.getHeaderGroups().map((headerGroup: any) => (\n <tr key={headerGroup.id} className={styles.headerRow}>\n {headerGroup.headers.map((header: any) => {\n const canSort = sortable && header.column.getCanSort();\n const sortDirection = header.column.getIsSorted();\n const toggleSorting = canSort ? header.column.getToggleSortingHandler() : undefined;\n\n return (\n <th\n key={header.id}\n className={[styles.th, canSort && styles.thSortable].filter(Boolean).join(' ')}\n style={getColumnSizeStyle(header.column)}\n scope=\"col\"\n aria-sort={\n sortDirection\n ? sortDirection === 'asc'\n ? 'ascending'\n : 'descending'\n : canSort\n ? 'none'\n : undefined\n }\n >\n {canSort ? (\n <button\n type=\"button\"\n className={styles.sortButton}\n onClick={toggleSorting}\n >\n <span className={styles.headerContent}>\n {header.isPlaceholder\n ? null\n : _flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </span>\n <span className={styles.sortIndicator} aria-hidden=\"true\">\n {sortDirection === 'asc' ? (\n <SortAscIcon />\n ) : sortDirection === 'desc' ? (\n <SortDescIcon />\n ) : (\n <SortIcon />\n )}\n </span>\n </button>\n ) : (\n <div className={styles.headerContent}>\n {header.isPlaceholder\n ? null\n : _flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </div>\n )}\n </th>\n );\n })}\n </tr>\n ))}\n </thead>\n <tbody className={styles.tbody}>\n {table.getRowModel().rows.map((row: any) => {\n const isClickable = !!onRowClick;\n const isSelected = selectable ? row.getIsSelected() : false;\n const depth: number = row.depth ?? 0;\n const canExpand = hasSubRows && row.getCanExpand();\n const handleRowClick = (event: React.MouseEvent<HTMLTableRowElement>) => {\n if (!onRowClick) return;\n if (isInteractiveTarget(event.target, event.currentTarget)) return;\n onRowClick(row.original);\n };\n\n const handleRowKeyDown = (event: React.KeyboardEvent<HTMLTableRowElement>) => {\n if (!onRowClick) return;\n if (isInteractiveTarget(event.target, event.currentTarget)) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onRowClick(row.original);\n }\n };\n\n return (\n <tr\n key={row.id}\n className={[\n styles.row,\n isClickable && styles.clickable,\n isSelected && styles.selected,\n depth > 0 && styles.subRow,\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={isClickable ? handleRowClick : undefined}\n onKeyDown={isClickable ? handleRowKeyDown : undefined}\n tabIndex={isClickable ? 0 : undefined}\n data-selected={isSelected || undefined}\n data-depth={depth > 0 ? depth : undefined}\n >\n {row.getVisibleCells().map((cell: any, cellIndex: number) => {\n const isFirstDataCell = hasSubRows && cellIndex === (showCheckbox && selectable ? 1 : 0);\n return (\n <td\n key={cell.id}\n className={styles.td}\n style={{\n ...getColumnSizeStyle(cell.column),\n ...(isFirstDataCell && depth > 0 ? { paddingLeft: `${depth * 24 + 12}px` } : undefined),\n }}\n >\n {isFirstDataCell && canExpand ? (\n <span className={styles.expandCell}>\n <button\n type=\"button\"\n className={styles.expandButton}\n onClick={row.getToggleExpandedHandler()}\n aria-label={row.getIsExpanded() ? 'Collapse row' : 'Expand row'}\n aria-expanded={row.getIsExpanded()}\n >\n <ExpandIcon expanded={row.getIsExpanded()} />\n </button>\n {_flexRender(cell.column.columnDef.cell, cell.getContext())}\n </span>\n ) : (\n _flexRender(cell.column.columnDef.cell, cell.getContext())\n )}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n\n// Expand/collapse icon for sub-rows\nfunction ExpandIcon({ expanded }: { expanded: boolean }) {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n style={{\n transform: expanded ? 'rotate(90deg)' : undefined,\n transition: 'transform 150ms ease',\n }}\n >\n <path d=\"M4.5 2.5L8 6L4.5 9.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\n// Sort icons - minimal and functional\nfunction SortIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 2L8.5 5H3.5L6 2Z\"\n fill=\"currentColor\"\n opacity=\"0.3\"\n />\n <path\n d=\"M6 10L3.5 7H8.5L6 10Z\"\n fill=\"currentColor\"\n opacity=\"0.3\"\n />\n </svg>\n );\n}\n\nfunction SortAscIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 2L8.5 5H3.5L6 2Z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction SortDescIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 10L3.5 7H8.5L6 10Z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n// Helper to create simple columns without TanStack's createColumnHelper\nexport function createColumns<T>(\n columns: Array<{\n key: string;\n header: string;\n width?: number;\n cell?: (row: T) => React.ReactNode;\n }>\n): DataTableColumn<T>[] {\n return columns.map((col) => ({\n id: col.key,\n accessorKey: col.key,\n header: col.header,\n size: col.width,\n minSize: col.width,\n maxSize: col.width,\n cell: col.cell\n ? ({ row }) => col.cell!(row.original)\n : ({ getValue }) => getValue() ?? '--',\n }));\n}\n\nexport const DataTable = Object.assign(DataTableRoot, {\n Root: DataTableRoot,\n Columns: createColumns,\n});\n"],"names":["React","table","jsx","Checkbox","styles","jsxs"],"mappings":"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"}