@vjdesigns/vjdesigns-ui 2.3.0 → 2.5.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 (454) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +45 -1
  3. package/dist/ai/llms-full.txt +199 -107
  4. package/dist/ai/registry.json +217 -77
  5. package/dist/components/data-display/Accordion/Accordion.cjs.js +1 -1
  6. package/dist/components/data-display/Accordion/Accordion.mjs +22 -22
  7. package/dist/components/data-display/Accordion/Accordion.module.css.mjs +1 -2
  8. package/dist/components/data-display/Avatar/Avatar.cjs.js +1 -1
  9. package/dist/components/data-display/Avatar/Avatar.mjs +92 -92
  10. package/dist/components/data-display/Avatar/Avatar.module.css.mjs +1 -2
  11. package/dist/components/data-display/Badge/Badge.cjs.js +1 -1
  12. package/dist/components/data-display/Badge/Badge.d.ts +7 -2
  13. package/dist/components/data-display/Badge/Badge.mjs +4 -3
  14. package/dist/components/data-display/Badge/Badge.module.css.cjs.js +1 -1
  15. package/dist/components/data-display/Badge/Badge.module.css.mjs +34 -34
  16. package/dist/components/data-display/Card/Card.cjs.js +1 -1
  17. package/dist/components/data-display/Card/Card.mjs +2 -2
  18. package/dist/components/data-display/Card/Card.module.css.mjs +1 -2
  19. package/dist/components/data-display/Carousel/Carousel.cjs.js +1 -1
  20. package/dist/components/data-display/Carousel/Carousel.mjs +42 -42
  21. package/dist/components/data-display/Carousel/Carousel.module.css.mjs +1 -2
  22. package/dist/components/data-display/Chat/Chat.cjs.js +1 -1
  23. package/dist/components/data-display/Chat/Chat.mjs +114 -118
  24. package/dist/components/data-display/Chat/Chat.module.css.mjs +1 -2
  25. package/dist/components/data-display/Chat/streams.mjs +1 -2
  26. package/dist/components/data-display/Chip/Chip.cjs.js +1 -1
  27. package/dist/components/data-display/Chip/Chip.mjs +50 -54
  28. package/dist/components/data-display/Chip/Chip.module.css.mjs +1 -2
  29. package/dist/components/data-display/CodeBlock/CodeBlock.cjs.js +4 -4
  30. package/dist/components/data-display/CodeBlock/CodeBlock.mjs +113 -113
  31. package/dist/components/data-display/CodeBlock/CodeBlock.module.css.mjs +1 -2
  32. package/dist/components/data-display/CodeBlock/tokenize.mjs +1 -2
  33. package/dist/components/data-display/DataGrid/DataGrid.cjs.js +1 -1
  34. package/dist/components/data-display/DataGrid/DataGrid.d.ts +14 -3
  35. package/dist/components/data-display/DataGrid/DataGrid.mjs +352 -267
  36. package/dist/components/data-display/DataGrid/DataGrid.module.css.cjs.js +1 -1
  37. package/dist/components/data-display/DataGrid/DataGrid.module.css.mjs +6 -5
  38. package/dist/components/data-display/DataGrid/dataGridUtils.cjs.js +1 -1
  39. package/dist/components/data-display/DataGrid/dataGridUtils.d.ts +18 -0
  40. package/dist/components/data-display/DataGrid/dataGridUtils.mjs +100 -32
  41. package/dist/components/data-display/EmptyState/EmptyState.cjs.js +1 -1
  42. package/dist/components/data-display/EmptyState/EmptyState.mjs +53 -53
  43. package/dist/components/data-display/EmptyState/EmptyState.module.css.mjs +1 -2
  44. package/dist/components/data-display/Image/Image.cjs.js +1 -1
  45. package/dist/components/data-display/Image/Image.mjs +6 -6
  46. package/dist/components/data-display/Image/Image.module.css.mjs +1 -2
  47. package/dist/components/data-display/List/List.cjs.js +1 -1
  48. package/dist/components/data-display/List/List.mjs +68 -68
  49. package/dist/components/data-display/List/List.module.css.mjs +1 -2
  50. package/dist/components/data-display/Stat/Stat.cjs.js +1 -1
  51. package/dist/components/data-display/Stat/Stat.mjs +112 -112
  52. package/dist/components/data-display/Stat/Stat.module.css.mjs +1 -2
  53. package/dist/components/data-display/Table/Table.cjs.js +1 -1
  54. package/dist/components/data-display/Table/Table.mjs +187 -183
  55. package/dist/components/data-display/Table/Table.module.css.mjs +1 -2
  56. package/dist/components/data-display/Table/useTable.cjs.js +1 -1
  57. package/dist/components/data-display/Table/useTable.mjs +2 -2
  58. package/dist/components/data-display/Timeline/Timeline.cjs.js +1 -1
  59. package/dist/components/data-display/Timeline/Timeline.mjs +64 -64
  60. package/dist/components/data-display/Timeline/Timeline.module.css.mjs +1 -2
  61. package/dist/components/data-display/TreeView/TreeView.cjs.js +1 -1
  62. package/dist/components/data-display/TreeView/TreeView.mjs +107 -119
  63. package/dist/components/data-display/TreeView/TreeView.module.css.mjs +1 -2
  64. package/dist/components/data-display/TreeView/treeUtils.mjs +1 -2
  65. package/dist/components/data-display/VirtualList/VirtualList.cjs.js +1 -1
  66. package/dist/components/data-display/VirtualList/VirtualList.mjs +2 -2
  67. package/dist/components/data-display/VirtualList/VirtualList.module.css.mjs +1 -2
  68. package/dist/components/feedback/Alert/Alert.cjs.js +1 -1
  69. package/dist/components/feedback/Alert/Alert.mjs +56 -56
  70. package/dist/components/feedback/Alert/Alert.module.css.mjs +1 -2
  71. package/dist/components/feedback/Banner/Banner.cjs.js +1 -1
  72. package/dist/components/feedback/Banner/Banner.mjs +48 -48
  73. package/dist/components/feedback/Banner/Banner.module.css.mjs +1 -2
  74. package/dist/components/feedback/ErrorSummary/ErrorSummary.cjs.js +1 -1
  75. package/dist/components/feedback/ErrorSummary/ErrorSummary.mjs +10 -10
  76. package/dist/components/feedback/ErrorSummary/ErrorSummary.module.css.mjs +1 -2
  77. package/dist/components/feedback/Progress/Progress.cjs.js +1 -1
  78. package/dist/components/feedback/Progress/Progress.mjs +2 -2
  79. package/dist/components/feedback/Progress/Progress.module.css.mjs +1 -2
  80. package/dist/components/feedback/Skeleton/Skeleton.cjs.js +1 -1
  81. package/dist/components/feedback/Skeleton/Skeleton.mjs +73 -73
  82. package/dist/components/feedback/Skeleton/Skeleton.module.css.mjs +1 -2
  83. package/dist/components/feedback/Spinner/Spinner.cjs.js +1 -1
  84. package/dist/components/feedback/Spinner/Spinner.mjs +29 -29
  85. package/dist/components/feedback/Spinner/Spinner.module.css.mjs +1 -2
  86. package/dist/components/feedback/Toast/Toast.cjs.js +1 -1
  87. package/dist/components/feedback/Toast/Toast.mjs +42 -42
  88. package/dist/components/feedback/Toast/Toast.module.css.mjs +1 -2
  89. package/dist/components/feedback/Toast/ToastItem.cjs.js +1 -1
  90. package/dist/components/feedback/Toast/ToastItem.mjs +10 -10
  91. package/dist/components/feedback/Toast/ToastProvider.cjs.js +1 -1
  92. package/dist/components/feedback/Toast/ToastProvider.mjs +11 -11
  93. package/dist/components/feedback/Toast/ToastViewport.cjs.js +1 -1
  94. package/dist/components/feedback/Toast/ToastViewport.mjs +30 -30
  95. package/dist/components/feedback/Toast/toastStore.mjs +1 -2
  96. package/dist/components/feedback/Toast/toastTiming.cjs.js +1 -1
  97. package/dist/components/feedback/Toast/toastTiming.mjs +2 -2
  98. package/dist/components/feedback/Toast/useToast.cjs.js +1 -1
  99. package/dist/components/feedback/Toast/useToast.mjs +2 -2
  100. package/dist/components/feedback/Toast/useToastAnnouncer.cjs.js +1 -1
  101. package/dist/components/feedback/Toast/useToastAnnouncer.mjs +2 -2
  102. package/dist/components/forms/CheckBox/CheckBox.cjs.js +1 -1
  103. package/dist/components/forms/CheckBox/CheckBox.mjs +2 -2
  104. package/dist/components/forms/CheckBox/CheckBox.module.css.mjs +1 -2
  105. package/dist/components/forms/ColorPicker/ColorInput.cjs.js +1 -1
  106. package/dist/components/forms/ColorPicker/ColorInput.mjs +43 -43
  107. package/dist/components/forms/ColorPicker/ColorPicker.cjs.js +1 -1
  108. package/dist/components/forms/ColorPicker/ColorPicker.mjs +153 -153
  109. package/dist/components/forms/ColorPicker/ColorPicker.module.css.mjs +1 -2
  110. package/dist/components/forms/ColorPicker/colorUtils.mjs +1 -2
  111. package/dist/components/forms/Combobox/Combobox.cjs.js +1 -1
  112. package/dist/components/forms/Combobox/Combobox.mjs +200 -213
  113. package/dist/components/forms/Combobox/Combobox.module.css.mjs +1 -2
  114. package/dist/components/forms/Combobox/ComboboxPopup.cjs.js +1 -1
  115. package/dist/components/forms/Combobox/ComboboxPopup.mjs +164 -121
  116. package/dist/components/forms/Combobox/comboboxUtils.cjs.js +1 -1
  117. package/dist/components/forms/Combobox/comboboxUtils.d.ts +4 -1
  118. package/dist/components/forms/Combobox/comboboxUtils.mjs +21 -20
  119. package/dist/components/forms/DatePicker/Calendar.cjs.js +1 -1
  120. package/dist/components/forms/DatePicker/Calendar.mjs +60 -66
  121. package/dist/components/forms/DatePicker/Calendar.module.css.mjs +1 -2
  122. package/dist/components/forms/DatePicker/DatePicker.cjs.js +1 -1
  123. package/dist/components/forms/DatePicker/DatePicker.mjs +72 -74
  124. package/dist/components/forms/DatePicker/DatePicker.module.css.mjs +1 -2
  125. package/dist/components/forms/DatePicker/DateRangePicker.cjs.js +1 -1
  126. package/dist/components/forms/DatePicker/DateRangePicker.mjs +117 -117
  127. package/dist/components/forms/DatePicker/DateRangePicker.module.css.mjs +1 -2
  128. package/dist/components/forms/DatePicker/dateUtils.mjs +1 -2
  129. package/dist/components/forms/DateTimePicker/DateTimePicker.cjs.js +1 -1
  130. package/dist/components/forms/DateTimePicker/DateTimePicker.mjs +19 -19
  131. package/dist/components/forms/DateTimePicker/DateTimePicker.module.css.mjs +1 -2
  132. package/dist/components/forms/Field/Field.cjs.js +1 -1
  133. package/dist/components/forms/Field/Field.mjs +14 -14
  134. package/dist/components/forms/Field/Field.module.css.mjs +1 -2
  135. package/dist/components/forms/Field/FieldContext.cjs.js +1 -1
  136. package/dist/components/forms/Field/FieldContext.mjs +2 -2
  137. package/dist/components/forms/FileUpload/FileUpload.cjs.js +1 -1
  138. package/dist/components/forms/FileUpload/FileUpload.mjs +250 -255
  139. package/dist/components/forms/FileUpload/FileUpload.module.css.mjs +1 -2
  140. package/dist/components/forms/Input/Input.cjs.js +1 -1
  141. package/dist/components/forms/Input/Input.mjs +35 -35
  142. package/dist/components/forms/Input/Input.module.css.mjs +1 -2
  143. package/dist/components/forms/NumberInput/NumberInput.cjs.js +1 -1
  144. package/dist/components/forms/NumberInput/NumberInput.mjs +137 -142
  145. package/dist/components/forms/NumberInput/NumberInput.module.css.mjs +1 -2
  146. package/dist/components/forms/PasswordInput/PasswordInput.cjs.js +1 -1
  147. package/dist/components/forms/PasswordInput/PasswordInput.mjs +142 -142
  148. package/dist/components/forms/PasswordInput/PasswordInput.module.css.mjs +1 -2
  149. package/dist/components/forms/PinInput/PinInput.cjs.js +1 -1
  150. package/dist/components/forms/PinInput/PinInput.mjs +12 -12
  151. package/dist/components/forms/PinInput/PinInput.module.css.mjs +1 -2
  152. package/dist/components/forms/Radio/Radio.cjs.js +1 -1
  153. package/dist/components/forms/Radio/Radio.mjs +2 -2
  154. package/dist/components/forms/Radio/Radio.module.css.mjs +1 -2
  155. package/dist/components/forms/Rating/Rating.cjs.js +1 -1
  156. package/dist/components/forms/Rating/Rating.mjs +110 -109
  157. package/dist/components/forms/Rating/Rating.module.css.mjs +1 -2
  158. package/dist/components/forms/SearchInput/SearchInput.cjs.js +1 -1
  159. package/dist/components/forms/SearchInput/SearchInput.mjs +118 -126
  160. package/dist/components/forms/SearchInput/SearchInput.module.css.mjs +1 -2
  161. package/dist/components/forms/SegmentedControl/SegmentedControl.cjs.js +1 -1
  162. package/dist/components/forms/SegmentedControl/SegmentedControl.mjs +46 -43
  163. package/dist/components/forms/SegmentedControl/SegmentedControl.module.css.mjs +1 -2
  164. package/dist/components/forms/Select/Select.cjs.js +1 -1
  165. package/dist/components/forms/Select/Select.mjs +2 -2
  166. package/dist/components/forms/Select/Select.module.css.mjs +1 -2
  167. package/dist/components/forms/Slider/Slider.cjs.js +1 -1
  168. package/dist/components/forms/Slider/Slider.mjs +2 -2
  169. package/dist/components/forms/Slider/Slider.module.css.mjs +1 -2
  170. package/dist/components/forms/Switch/Switch.cjs.js +1 -1
  171. package/dist/components/forms/Switch/Switch.mjs +39 -39
  172. package/dist/components/forms/Switch/Switch.module.css.mjs +1 -2
  173. package/dist/components/forms/TagInput/TagInput.cjs.js +1 -1
  174. package/dist/components/forms/TagInput/TagInput.mjs +197 -203
  175. package/dist/components/forms/TagInput/TagInput.module.css.mjs +1 -2
  176. package/dist/components/forms/Textarea/Textarea.cjs.js +1 -1
  177. package/dist/components/forms/Textarea/Textarea.mjs +59 -59
  178. package/dist/components/forms/Textarea/Textarea.module.css.mjs +1 -2
  179. package/dist/components/forms/TimePicker/TimePicker.cjs.js +1 -1
  180. package/dist/components/forms/TimePicker/TimePicker.mjs +14 -16
  181. package/dist/components/forms/TimePicker/TimePicker.module.css.mjs +1 -2
  182. package/dist/components/forms/TimePicker/timeUtils.cjs.js +1 -1
  183. package/dist/components/forms/TimePicker/timeUtils.d.ts +4 -1
  184. package/dist/components/forms/TimePicker/timeUtils.mjs +43 -38
  185. package/dist/components/forms/ToggleGroup/ToggleGroup.cjs.js +1 -1
  186. package/dist/components/forms/ToggleGroup/ToggleGroup.mjs +10 -10
  187. package/dist/components/forms/ToggleGroup/ToggleGroup.module.css.mjs +1 -2
  188. package/dist/components/layout/Box/Box.mjs +1 -2
  189. package/dist/components/layout/Box/Box.module.css.mjs +1 -2
  190. package/dist/components/layout/Container/Container.mjs +1 -2
  191. package/dist/components/layout/Container/Container.module.css.mjs +1 -2
  192. package/dist/components/layout/Divider/Divider.mjs +1 -2
  193. package/dist/components/layout/Divider/Divider.module.css.mjs +1 -2
  194. package/dist/components/layout/Flex/Flex.cjs.js +1 -1
  195. package/dist/components/layout/Flex/Flex.mjs +12 -13
  196. package/dist/components/layout/Flex/Flex.module.css.mjs +1 -2
  197. package/dist/components/layout/Grid/Grid.cjs.js +1 -1
  198. package/dist/components/layout/Grid/Grid.mjs +20 -21
  199. package/dist/components/layout/Grid/Grid.module.css.mjs +1 -2
  200. package/dist/components/layout/ResizablePanels/ResizablePanels.cjs.js +1 -1
  201. package/dist/components/layout/ResizablePanels/ResizablePanels.mjs +17 -17
  202. package/dist/components/layout/ResizablePanels/ResizablePanels.module.css.mjs +1 -2
  203. package/dist/components/layout/ScrollArea/ScrollArea.cjs.js +1 -1
  204. package/dist/components/layout/ScrollArea/ScrollArea.mjs +2 -2
  205. package/dist/components/layout/ScrollArea/ScrollArea.module.css.mjs +1 -2
  206. package/dist/components/layout/Stack/Stack.cjs.js +1 -1
  207. package/dist/components/layout/Stack/Stack.mjs +8 -9
  208. package/dist/components/layout/Stack/Stack.module.css.mjs +1 -2
  209. package/dist/components/navigation/Breadcrumbs/Breadcrumbs.cjs.js +1 -1
  210. package/dist/components/navigation/Breadcrumbs/Breadcrumbs.mjs +41 -41
  211. package/dist/components/navigation/Breadcrumbs/Breadcrumbs.module.css.mjs +1 -2
  212. package/dist/components/navigation/ContextMenu/ContextMenu.cjs.js +1 -1
  213. package/dist/components/navigation/ContextMenu/ContextMenu.mjs +48 -48
  214. package/dist/components/navigation/ContextMenu/ContextMenu.module.css.mjs +1 -2
  215. package/dist/components/navigation/Link/Link.cjs.js +1 -1
  216. package/dist/components/navigation/Link/Link.mjs +6 -7
  217. package/dist/components/navigation/Link/Link.module.css.mjs +1 -2
  218. package/dist/components/navigation/Menu/Menu.cjs.js +1 -1
  219. package/dist/components/navigation/Menu/Menu.mjs +11 -11
  220. package/dist/components/navigation/Menu/Menu.module.css.mjs +1 -2
  221. package/dist/components/navigation/Menu/MenuContent.cjs.js +1 -1
  222. package/dist/components/navigation/Menu/MenuContent.mjs +46 -46
  223. package/dist/components/navigation/Menu/MenuContext.cjs.js +1 -1
  224. package/dist/components/navigation/Menu/MenuContext.mjs +2 -2
  225. package/dist/components/navigation/Menu/MenuItem.cjs.js +1 -1
  226. package/dist/components/navigation/Menu/MenuItem.mjs +35 -39
  227. package/dist/components/navigation/Menu/MenuSub.cjs.js +1 -1
  228. package/dist/components/navigation/Menu/MenuSub.mjs +16 -20
  229. package/dist/components/navigation/Menu/useMenuRoot.cjs.js +1 -1
  230. package/dist/components/navigation/Menu/useMenuRoot.mjs +2 -2
  231. package/dist/components/navigation/Navbar/Navbar.cjs.js +1 -1
  232. package/dist/components/navigation/Navbar/Navbar.d.ts +65 -2
  233. package/dist/components/navigation/Navbar/Navbar.mjs +315 -175
  234. package/dist/components/navigation/Navbar/Navbar.module.css.cjs.js +1 -1
  235. package/dist/components/navigation/Navbar/Navbar.module.css.mjs +21 -13
  236. package/dist/components/navigation/Pagination/Pagination.cjs.js +1 -1
  237. package/dist/components/navigation/Pagination/Pagination.mjs +31 -35
  238. package/dist/components/navigation/Pagination/Pagination.module.css.mjs +1 -2
  239. package/dist/components/navigation/Sidebar/Sidebar.cjs.js +1 -1
  240. package/dist/components/navigation/Sidebar/Sidebar.mjs +52 -52
  241. package/dist/components/navigation/Sidebar/Sidebar.module.css.mjs +1 -2
  242. package/dist/components/navigation/Sidebar/SidebarContext.cjs.js +1 -1
  243. package/dist/components/navigation/Sidebar/SidebarContext.mjs +2 -2
  244. package/dist/components/navigation/Sidebar/SidebarParts.cjs.js +1 -1
  245. package/dist/components/navigation/Sidebar/SidebarParts.mjs +76 -80
  246. package/dist/components/navigation/SkipLink/SkipLink.cjs.js +1 -1
  247. package/dist/components/navigation/SkipLink/SkipLink.mjs +12 -12
  248. package/dist/components/navigation/SkipLink/SkipLink.module.css.mjs +1 -2
  249. package/dist/components/navigation/Stepper/Stepper.cjs.js +1 -1
  250. package/dist/components/navigation/Stepper/Stepper.mjs +46 -46
  251. package/dist/components/navigation/Stepper/Stepper.module.css.mjs +1 -2
  252. package/dist/components/navigation/Tabs/Tabs.cjs.js +1 -1
  253. package/dist/components/navigation/Tabs/Tabs.mjs +2 -2
  254. package/dist/components/navigation/Tabs/Tabs.module.css.mjs +1 -2
  255. package/dist/components/overlays/CommandPalette/CommandPalette.cjs.js +1 -1
  256. package/dist/components/overlays/CommandPalette/CommandPalette.mjs +206 -206
  257. package/dist/components/overlays/CommandPalette/CommandPalette.module.css.mjs +1 -2
  258. package/dist/components/overlays/CommandPalette/CommandPaletteContext.cjs.js +1 -1
  259. package/dist/components/overlays/CommandPalette/CommandPaletteContext.mjs +2 -2
  260. package/dist/components/overlays/CommandPalette/CommandPaletteParts.cjs.js +1 -1
  261. package/dist/components/overlays/CommandPalette/CommandPaletteParts.mjs +104 -104
  262. package/dist/components/overlays/CommandPalette/commandPaletteUtils.cjs.js +1 -1
  263. package/dist/components/overlays/CommandPalette/commandPaletteUtils.mjs +62 -60
  264. package/dist/components/overlays/Drawer/Drawer.cjs.js +1 -1
  265. package/dist/components/overlays/Drawer/Drawer.mjs +31 -31
  266. package/dist/components/overlays/Drawer/Drawer.module.css.mjs +1 -2
  267. package/dist/components/overlays/Drawer/DrawerContent.cjs.js +1 -1
  268. package/dist/components/overlays/Drawer/DrawerContent.mjs +99 -99
  269. package/dist/components/overlays/Drawer/DrawerContext.cjs.js +1 -1
  270. package/dist/components/overlays/Drawer/DrawerContext.mjs +2 -2
  271. package/dist/components/overlays/Drawer/DrawerParts.cjs.js +1 -1
  272. package/dist/components/overlays/Drawer/DrawerParts.mjs +18 -18
  273. package/dist/components/overlays/Drawer/internal.mjs +1 -2
  274. package/dist/components/overlays/Drawer/useDragToClose.cjs.js +1 -1
  275. package/dist/components/overlays/Drawer/useDragToClose.mjs +2 -2
  276. package/dist/components/overlays/HoverCard/HoverCard.cjs.js +1 -1
  277. package/dist/components/overlays/HoverCard/HoverCard.mjs +31 -31
  278. package/dist/components/overlays/HoverCard/HoverCard.module.css.mjs +1 -2
  279. package/dist/components/overlays/Modal/ConfirmModal.cjs.js +1 -1
  280. package/dist/components/overlays/Modal/ConfirmModal.mjs +21 -23
  281. package/dist/components/overlays/Modal/Modal.cjs.js +1 -1
  282. package/dist/components/overlays/Modal/Modal.mjs +47 -47
  283. package/dist/components/overlays/Modal/Modal.module.css.mjs +1 -2
  284. package/dist/components/overlays/Modal/ModalContent.cjs.js +1 -1
  285. package/dist/components/overlays/Modal/ModalContent.mjs +24 -24
  286. package/dist/components/overlays/Modal/ModalContext.cjs.js +1 -1
  287. package/dist/components/overlays/Modal/ModalContext.mjs +2 -2
  288. package/dist/components/overlays/Modal/useScrollRegion.cjs.js +1 -1
  289. package/dist/components/overlays/Modal/useScrollRegion.mjs +2 -2
  290. package/dist/components/overlays/Popover/Popover.cjs.js +1 -1
  291. package/dist/components/overlays/Popover/Popover.mjs +40 -40
  292. package/dist/components/overlays/Popover/Popover.module.css.mjs +1 -2
  293. package/dist/components/overlays/Popover/PopoverContent.cjs.js +1 -1
  294. package/dist/components/overlays/Popover/PopoverContent.mjs +39 -39
  295. package/dist/components/overlays/Popover/PopoverContext.cjs.js +1 -1
  296. package/dist/components/overlays/Popover/PopoverContext.mjs +2 -2
  297. package/dist/components/overlays/Tooltip/Tooltip.cjs.js +1 -1
  298. package/dist/components/overlays/Tooltip/Tooltip.mjs +100 -95
  299. package/dist/components/overlays/Tooltip/Tooltip.module.css.mjs +1 -2
  300. package/dist/components/primitives/Button/Button.cjs.js +1 -1
  301. package/dist/components/primitives/Button/Button.mjs +59 -63
  302. package/dist/components/primitives/Button/Button.module.css.mjs +1 -2
  303. package/dist/components/primitives/Icon/Icon.cjs.js +1 -1
  304. package/dist/components/primitives/Icon/Icon.mjs +5 -6
  305. package/dist/components/primitives/Icon/Icon.module.css.mjs +1 -2
  306. package/dist/components/primitives/Icon/IconSvg.mjs +1 -2
  307. package/dist/components/primitives/Icon/icons.mjs +1 -2
  308. package/dist/components/primitives/Kbd/Kbd.cjs.js +1 -1
  309. package/dist/components/primitives/Kbd/Kbd.mjs +30 -30
  310. package/dist/components/primitives/Kbd/Kbd.module.css.mjs +1 -2
  311. package/dist/components/primitives/Typography/Typography.mjs +1 -2
  312. package/dist/components/primitives/Typography/Typography.module.css.mjs +1 -2
  313. package/dist/components/utilities/LocaleProvider/LocaleProvider.cjs.js +1 -1
  314. package/dist/components/utilities/LocaleProvider/LocaleProvider.mjs +11 -11
  315. package/dist/components/utilities/LocaleProvider/LocaleProvider.module.css.mjs +1 -2
  316. package/dist/components/utilities/Portal/Portal.cjs.js +1 -1
  317. package/dist/components/utilities/Portal/Portal.mjs +2 -2
  318. package/dist/components/utilities/Theme/Theme.cjs.js +1 -1
  319. package/dist/components/utilities/Theme/Theme.mjs +13 -13
  320. package/dist/components/utilities/Theme/Theme.module.css.mjs +1 -2
  321. package/dist/components/utilities/VisuallyHidden/VisuallyHidden.mjs +1 -2
  322. package/dist/components/utilities/VisuallyHidden/VisuallyHidden.module.css.mjs +1 -2
  323. package/dist/hooks/elementSource.cjs.js +1 -1
  324. package/dist/hooks/elementSource.mjs +4 -3
  325. package/dist/hooks/useClipboard.cjs.js +1 -1
  326. package/dist/hooks/useClipboard.mjs +2 -2
  327. package/dist/hooks/useControllableState.cjs.js +1 -1
  328. package/dist/hooks/useControllableState.mjs +2 -2
  329. package/dist/hooks/useDisclosure.cjs.js +1 -1
  330. package/dist/hooks/useDisclosure.mjs +2 -2
  331. package/dist/hooks/useDismiss.cjs.js +1 -1
  332. package/dist/hooks/useDismiss.mjs +2 -2
  333. package/dist/hooks/useElementObservers.cjs.js +1 -1
  334. package/dist/hooks/useElementObservers.mjs +2 -2
  335. package/dist/hooks/useEnvironment.cjs.js +1 -1
  336. package/dist/hooks/useEnvironment.mjs +2 -2
  337. package/dist/hooks/useFloatingPosition.cjs.js +1 -1
  338. package/dist/hooks/useFloatingPosition.mjs +2 -2
  339. package/dist/hooks/useFocusTrap.cjs.js +1 -1
  340. package/dist/hooks/useFocusTrap.mjs +4 -15
  341. package/dist/hooks/useFormReset.cjs.js +1 -1
  342. package/dist/hooks/useFormReset.mjs +2 -2
  343. package/dist/hooks/useFormValidation.cjs.js +1 -1
  344. package/dist/hooks/useFormValidation.mjs +2 -2
  345. package/dist/hooks/useHotkeys.cjs.js +1 -1
  346. package/dist/hooks/useHotkeys.mjs +2 -2
  347. package/dist/hooks/useInertOutside.cjs.js +1 -1
  348. package/dist/hooks/useInertOutside.mjs +5 -9
  349. package/dist/hooks/useMediaQuery.cjs.js +1 -1
  350. package/dist/hooks/useMediaQuery.mjs +2 -2
  351. package/dist/hooks/useMergedRef.cjs.js +1 -1
  352. package/dist/hooks/useMergedRef.mjs +2 -2
  353. package/dist/hooks/useOverlayLayer.cjs.js +1 -1
  354. package/dist/hooks/useOverlayLayer.mjs +3 -3
  355. package/dist/hooks/useResponsiveValue.cjs.js +1 -1
  356. package/dist/hooks/useResponsiveValue.mjs +2 -2
  357. package/dist/hooks/useScrollLock.cjs.js +1 -1
  358. package/dist/hooks/useScrollLock.mjs +2 -2
  359. package/dist/hooks/useStorage.cjs.js +1 -1
  360. package/dist/hooks/useStorage.mjs +2 -2
  361. package/dist/hooks/useTiming.cjs.js +1 -1
  362. package/dist/hooks/useTiming.mjs +10 -15
  363. package/dist/hooks/useVirtualizer.cjs.js +1 -1
  364. package/dist/hooks/useVirtualizer.d.ts +13 -0
  365. package/dist/hooks/useVirtualizer.mjs +93 -54
  366. package/dist/i18n/en.cjs.js +1 -1
  367. package/dist/i18n/en.mjs +2 -2
  368. package/dist/i18n/merge.mjs +1 -2
  369. package/dist/i18n/plural.mjs +1 -2
  370. package/dist/i18n/types.d.ts +5 -0
  371. package/dist/index.cjs.js +1 -1
  372. package/dist/index.mjs +114 -114
  373. package/dist/locales/ar.cjs.js +1 -1
  374. package/dist/locales/ar.mjs +2 -2
  375. package/dist/locales/bn.cjs.js +1 -1
  376. package/dist/locales/bn.mjs +2 -2
  377. package/dist/locales/cs.cjs.js +1 -1
  378. package/dist/locales/cs.mjs +2 -2
  379. package/dist/locales/da.cjs.js +1 -1
  380. package/dist/locales/da.mjs +2 -2
  381. package/dist/locales/de.cjs.js +1 -1
  382. package/dist/locales/de.mjs +2 -2
  383. package/dist/locales/el.cjs.js +1 -1
  384. package/dist/locales/el.mjs +2 -2
  385. package/dist/locales/es.cjs.js +1 -1
  386. package/dist/locales/es.mjs +2 -2
  387. package/dist/locales/fa.cjs.js +1 -1
  388. package/dist/locales/fa.mjs +2 -2
  389. package/dist/locales/fi.cjs.js +1 -1
  390. package/dist/locales/fi.mjs +2 -2
  391. package/dist/locales/fr.cjs.js +1 -1
  392. package/dist/locales/fr.mjs +2 -2
  393. package/dist/locales/he.cjs.js +1 -1
  394. package/dist/locales/he.mjs +2 -2
  395. package/dist/locales/hi.cjs.js +1 -1
  396. package/dist/locales/hi.mjs +2 -2
  397. package/dist/locales/hu.cjs.js +1 -1
  398. package/dist/locales/hu.mjs +2 -2
  399. package/dist/locales/id.cjs.js +1 -1
  400. package/dist/locales/id.mjs +2 -2
  401. package/dist/locales/it.cjs.js +1 -1
  402. package/dist/locales/it.mjs +2 -2
  403. package/dist/locales/ja.cjs.js +1 -1
  404. package/dist/locales/ja.mjs +2 -2
  405. package/dist/locales/ko.cjs.js +1 -1
  406. package/dist/locales/ko.mjs +2 -2
  407. package/dist/locales/nb.cjs.js +1 -1
  408. package/dist/locales/nb.mjs +2 -2
  409. package/dist/locales/nl.cjs.js +1 -1
  410. package/dist/locales/nl.mjs +2 -2
  411. package/dist/locales/pl.cjs.js +1 -1
  412. package/dist/locales/pl.mjs +2 -2
  413. package/dist/locales/pt-BR.cjs.js +1 -1
  414. package/dist/locales/pt-BR.mjs +2 -2
  415. package/dist/locales/ro.cjs.js +1 -1
  416. package/dist/locales/ro.mjs +2 -2
  417. package/dist/locales/ru.cjs.js +1 -1
  418. package/dist/locales/ru.mjs +2 -2
  419. package/dist/locales/sv.cjs.js +1 -1
  420. package/dist/locales/sv.mjs +2 -2
  421. package/dist/locales/th.cjs.js +1 -1
  422. package/dist/locales/th.mjs +2 -2
  423. package/dist/locales/tr.cjs.js +1 -1
  424. package/dist/locales/tr.mjs +2 -2
  425. package/dist/locales/uk.cjs.js +1 -1
  426. package/dist/locales/uk.mjs +2 -2
  427. package/dist/locales/ur.cjs.js +1 -1
  428. package/dist/locales/ur.mjs +2 -2
  429. package/dist/locales/vi.cjs.js +1 -1
  430. package/dist/locales/vi.mjs +2 -2
  431. package/dist/locales/zh-Hans.cjs.js +1 -1
  432. package/dist/locales/zh-Hans.mjs +2 -2
  433. package/dist/locales/zh-Hant.cjs.js +1 -1
  434. package/dist/locales/zh-Hant.mjs +2 -2
  435. package/dist/types/common.mjs +1 -2
  436. package/dist/utils/announce.cjs.js +1 -1
  437. package/dist/utils/announce.mjs +3 -4
  438. package/dist/utils/brandPalette.mjs +1 -2
  439. package/dist/utils/clipboard.mjs +1 -2
  440. package/dist/utils/cx.mjs +1 -2
  441. package/dist/utils/fillSlot.cjs.js +1 -1
  442. package/dist/utils/fillSlot.mjs +2 -2
  443. package/dist/utils/flattenChildren.mjs +1 -2
  444. package/dist/utils/hotkeys.mjs +1 -2
  445. package/dist/utils/intl.cjs.js +1 -0
  446. package/dist/utils/intl.d.ts +10 -0
  447. package/dist/utils/intl.mjs +15 -0
  448. package/dist/utils/refs.mjs +1 -2
  449. package/dist/utils/responsive.mjs +1 -2
  450. package/dist/utils/slot.mjs +1 -2
  451. package/dist/utils/validators.mjs +1 -2
  452. package/dist/vjdesigns-ui.css +1 -1
  453. package/dist/vjdesigns-ui.css.d.ts +2 -0
  454. package/package.json +24 -14
