@refraction-ui/react 0.22.0 → 0.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/dist/{chunk-V24GDHUX.js → chunk-4ACSHPCM.js} +2 -2
  2. package/dist/{chunk-SDAJVXD4.js → chunk-5P56PN3J.js} +2 -2
  3. package/dist/chunk-75BKRTPO.js +417 -0
  4. package/dist/{chunk-2Q6HHFAN.js.map → chunk-75BKRTPO.js.map} +1 -1
  5. package/dist/chunk-7P7EJ56S.js +7 -0
  6. package/dist/{chunk-QPCKJ2YR.js → chunk-GG6MZDGV.js} +2 -2
  7. package/dist/{chunk-QDMLIDYN.js → chunk-GU5MI7FX.js} +2 -2
  8. package/dist/{chunk-3Y2T26QD.js → chunk-JZQ5ZL46.js} +6 -4
  9. package/dist/{chunk-3Y2T26QD.js.map → chunk-JZQ5ZL46.js.map} +2 -2
  10. package/dist/{chunk-RSWOLRIC.js → chunk-KIZD73DK.js} +2 -2
  11. package/dist/{chunk-XMFNBOPO.js → chunk-PY2TIFCT.js} +2 -2
  12. package/dist/{chunk-XWP763SH.js → chunk-V727VZOE.js} +4 -2
  13. package/dist/{chunk-XWP763SH.js.map → chunk-V727VZOE.js.map} +2 -2
  14. package/dist/{chunk-3I3DYDHR.js → chunk-WNLYPQOS.js} +2 -2
  15. package/dist/{chunk-63N4PZUJ.js → chunk-X6HEKRWE.js} +2 -2
  16. package/dist/{chunk-WYKPPK3W.js → chunk-XAJDSVZR.js} +2 -2
  17. package/dist/faro-engine-VIUXJAPH-FSARIABU.js +3 -0
  18. package/dist/{faro-engine-47HGRAQH-JKINJPMH.js.map → faro-engine-VIUXJAPH-FSARIABU.js.map} +1 -1
  19. package/dist/index.cjs +736 -274
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.d.cts +3 -0
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.js +3 -0
  24. package/dist/internal/avatar/index.d.cts +4 -1
  25. package/dist/internal/avatar/index.d.ts +4 -1
  26. package/dist/internal/data-table/index.d.cts +48 -3
  27. package/dist/internal/data-table/index.d.ts +48 -3
  28. package/dist/internal/line-chart/index.d.ts +17 -3
  29. package/dist/internal/native-select/index.d.ts +21 -0
  30. package/dist/internal/react-avatar/index.d.cts +4 -2
  31. package/dist/internal/react-avatar/index.d.ts +4 -2
  32. package/dist/internal/react-command/index.d.cts +13 -2
  33. package/dist/internal/react-command/index.d.ts +13 -2
  34. package/dist/internal/react-data-table/index.d.cts +27 -9
  35. package/dist/internal/react-data-table/index.d.ts +27 -9
  36. package/dist/internal/react-dialog/index.d.cts +5 -0
  37. package/dist/internal/react-dialog/index.d.ts +5 -0
  38. package/dist/internal/react-dropdown-menu/index.d.cts +19 -1
  39. package/dist/internal/react-dropdown-menu/index.d.ts +19 -1
  40. package/dist/internal/react-line-chart/index.d.ts +7 -2
  41. package/dist/internal/react-native-select/index.d.ts +19 -0
  42. package/dist/internal/react-stat-grid/index.d.ts +22 -11
  43. package/dist/internal/react-table/index.d.ts +39 -0
  44. package/dist/internal/stat-grid/index.d.ts +49 -7
  45. package/dist/internal/table/index.d.ts +46 -0
  46. package/dist/react-accordion.js +1 -1
  47. package/dist/react-action-list.js +1 -1
  48. package/dist/react-ai.js +1 -1
  49. package/dist/react-analytics.js +16 -4
  50. package/dist/react-analytics.js.map +2 -2
  51. package/dist/react-animated-text.js +1 -1
  52. package/dist/react-app-shell.js +1 -1
  53. package/dist/react-audience-feature-card.js +1 -1
  54. package/dist/react-audio-room.js +1 -1
  55. package/dist/react-auth.js +1 -1
  56. package/dist/react-avatar-group.js +1 -1
  57. package/dist/react-avatar.js +13 -9
  58. package/dist/react-avatar.js.map +2 -2
  59. package/dist/react-badge.js +1 -1
  60. package/dist/react-bottom-nav.js +1 -1
  61. package/dist/react-brand-network-cell.js +1 -1
  62. package/dist/react-breadcrumbs.js +1 -1
  63. package/dist/react-browser-chrome-mock.js +1 -1
  64. package/dist/react-button.js +3 -3
  65. package/dist/react-calendar.js +1 -1
  66. package/dist/react-call-controls.js +1 -1
  67. package/dist/react-callout.js +1 -1
  68. package/dist/react-card-grid.js +1 -1
  69. package/dist/react-card.js +1 -1
  70. package/dist/react-carousel.js +1 -1
  71. package/dist/react-charts.js +1 -1
  72. package/dist/react-checkbox.js +1 -1
  73. package/dist/react-checklist.js +1 -1
  74. package/dist/react-code-block.js +1 -1
  75. package/dist/react-code-editor.js +1 -1
  76. package/dist/react-collapsible.js +1 -1
  77. package/dist/react-combobox.js +1 -1
  78. package/dist/react-command-input.js +1 -1
  79. package/dist/react-command.js +115 -70
  80. package/dist/react-command.js.map +3 -3
  81. package/dist/react-composer.js +3 -3
  82. package/dist/react-content-protection.js +1 -1
  83. package/dist/react-conversation.js +5 -5
  84. package/dist/react-cookie-consent.js +1 -1
  85. package/dist/react-data-table.js +125 -114
  86. package/dist/react-data-table.js.map +2 -2
  87. package/dist/react-date-picker.js +1 -1
  88. package/dist/react-device-frame.js +1 -1
  89. package/dist/react-dialog.js +33 -9
  90. package/dist/react-dialog.js.map +2 -2
  91. package/dist/react-diff-viewer.js +1 -1
  92. package/dist/react-dropdown-menu.js +61 -8
  93. package/dist/react-dropdown-menu.js.map +3 -3
  94. package/dist/react-editor-status-bar.js +1 -1
  95. package/dist/react-editor-tabs.js +1 -1
  96. package/dist/react-emoji-picker.js +2 -2
  97. package/dist/react-empty-state.js +1 -1
  98. package/dist/react-feedback-dialog.js +2 -2
  99. package/dist/react-file-tree.js +1 -1
  100. package/dist/react-file-upload.js +1 -1
  101. package/dist/react-floating-reactions.js +1 -1
  102. package/dist/react-flow-editor.js +2 -2
  103. package/dist/react-footer.js +1 -1
  104. package/dist/react-funnel-chart.js +1 -1
  105. package/dist/react-graph-view.js +2 -2
  106. package/dist/react-infinite-canvas.js +2 -2
  107. package/dist/react-inline-editor.js +1 -1
  108. package/dist/react-input-group.js +1 -1
  109. package/dist/react-input.js +2 -2
  110. package/dist/react-install-prompt.js +1 -1
  111. package/dist/react-kanban-board.js +1 -1
  112. package/dist/react-keyboard-shortcut.js +2 -2
  113. package/dist/react-language-selector.js +1 -1
  114. package/dist/react-line-chart.js +49 -11
  115. package/dist/react-line-chart.js.map +2 -2
  116. package/dist/react-link-card.js +1 -1
  117. package/dist/react-live-captions.js +1 -1
  118. package/dist/react-live-cursors.js +1 -1
  119. package/dist/react-live-transcript.js +1 -1
  120. package/dist/react-location-selector.js +1 -1
  121. package/dist/react-logger.js +3 -3
  122. package/dist/react-markdown-renderer.js +2 -2
  123. package/dist/react-marquee-strip.js +1 -1
  124. package/dist/react-mascot.js +1 -1
  125. package/dist/react-mastery-bar.js +1 -1
  126. package/dist/react-mini-map.js +1 -1
  127. package/dist/react-mobile-nav.js +1 -1
  128. package/dist/react-native-select.js +52 -0
  129. package/dist/react-native-select.js.map +7 -0
  130. package/dist/react-navbar.js +1 -1
  131. package/dist/react-numbered-steps.js +1 -1
  132. package/dist/react-otp-input.js +1 -1
  133. package/dist/react-page-header.js +1 -1
  134. package/dist/react-pagination.js +1 -1
  135. package/dist/react-password-input.js +2 -2
  136. package/dist/react-payment.js +1 -1
  137. package/dist/react-popover.js +1 -1
  138. package/dist/react-pre-call-lobby.js +1 -1
  139. package/dist/react-presence-indicator.js +1 -1
  140. package/dist/react-pricing-card.js +1 -1
  141. package/dist/react-progress-display.js +1 -1
  142. package/dist/react-radial-gauge.js +1 -1
  143. package/dist/react-radio.js +1 -1
  144. package/dist/react-rating-scale.js +1 -1
  145. package/dist/react-reaction-bar.js +1 -1
  146. package/dist/react-resizable-layout.js +1 -1
  147. package/dist/react-search-bar.js +1 -1
  148. package/dist/react-section-head.js +1 -1
  149. package/dist/react-segmented-control.js +1 -1
  150. package/dist/react-select.js +1 -1
  151. package/dist/react-separator.js +1 -1
  152. package/dist/react-sheet.js +1 -1
  153. package/dist/react-sidebar.js +1 -1
  154. package/dist/react-skeleton.js +1 -1
  155. package/dist/react-skip-to-content.js +1 -1
  156. package/dist/react-slide-viewer.js +1 -1
  157. package/dist/react-slider.js +1 -1
  158. package/dist/react-slot-picker.js +1 -1
  159. package/dist/react-social-auth-button.js +3 -3
  160. package/dist/react-sortable-list.js +1 -1
  161. package/dist/react-stat-grid.js +91 -22
  162. package/dist/react-stat-grid.js.map +2 -2
  163. package/dist/react-status-indicator.js +1 -1
  164. package/dist/react-steps.js +1 -1
  165. package/dist/react-sticky-note.js +1 -1
  166. package/dist/react-switch.js +1 -1
  167. package/dist/react-table-of-contents.js +1 -1
  168. package/dist/react-table.js +148 -0
  169. package/dist/react-table.js.map +7 -0
  170. package/dist/react-tabs.js +35 -6
  171. package/dist/react-tabs.js.map +2 -2
  172. package/dist/react-terminal.js +1 -1
  173. package/dist/react-test-results.js +1 -1
  174. package/dist/react-textarea.js +1 -1
  175. package/dist/react-thread-view.js +2 -2
  176. package/dist/react-timeline.js +1 -1
  177. package/dist/react-toast.js +1 -1
  178. package/dist/react-tooltip.js +1 -1
  179. package/dist/react-version-selector.js +1 -1
  180. package/dist/react-video-grid.js +2 -2
  181. package/dist/react-video-player.js +1 -1
  182. package/dist/react-video-tile.js +2 -2
  183. package/dist/react-voice-pill.js +1 -1
  184. package/dist/react-waveform.js +1 -1
  185. package/dist/react-wizard.js +1 -1
  186. package/dist/shared.js +53 -0
  187. package/dist/shared.js.map +7 -0
  188. package/package.json +3 -1
  189. package/dist/chunk-2Q6HHFAN.js +0 -164
  190. package/dist/chunk-SDZ3LROZ.js +0 -7
  191. package/dist/faro-engine-47HGRAQH-JKINJPMH.js +0 -3
  192. /package/dist/{chunk-V24GDHUX.js.map → chunk-4ACSHPCM.js.map} +0 -0
  193. /package/dist/{chunk-SDAJVXD4.js.map → chunk-5P56PN3J.js.map} +0 -0
  194. /package/dist/{chunk-SDZ3LROZ.js.map → chunk-7P7EJ56S.js.map} +0 -0
  195. /package/dist/{chunk-QPCKJ2YR.js.map → chunk-GG6MZDGV.js.map} +0 -0
  196. /package/dist/{chunk-QDMLIDYN.js.map → chunk-GU5MI7FX.js.map} +0 -0
  197. /package/dist/{chunk-RSWOLRIC.js.map → chunk-KIZD73DK.js.map} +0 -0
  198. /package/dist/{chunk-XMFNBOPO.js.map → chunk-PY2TIFCT.js.map} +0 -0
  199. /package/dist/{chunk-3I3DYDHR.js.map → chunk-WNLYPQOS.js.map} +0 -0
  200. /package/dist/{chunk-63N4PZUJ.js.map → chunk-X6HEKRWE.js.map} +0 -0
  201. /package/dist/{chunk-WYKPPK3W.js.map → chunk-XAJDSVZR.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../command/src/command.ts", "../../command/src/command.styles.ts", "../../react-command/src/command.tsx"],
4
- "sourcesContent": ["import type { KeyboardHandlerMap } from '@refraction-ui/shared'\nimport { Keys, generateId } from '@refraction-ui/shared'\n\nexport interface CommandProps {\n /** Whether the command palette is open (controlled) */\n open?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void\n /** Custom filter function — receives item value and search query, returns true to include */\n filter?: (value: string, search: string) => boolean\n}\n\nexport interface CommandItemData {\n /** Unique identifier for the item */\n id: string\n /** Display label */\n label: string\n /** Searchable value */\n value: string\n /** Whether the item is disabled */\n disabled?: boolean\n /** Optional group the item belongs to */\n group?: string\n}\n\nexport interface CommandState {\n /** Current search query */\n search: string\n /** Items after filtering */\n filteredItems: CommandItemData[]\n /** Index of the currently highlighted item in filteredItems */\n selectedIndex: number\n /** Whether the palette is open */\n open: boolean\n}\n\nexport interface CommandAPI {\n /** Current command state */\n state: CommandState\n /** Update the search query and re-filter items */\n search(query: string): void\n /** Select the item at the given index (or the currently highlighted item) */\n select(index?: number): CommandItemData | undefined\n /** Keyboard handlers for the command palette */\n keyboardHandlers: KeyboardHandlerMap\n /** ARIA attributes for the command root */\n ariaProps: Record<string, unknown>\n /** ARIA attributes for the input */\n inputAriaProps: Record<string, unknown>\n /** ARIA attributes for the list */\n listAriaProps: Record<string, unknown>\n /** Get ARIA attributes for a specific item */\n getItemAriaProps(item: CommandItemData, index: number): Record<string, unknown>\n /** Generated IDs */\n ids: {\n root: string\n input: string\n list: string\n }\n}\n\n/** Default filter: case-insensitive includes */\nfunction defaultFilter(value: string, search: string): boolean {\n return value.toLowerCase().includes(search.toLowerCase())\n}\n\nexport function createCommand(\n props: CommandProps = {},\n items: CommandItemData[] = [],\n): CommandAPI {\n const {\n open: controlledOpen,\n onOpenChange,\n filter = defaultFilter,\n } = props\n\n const rootId = generateId('rfr-cmd')\n const inputId = generateId('rfr-cmd-input')\n const listId = generateId('rfr-cmd-list')\n\n let searchQuery = ''\n let selectedIndex = 0\n let filteredItems = [...items]\n const isOpen = controlledOpen ?? true\n\n function applyFilter(query: string): CommandItemData[] {\n if (!query) return [...items]\n return items.filter((item) => filter(item.value, query))\n }\n\n function doSearch(query: string): void {\n searchQuery = query\n filteredItems = applyFilter(query)\n selectedIndex = 0\n }\n\n function doSelect(index?: number): CommandItemData | undefined {\n const idx = index ?? selectedIndex\n const item = filteredItems[idx]\n if (!item || item.disabled) return undefined\n return item\n }\n\n const keyboardHandlers: KeyboardHandlerMap = {\n [Keys.ArrowDown]: (e) => {\n e.preventDefault()\n if (filteredItems.length > 0) {\n selectedIndex = (selectedIndex + 1) % filteredItems.length\n }\n },\n [Keys.ArrowUp]: (e) => {\n e.preventDefault()\n if (filteredItems.length > 0) {\n selectedIndex = (selectedIndex - 1 + filteredItems.length) % filteredItems.length\n }\n },\n [Keys.Enter]: (e) => {\n e.preventDefault()\n doSelect()\n },\n [Keys.Escape]: (e) => {\n e.preventDefault()\n onOpenChange?.(false)\n },\n }\n\n const ariaProps: Record<string, unknown> = {\n role: 'combobox',\n 'aria-expanded': isOpen,\n 'aria-haspopup': 'listbox',\n 'aria-owns': listId,\n id: rootId,\n }\n\n const inputAriaProps: Record<string, unknown> = {\n role: 'searchbox',\n 'aria-autocomplete': 'list',\n 'aria-controls': listId,\n id: inputId,\n }\n\n const listAriaProps: Record<string, unknown> = {\n role: 'listbox',\n id: listId,\n 'aria-label': 'Command suggestions',\n }\n\n function getItemAriaProps(item: CommandItemData, index: number): Record<string, unknown> {\n return {\n role: 'option',\n 'aria-selected': index === selectedIndex,\n 'aria-disabled': item.disabled ?? false,\n id: `${listId}-item-${item.id}`,\n }\n }\n\n return {\n get state(): CommandState {\n return {\n search: searchQuery,\n filteredItems,\n selectedIndex,\n open: isOpen,\n }\n },\n search: doSearch,\n select: doSelect,\n keyboardHandlers,\n ariaProps,\n inputAriaProps,\n listAriaProps,\n getItemAriaProps,\n ids: {\n root: rootId,\n input: inputId,\n list: listId,\n },\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const commandVariants = cva({\n base: 'flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground',\n})\n\nexport const commandInputVariants = cva({\n base: 'flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50',\n})\n\nexport const commandItemVariants = cva({\n base: 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none',\n variants: {\n state: {\n default: '',\n selected: 'bg-accent text-accent-foreground',\n disabled: 'pointer-events-none opacity-50',\n },\n },\n defaultVariants: {\n state: 'default',\n },\n})\n\nexport const commandGroupVariants = cva({\n base: 'overflow-hidden p-1 text-foreground',\n})\n", "import * as React from 'react'\nimport {\n createCommand,\n commandVariants,\n commandInputVariants,\n commandItemVariants,\n commandGroupVariants,\n type CommandProps as CoreCommandProps,\n type CommandItemData,\n} from '@refraction-ui/command'\nimport { cn, createKeyboardHandler, Keys, devWarn } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface CommandContextValue {\n search: string\n onSearch: (query: string) => void\n selectedIndex: number\n onSelect: (index: number) => void\n items: CommandItemData[]\n filteredItems: CommandItemData[]\n registerItem: (item: CommandItemData) => void\n unregisterItem: (id: string) => void\n listId: string\n inputId: string\n}\n\nconst CommandContext = React.createContext<CommandContextValue | null>(null)\n\nfunction useCommandContext(): CommandContextValue {\n const ctx = React.useContext(CommandContext)\n if (!ctx) {\n devWarn(\n 'react-command/context-outside-provider',\n 'Command compound components (CommandInput/CommandList/CommandItem/CommandGroup/etc.) must be rendered inside a <Command>. The missing CommandContext makes this throw.',\n )\n throw new Error('Command compound components must be used within <Command>')\n }\n return ctx\n}\n\n// ---------------------------------------------------------------------------\n// Command (root provider)\n// ---------------------------------------------------------------------------\n\nexport interface CommandProps {\n open?: boolean\n onOpenChange?: (open: boolean) => void\n filter?: (value: string, search: string) => boolean\n className?: string\n children?: React.ReactNode\n}\n\nexport function Command({\n open,\n onOpenChange,\n filter,\n className,\n children,\n}: CommandProps) {\n const [items, setItems] = React.useState<CommandItemData[]>([])\n const [search, setSearch] = React.useState('')\n const [selectedIndex, setSelectedIndex] = React.useState(0)\n\n const apiRef = React.useRef<ReturnType<typeof createCommand> | null>(null)\n\n // Recompute the API when items or search change\n const api = React.useMemo(() => {\n const instance = createCommand({ open, onOpenChange, filter }, items)\n if (search) {\n instance.search(search)\n }\n apiRef.current = instance\n return instance\n }, [open, onOpenChange, filter, items, search])\n\n const filteredItems = api.state.filteredItems\n\n const handleSearch = React.useCallback((query: string) => {\n setSearch(query)\n setSelectedIndex(0)\n }, [])\n\n const handleSelect = React.useCallback((index: number) => {\n setSelectedIndex(index)\n }, [])\n\n const registerItem = React.useCallback((item: CommandItemData) => {\n setItems((prev) => {\n if (prev.some((i) => i.id === item.id)) return prev\n return [...prev, item]\n })\n }, [])\n\n const unregisterItem = React.useCallback((id: string) => {\n setItems((prev) => prev.filter((i) => i.id !== id))\n }, [])\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n const handler = createKeyboardHandler({\n [Keys.ArrowDown]: (ev) => {\n ev.preventDefault()\n if (filteredItems.length > 0) {\n setSelectedIndex((prev) => (prev + 1) % filteredItems.length)\n }\n },\n [Keys.ArrowUp]: (ev) => {\n ev.preventDefault()\n if (filteredItems.length > 0) {\n setSelectedIndex((prev) => (prev - 1 + filteredItems.length) % filteredItems.length)\n }\n },\n [Keys.Enter]: (ev) => {\n ev.preventDefault()\n },\n [Keys.Escape]: (ev) => {\n ev.preventDefault()\n onOpenChange?.(false)\n },\n })\n handler(e.nativeEvent)\n },\n [filteredItems.length, onOpenChange],\n )\n\n const ctx = React.useMemo<CommandContextValue>(\n () => ({\n search,\n onSearch: handleSearch,\n selectedIndex,\n onSelect: handleSelect,\n items,\n filteredItems,\n registerItem,\n unregisterItem,\n listId: api.ids.list,\n inputId: api.ids.input,\n }),\n [search, handleSearch, selectedIndex, handleSelect, items, filteredItems, registerItem, unregisterItem, api.ids.list, api.ids.input],\n )\n\n return React.createElement(\n CommandContext.Provider,\n { value: ctx },\n React.createElement(\n 'div',\n {\n className: cn(commandVariants(), className),\n ...api.ariaProps,\n onKeyDown: handleKeyDown,\n },\n children,\n ),\n )\n}\n\n// ---------------------------------------------------------------------------\n// CommandInput\n// ---------------------------------------------------------------------------\n\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nexport const CommandInput = React.forwardRef<HTMLInputElement, CommandInputProps>(\n function CommandInput({ className, onChange, ...props }, ref) {\n const { search, onSearch, inputId, listId } = useCommandContext()\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onSearch(e.target.value)\n onChange?.(e)\n }\n\n return React.createElement('input', {\n ref,\n id: inputId,\n type: 'text',\n role: 'searchbox',\n 'aria-autocomplete': 'list',\n 'aria-controls': listId,\n value: search,\n onChange: handleChange,\n className: cn(commandInputVariants(), className),\n ...props,\n })\n },\n)\n\n// ---------------------------------------------------------------------------\n// CommandList\n// ---------------------------------------------------------------------------\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const CommandList = React.forwardRef<HTMLDivElement, CommandListProps>(\n function CommandList({ className, children, ...props }, ref) {\n const { listId } = useCommandContext()\n\n return React.createElement(\n 'div',\n {\n ref,\n id: listId,\n role: 'listbox',\n 'aria-label': 'Command suggestions',\n className: cn('max-h-[300px] overflow-y-auto overflow-x-hidden', className),\n ...props,\n },\n children,\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// CommandEmpty\n// ---------------------------------------------------------------------------\n\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const CommandEmpty = React.forwardRef<HTMLDivElement, CommandEmptyProps>(\n function CommandEmpty({ className, children, ...props }, ref) {\n const { filteredItems } = useCommandContext()\n\n if (filteredItems.length > 0) return null\n\n return React.createElement(\n 'div',\n {\n ref,\n className: cn('py-6 text-center text-sm', className),\n role: 'presentation',\n ...props,\n },\n children,\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// CommandGroup\n// ---------------------------------------------------------------------------\n\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n heading?: string\n}\n\nexport const CommandGroup = React.forwardRef<HTMLDivElement, CommandGroupProps>(\n function CommandGroup({ className, heading, children, ...props }, ref) {\n return React.createElement(\n 'div',\n {\n ref,\n className: cn(commandGroupVariants(), className),\n role: 'group',\n 'aria-label': heading,\n ...props,\n },\n heading\n ? React.createElement(\n 'div',\n { className: 'px-2 py-1.5 text-xs font-medium text-muted-foreground' },\n heading,\n )\n : null,\n children,\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// CommandItem\n// ---------------------------------------------------------------------------\n\nexport interface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n value?: string\n disabled?: boolean\n onSelect?: () => void\n}\n\nexport const CommandItem = React.forwardRef<HTMLDivElement, CommandItemProps>(\n function CommandItem({ className, value, disabled, onSelect: onItemSelect, children, ...props }, ref) {\n const state = disabled ? 'disabled' : 'default'\n\n return React.createElement(\n 'div',\n {\n ref,\n role: 'option',\n 'aria-selected': false,\n 'aria-disabled': disabled ?? false,\n 'data-value': value,\n className: cn(commandItemVariants({ state }), className),\n onClick: () => {\n if (!disabled) {\n onItemSelect?.()\n }\n },\n ...props,\n },\n children,\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// CommandSeparator\n// ---------------------------------------------------------------------------\n\nexport interface CommandSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const CommandSeparator = React.forwardRef<HTMLDivElement, CommandSeparatorProps>(\n function CommandSeparator({ className, ...props }, ref) {\n return React.createElement('div', {\n ref,\n role: 'separator',\n className: cn('-mx-1 h-px bg-border', className),\n ...props,\n })\n },\n)\n"],
5
- "mappings": "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",
6
- "names": ["CommandInput", "CommandList", "CommandEmpty", "CommandGroup", "CommandItem", "CommandSeparator"]
4
+ "sourcesContent": ["import type { KeyboardHandlerMap } from '@refraction-ui/shared'\nimport { Keys, generateId } from '@refraction-ui/shared'\n\nexport interface CommandProps {\n /** Whether the command palette is open (controlled) */\n open?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void\n /** Custom filter function — receives item value and search query, returns true to include */\n filter?: (value: string, search: string) => boolean\n}\n\nexport interface CommandItemData {\n /** Unique identifier for the item */\n id: string\n /** Display label */\n label: string\n /** Searchable value */\n value: string\n /** Whether the item is disabled */\n disabled?: boolean\n /** Optional group the item belongs to */\n group?: string\n}\n\nexport interface CommandState {\n /** Current search query */\n search: string\n /** Items after filtering */\n filteredItems: CommandItemData[]\n /** Index of the currently highlighted item in filteredItems */\n selectedIndex: number\n /** Whether the palette is open */\n open: boolean\n}\n\nexport interface CommandAPI {\n /** Current command state */\n state: CommandState\n /** Update the search query and re-filter items */\n search(query: string): void\n /** Select the item at the given index (or the currently highlighted item) */\n select(index?: number): CommandItemData | undefined\n /** Keyboard handlers for the command palette */\n keyboardHandlers: KeyboardHandlerMap\n /** ARIA attributes for the command root */\n ariaProps: Record<string, unknown>\n /** ARIA attributes for the input */\n inputAriaProps: Record<string, unknown>\n /** ARIA attributes for the list */\n listAriaProps: Record<string, unknown>\n /** Get ARIA attributes for a specific item */\n getItemAriaProps(item: CommandItemData, index: number): Record<string, unknown>\n /** Generated IDs */\n ids: {\n root: string\n input: string\n list: string\n }\n}\n\n/** Default filter: case-insensitive includes */\nfunction defaultFilter(value: string, search: string): boolean {\n return value.toLowerCase().includes(search.toLowerCase())\n}\n\nexport function createCommand(\n props: CommandProps = {},\n items: CommandItemData[] = [],\n): CommandAPI {\n const {\n open: controlledOpen,\n onOpenChange,\n filter = defaultFilter,\n } = props\n\n const rootId = generateId('rfr-cmd')\n const inputId = generateId('rfr-cmd-input')\n const listId = generateId('rfr-cmd-list')\n\n let searchQuery = ''\n let selectedIndex = 0\n let filteredItems = [...items]\n const isOpen = controlledOpen ?? true\n\n function applyFilter(query: string): CommandItemData[] {\n if (!query) return [...items]\n return items.filter((item) => filter(item.value, query))\n }\n\n function doSearch(query: string): void {\n searchQuery = query\n filteredItems = applyFilter(query)\n selectedIndex = 0\n }\n\n function doSelect(index?: number): CommandItemData | undefined {\n const idx = index ?? selectedIndex\n const item = filteredItems[idx]\n if (!item || item.disabled) return undefined\n return item\n }\n\n const keyboardHandlers: KeyboardHandlerMap = {\n [Keys.ArrowDown]: (e) => {\n e.preventDefault()\n if (filteredItems.length > 0) {\n selectedIndex = (selectedIndex + 1) % filteredItems.length\n }\n },\n [Keys.ArrowUp]: (e) => {\n e.preventDefault()\n if (filteredItems.length > 0) {\n selectedIndex = (selectedIndex - 1 + filteredItems.length) % filteredItems.length\n }\n },\n [Keys.Enter]: (e) => {\n e.preventDefault()\n doSelect()\n },\n [Keys.Escape]: (e) => {\n e.preventDefault()\n onOpenChange?.(false)\n },\n }\n\n const ariaProps: Record<string, unknown> = {\n role: 'combobox',\n 'aria-expanded': isOpen,\n 'aria-haspopup': 'listbox',\n 'aria-owns': listId,\n id: rootId,\n }\n\n const inputAriaProps: Record<string, unknown> = {\n role: 'searchbox',\n 'aria-autocomplete': 'list',\n 'aria-controls': listId,\n id: inputId,\n }\n\n const listAriaProps: Record<string, unknown> = {\n role: 'listbox',\n id: listId,\n 'aria-label': 'Command suggestions',\n }\n\n function getItemAriaProps(item: CommandItemData, index: number): Record<string, unknown> {\n return {\n role: 'option',\n 'aria-selected': index === selectedIndex,\n 'aria-disabled': item.disabled ?? false,\n id: `${listId}-item-${item.id}`,\n }\n }\n\n return {\n get state(): CommandState {\n return {\n search: searchQuery,\n filteredItems,\n selectedIndex,\n open: isOpen,\n }\n },\n search: doSearch,\n select: doSelect,\n keyboardHandlers,\n ariaProps,\n inputAriaProps,\n listAriaProps,\n getItemAriaProps,\n ids: {\n root: rootId,\n input: inputId,\n list: listId,\n },\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const commandVariants = cva({\n base: 'flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground',\n})\n\nexport const commandInputVariants = cva({\n base: 'flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50',\n})\n\nexport const commandItemVariants = cva({\n base: 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none',\n variants: {\n state: {\n default: '',\n selected: 'bg-accent text-accent-foreground',\n disabled: 'pointer-events-none opacity-50',\n },\n },\n defaultVariants: {\n state: 'default',\n },\n})\n\nexport const commandGroupVariants = cva({\n base: 'overflow-hidden p-1 text-foreground',\n})\n", "import * as React from 'react'\nimport {\n createCommand,\n commandVariants,\n commandInputVariants,\n commandItemVariants,\n commandGroupVariants,\n type CommandProps as CoreCommandProps,\n type CommandItemData,\n} from '@refraction-ui/command'\nimport { cn, createKeyboardHandler, Keys, devWarn } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\n/** What a mounted CommandItem tells the root about itself. */\ninterface RegisteredItem {\n domId: string\n disabled: boolean\n select: () => void\n}\n\ninterface CommandContextValue {\n search: string\n onSearch: (query: string) => void\n selectedIndex: number\n onSelect: (index: number) => void\n items: CommandItemData[]\n filteredItems: CommandItemData[]\n /** Whether a value passes the current search. */\n matches: (value: string) => boolean\n registerItem: (value: string, item: RegisteredItem) => void\n unregisterItem: (value: string) => void\n /** DOM id of the highlighted item, for aria-activedescendant. */\n activeDescendant: string | undefined\n listId: string\n inputId: string\n}\n\nconst CommandContext = React.createContext<CommandContextValue | null>(null)\n\nfunction useCommandContext(): CommandContextValue {\n const ctx = React.useContext(CommandContext)\n if (!ctx) {\n devWarn(\n 'react-command/context-outside-provider',\n 'Command compound components (CommandInput/CommandList/CommandItem/CommandGroup/etc.) must be rendered inside a <Command>. The missing CommandContext makes this throw.',\n )\n throw new Error('Command compound components must be used within <Command>')\n }\n return ctx\n}\n\n/** An item's searchable value: its `value` prop, else its text children. */\nfunction itemValueOf(value: string | undefined, children: React.ReactNode): string {\n if (value !== undefined) return value\n if (typeof children === 'string' || typeof children === 'number') return String(children)\n return ''\n}\n\n/**\n * Collect the CommandItems present in the element tree, in order, so the\n * root knows its items on the first (and server) render. Items inside custom\n * components are not visible here; they are added when they mount.\n */\nfunction collectItems(node: React.ReactNode, into: CommandItemData[]): CommandItemData[] {\n React.Children.forEach(node, (child) => {\n if (!React.isValidElement<{ value?: string; disabled?: boolean; children?: React.ReactNode }>(child)) return\n if (child.type === CommandItem) {\n const value = itemValueOf(child.props.value, child.props.children)\n into.push({ id: value, value, label: value, disabled: child.props.disabled })\n return\n }\n collectItems(child.props.children, into)\n })\n return into\n}\n\nconst defaultFilter = (value: string, search: string) =>\n value.toLowerCase().includes(search.toLowerCase())\n\n// ---------------------------------------------------------------------------\n// Command (root provider)\n// ---------------------------------------------------------------------------\n\nexport interface CommandProps {\n open?: boolean\n onOpenChange?: (open: boolean) => void\n /** Custom filter — receives an item value and the search, returns true to keep it. */\n filter?: (value: string, search: string) => boolean\n className?: string\n children?: React.ReactNode\n}\n\nexport function Command({\n open,\n onOpenChange,\n filter = defaultFilter,\n className,\n children,\n}: CommandProps) {\n const [registered, setRegistered] = React.useState<ReadonlyMap<string, RegisteredItem>>(() => new Map())\n const [search, setSearch] = React.useState('')\n const [selectedIndex, setSelectedIndex] = React.useState(0)\n\n // Stable across renders and SSR-safe; keeps the rfr-cmd-* prefixes.\n const uid = React.useId().replace(/:/g, '')\n const listId = `rfr-cmd-list-${uid}`\n const inputId = `rfr-cmd-input-${uid}`\n const api = React.useMemo(() => createCommand({ open, onOpenChange, filter }), [open, onOpenChange, filter])\n\n const items = React.useMemo(() => {\n const all = collectItems(children, [])\n const known = new Set(all.map((i) => i.value))\n for (const [value, item] of registered) {\n if (!known.has(value)) all.push({ id: value, value, label: value, disabled: item.disabled })\n }\n return all\n }, [children, registered])\n\n const matches = React.useCallback((value: string) => !search || filter(value, search), [filter, search])\n const filteredItems = React.useMemo(() => items.filter((i) => matches(i.value)), [items, matches])\n const highlighted = filteredItems[selectedIndex]\n\n const handleSearch = React.useCallback((query: string) => {\n setSearch(query)\n setSelectedIndex(0)\n }, [])\n\n const handleSelect = React.useCallback((index: number) => {\n setSelectedIndex(index)\n }, [])\n\n const registerItem = React.useCallback((value: string, item: RegisteredItem) => {\n setRegistered((prev) => {\n const current = prev.get(value)\n if (current && current.domId === item.domId && current.disabled === item.disabled) return prev\n const next = new Map(prev)\n next.set(value, item)\n return next\n })\n }, [])\n\n const unregisterItem = React.useCallback((value: string) => {\n setRegistered((prev) => {\n if (!prev.has(value)) return prev\n const next = new Map(prev)\n next.delete(value)\n return next\n })\n }, [])\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n const count = filteredItems.length\n const handler = createKeyboardHandler({\n [Keys.ArrowDown]: (ev) => {\n ev.preventDefault()\n if (count > 0) setSelectedIndex((prev) => (prev + 1) % count)\n },\n [Keys.ArrowUp]: (ev) => {\n ev.preventDefault()\n if (count > 0) setSelectedIndex((prev) => (prev - 1 + count) % count)\n },\n [Keys.Enter]: (ev) => {\n ev.preventDefault()\n if (highlighted && !highlighted.disabled) registered.get(highlighted.value)?.select()\n },\n [Keys.Escape]: (ev) => {\n ev.preventDefault()\n onOpenChange?.(false)\n },\n })\n handler(e.nativeEvent)\n }\n\n const ctx: CommandContextValue = {\n search,\n onSearch: handleSearch,\n selectedIndex,\n onSelect: handleSelect,\n items,\n filteredItems,\n matches,\n registerItem,\n unregisterItem,\n activeDescendant: highlighted ? registered.get(highlighted.value)?.domId : undefined,\n listId,\n inputId,\n }\n\n return React.createElement(\n CommandContext.Provider,\n { value: ctx },\n React.createElement(\n 'div',\n {\n className: cn(commandVariants(), className),\n ...api.ariaProps,\n 'aria-owns': listId,\n id: `rfr-cmd-${uid}`,\n onKeyDown: handleKeyDown,\n },\n children,\n ),\n )\n}\n\n// ---------------------------------------------------------------------------\n// CommandInput\n// ---------------------------------------------------------------------------\n\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nexport const CommandInput = React.forwardRef<HTMLInputElement, CommandInputProps>(\n function CommandInput({ className, onChange, ...props }, ref) {\n const { search, onSearch, inputId, listId, activeDescendant } = useCommandContext()\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onSearch(e.target.value)\n onChange?.(e)\n }\n\n return React.createElement('input', {\n ref,\n id: inputId,\n type: 'text',\n role: 'searchbox',\n 'aria-autocomplete': 'list',\n 'aria-controls': listId,\n 'aria-activedescendant': activeDescendant,\n value: search,\n onChange: handleChange,\n className: cn(commandInputVariants(), className),\n ...props,\n })\n },\n)\n\n// ---------------------------------------------------------------------------\n// CommandList\n// ---------------------------------------------------------------------------\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const CommandList = React.forwardRef<HTMLDivElement, CommandListProps>(\n function CommandList({ className, children, ...props }, ref) {\n const { listId } = useCommandContext()\n\n return React.createElement(\n 'div',\n {\n ref,\n id: listId,\n role: 'listbox',\n 'aria-label': 'Command suggestions',\n className: cn('max-h-[300px] overflow-y-auto overflow-x-hidden', className),\n ...props,\n },\n children,\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// CommandEmpty\n// ---------------------------------------------------------------------------\n\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const CommandEmpty = React.forwardRef<HTMLDivElement, CommandEmptyProps>(\n function CommandEmpty({ className, children, ...props }, ref) {\n const { filteredItems } = useCommandContext()\n\n if (filteredItems.length > 0) return null\n\n return React.createElement(\n 'div',\n {\n ref,\n className: cn('py-6 text-center text-sm', className),\n role: 'presentation',\n ...props,\n },\n children,\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// CommandGroup\n// ---------------------------------------------------------------------------\n\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n heading?: string\n}\n\nexport const CommandGroup = React.forwardRef<HTMLDivElement, CommandGroupProps>(\n function CommandGroup({ className, heading, children, ...props }, ref) {\n return React.createElement(\n 'div',\n {\n ref,\n className: cn(commandGroupVariants(), className),\n role: 'group',\n 'aria-label': heading,\n ...props,\n },\n heading\n ? React.createElement(\n 'div',\n { className: 'px-2 py-1.5 text-xs font-medium text-muted-foreground' },\n heading,\n )\n : null,\n children,\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// CommandItem\n// ---------------------------------------------------------------------------\n\nexport interface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n value?: string\n disabled?: boolean\n onSelect?: () => void\n}\n\nexport const CommandItem = React.forwardRef<HTMLDivElement, CommandItemProps>(\n function CommandItem(\n { className, value, disabled = false, onSelect: onItemSelect, onClick, onMouseMove, children, ...props },\n ref,\n ) {\n const { matches, filteredItems, selectedIndex, onSelect, registerItem, unregisterItem } =\n useCommandContext()\n const itemValue = itemValueOf(value, children)\n const domId = `rfr-cmd-item-${React.useId().replace(/:/g, '')}`\n\n // Latest onSelect without re-registering on every render.\n const onSelectRef = React.useRef(onItemSelect)\n onSelectRef.current = onItemSelect\n\n React.useEffect(() => {\n registerItem(itemValue, { domId, disabled, select: () => onSelectRef.current?.() })\n }, [registerItem, itemValue, domId, disabled])\n React.useEffect(() => () => unregisterItem(itemValue), [unregisterItem, itemValue])\n\n if (!matches(itemValue)) return null\n\n const index = filteredItems.findIndex((i) => i.value === itemValue)\n const isSelected = index !== -1 && index === selectedIndex\n const state = disabled ? 'disabled' : isSelected ? 'selected' : 'default'\n\n return React.createElement(\n 'div',\n {\n ref,\n id: domId,\n role: 'option',\n 'aria-selected': isSelected,\n 'aria-disabled': disabled,\n 'data-value': itemValue,\n 'data-selected': isSelected ? '' : undefined,\n className: cn(commandItemVariants({ state }), className),\n onClick: (e: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(e)\n if (!disabled && !e.defaultPrevented) onItemSelect?.()\n },\n onMouseMove: (e: React.MouseEvent<HTMLDivElement>) => {\n onMouseMove?.(e)\n if (index !== -1 && index !== selectedIndex) onSelect(index)\n },\n ...props,\n },\n children,\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// CommandSeparator\n// ---------------------------------------------------------------------------\n\nexport interface CommandSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const CommandSeparator = React.forwardRef<HTMLDivElement, CommandSeparatorProps>(\n function CommandSeparator({ className, ...props }, ref) {\n return React.createElement('div', {\n ref,\n role: 'separator',\n className: cn('-mx-1 h-px bg-border', className),\n ...props,\n })\n },\n)\n"],
5
+ "mappings": ";;;;;;;;;;;;;AA8DA,SAAS,cAAc,OAAe,QAAyB;AAC7D,SAAO,MAAM,YAAA,EAAc,SAAS,OAAO,YAAA,CAAa;AAC1D;AAEO,SAAS,cACd,QAAsB,CAAA,GACtB,QAA2B,CAAA,GACf;AACZ,QAAM;IACJ,MAAM;IACN;IACA,SAAS;EAAA,IACP;AAEJ,QAAM,SAAS,WAAW,SAAS;AACnC,QAAM,UAAU,WAAW,eAAe;AAC1C,QAAM,SAAS,WAAW,cAAc;AAExC,MAAI,cAAc;AAClB,MAAI,gBAAgB;AACpB,MAAI,gBAAgB,CAAC,GAAG,KAAK;AAC7B,QAAM,SAAS,kBAAkB;AAEjC,WAAS,YAAY,OAAkC;AACrD,QAAI,CAAC,MAAO,QAAO,CAAC,GAAG,KAAK;AAC5B,WAAO,MAAM,OAAO,CAAC,SAAS,OAAO,KAAK,OAAO,KAAK,CAAC;EACzD;AAEA,WAAS,SAAS,OAAqB;AACrC,kBAAc;AACd,oBAAgB,YAAY,KAAK;AACjC,oBAAgB;EAClB;AAEA,WAAS,SAAS,OAA6C;AAC7D,UAAM,MAAM,SAAS;AACrB,UAAM,OAAO,cAAc,GAAG;AAC9B,QAAI,CAAC,QAAQ,KAAK,SAAU,QAAO;AACnC,WAAO;EACT;AAEA,QAAM,mBAAuC;IAC3C,CAAC,KAAK,SAAS,GAAG,CAAC,MAAM;AACvB,QAAE,eAAA;AACF,UAAI,cAAc,SAAS,GAAG;AAC5B,yBAAiB,gBAAgB,KAAK,cAAc;MACtD;IACF;IACA,CAAC,KAAK,OAAO,GAAG,CAAC,MAAM;AACrB,QAAE,eAAA;AACF,UAAI,cAAc,SAAS,GAAG;AAC5B,yBAAiB,gBAAgB,IAAI,cAAc,UAAU,cAAc;MAC7E;IACF;IACA,CAAC,KAAK,KAAK,GAAG,CAAC,MAAM;AACnB,QAAE,eAAA;AACF,eAAA;IACF;IACA,CAAC,KAAK,MAAM,GAAG,CAAC,MAAM;AACpB,QAAE,eAAA;AACF,qBAAe,KAAK;IACtB;EAAA;AAGF,QAAM,YAAqC;IACzC,MAAM;IACN,iBAAiB;IACjB,iBAAiB;IACjB,aAAa;IACb,IAAI;EAAA;AAGN,QAAM,iBAA0C;IAC9C,MAAM;IACN,qBAAqB;IACrB,iBAAiB;IACjB,IAAI;EAAA;AAGN,QAAM,gBAAyC;IAC7C,MAAM;IACN,IAAI;IACJ,cAAc;EAAA;AAGhB,WAAS,iBAAiB,MAAuB,OAAwC;AACvF,WAAO;MACL,MAAM;MACN,iBAAiB,UAAU;MAC3B,iBAAiB,KAAK,YAAY;MAClC,IAAI,GAAG,MAAM,SAAS,KAAK,EAAE;IAAA;EAEjC;AAEA,SAAO;IACL,IAAI,QAAsB;AACxB,aAAO;QACL,QAAQ;QACR;QACA;QACA,MAAM;MAAA;IAEV;IACA,QAAQ;IACR,QAAQ;IACR;IACA;IACA;IACA;IACA;IACA,KAAK;MACH,MAAM;MACN,OAAO;MACP,MAAM;IAAA;EACR;AAEJ;AChLO,IAAM,kBAAkB,IAAI;EACjC,MAAM;AACR,CAAC;AAEM,IAAM,uBAAuB,IAAI;EACtC,MAAM;AACR,CAAC;AAEM,IAAM,sBAAsB,IAAI;EACrC,MAAM;EACN,UAAU;IACR,OAAO;MACL,SAAS;MACT,UAAU;MACV,UAAU;IAAA;EACZ;EAEF,iBAAiB;IACf,OAAO;EAAA;AAEX,CAAC;AAEM,IAAM,uBAAuB,IAAI;EACtC,MAAM;AACR,CAAC;;;ACcD,IAAM,iBAAuB,oBAA0C,IAAI;AAE3E,SAAS,oBAAyC;AAChD,QAAM,MAAY,iBAAW,cAAc;AAC3C,MAAI,CAAC,KAAK;AACR;MACE;MACA;IAAA;AAEF,UAAM,IAAI,MAAM,2DAA2D;EAC7E;AACA,SAAO;AACT;AAGA,SAAS,YAAY,OAA2B,UAAmC;AACjF,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,OAAO,aAAa,YAAY,OAAO,aAAa,SAAU,QAAO,OAAO,QAAQ;AACxF,SAAO;AACT;AAOA,SAAS,aAAa,MAAuB,MAA4C;AACjF,EAAA,eAAS,QAAQ,MAAM,CAAC,UAAU;AACtC,QAAI,CAAO,qBAAmF,KAAK,EAAG;AACtG,QAAI,MAAM,SAAS,aAAa;AAC9B,YAAM,QAAQ,YAAY,MAAM,MAAM,OAAO,MAAM,MAAM,QAAQ;AACjE,WAAK,KAAK,EAAE,IAAI,OAAO,OAAO,OAAO,OAAO,UAAU,MAAM,MAAM,SAAA,CAAU;AAC5E;IACF;AACA,iBAAa,MAAM,MAAM,UAAU,IAAI;EACzC,CAAC;AACD,SAAO;AACT;AAEA,IAAMA,iBAAgB,CAAC,OAAe,WACpC,MAAM,YAAA,EAAc,SAAS,OAAO,YAAA,CAAa;AAe5C,SAAS,QAAQ;EACtB;EACA;EACA,SAASA;EACT;EACA;AACF,GAAiB;AACf,QAAM,CAAC,YAAY,aAAa,IAAU,eAA8C,MAAM,oBAAI,IAAA,CAAK;AACvG,QAAM,CAAC,QAAQ,SAAS,IAAU,eAAS,EAAE;AAC7C,QAAM,CAAC,eAAe,gBAAgB,IAAU,eAAS,CAAC;AAG1D,QAAM,MAAY,YAAA,EAAQ,QAAQ,MAAM,EAAE;AAC1C,QAAM,SAAS,gBAAgB,GAAG;AAClC,QAAM,UAAU,iBAAiB,GAAG;AACpC,QAAM,MAAY,cAAQ,MAAM,cAAc,EAAE,MAAM,cAAc,OAAA,CAAQ,GAAG,CAAC,MAAM,cAAc,MAAM,CAAC;AAE3G,QAAM,QAAc,cAAQ,MAAM;AAChC,UAAM,MAAM,aAAa,UAAU,CAAA,CAAE;AACrC,UAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAC7C,eAAW,CAAC,OAAO,IAAI,KAAK,YAAY;AACtC,UAAI,CAAC,MAAM,IAAI,KAAK,EAAA,KAAO,KAAK,EAAE,IAAI,OAAO,OAAO,OAAO,OAAO,UAAU,KAAK,SAAA,CAAU;IAC7F;AACA,WAAO;EACT,GAAG,CAAC,UAAU,UAAU,CAAC;AAEzB,QAAM,UAAgB,kBAAY,CAAC,UAAkB,CAAC,UAAU,OAAO,OAAO,MAAM,GAAG,CAAC,QAAQ,MAAM,CAAC;AACvG,QAAM,gBAAsB,cAAQ,MAAM,MAAM,OAAO,CAAC,MAAM,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC;AACjG,QAAM,cAAc,cAAc,aAAa;AAE/C,QAAM,eAAqB,kBAAY,CAAC,UAAkB;AACxD,cAAU,KAAK;AACf,qBAAiB,CAAC;EACpB,GAAG,CAAA,CAAE;AAEL,QAAM,eAAqB,kBAAY,CAAC,UAAkB;AACxD,qBAAiB,KAAK;EACxB,GAAG,CAAA,CAAE;AAEL,QAAM,eAAqB,kBAAY,CAAC,OAAe,SAAyB;AAC9E,kBAAc,CAAC,SAAS;AACtB,YAAM,UAAU,KAAK,IAAI,KAAK;AAC9B,UAAI,WAAW,QAAQ,UAAU,KAAK,SAAS,QAAQ,aAAa,KAAK,SAAU,QAAO;AAC1F,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,WAAK,IAAI,OAAO,IAAI;AACpB,aAAO;IACT,CAAC;EACH,GAAG,CAAA,CAAE;AAEL,QAAM,iBAAuB,kBAAY,CAAC,UAAkB;AAC1D,kBAAc,CAAC,SAAS;AACtB,UAAI,CAAC,KAAK,IAAI,KAAK,EAAG,QAAO;AAC7B,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,WAAK,OAAO,KAAK;AACjB,aAAO;IACT,CAAC;EACH,GAAG,CAAA,CAAE;AAEL,QAAM,gBAAgB,CAAC,MAA2B;AAChD,UAAM,QAAQ,cAAc;AAC5B,UAAM,UAAU,sBAAsB;MACpC,CAAC,KAAK,SAAS,GAAG,CAAC,OAAO;AACxB,WAAG,eAAA;AACH,YAAI,QAAQ,EAAG,kBAAiB,CAAC,UAAU,OAAO,KAAK,KAAK;MAC9D;MACA,CAAC,KAAK,OAAO,GAAG,CAAC,OAAO;AACtB,WAAG,eAAA;AACH,YAAI,QAAQ,EAAG,kBAAiB,CAAC,UAAU,OAAO,IAAI,SAAS,KAAK;MACtE;MACA,CAAC,KAAK,KAAK,GAAG,CAAC,OAAO;AACpB,WAAG,eAAA;AACH,YAAI,eAAe,CAAC,YAAY,SAAA,YAAqB,IAAI,YAAY,KAAK,GAAG,OAAA;MAC/E;MACA,CAAC,KAAK,MAAM,GAAG,CAAC,OAAO;AACrB,WAAG,eAAA;AACH,uBAAe,KAAK;MACtB;IAAA,CACD;AACD,YAAQ,EAAE,WAAW;EACvB;AAEA,QAAM,MAA2B;IAC/B;IACA,UAAU;IACV;IACA,UAAU;IACV;IACA;IACA;IACA;IACA;IACA,kBAAkB,cAAc,WAAW,IAAI,YAAY,KAAK,GAAG,QAAQ;IAC3E;IACA;EAAA;AAGF,SAAa;IACX,eAAe;IACf,EAAE,OAAO,IAAA;IACH;MACJ;MACA;QACE,WAAW,GAAG,gBAAA,GAAmB,SAAS;QAC1C,GAAG,IAAI;QACP,aAAa;QACb,IAAI,WAAW,GAAG;QAClB,WAAW;MAAA;MAEb;IAAA;EACF;AAEJ;AAQO,IAAM,eAAqB;EAChC,SAASC,cAAa,EAAE,WAAW,UAAU,GAAG,MAAA,GAAS,KAAK;AAC5D,UAAM,EAAE,QAAQ,UAAU,SAAS,QAAQ,iBAAA,IAAqB,kBAAA;AAEhE,UAAM,eAAe,CAAC,MAA2C;AAC/D,eAAS,EAAE,OAAO,KAAK;AACvB,iBAAW,CAAC;IACd;AAEA,WAAa,oBAAc,SAAS;MAClC;MACA,IAAI;MACJ,MAAM;MACN,MAAM;MACN,qBAAqB;MACrB,iBAAiB;MACjB,yBAAyB;MACzB,OAAO;MACP,UAAU;MACV,WAAW,GAAG,qBAAA,GAAwB,SAAS;MAC/C,GAAG;IAAA,CACJ;EACH;AACF;AAQO,IAAM,cAAoB;EAC/B,SAASC,aAAY,EAAE,WAAW,UAAU,GAAG,MAAA,GAAS,KAAK;AAC3D,UAAM,EAAE,OAAA,IAAW,kBAAA;AAEnB,WAAa;MACX;MACA;QACE;QACA,IAAI;QACJ,MAAM;QACN,cAAc;QACd,WAAW,GAAG,mDAAmD,SAAS;QAC1E,GAAG;MAAA;MAEL;IAAA;EAEJ;AACF;AAQO,IAAM,eAAqB;EAChC,SAASC,cAAa,EAAE,WAAW,UAAU,GAAG,MAAA,GAAS,KAAK;AAC5D,UAAM,EAAE,cAAA,IAAkB,kBAAA;AAE1B,QAAI,cAAc,SAAS,EAAG,QAAO;AAErC,WAAa;MACX;MACA;QACE;QACA,WAAW,GAAG,4BAA4B,SAAS;QACnD,MAAM;QACN,GAAG;MAAA;MAEL;IAAA;EAEJ;AACF;AAUO,IAAM,eAAqB;EAChC,SAASC,cAAa,EAAE,WAAW,SAAS,UAAU,GAAG,MAAA,GAAS,KAAK;AACrE,WAAa;MACX;MACA;QACE;QACA,WAAW,GAAG,qBAAA,GAAwB,SAAS;QAC/C,MAAM;QACN,cAAc;QACd,GAAG;MAAA;MAEL,UACU;QACJ;QACA,EAAE,WAAW,wDAAA;QACb;MAAA,IAEF;MACJ;IAAA;EAEJ;AACF;AAYO,IAAM,cAAoB;EAC/B,SAASC,aACP,EAAE,WAAW,OAAO,WAAW,OAAO,UAAU,cAAc,SAAS,aAAa,UAAU,GAAG,MAAA,GACjG,KACA;AACA,UAAM,EAAE,SAAS,eAAe,eAAe,UAAU,cAAc,eAAA,IACrE,kBAAA;AACF,UAAM,YAAY,YAAY,OAAO,QAAQ;AAC7C,UAAM,QAAQ,gBAAsB,YAAA,EAAQ,QAAQ,MAAM,EAAE,CAAC;AAG7D,UAAM,cAAoB,aAAO,YAAY;AAC7C,gBAAY,UAAU;AAEhB,IAAA,gBAAU,MAAM;AACpB,mBAAa,WAAW,EAAE,OAAO,UAAU,QAAQ,MAAM,YAAY,UAAA,EAAU,CAAG;IACpF,GAAG,CAAC,cAAc,WAAW,OAAO,QAAQ,CAAC;AACvC,IAAA,gBAAU,MAAM,MAAM,eAAe,SAAS,GAAG,CAAC,gBAAgB,SAAS,CAAC;AAElF,QAAI,CAAC,QAAQ,SAAS,EAAG,QAAO;AAEhC,UAAM,QAAQ,cAAc,UAAU,CAAC,MAAM,EAAE,UAAU,SAAS;AAClE,UAAM,aAAa,UAAU,MAAM,UAAU;AAC7C,UAAM,QAAQ,WAAW,aAAa,aAAa,aAAa;AAEhE,WAAa;MACX;MACA;QACE;QACA,IAAI;QACJ,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,cAAc;QACd,iBAAiB,aAAa,KAAK;QACnC,WAAW,GAAG,oBAAoB,EAAE,MAAA,CAAO,GAAG,SAAS;QACvD,SAAS,CAAC,MAAwC;AAChD,oBAAU,CAAC;AACX,cAAI,CAAC,YAAY,CAAC,EAAE,iBAAkB,gBAAA;QACxC;QACA,aAAa,CAAC,MAAwC;AACpD,wBAAc,CAAC;AACf,cAAI,UAAU,MAAM,UAAU,cAAA,UAAwB,KAAK;QAC7D;QACA,GAAG;MAAA;MAEL;IAAA;EAEJ;AACF;AAQO,IAAM,mBAAyB;EACpC,SAASC,kBAAiB,EAAE,WAAW,GAAG,MAAA,GAAS,KAAK;AACtD,WAAa,oBAAc,OAAO;MAChC;MACA,MAAM;MACN,WAAW,GAAG,wBAAwB,SAAS;MAC/C,GAAG;IAAA,CACJ;EACH;AACF;",
6
+ "names": ["defaultFilter", "CommandInput", "CommandList", "CommandEmpty", "CommandGroup", "CommandItem", "CommandSeparator"]
7
7
  }
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  detectEmojiShortcode,
3
3
  detectTriggerInText
