@plexui/ui 0.19.1 → 0.20.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 (402) hide show
  1. package/README.md +15 -138
  2. package/dist/es/components/Accordion/Accordion.js +2 -2
  3. package/dist/es/components/Accordion/Accordion.js.map +1 -1
  4. package/dist/es/components/Accordion/index.js +1 -1
  5. package/dist/es/components/Alert/Alert.js +6 -6
  6. package/dist/es/components/Alert/Alert.js.map +1 -1
  7. package/dist/es/components/Alert/index.js +1 -1
  8. package/dist/es/components/Avatar/Avatar.js +12 -5
  9. package/dist/es/components/Avatar/Avatar.js.map +1 -1
  10. package/dist/es/components/Avatar/AvatarGroup.js +2 -2
  11. package/dist/es/components/Avatar/AvatarGroup.js.map +1 -1
  12. package/dist/es/components/Avatar/index.js +2 -2
  13. package/dist/es/components/Badge/index.js +3 -3
  14. package/dist/es/components/Badge/index.js.map +1 -1
  15. package/dist/es/components/Breadcrumb/Breadcrumb.js +34 -0
  16. package/dist/es/components/Breadcrumb/Breadcrumb.js.map +1 -0
  17. package/dist/es/components/Breadcrumb/index.js +2 -0
  18. package/dist/es/components/Breadcrumb/index.js.map +1 -0
  19. package/dist/es/components/Button/Button.js +7 -7
  20. package/dist/es/components/Button/Button.js.map +1 -1
  21. package/dist/es/components/Button/CopyButton.js +25 -13
  22. package/dist/es/components/Button/CopyButton.js.map +1 -1
  23. package/dist/es/components/Button/index.js +2 -2
  24. package/dist/es/components/ButtonGroup/ButtonGroup.js +2 -2
  25. package/dist/es/components/ButtonGroup/ButtonGroup.js.map +1 -1
  26. package/dist/es/components/ButtonGroup/index.js +1 -1
  27. package/dist/es/components/Card/Card.js +4 -3
  28. package/dist/es/components/Card/Card.js.map +1 -1
  29. package/dist/es/components/Card/index.js +1 -1
  30. package/dist/es/components/Checkbox/Checkbox.js +12 -6
  31. package/dist/es/components/Checkbox/Checkbox.js.map +1 -1
  32. package/dist/es/components/Checkbox/index.js +1 -1
  33. package/dist/es/components/CodeBlock/CodeBlock.js +25 -25
  34. package/dist/es/components/CodeBlock/CodeBlock.js.map +1 -1
  35. package/dist/es/components/CodeBlock/CollapsibleCodeBlock.js +6 -4
  36. package/dist/es/components/CodeBlock/CollapsibleCodeBlock.js.map +1 -1
  37. package/dist/es/components/CodeBlock/index.js +2 -2
  38. package/dist/es/components/DataTable/DataTable.js +108 -27
  39. package/dist/es/components/DataTable/DataTable.js.map +1 -1
  40. package/dist/es/components/DataTable/DataTableColumnHeader.js +2 -2
  41. package/dist/es/components/DataTable/DataTableColumnHeader.js.map +1 -1
  42. package/dist/es/components/DataTable/DataTablePagination.js +8 -4
  43. package/dist/es/components/DataTable/DataTablePagination.js.map +1 -1
  44. package/dist/es/components/DataTable/columnHelpers.js +3 -3
  45. package/dist/es/components/DataTable/index.js +4 -4
  46. package/dist/es/components/DateInput/DateInput.js +21 -13
  47. package/dist/es/components/DateInput/DateInput.js.map +1 -1
  48. package/dist/es/components/DateInput/index.js +1 -1
  49. package/dist/es/components/DatePicker/Calendar.js +136 -32
  50. package/dist/es/components/DatePicker/Calendar.js.map +1 -1
  51. package/dist/es/components/DatePicker/DatePicker.js +15 -11
  52. package/dist/es/components/DatePicker/DatePicker.js.map +1 -1
  53. package/dist/es/components/DatePicker/index.js +1 -1
  54. package/dist/es/components/DateRangePicker/Calendar.js +125 -22
  55. package/dist/es/components/DateRangePicker/Calendar.js.map +1 -1
  56. package/dist/es/components/DateRangePicker/DateRangePicker.js +10 -9
  57. package/dist/es/components/DateRangePicker/DateRangePicker.js.map +1 -1
  58. package/dist/es/components/DateRangePicker/Trigger.js +12 -9
  59. package/dist/es/components/DateRangePicker/Trigger.js.map +1 -1
  60. package/dist/es/components/DateRangePicker/index.js +2 -2
  61. package/dist/es/components/Dialog/Dialog.js +11 -6
  62. package/dist/es/components/Dialog/Dialog.js.map +1 -1
  63. package/dist/es/components/Dialog/index.js +1 -1
  64. package/dist/es/components/Dialog/index.js.map +1 -1
  65. package/dist/es/components/EmptyMessage/EmptyMessage.js +4 -4
  66. package/dist/es/components/EmptyMessage/EmptyMessage.js.map +1 -1
  67. package/dist/es/components/EmptyMessage/index.js +1 -1
  68. package/dist/es/components/Field/Field.js +22 -7
  69. package/dist/es/components/Field/Field.js.map +1 -1
  70. package/dist/es/components/Field/index.js +1 -1
  71. package/dist/es/components/FieldError/FieldError.js +4 -4
  72. package/dist/es/components/FieldError/FieldError.js.map +1 -1
  73. package/dist/es/components/FieldError/index.js +1 -1
  74. package/dist/es/components/FileUpload/FileUpload.js +12 -9
  75. package/dist/es/components/FileUpload/FileUpload.js.map +1 -1
  76. package/dist/es/components/FileUpload/index.js +1 -1
  77. package/dist/es/components/FloatingLabelInput/FloatingLabelInput.js +31 -4
  78. package/dist/es/components/FloatingLabelInput/FloatingLabelInput.js.map +1 -1
  79. package/dist/es/components/FloatingLabelInput/index.js +1 -1
  80. package/dist/es/components/FloatingLabelSelect/FloatingLabelSelect.js +28 -8
  81. package/dist/es/components/FloatingLabelSelect/FloatingLabelSelect.js.map +1 -1
  82. package/dist/es/components/FloatingLabelSelect/index.js +1 -1
  83. package/dist/es/components/Icon/aliases.js +20 -20
  84. package/dist/es/components/Icon/index.js +653 -653
  85. package/dist/es/components/Image/Image.js +19 -7
  86. package/dist/es/components/Image/Image.js.map +1 -1
  87. package/dist/es/components/Image/index.js +1 -1
  88. package/dist/es/components/Indicator/CircularProgress.js +3 -3
  89. package/dist/es/components/Indicator/CircularProgress.js.map +1 -1
  90. package/dist/es/components/Indicator/LoadingDots.js +1 -1
  91. package/dist/es/components/Indicator/LoadingDots.js.map +1 -1
  92. package/dist/es/components/Indicator/LoadingIndicator.js +2 -2
  93. package/dist/es/components/Indicator/LoadingIndicator.js.map +1 -1
  94. package/dist/es/components/Indicator/index.js +3 -3
  95. package/dist/es/components/Input/Input.js +16 -5
  96. package/dist/es/components/Input/Input.js.map +1 -1
  97. package/dist/es/components/Input/index.js +1 -1
  98. package/dist/es/components/InputGroup/InputGroup.js +60 -0
  99. package/dist/es/components/InputGroup/InputGroup.js.map +1 -0
  100. package/dist/es/components/InputGroup/index.js +2 -0
  101. package/dist/es/components/InputGroup/index.js.map +1 -0
  102. package/dist/es/components/Kbd/Kbd.js +13 -0
  103. package/dist/es/components/Kbd/Kbd.js.map +1 -0
  104. package/dist/es/components/Kbd/index.js +2 -0
  105. package/dist/es/components/Kbd/index.js.map +1 -0
  106. package/dist/es/components/Label/Label.js +1 -1
  107. package/dist/es/components/Label/Label.js.map +1 -1
  108. package/dist/es/components/Label/index.js +1 -1
  109. package/dist/es/components/Markdown/Markdown.js +8 -8
  110. package/dist/es/components/Markdown/Markdown.js.map +1 -1
  111. package/dist/es/components/Markdown/directives.js +2 -2
  112. package/dist/es/components/Markdown/index.js +4 -5
  113. package/dist/es/components/Markdown/index.js.map +1 -1
  114. package/dist/es/components/MarkdownEditor/MarkdownEditor.js +35 -11
  115. package/dist/es/components/MarkdownEditor/MarkdownEditor.js.map +1 -1
  116. package/dist/es/components/MarkdownEditor/index.js +1 -1
  117. package/dist/es/components/Menu/Menu.js +30 -22
  118. package/dist/es/components/Menu/Menu.js.map +1 -1
  119. package/dist/es/components/Menu/index.js +1 -1
  120. package/dist/es/components/OTPInput/OTPInput.js +51 -34
  121. package/dist/es/components/OTPInput/OTPInput.js.map +1 -1
  122. package/dist/es/components/OTPInput/index.js +1 -1
  123. package/dist/es/components/PlexUIProvider/PlexUIProvider.js +3 -1
  124. package/dist/es/components/PlexUIProvider/PlexUIProvider.js.map +1 -1
  125. package/dist/es/components/PlexUIProvider/index.js +1 -1
  126. package/dist/es/components/PlexUIProvider/internal.js +1 -1
  127. package/dist/es/components/Popover/Popover.js +7 -7
  128. package/dist/es/components/Popover/Popover.js.map +1 -1
  129. package/dist/es/components/Popover/index.js +2 -3
  130. package/dist/es/components/Popover/index.js.map +1 -1
  131. package/dist/es/components/Popover/usePopoverController.js +2 -2
  132. package/dist/es/components/Progress/Progress.js +1 -1
  133. package/dist/es/components/Progress/Progress.js.map +1 -1
  134. package/dist/es/components/Progress/index.js +1 -1
  135. package/dist/es/components/ProgressSteps/ProgressSteps.js +6 -4
  136. package/dist/es/components/ProgressSteps/ProgressSteps.js.map +1 -1
  137. package/dist/es/components/ProgressSteps/index.js +1 -1
  138. package/dist/es/components/RadioGroup/RadioGroup.js +10 -6
  139. package/dist/es/components/RadioGroup/RadioGroup.js.map +1 -1
  140. package/dist/es/components/RadioGroup/index.js +1 -1
  141. package/dist/es/components/SegmentedControl/index.js +1 -1
  142. package/dist/es/components/Select/Select.js +103 -67
  143. package/dist/es/components/Select/Select.js.map +1 -1
  144. package/dist/es/components/Select/index.js +1 -1
  145. package/dist/es/components/SelectControl/SelectControl.js +10 -5
  146. package/dist/es/components/SelectControl/SelectControl.js.map +1 -1
  147. package/dist/es/components/SelectControl/index.js +1 -1
  148. package/dist/es/components/Separator/Separator.js +1 -1
  149. package/dist/es/components/Separator/Separator.js.map +1 -1
  150. package/dist/es/components/Separator/index.js +1 -1
  151. package/dist/es/components/ShimmerText/ShimmerText.js +1 -1
  152. package/dist/es/components/ShimmerText/ShimmerText.js.map +1 -1
  153. package/dist/es/components/ShimmerText/index.js +1 -1
  154. package/dist/es/components/Sidebar/Sidebar.js +37 -29
  155. package/dist/es/components/Sidebar/Sidebar.js.map +1 -1
  156. package/dist/es/components/Sidebar/index.js +2 -2
  157. package/dist/es/components/Sidebar/useSidebarContext.js +17 -19
  158. package/dist/es/components/Sidebar/useSidebarContext.js.map +1 -1
  159. package/dist/es/components/Skeleton/index.js +1 -1
  160. package/dist/es/components/Skeleton/index.js.map +1 -1
  161. package/dist/es/components/Slider/Slider.js +48 -19
  162. package/dist/es/components/Slider/Slider.js.map +1 -1
  163. package/dist/es/components/Slider/index.js +1 -1
  164. package/dist/es/components/StatCard/StatCard.js +5 -5
  165. package/dist/es/components/StatCard/StatCard.js.map +1 -1
  166. package/dist/es/components/StatCard/index.js +1 -1
  167. package/dist/es/components/Switch/Switch.js +7 -3
  168. package/dist/es/components/Switch/Switch.js.map +1 -1
  169. package/dist/es/components/Switch/index.js +1 -1
  170. package/dist/es/components/Table/Table.js +1 -1
  171. package/dist/es/components/Table/Table.js.map +1 -1
  172. package/dist/es/components/Table/index.js +1 -1
  173. package/dist/es/components/Tabs/Tabs.js +154 -6
  174. package/dist/es/components/Tabs/Tabs.js.map +1 -1
  175. package/dist/es/components/Tabs/index.js +1 -1
  176. package/dist/es/components/Tabs/overflow.js +44 -0
  177. package/dist/es/components/Tabs/overflow.js.map +1 -0
  178. package/dist/es/components/TagInput/TagInput.js +47 -23
  179. package/dist/es/components/TagInput/TagInput.js.map +1 -1
  180. package/dist/es/components/TagInput/index.js +1 -1
  181. package/dist/es/components/TextLink/TextLink.js +16 -5
  182. package/dist/es/components/TextLink/TextLink.js.map +1 -1
  183. package/dist/es/components/TextLink/index.js +1 -1
  184. package/dist/es/components/Textarea/Textarea.js +4 -4
  185. package/dist/es/components/Textarea/Textarea.js.map +1 -1
  186. package/dist/es/components/Textarea/index.js +1 -1
  187. package/dist/es/components/Toast/Toaster.js +2 -2
  188. package/dist/es/components/Toast/Toaster.js.map +1 -1
  189. package/dist/es/components/Toast/index.js +1 -1
  190. package/dist/es/components/Tooltip/CopyTooltip.js +30 -9
  191. package/dist/es/components/Tooltip/CopyTooltip.js.map +1 -1
  192. package/dist/es/components/Tooltip/Tooltip.js +3 -3
  193. package/dist/es/components/Tooltip/Tooltip.js.map +1 -1
  194. package/dist/es/components/Tooltip/index.js +2 -2
  195. package/dist/es/components/Transition/Animate.js +4 -4
  196. package/dist/es/components/Transition/Animate.js.map +1 -1
  197. package/dist/es/components/Transition/AnimateLayout.js +4 -4
  198. package/dist/es/components/Transition/AnimateLayout.js.map +1 -1
  199. package/dist/es/components/Transition/AnimateLayoutGroup.js +12 -8
  200. package/dist/es/components/Transition/AnimateLayoutGroup.js.map +1 -1
  201. package/dist/es/components/Transition/SlotTransitionGroup.js +4 -4
  202. package/dist/es/components/Transition/TransitionGroup.js +5 -5
  203. package/dist/es/components/Transition/TransitionGroup.js.map +1 -1
  204. package/dist/es/components/Transition/getDisableAnimations.js +1 -1
  205. package/dist/es/components/Transition/index.js +5 -5
  206. package/dist/es/components/Transition/shared.js +7 -5
  207. package/dist/es/components/Transition/shared.js.map +1 -1
  208. package/dist/es/components/UIProvider/UIProvider.js +1 -1
  209. package/dist/es/components/UIProvider/index.js +1 -1
  210. package/dist/es/components/UIProvider/internal.js +1 -1
  211. package/dist/es/hooks/useAnimatedScrollTo.js +1 -1
  212. package/dist/es/hooks/useBreakpoints.js +8 -2
  213. package/dist/es/hooks/useBreakpoints.js.map +1 -1
  214. package/dist/es/hooks/useEscCloseStack.js +1 -1
  215. package/dist/es/hooks/usePrevious.js +7 -5
  216. package/dist/es/hooks/usePrevious.js.map +1 -1
  217. package/dist/es/hooks/useTextSelection.js +2 -2
  218. package/dist/es/hooks/useTrailingValue.js +1 -1
  219. package/dist/es/lib/constants.js +1 -1
  220. package/dist/es/lib/helpers.js +1 -1
  221. package/dist/es/lib/helpers.js.map +1 -1
  222. package/dist/es/lib/renderHelpers.js +15 -6
  223. package/dist/es/lib/renderHelpers.js.map +1 -1
  224. package/dist/es/lib/theme.js +16 -16
  225. package/dist/es/lib/theme.js.map +1 -1
  226. package/dist/es/lib/userAgent.js +3 -2
  227. package/dist/es/lib/userAgent.js.map +1 -1
  228. package/dist/es/styles/base.css +1 -102
  229. package/dist/es/styles/globals.css +1 -50
  230. package/dist/es/styles/index.css +1 -25
  231. package/dist/es/styles/katex.min.css +1 -1296
  232. package/dist/es/styles/tailwind-utilities.css +1 -1316
  233. package/dist/es/styles/touch.css +1 -0
  234. package/dist/es/styles/variables-components.css +1 -626
  235. package/dist/es/styles/variables-primitive.css +1 -327
  236. package/dist/es/styles/variables-semantic.css +1 -609
  237. package/dist/es/styles/variables-tailwind-theme.css +1 -34
  238. package/dist/es/styles/variables-tokens-root.css +1 -41
  239. package/dist/es/types.js +1 -1
  240. package/dist/es/types.js.map +1 -1
  241. package/dist/es/vite/index.js +3 -53
  242. package/dist/es/vite/index.js.map +1 -1
  243. package/dist/types/components/Accordion/index.d.ts +1 -1
  244. package/dist/types/components/Alert/Alert.d.ts +8 -2
  245. package/dist/types/components/Alert/index.d.ts +1 -1
  246. package/dist/types/components/Avatar/Avatar.d.ts +1 -1
  247. package/dist/types/components/Avatar/index.d.ts +2 -2
  248. package/dist/types/components/Badge/index.d.ts +1 -1
  249. package/dist/types/components/Breadcrumb/Breadcrumb.d.ts +34 -0
  250. package/dist/types/components/Breadcrumb/index.d.ts +1 -0
  251. package/dist/types/components/Button/Button.d.ts +3 -3
  252. package/dist/types/components/Button/CopyButton.d.ts +9 -4
  253. package/dist/types/components/Button/index.d.ts +2 -2
  254. package/dist/types/components/ButtonGroup/ButtonGroup.d.ts +4 -3
  255. package/dist/types/components/ButtonGroup/index.d.ts +1 -1
  256. package/dist/types/components/Card/index.d.ts +1 -1
  257. package/dist/types/components/Checkbox/Checkbox.d.ts +3 -1
  258. package/dist/types/components/Checkbox/index.d.ts +1 -1
  259. package/dist/types/components/CodeBlock/index.d.ts +2 -2
  260. package/dist/types/components/DataTable/DataTable.d.ts +3 -2
  261. package/dist/types/components/DataTable/index.d.ts +4 -4
  262. package/dist/types/components/DateInput/DateInput.d.ts +1 -1
  263. package/dist/types/components/DateInput/index.d.ts +1 -1
  264. package/dist/types/components/DatePicker/DatePicker.d.ts +7 -6
  265. package/dist/types/components/DatePicker/context.d.ts +1 -1
  266. package/dist/types/components/DatePicker/index.d.ts +2 -2
  267. package/dist/types/components/DateRangePicker/Calendar.d.ts +1 -1
  268. package/dist/types/components/DateRangePicker/DateRangePicker.d.ts +5 -5
  269. package/dist/types/components/DateRangePicker/context.d.ts +2 -2
  270. package/dist/types/components/DateRangePicker/index.d.ts +2 -2
  271. package/dist/types/components/Dialog/Dialog.d.ts +19 -1
  272. package/dist/types/components/Dialog/index.d.ts +1 -1
  273. package/dist/types/components/EmptyMessage/EmptyMessage.d.ts +15 -3
  274. package/dist/types/components/EmptyMessage/index.d.ts +1 -1
  275. package/dist/types/components/Field/Field.d.ts +14 -4
  276. package/dist/types/components/Field/index.d.ts +1 -1
  277. package/dist/types/components/FieldError/FieldError.d.ts +7 -1
  278. package/dist/types/components/FieldError/index.d.ts +1 -1
  279. package/dist/types/components/FileUpload/index.d.ts +1 -1
  280. package/dist/types/components/FloatingLabelInput/index.d.ts +1 -1
  281. package/dist/types/components/FloatingLabelSelect/index.d.ts +1 -1
  282. package/dist/types/components/Icon/aliases.d.ts +20 -20
  283. package/dist/types/components/Icon/index.d.ts +653 -653
  284. package/dist/types/components/Image/Image.d.ts +1 -1
  285. package/dist/types/components/Image/index.d.ts +1 -1
  286. package/dist/types/components/Indicator/index.d.ts +3 -3
  287. package/dist/types/components/Input/Input.d.ts +2 -2
  288. package/dist/types/components/Input/index.d.ts +1 -1
  289. package/dist/types/components/InputGroup/InputGroup.d.ts +78 -0
  290. package/dist/types/components/InputGroup/index.d.ts +1 -0
  291. package/dist/types/components/Kbd/Kbd.d.ts +20 -0
  292. package/dist/types/components/Kbd/index.d.ts +1 -0
  293. package/dist/types/components/Label/index.d.ts +1 -1
  294. package/dist/types/components/Markdown/Markdown.d.ts +1 -1
  295. package/dist/types/components/Markdown/index.d.ts +4 -4
  296. package/dist/types/components/MarkdownEditor/MarkdownEditor.d.ts +6 -2
  297. package/dist/types/components/MarkdownEditor/index.d.ts +1 -1
  298. package/dist/types/components/Menu/Menu.d.ts +19 -5
  299. package/dist/types/components/Menu/index.d.ts +1 -1
  300. package/dist/types/components/OTPInput/index.d.ts +1 -1
  301. package/dist/types/components/PlexUIProvider/PlexUIProvider.d.ts +0 -11
  302. package/dist/types/components/PlexUIProvider/index.d.ts +1 -1
  303. package/dist/types/components/Popover/index.d.ts +2 -2
  304. package/dist/types/components/Progress/index.d.ts +1 -1
  305. package/dist/types/components/ProgressSteps/ProgressSteps.d.ts +1 -1
  306. package/dist/types/components/ProgressSteps/index.d.ts +1 -1
  307. package/dist/types/components/RadioGroup/RadioGroup.d.ts +3 -1
  308. package/dist/types/components/RadioGroup/index.d.ts +1 -1
  309. package/dist/types/components/SegmentedControl/index.d.ts +2 -2
  310. package/dist/types/components/Select/Select.d.ts +8 -1
  311. package/dist/types/components/Select/index.d.ts +1 -1
  312. package/dist/types/components/SelectControl/SelectControl.d.ts +1 -1
  313. package/dist/types/components/SelectControl/index.d.ts +1 -1
  314. package/dist/types/components/Separator/index.d.ts +1 -1
  315. package/dist/types/components/ShimmerText/index.d.ts +1 -1
  316. package/dist/types/components/Sidebar/Sidebar.d.ts +4 -8
  317. package/dist/types/components/Sidebar/index.d.ts +4 -4
  318. package/dist/types/components/Slider/Slider.d.ts +8 -0
  319. package/dist/types/components/Slider/index.d.ts +2 -2
  320. package/dist/types/components/StatCard/index.d.ts +1 -1
  321. package/dist/types/components/Switch/index.d.ts +1 -1
  322. package/dist/types/components/Table/index.d.ts +1 -1
  323. package/dist/types/components/Tabs/Tabs.d.ts +15 -2
  324. package/dist/types/components/Tabs/index.d.ts +2 -2
  325. package/dist/types/components/Tabs/overflow.d.ts +17 -0
  326. package/dist/types/components/TagInput/TagInput.d.ts +1 -1
  327. package/dist/types/components/TagInput/index.d.ts +1 -1
  328. package/dist/types/components/TextLink/index.d.ts +1 -1
  329. package/dist/types/components/Textarea/Textarea.d.ts +1 -1
  330. package/dist/types/components/Textarea/index.d.ts +1 -1
  331. package/dist/types/components/Toast/index.d.ts +1 -1
  332. package/dist/types/components/Tooltip/CopyTooltip.d.ts +6 -1
  333. package/dist/types/components/Tooltip/index.d.ts +2 -2
  334. package/dist/types/components/Transition/Animate.d.ts +2 -2
  335. package/dist/types/components/Transition/AnimateLayout.d.ts +2 -2
  336. package/dist/types/components/Transition/AnimateLayoutGroup.d.ts +2 -2
  337. package/dist/types/components/Transition/SlotTransitionGroup.d.ts +1 -1
  338. package/dist/types/components/Transition/TransitionGroup.d.ts +1 -1
  339. package/dist/types/components/Transition/index.d.ts +5 -5
  340. package/dist/types/components/UIProvider/index.d.ts +1 -1
  341. package/dist/types/global.d.ts +5 -1
  342. package/dist/types/lib/constants.d.ts +1 -1
  343. package/dist/types/lib/helpers.d.ts +4 -4
  344. package/dist/types/lib/theme.d.ts +1 -1
  345. package/dist/types/types.d.ts +2 -15
  346. package/dist/types/vite/index.d.ts +2 -55
  347. package/package.json +10 -18
  348. package/dist/es/components/Accordion/Accordion.module.css +0 -89
  349. package/dist/es/components/Alert/Alert.module.css +0 -187
  350. package/dist/es/components/Avatar/Avatar.module.css +0 -168
  351. package/dist/es/components/Avatar/AvatarGroup.module.css +0 -26
  352. package/dist/es/components/Badge/Badge.module.css +0 -196
  353. package/dist/es/components/Button/Button.module.css +0 -859
  354. package/dist/es/components/ButtonGroup/ButtonGroup.module.css +0 -159
  355. package/dist/es/components/Card/Card.module.css +0 -125
  356. package/dist/es/components/Checkbox/Checkbox.module.css +0 -198
  357. package/dist/es/components/CodeBlock/CodeBlock.module.css +0 -137
  358. package/dist/es/components/DataTable/DataTable.module.css +0 -108
  359. package/dist/es/components/DatePicker/Calendar.module.css +0 -271
  360. package/dist/es/components/DateRangePicker/Calendar.module.css +0 -295
  361. package/dist/es/components/DateRangePicker/Trigger.module.css +0 -25
  362. package/dist/es/components/Dialog/Dialog.module.css +0 -133
  363. package/dist/es/components/EmptyMessage/EmptyMessage.module.css +0 -82
  364. package/dist/es/components/Field/Field.module.css +0 -137
  365. package/dist/es/components/FieldError/FieldError.module.css +0 -22
  366. package/dist/es/components/FileUpload/FileUpload.module.css +0 -133
  367. package/dist/es/components/FloatingLabelInput/FloatingLabelInput.module.css +0 -220
  368. package/dist/es/components/FloatingLabelSelect/FloatingLabelSelect.module.css +0 -146
  369. package/dist/es/components/Image/Image.module.css +0 -9
  370. package/dist/es/components/Indicator/CircularProgress.module.css +0 -28
  371. package/dist/es/components/Indicator/LoadingDots.module.css +0 -35
  372. package/dist/es/components/Indicator/LoadingIndicator.module.css +0 -41
  373. package/dist/es/components/Input/Input.module.css +0 -507
  374. package/dist/es/components/Label/Label.module.css +0 -16
  375. package/dist/es/components/Markdown/Markdown.module.css +0 -233
  376. package/dist/es/components/MarkdownEditor/MarkdownEditor.module.css +0 -297
  377. package/dist/es/components/Menu/Menu.module.css +0 -377
  378. package/dist/es/components/OTPInput/OTPInput.module.css +0 -66
  379. package/dist/es/components/Popover/Popover.module.css +0 -82
  380. package/dist/es/components/Progress/Progress.module.css +0 -34
  381. package/dist/es/components/ProgressSteps/ProgressSteps.module.css +0 -246
  382. package/dist/es/components/RadioGroup/RadioGroup.module.css +0 -137
  383. package/dist/es/components/Select/Select.module.css +0 -310
  384. package/dist/es/components/SelectControl/SelectControl.module.css +0 -558
  385. package/dist/es/components/Separator/Separator.module.css +0 -16
  386. package/dist/es/components/ShimmerText/ShimmerText.module.css +0 -43
  387. package/dist/es/components/Sidebar/Sidebar.module.css +0 -909
  388. package/dist/es/components/Skeleton/Skeleton.module.css +0 -17
  389. package/dist/es/components/Slider/Slider.module.css +0 -203
  390. package/dist/es/components/StatCard/StatCard.module.css +0 -234
  391. package/dist/es/components/Switch/Switch.module.css +0 -121
  392. package/dist/es/components/Table/Table.module.css +0 -56
  393. package/dist/es/components/Tabs/Tabs.module.css +0 -672
  394. package/dist/es/components/TagInput/TagInput.module.css +0 -320
  395. package/dist/es/components/TextLink/TextLink.module.css +0 -50
  396. package/dist/es/components/Textarea/Textarea.module.css +0 -272
  397. package/dist/es/components/Toast/Toast.module.css +0 -84
  398. package/dist/es/components/Tooltip/Tooltip.module.css +0 -91
  399. package/dist/es/components/Transition/Animate.module.css +0 -54
  400. package/dist/es/components/Transition/AnimateLayout.module.css +0 -101
  401. package/dist/es/components/Transition/AnimateLayoutGroup.module.css +0 -72
  402. package/dist/es/components/Transition/TransitionGroup.module.css +0 -4