package/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2026 VJDesigns
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
package/README.md CHANGED
@@ -82,6 +82,50 @@ export function SignupForm() {
82
82
  }
83
83
  ```
84
84
 
85
+ ### Next.js (App Router) and React Server Components
86
+
87
+ The library works in Server Components. Interactive components (anything with state, effects, or context: `Button`, `DataGrid`, `Modal`, ...) are marked `"use client"`, so you can render them from a Server Component like any client component. Utilities (`cx`, `sortRows`, `createBrandPalette`, `getLocaleDirection`, ...) and the locale catalogs have no directive, so you can call or read them on the server too. Every component also renders on the server for the first paint.
88
+
89
+ Put the providers in a small client file of your own, and render it from the root layout:
90
+
91
+ ```tsx
92
+ // app/providers.tsx
93
+ "use client";
94
+ import { LocaleProvider, ToastProvider } from "@vjdesigns/vjdesigns-ui";
95
+ import es from "@vjdesigns/vjdesigns-ui/locales/es";
96
+ import type { ReactNode } from "react";
97
+
98
+ export function Providers({ children }: { children: ReactNode }) {
99
+ return (
100
+ <LocaleProvider locale="es" messages={es}>
101
+ <ToastProvider>{children}</ToastProvider>
102
+ </LocaleProvider>
103
+ );
104
+ }
105
+ ```
106
+
107
+ ```tsx
108
+ // app/layout.tsx (a Server Component)
109
+ import "@vjdesigns/vjdesigns-ui/dist/vjdesigns-ui.css";
110
+ import { getLocaleDirection } from "@vjdesigns/vjdesigns-ui";
111
+ import { Providers } from "./providers";
112
+
113
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
114
+ return (
115
+ <html lang="es" dir={getLocaleDirection("es")}>
116
+ <body>
117
+ <Providers>{children}</Providers>
118
+ </body>
119
+ </html>
120
+ );
121
+ }
122
+ ```
123
+
124
+ Two rules of Server Components to keep in mind:
125
+
126
+ - **Functions can't be passed from a Server Component to a client one.** That includes event handlers (`onClick`), DataGrid columns with `cell` or `value` functions, and the locale catalogs themselves (their plural messages are functions, which is why `LocaleProvider` goes in the client providers file above). Render those components from your own `"use client"` file.
127
+ - **Compound parts can't be reached with a dot from a Server Component** (`Tabs.List`, `Menu.Item`): Next.js reports "You cannot dot into a client module". Use them inside a `"use client"` file, or use the named exports where they exist (`CardHeader`, `CardBody`, `NavbarBrand`, ...).
128
+
85
129
  ### Angular
86
130
 
87
131
  Make a standalone wrapper that renders the React component into its host element. The wrapper uses `createElement`, so you don't need to change your JSX or TSX settings.
@@ -778,4 +822,4 @@ See [RELEASING.md](RELEASING.md) for the full process, including how to update t
778
822
 
779
823
  ## License
780
824
 
781
- ISC
825
+ [ISC](LICENSE) © 2026 VJDesigns. The Pro package (`pro/`) has its own commercial license.
@@ -1,4 +1,4 @@
1
- # @vjdesigns/vjdesigns-ui 2.2.0: full reference
1
+ # @vjdesigns/vjdesigns-ui 2.4.0: full reference
2
2
 
3
3
  > Accessible React 19 component library: WCAG 2.2 AA verified (axe on every story, a contrast check on every color pair), 31 languages with right-to-left support, themeable with any brand color (auto-adjusted to stay accessible), tree-shakable, no runtime dependencies besides React.
4
4
 
@@ -83,6 +83,50 @@ export function SignupForm() {
83
83
  }
84
84
  ```