4
- } from "./chunk-QPCKJ2YR.js";
4
+ } from "./chunk-GG6MZDGV.js";
5
5
  import {
6
6
  searchEmojis
7
- } from "./chunk-3I3DYDHR.js";
7
+ } from "./chunk-WNLYPQOS.js";
8
8
  import {
9
9
  cn,
10
10
  cva,
11
11
  generateId,
12
12
  prefersReducedMotion
13
- } from "./chunk-2Q6HHFAN.js";
13
+ } from "./chunk-75BKRTPO.js";
14
14
 
15
15
  // ../react-composer/dist/index.js
16
16
  import * as React2 from "react";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-content-protection/dist/index.js
7
7
  import * as React from "react";
@@ -1,18 +1,18 @@
1
1
  import {
2
2
  formatRelativeTime,
3
3
  formatTimestamp
4
- } from "./chunk-XMFNBOPO.js";
4
+ } from "./chunk-PY2TIFCT.js";
5
5
  import {
6
6
  MarkdownRenderer
7
- } from "./chunk-SDAJVXD4.js";
7
+ } from "./chunk-5P56PN3J.js";
8
8
  import {
9
9
  detectTriggerInText
10
- } from "./chunk-QPCKJ2YR.js";
11
- import "./chunk-3I3DYDHR.js";
10
+ } from "./chunk-GG6MZDGV.js";
11
+ import "./chunk-WNLYPQOS.js";
12
12
  import {
13
13
  cn,
14
14
  generateId
15
- } from "./chunk-2Q6HHFAN.js";
15
+ } from "./chunk-75BKRTPO.js";
16
16
 
