@react-md/core 6.3.4 → 6.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 (477) hide show
  1. package/dist/CoreProviders.d.ts +1 -0
  2. package/dist/CoreProviders.js.map +1 -1
  3. package/dist/_a11y.scss +3 -1
  4. package/dist/_base.scss +3 -0
  5. package/dist/_box-shadows.scss +20 -12
  6. package/dist/_core.scss +2 -1
  7. package/dist/_utils.scss +32 -10
  8. package/dist/app-bar/AppBar.js.map +1 -1
  9. package/dist/app-bar/AppBarTitle.js.map +1 -1
  10. package/dist/app-bar/_app-bar.scss +3 -3
  11. package/dist/autocomplete/AutocompleteListboxChildren.js.map +1 -1
  12. package/dist/autocomplete/_autocomplete.scss +20 -16
  13. package/dist/autocomplete/types.js.map +1 -1
  14. package/dist/autocomplete/utils.js.map +1 -1
  15. package/dist/avatar/Avatar.js.map +1 -1
  16. package/dist/avatar/_avatar.scss +2 -1
  17. package/dist/button/Button.js.map +1 -1
  18. package/dist/button/FloatingActionButton.js.map +1 -1
  19. package/dist/button/_button.scss +9 -5
  20. package/dist/card/Card.js.map +1 -1
  21. package/dist/card/CardContent.js.map +1 -1
  22. package/dist/card/ClickableCard.js.map +1 -1
  23. package/dist/card/_card.scss +6 -6
  24. package/dist/chip/Chip.js.map +1 -1
  25. package/dist/chip/_chip.scss +6 -6
  26. package/dist/datetime/NativeDateField.js.map +1 -1
  27. package/dist/datetime/NativeTimeField.js.map +1 -1
  28. package/dist/datetime/useDateField.js.map +1 -1
  29. package/dist/datetime/useTimeField.js.map +1 -1
  30. package/dist/dialog/Dialog.js.map +1 -1
  31. package/dist/dialog/DialogContainer.js.map +1 -1
  32. package/dist/dialog/DialogContent.js.map +1 -1
  33. package/dist/dialog/DialogFooter.js.map +1 -1
  34. package/dist/dialog/_dialog.scss +6 -6
  35. package/dist/divider/Divider.js.map +1 -1
  36. package/dist/divider/_divider.scss +6 -2
  37. package/dist/draggable/useDraggable.js.map +1 -1
  38. package/dist/draggable/utils.js.map +1 -1
  39. package/dist/expansion-panel/ExpansionPanelHeader.js.map +1 -1
  40. package/dist/files/FileInput.js.map +1 -1
  41. package/dist/files/useFileUpload.js.map +1 -1
  42. package/dist/files/validation.js.map +1 -1
  43. package/dist/focus/useFocusContainer.js.map +1 -1
  44. package/dist/form/Fieldset.d.ts +19 -0
  45. package/dist/form/Fieldset.js +22 -2
  46. package/dist/form/Fieldset.js.map +1 -1
  47. package/dist/form/FormMessageContainer.js.map +1 -1
  48. package/dist/form/FormMessageCounter.js.map +1 -1
  49. package/dist/form/InputToggle.js.map +1 -1
  50. package/dist/form/Legend.d.ts +27 -5
  51. package/dist/form/Legend.js +39 -6
  52. package/dist/form/Legend.js.map +1 -1
  53. package/dist/form/Listbox.js.map +1 -1
  54. package/dist/form/ListboxProvider.js.map +1 -1
  55. package/dist/form/NativeSelect.js.map +1 -1
  56. package/dist/form/Password.js.map +1 -1
  57. package/dist/form/ResizingTextAreaWrapper.js.map +1 -1
  58. package/dist/form/Select.d.ts +24 -0
  59. package/dist/form/Select.js +14 -3
  60. package/dist/form/Select.js.map +1 -1
  61. package/dist/form/SelectedOption.d.ts +1 -2
  62. package/dist/form/SelectedOption.js +2 -2
  63. package/dist/form/SelectedOption.js.map +1 -1
  64. package/dist/form/Slider.js.map +1 -1
  65. package/dist/form/SliderContainer.js.map +1 -1
  66. package/dist/form/SliderThumb.js.map +1 -1
  67. package/dist/form/SliderTrack.js.map +1 -1
  68. package/dist/form/SliderValueMarks.js.map +1 -1
  69. package/dist/form/Switch.js.map +1 -1
  70. package/dist/form/TextArea.js.map +1 -1
  71. package/dist/form/TextField.js.map +1 -1
  72. package/dist/form/TextFieldContainer.js.map +1 -1
  73. package/dist/form/_fieldset.scss +7 -0
  74. package/dist/form/_input-toggle.scss +6 -5
  75. package/dist/form/_label.scss +2 -2
  76. package/dist/form/_legend.scss +77 -0
  77. package/dist/form/_slider.scss +7 -5
  78. package/dist/form/_switch.scss +7 -5
  79. package/dist/form/_text-field.scss +52 -15
  80. package/dist/form/defaultGetSelectedOptionChildren.d.ts +1 -0
  81. package/dist/form/fieldsetStyles.d.ts +6 -1
  82. package/dist/form/fieldsetStyles.js +3 -2
  83. package/dist/form/fieldsetStyles.js.map +1 -1
  84. package/dist/form/getSelectedOptionChildren.d.ts +1 -0
  85. package/dist/form/inputToggleStyles.js.map +1 -1
  86. package/dist/form/labelStyles.d.ts +1 -1
  87. package/dist/form/labelStyles.js +1 -1
  88. package/dist/form/labelStyles.js.map +1 -1
  89. package/dist/form/legendStyles.d.ts +83 -0
  90. package/dist/form/legendStyles.js +25 -0
  91. package/dist/form/legendStyles.js.map +1 -0
  92. package/dist/form/selectUtils.js.map +1 -1
  93. package/dist/form/textFieldContainerStyles.js.map +1 -1
  94. package/dist/form/types.d.ts +28 -6
  95. package/dist/form/types.js.map +1 -1
  96. package/dist/form/useCheckboxGroup.js.map +1 -1
  97. package/dist/form/useCombobox.js.map +1 -1
  98. package/dist/form/useNumberField.js +16 -19
  99. package/dist/form/useNumberField.js.map +1 -1
  100. package/dist/form/useRangeSlider.js.map +1 -1
  101. package/dist/form/useSlider.js.map +1 -1
  102. package/dist/form/useTextField.js.map +1 -1
  103. package/dist/hoverMode/useHoverMode.js.map +1 -1
  104. package/dist/icon/FontIcon.js.map +1 -1
  105. package/dist/icon/IconRotator.js.map +1 -1
  106. package/dist/icon/MaterialIcon.js.map +1 -1
  107. package/dist/icon/MaterialSymbol.js.map +1 -1
  108. package/dist/icon/SVGIcon.js.map +1 -1
  109. package/dist/icon/config.d.ts +0 -1
  110. package/dist/icon/config.js +10 -7
  111. package/dist/icon/config.js.map +1 -1
  112. package/dist/icon/materialConfig.js.map +1 -1
  113. package/dist/icon/styles.js.map +1 -1
  114. package/dist/interaction/UserInteractionModeProvider.js +6 -4
  115. package/dist/interaction/UserInteractionModeProvider.js.map +1 -1
  116. package/dist/interaction/_interaction.scss +5 -3
  117. package/dist/interaction/types.js.map +1 -1
  118. package/dist/interaction/useElementInteraction.js.map +1 -1
  119. package/dist/layout/LayoutAppBar.d.ts +6 -6
  120. package/dist/layout/LayoutAppBar.js +6 -6
  121. package/dist/layout/LayoutAppBar.js.map +1 -1
  122. package/dist/layout/LayoutNav.js.map +1 -1
  123. package/dist/layout/LayoutWindowSplitter.js.map +1 -1
  124. package/dist/layout/Main.js.map +1 -1
  125. package/dist/layout/useExpandableLayout.js +43 -0
  126. package/dist/layout/useExpandableLayout.js.map +1 -1
  127. package/dist/layout/useHorizontalLayoutTransition.js.map +1 -1
  128. package/dist/layout/useLayoutTree.js.map +1 -1
  129. package/dist/layout/useLayoutWindowSplitter.js.map +1 -1
  130. package/dist/layout/useResizableLayout.js.map +1 -1
  131. package/dist/link/Link.js.map +1 -1
  132. package/dist/link/SkipToMainContent.js +19 -21
  133. package/dist/link/SkipToMainContent.js.map +1 -1
  134. package/dist/list/List.js.map +1 -1
  135. package/dist/list/ListItem.js.map +1 -1
  136. package/dist/list/ListItemAddon.js.map +1 -1
  137. package/dist/list/ListItemLink.js.map +1 -1
  138. package/dist/list/ListSubheader.js.map +1 -1
  139. package/dist/list/getListItemHeight.js.map +1 -1
  140. package/dist/list/listItemStyles.js.map +1 -1
  141. package/dist/list/types.js.map +1 -1
  142. package/dist/media-queries/AppSizeProvider.d.ts +2 -0
  143. package/dist/media-queries/AppSizeProvider.js +3 -2
  144. package/dist/media-queries/AppSizeProvider.js.map +1 -1
  145. package/dist/media-queries/appSize.d.ts +3 -0
  146. package/dist/media-queries/appSize.js +3 -1
  147. package/dist/media-queries/appSize.js.map +1 -1
  148. package/dist/media-queries/config.d.ts +11 -0
  149. package/dist/media-queries/config.js +26 -0
  150. package/dist/media-queries/config.js.map +1 -0
  151. package/dist/menu/DropdownMenu.js.map +1 -1
  152. package/dist/menu/Menu.js.map +1 -1
  153. package/dist/menu/MenuItemButton.js.map +1 -1
  154. package/dist/menu/MenuItemFileInput.js.map +1 -1
  155. package/dist/menu/MenuItemInputToggle.js.map +1 -1
  156. package/dist/menu/MenuItemSeparator.js.map +1 -1
  157. package/dist/menu/MenuVisibilityProvider.js.map +1 -1
  158. package/dist/menu/MenuWidget.js.map +1 -1
  159. package/dist/menu/useContextMenu.js.map +1 -1
  160. package/dist/movement/types.d.ts +28 -3
  161. package/dist/movement/types.js.map +1 -1
  162. package/dist/movement/useKeyboardMovementProvider.js +96 -47
  163. package/dist/movement/useKeyboardMovementProvider.js.map +1 -1
  164. package/dist/navigation/CollapsibleNavGroup.js.map +1 -1
  165. package/dist/navigation/NavItem.js.map +1 -1
  166. package/dist/navigation/NavItemButton.js.map +1 -1
  167. package/dist/navigation/NavItemLink.js.map +1 -1
  168. package/dist/navigation/getTableOfContentsHeadings.js.map +1 -1
  169. package/dist/navigation/types.js.map +1 -1
  170. package/dist/overlay/Overlay.js.map +1 -1
  171. package/dist/positioning/createHorizontalPosition.js.map +1 -1
  172. package/dist/positioning/createVerticalPosition.js.map +1 -1
  173. package/dist/positioning/useFixedPositioning.js.map +1 -1
  174. package/dist/progress/CircularProgress.js.map +1 -1
  175. package/dist/progress/LinearProgress.js.map +1 -1
  176. package/dist/progress/linearProgressStyles.js.map +1 -1
  177. package/dist/responsive-item/ResponsiveItem.js.map +1 -1
  178. package/dist/responsive-item/ResponsiveItemOverlay.js.map +1 -1
  179. package/dist/searching/caseInsensitive.js.map +1 -1
  180. package/dist/segmented-button/SegmentedButton.js.map +1 -1
  181. package/dist/segmented-button/SegmentedButtonContainer.js.map +1 -1
  182. package/dist/segmented-button/segmentedButtonStyles.js.map +1 -1
  183. package/dist/sheet/Sheet.js.map +1 -1
  184. package/dist/snackbar/Toast.js.map +1 -1
  185. package/dist/snackbar/_snackbar.scss +3 -3
  186. package/dist/spinbutton/SpinButton.d.ts +16 -0
  187. package/dist/spinbutton/SpinButton.js +55 -0
  188. package/dist/spinbutton/SpinButton.js.map +1 -0
  189. package/dist/spinbutton/SpinButtonGroupProvider.d.ts +17 -0
  190. package/dist/spinbutton/SpinButtonGroupProvider.js +19 -0
  191. package/dist/spinbutton/SpinButtonGroupProvider.js.map +1 -0
  192. package/dist/spinbutton/defaults.d.ts +9 -0
  193. package/dist/spinbutton/defaults.js +25 -0
  194. package/dist/spinbutton/defaults.js.map +1 -0
  195. package/dist/spinbutton/types.d.ts +324 -0
  196. package/dist/spinbutton/types.js +5 -0
  197. package/dist/spinbutton/types.js.map +1 -0
  198. package/dist/spinbutton/useSpinButton.d.ts +5 -0
  199. package/dist/spinbutton/useSpinButton.js +260 -0
  200. package/dist/spinbutton/useSpinButton.js.map +1 -0
  201. package/dist/spinbutton/useSpinButtonGroupProvider.d.ts +27 -0
  202. package/dist/spinbutton/useSpinButtonGroupProvider.js +49 -0
  203. package/dist/spinbutton/useSpinButtonGroupProvider.js.map +1 -0
  204. package/dist/spinbutton/utils/deselectNode.d.ts +5 -0
  205. package/dist/spinbutton/utils/deselectNode.js +17 -0
  206. package/dist/spinbutton/utils/deselectNode.js.map +1 -0
  207. package/dist/spinbutton/utils/resolveInputEvent.d.ts +30 -0
  208. package/dist/spinbutton/utils/resolveInputEvent.js +53 -0
  209. package/dist/spinbutton/utils/resolveInputEvent.js.map +1 -0
  210. package/dist/spinbutton/utils/selectNode.d.ts +5 -0
  211. package/dist/spinbutton/utils/selectNode.js +15 -0
  212. package/dist/spinbutton/utils/selectNode.js.map +1 -0
  213. package/dist/table/StickyTableSection.js.map +1 -1
  214. package/dist/table/Table.js.map +1 -1
  215. package/dist/table/TableBody.js.map +1 -1
  216. package/dist/table/TableCellContent.js.map +1 -1
  217. package/dist/table/TableCheckbox.js.map +1 -1
  218. package/dist/table/TableFooter.js.map +1 -1
  219. package/dist/table/TableHeader.js.map +1 -1
  220. package/dist/table/TableRadio.js.map +1 -1
  221. package/dist/table/TableRow.js.map +1 -1
  222. package/dist/table/useStickyTableSection.js.map +1 -1
  223. package/dist/tabs/SimpleTabPanel.js.map +1 -1
  224. package/dist/tabs/SimpleTabPanels.js.map +1 -1
  225. package/dist/tabs/Tab.js.map +1 -1
  226. package/dist/tabs/TabList.js.map +1 -1
  227. package/dist/tabs/TabListScrollButton.js.map +1 -1
  228. package/dist/tabs/_tabs.scss +5 -6
  229. package/dist/tabs/useMaxTabPanelHeight.js.map +1 -1
  230. package/dist/test-utils/data-testid.js.map +1 -1
  231. package/dist/test-utils/mocks/match-media.js +5 -5
  232. package/dist/test-utils/mocks/match-media.js.map +1 -1
  233. package/dist/test-utils/vitest/timers.d.ts +1 -1
  234. package/dist/test-utils/vitest/timers.js +1 -1
  235. package/dist/test-utils/vitest/timers.js.map +1 -1
  236. package/dist/theme/_a11y.scss +3 -1
  237. package/dist/theme/_theme.scss +16 -12
  238. package/dist/tooltip/Tooltip.js.map +1 -1
  239. package/dist/tooltip/TooltipHoverModeProvider.js.map +1 -1
  240. package/dist/tooltip/useTooltip.js.map +1 -1
  241. package/dist/transition/CSSTransition.js.map +1 -1
  242. package/dist/transition/Collapse.js.map +1 -1
  243. package/dist/transition/CrossFade.js.map +1 -1
  244. package/dist/transition/ScaleTransition.js.map +1 -1
  245. package/dist/transition/SkeletonPlaceholder.js.map +1 -1
  246. package/dist/transition/Slide.js.map +1 -1
  247. package/dist/transition/SlideContainer.js.map +1 -1
  248. package/dist/transition/types.js.map +1 -1
  249. package/dist/transition/useCollapseTransition.js.map +1 -1
  250. package/dist/transition/useCrossFadeTransition.js.map +1 -1
  251. package/dist/transition/useMaxWidthTransition.js.map +1 -1
  252. package/dist/transition/useScaleTransition.js.map +1 -1
  253. package/dist/transition/useSkeletonPlaceholder.js.map +1 -1
  254. package/dist/tree/Tree.js.map +1 -1
  255. package/dist/tree/TreeItem.js.map +1 -1
  256. package/dist/tree/TreeProvider.js.map +1 -1
  257. package/dist/tree/styles.js.map +1 -1
  258. package/dist/tree/types.js.map +1 -1
  259. package/dist/tree/useTreeMovement.js.map +1 -1
  260. package/dist/typography/HighlightTextMark.js.map +1 -1
  261. package/dist/typography/Mark.js.map +1 -1
  262. package/dist/typography/TextContainer.js.map +1 -1
  263. package/dist/typography/Typography.js.map +1 -1
  264. package/dist/typography/_typography.scss +0 -1
  265. package/dist/useElementSize.js.map +1 -1
  266. package/dist/useIntersectionObserver.js.map +1 -1
  267. package/dist/useMutationObserver.js.map +1 -1
  268. package/dist/useWindowSize.js.map +1 -1
  269. package/dist/utils/getNumberOfDigits.d.ts +7 -0
  270. package/dist/utils/getNumberOfDigits.js +11 -0
  271. package/dist/utils/getNumberOfDigits.js.map +1 -0
  272. package/dist/utils/nearest.js +2 -1
  273. package/dist/utils/nearest.js.map +1 -1
  274. package/dist/utils/useDevEffect.d.ts +7 -0
  275. package/dist/utils/useDevEffect.js +8 -0
  276. package/dist/utils/useDevEffect.js.map +1 -0
  277. package/dist/window-splitter/WindowSplitter.js +3 -2
  278. package/dist/window-splitter/WindowSplitter.js.map +1 -1
  279. package/dist/window-splitter/_window-splitter.scss +65 -19
  280. package/dist/window-splitter/styles.d.ts +9 -0
  281. package/dist/window-splitter/styles.js +3 -2
  282. package/dist/window-splitter/styles.js.map +1 -1
  283. package/dist/window-splitter/useWindowSplitter.js.map +1 -1
  284. package/package.json +38 -30
  285. package/src/CoreProviders.tsx +1 -0
  286. package/src/app-bar/AppBar.tsx +1 -2
  287. package/src/app-bar/AppBarTitle.tsx +1 -2
  288. package/src/autocomplete/AutocompleteListboxChildren.tsx +3 -1
  289. package/src/autocomplete/types.ts +24 -19
  290. package/src/autocomplete/utils.ts +9 -6
  291. package/src/avatar/Avatar.tsx +2 -1
  292. package/src/button/Button.tsx +2 -1
  293. package/src/button/FloatingActionButton.tsx +2 -1
  294. package/src/card/Card.tsx +2 -1
  295. package/src/card/CardContent.tsx +1 -2
  296. package/src/card/ClickableCard.tsx +1 -2
  297. package/src/chip/Chip.tsx +2 -1
  298. package/src/datetime/NativeDateField.tsx +2 -1
  299. package/src/datetime/NativeTimeField.tsx +2 -1
  300. package/src/datetime/useDateField.ts +13 -8
  301. package/src/datetime/useTimeField.ts +13 -8
  302. package/src/dialog/Dialog.tsx +2 -1
  303. package/src/dialog/DialogContainer.tsx +1 -2
  304. package/src/dialog/DialogContent.tsx +1 -2
  305. package/src/dialog/DialogFooter.tsx +1 -2
  306. package/src/divider/Divider.tsx +1 -2
  307. package/src/draggable/useDraggable.ts +4 -4
  308. package/src/draggable/utils.ts +4 -2
  309. package/src/expansion-panel/ExpansionPanelHeader.tsx +1 -2
  310. package/src/files/FileInput.tsx +2 -1
  311. package/src/files/useFileUpload.ts +6 -6
  312. package/src/files/validation.ts +1 -2
  313. package/src/focus/useFocusContainer.ts +4 -4
  314. package/src/form/Fieldset.tsx +25 -3
  315. package/src/form/FormMessageContainer.tsx +1 -2
  316. package/src/form/FormMessageCounter.tsx +1 -2
  317. package/src/form/InputToggle.tsx +3 -3
  318. package/src/form/Legend.tsx +55 -10
  319. package/src/form/Listbox.tsx +1 -2
  320. package/src/form/ListboxProvider.ts +3 -2
  321. package/src/form/NativeSelect.tsx +2 -1
  322. package/src/form/Password.tsx +4 -2
  323. package/src/form/ResizingTextAreaWrapper.tsx +1 -2
  324. package/src/form/Select.tsx +55 -3
  325. package/src/form/SelectedOption.tsx +2 -4
  326. package/src/form/Slider.tsx +2 -1
  327. package/src/form/SliderContainer.tsx +1 -2
  328. package/src/form/SliderThumb.tsx +6 -3
  329. package/src/form/SliderTrack.tsx +2 -1
  330. package/src/form/SliderValueMarks.tsx +1 -2
  331. package/src/form/Switch.tsx +2 -1
  332. package/src/form/TextArea.tsx +1 -2
  333. package/src/form/TextField.tsx +2 -1
  334. package/src/form/TextFieldContainer.tsx +1 -2
  335. package/src/form/fieldsetStyles.ts +18 -3
  336. package/src/form/inputToggleStyles.ts +4 -2
  337. package/src/form/labelStyles.ts +1 -1
  338. package/src/form/legendStyles.ts +132 -0
  339. package/src/form/selectUtils.ts +3 -2
  340. package/src/form/textFieldContainerStyles.ts +1 -2
  341. package/src/form/types.ts +35 -17
  342. package/src/form/useCheckboxGroup.ts +3 -2
  343. package/src/form/useCombobox.ts +8 -3
  344. package/src/form/useNumberField.ts +36 -35
  345. package/src/form/useRangeSlider.ts +1 -2
  346. package/src/form/useSlider.ts +1 -2
  347. package/src/form/useTextField.ts +8 -3
  348. package/src/hoverMode/useHoverMode.ts +4 -8
  349. package/src/icon/FontIcon.tsx +1 -2
  350. package/src/icon/IconRotator.tsx +1 -2
  351. package/src/icon/MaterialIcon.tsx +2 -1
  352. package/src/icon/MaterialSymbol.tsx +2 -1
  353. package/src/icon/SVGIcon.tsx +1 -2
  354. package/src/icon/config.tsx +10 -7
  355. package/src/icon/materialConfig.ts +1 -2
  356. package/src/icon/styles.ts +1 -2
  357. package/src/interaction/UserInteractionModeProvider.tsx +9 -4
  358. package/src/interaction/types.ts +1 -2
  359. package/src/interaction/useElementInteraction.tsx +3 -2
  360. package/src/layout/LayoutAppBar.tsx +6 -6
  361. package/src/layout/LayoutNav.tsx +2 -1
  362. package/src/layout/LayoutWindowSplitter.tsx +2 -1
  363. package/src/layout/Main.tsx +1 -2
  364. package/src/layout/useExpandableLayout.ts +63 -5
  365. package/src/layout/useHorizontalLayoutTransition.ts +1 -2
  366. package/src/layout/useLayoutTree.ts +2 -2
  367. package/src/layout/useLayoutWindowSplitter.ts +6 -6
  368. package/src/layout/useResizableLayout.ts +3 -6
  369. package/src/link/Link.tsx +1 -2
  370. package/src/link/SkipToMainContent.tsx +20 -23
  371. package/src/list/List.tsx +1 -2
  372. package/src/list/ListItem.tsx +2 -1
  373. package/src/list/ListItemAddon.tsx +2 -1
  374. package/src/list/ListItemLink.tsx +2 -1
  375. package/src/list/ListSubheader.tsx +1 -2
  376. package/src/list/getListItemHeight.ts +8 -9
  377. package/src/list/listItemStyles.ts +1 -2
  378. package/src/list/types.ts +1 -2
  379. package/src/media-queries/AppSizeProvider.tsx +8 -10
  380. package/src/media-queries/appSize.ts +3 -0
  381. package/src/media-queries/config.ts +41 -0
  382. package/src/menu/DropdownMenu.tsx +4 -5
  383. package/src/menu/Menu.tsx +2 -1
  384. package/src/menu/MenuItemButton.tsx +1 -2
  385. package/src/menu/MenuItemFileInput.tsx +2 -1
  386. package/src/menu/MenuItemInputToggle.tsx +3 -3
  387. package/src/menu/MenuItemSeparator.tsx +2 -1
  388. package/src/menu/MenuVisibilityProvider.tsx +4 -2
  389. package/src/menu/MenuWidget.tsx +1 -2
  390. package/src/menu/useContextMenu.ts +4 -2
  391. package/src/movement/types.ts +52 -13
  392. package/src/movement/useKeyboardMovementProvider.ts +77 -38
  393. package/src/navigation/CollapsibleNavGroup.tsx +1 -2
  394. package/src/navigation/NavItem.tsx +1 -2
  395. package/src/navigation/NavItemButton.tsx +2 -1
  396. package/src/navigation/NavItemLink.tsx +2 -1
  397. package/src/navigation/getTableOfContentsHeadings.ts +1 -2
  398. package/src/navigation/types.ts +1 -2
  399. package/src/overlay/Overlay.tsx +2 -1
  400. package/src/positioning/createHorizontalPosition.ts +10 -12
  401. package/src/positioning/createVerticalPosition.ts +10 -11
  402. package/src/positioning/useFixedPositioning.ts +6 -3
  403. package/src/progress/CircularProgress.tsx +2 -1
  404. package/src/progress/LinearProgress.tsx +2 -1
  405. package/src/progress/linearProgressStyles.ts +1 -2
  406. package/src/responsive-item/ResponsiveItem.tsx +1 -2
  407. package/src/responsive-item/ResponsiveItemOverlay.tsx +2 -1
  408. package/src/searching/caseInsensitive.ts +2 -4
  409. package/src/segmented-button/SegmentedButton.tsx +2 -1
  410. package/src/segmented-button/SegmentedButtonContainer.tsx +2 -1
  411. package/src/segmented-button/segmentedButtonStyles.ts +1 -2
  412. package/src/sheet/Sheet.tsx +1 -2
  413. package/src/snackbar/Toast.tsx +2 -1
  414. package/src/spinbutton/SpinButton.tsx +98 -0
  415. package/src/spinbutton/SpinButtonGroupProvider.tsx +32 -0
  416. package/src/spinbutton/defaults.ts +45 -0
  417. package/src/spinbutton/types.ts +413 -0
  418. package/src/spinbutton/useSpinButton.ts +311 -0
  419. package/src/spinbutton/useSpinButtonGroupProvider.ts +104 -0
  420. package/src/spinbutton/utils/deselectNode.ts +17 -0
  421. package/src/spinbutton/utils/resolveInputEvent.ts +112 -0
  422. package/src/spinbutton/utils/selectNode.ts +15 -0
  423. package/src/table/StickyTableSection.tsx +2 -1
  424. package/src/table/Table.tsx +1 -2
  425. package/src/table/TableBody.tsx +2 -1
  426. package/src/table/TableCellContent.tsx +1 -2
  427. package/src/table/TableCheckbox.tsx +1 -2
  428. package/src/table/TableFooter.tsx +1 -2
  429. package/src/table/TableHeader.tsx +1 -2
  430. package/src/table/TableRadio.tsx +1 -2
  431. package/src/table/TableRow.tsx +1 -2
  432. package/src/table/useStickyTableSection.tsx +1 -2
  433. package/src/tabs/SimpleTabPanel.tsx +2 -1
  434. package/src/tabs/SimpleTabPanels.tsx +2 -1
  435. package/src/tabs/Tab.tsx +3 -6
  436. package/src/tabs/TabList.tsx +2 -1
  437. package/src/tabs/TabListScrollButton.tsx +1 -2
  438. package/src/tabs/useMaxTabPanelHeight.ts +7 -4
  439. package/src/test-utils/data-testid.ts +1 -2
  440. package/src/test-utils/mocks/match-media.ts +5 -10
  441. package/src/test-utils/vitest/timers.ts +1 -1
  442. package/src/tooltip/Tooltip.tsx +2 -1
  443. package/src/tooltip/TooltipHoverModeProvider.tsx +1 -2
  444. package/src/tooltip/useTooltip.ts +9 -5
  445. package/src/transition/CSSTransition.tsx +2 -1
  446. package/src/transition/Collapse.tsx +4 -2
  447. package/src/transition/CrossFade.tsx +2 -1
  448. package/src/transition/ScaleTransition.tsx +2 -1
  449. package/src/transition/SkeletonPlaceholder.tsx +1 -2
  450. package/src/transition/Slide.tsx +2 -1
  451. package/src/transition/SlideContainer.tsx +1 -2
  452. package/src/transition/types.ts +15 -16
  453. package/src/transition/useCollapseTransition.ts +6 -5
  454. package/src/transition/useCrossFadeTransition.ts +3 -2
  455. package/src/transition/useMaxWidthTransition.ts +1 -2
  456. package/src/transition/useScaleTransition.ts +3 -2
  457. package/src/transition/useSkeletonPlaceholder.ts +1 -2
  458. package/src/tree/Tree.tsx +2 -1
  459. package/src/tree/TreeItem.tsx +2 -1
  460. package/src/tree/TreeProvider.tsx +4 -4
  461. package/src/tree/styles.ts +1 -2
  462. package/src/tree/types.ts +1 -2
  463. package/src/tree/useTreeMovement.ts +1 -2
  464. package/src/typography/HighlightTextMark.tsx +1 -2
  465. package/src/typography/Mark.tsx +1 -2
  466. package/src/typography/TextContainer.tsx +1 -2
  467. package/src/typography/Typography.tsx +1 -2
  468. package/src/useElementSize.ts +7 -4
  469. package/src/useIntersectionObserver.ts +3 -2
  470. package/src/useMutationObserver.ts +3 -2
  471. package/src/useWindowSize.ts +4 -2
  472. package/src/utils/getNumberOfDigits.ts +18 -0
  473. package/src/utils/nearest.ts +2 -1
  474. package/src/utils/useDevEffect.ts +9 -0
  475. package/src/window-splitter/WindowSplitter.tsx +5 -2
  476. package/src/window-splitter/styles.ts +13 -2
  477. package/src/window-splitter/useWindowSplitter.ts +3 -1