85
85
 
86
+ ### Next.js (App Router) and React Server Components
87
+
88
+ The library works in Server Components. Interactive components (anything with state, effects, or context: `Button`, `DataGrid`, `Modal`, ...) are marked `"use client"`, so you can render them from a Server Component like any client component. Utilities (`cx`, `sortRows`, `createBrandPalette`, `getLocaleDirection`, ...) and the locale catalogs have no directive, so you can call or read them on the server too. Every component also renders on the server for the first paint.
89
+
90
+ Put the providers in a small client file of your own, and render it from the root layout:
91
+
92
+ ```tsx
93
+ // app/providers.tsx
94
+ "use client";
95
+ import { LocaleProvider, ToastProvider } from "@vjdesigns/vjdesigns-ui";
96
+ import es from "@vjdesigns/vjdesigns-ui/locales/es";
97
+ import type { ReactNode } from "react";
98
+
99
+ export function Providers({ children }: { children: ReactNode }) {
100
+ return (
101
+ <LocaleProvider locale="es" messages={es}>
102
+ <ToastProvider>{children}</ToastProvider>
103
+ </LocaleProvider>
104
+ );
105
+ }
106
+ ```
107
+
108
+ ```tsx
109
+ // app/layout.tsx (a Server Component)
110
+ import "@vjdesigns/vjdesigns-ui/dist/vjdesigns-ui.css";
111
+ import { getLocaleDirection } from "@vjdesigns/vjdesigns-ui";
112
+ import { Providers } from "./providers";
113
+
114
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
115
+ return (
116
+ <html lang="es" dir={getLocaleDirection("es")}>
117
+ <body>
118
+ <Providers>{children}</Providers>
119
+ </body>
120
+ </html>
121
+ );
122
+ }
123
+ ```
124
+
125
+ Two rules of Server Components to keep in mind:
126
+
127
+ - **Functions can't be passed from a Server Component to a client one.** That includes event handlers (`onClick`), DataGrid columns with `cell` or `value` functions, and the locale catalogs themselves (their plural messages are functions, which is why `LocaleProvider` goes in the client providers file above). Render those components from your own `"use client"` file.
128
+ - **Compound parts can't be reached with a dot from a Server Component** (`Tabs.List`, `Menu.Item`): Next.js reports "You cannot dot into a client module". Use them inside a `"use client"` file, or use the named exports where they exist (`CardHeader`, `CardBody`, `NavbarBrand`, ...).
129
+
86
130
  ### Angular