17
17
  // ../react-conversation/dist/index.js
18
18
  import * as React2 from "react";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cn
3
- } from "./chunk-2Q6HHFAN.js";
3
+ } from "./chunk-75BKRTPO.js";
4
4
 
5
5
  // ../react-cookie-consent/dist/index.js
6
6
  import * as React2 from "react";
@@ -1,12 +1,21 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-data-table/dist/index.js
7
7
  import * as React from "react";
8
8
 
9
9
  // ../data-table/dist/index.js
10
+ function resolveColumnAlign(col) {
11
+ return col.align ?? (col.numeric ? "end" : "start");
12
+ }
13
+ function getColumnValue(col, row) {
14
+ return col.accessor ? col.accessor(row) : void 0;
15
+ }
16
+ function resolveRowKey(row, index, getRowKey) {
17
+ return getRowKey ? getRowKey(row, index) : index;
18
+ }
10
19
  function createDataTable(props) {
11
20
  const {
12
21
  columns,
@@ -24,10 +33,10 @@ function createDataTable(props) {
24
33
  for (const [columnId, filterValue] of Object.entries(filters)) {
25
34
  if (!filterValue) continue;
26
35
  const col = columns.find((c) => c.id === columnId);
27
- if (!col) continue;
36
+ if (!col?.accessor) continue;
28
37
  const lowerFilter = filterValue.toLowerCase();
29
38
  result = result.filter((row) => {
30
- const cellValue = col.accessor(row);
39
+ const cellValue = getColumnValue(col, row);
31
40
  return String(cellValue ?? "").toLowerCase().includes(lowerFilter);
32
41
  });
33
42
  }
@@ -37,10 +46,10 @@ function createDataTable(props) {
37
46
  const filtered = getFilteredData();
38
47
  if (!sortBy) return filtered;
39
48
  const col = columns.find((c) => c.id === sortBy);
40
- if (!col) return filtered;
49
+ if (!col?.accessor) return filtered;
41
50
  return [...filtered].sort((a, b) => {
42
- const aVal = col.accessor(a);
43
- const bVal = col.accessor(b);
51
+ const aVal = getColumnValue(col, a);
52
+ const bVal = getColumnValue(col, b);
44
53
  const aStr = String(aVal ?? "");
45
54
  const bStr = String(bVal ?? "");
46
55
  const cmp = aStr.localeCompare(bStr, void 0, { numeric: true });
@@ -160,8 +169,21 @@ var rowVariants = cva({
160
169
  selected: "false"
161
170
  }
162
171
  });
172
+ var dataTableAlignClass = {
173
+ start: "text-start",
174
+ center: "text-center",
175
+ end: "text-end"
176
+ };
177
+ var dataTableNumericClass = "tabular-nums whitespace-nowrap";
178
+ var dataTableSortButtonClass = "inline-flex items-center gap-1 rounded-sm font-inherit text-inherit focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring";
179
+ var dataTableActionRowClass = "cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring";
163
180
 
164
181
  // ../react-data-table/dist/index.js
182
+ import { jsx, jsxs } from "react/jsx-runtime";
183
+ var ACTIVATION_KEYS = /* @__PURE__ */ new Set(["Enter", " "]);
184
+ function filterLabel(header, id) {
185
+ return typeof header === "string" || typeof header === "number" ? String(header) : id;
186
+ }
165
187
  function DataTable({
166
188
  columns,
167
189
  data,
@@ -170,13 +192,21 @@ function DataTable({
170
192
  onSort,
171
193
  filters: controlledFilters,
172
194
  className,
173
- emptyMessage = "No data available"
195
+ emptyMessage = "No data available",
196
+ getRowKey,
197
+ getRowProps,
198
+ onRowClick,
199
+ caption,
200
+ wrapperClassName,
201
+ ...tableProps
174
202
  }) {
175
203
  const [sortBy, setSortBy] = React.useState(controlledSortBy ?? null);
176
204
  const [sortDir, setSortDir] = React.useState(controlledSortDir);
177
205
  const [filters, setFilters] = React.useState(controlledFilters ?? {});
178
206
  const api = React.useMemo(
179
207
  () => createDataTable({
208
+ // The core only reads id/accessor/sortable/filterable; header and cell
209
+ // are rendered here.
180
210
  columns,
181
211
  data,
182
212
  sortBy: sortBy ?? void 0,
@@ -186,119 +216,100 @@ function DataTable({
186
216
  }),
187
217
  [columns, data, sortBy, sortDir, onSort, filters]
188
218
  );
189
- const handleSort = React.useCallback(
190
- (columnId) => {
191
- const col = columns.find((c) => c.id === columnId);
192
- if (!col?.sortable) return;
193
- let newDir = "asc";
194
- if (sortBy === columnId) {
195
- newDir = sortDir === "asc" ? "desc" : "asc";
196
- }
197
- setSortBy(columnId);
198
- setSortDir(newDir);
199
- onSort?.(columnId, newDir);
200
- },
201
- [columns, sortBy, sortDir, onSort]
202
- );
203
- const handleFilter = React.useCallback(
204
- (columnId, value) => {
205
- setFilters((prev) => ({ ...prev, [columnId]: value }));
206
- },
207
- []
208
- );
209
- const sortedData = api.state.sortedData;
219
+ const handleSort = (columnId) => {
220
+ const col = columns.find((c) => c.id === columnId);
221
+ if (!col?.sortable) return;
222
+ const newDir = sortBy === columnId && sortDir === "asc" ? "desc" : "asc";
223
+ setSortBy(columnId);
224
+ setSortDir(newDir);
225
+ onSort?.(columnId, newDir);
226
+ };
227
+ const handleFilter = (columnId, value) => {
228
+ setFilters((prev) => ({ ...prev, [columnId]: value }));
229
+ };
230
+ const rows = api.state.sortedData;
210
231
  const hasFilterable = columns.some((c) => c.filterable);
211
- return React.createElement(
212
- "div",
213
- { className: "relative w-full overflow-auto" },
214
- React.createElement(
215
- "table",
216
- {
217
- className: cn(tableVariants(), className),
218
- role: "table"
232
+ const rowElementProps = (row, index) => {
233
+ const extra = getRowProps?.(row, index) ?? {};
234
+ if (!onRowClick) return extra;
235
+ return {
236
+ tabIndex: 0,
237
+ ...extra,
238
+ className: cn(dataTableActionRowClass, extra.className),
239
+ onClick: (e) => {
240
+ extra.onClick?.(e);
241
+ if (!e.defaultPrevented) onRowClick(row, index);
219
242
  },
220
- // thead
221
- React.createElement(
222
- "thead",
223
- null,
224
- // Header row
225
- React.createElement(
226
- "tr",
227
- { role: "row" },
228
- ...columns.map((col) => {
229
- const headerProps = api.getHeaderProps(col);
230
- return React.createElement(
231
- "th",
232
- {
233
- key: col.id,
234
- ...headerProps,
235
- className: headerVariants({ sortable: col.sortable ? "true" : "false" }),
236
- onClick: col.sortable ? () => handleSort(col.id) : void 0
237
- },
243
+ onKeyDown: (e) => {
244
+ extra.onKeyDown?.(e);
245
+ if (e.defaultPrevented || e.target !== e.currentTarget || !ACTIVATION_KEYS.has(e.key)) return;
246
+ e.preventDefault();
247
+ onRowClick(row, index);
248
+ }
249
+ };
250
+ };
251
+ return /* @__PURE__ */ jsx("div", { className: cn("relative w-full overflow-auto", wrapperClassName), children: /* @__PURE__ */ jsxs("table", { className: cn(tableVariants(), className), role: "table", ...tableProps, children: [
252
+ caption != null && /* @__PURE__ */ jsx("caption", { className: "mt-2 caption-bottom text-xs text-muted-foreground", children: caption }),
253
+ /* @__PURE__ */ jsxs("thead", { children: [
254
+ /* @__PURE__ */ jsx("tr", { role: "row", children: columns.map((col) => {
255
+ const headerProps = api.getHeaderProps(col);
256
+ const align = resolveColumnAlign(col);
257
+ const indicator = col.sortable && sortBy === col.id ? /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: sortDir === "asc" ? "\u2191" : "\u2193" }) : null;
258
+ return /* @__PURE__ */ jsx(
259
+ "th",
260
+ {
261
+ ...headerProps,
262
+ className: cn(
263
+ headerVariants({ sortable: col.sortable ? "true" : "false" }),
264
+ dataTableAlignClass[align],
265
+ col.headerClassName
266
+ ),
267
+ children: col.sortable ? /* @__PURE__ */ jsxs("button", { type: "button", className: dataTableSortButtonClass, onClick: () => handleSort(col.id), children: [
238
268
  col.header,
239
- col.sortable && sortBy === col.id ? React.createElement("span", { "aria-hidden": true }, sortDir === "asc" ? " \u2191" : " \u2193") : null
240
- );
241
- })
242
- ),
243
- // Filter row
244
- hasFilterable ? React.createElement(
245
- "tr",
246
- { role: "row", "data-filter-row": "true" },
247
- ...columns.map(
248
- (col) => React.createElement(
249
- "th",
250
- { key: `filter-${col.id}` },
251
- col.filterable ? React.createElement("input", {
252
- type: "text",
253
- "aria-label": `Filter ${col.header}`,
254
- value: filters[col.id] ?? "",
255
- onChange: (e) => handleFilter(col.id, e.target.value),
256
- placeholder: `Filter...`
257
- }) : null
258
- )
259
- )
260
- ) : null
261
- ),
262
- // tbody
263
- React.createElement(
264
- "tbody",
265
- null,
266
- sortedData.length === 0 ? React.createElement(
267
- "tr",
268
- { role: "row" },
269
- React.createElement(
269
+ indicator
270
+ ] }) : col.header
271
+ },
272
+ col.id
273
+ );
274
+ }) }),
275
+ hasFilterable && /* @__PURE__ */ jsx("tr", { role: "row", "data-filter-row": "true", children: columns.map((col) => /* @__PURE__ */ jsx("th", { children: col.filterable ? /* @__PURE__ */ jsx(
276
+ "input",
277
+ {
278
+ type: "text",
279
+ "aria-label": `Filter ${filterLabel(col.header, col.id)}`,
280
+ value: filters[col.id] ?? "",
281
+ onChange: (e) => handleFilter(col.id, e.target.value),
282
+ placeholder: "Filter..."
283
+ }
284
+ ) : null }, `filter-${col.id}`)) })
285
+ ] }),
286
+ /* @__PURE__ */ jsx("tbody", { children: rows.length === 0 ? /* @__PURE__ */ jsx("tr", { role: "row", children: /* @__PURE__ */ jsx("td", { colSpan: columns.length, className: "text-center p-4 text-muted-foreground", role: "cell", children: emptyMessage }) }) : rows.map((row, rowIndex) => {
287
+ const rowProps = rowElementProps(row, rowIndex);
288
+ return /* @__PURE__ */ jsx(
289
+ "tr",
290
+ {
291
+ ...api.getRowProps(row, rowIndex),
292
+ ...rowProps,
293
+ className: cn(rowVariants(), rowProps.className),
294
+ children: columns.map((col) => /* @__PURE__ */ jsx(
270
295
  "td",
271
296
  {
272
- colSpan: columns.length,
273
- className: "text-center p-4 text-muted-foreground",
274
- role: "cell"
275
- },
276
- emptyMessage
277
- )
278
- ) : sortedData.map(
279
- (row, rowIndex) => React.createElement(
280
- "tr",
281
- {
282
- key: rowIndex,
283
- ...api.getRowProps(row, rowIndex),
284
- className: rowVariants()
297
+ ...api.getCellProps(col, row),
298
+ className: cn(
299
+ cellVariants(),
300
+ dataTableAlignClass[resolveColumnAlign(col)],
301
+ col.numeric && dataTableNumericClass,
302
+ col.className
303
+ ),
304
+ children: col.cell ? col.cell(row, rowIndex) : String(getColumnValue(col, row) ?? "")
285
305
  },
286
- ...columns.map(
287
- (col) => React.createElement(
288
- "td",
289
- {
290
- key: col.id,
291
- ...api.getCellProps(col, row),
292
- className: cellVariants()
293
- },
294
- String(col.accessor(row) ?? "")
295
- )
296
- )
297
- )
298
- )
299
- )
300
- )
301
- );
306
+ col.id
307
+ ))
308
+ },
309
+ resolveRowKey(row, rowIndex, getRowKey)
310
+ );
311
+ }) })
312
+ ] }) });
302
313
  }
303
314
  export {
304
315
  DataTable,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../data-table/src/data-table.ts", "../../data-table/src/data-table.styles.ts", "../../react-data-table/src/DataTable.tsx"],
4
- "sourcesContent": ["import type { AccessibilityProps } from '@refraction-ui/shared'\n\nexport interface ColumnDef<T = Record<string, unknown>> {\n /** Unique column identifier */\n id: string\n /** Column header text */\n header: string\n /** Accessor function to get cell value from row */\n accessor: (row: T) => unknown\n /** Whether this column is sortable */\n sortable?: boolean\n /** Whether this column is filterable */\n filterable?: boolean\n}\n\nexport type SortDirection = 'asc' | 'desc'\n\nexport interface DataTableProps<T = Record<string, unknown>> {\n /** Column definitions */\n columns: ColumnDef<T>[]\n /** Data rows */\n data: T[]\n /** Current sort column */\n sortBy?: string\n /** Current sort direction */\n sortDir?: SortDirection\n /** Callback when sort changes */\n onSort?: (columnId: string, direction: SortDirection) => void\n /** Active filters: columnId -> filter value */\n filters?: Record<string, string>\n}\n\nexport interface DataTableState<T = Record<string, unknown>> {\n sortedData: T[]\n sortBy: string | null\n sortDir: SortDirection\n filters: Record<string, string>\n}\n\nexport interface DataTableAPI<T = Record<string, unknown>> {\n /** Current table state */\n state: DataTableState<T>\n /** Toggle sort for a column */\n sort(columnId: string): void\n /** Set a filter value for a column */\n setFilter(columnId: string, value: string): void\n /** Get ARIA and role props for a header cell */\n getHeaderProps(col: ColumnDef<T>): Partial<AccessibilityProps> & Record<string, unknown>\n /** Get props for a data cell */\n getCellProps(col: ColumnDef<T>, row: T): Record<string, unknown>\n /** Get props for a data row */\n getRowProps(row: T, index: number): Record<string, unknown>\n}\n\nexport function createDataTable<T = Record<string, unknown>>(\n props: DataTableProps<T>,\n): DataTableAPI<T> {\n const {\n columns,\n data,\n sortBy: initialSortBy,\n sortDir: initialSortDir = 'asc',\n onSort,\n filters: initialFilters,\n } = props\n\n let sortBy: string | null = initialSortBy ?? null\n let sortDir: SortDirection = initialSortDir\n let filters: Record<string, string> = { ...(initialFilters ?? {}) }\n\n function getFilteredData(): T[] {\n let result = [...data]\n\n for (const [columnId, filterValue] of Object.entries(filters)) {\n if (!filterValue) continue\n const col = columns.find((c) => c.id === columnId)\n if (!col) continue\n const lowerFilter = filterValue.toLowerCase()\n result = result.filter((row) => {\n const cellValue = col.accessor(row)\n return String(cellValue ?? '').toLowerCase().includes(lowerFilter)\n })\n }\n\n return result\n }\n\n function getSortedData(): T[] {\n const filtered = getFilteredData()\n\n if (!sortBy) return filtered\n\n const col = columns.find((c) => c.id === sortBy)\n if (!col) return filtered\n\n return [...filtered].sort((a, b) => {\n const aVal = col.accessor(a)\n const bVal = col.accessor(b)\n const aStr = String(aVal ?? '')\n const bStr = String(bVal ?? '')\n\n const cmp = aStr.localeCompare(bStr, undefined, { numeric: true })\n return sortDir === 'asc' ? cmp : -cmp\n })\n }\n\n function sort(columnId: string): void {\n const col = columns.find((c) => c.id === columnId)\n if (!col?.sortable) return\n\n if (sortBy === columnId) {\n sortDir = sortDir === 'asc' ? 'desc' : 'asc'\n } else {\n sortBy = columnId\n sortDir = 'asc'\n }\n\n onSort?.(sortBy, sortDir)\n }\n\n function setFilter(columnId: string, value: string): void {\n filters = { ...filters, [columnId]: value }\n }\n\n function getHeaderProps(\n col: ColumnDef<T>,\n ): Partial<AccessibilityProps> & Record<string, unknown> {\n const props: Partial<AccessibilityProps> & Record<string, unknown> = {\n role: 'columnheader',\n }\n\n if (col.sortable) {\n if (sortBy === col.id) {\n props['aria-sort'] = sortDir === 'asc' ? 'ascending' : 'descending'\n } else {\n props['aria-sort'] = 'none'\n }\n }\n\n return props\n }\n\n function getCellProps(\n col: ColumnDef<T>,\n _row: T,\n ): Record<string, unknown> {\n return {\n role: 'cell',\n 'data-column': col.id,\n }\n }\n\n function getRowProps(_row: T, index: number): Record<string, unknown> {\n return {\n role: 'row',\n 'data-row-index': index,\n }\n }\n\n return {\n get state(): DataTableState<T> {\n return {\n get sortedData() {\n return getSortedData()\n },\n get sortBy() {\n return sortBy\n },\n get sortDir() {\n return sortDir\n },\n get filters() {\n return { ...filters }\n },\n }\n },\n sort,\n setFilter,\n getHeaderProps,\n getCellProps,\n getRowProps,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const tableVariants = cva({\n base: 'w-full caption-bottom text-sm border-collapse',\n variants: {\n size: {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const headerVariants = cva({\n base: 'h-10 px-2 text-left align-middle font-medium text-muted-foreground border-b',\n variants: {\n sortable: {\n true: 'cursor-pointer select-none hover:text-foreground',\n false: '',\n },\n },\n defaultVariants: {\n sortable: 'false',\n },\n})\n\nexport const cellVariants = cva({\n base: 'p-2 align-middle border-b',\n variants: {\n size: {\n sm: 'p-1',\n md: 'p-2',\n lg: 'p-3',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const rowVariants = cva({\n base: 'border-b transition-colors hover:bg-muted/50',\n variants: {\n selected: {\n true: 'bg-muted',\n false: '',\n },\n },\n defaultVariants: {\n selected: 'false',\n },\n})\n", "import * as React from 'react'\nimport {\n createDataTable,\n tableVariants,\n headerVariants,\n cellVariants,\n rowVariants,\n type ColumnDef,\n type SortDirection,\n type DataTableProps as CoreProps,\n} from '@refraction-ui/data-table'\nimport { cn } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// DataTable\n// ---------------------------------------------------------------------------\n\nexport interface DataTableProps<T = Record<string, unknown>> {\n columns: ColumnDef<T>[]\n data: T[]\n sortBy?: string\n sortDir?: SortDirection\n onSort?: (columnId: string, direction: SortDirection) => void\n filters?: Record<string, string>\n className?: string\n emptyMessage?: string\n}\n\nexport function DataTable<T = Record<string, unknown>>({\n columns,\n data,\n sortBy: controlledSortBy,\n sortDir: controlledSortDir = 'asc',\n onSort,\n filters: controlledFilters,\n className,\n emptyMessage = 'No data available',\n}: DataTableProps<T>) {\n const [sortBy, setSortBy] = React.useState<string | null>(controlledSortBy ?? null)\n const [sortDir, setSortDir] = React.useState<SortDirection>(controlledSortDir)\n const [filters, setFilters] = React.useState<Record<string, string>>(controlledFilters ?? {})\n\n const api = React.useMemo(\n () =>\n createDataTable<T>({\n columns,\n data,\n sortBy: sortBy ?? undefined,\n sortDir,\n onSort,\n filters,\n }),\n [columns, data, sortBy, sortDir, onSort, filters],\n )\n\n const handleSort = React.useCallback(\n (columnId: string) => {\n const col = columns.find((c) => c.id === columnId)\n if (!col?.sortable) return\n\n let newDir: SortDirection = 'asc'\n if (sortBy === columnId) {\n newDir = sortDir === 'asc' ? 'desc' : 'asc'\n }\n\n setSortBy(columnId)\n setSortDir(newDir)\n onSort?.(columnId, newDir)\n },\n [columns, sortBy, sortDir, onSort],\n )\n\n const handleFilter = React.useCallback(\n (columnId: string, value: string) => {\n setFilters((prev) => ({ ...prev, [columnId]: value }))\n },\n [],\n )\n\n const sortedData = api.state.sortedData\n const hasFilterable = columns.some((c) => c.filterable)\n\n return React.createElement(\n 'div',\n { className: 'relative w-full overflow-auto' },\n React.createElement(\n 'table',\n {\n className: cn(tableVariants(), className),\n role: 'table',\n },\n // thead\n React.createElement(\n 'thead',\n null,\n // Header row\n React.createElement(\n 'tr',\n { role: 'row' },\n ...columns.map((col) => {\n const headerProps = api.getHeaderProps(col)\n return React.createElement(\n 'th',\n {\n key: col.id,\n ...headerProps,\n className: headerVariants({ sortable: col.sortable ? 'true' : 'false' }),\n onClick: col.sortable ? () => handleSort(col.id) : undefined,\n },\n col.header,\n col.sortable && sortBy === col.id\n ? React.createElement('span', { 'aria-hidden': true }, sortDir === 'asc' ? ' \\u2191' : ' \\u2193')\n : null,\n )\n }),\n ),\n // Filter row\n hasFilterable\n ? React.createElement(\n 'tr',\n { role: 'row', 'data-filter-row': 'true' },\n ...columns.map((col) =>\n React.createElement(\n 'th',\n { key: `filter-${col.id}` },\n col.filterable\n ? React.createElement('input', {\n type: 'text',\n 'aria-label': `Filter ${col.header}`,\n value: filters[col.id] ?? '',\n onChange: (e: React.ChangeEvent<HTMLInputElement>) =>\n handleFilter(col.id, e.target.value),\n placeholder: `Filter...`,\n })\n : null,\n ),\n ),\n )\n : null,\n ),\n // tbody\n React.createElement(\n 'tbody',\n null,\n sortedData.length === 0\n ? React.createElement(\n 'tr',\n { role: 'row' },\n React.createElement(\n 'td',\n {\n colSpan: columns.length,\n className: 'text-center p-4 text-muted-foreground',\n role: 'cell',\n },\n emptyMessage,\n ),\n )\n : sortedData.map((row, rowIndex) =>\n React.createElement(\n 'tr',\n {\n key: rowIndex,\n ...api.getRowProps(row, rowIndex),\n className: rowVariants(),\n },\n ...columns.map((col) =>\n React.createElement(\n 'td',\n {\n key: col.id,\n ...api.getCellProps(col, row),\n className: cellVariants(),\n },\n String(col.accessor(row) ?? ''),\n ),\n ),\n ),\n ),\n ),\n )\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { AccessibilityProps } from '@refraction-ui/shared'\n\nexport interface ColumnDef<T = Record<string, unknown>> {\n /** Unique column identifier */\n id: string\n /** Column header text */\n header: string\n /**\n * Value of this column for a row. Drives sorting, filtering and — when no\n * `cell` renderer is given — the rendered text. Optional for display-only\n * columns that set `cell`.\n */\n accessor?: (row: T) => unknown\n /**\n * Custom cell renderer. Framework adapters narrow the return type (React:\n * `ReactNode`). When omitted the cell renders `String(accessor(row))`.\n */\n cell?: (row: T, index: number) => unknown\n /** Horizontal alignment of header and cells. Defaults to `start`. */\n align?: DataTableAlign\n /** Numeric column: tabular figures, no wrapping, aligned to `end` unless `align` says otherwise. */\n numeric?: boolean\n /** Extra class for this column's data cells. */\n className?: string\n /** Extra class for this column's header cell. */\n headerClassName?: string\n /** Whether this column is sortable */\n sortable?: boolean\n /** Whether this column is filterable */\n filterable?: boolean\n}\n\nexport type SortDirection = 'asc' | 'desc'\n\n/** Horizontal alignment of a column (logical, RTL-safe). */\nexport type DataTableAlign = 'start' | 'center' | 'end'\n\n/** A column's effective alignment: explicit `align`, else `end` for numeric columns. */\nexport function resolveColumnAlign(col: { align?: DataTableAlign; numeric?: boolean }): DataTableAlign {\n return col.align ?? (col.numeric ? 'end' : 'start')\n}\n\n/** The raw value of a column for a row (`undefined` without an accessor). */\nexport function getColumnValue<T>(col: { accessor?: (row: T) => unknown }, row: T): unknown {\n return col.accessor ? col.accessor(row) : undefined\n}\n\n/**\n * Stable React/DOM key for a row: `getRowKey` when given, else the row's\n * index. Prefer a `getRowKey` — index keys break row state on sort/filter.\n */\nexport function resolveRowKey<T>(\n row: T,\n index: number,\n getRowKey?: (row: T, index: number) => string | number,\n): string | number {\n return getRowKey ? getRowKey(row, index) : index\n}\n\nexport interface DataTableProps<T = Record<string, unknown>> {\n /** Column definitions */\n columns: ColumnDef<T>[]\n /** Data rows */\n data: T[]\n /** Current sort column */\n sortBy?: string\n /** Current sort direction */\n sortDir?: SortDirection\n /** Callback when sort changes */\n onSort?: (columnId: string, direction: SortDirection) => void\n /** Active filters: columnId -> filter value */\n filters?: Record<string, string>\n}\n\nexport interface DataTableState<T = Record<string, unknown>> {\n sortedData: T[]\n sortBy: string | null\n sortDir: SortDirection\n filters: Record<string, string>\n}\n\nexport interface DataTableAPI<T = Record<string, unknown>> {\n /** Current table state */\n state: DataTableState<T>\n /** Toggle sort for a column */\n sort(columnId: string): void\n /** Set a filter value for a column */\n setFilter(columnId: string, value: string): void\n /** Get ARIA and role props for a header cell */\n getHeaderProps(col: ColumnDef<T>): Partial<AccessibilityProps> & Record<string, unknown>\n /** Get props for a data cell */\n getCellProps(col: ColumnDef<T>, row: T): Record<string, unknown>\n /** Get props for a data row */\n getRowProps(row: T, index: number): Record<string, unknown>\n}\n\nexport function createDataTable<T = Record<string, unknown>>(\n props: DataTableProps<T>,\n): DataTableAPI<T> {\n const {\n columns,\n data,\n sortBy: initialSortBy,\n sortDir: initialSortDir = 'asc',\n onSort,\n filters: initialFilters,\n } = props\n\n let sortBy: string | null = initialSortBy ?? null\n let sortDir: SortDirection = initialSortDir\n let filters: Record<string, string> = { ...(initialFilters ?? {}) }\n\n function getFilteredData(): T[] {\n let result = [...data]\n\n for (const [columnId, filterValue] of Object.entries(filters)) {\n if (!filterValue) continue\n const col = columns.find((c) => c.id === columnId)\n if (!col?.accessor) continue\n const lowerFilter = filterValue.toLowerCase()\n result = result.filter((row) => {\n const cellValue = getColumnValue(col, row)\n return String(cellValue ?? '').toLowerCase().includes(lowerFilter)\n })\n }\n\n return result\n }\n\n function getSortedData(): T[] {\n const filtered = getFilteredData()\n\n if (!sortBy) return filtered\n\n const col = columns.find((c) => c.id === sortBy)\n if (!col?.accessor) return filtered\n\n return [...filtered].sort((a, b) => {\n const aVal = getColumnValue(col, a)\n const bVal = getColumnValue(col, b)\n const aStr = String(aVal ?? '')\n const bStr = String(bVal ?? '')\n\n const cmp = aStr.localeCompare(bStr, undefined, { numeric: true })\n return sortDir === 'asc' ? cmp : -cmp\n })\n }\n\n function sort(columnId: string): void {\n const col = columns.find((c) => c.id === columnId)\n if (!col?.sortable) return\n\n if (sortBy === columnId) {\n sortDir = sortDir === 'asc' ? 'desc' : 'asc'\n } else {\n sortBy = columnId\n sortDir = 'asc'\n }\n\n onSort?.(sortBy, sortDir)\n }\n\n function setFilter(columnId: string, value: string): void {\n filters = { ...filters, [columnId]: value }\n }\n\n function getHeaderProps(\n col: ColumnDef<T>,\n ): Partial<AccessibilityProps> & Record<string, unknown> {\n const props: Partial<AccessibilityProps> & Record<string, unknown> = {\n role: 'columnheader',\n }\n\n if (col.sortable) {\n if (sortBy === col.id) {\n props['aria-sort'] = sortDir === 'asc' ? 'ascending' : 'descending'\n } else {\n props['aria-sort'] = 'none'\n }\n }\n\n return props\n }\n\n function getCellProps(\n col: ColumnDef<T>,\n _row: T,\n ): Record<string, unknown> {\n return {\n role: 'cell',\n 'data-column': col.id,\n }\n }\n\n function getRowProps(_row: T, index: number): Record<string, unknown> {\n return {\n role: 'row',\n 'data-row-index': index,\n }\n }\n\n return {\n get state(): DataTableState<T> {\n return {\n get sortedData() {\n return getSortedData()\n },\n get sortBy() {\n return sortBy\n },\n get sortDir() {\n return sortDir\n },\n get filters() {\n return { ...filters }\n },\n }\n },\n sort,\n setFilter,\n getHeaderProps,\n getCellProps,\n getRowProps,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const tableVariants = cva({\n base: 'w-full caption-bottom text-sm border-collapse',\n variants: {\n size: {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const headerVariants = cva({\n base: 'h-10 px-2 text-left align-middle font-medium text-muted-foreground border-b',\n variants: {\n sortable: {\n true: 'cursor-pointer select-none hover:text-foreground',\n false: '',\n },\n },\n defaultVariants: {\n sortable: 'false',\n },\n})\n\nexport const cellVariants = cva({\n base: 'p-2 align-middle border-b',\n variants: {\n size: {\n sm: 'p-1',\n md: 'p-2',\n lg: 'p-3',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const rowVariants = cva({\n base: 'border-b transition-colors hover:bg-muted/50',\n variants: {\n selected: {\n true: 'bg-muted',\n false: '',\n },\n },\n defaultVariants: {\n selected: 'false',\n },\n})\n\n/** Logical text alignment per column alignment. */\nexport const dataTableAlignClass = {\n start: 'text-start',\n center: 'text-center',\n end: 'text-end',\n} as const\n\n/** Numeric cells: tabular figures, no wrapping. */\nexport const dataTableNumericClass = 'tabular-nums whitespace-nowrap'\n\n/** Button inside a sortable header: the keyboard-reachable sort control. */\nexport const dataTableSortButtonClass =\n 'inline-flex items-center gap-1 rounded-sm font-inherit text-inherit focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring'\n\n/** Rows with a row action: pointer + keyboard focus ring. */\nexport const dataTableActionRowClass =\n 'cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring'\n", "import * as React from 'react'\nimport {\n createDataTable,\n tableVariants,\n headerVariants,\n cellVariants,\n rowVariants,\n resolveColumnAlign,\n getColumnValue,\n resolveRowKey,\n dataTableAlignClass,\n dataTableNumericClass,\n dataTableSortButtonClass,\n dataTableActionRowClass,\n type ColumnDef,\n type SortDirection,\n} from '@refraction-ui/data-table'\nimport { cn } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// Column definition (React): header and cell may be any ReactNode\n// ---------------------------------------------------------------------------\n\nexport interface DataTableColumn<T = Record<string, unknown>>\n extends Omit<ColumnDef<T>, 'header' | 'cell'> {\n /** Header content. A string is also used for the filter input's label. */\n header: React.ReactNode\n /** Render the cell. Defaults to `String(accessor(row))`. */\n cell?: (row: T, index: number) => React.ReactNode\n}\n\n// ---------------------------------------------------------------------------\n// DataTable\n// ---------------------------------------------------------------------------\n\nexport interface DataTableProps<T = Record<string, unknown>>\n extends Omit<React.TableHTMLAttributes<HTMLTableElement>, 'children'> {\n columns: DataTableColumn<T>[]\n data: T[]\n sortBy?: string\n sortDir?: SortDirection\n onSort?: (columnId: string, direction: SortDirection) => void\n filters?: Record<string, string>\n emptyMessage?: React.ReactNode\n /** Stable key per row. Defaults to the row index — pass one when rows can reorder. */\n getRowKey?: (row: T, index: number) => string | number\n /** Extra attributes for a row (`data-*`, `aria-*`, className, handlers). */\n getRowProps?: (row: T, index: number) => React.HTMLAttributes<HTMLTableRowElement>\n /**\n * Row action. Makes each row focusable (Tab) and activatable with click,\n * Enter or Space. Keep a real link/button in the row too when the action\n * needs an accessible name beyond the row's text.\n */\n onRowClick?: (row: T, index: number) => void\n /** Table caption (rendered as `<caption>`). */\n caption?: React.ReactNode\n /** Class for the horizontal scroll wrapper. */\n wrapperClassName?: string\n}\n\nconst ACTIVATION_KEYS = new Set(['Enter', ' '])\n\nfunction filterLabel(header: React.ReactNode, id: string): string {\n return typeof header === 'string' || typeof header === 'number' ? String(header) : id\n}\n\nexport function DataTable<T = Record<string, unknown>>({\n columns,\n data,\n sortBy: controlledSortBy,\n sortDir: controlledSortDir = 'asc',\n onSort,\n filters: controlledFilters,\n className,\n emptyMessage = 'No data available',\n getRowKey,\n getRowProps,\n onRowClick,\n caption,\n wrapperClassName,\n ...tableProps\n}: DataTableProps<T>) {\n const [sortBy, setSortBy] = React.useState<string | null>(controlledSortBy ?? null)\n const [sortDir, setSortDir] = React.useState<SortDirection>(controlledSortDir)\n const [filters, setFilters] = React.useState<Record<string, string>>(controlledFilters ?? {})\n\n const api = React.useMemo(\n () =>\n createDataTable<T>({\n // The core only reads id/accessor/sortable/filterable; header and cell\n // are rendered here.\n columns: columns as unknown as ColumnDef<T>[],\n data,\n sortBy: sortBy ?? undefined,\n sortDir,\n onSort,\n filters,\n }),\n [columns, data, sortBy, sortDir, onSort, filters],\n )\n\n const handleSort = (columnId: string) => {\n const col = columns.find((c) => c.id === columnId)\n if (!col?.sortable) return\n const newDir: SortDirection = sortBy === columnId && sortDir === 'asc' ? 'desc' : 'asc'\n setSortBy(columnId)\n setSortDir(newDir)\n onSort?.(columnId, newDir)\n }\n\n const handleFilter = (columnId: string, value: string) => {\n setFilters((prev) => ({ ...prev, [columnId]: value }))\n }\n\n const rows = api.state.sortedData\n const hasFilterable = columns.some((c) => c.filterable)\n\n const rowElementProps = (row: T, index: number): React.HTMLAttributes<HTMLTableRowElement> => {\n const extra = getRowProps?.(row, index) ?? {}\n if (!onRowClick) return extra\n return {\n tabIndex: 0,\n ...extra,\n className: cn(dataTableActionRowClass, extra.className),\n onClick: (e) => {\n extra.onClick?.(e)\n if (!e.defaultPrevented) onRowClick(row, index)\n },\n onKeyDown: (e) => {\n extra.onKeyDown?.(e)\n // Only when the row itself is focused — not a control inside it.\n if (e.defaultPrevented || e.target !== e.currentTarget || !ACTIVATION_KEYS.has(e.key)) return\n e.preventDefault()\n onRowClick(row, index)\n },\n }\n }\n\n return (\n <div className={cn('relative w-full overflow-auto', wrapperClassName)}>\n <table className={cn(tableVariants(), className)} role=\"table\" {...tableProps}>\n {caption != null && <caption className=\"mt-2 caption-bottom text-xs text-muted-foreground\">{caption}</caption>}\n <thead>\n <tr role=\"row\">\n {columns.map((col) => {\n const headerProps = api.getHeaderProps(col as unknown as ColumnDef<T>)\n const align = resolveColumnAlign(col)\n const indicator =\n col.sortable && sortBy === col.id ? (\n <span aria-hidden=\"true\">{sortDir === 'asc' ? '↑' : '↓'}</span>\n ) : null\n return (\n <th\n key={col.id}\n {...headerProps}\n className={cn(\n headerVariants({ sortable: col.sortable ? 'true' : 'false' }),\n dataTableAlignClass[align],\n col.headerClassName,\n )}\n >\n {col.sortable ? (\n <button type=\"button\" className={dataTableSortButtonClass} onClick={() => handleSort(col.id)}>\n {col.header}\n {indicator}\n </button>\n ) : (\n col.header\n )}\n </th>\n )\n })}\n </tr>\n {hasFilterable && (\n <tr role=\"row\" data-filter-row=\"true\">\n {columns.map((col) => (\n <th key={`filter-${col.id}`}>\n {col.filterable ? (\n <input\n type=\"text\"\n aria-label={`Filter ${filterLabel(col.header, col.id)}`}\n value={filters[col.id] ?? ''}\n onChange={(e) => handleFilter(col.id, e.target.value)}\n placeholder=\"Filter...\"\n />\n ) : null}\n </th>\n ))}\n </tr>\n )}\n </thead>\n <tbody>\n {rows.length === 0 ? (\n <tr role=\"row\">\n <td colSpan={columns.length} className=\"text-center p-4 text-muted-foreground\" role=\"cell\">\n {emptyMessage}\n </td>\n </tr>\n ) : (\n rows.map((row, rowIndex) => {\n const rowProps = rowElementProps(row, rowIndex)\n return (\n <tr\n key={resolveRowKey(row, rowIndex, getRowKey)}\n {...api.getRowProps(row, rowIndex)}\n {...rowProps}\n className={cn(rowVariants(), rowProps.className)}\n >\n {columns.map((col) => (\n <td\n key={col.id}\n {...api.getCellProps(col as unknown as ColumnDef<T>, row)}\n className={cn(\n cellVariants(),\n dataTableAlignClass[resolveColumnAlign(col)],\n col.numeric && dataTableNumericClass,\n col.className,\n )}\n >\n {col.cell ? col.cell(row, rowIndex) : String(getColumnValue(col, row) ?? '')}\n </td>\n ))}\n </tr>\n )\n })\n )}\n </tbody>\n </table>\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["props"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-date-picker/dist/index.js
7
7
  import * as React from "react";