@@ -2,39 +2,72 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, } from "@tanstack/react-table";
4
4
  import clsx from "clsx";
5
- import { useState } from "react";
6
- import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "../Table";
7
- import { DataTablePagination } from "./DataTablePagination";
8
- import s from "./DataTable.module.css";
5
+ import { useEffect, useMemo, useRef, useState } from "react";
6
+ import { Checkbox } from "../Checkbox/index.js";
7
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "../Table/index.js";
8
+ import { DataTablePagination } from "./DataTablePagination.js";
9
+ import s from "@plexui/styles/components/DataTable/DataTable.module.css";
10
+ // Id of the checkbox column `enableRowSelection` puts before the columns
11
+ const SELECT_COLUMN_ID = "select";
12
+ const selectColumn = {
13
+ id: SELECT_COLUMN_ID,
14
+ header: ({ table }) => (_jsx(Checkbox, { "aria-label": "Select all rows", checked: table.getIsAllRowsSelected() ? true : table.getIsSomeRowsSelected() ? "indeterminate" : false, onCheckedChange: (checked) => table.toggleAllRowsSelected(checked) })),
15
+ cell: ({ row }) => (_jsx(Checkbox, { "aria-label": "Select row", checked: row.getIsSelected(), onCheckedChange: (checked) => row.toggleSelected(checked) })),
16
+ enableHiding: false,
17
+ };
9
18
  const resolveUpdater = (updater, value) => {
10
19
  return typeof updater === "function" ? updater(value) : updater;
11
20
  };