87
131
 
88
132
  Make a standalone wrapper that renders the React component into its host element. The wrapper uses `createElement`, so you don't need to change your JSX or TSX settings.
@@ -607,8 +651,8 @@ import { Avatar } from "@vjdesigns/vjdesigns-ui";
607
651
 
608
652
  Category: data-display · Storybook: Data Display/Avatar
609
653
 
610
- A person's photo (`src`), with a fallback chain of image, initials (from
611
- `name`), then a user icon, so it always shows something. Supports a border,
654
+ A person's photo (`src`), with a fallback chain of image, initials (from
655
+ `name`), then a user icon, so it always shows something. Supports a border,
612
656
  a presence status dot, a highlight ring, and stacking in an `AvatarGroup`.
613
657
 
614
658
  ### Props
@@ -655,7 +699,7 @@ import { AvatarGroup } from "@vjdesigns/vjdesigns-ui";
655
699
 
656
700
  Category: data-display · Storybook: Data Display/Avatar
657
701
 
658
- Overlapping stack of avatars in a labelled `role="group"`. Avatars beyond
702
+ Overlapping stack of avatars in a labelled `role="group"`. Avatars beyond
659
703
  `max` collapse into a "+N" surplus avatar with an accessible label.
660
704
 
661
705
  ### Props