@@ -0,0 +1,260 @@
1
+ "use client";
2
+ import { useCallback, useRef, useState } from "react";
3
+ import { tryToSubmitRelatedForm } from "../form/utils.js";
4
+ import { useEnsuredId } from "../useEnsuredId.js";
5
+ import { useEnsuredRef } from "../useEnsuredRef.js";
6
+ import { useEnsuredState } from "../useEnsuredState.js";
7
+ import { useIsomorphicLayoutEffect } from "../useIsomorphicLayoutEffect.js";
8
+ import { withinRange } from "../utils/withinRange.js";
9
+ import { useSpinButtonGroup } from "./SpinButtonGroupProvider.js";
10
+ import { defaultGetSpinButtonTextContent, defaultSpinButtonGetValueText } from "./defaults.js";
11
+ import { deselectNode } from "./utils/deselectNode.js";
12
+ import { resolveInputEvent } from "./utils/resolveInputEvent.js";
13
+ import { selectNode } from "./utils/selectNode.js";
14
+ /**
15
+ * @since 6.4.0
16
+ */ const noop = ()=>{
17
+ // do nothing
18
+ };
19
+ /**
20
+ * @since 6.4.0
21
+ */ export function useSpinButton(options) {
22
+ const { id: propId, ref: propRef, min, max, step = 1, minDigits, maxDigits, form, readOnly, disabled, required, error, onBlur = noop, onFocus = noop, onInput = noop, onClick = noop, onKeyDown = noop, fallback, mappings, value: propValue, onValueChange = noop, defaultValue = null, getValueText = defaultSpinButtonGetValueText, getTextContent = defaultGetSpinButtonTextContent, placeholderChar, defaultKeyboardValue } = options;
23
+ const id = useEnsuredId(propId, "spinbutton");
24
+ // trigger a noop setValue when `value` and `onValueChange` are provided
25
+ // since `onValueChange is always called with `setValue
26
+ let propSetValue;
27
+ if (typeof propValue !== "undefined" && options.onValueChange) {
28
+ propSetValue = noop;
29
+ }
30
+ const [value, setValue] = useEnsuredState({
31
+ value: propValue,
32
+ setValue: propSetValue,
33
+ defaultValue
34
+ });
35
+ const focused = useRef(false);
36
+ const typedCount = useRef(0);
37
+ const prevText = useRef("");
38
+ const [nodeRef, nodeRefCallback] = useEnsuredRef(propRef);
39
+ const { focusNext } = useSpinButtonGroup();
40
+ const [keyboardValue] = useState(defaultKeyboardValue);
41
+ // NOTE: I might be able to get rid of this since I don't remember why it was
42
+ // added maybe for controlled fields? I'll have to see when I get to the
43
+ // date/time components again
44
+ useIsomorphicLayoutEffect(()=>{
45
+ const node = nodeRef.current;
46
+ if (!focused.current || !node) {
47
+ return;
48
+ }
49
+ prevText.current = node.textContent || "";
50
+ selectNode(node);
51
+ }, [
52
+ nodeRef,
53
+ value
54
+ ]);
55
+ const updateValue = useCallback((options)=>{
56
+ setValue(options.value);
57
+ onValueChange(options);
58
+ if (options.reason === "typed-to-completion") {
59
+ focusNext();
60
+ }
61
+ }, [
62
+ focusNext,
63
+ onValueChange,
64
+ setValue
65
+ ]);
66
+ const increment = useCallback((event)=>{
67
+ let nextValue = value ?? keyboardValue ?? min ?? max ?? 0;
68
+ nextValue = withinRange({
69
+ min,
70
+ max,
71
+ value: nextValue + step
72
+ });
73
+ // this actually means both min and max are a number
74
+ if (nextValue === value && typeof min === "number") {
75
+ nextValue = min;
76
+ }
77
+ updateValue({
78
+ event,
79
+ reason: "change",
80
+ value: nextValue
81
+ });
82
+ }, [
83
+ keyboardValue,
84
+ max,
85
+ min,
86
+ step,
87
+ updateValue,
88
+ value
89
+ ]);
90
+ const decrement = useCallback((event)=>{
91
+ let nextValue = value ?? keyboardValue ?? max ?? min ?? 0;
92
+ nextValue = withinRange({
93
+ min,
94
+ max,
95
+ value: nextValue - step
96
+ });
97
+ // this actually means both min and max are a number
98
+ if (nextValue === value && typeof max === "number") {
99
+ nextValue = max;
100
+ }
101
+ updateValue({
102
+ event,
103
+ reason: "change",
104
+ value: nextValue
105
+ });
106
+ }, [
107
+ keyboardValue,
108
+ max,
109
+ min,
110
+ step,
111
+ updateValue,
112
+ value
113
+ ]);
114
+ return {
115
+ value,
116
+ setValue,
117
+ spinButtonRef: nodeRef,
118
+ spinButtonProps: {
119
+ "aria-readonly": readOnly || undefined,
120
+ "aria-disabled": disabled || undefined,
121
+ "aria-invalid": error || undefined,
122
+ "aria-required": required || undefined,
123
+ "aria-valuemin": min,
124
+ "aria-valuemax": max,
125
+ "aria-valuenow": value === null ? undefined : value,
126
+ "aria-valuetext": getValueText(value),
127
+ id,
128
+ ref: nodeRefCallback,
129
+ role: "spinbutton",
130
+ autoCapitalize: "none",
131
+ autoCorrect: "off",
132
+ spellCheck: false,
133
+ inputMode: "numeric",
134
+ contentEditable: !disabled || undefined,
135
+ suppressContentEditableWarning: true,
136
+ tabIndex: disabled ? undefined : 0,
137
+ onBlur: (event)=>{
138
+ onBlur(event);
139
+ focused.current = false;
140
+ deselectNode(event.currentTarget);
141
+ },
142
+ onFocus: (event)=>{
143
+ onFocus(event);
144
+ if (disabled) {
145
+ return;
146
+ }
147
+ focused.current = true;
148
+ typedCount.current = 0;
149
+ selectNode(event.currentTarget);
150
+ },
151
+ onKeyDown: (event)=>{
152
+ onKeyDown(event);
153
+ if (disabled || readOnly && event.key !== "Enter") {
154
+ return;
155
+ }
156
+ const setValue = (nextValue)=>updateValue({
157
+ value: nextValue,
158
+ event,
159
+ reason: "change"
160
+ });
161
+ let stop = false;
162
+ switch(event.key){
163
+ case "ArrowRight":
164
+ case "ArrowLeft":
165
+ // `event.stopPropagation()` should not be called here since the
166
+ // parent `useSpinButtonGroup` keyboard event handler should
167
+ // still be called to handle advancing to the next spinbutton in
168
+ // the group. Only the default cursor movement needs to be disabled
169
+ // instead.
170
+ event.preventDefault();
171
+ break;
172
+ case "ArrowUp":
173
+ stop = true;
174
+ increment(event);
175
+ break;
176
+ case "ArrowDown":
177
+ stop = true;
178
+ decrement(event);
179
+ break;
180
+ case "Home":
181
+ stop = true;
182
+ if (typeof min === "number") {
183
+ setValue(min);
184
+ }
185
+ break;
186
+ case "End":
187
+ stop = true;
188
+ if (typeof max === "number") {
189
+ setValue(max);
190
+ }
191
+ break;
192
+ case "Enter":
193
+ stop = true;
194
+ tryToSubmitRelatedForm(event, form);
195
+ }
196
+ if (stop) {
197
+ event.preventDefault();
198
+ event.stopPropagation();
199
+ typedCount.current = 0;
200
+ }
201
+ },
202
+ onClick: (event)=>{
203
+ onClick(event);
204
+ event.preventDefault();
205
+ if (disabled) {
206
+ return;
207
+ }
208
+ focused.current = true;
209
+ typedCount.current = 0;
210
+ selectNode(event.currentTarget);
211
+ },
212
+ onInput: (event)=>{
213
+ onInput(event);
214
+ const node = event.currentTarget;
215
+ // if the input event is fired while readOnly or disabled, ignore it
216
+ // and set it back to the previous state
217
+ if (readOnly || disabled) {
218
+ node.textContent = prevText.current;
219
+ selectNode(node);
220
+ return;
221
+ }
222
+ const { reason, nextValue } = resolveInputEvent({
223
+ min,
224
+ max,
225
+ text: node.textContent || "",
226
+ mappings,
227
+ maxDigits,
228
+ prevText: prevText.current,
229
+ prevValue: value,
230
+ typedCount: typedCount.current
231
+ });
232
+ if (reason === "change" || reason === "cleared" || reason === "typed-to-completion") {
233
+ typedCount.current = 0;
234
+ } else if (reason !== "ignored") {
235
+ typedCount.current++;
236
+ }
237
+ node.textContent = getTextContent({
238
+ min,
239
+ max,
240
+ minDigits,
241
+ maxDigits,
242
+ value: nextValue,
243
+ fallback,
244
+ placeholderChar
245
+ });
246
+ prevText.current = node.textContent;
247
+ selectNode(node);
248
+ if (reason !== "ignored" && reason !== "placeholder-digit") {
249
+ updateValue({
250
+ event,
251
+ value: nextValue,
252
+ reason
253
+ });
254
+ }
255
+ }
256
+ }
257
+ };
258
+ }
259
+
260
+ //# sourceMappingURL=useSpinButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/spinbutton/useSpinButton.ts"],"sourcesContent":["\"use client\";\n\nimport { type Dispatch, useCallback, useRef, useState } from \"react\";\n\nimport { tryToSubmitRelatedForm } from \"../form/utils.js\";\nimport { useEnsuredId } from \"../useEnsuredId.js\";\nimport { useEnsuredRef } from \"../useEnsuredRef.js\";\nimport { useEnsuredState } from \"../useEnsuredState.js\";\nimport { useIsomorphicLayoutEffect } from \"../useIsomorphicLayoutEffect.js\";\nimport { withinRange } from \"../utils/withinRange.js\";\nimport { useSpinButtonGroup } from \"./SpinButtonGroupProvider.js\";\nimport {\n defaultGetSpinButtonTextContent,\n defaultSpinButtonGetValueText,\n} from \"./defaults.js\";\nimport {\n type SpinButtonChangeEvent,\n type SpinButtonChangeEventOptions,\n type SpinButtonImplementation,\n type SpinButtonOptions,\n type SpinButtonValue,\n} from \"./types.js\";\nimport { deselectNode } from \"./utils/deselectNode.js\";\nimport { resolveInputEvent } from \"./utils/resolveInputEvent.js\";\nimport { selectNode } from \"./utils/selectNode.js\";\n\n/**\n * @since 6.4.0\n */\nconst noop = (): void => {\n // do nothing\n};\n\n/**\n * @since 6.4.0\n */\nexport function useSpinButton<E extends HTMLElement = HTMLDivElement>(\n options: SpinButtonOptions<E>\n): SpinButtonImplementation<E> {\n const {\n id: propId,\n ref: propRef,\n min,\n max,\n step = 1,\n minDigits,\n maxDigits,\n form,\n readOnly,\n disabled,\n required,\n error,\n onBlur = noop,\n onFocus = noop,\n onInput = noop,\n onClick = noop,\n onKeyDown = noop,\n fallback,\n mappings,\n value: propValue,\n onValueChange = noop,\n defaultValue = null,\n getValueText = defaultSpinButtonGetValueText,\n getTextContent = defaultGetSpinButtonTextContent,\n placeholderChar,\n defaultKeyboardValue,\n } = options;\n const id = useEnsuredId(propId, \"spinbutton\");\n\n // trigger a noop setValue when `value` and `onValueChange` are provided\n // since `onValueChange is always called with `setValue\n let propSetValue: Dispatch<SpinButtonValue> | undefined;\n if (typeof propValue !== \"undefined\" && options.onValueChange) {\n propSetValue = noop;\n }\n\n const [value, setValue] = useEnsuredState({\n value: propValue,\n setValue: propSetValue,\n defaultValue,\n });\n\n const focused = useRef(false);\n const typedCount = useRef(0);\n const prevText = useRef(\"\");\n const [nodeRef, nodeRefCallback] = useEnsuredRef(propRef);\n const { focusNext } = useSpinButtonGroup();\n const [keyboardValue] = useState(defaultKeyboardValue);\n\n // NOTE: I might be able to get rid of this since I don't remember why it was\n // added maybe for controlled fields? I'll have to see when I get to the\n // date/time components again\n useIsomorphicLayoutEffect(() => {\n const node = nodeRef.current;\n if (!focused.current || !node) {\n return;\n }\n\n prevText.current = node.textContent || \"\";\n selectNode(node);\n }, [nodeRef, value]);\n\n const updateValue = useCallback(\n (options: SpinButtonChangeEventOptions<E>) => {\n setValue(options.value);\n onValueChange(options);\n if (options.reason === \"typed-to-completion\") {\n focusNext();\n }\n },\n [focusNext, onValueChange, setValue]\n );\n const increment = useCallback(\n (event: SpinButtonChangeEvent<E>) => {\n let nextValue: SpinButtonValue =\n value ?? keyboardValue ?? min ?? max ?? 0;\n nextValue = withinRange({ min, max, value: nextValue + step });\n\n // this actually means both min and max are a number\n if (nextValue === value && typeof min === \"number\") {\n nextValue = min;\n }\n\n updateValue({\n event,\n reason: \"change\",\n value: nextValue,\n });\n },\n [keyboardValue, max, min, step, updateValue, value]\n );\n const decrement = useCallback(\n (event: SpinButtonChangeEvent<E>) => {\n let nextValue: SpinButtonValue =\n value ?? keyboardValue ?? max ?? min ?? 0;\n nextValue = withinRange({ min, max, value: nextValue - step });\n\n // this actually means both min and max are a number\n if (nextValue === value && typeof max === \"number\") {\n nextValue = max;\n }\n\n updateValue({\n event,\n reason: \"change\",\n value: nextValue,\n });\n },\n [keyboardValue, max, min, step, updateValue, value]\n );\n\n return {\n value,\n setValue,\n spinButtonRef: nodeRef,\n spinButtonProps: {\n \"aria-readonly\": readOnly || undefined,\n \"aria-disabled\": disabled || undefined,\n \"aria-invalid\": error || undefined,\n \"aria-required\": required || undefined,\n \"aria-valuemin\": min,\n \"aria-valuemax\": max,\n \"aria-valuenow\": value === null ? undefined : value,\n \"aria-valuetext\": getValueText(value),\n id,\n ref: nodeRefCallback,\n role: \"spinbutton\",\n autoCapitalize: \"none\",\n autoCorrect: \"off\",\n spellCheck: false,\n inputMode: \"numeric\",\n contentEditable: !disabled || undefined,\n suppressContentEditableWarning: true,\n tabIndex: disabled ? undefined : 0,\n onBlur: (event) => {\n onBlur(event);\n\n focused.current = false;\n deselectNode(event.currentTarget);\n },\n onFocus: (event) => {\n onFocus(event);\n\n if (disabled) {\n return;\n }\n\n focused.current = true;\n typedCount.current = 0;\n selectNode(event.currentTarget);\n },\n onKeyDown: (event) => {\n onKeyDown(event);\n\n if (disabled || (readOnly && event.key !== \"Enter\")) {\n return;\n }\n\n const setValue = (nextValue: number): void =>\n updateValue({ value: nextValue, event, reason: \"change\" });\n\n let stop = false;\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowLeft\":\n // `event.stopPropagation()` should not be called here since the\n // parent `useSpinButtonGroup` keyboard event handler should\n // still be called to handle advancing to the next spinbutton in\n // the group. Only the default cursor movement needs to be disabled\n // instead.\n event.preventDefault();\n break;\n case \"ArrowUp\":\n stop = true;\n increment(event);\n break;\n case \"ArrowDown\":\n stop = true;\n decrement(event);\n break;\n case \"Home\":\n stop = true;\n if (typeof min === \"number\") {\n setValue(min);\n }\n break;\n case \"End\":\n stop = true;\n if (typeof max === \"number\") {\n setValue(max);\n }\n break;\n case \"Enter\":\n stop = true;\n tryToSubmitRelatedForm(event, form);\n }\n\n if (stop) {\n event.preventDefault();\n event.stopPropagation();\n typedCount.current = 0;\n }\n },\n onClick: (event) => {\n onClick(event);\n\n event.preventDefault();\n if (disabled) {\n return;\n }\n\n focused.current = true;\n typedCount.current = 0;\n selectNode(event.currentTarget);\n },\n onInput: (event) => {\n onInput(event);\n\n const node = event.currentTarget;\n // if the input event is fired while readOnly or disabled, ignore it\n // and set it back to the previous state\n if (readOnly || disabled) {\n node.textContent = prevText.current;\n selectNode(node);\n return;\n }\n\n const { reason, nextValue } = resolveInputEvent({\n min,\n max,\n text: node.textContent || \"\",\n mappings,\n maxDigits,\n prevText: prevText.current,\n prevValue: value,\n typedCount: typedCount.current,\n });\n\n if (\n reason === \"change\" ||\n reason === \"cleared\" ||\n reason === \"typed-to-completion\"\n ) {\n typedCount.current = 0;\n } else if (reason !== \"ignored\") {\n typedCount.current++;\n }\n\n node.textContent = getTextContent({\n min,\n max,\n minDigits,\n maxDigits,\n value: nextValue,\n fallback,\n placeholderChar,\n });\n prevText.current = node.textContent;\n selectNode(node);\n\n if (reason !== \"ignored\" && reason !== \"placeholder-digit\") {\n updateValue({\n event,\n value: nextValue,\n reason,\n });\n }\n },\n },\n };\n}\n"],"names":["useCallback","useRef","useState","tryToSubmitRelatedForm","useEnsuredId","useEnsuredRef","useEnsuredState","useIsomorphicLayoutEffect","withinRange","useSpinButtonGroup","defaultGetSpinButtonTextContent","defaultSpinButtonGetValueText","deselectNode","resolveInputEvent","selectNode","noop","useSpinButton","options","id","propId","ref","propRef","min","max","step","minDigits","maxDigits","form","readOnly","disabled","required","error","onBlur","onFocus","onInput","onClick","onKeyDown","fallback","mappings","value","propValue","onValueChange","defaultValue","getValueText","getTextContent","placeholderChar","defaultKeyboardValue","propSetValue","setValue","focused","typedCount","prevText","nodeRef","nodeRefCallback","focusNext","keyboardValue","node","current","textContent","updateValue","reason","increment","event","nextValue","decrement","spinButtonRef","spinButtonProps","undefined","role","autoCapitalize","autoCorrect","spellCheck","inputMode","contentEditable","suppressContentEditableWarning","tabIndex","currentTarget","key","stop","preventDefault","stopPropagation","text","prevValue"],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type KeyboardMovementProps, type KeyboardMovementProviderImplementation, type SimpleKeyboardMovementWrapperOptions } from "../movement/types.js";
2
+ /**
3
+ * @since 6.4.0
4
+ */
5
+ export interface SpinButtonGroupProviderOptions<E extends HTMLElement = HTMLElement> extends SimpleKeyboardMovementWrapperOptions<E> {
6
+ /**
7
+ * Set this to `true` to update the container's `onClick` handler to move
8
+ * focus to the first spinbutton that does not have a value or the first
9
+ * spinbutton in the group so that focus is always moved to the spin buttons.
10
+ *
11
+ * @defaultValue `false`
12
+ */
13
+ forceFocusWithin?: boolean;
14
+ }
15
+ export interface ProvidedSpinButtonGroupProps<E extends HTMLElement = HTMLElement> extends KeyboardMovementProps<E> {
16
+ role: "group";
17
+ }
18
+ /**
19
+ * @since 6.4.0
20
+ */
21
+ export interface SpinButtonGroupProviderImplementation<E extends HTMLElement = HTMLElement> extends KeyboardMovementProviderImplementation<E> {
22
+ movementProps: Readonly<ProvidedSpinButtonGroupProps<E>>;
23
+ }
24
+ /**
25
+ * @since 6.4.0
26
+ */
27
+ export declare function useSpinButtonGroupProvider<E extends HTMLElement = HTMLElement>(options?: SpinButtonGroupProviderOptions<E>): SpinButtonGroupProviderImplementation<E>;
@@ -0,0 +1,49 @@
1
+ "use client";
2
+ import { DEFAULT_LTR_KEYBOARD_MOVEMENT_WITHOUT_JUMP, DEFAULT_RTL_KEYBOARD_MOVEMENT_WITHOUT_JUMP } from "../movement/constants.js";
3
+ import { useKeyboardMovementProvider } from "../movement/useKeyboardMovementProvider.js";
4
+ import { useDir } from "../typography/WritingDirectionProvider.js";
5
+ const SPINBUTTON_ROLE = '[role="spinbutton"]';
6
+ /**
7
+ * @internal
8
+ * @since 6.4.0
9
+ */ const getSpinButtonsOnly = (container)=>[
10
+ ...container.querySelectorAll(SPINBUTTON_ROLE)
11
+ ];
12
+ /**
13
+ * @since 6.4.0
14
+ */ export function useSpinButtonGroupProvider(options = {}) {
15
+ const { disabled, forceFocusWithin } = options;
16
+ const isRTL = useDir().dir === "rtl";
17
+ const movementKeys = isRTL ? DEFAULT_RTL_KEYBOARD_MOVEMENT_WITHOUT_JUMP : DEFAULT_LTR_KEYBOARD_MOVEMENT_WITHOUT_JUMP;
18
+ const { movementProps, ...remaining } = useKeyboardMovementProvider({
19
+ ...options,
20
+ ...movementKeys,
21
+ loopable: false,
22
+ trackTabKeys: true,
23
+ getFocusableElements: getSpinButtonsOnly
24
+ });
25
+ return {
26
+ ...remaining,
27
+ movementProps: {
28
+ ...movementProps,
29
+ role: "group",
30
+ onClick: (event)=>{
31
+ movementProps.onClick(event);
32
+ const { target, currentTarget } = event;
33
+ if (disabled || !forceFocusWithin || !(target instanceof HTMLElement) || target.closest(SPINBUTTON_ROLE)) {
34
+ return;
35
+ }
36
+ const buttons = [
37
+ ...currentTarget.querySelectorAll(SPINBUTTON_ROLE)
38
+ ];
39
+ const i = buttons.findIndex((button)=>!button.ariaValueNow);
40
+ remaining.movementContext.updateFocusIndex({
41
+ index: Math.max(0, i),
42
+ force: true
43
+ });
44
+ }
45
+ }
46
+ };
47
+ }
48
+
49
+ //# sourceMappingURL=useSpinButtonGroupProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/spinbutton/useSpinButtonGroupProvider.ts"],"sourcesContent":["\"use client\";\n\nimport {\n DEFAULT_LTR_KEYBOARD_MOVEMENT_WITHOUT_JUMP,\n DEFAULT_RTL_KEYBOARD_MOVEMENT_WITHOUT_JUMP,\n} from \"../movement/constants.js\";\nimport {\n type KeyboardMovementProps,\n type KeyboardMovementProviderImplementation,\n type SimpleKeyboardMovementWrapperOptions,\n} from \"../movement/types.js\";\nimport { useKeyboardMovementProvider } from \"../movement/useKeyboardMovementProvider.js\";\nimport { useDir } from \"../typography/WritingDirectionProvider.js\";\n\nconst SPINBUTTON_ROLE = '[role=\"spinbutton\"]';\n\n/**\n * @internal\n * @since 6.4.0\n */\nconst getSpinButtonsOnly = (container: HTMLElement): readonly HTMLElement[] => [\n ...container.querySelectorAll<HTMLElement>(SPINBUTTON_ROLE),\n];\n\n/**\n * @since 6.4.0\n */\nexport interface SpinButtonGroupProviderOptions<\n E extends HTMLElement = HTMLElement,\n> extends SimpleKeyboardMovementWrapperOptions<E> {\n /**\n * Set this to `true` to update the container's `onClick` handler to move\n * focus to the first spinbutton that does not have a value or the first\n * spinbutton in the group so that focus is always moved to the spin buttons.\n *\n * @defaultValue `false`\n */\n forceFocusWithin?: boolean;\n}\n\nexport interface ProvidedSpinButtonGroupProps<\n E extends HTMLElement = HTMLElement,\n> extends KeyboardMovementProps<E> {\n role: \"group\";\n}\n\n/**\n * @since 6.4.0\n */\nexport interface SpinButtonGroupProviderImplementation<\n E extends HTMLElement = HTMLElement,\n> extends KeyboardMovementProviderImplementation<E> {\n movementProps: Readonly<ProvidedSpinButtonGroupProps<E>>;\n}\n\n/**\n * @since 6.4.0\n */\nexport function useSpinButtonGroupProvider<E extends HTMLElement = HTMLElement>(\n options: SpinButtonGroupProviderOptions<E> = {}\n): SpinButtonGroupProviderImplementation<E> {\n const { disabled, forceFocusWithin } = options;\n\n const isRTL = useDir().dir === \"rtl\";\n const movementKeys = isRTL\n ? DEFAULT_RTL_KEYBOARD_MOVEMENT_WITHOUT_JUMP\n : DEFAULT_LTR_KEYBOARD_MOVEMENT_WITHOUT_JUMP;\n\n const { movementProps, ...remaining } = useKeyboardMovementProvider({\n ...options,\n ...movementKeys,\n loopable: false,\n trackTabKeys: true,\n getFocusableElements: getSpinButtonsOnly,\n });\n\n return {\n ...remaining,\n movementProps: {\n ...movementProps,\n role: \"group\",\n onClick: (event) => {\n movementProps.onClick(event);\n\n const { target, currentTarget } = event;\n if (\n disabled ||\n !forceFocusWithin ||\n !(target instanceof HTMLElement) ||\n target.closest(SPINBUTTON_ROLE)\n ) {\n return;\n }\n\n const buttons = [...currentTarget.querySelectorAll(SPINBUTTON_ROLE)];\n const i = buttons.findIndex((button) => !button.ariaValueNow);\n remaining.movementContext.updateFocusIndex({\n index: Math.max(0, i),\n force: true,\n });\n },\n },\n };\n}\n"],"names":["DEFAULT_LTR_KEYBOARD_MOVEMENT_WITHOUT_JUMP","DEFAULT_RTL_KEYBOARD_MOVEMENT_WITHOUT_JUMP","useKeyboardMovementProvider","useDir","SPINBUTTON_ROLE","getSpinButtonsOnly","container","querySelectorAll","useSpinButtonGroupProvider","options","disabled","forceFocusWithin","isRTL","dir","movementKeys","movementProps","remaining","loopable","trackTabKeys","getFocusableElements","role","onClick","event","target","currentTarget","HTMLElement","closest","buttons","i","findIndex","button","ariaValueNow","movementContext","updateFocusIndex","index","Math","max","force"],"mappings":"AAAA;AAEA,SACEA,0CAA0C,EAC1CC,0CAA0C,QACrC,2BAA2B;AAMlC,SAASC,2BAA2B,QAAQ,6CAA6C;AACzF,SAASC,MAAM,QAAQ,4CAA4C;AAEnE,MAAMC,kBAAkB;AAExB;;;CAGC,GACD,MAAMC,qBAAqB,CAACC,YAAmD;WAC1EA,UAAUC,gBAAgB,CAAcH;KAC5C;AAiCD;;CAEC,GACD,OAAO,SAASI,2BACdC,UAA6C,CAAC,CAAC;IAE/C,MAAM,EAAEC,QAAQ,EAAEC,gBAAgB,EAAE,GAAGF;IAEvC,MAAMG,QAAQT,SAASU,GAAG,KAAK;IAC/B,MAAMC,eAAeF,QACjBX,6CACAD;IAEJ,MAAM,EAAEe,aAAa,EAAE,GAAGC,WAAW,GAAGd,4BAA4B;QAClE,GAAGO,OAAO;QACV,GAAGK,YAAY;QACfG,UAAU;QACVC,cAAc;QACdC,sBAAsBd;IACxB;IAEA,OAAO;QACL,GAAGW,SAAS;QACZD,eAAe;YACb,GAAGA,aAAa;YAChBK,MAAM;YACNC,SAAS,CAACC;gBACRP,cAAcM,OAAO,CAACC;gBAEtB,MAAM,EAAEC,MAAM,EAAEC,aAAa,EAAE,GAAGF;gBAClC,IACEZ,YACA,CAACC,oBACD,CAAEY,CAAAA,kBAAkBE,WAAU,KAC9BF,OAAOG,OAAO,CAACtB,kBACf;oBACA;gBACF;gBAEA,MAAMuB,UAAU;uBAAIH,cAAcjB,gBAAgB,CAACH;iBAAiB;gBACpE,MAAMwB,IAAID,QAAQE,SAAS,CAAC,CAACC,SAAW,CAACA,OAAOC,YAAY;gBAC5Df,UAAUgB,eAAe,CAACC,gBAAgB,CAAC;oBACzCC,OAAOC,KAAKC,GAAG,CAAC,GAAGR;oBACnBS,OAAO;gBACT;YACF;QACF;IACF;AACF"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @since 6.4.0
3
+ * @internal
4
+ */
5
+ export declare function deselectNode(node: Node): void;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @since 6.4.0
3
+ * @internal
4
+ */ export function deselectNode(node) {
5
+ const selection = window.getSelection();
6
+ if (!selection) {
7
+ return;
8
+ }
9
+ for(let i = 0; i < selection.rangeCount; i++){
10
+ const range = selection.getRangeAt(i);
11
+ if (range.startContainer.contains(node)) {
12
+ selection.removeRange(range);
13
+ }
14
+ }
15
+ }
16
+
17
+ //# sourceMappingURL=deselectNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/spinbutton/utils/deselectNode.ts"],"sourcesContent":["/**\n * @since 6.4.0\n * @internal\n */\nexport function deselectNode(node: Node): void {\n const selection = window.getSelection();\n if (!selection) {\n return;\n }\n\n for (let i = 0; i < selection.rangeCount; i++) {\n const range = selection.getRangeAt(i);\n if (range.startContainer.contains(node)) {\n selection.removeRange(range);\n }\n }\n}\n"],"names":["deselectNode","node","selection","window","getSelection","i","rangeCount","range","getRangeAt","startContainer","contains","removeRange"],"mappings":"AAAA;;;CAGC,GACD,OAAO,SAASA,aAAaC,IAAU;IACrC,MAAMC,YAAYC,OAAOC,YAAY;IACrC,IAAI,CAACF,WAAW;QACd;IACF;IAEA,IAAK,IAAIG,IAAI,GAAGA,IAAIH,UAAUI,UAAU,EAAED,IAAK;QAC7C,MAAME,QAAQL,UAAUM,UAAU,CAACH;QACnC,IAAIE,MAAME,cAAc,CAACC,QAAQ,CAACT,OAAO;YACvCC,UAAUS,WAAW,CAACJ;QACxB;IACF;AACF"}
@@ -0,0 +1,30 @@
1
+ import { type MinMaxRange } from "../../types.js";
2
+ import { type SpinButtonChangeReason, type SpinButtonCharacterValueMap, type SpinButtonValue } from "../types.js";
3
+ /**
4
+ * @since 6.4.0
5
+ * @internal
6
+ */
7
+ interface ResolveInputEventOptions extends Partial<MinMaxRange> {
8
+ text: string;
9
+ mappings?: SpinButtonCharacterValueMap;
10
+ minDigits?: number;
11
+ maxDigits?: number;
12
+ prevText: string;
13
+ prevValue: SpinButtonValue;
14
+ typedCount: number;
15
+ }
16
+ type SpinButtonResolvedInputReason = SpinButtonChangeReason | "ignored" | "placeholder-digit";
17
+ /**
18
+ * @since 6.4.0
19
+ * @internal
20
+ */
21
+ interface ResolveInputEvent {
22
+ reason: SpinButtonResolvedInputReason;
23
+ nextValue: SpinButtonValue;
24
+ }
25
+ /**
26
+ * @since 6.4.0
27
+ * @internal
28
+ */
29
+ export declare function resolveInputEvent(options: ResolveInputEventOptions): ResolveInputEvent;
30
+ export {};
@@ -0,0 +1,53 @@
1
+ import { getNumberOfDigits } from "../../utils/getNumberOfDigits.js";
2
+ /**
3
+ * @since 6.4.0
4
+ * @internal
5
+ */ export function resolveInputEvent(options) {
6
+ const { min, max, minDigits = getNumberOfDigits(min), maxDigits = getNumberOfDigits(max), text, mappings, typedCount, prevValue } = options;
7
+ let { prevText } = options;
8
+ if (typedCount === 0) {
9
+ prevText = "";
10
+ }
11
+ if (!text) {
12
+ return {
13
+ reason: "cleared",
14
+ nextValue: null
15
+ };
16
+ }
17
+ if (mappings) {
18
+ const nextValue = mappings[text] ?? prevValue;
19
+ let reason = "ignored";
20
+ if (typeof mappings[text] === "number") {
21
+ reason = "typed-to-completion";
22
+ }
23
+ return {
24
+ reason,
25
+ nextValue
26
+ };
27
+ }
28
+ if (/[^0-9]/.test(text)) {
29
+ return {
30
+ reason: "ignored",
31
+ nextValue: prevValue
32
+ };
33
+ }
34
+ let reason = "type";
35
+ let nextValue = parseInt(prevText + text, 10);
36
+ if (typeof minDigits === "number" && typedCount + 1 < minDigits) {
37
+ reason = "placeholder-digit";
38
+ }
39
+ if (typeof max === "number" && nextValue > max) {
40
+ nextValue = prevValue;
41
+ }
42
+ if (typeof nextValue === "number" && // if typing a new value surpasses the number of digits allowed
43
+ (typeof maxDigits === "number" && typedCount + 1 >= maxDigits || // typing a new value would exceed the max value
44
+ typeof max === "number" && nextValue * 10 > max)) {
45
+ reason = "typed-to-completion";
46
+ }
47
+ return {
48
+ reason,
49
+ nextValue
50
+ };
51
+ }
52
+
53
+ //# sourceMappingURL=resolveInputEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/spinbutton/utils/resolveInputEvent.ts"],"sourcesContent":["import { type MinMaxRange } from \"../../types.js\";\nimport { getNumberOfDigits } from \"../../utils/getNumberOfDigits.js\";\nimport {\n type SpinButtonChangeReason,\n type SpinButtonCharacterValueMap,\n type SpinButtonValue,\n} from \"../types.js\";\n\n/**\n * @since 6.4.0\n * @internal\n */\ninterface ResolveInputEventOptions extends Partial<MinMaxRange> {\n text: string;\n mappings?: SpinButtonCharacterValueMap;\n minDigits?: number;\n maxDigits?: number;\n prevText: string;\n prevValue: SpinButtonValue;\n typedCount: number;\n}\n\ntype SpinButtonResolvedInputReason =\n | SpinButtonChangeReason\n | \"ignored\"\n | \"placeholder-digit\";\n\n/**\n * @since 6.4.0\n * @internal\n */\ninterface ResolveInputEvent {\n reason: SpinButtonResolvedInputReason;\n nextValue: SpinButtonValue;\n}\n\n/**\n * @since 6.4.0\n * @internal\n */\nexport function resolveInputEvent(\n options: ResolveInputEventOptions\n): ResolveInputEvent {\n const {\n min,\n max,\n minDigits = getNumberOfDigits(min),\n maxDigits = getNumberOfDigits(max),\n text,\n mappings,\n typedCount,\n prevValue,\n } = options;\n\n let { prevText } = options;\n if (typedCount === 0) {\n prevText = \"\";\n }\n\n if (!text) {\n return {\n reason: \"cleared\",\n nextValue: null,\n };\n }\n\n if (mappings) {\n const nextValue = mappings[text] ?? prevValue;\n\n let reason: SpinButtonResolvedInputReason = \"ignored\";\n if (typeof mappings[text] === \"number\") {\n reason = \"typed-to-completion\";\n }\n\n return {\n reason,\n nextValue,\n };\n }\n\n if (/[^0-9]/.test(text)) {\n return {\n reason: \"ignored\",\n nextValue: prevValue,\n };\n }\n\n let reason: SpinButtonResolvedInputReason = \"type\";\n let nextValue: SpinButtonValue = parseInt(prevText + text, 10);\n if (typeof minDigits === \"number\" && typedCount + 1 < minDigits) {\n reason = \"placeholder-digit\";\n }\n\n if (typeof max === \"number\" && nextValue > max) {\n nextValue = prevValue;\n }\n\n if (\n typeof nextValue === \"number\" &&\n // if typing a new value surpasses the number of digits allowed\n ((typeof maxDigits === \"number\" && typedCount + 1 >= maxDigits) ||\n // typing a new value would exceed the max value\n (typeof max === \"number\" && nextValue * 10 > max))\n ) {\n reason = \"typed-to-completion\";\n }\n\n return {\n reason,\n nextValue,\n };\n}\n"],"names":["getNumberOfDigits","resolveInputEvent","options","min","max","minDigits","maxDigits","text","mappings","typedCount","prevValue","prevText","reason","nextValue","test","parseInt"],"mappings":"AACA,SAASA,iBAAiB,QAAQ,mCAAmC;AAmCrE;;;CAGC,GACD,OAAO,SAASC,kBACdC,OAAiC;IAEjC,MAAM,EACJC,GAAG,EACHC,GAAG,EACHC,YAAYL,kBAAkBG,IAAI,EAClCG,YAAYN,kBAAkBI,IAAI,EAClCG,IAAI,EACJC,QAAQ,EACRC,UAAU,EACVC,SAAS,EACV,GAAGR;IAEJ,IAAI,EAAES,QAAQ,EAAE,GAAGT;IACnB,IAAIO,eAAe,GAAG;QACpBE,WAAW;IACb;IAEA,IAAI,CAACJ,MAAM;QACT,OAAO;YACLK,QAAQ;YACRC,WAAW;QACb;IACF;IAEA,IAAIL,UAAU;QACZ,MAAMK,YAAYL,QAAQ,CAACD,KAAK,IAAIG;QAEpC,IAAIE,SAAwC;QAC5C,IAAI,OAAOJ,QAAQ,CAACD,KAAK,KAAK,UAAU;YACtCK,SAAS;QACX;QAEA,OAAO;YACLA;YACAC;QACF;IACF;IAEA,IAAI,SAASC,IAAI,CAACP,OAAO;QACvB,OAAO;YACLK,QAAQ;YACRC,WAAWH;QACb;IACF;IAEA,IAAIE,SAAwC;IAC5C,IAAIC,YAA6BE,SAASJ,WAAWJ,MAAM;IAC3D,IAAI,OAAOF,cAAc,YAAYI,aAAa,IAAIJ,WAAW;QAC/DO,SAAS;IACX;IAEA,IAAI,OAAOR,QAAQ,YAAYS,YAAYT,KAAK;QAC9CS,YAAYH;IACd;IAEA,IACE,OAAOG,cAAc,YACrB,+DAA+D;IAC9D,CAAA,AAAC,OAAOP,cAAc,YAAYG,aAAa,KAAKH,aACnD,gDAAgD;IAC/C,OAAOF,QAAQ,YAAYS,YAAY,KAAKT,GAAG,GAClD;QACAQ,SAAS;IACX;IAEA,OAAO;QACLA;QACAC;IACF;AACF"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @since 6.4.0
3
+ * @internal
4
+ */
5
+ export declare function selectNode(node: Node): void;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @since 6.4.0
3
+ * @internal
4
+ */ export function selectNode(node) {
5
+ const selection = window.getSelection();
6
+ if (!selection) {
7
+ return;
8
+ }
9
+ const range = document.createRange();
10
+ range.selectNodeContents(node);
11
+ selection.removeAllRanges();
12
+ selection.addRange(range);
13
+ }
14
+
15
+ //# sourceMappingURL=selectNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/spinbutton/utils/selectNode.ts"],"sourcesContent":["/**\n * @since 6.4.0\n * @internal\n */\nexport function selectNode(node: Node): void {\n const selection = window.getSelection();\n if (!selection) {\n return;\n }\n\n const range = document.createRange();\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n"],"names":["selectNode","node","selection","window","getSelection","range","document","createRange","selectNodeContents","removeAllRanges","addRange"],"mappings":"AAAA;;;CAGC,GACD,OAAO,SAASA,WAAWC,IAAU;IACnC,MAAMC,YAAYC,OAAOC,YAAY;IACrC,IAAI,CAACF,WAAW;QACd;IACF;IAEA,MAAMG,QAAQC,SAASC,WAAW;IAClCF,MAAMG,kBAAkB,CAACP;IACzBC,UAAUO,eAAe;IACzBP,UAAUQ,QAAQ,CAACL;AACrB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/table/StickyTableSection.tsx"],"sourcesContent":["\"use client\";\n\nimport { type HTMLAttributes, forwardRef } from \"react\";\n\nimport { TableConfigProvider } from \"./TableConfigurationProvider.js\";\nimport { tableFooter } from \"./tableFooterStyles.js\";\nimport { tableHeader } from \"./tableHeaderStyles.js\";\nimport {\n type TableSectionConfiguration,\n type TableStickySectionConfiguration,\n} from \"./types.js\";\nimport { useStickyTableSection } from \"./useStickyTableSection.js\";\nimport { useTableSectionConfig } from \"./useTableSectionConfig.js\";\n\n/** @since 6.0.0 */\nexport interface StickyTableSectionProps\n extends HTMLAttributes<HTMLTableSectionElement>,\n TableStickySectionConfiguration,\n TableSectionConfiguration {\n type: \"header\" | \"footer\";\n\n /**\n * An optional className to use when the sticky section is covering other rows\n * (`active`). When this is defined, the default\n * `rmd-thead--sticky-active`/`rmd-tfoot--sticky-active` will no longer be\n * applied.\n */\n stickyActiveClassName?: string;\n}\n\n/**\n * **Client Component**\n *\n * This component is used to render a sticky `<thead>`/`<tfoot>` that\n * dynamically applies styles whenever the `<thead>`/`<tfoot>` are covering\n * content in the table.\n *\n * @see {@link https://react-md.dev/components/table | Table Demos}\n * @see {@link https://react-md.dev/components/table#sticky-tables | Sticky Table Demos}\n * @since 6.0.0\n */\nexport const StickyTableSection = forwardRef<\n HTMLTableSectionElement,\n StickyTableSectionProps\n>(function StickyTableSection(props, ref) {\n const {\n type,\n className,\n hoverable,\n lineWrap,\n children,\n stickyOptions,\n isStickyActive,\n disableStickyStyles = false,\n stickyActiveClassName,\n ...remaining\n } = props;\n\n const isHeader = type === \"header\";\n const Section = isHeader ? \"thead\" : \"tfoot\";\n const styles = isHeader ? tableHeader : tableFooter;\n const { tbody, sectionRef, stickyActive } = useStickyTableSection({\n ref,\n type,\n stickyOptions,\n isStickyActive,\n disableStickyStyles,\n stickyActiveClassName,\n });\n const config = useTableSectionConfig({\n type,\n lineWrap,\n hoverable,\n });\n\n return (\n <TableConfigProvider value={config}>\n {!isHeader && tbody}\n <Section\n {...remaining}\n ref={sectionRef}\n className={styles({\n className,\n dense: config.dense,\n sticky: true,\n stickyActive,\n stickyActiveClassName,\n })}\n >\n {children}\n </Section>\n {isHeader && tbody}\n </TableConfigProvider>\n );\n});\n"],"names":["forwardRef","TableConfigProvider","tableFooter","tableHeader","useStickyTableSection","useTableSectionConfig","StickyTableSection","props","ref","type","className","hoverable","lineWrap","children","stickyOptions","isStickyActive","disableStickyStyles","stickyActiveClassName","remaining","isHeader","Section","styles","tbody","sectionRef","stickyActive","config","value","dense","sticky"],"mappings":"AAAA;;AAEA,SAA8BA,UAAU,QAAQ,QAAQ;AAExD,SAASC,mBAAmB,QAAQ,kCAAkC;AACtE,SAASC,WAAW,QAAQ,yBAAyB;AACrD,SAASC,WAAW,QAAQ,yBAAyB;AAKrD,SAASC,qBAAqB,QAAQ,6BAA6B;AACnE,SAASC,qBAAqB,QAAQ,6BAA6B;AAkBnE;;;;;;;;;;CAUC,GACD,OAAO,MAAMC,mCAAqBN,WAGhC,SAASM,mBAAmBC,KAAK,EAAEC,GAAG;IACtC,MAAM,EACJC,IAAI,EACJC,SAAS,EACTC,SAAS,EACTC,QAAQ,EACRC,QAAQ,EACRC,aAAa,EACbC,cAAc,EACdC,sBAAsB,KAAK,EAC3BC,qBAAqB,EACrB,GAAGC,WACJ,GAAGX;IAEJ,MAAMY,WAAWV,SAAS;IAC1B,MAAMW,UAAUD,WAAW,UAAU;IACrC,MAAME,SAASF,WAAWhB,cAAcD;IACxC,MAAM,EAAEoB,KAAK,EAAEC,UAAU,EAAEC,YAAY,EAAE,GAAGpB,sBAAsB;QAChEI;QACAC;QACAK;QACAC;QACAC;QACAC;IACF;IACA,MAAMQ,SAASpB,sBAAsB;QACnCI;QACAG;QACAD;IACF;IAEA,qBACE,MAACV;QAAoByB,OAAOD;;YACzB,CAACN,YAAYG;0BACd,KAACF;gBACE,GAAGF,SAAS;gBACbV,KAAKe;gBACLb,WAAWW,OAAO;oBAChBX;oBACAiB,OAAOF,OAAOE,KAAK;oBACnBC,QAAQ;oBACRJ;oBACAP;gBACF;0BAECJ;;YAEFM,YAAYG;;;AAGnB,GAAG"}
1
+ {"version":3,"sources":["../../src/table/StickyTableSection.tsx"],"sourcesContent":["\"use client\";\n\nimport { type HTMLAttributes, forwardRef } from \"react\";\n\nimport { TableConfigProvider } from \"./TableConfigurationProvider.js\";\nimport { tableFooter } from \"./tableFooterStyles.js\";\nimport { tableHeader } from \"./tableHeaderStyles.js\";\nimport {\n type TableSectionConfiguration,\n type TableStickySectionConfiguration,\n} from \"./types.js\";\nimport { useStickyTableSection } from \"./useStickyTableSection.js\";\nimport { useTableSectionConfig } from \"./useTableSectionConfig.js\";\n\n/** @since 6.0.0 */\nexport interface StickyTableSectionProps\n extends\n HTMLAttributes<HTMLTableSectionElement>,\n TableStickySectionConfiguration,\n TableSectionConfiguration {\n type: \"header\" | \"footer\";\n\n /**\n * An optional className to use when the sticky section is covering other rows\n * (`active`). When this is defined, the default\n * `rmd-thead--sticky-active`/`rmd-tfoot--sticky-active` will no longer be\n * applied.\n */\n stickyActiveClassName?: string;\n}\n\n/**\n * **Client Component**\n *\n * This component is used to render a sticky `<thead>`/`<tfoot>` that\n * dynamically applies styles whenever the `<thead>`/`<tfoot>` are covering\n * content in the table.\n *\n * @see {@link https://react-md.dev/components/table | Table Demos}\n * @see {@link https://react-md.dev/components/table#sticky-tables | Sticky Table Demos}\n * @since 6.0.0\n */\nexport const StickyTableSection = forwardRef<\n HTMLTableSectionElement,\n StickyTableSectionProps\n>(function StickyTableSection(props, ref) {\n const {\n type,\n className,\n hoverable,\n lineWrap,\n children,\n stickyOptions,\n isStickyActive,\n disableStickyStyles = false,\n stickyActiveClassName,\n ...remaining\n } = props;\n\n const isHeader = type === \"header\";\n const Section = isHeader ? \"thead\" : \"tfoot\";\n const styles = isHeader ? tableHeader : tableFooter;\n const { tbody, sectionRef, stickyActive } = useStickyTableSection({\n ref,\n type,\n stickyOptions,\n isStickyActive,\n disableStickyStyles,\n stickyActiveClassName,\n });\n const config = useTableSectionConfig({\n type,\n lineWrap,\n hoverable,\n });\n\n return (\n <TableConfigProvider value={config}>\n {!isHeader && tbody}\n <Section\n {...remaining}\n ref={sectionRef}\n className={styles({\n className,\n dense: config.dense,\n sticky: true,\n stickyActive,\n stickyActiveClassName,\n })}\n >\n {children}\n </Section>\n {isHeader && tbody}\n </TableConfigProvider>\n );\n});\n"],"names":["forwardRef","TableConfigProvider","tableFooter","tableHeader","useStickyTableSection","useTableSectionConfig","StickyTableSection","props","ref","type","className","hoverable","lineWrap","children","stickyOptions","isStickyActive","disableStickyStyles","stickyActiveClassName","remaining","isHeader","Section","styles","tbody","sectionRef","stickyActive","config","value","dense","sticky"],"mappings":"AAAA;;AAEA,SAA8BA,UAAU,QAAQ,QAAQ;AAExD,SAASC,mBAAmB,QAAQ,kCAAkC;AACtE,SAASC,WAAW,QAAQ,yBAAyB;AACrD,SAASC,WAAW,QAAQ,yBAAyB;AAKrD,SAASC,qBAAqB,QAAQ,6BAA6B;AACnE,SAASC,qBAAqB,QAAQ,6BAA6B;AAmBnE;;;;;;;;;;CAUC,GACD,OAAO,MAAMC,mCAAqBN,WAGhC,SAASM,mBAAmBC,KAAK,EAAEC,GAAG;IACtC,MAAM,EACJC,IAAI,EACJC,SAAS,EACTC,SAAS,EACTC,QAAQ,EACRC,QAAQ,EACRC,aAAa,EACbC,cAAc,EACdC,sBAAsB,KAAK,EAC3BC,qBAAqB,EACrB,GAAGC,WACJ,GAAGX;IAEJ,MAAMY,WAAWV,SAAS;IAC1B,MAAMW,UAAUD,WAAW,UAAU;IACrC,MAAME,SAASF,WAAWhB,cAAcD;IACxC,MAAM,EAAEoB,KAAK,EAAEC,UAAU,EAAEC,YAAY,EAAE,GAAGpB,sBAAsB;QAChEI;QACAC;QACAK;QACAC;QACAC;QACAC;IACF;IACA,MAAMQ,SAASpB,sBAAsB;QACnCI;QACAG;QACAD;IACF;IAEA,qBACE,MAACV;QAAoByB,OAAOD;;YACzB,CAACN,YAAYG;0BACd,KAACF;gBACE,GAAGF,SAAS;gBACbV,KAAKe;gBACLb,WAAWW,OAAO;oBAChBX;oBACAiB,OAAOF,OAAOE,KAAK;oBACnBC,QAAQ;oBACRJ;oBACAP;gBACF;0BAECJ;;YAEFM,YAAYG;;;AAGnB,GAAG"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/table/Table.tsx"],"sourcesContent":["\"use client\";\n\nimport { type TableHTMLAttributes, forwardRef, useMemo } from \"react\";\n\nimport { TableConfigProvider } from \"./TableConfigurationProvider.js\";\nimport { table } from \"./tableStyles.js\";\nimport { type TableConfigContext, type TableConfiguration } from \"./types.js\";\n\ndeclare module \"react\" {\n interface CSSProperties {\n \"--rmd-table-background-color\"?: string;\n \"--rmd-table-border-size\"?: string | number;\n \"--rmd-table-border-color\"?: string;\n \"--rmd-table-header-background-color\"?: string;\n \"--rmd-table-cell-color\"?: string;\n \"--rmd-table-cell-height\"?: string | number;\n \"--rmd-table-cell-horizontal-padding\"?: string | number;\n \"--rmd-table-cell-vertical-padding\"?: string | number;\n \"--rmd-table-header-cell-height\"?: string | number;\n \"--rmd-table-hover-color\"?: string;\n \"--rmd-table-selected-color\"?: string;\n \"--rmd-table-sticky-cell\"?: string | number;\n \"--rmd-table-sticky-header\"?: string | number;\n \"--rmd-table-sticky-footer\"?: string | number;\n \"--rmd-table-sticky-background-color\"?: string;\n }\n}\n\nexport interface TableProps\n extends TableHTMLAttributes<HTMLTableElement>,\n TableConfiguration {}\n\n/**\n * **Client Component**\n *\n * @example Responsive Example\n * ```tsx\n * import { Table } from \"@react-md/core/table/Table\";\n * import { TableBody } from \"@react-md/core/table/TableBody\";\n * import { TableCell } from \"@react-md/core/table/TableCell\";\n * import { TableContainer } from \"@react-md/core/table/TableContainer\";\n * import { TableHeader } from \"@react-md/core/table/TableHeader\";\n * import { TableRow } from \"@react-md/core/table/TableRow\";\n * import type { ReactElement } from \"react\";\n *\n * function Example(): ReactElement {\n * return (\n * <TableContainer>\n * <Table>\n * <TableHeader>\n * <TableRow>\n * <TableCell>Header 1</TableCell>\n * <TableCell>Header 2</TableCell>\n * <TableCell>Header 3</TableCell>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>Row 1 Cell 1</TableCell>\n * <TableCell>Row 1 Cell 2</TableCell>\n * <TableCell>Row 1 Cell 3</TableCell>\n * </TableRow>\n * <TableRow>\n * <TableCell>Row 2 Cell 1</TableCell>\n * <TableCell>Row 2 Cell 2</TableCell>\n * <TableCell>Row 2 Cell 3</TableCell>\n * </TableRow>\n * <TableRow>\n * <TableCell>Row 3 Cell 1</TableCell>\n * <TableCell>Row 3 Cell 2</TableCell>\n * <TableCell>Row 3 Cell 3</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * </TableContainer>\n * );\n * }\n * ```\n *\n * @see {@link https://react-md.dev/components/table | Table Demos}\n */\nexport const Table = forwardRef<HTMLTableElement, TableProps>(\n function Table(props, ref) {\n const {\n className,\n children,\n dense = false,\n hAlign = \"left\",\n vAlign = \"middle\",\n lineWrap = false,\n fullWidth = false,\n disableHover = false,\n disableBorders = false,\n ...remaining\n } = props;\n\n const configuration = useMemo<TableConfigContext>(\n () => ({\n dense,\n header: false,\n hAlign,\n vAlign,\n lineWrap,\n disableHover,\n disableBorders,\n }),\n [dense, hAlign, vAlign, lineWrap, disableHover, disableBorders]\n );\n\n return (\n <TableConfigProvider value={configuration}>\n <table\n {...remaining}\n ref={ref}\n className={table({ dense, fullWidth, className })}\n >\n {children}\n </table>\n </TableConfigProvider>\n );\n }\n);\n"],"names":["forwardRef","useMemo","TableConfigProvider","table","Table","props","ref","className","children","dense","hAlign","vAlign","lineWrap","fullWidth","disableHover","disableBorders","remaining","configuration","header","value"],"mappings":"AAAA;;AAEA,SAAmCA,UAAU,EAAEC,OAAO,QAAQ,QAAQ;AAEtE,SAASC,mBAAmB,QAAQ,kCAAkC;AACtE,SAASC,KAAK,QAAQ,mBAAmB;AA2BzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDC,GACD,OAAO,MAAMC,sBAAQJ,WACnB,SAASI,MAAMC,KAAK,EAAEC,GAAG;IACvB,MAAM,EACJC,SAAS,EACTC,QAAQ,EACRC,QAAQ,KAAK,EACbC,SAAS,MAAM,EACfC,SAAS,QAAQ,EACjBC,WAAW,KAAK,EAChBC,YAAY,KAAK,EACjBC,eAAe,KAAK,EACpBC,iBAAiB,KAAK,EACtB,GAAGC,WACJ,GAAGX;IAEJ,MAAMY,gBAAgBhB,QACpB,IAAO,CAAA;YACLQ;YACAS,QAAQ;YACRR;YACAC;YACAC;YACAE;YACAC;QACF,CAAA,GACA;QAACN;QAAOC;QAAQC;QAAQC;QAAUE;QAAcC;KAAe;IAGjE,qBACE,KAACb;QAAoBiB,OAAOF;kBAC1B,cAAA,KAACd;YACE,GAAGa,SAAS;YACbV,KAAKA;YACLC,WAAWJ,MAAM;gBAAEM;gBAAOI;gBAAWN;YAAU;sBAE9CC;;;AAIT,GACA"}
1
+ {"version":3,"sources":["../../src/table/Table.tsx"],"sourcesContent":["\"use client\";\n\nimport { type TableHTMLAttributes, forwardRef, useMemo } from \"react\";\n\nimport { TableConfigProvider } from \"./TableConfigurationProvider.js\";\nimport { table } from \"./tableStyles.js\";\nimport { type TableConfigContext, type TableConfiguration } from \"./types.js\";\n\ndeclare module \"react\" {\n interface CSSProperties {\n \"--rmd-table-background-color\"?: string;\n \"--rmd-table-border-size\"?: string | number;\n \"--rmd-table-border-color\"?: string;\n \"--rmd-table-header-background-color\"?: string;\n \"--rmd-table-cell-color\"?: string;\n \"--rmd-table-cell-height\"?: string | number;\n \"--rmd-table-cell-horizontal-padding\"?: string | number;\n \"--rmd-table-cell-vertical-padding\"?: string | number;\n \"--rmd-table-header-cell-height\"?: string | number;\n \"--rmd-table-hover-color\"?: string;\n \"--rmd-table-selected-color\"?: string;\n \"--rmd-table-sticky-cell\"?: string | number;\n \"--rmd-table-sticky-header\"?: string | number;\n \"--rmd-table-sticky-footer\"?: string | number;\n \"--rmd-table-sticky-background-color\"?: string;\n }\n}\n\nexport interface TableProps\n extends TableHTMLAttributes<HTMLTableElement>, TableConfiguration {}\n\n/**\n * **Client Component**\n *\n * @example Responsive Example\n * ```tsx\n * import { Table } from \"@react-md/core/table/Table\";\n * import { TableBody } from \"@react-md/core/table/TableBody\";\n * import { TableCell } from \"@react-md/core/table/TableCell\";\n * import { TableContainer } from \"@react-md/core/table/TableContainer\";\n * import { TableHeader } from \"@react-md/core/table/TableHeader\";\n * import { TableRow } from \"@react-md/core/table/TableRow\";\n * import type { ReactElement } from \"react\";\n *\n * function Example(): ReactElement {\n * return (\n * <TableContainer>\n * <Table>\n * <TableHeader>\n * <TableRow>\n * <TableCell>Header 1</TableCell>\n * <TableCell>Header 2</TableCell>\n * <TableCell>Header 3</TableCell>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>Row 1 Cell 1</TableCell>\n * <TableCell>Row 1 Cell 2</TableCell>\n * <TableCell>Row 1 Cell 3</TableCell>\n * </TableRow>\n * <TableRow>\n * <TableCell>Row 2 Cell 1</TableCell>\n * <TableCell>Row 2 Cell 2</TableCell>\n * <TableCell>Row 2 Cell 3</TableCell>\n * </TableRow>\n * <TableRow>\n * <TableCell>Row 3 Cell 1</TableCell>\n * <TableCell>Row 3 Cell 2</TableCell>\n * <TableCell>Row 3 Cell 3</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * </TableContainer>\n * );\n * }\n * ```\n *\n * @see {@link https://react-md.dev/components/table | Table Demos}\n */\nexport const Table = forwardRef<HTMLTableElement, TableProps>(\n function Table(props, ref) {\n const {\n className,\n children,\n dense = false,\n hAlign = \"left\",\n vAlign = \"middle\",\n lineWrap = false,\n fullWidth = false,\n disableHover = false,\n disableBorders = false,\n ...remaining\n } = props;\n\n const configuration = useMemo<TableConfigContext>(\n () => ({\n dense,\n header: false,\n hAlign,\n vAlign,\n lineWrap,\n disableHover,\n disableBorders,\n }),\n [dense, hAlign, vAlign, lineWrap, disableHover, disableBorders]\n );\n\n return (\n <TableConfigProvider value={configuration}>\n <table\n {...remaining}\n ref={ref}\n className={table({ dense, fullWidth, className })}\n >\n {children}\n </table>\n </TableConfigProvider>\n );\n }\n);\n"],"names":["forwardRef","useMemo","TableConfigProvider","table","Table","props","ref","className","children","dense","hAlign","vAlign","lineWrap","fullWidth","disableHover","disableBorders","remaining","configuration","header","value"],"mappings":"AAAA;;AAEA,SAAmCA,UAAU,EAAEC,OAAO,QAAQ,QAAQ;AAEtE,SAASC,mBAAmB,QAAQ,kCAAkC;AACtE,SAASC,KAAK,QAAQ,mBAAmB;AA0BzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDC,GACD,OAAO,MAAMC,sBAAQJ,WACnB,SAASI,MAAMC,KAAK,EAAEC,GAAG;IACvB,MAAM,EACJC,SAAS,EACTC,QAAQ,EACRC,QAAQ,KAAK,EACbC,SAAS,MAAM,EACfC,SAAS,QAAQ,EACjBC,WAAW,KAAK,EAChBC,YAAY,KAAK,EACjBC,eAAe,KAAK,EACpBC,iBAAiB,KAAK,EACtB,GAAGC,WACJ,GAAGX;IAEJ,MAAMY,gBAAgBhB,QACpB,IAAO,CAAA;YACLQ;YACAS,QAAQ;YACRR;YACAC;YACAC;YACAE;YACAC;QACF,CAAA,GACA;QAACN;QAAOC;QAAQC;QAAQC;QAAUE;QAAcC;KAAe;IAGjE,qBACE,KAACb;QAAoBiB,OAAOF;kBAC1B,cAAA,KAACd;YACE,GAAGa,SAAS;YACbV,KAAKA;YACLC,WAAWJ,MAAM;gBAAEM;gBAAOI;gBAAWN;YAAU;sBAE9CC;;;AAIT,GACA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/table/TableBody.tsx"],"sourcesContent":["\"use client\";\n\nimport { cnb } from \"cnbuilder\";\nimport { type HTMLAttributes, forwardRef, useMemo } from \"react\";\n\nimport {\n TableConfigProvider,\n useTableConfig,\n} from \"./TableConfigurationProvider.js\";\nimport { type TableConfig, type TableConfigContext } from \"./types.js\";\n\nexport interface TableBodyProps\n extends HTMLAttributes<HTMLTableSectionElement>,\n Omit<TableConfig, \"header\"> {}\n\n/**\n * **Client Component**\n *\n * Creates a `<tbody>` element that also allows for overriding all the child\n * `TableCell` components with additional styling behavior.\n *\n * @see {@link https://react-md.dev/components/table | Table Demos}\n */\nexport const TableBody = forwardRef<HTMLTableSectionElement, TableBodyProps>(\n function TableBody(props, ref) {\n const {\n className,\n children,\n hAlign: propHAlign,\n vAlign: propVAlign,\n lineWrap: propLineWrap,\n disableHover: propDisableHover,\n disableBorders: propDisableBorders,\n ...remaining\n } = props;\n\n // update the table configuration with the custom overrides for the `<thead>`\n const { dense, hAlign, vAlign, lineWrap, disableHover, disableBorders } =\n useTableConfig({\n hAlign: propHAlign,\n vAlign: propVAlign,\n lineWrap: propLineWrap,\n disableHover: propDisableHover,\n disableBorders: propDisableBorders,\n });\n\n const configuration = useMemo<TableConfigContext>(\n () => ({\n header: false,\n dense,\n hAlign,\n vAlign,\n lineWrap,\n disableBorders,\n disableHover,\n }),\n [dense, hAlign, vAlign, lineWrap, disableBorders, disableHover]\n );\n\n return (\n <TableConfigProvider value={configuration}>\n <tbody {...remaining} ref={ref} className={cnb(\"rmd-tbody\", className)}>\n {children}\n </tbody>\n </TableConfigProvider>\n );\n }\n);\n"],"names":["cnb","forwardRef","useMemo","TableConfigProvider","useTableConfig","TableBody","props","ref","className","children","hAlign","propHAlign","vAlign","propVAlign","lineWrap","propLineWrap","disableHover","propDisableHover","disableBorders","propDisableBorders","remaining","dense","configuration","header","value","tbody"],"mappings":"AAAA;;AAEA,SAASA,GAAG,QAAQ,YAAY;AAChC,SAA8BC,UAAU,EAAEC,OAAO,QAAQ,QAAQ;AAEjE,SACEC,mBAAmB,EACnBC,cAAc,QACT,kCAAkC;AAOzC;;;;;;;CAOC,GACD,OAAO,MAAMC,0BAAYJ,WACvB,SAASI,UAAUC,KAAK,EAAEC,GAAG;IAC3B,MAAM,EACJC,SAAS,EACTC,QAAQ,EACRC,QAAQC,UAAU,EAClBC,QAAQC,UAAU,EAClBC,UAAUC,YAAY,EACtBC,cAAcC,gBAAgB,EAC9BC,gBAAgBC,kBAAkB,EAClC,GAAGC,WACJ,GAAGd;IAEJ,6EAA6E;IAC7E,MAAM,EAAEe,KAAK,EAAEX,MAAM,EAAEE,MAAM,EAAEE,QAAQ,EAAEE,YAAY,EAAEE,cAAc,EAAE,GACrEd,eAAe;QACbM,QAAQC;QACRC,QAAQC;QACRC,UAAUC;QACVC,cAAcC;QACdC,gBAAgBC;IAClB;IAEF,MAAMG,gBAAgBpB,QACpB,IAAO,CAAA;YACLqB,QAAQ;YACRF;YACAX;YACAE;YACAE;YACAI;YACAF;QACF,CAAA,GACA;QAACK;QAAOX;QAAQE;QAAQE;QAAUI;QAAgBF;KAAa;IAGjE,qBACE,KAACb;QAAoBqB,OAAOF;kBAC1B,cAAA,KAACG;YAAO,GAAGL,SAAS;YAAEb,KAAKA;YAAKC,WAAWR,IAAI,aAAaQ;sBACzDC;;;AAIT,GACA"}
1
+ {"version":3,"sources":["../../src/table/TableBody.tsx"],"sourcesContent":["\"use client\";\n\nimport { cnb } from \"cnbuilder\";\nimport { type HTMLAttributes, forwardRef, useMemo } from \"react\";\n\nimport {\n TableConfigProvider,\n useTableConfig,\n} from \"./TableConfigurationProvider.js\";\nimport { type TableConfig, type TableConfigContext } from \"./types.js\";\n\nexport interface TableBodyProps\n extends\n HTMLAttributes<HTMLTableSectionElement>,\n Omit<TableConfig, \"header\"> {}\n\n/**\n * **Client Component**\n *\n * Creates a `<tbody>` element that also allows for overriding all the child\n * `TableCell` components with additional styling behavior.\n *\n * @see {@link https://react-md.dev/components/table | Table Demos}\n */\nexport const TableBody = forwardRef<HTMLTableSectionElement, TableBodyProps>(\n function TableBody(props, ref) {\n const {\n className,\n children,\n hAlign: propHAlign,\n vAlign: propVAlign,\n lineWrap: propLineWrap,\n disableHover: propDisableHover,\n disableBorders: propDisableBorders,\n ...remaining\n } = props;\n\n // update the table configuration with the custom overrides for the `<thead>`\n const { dense, hAlign, vAlign, lineWrap, disableHover, disableBorders } =\n useTableConfig({\n hAlign: propHAlign,\n vAlign: propVAlign,\n lineWrap: propLineWrap,\n disableHover: propDisableHover,\n disableBorders: propDisableBorders,\n });\n\n const configuration = useMemo<TableConfigContext>(\n () => ({\n header: false,\n dense,\n hAlign,\n vAlign,\n lineWrap,\n disableBorders,\n disableHover,\n }),\n [dense, hAlign, vAlign, lineWrap, disableBorders, disableHover]\n );\n\n return (\n <TableConfigProvider value={configuration}>\n <tbody {...remaining} ref={ref} className={cnb(\"rmd-tbody\", className)}>\n {children}\n </tbody>\n </TableConfigProvider>\n );\n }\n);\n"],"names":["cnb","forwardRef","useMemo","TableConfigProvider","useTableConfig","TableBody","props","ref","className","children","hAlign","propHAlign","vAlign","propVAlign","lineWrap","propLineWrap","disableHover","propDisableHover","disableBorders","propDisableBorders","remaining","dense","configuration","header","value","tbody"],"mappings":"AAAA;;AAEA,SAASA,GAAG,QAAQ,YAAY;AAChC,SAA8BC,UAAU,EAAEC,OAAO,QAAQ,QAAQ;AAEjE,SACEC,mBAAmB,EACnBC,cAAc,QACT,kCAAkC;AAQzC;;;;;;;CAOC,GACD,OAAO,MAAMC,0BAAYJ,WACvB,SAASI,UAAUC,KAAK,EAAEC,GAAG;IAC3B,MAAM,EACJC,SAAS,EACTC,QAAQ,EACRC,QAAQC,UAAU,EAClBC,QAAQC,UAAU,EAClBC,UAAUC,YAAY,EACtBC,cAAcC,gBAAgB,EAC9BC,gBAAgBC,kBAAkB,EAClC,GAAGC,WACJ,GAAGd;IAEJ,6EAA6E;IAC7E,MAAM,EAAEe,KAAK,EAAEX,MAAM,EAAEE,MAAM,EAAEE,QAAQ,EAAEE,YAAY,EAAEE,cAAc,EAAE,GACrEd,eAAe;QACbM,QAAQC;QACRC,QAAQC;QACRC,UAAUC;QACVC,cAAcC;QACdC,gBAAgBC;IAClB;IAEF,MAAMG,gBAAgBpB,QACpB,IAAO,CAAA;YACLqB,QAAQ;YACRF;YACAX;YACAE;YACAE;YACAI;YACAF;QACF,CAAA,GACA;QAACK;QAAOX;QAAQE;QAAQE;QAAUI;QAAgBF;KAAa;IAGjE,qBACE,KAACb;QAAoBqB,OAAOF;kBAC1B,cAAA,KAACG;YAAO,GAAGL,SAAS;YAAEb,KAAKA;YAAKC,WAAWR,IAAI,aAAaQ;sBACzDC;;;AAIT,GACA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/table/TableCellContent.tsx"],"sourcesContent":["import { cnb } from \"cnbuilder\";\nimport { type ButtonHTMLAttributes, type ReactNode, forwardRef } from \"react\";\n\nimport { ButtonUnstyled } from \"../button/ButtonUnstyled.js\";\nimport { IconRotator, type IconRotatorProps } from \"../icon/IconRotator.js\";\nimport { bem } from \"../utils/bem.js\";\nimport { type SortOrder, type TableCellHorizontalAlignment } from \"./types.js\";\n\n/**\n * @since 6.0.0\n */\nexport type TableCellContentsIconRotatorProps = Omit<\n IconRotatorProps,\n \"children\" | \"rotated\"\n>;\n\n/**\n * @since 6.0.0 Extends the `ButtonHTMLAttributes` so the extra props\n * can be passed to the `ButtonUnstyled`\n * @internal\n */\nexport interface TableCellContentProps\n extends ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * The current sort order for this cell. Setting this to `null` will prevent\n * the button from being rendered.\n */\n sortOrder?: SortOrder;\n\n /**\n * This should normally be the `getIcon(\"sort\")`\n */\n icon?: ReactNode;\n\n /** @defaultValue `false` */\n iconAfter?: boolean;\n\n /**\n * Boolean if the icon should be rotated.\n */\n rotated?: boolean;\n\n /**\n * Any additional props to pass to the `IconRotator`.\n */\n iconRotatorProps?: TableCellContentsIconRotatorProps;\n\n /**\n * @since 4.0.3\n * @see {@link TableCellHorizontalAlignment}\n */\n hAlign?: TableCellHorizontalAlignment;\n}\n\nconst styles = bem(\"rmd-table-cell\");\n\n/**\n * This is mostly an internal component since it is automatically used within\n * the `TableCell` component but this will conditionally wrap the `children`\n * within an `UnstyledButton` to make a clickable cell. This is really to help\n * with sort behavior within headers.\n *\n * @internal\n */\nexport const TableCellContent = forwardRef<\n HTMLButtonElement,\n TableCellContentProps\n>(function TableCellContent(props, ref) {\n const {\n icon: propIcon,\n style,\n className,\n sortOrder,\n children,\n rotated: propRotated,\n hAlign = \"left\",\n iconAfter,\n iconRotatorProps,\n ...remaining\n } = props;\n if (!sortOrder || propIcon === null) {\n return <>{children}</>;\n }\n\n let icon: ReactNode = null;\n if (sortOrder !== \"none\") {\n const rotated = propRotated ?? sortOrder === \"descending\";\n\n icon = (\n <IconRotator {...iconRotatorProps} rotated={rotated}>\n {propIcon}\n </IconRotator>\n );\n }\n\n return (\n <ButtonUnstyled\n {...remaining}\n ref={ref}\n style={style}\n className={cnb(\n styles(\"content\", {\n [hAlign]: hAlign !== \"left\",\n }),\n className\n )}\n >\n {!iconAfter && icon}\n {children}\n {iconAfter && icon}\n </ButtonUnstyled>\n );\n});\n"],"names":["cnb","forwardRef","ButtonUnstyled","IconRotator","bem","styles","TableCellContent","props","ref","icon","propIcon","style","className","sortOrder","children","rotated","propRotated","hAlign","iconAfter","iconRotatorProps","remaining"],"mappings":";AAAA,SAASA,GAAG,QAAQ,YAAY;AAChC,SAAoDC,UAAU,QAAQ,QAAQ;AAE9E,SAASC,cAAc,QAAQ,8BAA8B;AAC7D,SAASC,WAAW,QAA+B,yBAAyB;AAC5E,SAASC,GAAG,QAAQ,kBAAkB;AAiDtC,MAAMC,SAASD,IAAI;AAEnB;;;;;;;CAOC,GACD,OAAO,MAAME,iCAAmBL,WAG9B,SAASK,iBAAiBC,KAAK,EAAEC,GAAG;IACpC,MAAM,EACJC,MAAMC,QAAQ,EACdC,KAAK,EACLC,SAAS,EACTC,SAAS,EACTC,QAAQ,EACRC,SAASC,WAAW,EACpBC,SAAS,MAAM,EACfC,SAAS,EACTC,gBAAgB,EAChB,GAAGC,WACJ,GAAGb;IACJ,IAAI,CAACM,aAAaH,aAAa,MAAM;QACnC,qBAAO;sBAAGI;;IACZ;IAEA,IAAIL,OAAkB;IACtB,IAAII,cAAc,QAAQ;QACxB,MAAME,UAAUC,eAAeH,cAAc;QAE7CJ,qBACE,KAACN;YAAa,GAAGgB,gBAAgB;YAAEJ,SAASA;sBACzCL;;IAGP;IAEA,qBACE,MAACR;QACE,GAAGkB,SAAS;QACbZ,KAAKA;QACLG,OAAOA;QACPC,WAAWZ,IACTK,OAAO,WAAW;YAChB,CAACY,OAAO,EAAEA,WAAW;QACvB,IACAL;;YAGD,CAACM,aAAaT;YACdK;YACAI,aAAaT;;;AAGpB,GAAG"}
1
+ {"version":3,"sources":["../../src/table/TableCellContent.tsx"],"sourcesContent":["import { cnb } from \"cnbuilder\";\nimport { type ButtonHTMLAttributes, type ReactNode, forwardRef } from \"react\";\n\nimport { ButtonUnstyled } from \"../button/ButtonUnstyled.js\";\nimport { IconRotator, type IconRotatorProps } from \"../icon/IconRotator.js\";\nimport { bem } from \"../utils/bem.js\";\nimport { type SortOrder, type TableCellHorizontalAlignment } from \"./types.js\";\n\n/**\n * @since 6.0.0\n */\nexport type TableCellContentsIconRotatorProps = Omit<\n IconRotatorProps,\n \"children\" | \"rotated\"\n>;\n\n/**\n * @since 6.0.0 Extends the `ButtonHTMLAttributes` so the extra props\n * can be passed to the `ButtonUnstyled`\n * @internal\n */\nexport interface TableCellContentProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * The current sort order for this cell. Setting this to `null` will prevent\n * the button from being rendered.\n */\n sortOrder?: SortOrder;\n\n /**\n * This should normally be the `getIcon(\"sort\")`\n */\n icon?: ReactNode;\n\n /** @defaultValue `false` */\n iconAfter?: boolean;\n\n /**\n * Boolean if the icon should be rotated.\n */\n rotated?: boolean;\n\n /**\n * Any additional props to pass to the `IconRotator`.\n */\n iconRotatorProps?: TableCellContentsIconRotatorProps;\n\n /**\n * @since 4.0.3\n * @see {@link TableCellHorizontalAlignment}\n */\n hAlign?: TableCellHorizontalAlignment;\n}\n\nconst styles = bem(\"rmd-table-cell\");\n\n/**\n * This is mostly an internal component since it is automatically used within\n * the `TableCell` component but this will conditionally wrap the `children`\n * within an `UnstyledButton` to make a clickable cell. This is really to help\n * with sort behavior within headers.\n *\n * @internal\n */\nexport const TableCellContent = forwardRef<\n HTMLButtonElement,\n TableCellContentProps\n>(function TableCellContent(props, ref) {\n const {\n icon: propIcon,\n style,\n className,\n sortOrder,\n children,\n rotated: propRotated,\n hAlign = \"left\",\n iconAfter,\n iconRotatorProps,\n ...remaining\n } = props;\n if (!sortOrder || propIcon === null) {\n return <>{children}</>;\n }\n\n let icon: ReactNode = null;\n if (sortOrder !== \"none\") {\n const rotated = propRotated ?? sortOrder === \"descending\";\n\n icon = (\n <IconRotator {...iconRotatorProps} rotated={rotated}>\n {propIcon}\n </IconRotator>\n );\n }\n\n return (\n <ButtonUnstyled\n {...remaining}\n ref={ref}\n style={style}\n className={cnb(\n styles(\"content\", {\n [hAlign]: hAlign !== \"left\",\n }),\n className\n )}\n >\n {!iconAfter && icon}\n {children}\n {iconAfter && icon}\n </ButtonUnstyled>\n );\n});\n"],"names":["cnb","forwardRef","ButtonUnstyled","IconRotator","bem","styles","TableCellContent","props","ref","icon","propIcon","style","className","sortOrder","children","rotated","propRotated","hAlign","iconAfter","iconRotatorProps","remaining"],"mappings":";AAAA,SAASA,GAAG,QAAQ,YAAY;AAChC,SAAoDC,UAAU,QAAQ,QAAQ;AAE9E,SAASC,cAAc,QAAQ,8BAA8B;AAC7D,SAASC,WAAW,QAA+B,yBAAyB;AAC5E,SAASC,GAAG,QAAQ,kBAAkB;AAgDtC,MAAMC,SAASD,IAAI;AAEnB;;;;;;;CAOC,GACD,OAAO,MAAME,iCAAmBL,WAG9B,SAASK,iBAAiBC,KAAK,EAAEC,GAAG;IACpC,MAAM,EACJC,MAAMC,QAAQ,EACdC,KAAK,EACLC,SAAS,EACTC,SAAS,EACTC,QAAQ,EACRC,SAASC,WAAW,EACpBC,SAAS,MAAM,EACfC,SAAS,EACTC,gBAAgB,EAChB,GAAGC,WACJ,GAAGb;IACJ,IAAI,CAACM,aAAaH,aAAa,MAAM;QACnC,qBAAO;sBAAGI;;IACZ;IAEA,IAAIL,OAAkB;IACtB,IAAII,cAAc,QAAQ;QACxB,MAAME,UAAUC,eAAeH,cAAc;QAE7CJ,qBACE,KAACN;YAAa,GAAGgB,gBAAgB;YAAEJ,SAASA;sBACzCL;;IAGP;IAEA,qBACE,MAACR;QACE,GAAGkB,SAAS;QACbZ,KAAKA;QACLG,OAAOA;QACPC,WAAWZ,IACTK,OAAO,WAAW;YAChB,CAACY,OAAO,EAAEA,WAAW;QACvB,IACAL;;YAGD,CAACM,aAAaT;YACdK;YACAI,aAAaT;;;AAGpB,GAAG"}