21
+ // One piece of table state: controlled when `controlled` is defined, otherwise
22
+ // held here, with `onChange` as a notification either way. Successive
23
+ // updaters build on each other instead of on the value captured at render.
24
+ const useTableState = (controlled, initial, onChange) => {
25
+ const [internal, setInternal] = useState(initial);
26
+ const value = controlled ?? internal;
27
+ // Uncontrolled: only this handler writes the state, so the last value it set
28
+ // is current even before React renders it (also across awaits)
29
+ const latestInternal = useRef(internal);
30
+ // Controlled: the parent may reject or rewrite a change, so accumulate only
31
+ // within one batch and start every new batch from the current prop
32
+ const batch = useRef(null);
33
+ const handleChange = (updater) => {
34
+ let next;
35
+ if (controlled === undefined) {
36
+ next = resolveUpdater(updater, latestInternal.current);
37
+ latestInternal.current = next;
38
+ setInternal(next);
39
+ }
40
+ else {
41
+ const pending = batch.current;
42
+ const previous = pending && pending.base === controlled ? pending.next : controlled;
43
+ next = resolveUpdater(updater, previous);
44
+ if (!pending) {
45
+ queueMicrotask(() => {
46
+ batch.current = null;
47
+ });
48
+ }
49
+ batch.current = { base: controlled, next };
50
+ }
51
+ onChange?.(next);
52
+ };
53
+ return [value, handleChange];
54
+ };
12
55
  export const DataTable = ({ columns, data, variant = "default", globalFilter, onGlobalFilterChange, onRowClick, pageSize = 10, initialSorting, columnVisibility, onColumnVisibilityChange, enableRowSelection = false, rowSelection, onRowSelectionChange, getRowId, emptyMessage = "No results.", className, showPagination = true, }) => {
13
56
  const [sorting, setSorting] = useState(initialSorting ?? []);
14
57
  const shouldPaginate = Number.isFinite(pageSize) && pageSize > 0;
15
- const handleGlobalFilterChange = onGlobalFilterChange
16
- ? (updater) => {
17
- onGlobalFilterChange(resolveUpdater(updater, globalFilter ?? ""));
18
- }
19
- : undefined;
20
- const handleColumnVisibilityChange = onColumnVisibilityChange
21
- ? (updater) => {
22
- onColumnVisibilityChange(resolveUpdater(updater, columnVisibility ?? {}));
23
- }
24
- : undefined;
25
- const handleRowSelectionChange = onRowSelectionChange
26
- ? (updater) => {
27
- onRowSelectionChange(resolveUpdater(updater, rowSelection ?? {}));
28
- }
29
- : undefined;
58
+ const [effectiveGlobalFilter, handleGlobalFilterChange] = useTableState(globalFilter, "", onGlobalFilterChange);
59
+ const [effectiveColumnVisibility, handleColumnVisibilityChange] = useTableState(columnVisibility, {}, onColumnVisibilityChange);
60
+ const [effectiveRowSelection, handleRowSelectionChange] = useTableState(rowSelection, {}, onRowSelectionChange);
61
+ const tableColumns = useMemo(() => (enableRowSelection ? [selectColumn, ...columns] : columns), [columns, enableRowSelection]);
62
+ const isSelectColumn = (id) => enableRowSelection && id === SELECT_COLUMN_ID;
30
63
  const table = useReactTable({
31
64
  data,
32
- columns,
65
+ columns: tableColumns,
33
66
  state: {
34
67
  sorting,
35
- globalFilter,
36
- columnVisibility,
37
- rowSelection,
68
+ globalFilter: effectiveGlobalFilter,
69
+ columnVisibility: effectiveColumnVisibility,
70
+ rowSelection: effectiveRowSelection,
38
71
  },
39
72
  ...(shouldPaginate ? { initialState: { pagination: { pageIndex: 0, pageSize } } } : {}),
40
73
  onSortingChange: setSorting,
@@ -46,20 +79,68 @@ export const DataTable = ({ columns, data, variant = "default", globalFilter, on
46
79
  getCoreRowModel: getCoreRowModel(),
47
80
  getSortedRowModel: getSortedRowModel(),
48
81
  getFilteredRowModel: getFilteredRowModel(),
82
+ // TanStack keeps its pagination model once created and merges options
83
+ // across renders, so a disabled pageSize (0 or Infinity) switches
84
+ // pagination off explicitly, and back on, on every render
85
+ manualPagination: !shouldPaginate,
49
86
  ...(shouldPaginate ? { getPaginationRowModel: getPaginationRowModel() } : {}),
50
87
  });
88
+ // pageSize only seeds initialState, so apply later prop changes to the table
89
+ const appliedPageSize = useRef(pageSize);
90
+ useEffect(() => {
91
+ const previous = appliedPageSize.current;
92
+ if (previous === pageSize) {
93
+ return;
94
+ }
95
+ appliedPageSize.current = pageSize;
96
+ if (!shouldPaginate) {
97
+ return;
98
+ }
99
+ if (Number.isFinite(previous) && previous > 0) {
100
+ table.setPageSize(pageSize);
101
+ }
102
+ else {
103
+ // Page index is not auto-reset while pagination is off (filters may have
104
+ // changed since), so start over from the first page
105
+ table.setPagination({ pageIndex: 0, pageSize });
106
+ }
107
+ }, [table, pageSize, shouldPaginate]);
51
108
  const rows = table.getRowModel().rows;
52
109
  const totalRows = table.getFilteredRowModel().rows.length;
53
- const hasPagination = shouldPaginate && totalRows > pageSize;
110
+ // Hidden only when every row fits on one page, both at the configured page
111
+ // size and at the one picked in the rows-per-page select
112
+ const hasPagination = shouldPaginate && totalRows > Math.min(pageSize, table.getState().pagination.pageSize);
54
113
  const visibleColumnCount = Math.max(table.getVisibleLeafColumns().length, 1);
55
114
  return (_jsxs("div", { className: clsx(s.DataTable, className), "data-variant": variant, "data-clickable": onRowClick ? "" : undefined, children: [_jsx("div", { className: s.TableContainer, children: _jsxs(Table, { children: [_jsx(TableHeader, { children: table.getHeaderGroups().map((headerGroup) => (_jsx(TableRow, { children: headerGroup.headers.map((header) => {
56
115
  const align = header.column.columnDef.meta?.align;
57
- return (_jsx(TableHead, { style: align ? { textAlign: align } : undefined, children: header.isPlaceholder
116
+ // aria-sort goes on one header at a time: the primary sort
117
+ // column's real header, not its group placeholders
118
+ const sorted = !header.isPlaceholder && header.column.getSortIndex() === 0
119
+ ? header.column.getIsSorted()
120
+ : false;
121
+ return (_jsx(TableHead, { colSpan: header.colSpan > 1 ? header.colSpan : undefined, className: isSelectColumn(header.column.id) ? s.SelectColumn : undefined, style: align ? { textAlign: align } : undefined, "aria-sort": sorted === "asc" ? "ascending" : sorted === "desc" ? "descending" : undefined, children: header.isPlaceholder
58
122
  ? null
59
123
  : flexRender(header.column.columnDef.header, header.getContext()) }, header.id));
60
- }) }, headerGroup.id))) }), _jsx(TableBody, { children: rows.length === 0 ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: visibleColumnCount, className: s.EmptyCell, children: emptyMessage }) })) : (rows.map((row) => (_jsx(TableRow, { onClick: onRowClick ? () => onRowClick(row.original) : undefined, children: row.getVisibleCells().map((cell) => {
124
+ }) }, headerGroup.id))) }), _jsx(TableBody, { children: rows.length === 0 ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: visibleColumnCount, className: s.EmptyCell, children: emptyMessage }) })) : (rows.map((row) => (_jsx(TableRow, {
125
+ // Clickable rows are reached with Tab and activated with
126
+ // Enter or Space, like a button
127
+ tabIndex: onRowClick ? 0 : undefined, onClick: onRowClick ? () => onRowClick(row.original) : undefined, onKeyDown: onRowClick
128
+ ? (event) => {
129
+ // Keys on a control inside the row are the control's
130
+ if (event.target !== event.currentTarget)
131
+ return;
132
+ if (event.key !== "Enter" && event.key !== " ")
133
+ return;
134
+ event.preventDefault();
135
+ onRowClick(row.original);
136
+ }
137
+ : undefined, children: row.getVisibleCells().map((cell) => {
61
138
  const align = cell.column.columnDef.meta?.align;
62
- return (_jsx(TableCell, { style: align ? { textAlign: align } : undefined, children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id));
139
+ return (_jsx(TableCell, { style: align ? { textAlign: align } : undefined,
140
+ // A click on a selection checkbox is not a row click
141
+ onClick: onRowClick && isSelectColumn(cell.column.id)
142
+ ? (event) => event.stopPropagation()
143
+ : undefined, children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id));
63
144
  }) }, row.id)))) })] }) }), showPagination && hasPagination && _jsx(DataTablePagination, { table: table })] }));