@@ -711,6 +755,7 @@ Renders a `<span>` with no role. For counts, pass `label` (e.g.
711
755
  - Counts
712
756
  - Anchored
713
757
  - In text
758
+ - Inverse: `inverse` swaps the solid colors, for a badge on a solid tone surface: a solid Navbar, a Banner, a primary card.
714
759
  - On surfaces (both themes)
715
760
 
716
761
  ## BadgeAnchor
@@ -1232,6 +1277,7 @@ real `<table role="grid">` with `aria-sort`, `aria-selected`,
1232
1277
  - `onSelectedChange`: `(selected: DataGridRowId[]) => void`. Called with the next selected ids.
1233
1278
  - `isRowSelectable`: `(row: T) => boolean`. Rows that can't be selected (their checkbox is disabled).
1234
1279
  - `pageSize`: `number`. Rows per page. Shows a footer with the range and `Pagination`. Without it, every row shows.
1280
+ - `virtualize`: `boolean | "auto"` (default "auto"). Render only the rows in view (plus a few above and below), so grids of 100,000+ rows scroll, sort, filter, and select without delay. `"auto"` turns it on when more than 100 rows show at once. While it's on, the body scrolls inside the grid (its height is `maxHeight`, 70% of the window by default) and the table uses fixed layout unless you set `layout`, so columns keep their widths while you scroll; give columns a `width` to size them. Screen readers still get the full count (`aria-rowcount`) and each row's position (`aria-rowindex`).
1235
1281
  - `page`: `number`. Current page, starting at 1 (controlled).
1236
1282
  - `defaultPage`: `number` (default 1). Initial page when uncontrolled.
1237
1283
  - `onPageChange`: `(page: number) => void`. Called with the next page.
@@ -1245,7 +1291,7 @@ real `<table role="grid">` with `aria-sort`, `aria-selected`,
1245
1291
  - `hoverable`: `boolean` (default true). Highlight rows under the pointer.
1246
1292
  - `stickyHeader`: `boolean` (default true). Keep the header row visible while scrolling.
1247
1293
  - `maxHeight`: `CSSProperties["maxHeight"]`. Maximum height of the scrolling body (CSS length, or px as a number).
1248
- - `layout`: `"auto" | "fixed"` (default "auto"). Table layout. `fixed` makes column widths exact (content wraps or clips instead of widening a column).
1294
+ - `layout`: `"auto" | "fixed"` (default "auto" ("fixed" while virtualized)). Table layout. `fixed` makes column widths exact (content wraps or clips instead of widening a column).
1249
1295
  - `tableStyle`: `CSSProperties`. Style for the `<table>` (for example a total width when columns are resized).
1250
1296
  - `className`: `string`. Class name for the outer frame.
1251
1297
  - `style`: `CSSProperties`. Style for the outer frame.
@@ -1264,6 +1310,7 @@ real `<table role="grid">` with `aria-sort`, `aria-selected`,
1264
1310
  - Sticky Header: A long list in a fixed-height area, with the header kept in view.
1265
1311
  - Right To Left: In right-to-left layouts the columns mirror and ArrowRight moves toward the start.
1266
1312
  - Extending Columns: Extending columns: `headerEnd` adds content after a header's label, outside its sort button (here a column menu button), and `className` / `style` reach every cell of a column. Controls marked `data-grid-secondary` don't steal the header's focus: the sort button stays its target, and F2 then Tab reaches them.
1313
+ - Large data (100,000 rows): 100,000 rows with sorting, search, and selection. Only the rows in view (plus a few above and below) are in the page, so scrolling, sorting, filtering, and selecting stay instant at any size. Screen readers still hear the full count (`aria-rowcount`) and each row's position.
1267
1314
 
1268
1315
  ## EmptyState
1269
1316
 
@@ -1384,19 +1431,19 @@ import { List } from "@vjdesigns/vjdesigns-ui";
1384
1431
 
1385
1432
  Category: data-display · Storybook: Data Display/List
1386
1433
 
1387
- A semantic list (`<ul>` or `<ol>`) with styled markers and rich items.
1388
-
1389
- Every variant draws its own markers, so the browser's markers are removed
1390
- with CSS; `role="list"` is added so Safari and VoiceOver keep announcing
1391
- the list and its item count.
1392
-
1393
- This is a list, not a listbox: items are not selectable options and there
1394
- is no roving focus. Interactive items (`List.ItemButton`, `List.ItemLink`)
1395
- are ordinary Tab stops. For choosing among options, use a Listbox,
1396
- Combobox, or Select instead.
1397
-
1398
- Grouping: put a `List.Subheader` (a real heading by default) before each
1399
- list and point the list at it with `aria-labelledby`, so screen readers
1434
+ A semantic list (`<ul>` or `<ol>`) with styled markers and rich items.
1435
+
1436
+ Every variant draws its own markers, so the browser's markers are removed
1437
+ with CSS; `role="list"` is added so Safari and VoiceOver keep announcing
1438
+ the list and its item count.
1439
+
1440
+ This is a list, not a listbox: items are not selectable options and there
1441
+ is no roving focus. Interactive items (`List.ItemButton`, `List.ItemLink`)
1442
+ are ordinary Tab stops. For choosing among options, use a Listbox,
1443
+ Combobox, or Select instead.
1444
+
1445
+ Grouping: put a `List.Subheader` (a real heading by default) before each
1446
+ list and point the list at it with `aria-labelledby`, so screen readers
1400
1447
  announce "Account, list, 3 items".
1401
1448
 
1402
1449
  ### Props
@@ -1416,8 +1463,8 @@ announce "Account, list, 3 items".
1416
1463
 
1417
1464
  Also exported as `ListItem`.
1418
1465
 
1419
- A static list item (`<li>`) with optional `start`, `title`, `description`,
1420
- `meta`, and `end` slots, or plain `children`. For a clickable row, use
1466
+ A static list item (`<li>`) with optional `start`, `title`, `description`,
1467
+ `meta`, and `end` slots, or plain `children`. For a clickable row, use
1421
1468
  `List.ItemButton` or `List.ItemLink`.
1422
1469
 
1423
1470
  - `start`: `ReactNode`. Leading visual: an `Avatar`, an `Icon`, or a thumbnail.
@@ -1435,14 +1482,14 @@ A static list item (`<li>`) with optional `start`, `title`, `description`,
1435
1482
 
1436
1483
  Also exported as `ListItemButton`.
1437
1484
 
1438
- A list item whose main area is a real `<button>`. The button wraps the
1439
- title (or `children` when there is no title) and its hit area is
1440
- stretched over the whole row, so the row is clickable, while `end`
1441
- actions sit above it and stay independently clickable. Never nest
1442
- interactive elements in `title` or `description`.
1443
-
1444
- `className` and `style` go on the row `<li>`; `ref`, `onClick`, `type`,
1445
- `aria-*`, and every other prop go on the `<button>`. The description and
1485
+ A list item whose main area is a real `<button>`. The button wraps the
1486
+ title (or `children` when there is no title) and its hit area is
1487
+ stretched over the whole row, so the row is clickable, while `end`
1488
+ actions sit above it and stay independently clickable. Never nest
1489
+ interactive elements in `title` or `description`.
1490
+
1491
+ `className` and `style` go on the row `<li>`; `ref`, `onClick`, `type`,
1492
+ `aria-*`, and every other prop go on the `<button>`. The description and
1446
1493
  meta become the button's accessible description.
1447
1494
 
1448
1495
  - `start`: `ReactNode`. Leading visual: an `Avatar`, an `Icon`, or a thumbnail.
@@ -1464,12 +1511,12 @@ meta become the button's accessible description.
1464
1511
 
1465
1512
  Also exported as `ListItemLink`.
1466
1513
 
1467
- A list item whose main area is a real `<a>`, stretched over the whole row
1468
- like `List.ItemButton`. `selected` sets `aria-current="page"` (override
1469
- with `current`). When `disabled`, the link loses its `href` and is marked
1470
- `aria-disabled`, so it can't be followed or focused.
1471
-
1472
- `className` and `style` go on the row `<li>`; everything else, including
1514
+ A list item whose main area is a real `<a>`, stretched over the whole row
1515
+ like `List.ItemButton`. `selected` sets `aria-current="page"` (override
1516
+ with `current`). When `disabled`, the link loses its `href` and is marked
1517
+ `aria-disabled`, so it can't be followed or focused.
1518
+
1519
+ `className` and `style` go on the row `<li>`; everything else, including
1473
1520
  `ref` and `href`, goes on the `<a>`.
1474
1521
 
1475
1522
  - `start`: `ReactNode`. Leading visual: an `Avatar`, an `Icon`, or a thumbnail.
@@ -1491,14 +1538,14 @@ with `current`). When `disabled`, the link loses its `href` and is marked
1491
1538
 
1492
1539
  Also exported as `ListSubheader`.
1493
1540
 
1494
- An uppercase label for a group of items. Render it before (outside) a
1495
- `List`, give it an `id`, and pass that id to the list's
1496
- `aria-labelledby`. It must not go inside the `<ul>`, where it would be
1497
- counted as an item.
1498
-
1499
- ```tsx
1500
- <List.Subheader id="acct">Account</List.Subheader>
1501
- <List aria-labelledby="acct">...</List>
1541
+ An uppercase label for a group of items. Render it before (outside) a
1542
+ `List`, give it an `id`, and pass that id to the list's
1543
+ `aria-labelledby`. It must not go inside the `<ul>`, where it would be
1544
+ counted as an item.
1545
+
1546
+ ```tsx
1547
+ <List.Subheader id="acct">Account</List.Subheader>
1548
+ <List aria-labelledby="acct">...</List>
1502
1549
  ```
1503
1550
 
1504
1551
  - `as`: `ListSubheaderElement` (default "h3"). Element to render. A heading (default `h3`) so grouped lists show up in the screen reader's headings list; pick the level that fits the page outline, or `div` when a heading would be out of place.
@@ -1635,7 +1682,7 @@ Semantic data table. See `TableRoot` docs above; parts are attached as `Table.*`
1635
1682
 
1636
1683
  Also exported as `TableCaption`.
1637
1684
 
1638
- The table's title (`<caption>`). It names the table and, when the table
1685
+ The table's title (`<caption>`). It names the table and, when the table
1639
1686
  scrolls, its scroll region. Strongly recommended on every table.
1640
1687
 
1641
1688
  - Plus every native `<caption>` attribute.
@@ -1677,9 +1724,9 @@ A table row (`<tr>`).
1677
1724
 
1678
1725
  Also exported as `TableHeaderCell`.
1679
1726
 
1680
- A header cell (`<th>`). With `sortable`, the whole cell is a real
1681
- `<button>` and the header carries `aria-sort` while it is the sorted column.
1682
- The sort icon shows the direction by shape (up arrow, down arrow, or a
1727
+ A header cell (`<th>`). With `sortable`, the whole cell is a real
1728
+ `<button>` and the header carries `aria-sort` while it is the sorted column.
1729
+ The sort icon shows the direction by shape (up arrow, down arrow, or a
1683
1730
  neutral double arrow), not by color alone.
1684
1731
 
1685
1732
  - `align`: `TableCellAlign` (default "start" ("end" when `numeric`)). Horizontal alignment.
@@ -1709,8 +1756,8 @@ A data cell (`<td>`).
1709
1756
 
1710
1757
  Also exported as `TableSelectCell`.
1711
1758
 
1712
- A data cell holding the row's selection checkbox. Pair with `selected` on
1713
- the `Table.Row`. Give it a `rowLabel` (or `checkboxLabel`) so each
1759
+ A data cell holding the row's selection checkbox. Pair with `selected` on
1760
+ the `Table.Row`. Give it a `rowLabel` (or `checkboxLabel`) so each
1714
1761
  checkbox has a unique accessible name.
1715
1762
 
1716
1763
  - `checked`: `boolean` (required). Whether the row is selected.
@@ -1724,7 +1771,7 @@ checkbox has a unique accessible name.
1724
1771
 
1725
1772
  Also exported as `TableSelectAllCell`.
1726
1773
 
1727
- A header cell (`<th scope="col">`) with a "select all" checkbox. Shows the
1774
+ A header cell (`<th scope="col">`) with a "select all" checkbox. Shows the
1728
1775
  mixed state (`aria-checked="mixed"`) when some rows are selected.
1729
1776
 
1730
1777
  - `checked`: `boolean` (required). Whether every row is selected.
@@ -2799,6 +2846,7 @@ and size are wired automatically, as with `Input`.
2799
2846
  - Required: `required` blocks native form submission until an option is chosen (`setCustomValidity` on the text input).
2800
2847
  - Clear On Escape: `clearOnEscape`: once the text matches the selection, Escape also clears the selection.
2801
2848
  - Form submit, reset, and custom values: Form behavior: Enter submits what is shown (cleared text submits no team), a form reset restores the default, and re-entering a custom tag that's already chosen doesn't remove it.
2849
+ - Long list (10,000 options): 10,000 options. Only the options in view are in the page (plus the highlighted one), so opening, scrolling, and typing stay instant. Each option carries its position in the full list (`aria-setsize`, `aria-posinset`), so screen readers still hear "10,000 of 10,000". Lists with groups always render in full.
2802
2850
 
2803
2851
  ## DatePicker
2804
2852
 
@@ -3196,7 +3244,7 @@ import { FileUpload } from "@vjdesigns/vjdesigns-ui";
3196
3244
 
3197
3245
  Category: forms · Storybook: Forms/FileUpload
3198
3246
 
3199
- File picker with drag and drop, validation, and a file list.
3247
+ File picker with drag and drop, validation, and a file list.
3200
3248
  `FileUpload.List` is the standalone list for custom layouts.
3201
3249
 
3202
3250
  ### Props
@@ -3235,13 +3283,13 @@ File picker with drag and drop, validation, and a file list.
3235
3283
 
3236
3284
  Also exported as `FileUploadList`.
3237
3285
 
3238
- The list of selected files: icon or image thumbnail, name (truncated, full
3239
- name on hover and focus), formatted size, optional upload progress and
3240
- status, and a remove button per file. `FileUpload` renders one for you;
3241
- use `FileUpload.List` directly for custom layouts.
3242
-
3243
- After a removal, focus moves to the next item's remove button (or the
3244
- previous one), then to `focusFallback` when the list becomes empty.
3286
+ The list of selected files: icon or image thumbnail, name (truncated, full
3287
+ name on hover and focus), formatted size, optional upload progress and
3288
+ status, and a remove button per file. `FileUpload` renders one for you;
3289
+ use `FileUpload.List` directly for custom layouts.
3290
+
3291
+ After a removal, focus moves to the next item's remove button (or the
3292
+ previous one), then to `focusFallback` when the list becomes empty.
3245
3293
  Upload completions and failures are announced in a polite live region.
3246
3294
 
3247
3295
  - `files`: `File[]` (required). The files to show.
@@ -3339,21 +3387,21 @@ import { NumberInput } from "@vjdesigns/vjdesigns-ui";
3339
3387
 
3340
3388
  Category: forms · Storybook: Forms/NumberInput
3341
3389
 
3342
- A numeric text field following the WAI-ARIA spinbutton pattern. The
3343
- `<input>` itself is the spinbutton: it takes focus, exposes
3344
- `aria-valuenow`/`min`/`max`/`valuetext`, and handles ArrowUp/Down,
3345
- PageUp/Down, Home/End, and Enter. Stepper buttons are pointer
3346
- conveniences (press and hold to repeat) and stay out of the tab order.
3347
-
3348
- Shows a formatted value (`Intl.NumberFormat`) when not focused and the
3349
- plain editable number while focused; parses locale input (group
3350
- separators, decimal comma). Built on `Input`, so size, variant, radius,
3351
- addons, and `Field` wiring match every other text field.
3352
-
3353
- ```tsx
3354
- <Field label="Weight">
3355
- <NumberInput min={0} step={2.5} endAddon="kg" defaultValue={60} />
3356
- </Field>
3390
+ A numeric text field following the WAI-ARIA spinbutton pattern. The
3391
+ `<input>` itself is the spinbutton: it takes focus, exposes
3392
+ `aria-valuenow`/`min`/`max`/`valuetext`, and handles ArrowUp/Down,
3393
+ PageUp/Down, Home/End, and Enter. Stepper buttons are pointer
3394
+ conveniences (press and hold to repeat) and stay out of the tab order.
3395
+
3396
+ Shows a formatted value (`Intl.NumberFormat`) when not focused and the
3397
+ plain editable number while focused; parses locale input (group
3398
+ separators, decimal comma). Built on `Input`, so size, variant, radius,
3399
+ addons, and `Field` wiring match every other text field.
3400
+
3401
+ ```tsx
3402
+ <Field label="Weight">
3403
+ <NumberInput min={0} step={2.5} endAddon="kg" defaultValue={60} />
3404
+ </Field>
3357
3405
  ```