64
145
  };
65
146
  //# sourceMappingURL=DataTable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.js","sourceRoot":"","sources":["../../../../src/components/DataTable/DataTable.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport {\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n type ColumnDef,\n type OnChangeFn,\n type RowData,\n type RowSelectionState,\n type SortingState,\n type Updater,\n type VisibilityState,\n} from \"@tanstack/react-table\"\n\ndeclare module \"@tanstack/react-table\" {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface ColumnMeta<TData extends RowData, TValue> {\n align?: \"left\" | \"center\" | \"right\"\n }\n}\nimport clsx from \"clsx\"\nimport { useState, type ReactNode } from \"react\"\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from \"../Table\"\nimport { DataTablePagination } from \"./DataTablePagination\"\nimport s from \"./DataTable.module.css\"\n\nexport type DataTableProps<TData> = {\n /** Column definitions following TanStack Table v8 ColumnDef API */\n columns: ColumnDef<TData, unknown>[]\n /** Data array to display */\n data: TData[]\n /** Visual variant\n * - `\"default\"` — borderless table with transparent header\n * - `\"bordered\"` — rounded border around the table with a tinted header background\n * @default \"default\"\n */\n variant?: \"default\" | \"bordered\"\n /** External search/filter string (controlled) */\n globalFilter?: string\n /** Callback when global filter changes */\n onGlobalFilterChange?: (value: string) => void\n /** Click handler for rows */\n onRowClick?: (row: TData) => void\n /** Number of rows per page. Set to 0 or Infinity to disable pagination.\n * @default 10\n */\n pageSize?: number\n /** Initial sorting state */\n initialSorting?: SortingState\n /** Controlled column visibility */\n columnVisibility?: VisibilityState\n /** Callback when column visibility changes */\n onColumnVisibilityChange?: (visibility: VisibilityState) => void\n /** Enable row selection checkboxes\n * @default false\n */\n enableRowSelection?: boolean\n /** Controlled row selection state */\n rowSelection?: RowSelectionState\n /** Callback when row selection changes */\n onRowSelectionChange?: (selection: RowSelectionState) => void\n /** Custom row ID accessor */\n getRowId?: (row: TData) => string\n /** Message shown when there are no rows\n * @default \"No results.\"\n */\n emptyMessage?: ReactNode\n /** Class applied to the outermost wrapper */\n className?: string\n /** Whether to show pagination controls. Auto-hidden when all rows fit.\n * @default true\n */\n showPagination?: boolean\n}\n\nconst resolveUpdater = <T,>(updater: Updater<T>, value: T): T => {\n return typeof updater === \"function\" ? (updater as (old: T) => T)(value) : updater\n}\n\nexport const DataTable = <TData,>({\n columns,\n data,\n variant = \"default\",\n globalFilter,\n onGlobalFilterChange,\n onRowClick,\n pageSize = 10,\n initialSorting,\n columnVisibility,\n onColumnVisibilityChange,\n enableRowSelection = false,\n rowSelection,\n onRowSelectionChange,\n getRowId,\n emptyMessage = \"No results.\",\n className,\n showPagination = true,\n}: DataTableProps<TData>) => {\n const [sorting, setSorting] = useState<SortingState>(initialSorting ?? [])\n\n const shouldPaginate = Number.isFinite(pageSize) && pageSize > 0\n\n const handleGlobalFilterChange: OnChangeFn<string> | undefined = onGlobalFilterChange\n ? (updater) => {\n onGlobalFilterChange(resolveUpdater(updater, globalFilter ?? \"\"))\n }\n : undefined\n\n const handleColumnVisibilityChange: OnChangeFn<VisibilityState> | undefined =\n onColumnVisibilityChange\n ? (updater) => {\n onColumnVisibilityChange(resolveUpdater(updater, columnVisibility ?? {}))\n }\n : undefined\n\n const handleRowSelectionChange: OnChangeFn<RowSelectionState> | undefined = onRowSelectionChange\n ? (updater) => {\n onRowSelectionChange(resolveUpdater(updater, rowSelection ?? {}))\n }\n : undefined\n\n const table = useReactTable({\n data,\n columns,\n state: {\n sorting,\n globalFilter,\n columnVisibility,\n rowSelection,\n },\n ...(shouldPaginate ? { initialState: { pagination: { pageIndex: 0, pageSize } } } : {}),\n onSortingChange: setSorting,\n onGlobalFilterChange: handleGlobalFilterChange,\n onColumnVisibilityChange: handleColumnVisibilityChange,\n onRowSelectionChange: handleRowSelectionChange,\n getRowId: getRowId ? (originalRow) => getRowId(originalRow) : undefined,\n enableRowSelection,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n ...(shouldPaginate ? { getPaginationRowModel: getPaginationRowModel() } : {}),\n })\n\n const rows = table.getRowModel().rows\n const totalRows = table.getFilteredRowModel().rows.length\n const hasPagination = shouldPaginate && totalRows > pageSize\n const visibleColumnCount = Math.max(table.getVisibleLeafColumns().length, 1)\n\n return (\n <div\n className={clsx(s.DataTable, className)}\n data-variant={variant}\n data-clickable={onRowClick ? \"\" : undefined}\n >\n <div className={s.TableContainer}>\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => {\n const align = header.column.columnDef.meta?.align\n return (\n <TableHead key={header.id} style={align ? { textAlign: align } : undefined}>\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHead>\n )\n })}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {rows.length === 0 ? (\n <TableRow>\n <TableCell colSpan={visibleColumnCount} className={s.EmptyCell}>\n {emptyMessage}\n </TableCell>\n </TableRow>\n ) : (\n rows.map((row) => (\n <TableRow\n key={row.id}\n onClick={onRowClick ? () => onRowClick(row.original) : undefined}\n >\n {row.getVisibleCells().map((cell) => {\n const align = cell.column.columnDef.meta?.align\n return (\n <TableCell key={cell.id} style={align ? { textAlign: align } : undefined}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n )\n })}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n {showPagination && hasPagination && <DataTablePagination table={table} />}\n </div>\n )\n}\n"]}