3358
3406
 
3359
3407
  ### Props
@@ -5452,22 +5500,22 @@ import { Navbar } from "@vjdesigns/vjdesigns-ui";
5452
5500
 
5453
5501
  Category: navigation · Storybook: Navigation/Navbar
5454
5502
 
5455
- The top header of an app or site. Renders a `<header>` (a `banner`
5456
- landmark when it isn't inside `main`, `article`, `aside`, `nav`, or
5457
- `section`) with brand, navigation, and actions. Below `collapseBelow`
5458
- the navigation moves into a modal drawer opened by a menu button.
5459
-
5460
- ```tsx
5461
- <Navbar>
5462
- <Navbar.Brand href="/">Hoops</Navbar.Brand>
5463
- <Navbar.Nav>
5464
- <Navbar.Link href="/" active>Home</Navbar.Link>
5465
- <Navbar.Link href="/teams">Teams</Navbar.Link>
5466
- </Navbar.Nav>
5467
- <Navbar.Actions>
5468
- <Button size="sm">Sign in</Button>
5469
- </Navbar.Actions>
5470
- </Navbar>
5503
+ The top header of an app or site. Renders a `<header>` (a `banner`
5504
+ landmark when it isn't inside `main`, `article`, `aside`, `nav`, or
5505
+ `section`) with brand, navigation, and actions. Below `collapseBelow`
5506
+ the navigation moves into a modal drawer opened by a menu button.
5507
+
5508
+ ```tsx
5509
+ <Navbar>
5510
+ <Navbar.Brand href="/">Hoops</Navbar.Brand>
5511
+ <Navbar.Nav>
5512
+ <Navbar.Link href="/" active>Home</Navbar.Link>
5513
+ <Navbar.Link href="/teams">Teams</Navbar.Link>
5514
+ </Navbar.Nav>
5515
+ <Navbar.Actions>
5516
+ <Button size="sm">Sign in</Button>
5517
+ </Navbar.Actions>
5518
+ </Navbar>
5471
5519
  ```
5472
5520
 
5473
5521
  ### Props
@@ -5505,12 +5553,12 @@ The logo or product name at the start of the bar, usually a link home.
5505
5553
 
5506
5554
  Also exported as `NavbarNav`.
5507
5555
 
5508
- The primary links: a `<nav>` landmark around a `<ul>`. Above the
5509
- `collapseBelow` breakpoint they sit in the bar; below it they are hidden
5510
- (`display: none`) and the same links render vertically in a drawer that the
5511
- menu button opens. Only one copy is ever exposed to assistive technology.
5512
-
5513
- Other props go on the inline `<nav>` only. The drawer copy gets the same
5556
+ The primary links: a `<nav>` landmark around a `<ul>`. Above the
5557
+ `collapseBelow` breakpoint they sit in the bar; below it they are hidden
5558
+ (`display: none`) and the same links render vertically in a drawer that the
5559
+ menu button opens. Only one copy is ever exposed to assistive technology.
5560
+
5561
+ Other props go on the inline `<nav>` only. The drawer copy gets the same
5514
5562
  `aria-label` / `aria-labelledby`.
5515
5563
 
5516
5564
  - `children`: `ReactNode`. `Navbar.Link`s (each is wrapped in an `<li>` for you) and/or `Navbar.Item`s.
@@ -5523,9 +5571,9 @@ Other props go on the inline `<nav>` only. The drawer copy gets the same
5523
5571
 
5524
5572
  Also exported as `NavbarItem`.
5525
5573
 
5526
- A list item in `Navbar.Nav`. `Navbar.Link` adds its own `<li>`, so you
5527
- only need this to wrap something else, to put props on the `<li>`, or to
5528
- show an item only in the bar or only in the drawer (`showIn`). A `ref`
5574
+ A list item in `Navbar.Nav`. `Navbar.Link` adds its own `<li>`, so you
5575
+ only need this to wrap something else, to put props on the `<li>`, or to
5576
+ show an item only in the bar or only in the drawer (`showIn`). A `ref`
5529
5577
  attaches to the bar's copy.
5530
5578
 
5531
5579
  - `children`: `ReactNode`. A `Navbar.Link`, or any other control (e.g. a `Button`) that belongs in the list.
@@ -5536,18 +5584,47 @@ attaches to the bar's copy.
5536
5584
 
5537
5585
  Also exported as `NavbarLink`.
5538
5586
 
5539
- A primary navigation link. Wraps itself in an `<li>` unless it's already
5540
- inside `Navbar.Item`. In the mobile drawer, clicking it closes the drawer
5541
- (even if a router prevents the default navigation).
5542
-
5543
- It renders once in the bar and once in the drawer (only one is ever
5587
+ A primary navigation link. Wraps itself in an `<li>` unless it's already
5588
+ inside `Navbar.Item`. In the mobile drawer, clicking it closes the drawer
5589
+ (even if a router prevents the default navigation).
5590
+
5591
+ It renders once in the bar and once in the drawer (only one is ever
5544
5592
  exposed), so don't give it an `id`. A `ref` attaches to the bar's copy.
5545
5593
 
5546
5594
  - `as`: `C`. Component or element to render. Defaults to `a`. Pass a router link (e.g. React Router or Next.js `Link`) and its props (such as `to`) are accepted and typed. It must forward `className`, `onClick`, and ARIA props to its `<a>`.
5547
5595
  - `active`: `boolean` (default false). Marks the link as the current page: sets `aria-current="page"` and shows a filled pill with an indicator bar, so the state never relies on color alone.
5548
5596
  - `icon`: `ReactNode`. Decorative icon before the label. Hidden from assistive technology.
5597
+ - `badge`: `NavbarBadgeValue`. A count (rendered with `Badge` `count`, capped at 99+, hidden at 0) or a short text such as "New", after the label. It's part of the link's name ("Messages 3"), in the bar and the mobile menu.
5598
+ - `badgeLabel`: `string`. Screen-reader text for the badge, e.g. "3 unread messages". Replaces the visible badge text in the accessible name.
5599
+ - `badgeTone`: `Tone`. Badge color. By default `accent`, except in the `solid` bar, where the badge takes the bar's own colors swapped (a `Badge` `variant="inverse"`) so it stands out from the bar in both themes. Setting it always gives a solid badge in that tone.
5549
5600
  - `children`: `ReactNode`. The visible label.
5550
5601
 
5602
+ ### Navbar.Group
5603
+
5604
+ Also exported as `NavbarGroup`.
5605
+
5606
+ A group of links under one button, following the WAI-ARIA disclosure
5607
+ navigation pattern (not a `menu`): the button has `aria-expanded`, and the
5608
+ links stay ordinary links in the Tab order.
5609
+
5610
+ - In the bar: the button opens a dropdown below it. Escape closes it and
5611
+ returns focus to the button; so do a press outside, Tab moving focus out
5612
+ of the group, and activating a link. Opening one group closes the others.
5613
+ - In the mobile menu: an expandable section with the links indented below.
5614
+
5615
+ - `label`: `ReactNode` (required). The group button's visible label, and its accessible name.
5616
+ - `icon`: `ReactNode`. Decorative icon before the label.
5617
+ - `children`: `ReactNode`. The group's `Navbar.Link`s.
5618
+ - `active`: `boolean` (default false). One of the group's links is the current page. The button then shows the active look (it doesn't set `aria-current`; the link does), and the group starts open in the mobile menu.
5619
+ - `badge`: `NavbarBadgeValue`. A count or short text on the group button, like `Navbar.Link`'s `badge`.
5620
+ - `badgeLabel`: `string`. Screen-reader text for the badge.
5621
+ - `badgeTone`: `Tone`. Badge color. Same default as `Navbar.Link`'s `badgeTone` (inverse on the solid bar).
5622
+ - `open`: `boolean`. Controlled open state of the dropdown in the bar.
5623
+ - `defaultOpen`: `boolean` (default false). Initial open state of the dropdown when uncontrolled.
5624
+ - `onOpenChange`: `(open: boolean) => void`. Called with the next open state of the dropdown in the bar.
5625
+ - `disabled`: `boolean` (default false). Disables the group button.
5626
+ - Plus every native `<li>` attribute.
5627
+
5551
5628
  ### Navbar.Actions
5552
5629
 
5553
5630
  Also exported as `NavbarActions`.
@@ -5567,7 +5644,12 @@ The end of the bar: actions that stay visible at every width, before the menu bu
5567
5644
  - Sizes: `sm` 56px, `md` 64px, `lg` 80px tall. Links and the menu button scale with it.
5568
5645
  - With Actions: The actions area holds anything that should stay visible at every width.
5569
5646
  - Active Link: `active` sets `aria-current="page"` and draws an accent-tinted pill with an indicator bar, so the current page is marked by shape as well as color. Links can carry a decorative `icon`.
5570
- - Mobile: On a phone-sized viewport the links collapse into a menu button ("Open menu", with `aria-expanded` and `aria-controls`) that opens them in a drawer. The inline nav is `display: none`, so only one "Main" navigation is ever exposed. Choosing a link closes the drawer.
5647
+ - Link Badges: `badge` on `Navbar.Link` (and `Navbar.Group`) shows a count or short text after the label, in the bar and the mobile menu. `badgeLabel` gives screen readers the full meaning ("Messages, 3 unread messages"). On the solid bar, a badge without a `badgeTone` swaps the bar's colors (`Badge` `variant="inverse"`), so it stands out in both themes.
5648
+ - Link Groups: `Navbar.Group` puts links under one button (the WAI-ARIA disclosure navigation pattern, not a menu). The button opens a dropdown; Escape, a press outside, Tab moving out, or choosing a link closes it, and opening one group closes the other. `active` marks the group holding the current page.
5649
+ - Link group, last on the page: A group as the last focusable thing on the page: Tab past its last link leaves the page, and the dropdown still closes. A press on the panel's padding (nothing focusable) keeps it open.
5650
+ - Link Groups Mobile: In the mobile menu, a group is an expandable section; the one holding the current page starts open.
5651
+ - Link Groups Right To Left: Right-to-left: the dropdown lines up with the button's right edge.
5652
+ - Mobile
5571
5653
  - Mobile Solid: The solid bar on a phone, with the menu sliding in from the start edge.
5572
5654
  - Router Links: Pass a router link component with `as` (on `Navbar.Link` and `Navbar.Brand`); its own props, such as `to`, are typed. Track the current route yourself and set `active` on the matching link.
5573
5655
  - Sticky on a long page: `position="sticky"` (the default) with `elevateOnScroll`: the soft shadow appears once the page scrolls. Scroll the canvas to see it.
@@ -6700,9 +6782,9 @@ import { Tooltip } from "@vjdesigns/vjdesigns-ui";
6700
6782
 
6701
6783
  Category: overlays · Storybook: Overlays/Tooltip
6702
6784
 
6703
- A short, non-interactive label or description that appears on hover and on
6704
- keyboard focus. Follows the WAI-ARIA tooltip pattern and WCAG 1.4.13: it
6705
- can be dismissed with Escape, the pointer can move onto it, and it stays
6785
+ A short, non-interactive label or description that appears on hover and on
6786
+ keyboard focus. Follows the WAI-ARIA tooltip pattern and WCAG 1.4.13: it
6787
+ can be dismissed with Escape, the pointer can move onto it, and it stays
6706
6788
  open until the pointer or focus leaves. Use `Popover` for interactive content.
6707
6789
 
6708
6790
  ### Props
@@ -6745,7 +6827,7 @@ import { TooltipProvider } from "@vjdesigns/vjdesigns-ui";
6745
6827
 
6746
6828
  Category: overlays · Storybook: Overlays/Tooltip
6747
6829
 
6748
- Optional. Sets shared timing for the tooltips inside it. Tooltips work
6830
+ Optional. Sets shared timing for the tooltips inside it. Tooltips work
6749
6831
  without a provider, using the defaults.
6750
6832
 
6751
6833
  ### Props
@@ -7908,6 +7990,16 @@ typing in that element.
7908
7990
  <Textarea onKeyDown={getHotkeyHandler([["mod+enter", send]])} />
7909
7991
  ```
7910
7992
 
7993
+ ## withExtraItems
7994
+
7995
+ ```ts
7996
+ withExtraItems(virtualizer: Virtualizer, extra: readonly number[]): VirtualItem[]
7997
+ ```
7998
+
7999
+ The window's items plus extra indices that must stay rendered even when
8000
+ scrolled out of view (a focused row, a highlighted option), in order.
8001
+ Render spacers between non-adjacent items from their `start` / `end`.
8002
+
7911
8003
  ## cx
7912
8004
 
7913
8005
  ```ts