1
+ {"version":3,"file":"DataTable.js","sourceRoot":"","sources":["../../../../src/components/DataTable/DataTable.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport {\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n type ColumnDef,\n type OnChangeFn,\n type RowData,\n type RowSelectionState,\n type SortingState,\n type Updater,\n type VisibilityState,\n} from \"@tanstack/react-table\"\n\n// Augments table-core, which @tanstack/react-table re-exports: @plexui/vue\n// augments the same module, so both declarations merge when a project\n// type-checks the two packages together\ndeclare module \"@tanstack/table-core\" {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface ColumnMeta<TData extends RowData, TValue> {\n align?: \"left\" | \"center\" | \"right\"\n }\n}\nimport clsx from \"clsx\"\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\"\nimport { Checkbox } from \"../Checkbox\"\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from \"../Table\"\nimport { DataTablePagination } from \"./DataTablePagination\"\nimport s from \"@plexui/styles/components/DataTable/DataTable.module.css\"\n\nexport type DataTableProps<TData> = {\n /** Column definitions following TanStack Table v8 ColumnDef API */\n columns: ColumnDef<TData, unknown>[]\n /** Data array to display */\n data: TData[]\n /** Visual variant\n * - `\"default\"` — borderless table with transparent header\n * - `\"bordered\"` — rounded border around the table with a tinted header background\n * @default \"default\"\n */\n variant?: \"default\" | \"bordered\"\n /** External search/filter string (controlled) */\n globalFilter?: string\n /** Callback when global filter changes */\n onGlobalFilterChange?: (value: string) => void\n /** Click handler for rows */\n onRowClick?: (row: TData) => void\n /** Number of rows per page. Set to 0 or Infinity to disable pagination.\n * @default 10\n */\n pageSize?: number\n /** Initial sorting state */\n initialSorting?: SortingState\n /** Controlled column visibility */\n columnVisibility?: VisibilityState\n /** Callback when column visibility changes */\n onColumnVisibilityChange?: (visibility: VisibilityState) => void\n /** Enable row selection: adds a first column with a checkbox per row and a\n * header checkbox that selects every row\n * @default false\n */\n enableRowSelection?: boolean\n /** Controlled row selection state */\n rowSelection?: RowSelectionState\n /** Callback when row selection changes */\n onRowSelectionChange?: (selection: RowSelectionState) => void\n /** Custom row ID accessor */\n getRowId?: (row: TData) => string\n /** Message shown when there are no rows\n * @default \"No results.\"\n */\n emptyMessage?: ReactNode\n /** Class applied to the outermost wrapper */\n className?: string\n /** Whether to show pagination controls. Auto-hidden when all rows fit.\n * @default true\n */\n showPagination?: boolean\n}\n\n// Id of the checkbox column `enableRowSelection` puts before the columns\nconst SELECT_COLUMN_ID = \"select\"\n\nconst selectColumn: ColumnDef<unknown, unknown> = {\n id: SELECT_COLUMN_ID,\n header: ({ table }) => (\n <Checkbox\n aria-label=\"Select all rows\"\n checked={\n table.getIsAllRowsSelected() ? true : table.getIsSomeRowsSelected() ? \"indeterminate\" : false\n }\n onCheckedChange={(checked) => table.toggleAllRowsSelected(checked)}\n />\n ),\n cell: ({ row }) => (\n <Checkbox\n aria-label=\"Select row\"\n checked={row.getIsSelected()}\n onCheckedChange={(checked) => row.toggleSelected(checked)}\n />\n ),\n enableHiding: false,\n}\n\nconst resolveUpdater = <T,>(updater: Updater<T>, value: T): T => {\n return typeof updater === \"function\" ? (updater as (old: T) => T)(value) : updater\n}\n\n// One piece of table state: controlled when `controlled` is defined, otherwise\n// held here, with `onChange` as a notification either way. Successive\n// updaters build on each other instead of on the value captured at render.\nconst useTableState = <T,>(\n controlled: T | undefined,\n initial: T,\n onChange: ((next: T) => void) | undefined,\n): [T, OnChangeFn<T>] => {\n const [internal, setInternal] = useState<T>(initial)\n const value = controlled ?? internal\n // Uncontrolled: only this handler writes the state, so the last value it set\n // is current even before React renders it (also across awaits)\n const latestInternal = useRef(internal)\n // Controlled: the parent may reject or rewrite a change, so accumulate only\n // within one batch and start every new batch from the current prop\n const batch = useRef<{ base: T; next: T } | null>(null)\n\n const handleChange: OnChangeFn<T> = (updater) => {\n let next: T\n if (controlled === undefined) {\n next = resolveUpdater(updater, latestInternal.current)\n latestInternal.current = next\n setInternal(next)\n } else {\n const pending = batch.current\n const previous = pending && pending.base === controlled ? pending.next : controlled\n next = resolveUpdater(updater, previous)\n if (!pending) {\n queueMicrotask(() => {\n batch.current = null\n })\n }\n batch.current = { base: controlled, next }\n }\n onChange?.(next)\n }\n\n return [value, handleChange]\n}\n\nexport const DataTable = <TData,>({\n columns,\n data,\n variant = \"default\",\n globalFilter,\n onGlobalFilterChange,\n onRowClick,\n pageSize = 10,\n initialSorting,\n columnVisibility,\n onColumnVisibilityChange,\n enableRowSelection = false,\n rowSelection,\n onRowSelectionChange,\n getRowId,\n emptyMessage = \"No results.\",\n className,\n showPagination = true,\n}: DataTableProps<TData>) => {\n const [sorting, setSorting] = useState<SortingState>(initialSorting ?? [])\n\n const shouldPaginate = Number.isFinite(pageSize) && pageSize > 0\n\n const [effectiveGlobalFilter, handleGlobalFilterChange] = useTableState(\n globalFilter,\n \"\",\n onGlobalFilterChange,\n )\n const [effectiveColumnVisibility, handleColumnVisibilityChange] =\n useTableState<VisibilityState>(columnVisibility, {}, onColumnVisibilityChange)\n const [effectiveRowSelection, handleRowSelectionChange] = useTableState<RowSelectionState>(\n rowSelection,\n {},\n onRowSelectionChange,\n )\n\n const tableColumns = useMemo(\n () => (enableRowSelection ? [selectColumn as ColumnDef<TData, unknown>, ...columns] : columns),\n [columns, enableRowSelection],\n )\n const isSelectColumn = (id: string) => enableRowSelection && id === SELECT_COLUMN_ID\n\n const table = useReactTable({\n data,\n columns: tableColumns,\n state: {\n sorting,\n globalFilter: effectiveGlobalFilter,\n columnVisibility: effectiveColumnVisibility,\n rowSelection: effectiveRowSelection,\n },\n ...(shouldPaginate ? { initialState: { pagination: { pageIndex: 0, pageSize } } } : {}),\n onSortingChange: setSorting,\n onGlobalFilterChange: handleGlobalFilterChange,\n onColumnVisibilityChange: handleColumnVisibilityChange,\n onRowSelectionChange: handleRowSelectionChange,\n getRowId: getRowId ? (originalRow) => getRowId(originalRow) : undefined,\n enableRowSelection,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n // TanStack keeps its pagination model once created and merges options\n // across renders, so a disabled pageSize (0 or Infinity) switches\n // pagination off explicitly, and back on, on every render\n manualPagination: !shouldPaginate,\n ...(shouldPaginate ? { getPaginationRowModel: getPaginationRowModel() } : {}),\n })\n\n // pageSize only seeds initialState, so apply later prop changes to the table\n const appliedPageSize = useRef(pageSize)\n useEffect(() => {\n const previous = appliedPageSize.current\n if (previous === pageSize) {\n return\n }\n appliedPageSize.current = pageSize\n if (!shouldPaginate) {\n return\n }\n if (Number.isFinite(previous) && previous > 0) {\n table.setPageSize(pageSize)\n } else {\n // Page index is not auto-reset while pagination is off (filters may have\n // changed since), so start over from the first page\n table.setPagination({ pageIndex: 0, pageSize })\n }\n }, [table, pageSize, shouldPaginate])\n\n const rows = table.getRowModel().rows\n const totalRows = table.getFilteredRowModel().rows.length\n // Hidden only when every row fits on one page, both at the configured page\n // size and at the one picked in the rows-per-page select\n const hasPagination =\n shouldPaginate && totalRows > Math.min(pageSize, table.getState().pagination.pageSize)\n const visibleColumnCount = Math.max(table.getVisibleLeafColumns().length, 1)\n\n return (\n <div\n className={clsx(s.DataTable, className)}\n data-variant={variant}\n data-clickable={onRowClick ? \"\" : undefined}\n >\n <div className={s.TableContainer}>\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => {\n const align = header.column.columnDef.meta?.align\n // aria-sort goes on one header at a time: the primary sort\n // column's real header, not its group placeholders\n const sorted =\n !header.isPlaceholder && header.column.getSortIndex() === 0\n ? header.column.getIsSorted()\n : false\n return (\n <TableHead\n key={header.id}\n colSpan={header.colSpan > 1 ? header.colSpan : undefined}\n className={isSelectColumn(header.column.id) ? s.SelectColumn : undefined}\n style={align ? { textAlign: align } : undefined}\n aria-sort={\n sorted === \"asc\" ? \"ascending\" : sorted === \"desc\" ? \"descending\" : undefined\n }\n >\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHead>\n )\n })}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {rows.length === 0 ? (\n <TableRow>\n <TableCell colSpan={visibleColumnCount} className={s.EmptyCell}>\n {emptyMessage}\n </TableCell>\n </TableRow>\n ) : (\n rows.map((row) => (\n <TableRow\n key={row.id}\n // Clickable rows are reached with Tab and activated with\n // Enter or Space, like a button\n tabIndex={onRowClick ? 0 : undefined}\n onClick={onRowClick ? () => onRowClick(row.original) : undefined}\n onKeyDown={\n onRowClick\n ? (event) => {\n // Keys on a control inside the row are the control's\n if (event.target !== event.currentTarget) return\n if (event.key !== \"Enter\" && event.key !== \" \") return\n event.preventDefault()\n onRowClick(row.original)\n }\n : undefined\n }\n >\n {row.getVisibleCells().map((cell) => {\n const align = cell.column.columnDef.meta?.align\n return (\n <TableCell\n key={cell.id}\n style={align ? { textAlign: align } : undefined}\n // A click on a selection checkbox is not a row click\n onClick={\n onRowClick && isSelectColumn(cell.column.id)\n ? (event) => event.stopPropagation()\n : undefined\n }\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n )\n })}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n {showPagination && hasPagination && <DataTablePagination table={table} />}\n </div>\n )\n}\n"]}
@@ -2,8 +2,8 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import {} from "@tanstack/react-table";
4
4
  import clsx from "clsx";
5
- import { ArrowDownSm, ArrowUpSm, Sort } from "../Icon";
6
- import s from "./DataTable.module.css";
5
+ import { ArrowDownSm, ArrowUpSm, Sort } from "../Icon/index.js";
6
+ import s from "@plexui/styles/components/DataTable/DataTable.module.css";
7
7
  export const DataTableColumnHeader = ({ column, title, className, }) => {
8
8
  if (!column.getCanSort()) {
9
9
  return _jsx("span", { className: className, children: title });
@@ -1 +1 @@
1
- {"version":3,"file":"DataTableColumnHeader.js","sourceRoot":"","sources":["../../../../src/components/DataTable/DataTableColumnHeader.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAe,MAAM,uBAAuB,CAAA;AACnD,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AACtD,OAAO,CAAC,MAAM,wBAAwB,CAAA;AAQtC,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAgB,EACnD,MAAM,EACN,KAAK,EACL,SAAS,GACiC,EAAE,EAAE;IAC9C,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;QACzB,OAAO,eAAM,SAAS,EAAE,SAAS,YAAG,KAAK,GAAQ,CAAA;IACnD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAA;IAEnC,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,kBAAkB,EAAE,SAAS,CAAC,iBACnC,MAAM,IAAI,SAAS,EAChC,OAAO,EAAE,MAAM,CAAC,uBAAuB,EAAE,aAExC,KAAK,EACN,eAAM,SAAS,EAAE,CAAC,CAAC,QAAQ,YACxB,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAC,SAAS,KAAG,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,KAAC,WAAW,KAAG,CAAC,CAAC,CAAC,KAAC,IAAI,KAAG,GAC7E,IACA,CACV,CAAA;AACH,CAAC,CAAA","sourcesContent":["\"use client\"\n\nimport { type Column } from \"@tanstack/react-table\"\nimport clsx from \"clsx\"\nimport { ArrowDownSm, ArrowUpSm, Sort } from \"../Icon\"\nimport s from \"./DataTable.module.css\"\n\nexport type DataTableColumnHeaderProps<TData, TValue> = {\n column: Column<TData, TValue>\n title: string\n className?: string\n}\n\nexport const DataTableColumnHeader = <TData, TValue>({\n column,\n title,\n className,\n}: DataTableColumnHeaderProps<TData, TValue>) => {\n if (!column.getCanSort()) {\n return <span className={className}>{title}</span>\n }\n\n const sorted = column.getIsSorted()\n\n return (\n <button\n type=\"button\"\n className={clsx(s.ColumnHeaderButton, className)}\n data-sorted={sorted || undefined}\n onClick={column.getToggleSortingHandler()}\n >\n {title}\n <span className={s.SortIcon}>\n {sorted === \"asc\" ? <ArrowUpSm /> : sorted === \"desc\" ? <ArrowDownSm /> : <Sort />}\n </span>\n </button>\n )\n}\n"]}
1
+ {"version":3,"file":"DataTableColumnHeader.js","sourceRoot":"","sources":["../../../../src/components/DataTable/DataTableColumnHeader.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAe,MAAM,uBAAuB,CAAA;AACnD,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AACtD,OAAO,CAAC,MAAM,0DAA0D,CAAA;AAQxE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAgB,EACnD,MAAM,EACN,KAAK,EACL,SAAS,GACiC,EAAE,EAAE;IAC9C,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;QACzB,OAAO,eAAM,SAAS,EAAE,SAAS,YAAG,KAAK,GAAQ,CAAA;IACnD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAA;IAEnC,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,kBAAkB,EAAE,SAAS,CAAC,iBACnC,MAAM,IAAI,SAAS,EAChC,OAAO,EAAE,MAAM,CAAC,uBAAuB,EAAE,aAExC,KAAK,EACN,eAAM,SAAS,EAAE,CAAC,CAAC,QAAQ,YACxB,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAC,SAAS,KAAG,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,KAAC,WAAW,KAAG,CAAC,CAAC,CAAC,KAAC,IAAI,KAAG,GAC7E,IACA,CACV,CAAA;AACH,CAAC,CAAA","sourcesContent":["\"use client\"\n\nimport { type Column } from \"@tanstack/react-table\"\nimport clsx from \"clsx\"\nimport { ArrowDownSm, ArrowUpSm, Sort } from \"../Icon\"\nimport s from \"@plexui/styles/components/DataTable/DataTable.module.css\"\n\nexport type DataTableColumnHeaderProps<TData, TValue> = {\n column: Column<TData, TValue>\n title: string\n className?: string\n}\n\nexport const DataTableColumnHeader = <TData, TValue>({\n column,\n title,\n className,\n}: DataTableColumnHeaderProps<TData, TValue>) => {\n if (!column.getCanSort()) {\n return <span className={className}>{title}</span>\n }\n\n const sorted = column.getIsSorted()\n\n return (\n <button\n type=\"button\"\n className={clsx(s.ColumnHeaderButton, className)}\n data-sorted={sorted || undefined}\n onClick={column.getToggleSortingHandler()}\n >\n {title}\n <span className={s.SortIcon}>\n {sorted === \"asc\" ? <ArrowUpSm /> : sorted === \"desc\" ? <ArrowDownSm /> : <Sort />}\n </span>\n </button>\n )\n}\n"]}
@@ -1,14 +1,18 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import {} from "@tanstack/react-table";
4
- import { Button } from "../Button";
5
- import { ChevronLeftMd, ChevronRightMd } from "../Icon";
6
- import s from "./DataTable.module.css";
4
+ import { Button } from "../Button/index.js";
5
+ import { ChevronLeftMd, ChevronRightMd } from "../Icon/index.js";
6
+ import s from "@plexui/styles/components/DataTable/DataTable.module.css";
7
+ const PAGE_SIZES = [10, 20, 50, 100];
7
8
  export const DataTablePagination = ({ table }) => {
8
9
  const totalRows = table.getFilteredRowModel().rows.length;
9
10
  const { pageIndex, pageSize } = table.getState().pagination;
10
11
  const from = pageIndex * pageSize + 1;
11
12
  const to = Math.min((pageIndex + 1) * pageSize, totalRows);
12
- return (_jsxs("div", { className: s.Pagination, children: [_jsxs("div", { className: s.PaginationLeft, children: [_jsx("span", { className: s.PaginationLabel, children: "Rows per page" }), _jsx("select", { className: s.PaginationSelect, value: pageSize, onChange: (e) => table.setPageSize(Number(e.target.value)), children: [10, 20, 50, 100].map((size) => (_jsx("option", { value: size, children: size }, size))) })] }), _jsxs("div", { className: s.PaginationRight, children: [_jsx("span", { className: s.PaginationInfo, children: totalRows === 0 ? "0 results" : `${from}–${to} of ${totalRows}` }), _jsxs("div", { className: s.PaginationButtons, children: [_jsx(Button, { color: "secondary", variant: "outline", size: "sm", pill: false, uniform: true, disabled: !table.getCanPreviousPage(), onClick: () => table.previousPage(), children: _jsx(ChevronLeftMd, {}) }), _jsx(Button, { color: "secondary", variant: "outline", size: "sm", pill: false, uniform: true, disabled: !table.getCanNextPage(), onClick: () => table.nextPage(), children: _jsx(ChevronRightMd, {}) })] })] })] }));
13
+ // The table's initial and current page sizes are options too, so the select
14
+ // always shows the real page size and can go back to the initial one
15
+ const pageSizes = [...new Set([...PAGE_SIZES, table.initialState.pagination.pageSize, pageSize])].sort((a, b) => a - b);
16
+ return (_jsxs("div", { className: s.Pagination, children: [_jsxs("div", { className: s.PaginationLeft, children: [_jsx("span", { className: s.PaginationLabel, children: "Rows per page" }), _jsx("select", { "aria-label": "Rows per page", className: s.PaginationSelect, value: pageSize, onChange: (e) => table.setPageSize(Number(e.target.value)), children: pageSizes.map((size) => (_jsx("option", { value: size, children: size }, size))) })] }), _jsxs("div", { className: s.PaginationRight, children: [_jsx("span", { className: s.PaginationInfo, children: totalRows === 0 ? "0 results" : `${from}–${to} of ${totalRows}` }), _jsxs("div", { className: s.PaginationButtons, children: [_jsx(Button, { color: "secondary", variant: "outline", size: "sm", pill: false, uniform: true, disabled: !table.getCanPreviousPage(), onClick: () => table.previousPage(), "aria-label": "Previous page", children: _jsx(ChevronLeftMd, {}) }), _jsx(Button, { color: "secondary", variant: "outline", size: "sm", pill: false, uniform: true, disabled: !table.getCanNextPage(), onClick: () => table.nextPage(), "aria-label": "Next page", children: _jsx(ChevronRightMd, {}) })] })] })] }));
13
17
  };
14
18
  //# sourceMappingURL=DataTablePagination.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTablePagination.js","sourceRoot":"","sources":["../../../../src/components/DataTable/DataTablePagination.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAc,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,CAAC,MAAM,wBAAwB,CAAA;AAMtC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAS,EAAE,KAAK,EAAmC,EAAE,EAAE;IACxF,MAAM,SAAS,GAAG,KAAK,CAAC,mBAAmB,EAAE,CAAC,IAAI,CAAC,MAAM,CAAA;IACzD,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAA;IAC3D,MAAM,IAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAA;IACrC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,SAAS,CAAC,CAAA;IAE1D,OAAO,CACL,eAAK,SAAS,EAAE,CAAC,CAAC,UAAU,aAC1B,eAAK,SAAS,EAAE,CAAC,CAAC,cAAc,aAC9B,eAAM,SAAS,EAAE,CAAC,CAAC,eAAe,8BAAsB,EACxD,iBACE,SAAS,EAAE,CAAC,CAAC,gBAAgB,EAC7B,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAEzD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC/B,iBAAmB,KAAK,EAAE,IAAI,YAC3B,IAAI,IADM,IAAI,CAER,CACV,CAAC,GACK,IACL,EACN,eAAK,SAAS,EAAE,CAAC,CAAC,eAAe,aAC/B,eAAM,SAAS,EAAE,CAAC,CAAC,cAAc,YAC9B,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,EAAE,OAAO,SAAS,EAAE,GAC3D,EACP,eAAK,SAAS,EAAE,CAAC,CAAC,iBAAiB,aACjC,KAAC,MAAM,IACL,KAAK,EAAC,WAAW,EACjB,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,IAAI,EACT,IAAI,EAAE,KAAK,EACX,OAAO,QACP,QAAQ,EAAE,CAAC,KAAK,CAAC,kBAAkB,EAAE,EACrC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,YAEnC,KAAC,aAAa,KAAG,GACV,EACT,KAAC,MAAM,IACL,KAAK,EAAC,WAAW,EACjB,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,IAAI,EACT,IAAI,EAAE,KAAK,EACX,OAAO,QACP,QAAQ,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EACjC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,YAE/B,KAAC,cAAc,KAAG,GACX,IACL,IACF,IACF,CACP,CAAA;AACH,CAAC,CAAA","sourcesContent":["\"use client\"\n\nimport { type Table } from \"@tanstack/react-table\"\nimport { Button } from \"../Button\"\nimport { ChevronLeftMd, ChevronRightMd } from \"../Icon\"\nimport s from \"./DataTable.module.css\"\n\nexport type DataTablePaginationProps<TData> = {\n table: Table<TData>\n}\n\nexport const DataTablePagination = <TData,>({ table }: DataTablePaginationProps<TData>) => {\n const totalRows = table.getFilteredRowModel().rows.length\n const { pageIndex, pageSize } = table.getState().pagination\n const from = pageIndex * pageSize + 1\n const to = Math.min((pageIndex + 1) * pageSize, totalRows)\n\n return (\n <div className={s.Pagination}>\n <div className={s.PaginationLeft}>\n <span className={s.PaginationLabel}>Rows per page</span>\n <select\n className={s.PaginationSelect}\n value={pageSize}\n onChange={(e) => table.setPageSize(Number(e.target.value))}\n >\n {[10, 20, 50, 100].map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </div>\n <div className={s.PaginationRight}>\n <span className={s.PaginationInfo}>\n {totalRows === 0 ? \"0 results\" : `${from}–${to} of ${totalRows}`}\n </span>\n <div className={s.PaginationButtons}>\n <Button\n color=\"secondary\"\n variant=\"outline\"\n size=\"sm\"\n pill={false}\n uniform\n disabled={!table.getCanPreviousPage()}\n onClick={() => table.previousPage()}\n >\n <ChevronLeftMd />\n </Button>\n <Button\n color=\"secondary\"\n variant=\"outline\"\n size=\"sm\"\n pill={false}\n uniform\n disabled={!table.getCanNextPage()}\n onClick={() => table.nextPage()}\n >\n <ChevronRightMd />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n"]}
1
+ {"version":3,"file":"DataTablePagination.js","sourceRoot":"","sources":["../../../../src/components/DataTable/DataTablePagination.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAc,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,CAAC,MAAM,0DAA0D,CAAA;AAMxE,MAAM,UAAU,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;AAEpC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAS,EAAE,KAAK,EAAmC,EAAE,EAAE;IACxF,MAAM,SAAS,GAAG,KAAK,CAAC,mBAAmB,EAAE,CAAC,IAAI,CAAC,MAAM,CAAA;IACzD,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAA;IAC3D,MAAM,IAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAA;IACrC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,SAAS,CAAC,CAAA;IAC1D,4EAA4E;IAC5E,qEAAqE;IACrE,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,EAAE,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CACpG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAChB,CAAA;IAED,OAAO,CACL,eAAK,SAAS,EAAE,CAAC,CAAC,UAAU,aAC1B,eAAK,SAAS,EAAE,CAAC,CAAC,cAAc,aAC9B,eAAM,SAAS,EAAE,CAAC,CAAC,eAAe,8BAAsB,EACxD,+BACa,eAAe,EAC1B,SAAS,EAAE,CAAC,CAAC,gBAAgB,EAC7B,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAEzD,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACvB,iBAAmB,KAAK,EAAE,IAAI,YAC3B,IAAI,IADM,IAAI,CAER,CACV,CAAC,GACK,IACL,EACN,eAAK,SAAS,EAAE,CAAC,CAAC,eAAe,aAC/B,eAAM,SAAS,EAAE,CAAC,CAAC,cAAc,YAC9B,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,EAAE,OAAO,SAAS,EAAE,GAC3D,EACP,eAAK,SAAS,EAAE,CAAC,CAAC,iBAAiB,aACjC,KAAC,MAAM,IACL,KAAK,EAAC,WAAW,EACjB,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,IAAI,EACT,IAAI,EAAE,KAAK,EACX,OAAO,QACP,QAAQ,EAAE,CAAC,KAAK,CAAC,kBAAkB,EAAE,EACrC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,gBACxB,eAAe,YAE1B,KAAC,aAAa,KAAG,GACV,EACT,KAAC,MAAM,IACL,KAAK,EAAC,WAAW,EACjB,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,IAAI,EACT,IAAI,EAAE,KAAK,EACX,OAAO,QACP,QAAQ,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EACjC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,gBACpB,WAAW,YAEtB,KAAC,cAAc,KAAG,GACX,IACL,IACF,IACF,CACP,CAAA;AACH,CAAC,CAAA","sourcesContent":["\"use client\"\n\nimport { type Table } from \"@tanstack/react-table\"\nimport { Button } from \"../Button\"\nimport { ChevronLeftMd, ChevronRightMd } from \"../Icon\"\nimport s from \"@plexui/styles/components/DataTable/DataTable.module.css\"\n\nexport type DataTablePaginationProps<TData> = {\n table: Table<TData>\n}\n\nconst PAGE_SIZES = [10, 20, 50, 100]\n\nexport const DataTablePagination = <TData,>({ table }: DataTablePaginationProps<TData>) => {\n const totalRows = table.getFilteredRowModel().rows.length\n const { pageIndex, pageSize } = table.getState().pagination\n const from = pageIndex * pageSize + 1\n const to = Math.min((pageIndex + 1) * pageSize, totalRows)\n // The table's initial and current page sizes are options too, so the select\n // always shows the real page size and can go back to the initial one\n const pageSizes = [...new Set([...PAGE_SIZES, table.initialState.pagination.pageSize, pageSize])].sort(\n (a, b) => a - b,\n )\n\n return (\n <div className={s.Pagination}>\n <div className={s.PaginationLeft}>\n <span className={s.PaginationLabel}>Rows per page</span>\n <select\n aria-label=\"Rows per page\"\n className={s.PaginationSelect}\n value={pageSize}\n onChange={(e) => table.setPageSize(Number(e.target.value))}\n >\n {pageSizes.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </div>\n <div className={s.PaginationRight}>\n <span className={s.PaginationInfo}>\n {totalRows === 0 ? \"0 results\" : `${from}–${to} of ${totalRows}`}\n </span>\n <div className={s.PaginationButtons}>\n <Button\n color=\"secondary\"\n variant=\"outline\"\n size=\"sm\"\n pill={false}\n uniform\n disabled={!table.getCanPreviousPage()}\n onClick={() => table.previousPage()}\n aria-label=\"Previous page\"\n >\n <ChevronLeftMd />\n </Button>\n <Button\n color=\"secondary\"\n variant=\"outline\"\n size=\"sm\"\n pill={false}\n uniform\n disabled={!table.getCanNextPage()}\n onClick={() => table.nextPage()}\n aria-label=\"Next page\"\n >\n <ChevronRightMd />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import { Badge } from "../Badge";
4
- import { CopyTooltip } from "../Tooltip";
5
- import { Tooltip } from "../Tooltip";
3
+ import { Badge } from "../Badge/index.js";
4
+ import { CopyTooltip } from "../Tooltip/index.js";
5
+ import { Tooltip } from "../Tooltip/index.js";
6
6
  export function idCell(accessor) {
7
7
  function IdCell({ row }) {
8
8
  const value = accessor(row.original);
@@ -1,5 +1,5 @@
1
- export { DataTable } from "./DataTable";
2
- export { DataTablePagination } from "./DataTablePagination";
3
- export { DataTableColumnHeader } from "./DataTableColumnHeader";
4
- export { idCell, dateTimeCell, statusCell, tooltipHeader } from "./columnHelpers";
1
+ export { DataTable } from "./DataTable.js";
2
+ export { DataTablePagination } from "./DataTablePagination.js";
3
+ export { DataTableColumnHeader } from "./DataTableColumnHeader.js";
4
+ export { idCell, dateTimeCell, statusCell, tooltipHeader } from "./columnHelpers.js";
5
5
  //# sourceMappingURL=index.js.map
@@ -5,9 +5,9 @@ import { useMaskito } from "@maskito/react";
5
5
  import { DateTime } from "luxon";
6
6
  import { useEffect, useMemo, useState } from "react";
7
7
  import { mergeRefs } from "react-merge-refs";
8
- import { Input } from "../Input";
8
+ import { Input } from "../Input/index.js";
9
9
  export const DateInput = (props) => {
10
- const { value, onChange, mode = "dd/mm/yyyy", separator = ".", timeMode, dateTimeSeparator = ", ", timeStep = 0, min, max, clearable = false, placeholder, ref, ...inputProps } = props;
10
+ const { value, onChange, mode = "dd/mm/yyyy", separator = ".", timeMode, dateTimeSeparator = ", ", timeStep = 0, min, max, clearable = false, placeholder, onBlur, ref, ...inputProps } = props;
11
11
  const hasTime = !!timeMode;
12
12
  const dateParams = useMemo(() => ({
13
13
  mode,
@@ -33,15 +33,17 @@ export const DateInput = (props) => {
33
33
  : maskitoDateOptionsGenerator(dateParams), [hasTime, dateParams, dateTimeParams]);
34
34
  const maskRef = useMaskito({ options: maskOptions });
35
35
  const [inputValue, setInputValue] = useState("");
36
+ const format = (date) => {
37
+ if (!date)
38
+ return "";
39
+ return hasTime
40
+ ? maskitoStringifyDateTime(date.toJSDate(), dateTimeParams)
41
+ : maskitoStringifyDate(date.toJSDate(), dateParams);
42
+ };
43
+ const parse = (str) => hasTime ? maskitoParseDateTime(str, dateTimeParams) : maskitoParseDate(str, dateParams);
36
44
  const valueMsKey = value?.toMillis() ?? null;
37
45
  useEffect(() => {
38
- if (!value) {
39
- setInputValue("");
40
- return;
41
- }
42
- setInputValue(hasTime
43
- ? maskitoStringifyDateTime(value.toJSDate(), dateTimeParams)
44
- : maskitoStringifyDate(value.toJSDate(), dateParams));
46
+ setInputValue(format(value));
45
47
  // eslint-disable-next-line react-hooks/exhaustive-deps
46
48
  }, [valueMsKey, hasTime, dateParams, dateTimeParams]);
47
49
  const handleInput = (evt) => {
@@ -51,13 +53,19 @@ export const DateInput = (props) => {
51
53
  onChange(null);
52
54
  return;
53
55
  }
54
- const parsed = hasTime
55
- ? maskitoParseDateTime(str, dateTimeParams)
56
- : maskitoParseDate(str, dateParams);
56
+ const parsed = parse(str);
57
57
  if (parsed) {
58
58
  onChange(DateTime.fromJSDate(parsed));
59
59
  }
60
60
  };
61
+ // Text that is not a complete date never reaches onChange, so leaving the
62
+ // field shows the value again instead of a date the value does not hold
63
+ const handleBlur = (evt) => {
64
+ onBlur?.(evt);
65
+ if (inputValue && !parse(inputValue)) {
66
+ setInputValue(format(value));
67
+ }
68
+ };
61
69
  const handleClear = () => {
62
70
  setInputValue("");
63
71
  onChange(null);
@@ -68,6 +76,6 @@ export const DateInput = (props) => {
68
76
  return datePart;
69
77
  return `${datePart}${dateTimeSeparator}${timeMode}`;
70
78
  }, [mode, separator, hasTime, timeMode, dateTimeSeparator]);
71
- return (_jsx(Input, { ...inputProps, ref: mergeRefs([maskRef, ref]), value: inputValue, onInput: handleInput, placeholder: placeholder ?? defaultPlaceholder, onClear: clearable ? handleClear : undefined }));
79
+ return (_jsx(Input, { ...inputProps, ref: mergeRefs([maskRef, ref]), value: inputValue, onInput: handleInput, onBlur: handleBlur, placeholder: placeholder ?? defaultPlaceholder, onClear: clearable ? handleClear : undefined }));
72
80
  };
73
81
  //# sourceMappingURL=DateInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DateInput.js","sourceRoot":"","sources":["../../../../src/components/DateInput/DateInput.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport {\n maskitoDateOptionsGenerator,\n maskitoDateTimeOptionsGenerator,\n maskitoParseDate,\n maskitoParseDateTime,\n maskitoStringifyDate,\n maskitoStringifyDateTime,\n type MaskitoDateMode,\n type MaskitoDateParams,\n type MaskitoDateTimeParams,\n type MaskitoTimeMode,\n} from \"@maskito/kit\"\nimport { useMaskito } from \"@maskito/react\"\nimport { DateTime } from \"luxon\"\nimport { useEffect, useMemo, useState } from \"react\"\nimport { mergeRefs } from \"react-merge-refs\"\nimport { Input, type InputProps } from \"../Input\"\n\nexport type DateInputProps = {\n value: DateTime | null\n onChange: (value: DateTime | null) => void\n mode?: MaskitoDateMode\n separator?: string\n timeMode?: MaskitoTimeMode\n dateTimeSeparator?: string\n timeStep?: number\n min?: DateTime\n max?: DateTime\n clearable?: boolean\n ref?: React.Ref<HTMLInputElement | null>\n} & Omit<\n InputProps,\n \"value\" | \"defaultValue\" | \"onChange\" | \"onInput\" | \"onClear\" | \"ref\" | \"type\" | \"min\" | \"max\"\n>\n\nexport const DateInput = (props: DateInputProps) => {\n const {\n value,\n onChange,\n mode = \"dd/mm/yyyy\",\n separator = \".\",\n timeMode,\n dateTimeSeparator = \", \",\n timeStep = 0,\n min,\n max,\n clearable = false,\n placeholder,\n ref,\n ...inputProps\n } = props\n\n const hasTime = !!timeMode\n\n const dateParams = useMemo<MaskitoDateParams>(\n () => ({\n mode,\n separator,\n ...(min ? { min: min.toJSDate() } : undefined),\n ...(max ? { max: max.toJSDate() } : undefined),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [mode, separator, min?.toMillis(), max?.toMillis()],\n )\n\n const dateTimeParams = useMemo<MaskitoDateTimeParams>(\n () => ({\n dateMode: mode,\n dateSeparator: separator,\n timeMode: timeMode ?? \"HH:MM\",\n dateTimeSeparator,\n ...(timeStep ? { timeStep } : undefined),\n ...(min ? { min: min.toJSDate() } : undefined),\n ...(max ? { max: max.toJSDate() } : undefined),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [mode, separator, timeMode, dateTimeSeparator, timeStep, min?.toMillis(), max?.toMillis()],\n )\n\n const maskOptions = useMemo(\n () =>\n hasTime\n ? maskitoDateTimeOptionsGenerator(dateTimeParams)\n : maskitoDateOptionsGenerator(dateParams),\n [hasTime, dateParams, dateTimeParams],\n )\n\n const maskRef = useMaskito({ options: maskOptions })\n\n const [inputValue, setInputValue] = useState(\"\")\n\n const valueMsKey = value?.toMillis() ?? null\n useEffect(() => {\n if (!value) {\n setInputValue(\"\")\n return\n }\n setInputValue(\n hasTime\n ? maskitoStringifyDateTime(value.toJSDate(), dateTimeParams)\n : maskitoStringifyDate(value.toJSDate(), dateParams),\n )\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [valueMsKey, hasTime, dateParams, dateTimeParams])\n\n const handleInput = (evt: React.FormEvent<HTMLInputElement>) => {\n const str = evt.currentTarget.value\n setInputValue(str)\n\n if (!str) {\n onChange(null)\n return\n }\n\n const parsed = hasTime\n ? maskitoParseDateTime(str, dateTimeParams)\n : maskitoParseDate(str, dateParams)\n\n if (parsed) {\n onChange(DateTime.fromJSDate(parsed))\n }\n }\n\n const handleClear = () => {\n setInputValue(\"\")\n onChange(null)\n }\n\n const defaultPlaceholder = useMemo(() => {\n const datePart = mode.replace(/\\//g, separator).toUpperCase()\n if (!hasTime) return datePart\n return `${datePart}${dateTimeSeparator}${timeMode}`\n }, [mode, separator, hasTime, timeMode, dateTimeSeparator])\n\n return (\n <Input\n {...inputProps}\n ref={mergeRefs([maskRef as unknown as React.Ref<HTMLInputElement>, ref])}\n value={inputValue}\n onInput={handleInput}\n placeholder={placeholder ?? defaultPlaceholder}\n onClear={clearable ? handleClear : undefined}\n />\n )\n}\n"]}
1
+ {"version":3,"file":"DateInput.js","sourceRoot":"","sources":["../../../../src/components/DateInput/DateInput.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport {\n maskitoDateOptionsGenerator,\n maskitoDateTimeOptionsGenerator,\n maskitoParseDate,\n maskitoParseDateTime,\n maskitoStringifyDate,\n maskitoStringifyDateTime,\n type MaskitoDateMode,\n type MaskitoDateParams,\n type MaskitoDateTimeParams,\n type MaskitoTimeMode,\n} from \"@maskito/kit\"\nimport { useMaskito } from \"@maskito/react\"\nimport { DateTime } from \"luxon\"\nimport { useEffect, useMemo, useState } from \"react\"\nimport { mergeRefs } from \"react-merge-refs\"\nimport { Input, type InputProps } from \"../Input\"\n\nexport type DateInputProps = {\n value: DateTime | null\n onChange: (value: DateTime | null) => void\n mode?: MaskitoDateMode\n separator?: string\n timeMode?: MaskitoTimeMode\n dateTimeSeparator?: string\n timeStep?: number\n min?: DateTime\n max?: DateTime\n clearable?: boolean\n ref?: React.Ref<HTMLInputElement | null>\n} & Omit<\n InputProps,\n \"value\" | \"defaultValue\" | \"onChange\" | \"onInput\" | \"onClear\" | \"ref\" | \"type\" | \"min\" | \"max\"\n>\n\nexport const DateInput = (props: DateInputProps) => {\n const {\n value,\n onChange,\n mode = \"dd/mm/yyyy\",\n separator = \".\",\n timeMode,\n dateTimeSeparator = \", \",\n timeStep = 0,\n min,\n max,\n clearable = false,\n placeholder,\n onBlur,\n ref,\n ...inputProps\n } = props\n\n const hasTime = !!timeMode\n\n const dateParams = useMemo<MaskitoDateParams>(\n () => ({\n mode,\n separator,\n ...(min ? { min: min.toJSDate() } : undefined),\n ...(max ? { max: max.toJSDate() } : undefined),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [mode, separator, min?.toMillis(), max?.toMillis()],\n )\n\n const dateTimeParams = useMemo<MaskitoDateTimeParams>(\n () => ({\n dateMode: mode,\n dateSeparator: separator,\n timeMode: timeMode ?? \"HH:MM\",\n dateTimeSeparator,\n ...(timeStep ? { timeStep } : undefined),\n ...(min ? { min: min.toJSDate() } : undefined),\n ...(max ? { max: max.toJSDate() } : undefined),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [mode, separator, timeMode, dateTimeSeparator, timeStep, min?.toMillis(), max?.toMillis()],\n )\n\n const maskOptions = useMemo(\n () =>\n hasTime\n ? maskitoDateTimeOptionsGenerator(dateTimeParams)\n : maskitoDateOptionsGenerator(dateParams),\n [hasTime, dateParams, dateTimeParams],\n )\n\n const maskRef = useMaskito({ options: maskOptions })\n\n const [inputValue, setInputValue] = useState(\"\")\n\n const format = (date: DateTime | null) => {\n if (!date) return \"\"\n return hasTime\n ? maskitoStringifyDateTime(date.toJSDate(), dateTimeParams)\n : maskitoStringifyDate(date.toJSDate(), dateParams)\n }\n\n const parse = (str: string) =>\n hasTime ? maskitoParseDateTime(str, dateTimeParams) : maskitoParseDate(str, dateParams)\n\n const valueMsKey = value?.toMillis() ?? null\n useEffect(() => {\n setInputValue(format(value))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [valueMsKey, hasTime, dateParams, dateTimeParams])\n\n const handleInput = (evt: React.FormEvent<HTMLInputElement>) => {\n const str = evt.currentTarget.value\n setInputValue(str)\n\n if (!str) {\n onChange(null)\n return\n }\n\n const parsed = parse(str)\n\n if (parsed) {\n onChange(DateTime.fromJSDate(parsed))\n }\n }\n\n // Text that is not a complete date never reaches onChange, so leaving the\n // field shows the value again instead of a date the value does not hold\n const handleBlur = (evt: React.FocusEvent<HTMLInputElement>) => {\n onBlur?.(evt)\n if (inputValue && !parse(inputValue)) {\n setInputValue(format(value))\n }\n }\n\n const handleClear = () => {\n setInputValue(\"\")\n onChange(null)\n }\n\n const defaultPlaceholder = useMemo(() => {\n const datePart = mode.replace(/\\//g, separator).toUpperCase()\n if (!hasTime) return datePart\n return `${datePart}${dateTimeSeparator}${timeMode}`\n }, [mode, separator, hasTime, timeMode, dateTimeSeparator])\n\n return (\n <Input\n {...inputProps}\n ref={mergeRefs([maskRef as unknown as React.Ref<HTMLInputElement>, ref])}\n value={inputValue}\n onInput={handleInput}\n onBlur={handleBlur}\n placeholder={placeholder ?? defaultPlaceholder}\n onClear={clearable ? handleClear : undefined}\n />\n )\n}\n"]}
@@ -1,2 +1,2 @@
1
- export { DateInput } from "./DateInput";
1
+ export { DateInput } from "./DateInput.js";
2
2
  //# sourceMappingURL=index.js.map