@react-md/core 6.4.0 → 6.5.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 (431) hide show
  1. package/dist/_a11y.scss +3 -1
  2. package/dist/_box-shadows.scss +20 -12
  3. package/dist/_core.scss +1 -1
  4. package/dist/_utils.scss +26 -11
  5. package/dist/app-bar/_app-bar.scss +3 -3
  6. package/dist/autocomplete/AutocompleteChip.js +2 -2
  7. package/dist/autocomplete/AutocompleteChip.js.map +1 -1
  8. package/dist/autocomplete/AutocompleteListboxChildren.js +1 -1
  9. package/dist/autocomplete/AutocompleteListboxChildren.js.map +1 -1
  10. package/dist/autocomplete/_autocomplete.scss +20 -16
  11. package/dist/autocomplete/useAutocomplete.js +4 -4
  12. package/dist/autocomplete/useAutocomplete.js.map +1 -1
  13. package/dist/autocomplete/utils.js +3 -3
  14. package/dist/autocomplete/utils.js.map +1 -1
  15. package/dist/avatar/_avatar.scss +2 -1
  16. package/dist/box/styles.js +2 -2
  17. package/dist/box/styles.js.map +1 -1
  18. package/dist/button/AsyncButton.js +1 -1
  19. package/dist/button/AsyncButton.js.map +1 -1
  20. package/dist/button/_button.scss +9 -5
  21. package/dist/card/_card.scss +6 -6
  22. package/dist/chip/Chip.js +1 -1
  23. package/dist/chip/Chip.js.map +1 -1
  24. package/dist/chip/_chip.scss +6 -6
  25. package/dist/cssUtils.d.ts +11 -6
  26. package/dist/cssUtils.js.map +1 -1
  27. package/dist/datetime/useTimeField.js +1 -1
  28. package/dist/datetime/useTimeField.js.map +1 -1
  29. package/dist/delegateEvent.js +9 -9
  30. package/dist/delegateEvent.js.map +1 -1
  31. package/dist/dialog/_dialog.scss +6 -6
  32. package/dist/divider/_divider.scss +6 -2
  33. package/dist/draggable/useDraggable.js +4 -4
  34. package/dist/draggable/useDraggable.js.map +1 -1
  35. package/dist/draggable/utils.js +1 -1
  36. package/dist/draggable/utils.js.map +1 -1
  37. package/dist/expansion-panel/ExpansionPanel.js +1 -1
  38. package/dist/expansion-panel/ExpansionPanel.js.map +1 -1
  39. package/dist/expansion-panel/useExpansionPanels.js +1 -1
  40. package/dist/expansion-panel/useExpansionPanels.js.map +1 -1
  41. package/dist/files/FileInput.js +1 -1
  42. package/dist/files/FileInput.js.map +1 -1
  43. package/dist/files/createAcceptFromExtensions.d.ts +5 -0
  44. package/dist/files/createAcceptFromExtensions.js +15 -0
  45. package/dist/files/createAcceptFromExtensions.js.map +1 -0
  46. package/dist/files/useFileUpload.js +45 -41
  47. package/dist/files/useFileUpload.js.map +1 -1
  48. package/dist/files/utils.js +14 -10
  49. package/dist/files/utils.js.map +1 -1
  50. package/dist/files/validation.js +7 -8
  51. package/dist/files/validation.js.map +1 -1
  52. package/dist/focus/useFocusContainer.js +1 -1
  53. package/dist/focus/useFocusContainer.js.map +1 -1
  54. package/dist/focus/utils.js +12 -7
  55. package/dist/focus/utils.js.map +1 -1
  56. package/dist/form/InputToggleIcon.js +5 -1
  57. package/dist/form/InputToggleIcon.js.map +1 -1
  58. package/dist/form/NativeSelect.js +1 -1
  59. package/dist/form/NativeSelect.js.map +1 -1
  60. package/dist/form/Select.d.ts +24 -0
  61. package/dist/form/Select.js +19 -8
  62. package/dist/form/Select.js.map +1 -1
  63. package/dist/form/SelectedOption.d.ts +1 -2
  64. package/dist/form/SelectedOption.js +2 -2
  65. package/dist/form/SelectedOption.js.map +1 -1
  66. package/dist/form/_input-toggle.scss +6 -5
  67. package/dist/form/_label.scss +2 -2
  68. package/dist/form/_legend.scss +22 -13
  69. package/dist/form/_slider.scss +7 -5
  70. package/dist/form/_switch.scss +7 -5
  71. package/dist/form/_text-field.scss +13 -11
  72. package/dist/form/formConfig.js +1 -1
  73. package/dist/form/formConfig.js.map +1 -1
  74. package/dist/form/inputToggleStyles.js +7 -1
  75. package/dist/form/inputToggleStyles.js.map +1 -1
  76. package/dist/form/legendStyles.d.ts +1 -1
  77. package/dist/form/legendStyles.js.map +1 -1
  78. package/dist/form/selectUtils.js +2 -2
  79. package/dist/form/selectUtils.js.map +1 -1
  80. package/dist/form/useCombobox.js +1 -0
  81. package/dist/form/useCombobox.js.map +1 -1
  82. package/dist/form/useFormReset.js +2 -2
  83. package/dist/form/useFormReset.js.map +1 -1
  84. package/dist/form/useNumberField.js +1 -1
  85. package/dist/form/useNumberField.js.map +1 -1
  86. package/dist/form/useResizingTextArea.js +4 -4
  87. package/dist/form/useResizingTextArea.js.map +1 -1
  88. package/dist/form/useSelectCombobox.js +1 -1
  89. package/dist/form/useSelectCombobox.js.map +1 -1
  90. package/dist/form/validation.js +1 -1
  91. package/dist/form/validation.js.map +1 -1
  92. package/dist/hoverMode/useHoverMode.js +8 -8
  93. package/dist/hoverMode/useHoverMode.js.map +1 -1
  94. package/dist/hoverMode/useHoverModeProvider.js +3 -3
  95. package/dist/hoverMode/useHoverModeProvider.js.map +1 -1
  96. package/dist/icon/config.js +3 -3
  97. package/dist/icon/config.js.map +1 -1
  98. package/dist/icon/materialConfig.js +1 -1
  99. package/dist/icon/materialConfig.js.map +1 -1
  100. package/dist/interaction/UserInteractionModeProvider.js +11 -10
  101. package/dist/interaction/UserInteractionModeProvider.js.map +1 -1
  102. package/dist/interaction/_interaction.scss +5 -3
  103. package/dist/interaction/utils.js +7 -3
  104. package/dist/interaction/utils.js.map +1 -1
  105. package/dist/layout/useExpandableLayout.js +3 -4
  106. package/dist/layout/useExpandableLayout.js.map +1 -1
  107. package/dist/layout/useMainTabIndex.js +1 -1
  108. package/dist/layout/useMainTabIndex.js.map +1 -1
  109. package/dist/list/ListItem.js +1 -1
  110. package/dist/list/ListItem.js.map +1 -1
  111. package/dist/media-queries/AppSizeProvider.js +1 -1
  112. package/dist/media-queries/AppSizeProvider.js.map +1 -1
  113. package/dist/media-queries/config.js +2 -2
  114. package/dist/media-queries/config.js.map +1 -1
  115. package/dist/media-queries/useMediaQuery.js +3 -3
  116. package/dist/media-queries/useMediaQuery.js.map +1 -1
  117. package/dist/menu/Menu.js +4 -4
  118. package/dist/menu/Menu.js.map +1 -1
  119. package/dist/menu/MenuItemButton.js +1 -1
  120. package/dist/menu/MenuItemButton.js.map +1 -1
  121. package/dist/menu/MenuItemFileInput.js +1 -1
  122. package/dist/menu/MenuItemFileInput.js.map +1 -1
  123. package/dist/menu/MenuWidget.js +2 -2
  124. package/dist/menu/MenuWidget.js.map +1 -1
  125. package/dist/movement/findMatchIndex.js +2 -2
  126. package/dist/movement/findMatchIndex.js.map +1 -1
  127. package/dist/movement/useKeyboardMovementProvider.js +2 -2
  128. package/dist/movement/useKeyboardMovementProvider.js.map +1 -1
  129. package/dist/movement/utils.js +12 -10
  130. package/dist/movement/utils.js.map +1 -1
  131. package/dist/navigation/getTableOfContentsHeadings.js +4 -3
  132. package/dist/navigation/getTableOfContentsHeadings.js.map +1 -1
  133. package/dist/navigation/useActiveHeadingId.js +9 -9
  134. package/dist/navigation/useActiveHeadingId.js.map +1 -1
  135. package/dist/navigation/useTableOfContentsHeadings.js +1 -1
  136. package/dist/navigation/useTableOfContentsHeadings.js.map +1 -1
  137. package/dist/navigation/utils.js +6 -5
  138. package/dist/navigation/utils.js.map +1 -1
  139. package/dist/portal/PortalContainerProvider.js +5 -3
  140. package/dist/portal/PortalContainerProvider.js.map +1 -1
  141. package/dist/positioning/getFixedPosition.js +2 -4
  142. package/dist/positioning/getFixedPosition.js.map +1 -1
  143. package/dist/positioning/useFixedPositioning.js +2 -2
  144. package/dist/positioning/useFixedPositioning.js.map +1 -1
  145. package/dist/positioning/utils.js +3 -3
  146. package/dist/positioning/utils.js.map +1 -1
  147. package/dist/scroll/getScrollbarWidth.js +4 -4
  148. package/dist/scroll/getScrollbarWidth.js.map +1 -1
  149. package/dist/searching/fuzzy.js +3 -2
  150. package/dist/searching/fuzzy.js.map +1 -1
  151. package/dist/searching/toSearchQuery.js +1 -1
  152. package/dist/searching/toSearchQuery.js.map +1 -1
  153. package/dist/searching/utils.js +1 -1
  154. package/dist/searching/utils.js.map +1 -1
  155. package/dist/snackbar/Toast.js +1 -1
  156. package/dist/snackbar/Toast.js.map +1 -1
  157. package/dist/snackbar/ToastContent.js +2 -2
  158. package/dist/snackbar/ToastContent.js.map +1 -1
  159. package/dist/snackbar/ToastManager.d.ts +1 -1
  160. package/dist/snackbar/ToastManager.js +11 -11
  161. package/dist/snackbar/ToastManager.js.map +1 -1
  162. package/dist/snackbar/_snackbar.scss +3 -3
  163. package/dist/spinbutton/useSpinButton.js +1 -1
  164. package/dist/spinbutton/useSpinButton.js.map +1 -1
  165. package/dist/spinbutton/utils/deselectNode.js +1 -1
  166. package/dist/spinbutton/utils/deselectNode.js.map +1 -1
  167. package/dist/spinbutton/utils/resolveInputEvent.js +1 -1
  168. package/dist/spinbutton/utils/resolveInputEvent.js.map +1 -1
  169. package/dist/spinbutton/utils/selectNode.js +1 -1
  170. package/dist/spinbutton/utils/selectNode.js.map +1 -1
  171. package/dist/storage/useStorage.js +8 -3
  172. package/dist/storage/useStorage.js.map +1 -1
  173. package/dist/table/useStickyTableSection.js +1 -1
  174. package/dist/table/useStickyTableSection.js.map +1 -1
  175. package/dist/tabs/TabList.js +2 -2
  176. package/dist/tabs/TabList.js.map +1 -1
  177. package/dist/tabs/_tabs.scss +5 -6
  178. package/dist/tabs/useMaxTabPanelHeight.js +4 -3
  179. package/dist/tabs/useMaxTabPanelHeight.js.map +1 -1
  180. package/dist/tabs/useTabList.js +1 -1
  181. package/dist/tabs/useTabList.js.map +1 -1
  182. package/dist/test-utils/jest-globals/match-media.d.ts +1 -1
  183. package/dist/test-utils/jest-globals/match-media.js +1 -1
  184. package/dist/test-utils/jest-globals/match-media.js.map +1 -1
  185. package/dist/test-utils/jest-globals/timers.js +1 -1
  186. package/dist/test-utils/jest-globals/timers.js.map +1 -1
  187. package/dist/test-utils/jest-globals/uploadMenuItemFileInput.js +1 -1
  188. package/dist/test-utils/jest-globals/uploadMenuItemFileInput.js.map +1 -1
  189. package/dist/test-utils/mocks/ResizeObserver.js +2 -2
  190. package/dist/test-utils/mocks/ResizeObserver.js.map +1 -1
  191. package/dist/test-utils/polyfills/IntersectionObserver.js +2 -2
  192. package/dist/test-utils/polyfills/IntersectionObserver.js.map +1 -1
  193. package/dist/test-utils/polyfills/ResizeObserver.js +2 -2
  194. package/dist/test-utils/polyfills/ResizeObserver.js.map +1 -1
  195. package/dist/test-utils/polyfills/TextDecoder.js +2 -2
  196. package/dist/test-utils/polyfills/TextDecoder.js.map +1 -1
  197. package/dist/test-utils/polyfills/TextEncoder.js +2 -2
  198. package/dist/test-utils/polyfills/TextEncoder.js.map +1 -1
  199. package/dist/test-utils/polyfills/matchMedia.js +2 -2
  200. package/dist/test-utils/polyfills/matchMedia.js.map +1 -1
  201. package/dist/test-utils/polyfills/offsetParent.js +2 -2
  202. package/dist/test-utils/polyfills/offsetParent.js.map +1 -1
  203. package/dist/test-utils/polyfills/scrollIntoView.js +1 -1
  204. package/dist/test-utils/polyfills/scrollIntoView.js.map +1 -1
  205. package/dist/test-utils/queries/select.js +2 -2
  206. package/dist/test-utils/queries/select.js.map +1 -1
  207. package/dist/test-utils/queries/slider.js +1 -1
  208. package/dist/test-utils/queries/slider.js.map +1 -1
  209. package/dist/test-utils/utils/createFileList.js +2 -0
  210. package/dist/test-utils/utils/createFileList.js.map +1 -1
  211. package/dist/test-utils/utils/createMatchMediaSpy.d.ts +1 -1
  212. package/dist/test-utils/utils/createMatchMediaSpy.js +3 -3
  213. package/dist/test-utils/utils/createMatchMediaSpy.js.map +1 -1
  214. package/dist/test-utils/vitest/match-media.d.ts +1 -1
  215. package/dist/test-utils/vitest/match-media.js +1 -1
  216. package/dist/test-utils/vitest/match-media.js.map +1 -1
  217. package/dist/test-utils/vitest/timers.js +1 -1
  218. package/dist/test-utils/vitest/timers.js.map +1 -1
  219. package/dist/test-utils/vitest/uploadMenuItemFileInput.js +1 -1
  220. package/dist/test-utils/vitest/uploadMenuItemFileInput.js.map +1 -1
  221. package/dist/theme/ThemeProvider.js +2 -2
  222. package/dist/theme/ThemeProvider.js.map +1 -1
  223. package/dist/theme/_a11y.scss +3 -1
  224. package/dist/theme/_theme.scss +16 -12
  225. package/dist/theme/getDerivedTheme.js +1 -1
  226. package/dist/theme/getDerivedTheme.js.map +1 -1
  227. package/dist/theme/useCSSVariables.js +5 -5
  228. package/dist/theme/useCSSVariables.js.map +1 -1
  229. package/dist/theme/useColorSchemeMetaTag.js +2 -2
  230. package/dist/theme/useColorSchemeMetaTag.js.map +1 -1
  231. package/dist/theme/useInlineCSSVariables.js +4 -3
  232. package/dist/theme/useInlineCSSVariables.js.map +1 -1
  233. package/dist/theme/utils.js +8 -8
  234. package/dist/theme/utils.js.map +1 -1
  235. package/dist/tooltip/useTooltip.js +7 -7
  236. package/dist/tooltip/useTooltip.js.map +1 -1
  237. package/dist/tooltip/useTooltipPosition.js +1 -1
  238. package/dist/tooltip/useTooltipPosition.js.map +1 -1
  239. package/dist/transition/useCarousel.js +2 -2
  240. package/dist/transition/useCarousel.js.map +1 -1
  241. package/dist/transition/useCollapseTransition.js +1 -1
  242. package/dist/transition/useCollapseTransition.js.map +1 -1
  243. package/dist/transition/useSkeletonPlaceholder.js +4 -4
  244. package/dist/transition/useSkeletonPlaceholder.js.map +1 -1
  245. package/dist/transition/useTransition.js +2 -2
  246. package/dist/transition/useTransition.js.map +1 -1
  247. package/dist/transition/utils.js +5 -5
  248. package/dist/transition/utils.js.map +1 -1
  249. package/dist/tree/TreeItem.js +1 -1
  250. package/dist/tree/TreeItem.js.map +1 -1
  251. package/dist/tree/useTreeItems.js +7 -5
  252. package/dist/tree/useTreeItems.js.map +1 -1
  253. package/dist/tree/useTreeMovement.js +1 -1
  254. package/dist/tree/useTreeMovement.js.map +1 -1
  255. package/dist/tree/utils.js +6 -9
  256. package/dist/tree/utils.js.map +1 -1
  257. package/dist/typography/HighlightText.js +2 -1
  258. package/dist/typography/HighlightText.js.map +1 -1
  259. package/dist/typography/SrOnly.js +7 -1
  260. package/dist/typography/SrOnly.js.map +1 -1
  261. package/dist/useDebouncedFunction.js +4 -4
  262. package/dist/useDebouncedFunction.js.map +1 -1
  263. package/dist/useDropzone.js +9 -9
  264. package/dist/useDropzone.js.map +1 -1
  265. package/dist/useEnsuredState.js +5 -5
  266. package/dist/useEnsuredState.js.map +1 -1
  267. package/dist/useIntersectionObserver.js +3 -3
  268. package/dist/useIntersectionObserver.js.map +1 -1
  269. package/dist/useIsomorphicLayoutEffect.js +1 -1
  270. package/dist/useIsomorphicLayoutEffect.js.map +1 -1
  271. package/dist/useOrientation.js +1 -1
  272. package/dist/useOrientation.js.map +1 -1
  273. package/dist/useReadonlySet.js +1 -1
  274. package/dist/useReadonlySet.js.map +1 -1
  275. package/dist/useResizeListener.js +2 -2
  276. package/dist/useResizeListener.js.map +1 -1
  277. package/dist/useResizeObserver.js +3 -4
  278. package/dist/useResizeObserver.js.map +1 -1
  279. package/dist/useThrottledFunction.js +3 -3
  280. package/dist/useThrottledFunction.js.map +1 -1
  281. package/dist/useWindowSize.js +1 -1
  282. package/dist/useWindowSize.js.map +1 -1
  283. package/dist/utils/alphaNumericSort.js +3 -1
  284. package/dist/utils/alphaNumericSort.js.map +1 -1
  285. package/dist/utils/bem.js +9 -12
  286. package/dist/utils/bem.js.map +1 -1
  287. package/dist/utils/getNumberOfDigits.js +1 -0
  288. package/dist/utils/getNumberOfDigits.js.map +1 -1
  289. package/dist/utils/getRangeDefaultValue.js +1 -1
  290. package/dist/utils/getRangeDefaultValue.js.map +1 -1
  291. package/dist/utils/nearest.js +2 -2
  292. package/dist/utils/nearest.js.map +1 -1
  293. package/dist/utils/parseCssLengthUnit.js +3 -3
  294. package/dist/utils/parseCssLengthUnit.js.map +1 -1
  295. package/dist/utils/trigonometry.js +1 -1
  296. package/dist/utils/trigonometry.js.map +1 -1
  297. package/dist/window-splitter/_window-splitter.scss +15 -17
  298. package/package.json +9 -7
  299. package/src/autocomplete/AutocompleteChip.tsx +2 -2
  300. package/src/autocomplete/AutocompleteListboxChildren.tsx +1 -1
  301. package/src/autocomplete/useAutocomplete.ts +4 -4
  302. package/src/autocomplete/utils.ts +3 -3
  303. package/src/box/styles.ts +2 -2
  304. package/src/button/AsyncButton.tsx +1 -3
  305. package/src/chip/Chip.tsx +1 -2
  306. package/src/cssUtils.ts +12 -6
  307. package/src/datetime/useTimeField.ts +1 -1
  308. package/src/delegateEvent.ts +9 -9
  309. package/src/draggable/useDraggable.ts +4 -4
  310. package/src/draggable/utils.ts +1 -1
  311. package/src/expansion-panel/ExpansionPanel.tsx +1 -1
  312. package/src/expansion-panel/useExpansionPanels.ts +1 -1
  313. package/src/files/FileInput.tsx +1 -1
  314. package/src/files/createAcceptFromExtensions.ts +18 -0
  315. package/src/files/useFileUpload.ts +36 -37
  316. package/src/files/utils.ts +15 -11
  317. package/src/files/validation.ts +7 -9
  318. package/src/focus/useFocusContainer.ts +1 -1
  319. package/src/focus/utils.ts +11 -6
  320. package/src/form/InputToggleIcon.tsx +5 -5
  321. package/src/form/NativeSelect.tsx +1 -1
  322. package/src/form/Select.tsx +58 -7
  323. package/src/form/SelectedOption.tsx +2 -4
  324. package/src/form/formConfig.ts +1 -1
  325. package/src/form/inputToggleStyles.ts +9 -4
  326. package/src/form/legendStyles.ts +1 -1
  327. package/src/form/selectUtils.ts +2 -2
  328. package/src/form/useCombobox.ts +1 -0
  329. package/src/form/useFormReset.ts +2 -2
  330. package/src/form/useNumberField.ts +1 -1
  331. package/src/form/useResizingTextArea.ts +5 -5
  332. package/src/form/useSelectCombobox.ts +1 -4
  333. package/src/form/validation.ts +1 -1
  334. package/src/hoverMode/useHoverMode.ts +9 -9
  335. package/src/hoverMode/useHoverModeProvider.ts +4 -4
  336. package/src/icon/config.tsx +3 -3
  337. package/src/icon/materialConfig.ts +1 -1
  338. package/src/interaction/UserInteractionModeProvider.tsx +11 -10
  339. package/src/interaction/utils.ts +3 -3
  340. package/src/layout/useExpandableLayout.ts +3 -4
  341. package/src/layout/useMainTabIndex.ts +1 -1
  342. package/src/list/ListItem.tsx +1 -1
  343. package/src/media-queries/AppSizeProvider.tsx +1 -1
  344. package/src/media-queries/config.ts +2 -2
  345. package/src/media-queries/useMediaQuery.ts +3 -3
  346. package/src/menu/Menu.tsx +4 -4
  347. package/src/menu/MenuItemButton.tsx +1 -1
  348. package/src/menu/MenuItemFileInput.tsx +1 -1
  349. package/src/menu/MenuWidget.tsx +6 -4
  350. package/src/movement/findMatchIndex.ts +2 -2
  351. package/src/movement/useKeyboardMovementProvider.ts +2 -2
  352. package/src/movement/utils.ts +15 -14
  353. package/src/navigation/getTableOfContentsHeadings.ts +4 -3
  354. package/src/navigation/useActiveHeadingId.ts +8 -8
  355. package/src/navigation/useTableOfContentsHeadings.ts +1 -1
  356. package/src/navigation/utils.ts +6 -5
  357. package/src/portal/PortalContainerProvider.tsx +5 -3
  358. package/src/positioning/getFixedPosition.ts +9 -6
  359. package/src/positioning/useFixedPositioning.ts +2 -2
  360. package/src/positioning/utils.ts +3 -3
  361. package/src/scroll/getScrollbarWidth.ts +4 -4
  362. package/src/searching/fuzzy.ts +7 -3
  363. package/src/searching/toSearchQuery.ts +1 -1
  364. package/src/searching/utils.ts +1 -1
  365. package/src/snackbar/Toast.tsx +1 -1
  366. package/src/snackbar/ToastContent.tsx +2 -2
  367. package/src/snackbar/ToastManager.ts +11 -12
  368. package/src/spinbutton/useSpinButton.ts +1 -1
  369. package/src/spinbutton/utils/deselectNode.ts +1 -1
  370. package/src/spinbutton/utils/resolveInputEvent.ts +1 -1
  371. package/src/spinbutton/utils/selectNode.ts +1 -1
  372. package/src/storage/useStorage.ts +7 -2
  373. package/src/table/useStickyTableSection.tsx +1 -1
  374. package/src/tabs/TabList.tsx +2 -2
  375. package/src/tabs/useMaxTabPanelHeight.ts +6 -3
  376. package/src/tabs/useTabList.ts +2 -2
  377. package/src/test-utils/jest-globals/match-media.ts +5 -2
  378. package/src/test-utils/jest-globals/timers.ts +1 -1
  379. package/src/test-utils/jest-globals/uploadMenuItemFileInput.ts +1 -1
  380. package/src/test-utils/mocks/ResizeObserver.ts +2 -2
  381. package/src/test-utils/polyfills/IntersectionObserver.ts +2 -2
  382. package/src/test-utils/polyfills/ResizeObserver.ts +2 -2
  383. package/src/test-utils/polyfills/TextDecoder.ts +2 -2
  384. package/src/test-utils/polyfills/TextEncoder.ts +2 -2
  385. package/src/test-utils/polyfills/matchMedia.ts +5 -2
  386. package/src/test-utils/polyfills/offsetParent.ts +2 -2
  387. package/src/test-utils/polyfills/scrollIntoView.ts +1 -1
  388. package/src/test-utils/queries/select.ts +2 -2
  389. package/src/test-utils/queries/slider.ts +1 -1
  390. package/src/test-utils/utils/createFileList.ts +2 -0
  391. package/src/test-utils/utils/createMatchMediaSpy.ts +4 -4
  392. package/src/test-utils/vitest/match-media.ts +2 -2
  393. package/src/test-utils/vitest/timers.ts +1 -1
  394. package/src/test-utils/vitest/uploadMenuItemFileInput.ts +1 -1
  395. package/src/theme/ThemeProvider.tsx +2 -2
  396. package/src/theme/getDerivedTheme.ts +1 -1
  397. package/src/theme/useCSSVariables.ts +5 -5
  398. package/src/theme/useColorSchemeMetaTag.ts +2 -2
  399. package/src/theme/useInlineCSSVariables.ts +6 -7
  400. package/src/theme/utils.ts +8 -8
  401. package/src/tooltip/useTooltip.ts +7 -7
  402. package/src/tooltip/useTooltipPosition.ts +1 -1
  403. package/src/transition/useCarousel.ts +2 -2
  404. package/src/transition/useCollapseTransition.ts +1 -1
  405. package/src/transition/useSkeletonPlaceholder.ts +4 -4
  406. package/src/transition/useTransition.ts +2 -2
  407. package/src/transition/utils.ts +5 -5
  408. package/src/tree/TreeItem.tsx +1 -1
  409. package/src/tree/useTreeItems.ts +5 -5
  410. package/src/tree/useTreeMovement.ts +1 -1
  411. package/src/tree/utils.ts +9 -9
  412. package/src/typography/HighlightText.tsx +4 -3
  413. package/src/typography/SrOnly.tsx +9 -2
  414. package/src/useDebouncedFunction.ts +5 -5
  415. package/src/useDropzone.ts +10 -10
  416. package/src/useEnsuredState.ts +5 -5
  417. package/src/useIntersectionObserver.ts +3 -3
  418. package/src/useIsomorphicLayoutEffect.ts +3 -3
  419. package/src/useOrientation.ts +1 -1
  420. package/src/useReadonlySet.ts +3 -1
  421. package/src/useResizeListener.ts +2 -2
  422. package/src/useResizeObserver.ts +3 -4
  423. package/src/useThrottledFunction.ts +4 -4
  424. package/src/useWindowSize.ts +1 -1
  425. package/src/utils/alphaNumericSort.ts +1 -1
  426. package/src/utils/bem.ts +15 -16
  427. package/src/utils/getNumberOfDigits.ts +1 -0
  428. package/src/utils/getRangeDefaultValue.ts +1 -1
  429. package/src/utils/nearest.ts +5 -2
  430. package/src/utils/parseCssLengthUnit.ts +5 -4
  431. package/src/utils/trigonometry.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/test-utils/vitest/timers.ts"],"sourcesContent":["import { type MockInstance, vi } from \"vitest\";\n\n/**\n * @since 6.0.0\n */\nexport type RafSpy = MockInstance<typeof requestAnimationFrame>;\n\n/**\n * @example\n * ```ts\n * import { testImmediateRaf } from \"@react-md/core/test-utils/vitest\";\n *\n * describe(\"some test suite\", () => {\n * it(\"should test something with requestAnimationFrame\", () => {\n * const raf = testImmediateRaf();\n *\n * // do some testing with requestAnimationFrame\n *\n * // reset to original at the end of the test\n * raf.mockRestore()\n * });\n * });\n * ```\n *\n * @example Automatic Cleanup\n * ```ts\n * import { testImmediateRaf } from \"@react-md/core/test-utils/vitest\";\n *\n * afterEach(() => {\n * vi.restoreAllMocks();\n * });\n *\n * describe(\"some test suite\", () => {\n * it(\"should test something with requestAnimationFrame\", () => {\n * const raf = testImmediateRaf();\n *\n * // do some testing with requestAnimationFrame\n * });\n * });\n * ```\n *\n * @since 6.0.0\n */\nexport const testImmediateRaf = (): RafSpy =>\n vi.spyOn(window, \"requestAnimationFrame\").mockImplementation((cb) => {\n cb(0);\n return 0;\n });\n"],"names":["vi","testImmediateRaf","spyOn","window","mockImplementation","cb"],"mappings":"AAAA,SAA4BA,EAAE,QAAQ,SAAS;AAO/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCC,GACD,OAAO,MAAMC,mBAAmB,IAC9BD,GAAGE,KAAK,CAACC,QAAQ,yBAAyBC,kBAAkB,CAAC,CAACC;QAC5DA,GAAG;QACH,OAAO;IACT,GAAG"}
1
+ {"version":3,"sources":["../../../src/test-utils/vitest/timers.ts"],"sourcesContent":["import { type MockInstance, vi } from \"vitest\";\n\n/**\n * @since 6.0.0\n */\nexport type RafSpy = MockInstance<typeof requestAnimationFrame>;\n\n/**\n * @example\n * ```ts\n * import { testImmediateRaf } from \"@react-md/core/test-utils/vitest\";\n *\n * describe(\"some test suite\", () => {\n * it(\"should test something with requestAnimationFrame\", () => {\n * const raf = testImmediateRaf();\n *\n * // do some testing with requestAnimationFrame\n *\n * // reset to original at the end of the test\n * raf.mockRestore()\n * });\n * });\n * ```\n *\n * @example Automatic Cleanup\n * ```ts\n * import { testImmediateRaf } from \"@react-md/core/test-utils/vitest\";\n *\n * afterEach(() => {\n * vi.restoreAllMocks();\n * });\n *\n * describe(\"some test suite\", () => {\n * it(\"should test something with requestAnimationFrame\", () => {\n * const raf = testImmediateRaf();\n *\n * // do some testing with requestAnimationFrame\n * });\n * });\n * ```\n *\n * @since 6.0.0\n */\nexport const testImmediateRaf = (): RafSpy =>\n vi.spyOn(globalThis, \"requestAnimationFrame\").mockImplementation((cb) => {\n cb(0);\n return 0;\n });\n"],"names":["vi","testImmediateRaf","spyOn","globalThis","mockImplementation","cb"],"mappings":"AAAA,SAA4BA,EAAE,QAAQ,SAAS;AAO/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCC,GACD,OAAO,MAAMC,mBAAmB,IAC9BD,GAAGE,KAAK,CAACC,YAAY,yBAAyBC,kBAAkB,CAAC,CAACC;QAChEA,GAAG;QACH,OAAO;IACT,GAAG"}
@@ -29,7 +29,7 @@ import { createFileList } from "../utils/createFileList.js";
29
29
  vitest.spyOn(input, "click").mockImplementationOnce(()=>{
30
30
  fireEvent.change(input, {
31
31
  target: {
32
- files: createFileList(window, files)
32
+ files: createFileList(globalThis.window, files)
33
33
  }
34
34
  });
35
35
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/test-utils/vitest/uploadMenuItemFileInput.ts"],"sourcesContent":["import { fireEvent } from \"@testing-library/dom\";\nimport { type UserEvent } from \"@testing-library/user-event\";\nimport { vitest } from \"vitest\";\n\nimport { createFileList } from \"../utils/createFileList.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface UploadMenuItemFileUploadOptions {\n user: UserEvent;\n files: File | readonly File[];\n menuItem: HTMLElement;\n}\n\n/**\n * @example Main Example\n * ```tsx\n * const user = userEvent.setup()\n * render(<Test />);\n *\n * await user.click(screen.getByRole(\"button\", { name: \"Dropdown Menu\" }));\n *\n * const menuItem = screen.getByRole(\"menuitem\", { name: \"Upload\" });\n * const file = new File([\"pretend-bytes\"], \"README.txt\");\n * await uploadMenuItemFileUpload({\n * user,\n * // can be a single file or multiple\n * files: file,\n * menuItem,\n * });\n *\n * // expect something with uploaded file\n * ```\n *\n * @since 6.0.0\n */\nexport async function uploadMenuItemFileUpload(\n options: UploadMenuItemFileUploadOptions\n): Promise<void> {\n const { user, files, menuItem } = options;\n\n const input = document.createElement(\"input\");\n vitest.spyOn(document, \"createElement\").mockReturnValueOnce(input);\n vitest.spyOn(input, \"click\").mockImplementationOnce(() => {\n fireEvent.change(input, {\n target: { files: createFileList(window, files) },\n });\n });\n\n await user.click(menuItem);\n}\n"],"names":["fireEvent","vitest","createFileList","uploadMenuItemFileUpload","options","user","files","menuItem","input","document","createElement","spyOn","mockReturnValueOnce","mockImplementationOnce","change","target","window","click"],"mappings":"AAAA,SAASA,SAAS,QAAQ,uBAAuB;AAEjD,SAASC,MAAM,QAAQ,SAAS;AAEhC,SAASC,cAAc,QAAQ,6BAA6B;AAW5D;;;;;;;;;;;;;;;;;;;;;CAqBC,GACD,OAAO,eAAeC,yBACpBC,OAAwC;IAExC,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGH;IAElC,MAAMI,QAAQC,SAASC,aAAa,CAAC;IACrCT,OAAOU,KAAK,CAACF,UAAU,iBAAiBG,mBAAmB,CAACJ;IAC5DP,OAAOU,KAAK,CAACH,OAAO,SAASK,sBAAsB,CAAC;QAClDb,UAAUc,MAAM,CAACN,OAAO;YACtBO,QAAQ;gBAAET,OAAOJ,eAAec,QAAQV;YAAO;QACjD;IACF;IAEA,MAAMD,KAAKY,KAAK,CAACV;AACnB"}
1
+ {"version":3,"sources":["../../../src/test-utils/vitest/uploadMenuItemFileInput.ts"],"sourcesContent":["import { fireEvent } from \"@testing-library/dom\";\nimport { type UserEvent } from \"@testing-library/user-event\";\nimport { vitest } from \"vitest\";\n\nimport { createFileList } from \"../utils/createFileList.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface UploadMenuItemFileUploadOptions {\n user: UserEvent;\n files: File | readonly File[];\n menuItem: HTMLElement;\n}\n\n/**\n * @example Main Example\n * ```tsx\n * const user = userEvent.setup()\n * render(<Test />);\n *\n * await user.click(screen.getByRole(\"button\", { name: \"Dropdown Menu\" }));\n *\n * const menuItem = screen.getByRole(\"menuitem\", { name: \"Upload\" });\n * const file = new File([\"pretend-bytes\"], \"README.txt\");\n * await uploadMenuItemFileUpload({\n * user,\n * // can be a single file or multiple\n * files: file,\n * menuItem,\n * });\n *\n * // expect something with uploaded file\n * ```\n *\n * @since 6.0.0\n */\nexport async function uploadMenuItemFileUpload(\n options: UploadMenuItemFileUploadOptions\n): Promise<void> {\n const { user, files, menuItem } = options;\n\n const input = document.createElement(\"input\");\n vitest.spyOn(document, \"createElement\").mockReturnValueOnce(input);\n vitest.spyOn(input, \"click\").mockImplementationOnce(() => {\n fireEvent.change(input, {\n target: { files: createFileList(globalThis.window, files) },\n });\n });\n\n await user.click(menuItem);\n}\n"],"names":["fireEvent","vitest","createFileList","uploadMenuItemFileUpload","options","user","files","menuItem","input","document","createElement","spyOn","mockReturnValueOnce","mockImplementationOnce","change","target","globalThis","window","click"],"mappings":"AAAA,SAASA,SAAS,QAAQ,uBAAuB;AAEjD,SAASC,MAAM,QAAQ,SAAS;AAEhC,SAASC,cAAc,QAAQ,6BAA6B;AAW5D;;;;;;;;;;;;;;;;;;;;;CAqBC,GACD,OAAO,eAAeC,yBACpBC,OAAwC;IAExC,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGH;IAElC,MAAMI,QAAQC,SAASC,aAAa,CAAC;IACrCT,OAAOU,KAAK,CAACF,UAAU,iBAAiBG,mBAAmB,CAACJ;IAC5DP,OAAOU,KAAK,CAACH,OAAO,SAASK,sBAAsB,CAAC;QAClDb,UAAUc,MAAM,CAACN,OAAO;YACtBO,QAAQ;gBAAET,OAAOJ,eAAec,WAAWC,MAAM,EAAEX;YAAO;QAC5D;IACF;IAEA,MAAMD,KAAKa,KAAK,CAACX;AACnB"}
@@ -122,11 +122,11 @@ const { Provider } = context;
122
122
  // NOTE: This will not be correct the first time a new theme is lazy-loaded
123
123
  // and applied. It might be good to have a way to manually force this flow
124
124
  // again?
125
- const frame = window.requestAnimationFrame(()=>{
125
+ const frame = globalThis.requestAnimationFrame(()=>{
126
126
  setDerivedTheme(getDerivedTheme(document.documentElement));
127
127
  });
128
128
  return ()=>{
129
- window.cancelAnimationFrame(frame);
129
+ globalThis.cancelAnimationFrame(frame);
130
130
  };
131
131
  }, [
132
132
  theme,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/theme/ThemeProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n type ReactElement,\n type ReactNode,\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\nimport { useSsr } from \"../SsrProvider.js\";\nimport { DEFAULT_DARK_THEME, DEFAULT_LIGHT_THEME } from \"./constants.js\";\nimport { getDerivedTheme } from \"./getDerivedTheme.js\";\nimport { type ConfigurableThemeColors, type ThemeContext } from \"./types.js\";\nimport { useColorScheme } from \"./useColorScheme.js\";\n\nconst context = createContext<Readonly<ThemeContext> | undefined>(undefined);\ncontext.displayName = \"Theme\";\nconst { Provider } = context;\n\n/**\n * This hook can be used to access the current theme set by the\n * {@link ThemeProvider}.\n *\n * @example Simple Example\n * ```tsx\n * import { useTheme } from \"@react-md/core/theme/ThemeProvider\";\n * import type { ReactElement } from \"react\";\n *\n * function Example(): ReactElement {\n * const theme = useTheme();\n *\n * return <pre><code>{JSON.stringify(theme, null, 2)}</code></pre>;\n * }\n * ```\n *\n * @since 6.0.0\n * @throws \"The `ThemeProvider` has not been initialized.\"\n */\nexport function useTheme(): Readonly<ThemeContext>;\n\n/**\n * @internal\n * @since 6.0.0\n */\nexport function useTheme(\n allowUndefined: true\n): Readonly<ThemeContext> | undefined;\n\n/**\n * @internal\n * @since 6.0.0\n * @throws \"The `ThemeProvider` has not been initialized.\"\n */\nexport function useTheme(\n allowUndefined?: boolean\n): Readonly<ThemeContext> | undefined {\n const theme = useContext(context);\n if (!theme && !allowUndefined) {\n throw new Error(\"The `ThemeProvider` has not been initialized.\");\n }\n\n return theme;\n}\n\n/** @since 6.0.0 */\nexport interface ThemeProviderProps {\n /**\n * When this is `undefined`, the theme will be derived by computing the\n * `document.documentElement`'s styles for all the `react-md` theme custom\n * properties. The theme will also automatically update whenever the\n * `currentColor` or `colorScheme` change.\n *\n * It is recommended to manually provide your theme if you know it beforehand.\n * Deriving the theme is really only useful if you allow your user to\n * customize all these theme values themselves and persist through local\n * storage/cookies.\n *\n * @see {@link DEFAULT_DARK_THEME}\n * @see {@link DEFAULT_LIGHT_THEME}\n * @defaultValue `currentColor === \"dark\" ? DEFAULT_DARK_THEME : DEFAULT_LIGHT_THEME`\n */\n theme?: Readonly<ConfigurableThemeColors>;\n\n children: ReactNode;\n}\n\n/**\n * **Client Component**\n *\n * The `ThemeProvider` should be added to the root of your app but as a child of\n * the `CoreProviders`.\n *\n * @example\n * ```tsx\n * import { CoreProviders } from \"@react-md/core/CoreProviders\";\n * import {\n * black,\n * blue500,\n * greenAccent700,\n * orangeAccent200,\n * orangeAccent400,\n * red500,\n * } from \"@react-md/core/theme/colors\";\n * import { ThemeProvider } from \"@react-md/core/theme/ThemeProvider\";\n * import { type ConfigurableThemeColors } from \"@react-md/core/theme/types\";\n * import { type ReactElement } from \"react\";\n * import { createRoot } from \"react-dom/client\";\n *\n * import App from \"./App\";\n *\n * const theme: Readonly<ConfigurableThemeColors> = {\n * primaryColor: blue500,\n * onPrimaryColor: black,\n * secondaryColor: orangeAccent400,\n * onSecondaryColor: black,\n * warningColor: orangeAccent200,\n * onWarningColor: black,\n * errorColor: red500,\n * onErrorColor: black,\n * successColor: greenAccent700,\n * onSuccessColor: black,\n * backgroundColor: \"#121212\",\n * textPrimaryColor: \"#d9d9d9\",\n * textSecondaryColor: \"#b3b3b3\",\n * textHintColor: \"gray\", // #808080\n * textDisabledColor: \"gray\", // #808080\n * };\n *\n * const container = document.getElementById(\"app\");\n * const root = createRoot(container);\n * root.render(\n * <CoreProviders>\n * <ThemeProvider theme={theme}>\n * <App />\n * </ThemeProvider>\n * </CoreProviders>\n * );\n * ```\n *\n * @example Automatically Deriving the Theme\n * ```tsx\n * import { CoreProviders } from \"@react-md/core/CoreProviders\";\n * import { LocalStorageColorSchemeProvider } from \"@react-md/core/theme/LocalStorageColorSchemeProvider\";\n * import { ThemeProvider } from \"@react-md/core/theme/ThemeProvider\";\n * import { type ReactElement } from \"react\";\n * import { createRoot } from \"react-dom/client\";\n *\n * import App from \"./App\";\n *\n * const container = document.getElementById(\"app\");\n * const root = createRoot(container);\n * root.render(\n * <CoreProviders>\n * <LocalStorageColorSchemeProvider>\n * <ThemeProvider>\n * <App />\n * </ThemeProvider>\n * </LocalStorageColorSchemeProvider>\n * </CoreProviders>\n * );\n * ```\n *\n * @see {@link https://react-md.dev/components/theme-provider | ThemeProvider Demos}\n * @since 6.0.0\n */\nexport function ThemeProvider(props: ThemeProviderProps): ReactElement {\n const { children, theme } = props;\n const ssr = useSsr();\n const { currentColor, colorScheme } = useColorScheme();\n const [derivedTheme, setDerivedTheme] = useState<ConfigurableThemeColors>(\n () => {\n if (theme) {\n return theme;\n }\n\n if (!ssr && typeof document !== \"undefined\") {\n return getDerivedTheme(document.documentElement);\n }\n\n return currentColor === \"dark\" ? DEFAULT_DARK_THEME : DEFAULT_LIGHT_THEME;\n }\n );\n\n const derived = !theme;\n useEffect(() => {\n if (theme) {\n return;\n }\n\n // This has to be recalculated after an animation to ensure the new theme\n // styles have been applied. It will use the previous theme styles without\n // this frame.\n //\n // NOTE: This will not be correct the first time a new theme is lazy-loaded\n // and applied. It might be good to have a way to manually force this flow\n // again?\n const frame = window.requestAnimationFrame(() => {\n setDerivedTheme(getDerivedTheme(document.documentElement));\n });\n\n return () => {\n window.cancelAnimationFrame(frame);\n };\n }, [theme, currentColor, colorScheme]);\n\n const value = useMemo<ThemeContext>(() => {\n const backgroundColor =\n theme?.backgroundColor ?? derivedTheme.backgroundColor;\n const primaryColor = theme?.primaryColor ?? derivedTheme.primaryColor;\n const onPrimaryColor = theme?.onPrimaryColor ?? derivedTheme.onPrimaryColor;\n const secondaryColor = theme?.secondaryColor ?? derivedTheme.secondaryColor;\n const onSecondaryColor =\n theme?.onSecondaryColor ?? derivedTheme.onSecondaryColor;\n const warningColor = theme?.warningColor ?? derivedTheme.warningColor;\n const onWarningColor = theme?.onWarningColor ?? derivedTheme.onWarningColor;\n const errorColor = theme?.errorColor ?? derivedTheme.errorColor;\n const onErrorColor = theme?.onErrorColor ?? derivedTheme.onErrorColor;\n const successColor = theme?.successColor ?? derivedTheme.successColor;\n const onSuccessColor = theme?.onSuccessColor ?? derivedTheme.onSuccessColor;\n const textPrimaryColor =\n theme?.textPrimaryColor ?? derivedTheme.textPrimaryColor;\n const textSecondaryColor =\n theme?.textSecondaryColor ?? derivedTheme.textSecondaryColor;\n const textHintColor = theme?.textHintColor ?? derivedTheme.textHintColor;\n const textDisabledColor =\n theme?.textDisabledColor ?? derivedTheme.textDisabledColor;\n\n return {\n derived,\n backgroundColor,\n primaryColor,\n onPrimaryColor,\n secondaryColor,\n onSecondaryColor,\n warningColor,\n onWarningColor,\n errorColor,\n onErrorColor,\n successColor,\n onSuccessColor,\n textPrimaryColor,\n textSecondaryColor,\n textHintColor,\n textDisabledColor,\n setDerivedTheme,\n };\n }, [\n derived,\n derivedTheme.backgroundColor,\n derivedTheme.errorColor,\n derivedTheme.onErrorColor,\n derivedTheme.onPrimaryColor,\n derivedTheme.onSecondaryColor,\n derivedTheme.onSuccessColor,\n derivedTheme.onWarningColor,\n derivedTheme.primaryColor,\n derivedTheme.secondaryColor,\n derivedTheme.successColor,\n derivedTheme.textDisabledColor,\n derivedTheme.textHintColor,\n derivedTheme.textPrimaryColor,\n derivedTheme.textSecondaryColor,\n derivedTheme.warningColor,\n theme?.backgroundColor,\n theme?.errorColor,\n theme?.onErrorColor,\n theme?.onPrimaryColor,\n theme?.onSecondaryColor,\n theme?.onSuccessColor,\n theme?.onWarningColor,\n theme?.primaryColor,\n theme?.secondaryColor,\n theme?.successColor,\n theme?.textDisabledColor,\n theme?.textHintColor,\n theme?.textPrimaryColor,\n theme?.textSecondaryColor,\n theme?.warningColor,\n ]);\n\n return <Provider value={value}>{children}</Provider>;\n}\n"],"names":["createContext","useContext","useEffect","useMemo","useState","useSsr","DEFAULT_DARK_THEME","DEFAULT_LIGHT_THEME","getDerivedTheme","useColorScheme","context","undefined","displayName","Provider","useTheme","allowUndefined","theme","Error","ThemeProvider","props","children","ssr","currentColor","colorScheme","derivedTheme","setDerivedTheme","document","documentElement","derived","frame","window","requestAnimationFrame","cancelAnimationFrame","value","backgroundColor","primaryColor","onPrimaryColor","secondaryColor","onSecondaryColor","warningColor","onWarningColor","errorColor","onErrorColor","successColor","onSuccessColor","textPrimaryColor","textSecondaryColor","textHintColor","textDisabledColor"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/theme/ThemeProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n type ReactElement,\n type ReactNode,\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\nimport { useSsr } from \"../SsrProvider.js\";\nimport { DEFAULT_DARK_THEME, DEFAULT_LIGHT_THEME } from \"./constants.js\";\nimport { getDerivedTheme } from \"./getDerivedTheme.js\";\nimport { type ConfigurableThemeColors, type ThemeContext } from \"./types.js\";\nimport { useColorScheme } from \"./useColorScheme.js\";\n\nconst context = createContext<Readonly<ThemeContext> | undefined>(undefined);\ncontext.displayName = \"Theme\";\nconst { Provider } = context;\n\n/**\n * This hook can be used to access the current theme set by the\n * {@link ThemeProvider}.\n *\n * @example Simple Example\n * ```tsx\n * import { useTheme } from \"@react-md/core/theme/ThemeProvider\";\n * import type { ReactElement } from \"react\";\n *\n * function Example(): ReactElement {\n * const theme = useTheme();\n *\n * return <pre><code>{JSON.stringify(theme, null, 2)}</code></pre>;\n * }\n * ```\n *\n * @since 6.0.0\n * @throws \"The `ThemeProvider` has not been initialized.\"\n */\nexport function useTheme(): Readonly<ThemeContext>;\n\n/**\n * @internal\n * @since 6.0.0\n */\nexport function useTheme(\n allowUndefined: true\n): Readonly<ThemeContext> | undefined;\n\n/**\n * @internal\n * @since 6.0.0\n * @throws \"The `ThemeProvider` has not been initialized.\"\n */\nexport function useTheme(\n allowUndefined?: boolean\n): Readonly<ThemeContext> | undefined {\n const theme = useContext(context);\n if (!theme && !allowUndefined) {\n throw new Error(\"The `ThemeProvider` has not been initialized.\");\n }\n\n return theme;\n}\n\n/** @since 6.0.0 */\nexport interface ThemeProviderProps {\n /**\n * When this is `undefined`, the theme will be derived by computing the\n * `document.documentElement`'s styles for all the `react-md` theme custom\n * properties. The theme will also automatically update whenever the\n * `currentColor` or `colorScheme` change.\n *\n * It is recommended to manually provide your theme if you know it beforehand.\n * Deriving the theme is really only useful if you allow your user to\n * customize all these theme values themselves and persist through local\n * storage/cookies.\n *\n * @see {@link DEFAULT_DARK_THEME}\n * @see {@link DEFAULT_LIGHT_THEME}\n * @defaultValue `currentColor === \"dark\" ? DEFAULT_DARK_THEME : DEFAULT_LIGHT_THEME`\n */\n theme?: Readonly<ConfigurableThemeColors>;\n\n children: ReactNode;\n}\n\n/**\n * **Client Component**\n *\n * The `ThemeProvider` should be added to the root of your app but as a child of\n * the `CoreProviders`.\n *\n * @example\n * ```tsx\n * import { CoreProviders } from \"@react-md/core/CoreProviders\";\n * import {\n * black,\n * blue500,\n * greenAccent700,\n * orangeAccent200,\n * orangeAccent400,\n * red500,\n * } from \"@react-md/core/theme/colors\";\n * import { ThemeProvider } from \"@react-md/core/theme/ThemeProvider\";\n * import { type ConfigurableThemeColors } from \"@react-md/core/theme/types\";\n * import { type ReactElement } from \"react\";\n * import { createRoot } from \"react-dom/client\";\n *\n * import App from \"./App\";\n *\n * const theme: Readonly<ConfigurableThemeColors> = {\n * primaryColor: blue500,\n * onPrimaryColor: black,\n * secondaryColor: orangeAccent400,\n * onSecondaryColor: black,\n * warningColor: orangeAccent200,\n * onWarningColor: black,\n * errorColor: red500,\n * onErrorColor: black,\n * successColor: greenAccent700,\n * onSuccessColor: black,\n * backgroundColor: \"#121212\",\n * textPrimaryColor: \"#d9d9d9\",\n * textSecondaryColor: \"#b3b3b3\",\n * textHintColor: \"gray\", // #808080\n * textDisabledColor: \"gray\", // #808080\n * };\n *\n * const container = document.getElementById(\"app\");\n * const root = createRoot(container);\n * root.render(\n * <CoreProviders>\n * <ThemeProvider theme={theme}>\n * <App />\n * </ThemeProvider>\n * </CoreProviders>\n * );\n * ```\n *\n * @example Automatically Deriving the Theme\n * ```tsx\n * import { CoreProviders } from \"@react-md/core/CoreProviders\";\n * import { LocalStorageColorSchemeProvider } from \"@react-md/core/theme/LocalStorageColorSchemeProvider\";\n * import { ThemeProvider } from \"@react-md/core/theme/ThemeProvider\";\n * import { type ReactElement } from \"react\";\n * import { createRoot } from \"react-dom/client\";\n *\n * import App from \"./App\";\n *\n * const container = document.getElementById(\"app\");\n * const root = createRoot(container);\n * root.render(\n * <CoreProviders>\n * <LocalStorageColorSchemeProvider>\n * <ThemeProvider>\n * <App />\n * </ThemeProvider>\n * </LocalStorageColorSchemeProvider>\n * </CoreProviders>\n * );\n * ```\n *\n * @see {@link https://react-md.dev/components/theme-provider | ThemeProvider Demos}\n * @since 6.0.0\n */\nexport function ThemeProvider(props: ThemeProviderProps): ReactElement {\n const { children, theme } = props;\n const ssr = useSsr();\n const { currentColor, colorScheme } = useColorScheme();\n const [derivedTheme, setDerivedTheme] = useState<ConfigurableThemeColors>(\n () => {\n if (theme) {\n return theme;\n }\n\n if (!ssr && typeof document !== \"undefined\") {\n return getDerivedTheme(document.documentElement);\n }\n\n return currentColor === \"dark\" ? DEFAULT_DARK_THEME : DEFAULT_LIGHT_THEME;\n }\n );\n\n const derived = !theme;\n useEffect(() => {\n if (theme) {\n return;\n }\n\n // This has to be recalculated after an animation to ensure the new theme\n // styles have been applied. It will use the previous theme styles without\n // this frame.\n //\n // NOTE: This will not be correct the first time a new theme is lazy-loaded\n // and applied. It might be good to have a way to manually force this flow\n // again?\n const frame = globalThis.requestAnimationFrame(() => {\n setDerivedTheme(getDerivedTheme(document.documentElement));\n });\n\n return () => {\n globalThis.cancelAnimationFrame(frame);\n };\n }, [theme, currentColor, colorScheme]);\n\n const value = useMemo<ThemeContext>(() => {\n const backgroundColor =\n theme?.backgroundColor ?? derivedTheme.backgroundColor;\n const primaryColor = theme?.primaryColor ?? derivedTheme.primaryColor;\n const onPrimaryColor = theme?.onPrimaryColor ?? derivedTheme.onPrimaryColor;\n const secondaryColor = theme?.secondaryColor ?? derivedTheme.secondaryColor;\n const onSecondaryColor =\n theme?.onSecondaryColor ?? derivedTheme.onSecondaryColor;\n const warningColor = theme?.warningColor ?? derivedTheme.warningColor;\n const onWarningColor = theme?.onWarningColor ?? derivedTheme.onWarningColor;\n const errorColor = theme?.errorColor ?? derivedTheme.errorColor;\n const onErrorColor = theme?.onErrorColor ?? derivedTheme.onErrorColor;\n const successColor = theme?.successColor ?? derivedTheme.successColor;\n const onSuccessColor = theme?.onSuccessColor ?? derivedTheme.onSuccessColor;\n const textPrimaryColor =\n theme?.textPrimaryColor ?? derivedTheme.textPrimaryColor;\n const textSecondaryColor =\n theme?.textSecondaryColor ?? derivedTheme.textSecondaryColor;\n const textHintColor = theme?.textHintColor ?? derivedTheme.textHintColor;\n const textDisabledColor =\n theme?.textDisabledColor ?? derivedTheme.textDisabledColor;\n\n return {\n derived,\n backgroundColor,\n primaryColor,\n onPrimaryColor,\n secondaryColor,\n onSecondaryColor,\n warningColor,\n onWarningColor,\n errorColor,\n onErrorColor,\n successColor,\n onSuccessColor,\n textPrimaryColor,\n textSecondaryColor,\n textHintColor,\n textDisabledColor,\n setDerivedTheme,\n };\n }, [\n derived,\n derivedTheme.backgroundColor,\n derivedTheme.errorColor,\n derivedTheme.onErrorColor,\n derivedTheme.onPrimaryColor,\n derivedTheme.onSecondaryColor,\n derivedTheme.onSuccessColor,\n derivedTheme.onWarningColor,\n derivedTheme.primaryColor,\n derivedTheme.secondaryColor,\n derivedTheme.successColor,\n derivedTheme.textDisabledColor,\n derivedTheme.textHintColor,\n derivedTheme.textPrimaryColor,\n derivedTheme.textSecondaryColor,\n derivedTheme.warningColor,\n theme?.backgroundColor,\n theme?.errorColor,\n theme?.onErrorColor,\n theme?.onPrimaryColor,\n theme?.onSecondaryColor,\n theme?.onSuccessColor,\n theme?.onWarningColor,\n theme?.primaryColor,\n theme?.secondaryColor,\n theme?.successColor,\n theme?.textDisabledColor,\n theme?.textHintColor,\n theme?.textPrimaryColor,\n theme?.textSecondaryColor,\n theme?.warningColor,\n ]);\n\n return <Provider value={value}>{children}</Provider>;\n}\n"],"names":["createContext","useContext","useEffect","useMemo","useState","useSsr","DEFAULT_DARK_THEME","DEFAULT_LIGHT_THEME","getDerivedTheme","useColorScheme","context","undefined","displayName","Provider","useTheme","allowUndefined","theme","Error","ThemeProvider","props","children","ssr","currentColor","colorScheme","derivedTheme","setDerivedTheme","document","documentElement","derived","frame","globalThis","requestAnimationFrame","cancelAnimationFrame","value","backgroundColor","primaryColor","onPrimaryColor","secondaryColor","onSecondaryColor","warningColor","onWarningColor","errorColor","onErrorColor","successColor","onSuccessColor","textPrimaryColor","textSecondaryColor","textHintColor","textDisabledColor"],"mappings":"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"}
@@ -183,5 +183,7 @@ $_linear-channel-values: (
183
183
  $light-contrast: _contrast($background-color, $light-color);
184
184
  $dark-contrast: _contrast($background-color, $dark-color);
185
185
 
186
- @return if($light-contrast > $dark-contrast, $light-color, $dark-color);
186
+ @return if(
187
+ sass($light-contrast > $dark-contrast): $light-color; else: $dark-color
188
+ );
187
189
  }
@@ -222,10 +222,10 @@ $dark-theme-background-color: #121212 !default;
222
222
  /// color depending on its elevation.
223
223
  ///
224
224
  /// @type Color
225
+ // prettier-ignore
225
226
  $dark-theme-surface-color: if(
226
- $disable-dark-elevation,
227
- colors.$grey-800,
228
- null
227
+ sass($disable-dark-elevation): colors.$grey-800;
228
+ else: null
229
229
  ) !default;
230
230
 
231
231
  /// The primary text color when using the dark theme.
@@ -250,7 +250,7 @@ $dark-theme-text-disabled-color: rgba($dark-theme-inverse-color, 0.38) !default;
250
250
  /// @param {Color} dark-color - The dark theme color
251
251
  /// @returns {Color} The correct color depending on the `$color-scheme`
252
252
  @function get-default-color($light-color, $dark-color) {
253
- @return if($color-scheme == dark, $dark-color, $light-color);
253
+ @return if(sass($color-scheme == dark): $dark-color; else: $light-color);
254
254
  }
255
255
 
256
256
  /// The default background color
@@ -519,7 +519,7 @@ $theme-variables: (
519
519
  /// @param {any} value - The value to maybe return
520
520
  /// @return {any} the `$value` if it was theme var, otherwise null
521
521
  @function theme-color-var-fallback($value) {
522
- @return if(is-theme-color-var($value), $value, null);
522
+ @return if(sass(is-theme-color-var($value)): $value; else: null);
523
523
  }
524
524
 
525
525
  /// @param {Number} z-value - The dark elevation value
@@ -777,11 +777,10 @@ $theme-variables: (
777
777
 
778
778
  @if not $current-color-index {
779
779
  @if not $fallback-color {
780
- $fallback: if(
781
- $fallback-name,
782
- "the '$#{$fallback-name}' variable",
783
- "a fallback color"
784
- );
780
+ $fallback: "a fallback color";
781
+ @if $fallback-name {
782
+ $fallback: "the '$#{$fallback-name}' variable";
783
+ }
785
784
 
786
785
  $error-msg: "Invalid material design color: '#{$color}'. If this was intentional because your app does " +
787
786
  "not use material design colors, set #{$fallback} instead to get a correct color for the provided swatch: " +
@@ -794,8 +793,13 @@ $theme-variables: (
794
793
  }
795
794
  }
796
795
 
796
+ // prettier-ignore
797
+ $current-suffixes: if(
798
+ sass(not $accent): colors.$primary-suffixes;
799
+ else: colors.$accent-suffixes
800
+ );
797
801
  $suffixes: utils.validate(
798
- if($accent, colors.$accent-suffixes, colors.$primary-suffixes),
802
+ $current-suffixes,
799
803
  $swatch,
800
804
  "material design color swatch"
801
805
  );
@@ -829,7 +833,7 @@ $theme-variables: (
829
833
  }
830
834
  }
831
835
 
832
- $color-name: "#{$current-color-name}#{if($accent, "-a", "")}-#{$swatch}";
836
+ $color-name: "#{$current-color-name}#{if(sass(not $accent): ""; else: "-a")}-#{$swatch}";
833
837
 
834
838
  @return map.get(colors.$color-map, $color-name);
835
839
  }
@@ -1,6 +1,6 @@
1
1
  import { backgroundColorVar, errorColorVar, onErrorColorVar, onPrimaryColorVar, onSecondaryColorVar, onSuccessColorVar, onWarningColorVar, primaryColorVar, secondaryColorVar, successColorVar, textDisabledColorVar, textHintColorVar, textPrimaryColorVar, textSecondaryColorVar, warningColorVar } from "./cssVars.js";
2
2
  /** @since 6.0.0 */ export const getDerivedTheme = (container = document.documentElement)=>{
3
- const rootStyles = window.getComputedStyle(container);
3
+ const rootStyles = globalThis.getComputedStyle(container);
4
4
  const backgroundColor = rootStyles.getPropertyValue(backgroundColorVar);
5
5
  const primaryColor = rootStyles.getPropertyValue(primaryColorVar);
6
6
  const onPrimaryColor = rootStyles.getPropertyValue(onPrimaryColorVar);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/theme/getDerivedTheme.ts"],"sourcesContent":["import {\n backgroundColorVar,\n errorColorVar,\n onErrorColorVar,\n onPrimaryColorVar,\n onSecondaryColorVar,\n onSuccessColorVar,\n onWarningColorVar,\n primaryColorVar,\n secondaryColorVar,\n successColorVar,\n textDisabledColorVar,\n textHintColorVar,\n textPrimaryColorVar,\n textSecondaryColorVar,\n warningColorVar,\n} from \"./cssVars.js\";\nimport { type ConfigurableThemeColors } from \"./types.js\";\n\n/** @since 6.0.0 */\nexport const getDerivedTheme = (\n container: Element = document.documentElement\n): Readonly<ConfigurableThemeColors> => {\n const rootStyles = window.getComputedStyle(container);\n const backgroundColor = rootStyles.getPropertyValue(backgroundColorVar);\n const primaryColor = rootStyles.getPropertyValue(primaryColorVar);\n const onPrimaryColor = rootStyles.getPropertyValue(onPrimaryColorVar);\n const secondaryColor = rootStyles.getPropertyValue(secondaryColorVar);\n const onSecondaryColor = rootStyles.getPropertyValue(onSecondaryColorVar);\n const warningColor = rootStyles.getPropertyValue(warningColorVar);\n const onWarningColor = rootStyles.getPropertyValue(onWarningColorVar);\n const errorColor = rootStyles.getPropertyValue(errorColorVar);\n const onErrorColor = rootStyles.getPropertyValue(onErrorColorVar);\n const successColor = rootStyles.getPropertyValue(successColorVar);\n const onSuccessColor = rootStyles.getPropertyValue(onSuccessColorVar);\n const textPrimaryColor = rootStyles.getPropertyValue(textPrimaryColorVar);\n const textSecondaryColor = rootStyles.getPropertyValue(textSecondaryColorVar);\n const textHintColor = rootStyles.getPropertyValue(textHintColorVar);\n const textDisabledColor = rootStyles.getPropertyValue(textDisabledColorVar);\n\n return {\n backgroundColor,\n primaryColor,\n onPrimaryColor,\n secondaryColor,\n onSecondaryColor,\n warningColor,\n onWarningColor,\n errorColor,\n onErrorColor,\n successColor,\n onSuccessColor,\n textPrimaryColor,\n textSecondaryColor,\n textHintColor,\n textDisabledColor,\n };\n};\n"],"names":["backgroundColorVar","errorColorVar","onErrorColorVar","onPrimaryColorVar","onSecondaryColorVar","onSuccessColorVar","onWarningColorVar","primaryColorVar","secondaryColorVar","successColorVar","textDisabledColorVar","textHintColorVar","textPrimaryColorVar","textSecondaryColorVar","warningColorVar","getDerivedTheme","container","document","documentElement","rootStyles","window","getComputedStyle","backgroundColor","getPropertyValue","primaryColor","onPrimaryColor","secondaryColor","onSecondaryColor","warningColor","onWarningColor","errorColor","onErrorColor","successColor","onSuccessColor","textPrimaryColor","textSecondaryColor","textHintColor","textDisabledColor"],"mappings":"AAAA,SACEA,kBAAkB,EAClBC,aAAa,EACbC,eAAe,EACfC,iBAAiB,EACjBC,mBAAmB,EACnBC,iBAAiB,EACjBC,iBAAiB,EACjBC,eAAe,EACfC,iBAAiB,EACjBC,eAAe,EACfC,oBAAoB,EACpBC,gBAAgB,EAChBC,mBAAmB,EACnBC,qBAAqB,EACrBC,eAAe,QACV,eAAe;AAGtB,iBAAiB,GACjB,OAAO,MAAMC,kBAAkB,CAC7BC,YAAqBC,SAASC,eAAe;IAE7C,MAAMC,aAAaC,OAAOC,gBAAgB,CAACL;IAC3C,MAAMM,kBAAkBH,WAAWI,gBAAgB,CAACvB;IACpD,MAAMwB,eAAeL,WAAWI,gBAAgB,CAAChB;IACjD,MAAMkB,iBAAiBN,WAAWI,gBAAgB,CAACpB;IACnD,MAAMuB,iBAAiBP,WAAWI,gBAAgB,CAACf;IACnD,MAAMmB,mBAAmBR,WAAWI,gBAAgB,CAACnB;IACrD,MAAMwB,eAAeT,WAAWI,gBAAgB,CAACT;IACjD,MAAMe,iBAAiBV,WAAWI,gBAAgB,CAACjB;IACnD,MAAMwB,aAAaX,WAAWI,gBAAgB,CAACtB;IAC/C,MAAM8B,eAAeZ,WAAWI,gBAAgB,CAACrB;IACjD,MAAM8B,eAAeb,WAAWI,gBAAgB,CAACd;IACjD,MAAMwB,iBAAiBd,WAAWI,gBAAgB,CAAClB;IACnD,MAAM6B,mBAAmBf,WAAWI,gBAAgB,CAACX;IACrD,MAAMuB,qBAAqBhB,WAAWI,gBAAgB,CAACV;IACvD,MAAMuB,gBAAgBjB,WAAWI,gBAAgB,CAACZ;IAClD,MAAM0B,oBAAoBlB,WAAWI,gBAAgB,CAACb;IAEtD,OAAO;QACLY;QACAE;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;IACF;AACF,EAAE"}
1
+ {"version":3,"sources":["../../src/theme/getDerivedTheme.ts"],"sourcesContent":["import {\n backgroundColorVar,\n errorColorVar,\n onErrorColorVar,\n onPrimaryColorVar,\n onSecondaryColorVar,\n onSuccessColorVar,\n onWarningColorVar,\n primaryColorVar,\n secondaryColorVar,\n successColorVar,\n textDisabledColorVar,\n textHintColorVar,\n textPrimaryColorVar,\n textSecondaryColorVar,\n warningColorVar,\n} from \"./cssVars.js\";\nimport { type ConfigurableThemeColors } from \"./types.js\";\n\n/** @since 6.0.0 */\nexport const getDerivedTheme = (\n container: Element = document.documentElement\n): Readonly<ConfigurableThemeColors> => {\n const rootStyles = globalThis.getComputedStyle(container);\n const backgroundColor = rootStyles.getPropertyValue(backgroundColorVar);\n const primaryColor = rootStyles.getPropertyValue(primaryColorVar);\n const onPrimaryColor = rootStyles.getPropertyValue(onPrimaryColorVar);\n const secondaryColor = rootStyles.getPropertyValue(secondaryColorVar);\n const onSecondaryColor = rootStyles.getPropertyValue(onSecondaryColorVar);\n const warningColor = rootStyles.getPropertyValue(warningColorVar);\n const onWarningColor = rootStyles.getPropertyValue(onWarningColorVar);\n const errorColor = rootStyles.getPropertyValue(errorColorVar);\n const onErrorColor = rootStyles.getPropertyValue(onErrorColorVar);\n const successColor = rootStyles.getPropertyValue(successColorVar);\n const onSuccessColor = rootStyles.getPropertyValue(onSuccessColorVar);\n const textPrimaryColor = rootStyles.getPropertyValue(textPrimaryColorVar);\n const textSecondaryColor = rootStyles.getPropertyValue(textSecondaryColorVar);\n const textHintColor = rootStyles.getPropertyValue(textHintColorVar);\n const textDisabledColor = rootStyles.getPropertyValue(textDisabledColorVar);\n\n return {\n backgroundColor,\n primaryColor,\n onPrimaryColor,\n secondaryColor,\n onSecondaryColor,\n warningColor,\n onWarningColor,\n errorColor,\n onErrorColor,\n successColor,\n onSuccessColor,\n textPrimaryColor,\n textSecondaryColor,\n textHintColor,\n textDisabledColor,\n };\n};\n"],"names":["backgroundColorVar","errorColorVar","onErrorColorVar","onPrimaryColorVar","onSecondaryColorVar","onSuccessColorVar","onWarningColorVar","primaryColorVar","secondaryColorVar","successColorVar","textDisabledColorVar","textHintColorVar","textPrimaryColorVar","textSecondaryColorVar","warningColorVar","getDerivedTheme","container","document","documentElement","rootStyles","globalThis","getComputedStyle","backgroundColor","getPropertyValue","primaryColor","onPrimaryColor","secondaryColor","onSecondaryColor","warningColor","onWarningColor","errorColor","onErrorColor","successColor","onSuccessColor","textPrimaryColor","textSecondaryColor","textHintColor","textDisabledColor"],"mappings":"AAAA,SACEA,kBAAkB,EAClBC,aAAa,EACbC,eAAe,EACfC,iBAAiB,EACjBC,mBAAmB,EACnBC,iBAAiB,EACjBC,iBAAiB,EACjBC,eAAe,EACfC,iBAAiB,EACjBC,eAAe,EACfC,oBAAoB,EACpBC,gBAAgB,EAChBC,mBAAmB,EACnBC,qBAAqB,EACrBC,eAAe,QACV,eAAe;AAGtB,iBAAiB,GACjB,OAAO,MAAMC,kBAAkB,CAC7BC,YAAqBC,SAASC,eAAe;IAE7C,MAAMC,aAAaC,WAAWC,gBAAgB,CAACL;IAC/C,MAAMM,kBAAkBH,WAAWI,gBAAgB,CAACvB;IACpD,MAAMwB,eAAeL,WAAWI,gBAAgB,CAAChB;IACjD,MAAMkB,iBAAiBN,WAAWI,gBAAgB,CAACpB;IACnD,MAAMuB,iBAAiBP,WAAWI,gBAAgB,CAACf;IACnD,MAAMmB,mBAAmBR,WAAWI,gBAAgB,CAACnB;IACrD,MAAMwB,eAAeT,WAAWI,gBAAgB,CAACT;IACjD,MAAMe,iBAAiBV,WAAWI,gBAAgB,CAACjB;IACnD,MAAMwB,aAAaX,WAAWI,gBAAgB,CAACtB;IAC/C,MAAM8B,eAAeZ,WAAWI,gBAAgB,CAACrB;IACjD,MAAM8B,eAAeb,WAAWI,gBAAgB,CAACd;IACjD,MAAMwB,iBAAiBd,WAAWI,gBAAgB,CAAClB;IACnD,MAAM6B,mBAAmBf,WAAWI,gBAAgB,CAACX;IACrD,MAAMuB,qBAAqBhB,WAAWI,gBAAgB,CAACV;IACvD,MAAMuB,gBAAgBjB,WAAWI,gBAAgB,CAACZ;IAClD,MAAM0B,oBAAoBlB,WAAWI,gBAAgB,CAACb;IAEtD,OAAO;QACLY;QACAE;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;IACF;AACF,EAAE"}
@@ -31,7 +31,7 @@ import { useEffect } from "react";
31
31
  * @since 6.0.0
32
32
  */ export function useCSSVariables(variables, rootNode) {
33
33
  useEffect(()=>{
34
- if (!variables.length) {
34
+ if (variables.length === 0) {
35
35
  return;
36
36
  }
37
37
  // use an iife so that hoisting doesn't cause a possible "null" issue for
@@ -49,7 +49,7 @@ import { useEffect } from "react";
49
49
  return;
50
50
  }
51
51
  // const root = document.documentElement;
52
- variables.forEach(({ name, value })=>{
52
+ for (const { name, value } of variables){
53
53
  if (process.env.NODE_ENV !== "production" && root.style.getPropertyValue(name)) {
54
54
  const currentValue = root.style.getPropertyValue(name);
55
55
  const overwritten = currentValue !== value ? ` and will be overwritten to "${value}"` : "";
@@ -57,11 +57,11 @@ import { useEffect } from "react";
57
57
  console.warn(`The "${name}" css variable has already been set to "${currentValue}" ` + `on the root element${overwritten}. There might be conflicting overrides.`);
58
58
  }
59
59
  root.style.setProperty(name, `${value}`);
60
- });
60
+ }
61
61
  return ()=>{
62
- variables.forEach(({ name })=>{
62
+ for (const { name } of variables){
63
63
  root.style.removeProperty(name);
64
- });
64
+ }
65
65
  };
66
66
  }, [
67
67
  variables,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/theme/useCSSVariables.ts"],"sourcesContent":["\"use client\";\n\nimport { type RefObject, useEffect } from \"react\";\n\nimport { type CSSVariableName, type ReadonlyCSSVariableList } from \"./types.js\";\n\n/**\n * @example Applying Variables the root html element\n * ```ts\n * import { purple500 } from \"@react-md/core/theme/colors\";\n * import { useCSSVariables } from \"@react-md/core/theme/useCSSVariables\";\n * import { contrastColor } from \"@react-md/core/theme/utils\";\n * import { useMemo } from \"react\";\n *\n * function Example(): null {\n * // Note: You should use `useMemo` so that the custom variables are not\n * // added and removed during each render.\n * useCSSVariables(useMemo(() => {\n * return [\n * {\n * name: \"--rmd-primary-color\",\n * value: purple500,\n * },\n * {\n * name: \"--rmd-on-primary-color\",\n * value: contrastColor(purple500),\n * },\n * ];\n * }, []));\n *\n * return null;\n * }\n * ```\n *\n * @since 6.0.0\n */\nexport function useCSSVariables<Name extends CSSVariableName>(\n variables: ReadonlyCSSVariableList<Name>,\n rootNode?: RefObject<HTMLElement> | HTMLElement\n): void {\n useEffect(() => {\n if (!variables.length) {\n return;\n }\n\n // use an iife so that hoisting doesn't cause a possible \"null\" issue for\n // the root\n const root = (() => {\n if (!rootNode) {\n return document.documentElement;\n }\n\n if (\"current\" in rootNode) {\n return rootNode.current;\n }\n\n return rootNode;\n })();\n\n if (!root) {\n return;\n }\n\n // const root = document.documentElement;\n variables.forEach(({ name, value }) => {\n if (\n process.env.NODE_ENV !== \"production\" &&\n root.style.getPropertyValue(name)\n ) {\n const currentValue = root.style.getPropertyValue(name);\n const overwritten =\n currentValue !== value\n ? ` and will be overwritten to \"${value}\"`\n : \"\";\n // eslint-disable-next-line no-console\n console.warn(\n `The \"${name}\" css variable has already been set to \"${currentValue}\" ` +\n `on the root element${overwritten}. There might be conflicting overrides.`\n );\n }\n\n root.style.setProperty(name, `${value}`);\n });\n return () => {\n variables.forEach(({ name }) => {\n root.style.removeProperty(name);\n });\n };\n }, [variables, rootNode]);\n}\n"],"names":["useEffect","useCSSVariables","variables","rootNode","length","root","document","documentElement","current","forEach","name","value","process","env","NODE_ENV","style","getPropertyValue","currentValue","overwritten","console","warn","setProperty","removeProperty"],"mappings":"AAAA;AAEA,SAAyBA,SAAS,QAAQ,QAAQ;AAIlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BC,GACD,OAAO,SAASC,gBACdC,SAAwC,EACxCC,QAA+C;IAE/CH,UAAU;QACR,IAAI,CAACE,UAAUE,MAAM,EAAE;YACrB;QACF;QAEA,yEAAyE;QACzE,WAAW;QACX,MAAMC,OAAO,AAAC,CAAA;YACZ,IAAI,CAACF,UAAU;gBACb,OAAOG,SAASC,eAAe;YACjC;YAEA,IAAI,aAAaJ,UAAU;gBACzB,OAAOA,SAASK,OAAO;YACzB;YAEA,OAAOL;QACT,CAAA;QAEA,IAAI,CAACE,MAAM;YACT;QACF;QAEA,yCAAyC;QACzCH,UAAUO,OAAO,CAAC,CAAC,EAAEC,IAAI,EAAEC,KAAK,EAAE;YAChC,IACEC,QAAQC,GAAG,CAACC,QAAQ,KAAK,gBACzBT,KAAKU,KAAK,CAACC,gBAAgB,CAACN,OAC5B;gBACA,MAAMO,eAAeZ,KAAKU,KAAK,CAACC,gBAAgB,CAACN;gBACjD,MAAMQ,cACJD,iBAAiBN,QACb,CAAC,6BAA6B,EAAEA,MAAM,CAAC,CAAC,GACxC;gBACN,sCAAsC;gBACtCQ,QAAQC,IAAI,CACV,CAAC,KAAK,EAAEV,KAAK,wCAAwC,EAAEO,aAAa,EAAE,CAAC,GACrE,CAAC,mBAAmB,EAAEC,YAAY,uCAAuC,CAAC;YAEhF;YAEAb,KAAKU,KAAK,CAACM,WAAW,CAACX,MAAM,GAAGC,OAAO;QACzC;QACA,OAAO;YACLT,UAAUO,OAAO,CAAC,CAAC,EAAEC,IAAI,EAAE;gBACzBL,KAAKU,KAAK,CAACO,cAAc,CAACZ;YAC5B;QACF;IACF,GAAG;QAACR;QAAWC;KAAS;AAC1B"}
1
+ {"version":3,"sources":["../../src/theme/useCSSVariables.ts"],"sourcesContent":["\"use client\";\n\nimport { type RefObject, useEffect } from \"react\";\n\nimport { type CSSVariableName, type ReadonlyCSSVariableList } from \"./types.js\";\n\n/**\n * @example Applying Variables the root html element\n * ```ts\n * import { purple500 } from \"@react-md/core/theme/colors\";\n * import { useCSSVariables } from \"@react-md/core/theme/useCSSVariables\";\n * import { contrastColor } from \"@react-md/core/theme/utils\";\n * import { useMemo } from \"react\";\n *\n * function Example(): null {\n * // Note: You should use `useMemo` so that the custom variables are not\n * // added and removed during each render.\n * useCSSVariables(useMemo(() => {\n * return [\n * {\n * name: \"--rmd-primary-color\",\n * value: purple500,\n * },\n * {\n * name: \"--rmd-on-primary-color\",\n * value: contrastColor(purple500),\n * },\n * ];\n * }, []));\n *\n * return null;\n * }\n * ```\n *\n * @since 6.0.0\n */\nexport function useCSSVariables<Name extends CSSVariableName>(\n variables: ReadonlyCSSVariableList<Name>,\n rootNode?: RefObject<HTMLElement> | HTMLElement\n): void {\n useEffect(() => {\n if (variables.length === 0) {\n return;\n }\n\n // use an iife so that hoisting doesn't cause a possible \"null\" issue for\n // the root\n const root = (() => {\n if (!rootNode) {\n return document.documentElement;\n }\n\n if (\"current\" in rootNode) {\n return rootNode.current;\n }\n\n return rootNode;\n })();\n\n if (!root) {\n return;\n }\n\n // const root = document.documentElement;\n for (const { name, value } of variables) {\n if (\n process.env.NODE_ENV !== \"production\" &&\n root.style.getPropertyValue(name)\n ) {\n const currentValue = root.style.getPropertyValue(name);\n const overwritten =\n currentValue !== value\n ? ` and will be overwritten to \"${value}\"`\n : \"\";\n // eslint-disable-next-line no-console\n console.warn(\n `The \"${name}\" css variable has already been set to \"${currentValue}\" ` +\n `on the root element${overwritten}. There might be conflicting overrides.`\n );\n }\n\n root.style.setProperty(name, `${value}`);\n }\n return () => {\n for (const { name } of variables) {\n root.style.removeProperty(name);\n }\n };\n }, [variables, rootNode]);\n}\n"],"names":["useEffect","useCSSVariables","variables","rootNode","length","root","document","documentElement","current","name","value","process","env","NODE_ENV","style","getPropertyValue","currentValue","overwritten","console","warn","setProperty","removeProperty"],"mappings":"AAAA;AAEA,SAAyBA,SAAS,QAAQ,QAAQ;AAIlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BC,GACD,OAAO,SAASC,gBACdC,SAAwC,EACxCC,QAA+C;IAE/CH,UAAU;QACR,IAAIE,UAAUE,MAAM,KAAK,GAAG;YAC1B;QACF;QAEA,yEAAyE;QACzE,WAAW;QACX,MAAMC,OAAO,AAAC,CAAA;YACZ,IAAI,CAACF,UAAU;gBACb,OAAOG,SAASC,eAAe;YACjC;YAEA,IAAI,aAAaJ,UAAU;gBACzB,OAAOA,SAASK,OAAO;YACzB;YAEA,OAAOL;QACT,CAAA;QAEA,IAAI,CAACE,MAAM;YACT;QACF;QAEA,yCAAyC;QACzC,KAAK,MAAM,EAAEI,IAAI,EAAEC,KAAK,EAAE,IAAIR,UAAW;YACvC,IACES,QAAQC,GAAG,CAACC,QAAQ,KAAK,gBACzBR,KAAKS,KAAK,CAACC,gBAAgB,CAACN,OAC5B;gBACA,MAAMO,eAAeX,KAAKS,KAAK,CAACC,gBAAgB,CAACN;gBACjD,MAAMQ,cACJD,iBAAiBN,QACb,CAAC,6BAA6B,EAAEA,MAAM,CAAC,CAAC,GACxC;gBACN,sCAAsC;gBACtCQ,QAAQC,IAAI,CACV,CAAC,KAAK,EAAEV,KAAK,wCAAwC,EAAEO,aAAa,EAAE,CAAC,GACrE,CAAC,mBAAmB,EAAEC,YAAY,uCAAuC,CAAC;YAEhF;YAEAZ,KAAKS,KAAK,CAACM,WAAW,CAACX,MAAM,GAAGC,OAAO;QACzC;QACA,OAAO;YACL,KAAK,MAAM,EAAED,IAAI,EAAE,IAAIP,UAAW;gBAChCG,KAAKS,KAAK,CAACO,cAAc,CAACZ;YAC5B;QACF;IACF,GAAG;QAACP;QAAWC;KAAS;AAC1B"}
@@ -39,9 +39,9 @@ import { useEffect } from "react";
39
39
  const meta = document.createElement("meta");
40
40
  meta.name = "color-scheme";
41
41
  meta.content = colorScheme;
42
- document.head.appendChild(meta);
42
+ document.head.append(meta);
43
43
  return ()=>{
44
- document.head.removeChild(meta);
44
+ meta.remove();
45
45
  };
46
46
  }, [
47
47
  disabled,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/theme/useColorSchemeMetaTag.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\n\nimport { type LightDarkColorScheme } from \"./types.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface ColorSchemeMetaTagOptions {\n /**\n * @defaultValue `\"false\"`\n */\n disabled?: boolean;\n colorScheme: LightDarkColorScheme;\n}\n\n/**\n * Adds a `<meta name=\"color-scheme\" content=\"light\">` or\n * `<meta name=\"color-scheme\" content=\"dark\">` into the head element. This\n * should not be used if you are using the `useColorSchemeProvider` since it is\n * already built in.\n *\n * @example\n * ```tsx\n * import { useColorScheme } from \"@react-md/core/theme/useColorScheme\";\n * import { useColorSchemeMetaTag } from \"@react-md/core/theme/useColorSchemeMetaTag\";\n *\n * function Example() {\n * const { currentColor } = useColorScheme();\n * useColorSchemeMetaTag({ colorScheme: currentColor });\n *\n * return null;\n * }\n * ```\n *\n * @since 6.0.0\n */\nexport function useColorSchemeMetaTag(\n options: ColorSchemeMetaTagOptions\n): void {\n const { disabled, colorScheme } = options;\n\n useEffect(() => {\n if (disabled || document.querySelector('meta[name=\"color-scheme\"]')) {\n return;\n }\n\n // Adding the meta tag allows the default browser styles for form inputs to\n // be updated as well.\n //\n // Chrome and Firefox:\n // - the input type=\"number\"'s spinner color will update from grey to white\n // - native `<select>` background color updates from grey/white to a dark color\n //\n // Chrome:\n // - the date/time/datetime icons will change from black to white\n // - the date/time/datetime pickers will use a darker theme instead of white\n const meta = document.createElement(\"meta\");\n meta.name = \"color-scheme\";\n meta.content = colorScheme;\n document.head.appendChild(meta);\n\n return () => {\n document.head.removeChild(meta);\n };\n }, [disabled, colorScheme]);\n}\n"],"names":["useEffect","useColorSchemeMetaTag","options","disabled","colorScheme","document","querySelector","meta","createElement","name","content","head","appendChild","removeChild"],"mappings":"AAAA;AAEA,SAASA,SAAS,QAAQ,QAAQ;AAelC;;;;;;;;;;;;;;;;;;;;CAoBC,GACD,OAAO,SAASC,sBACdC,OAAkC;IAElC,MAAM,EAAEC,QAAQ,EAAEC,WAAW,EAAE,GAAGF;IAElCF,UAAU;QACR,IAAIG,YAAYE,SAASC,aAAa,CAAC,8BAA8B;YACnE;QACF;QAEA,2EAA2E;QAC3E,sBAAsB;QACtB,EAAE;QACF,sBAAsB;QACtB,2EAA2E;QAC3E,+EAA+E;QAC/E,EAAE;QACF,UAAU;QACV,iEAAiE;QACjE,4EAA4E;QAC5E,MAAMC,OAAOF,SAASG,aAAa,CAAC;QACpCD,KAAKE,IAAI,GAAG;QACZF,KAAKG,OAAO,GAAGN;QACfC,SAASM,IAAI,CAACC,WAAW,CAACL;QAE1B,OAAO;YACLF,SAASM,IAAI,CAACE,WAAW,CAACN;QAC5B;IACF,GAAG;QAACJ;QAAUC;KAAY;AAC5B"}
1
+ {"version":3,"sources":["../../src/theme/useColorSchemeMetaTag.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\n\nimport { type LightDarkColorScheme } from \"./types.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface ColorSchemeMetaTagOptions {\n /**\n * @defaultValue `\"false\"`\n */\n disabled?: boolean;\n colorScheme: LightDarkColorScheme;\n}\n\n/**\n * Adds a `<meta name=\"color-scheme\" content=\"light\">` or\n * `<meta name=\"color-scheme\" content=\"dark\">` into the head element. This\n * should not be used if you are using the `useColorSchemeProvider` since it is\n * already built in.\n *\n * @example\n * ```tsx\n * import { useColorScheme } from \"@react-md/core/theme/useColorScheme\";\n * import { useColorSchemeMetaTag } from \"@react-md/core/theme/useColorSchemeMetaTag\";\n *\n * function Example() {\n * const { currentColor } = useColorScheme();\n * useColorSchemeMetaTag({ colorScheme: currentColor });\n *\n * return null;\n * }\n * ```\n *\n * @since 6.0.0\n */\nexport function useColorSchemeMetaTag(\n options: ColorSchemeMetaTagOptions\n): void {\n const { disabled, colorScheme } = options;\n\n useEffect(() => {\n if (disabled || document.querySelector('meta[name=\"color-scheme\"]')) {\n return;\n }\n\n // Adding the meta tag allows the default browser styles for form inputs to\n // be updated as well.\n //\n // Chrome and Firefox:\n // - the input type=\"number\"'s spinner color will update from grey to white\n // - native `<select>` background color updates from grey/white to a dark color\n //\n // Chrome:\n // - the date/time/datetime icons will change from black to white\n // - the date/time/datetime pickers will use a darker theme instead of white\n const meta = document.createElement(\"meta\");\n meta.name = \"color-scheme\";\n meta.content = colorScheme;\n document.head.append(meta);\n\n return () => {\n meta.remove();\n };\n }, [disabled, colorScheme]);\n}\n"],"names":["useEffect","useColorSchemeMetaTag","options","disabled","colorScheme","document","querySelector","meta","createElement","name","content","head","append","remove"],"mappings":"AAAA;AAEA,SAASA,SAAS,QAAQ,QAAQ;AAelC;;;;;;;;;;;;;;;;;;;;CAoBC,GACD,OAAO,SAASC,sBACdC,OAAkC;IAElC,MAAM,EAAEC,QAAQ,EAAEC,WAAW,EAAE,GAAGF;IAElCF,UAAU;QACR,IAAIG,YAAYE,SAASC,aAAa,CAAC,8BAA8B;YACnE;QACF;QAEA,2EAA2E;QAC3E,sBAAsB;QACtB,EAAE;QACF,sBAAsB;QACtB,2EAA2E;QAC3E,+EAA+E;QAC/E,EAAE;QACF,UAAU;QACV,iEAAiE;QACjE,4EAA4E;QAC5E,MAAMC,OAAOF,SAASG,aAAa,CAAC;QACpCD,KAAKE,IAAI,GAAG;QACZF,KAAKG,OAAO,GAAGN;QACfC,SAASM,IAAI,CAACC,MAAM,CAACL;QAErB,OAAO;YACLA,KAAKM,MAAM;QACb;IACF,GAAG;QAACV;QAAUC;KAAY;AAC5B"}
@@ -30,10 +30,11 @@ import { useMemo } from "react";
30
30
  * @since 6.0.0
31
31
  */ export function useInlineCSSVariables(variables) {
32
32
  return useMemo(()=>{
33
- return variables.reduce((style, { name, value })=>{
33
+ const style = {};
34
+ for (const { name, value } of variables){
34
35
  style[name] = value;
35
- return style;
36
- }, {});
36
+ }
37
+ return style;
37
38
  }, [
38
39
  variables
39
40
  ]);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/theme/useInlineCSSVariables.ts"],"sourcesContent":["import { type CSSProperties, useMemo } from \"react\";\n\nimport {\n type CSSVariableName,\n type CSSVariablesProperties,\n type ReadonlyCSSVariableList,\n} from \"./types.js\";\n\n/**\n * @example Applying variables through inline styles\n * ```tsx\n * import { purple500 } from \"@react-md/core/theme/colors\";\n * import { type ReadonlyCSSVariableList } from \"@react-md/core/theme/types\";\n * import { useInlineCSSVariables } from \"@react-md/core/theme/useInlineCSSVariables\";\n * import { contrastColor } from \"@react-md/core/theme/utils\";\n * import { type ReactElement, type ReactNode, useMemo } from \"react\";\n *\n * function Example({ children }: { children: ReactNode }): ReactElement {\n * const customVariables = useMemo<ReadonlyCSSVariableList>(() => {\n * return [\n * {\n * name: \"--rmd-primary-color\",\n * value: purple500,\n * },\n * {\n * name: \"--rmd-on-primary-color\",\n * value: contrastColor(purple500),\n * },\n * ];\n * }, []);\n * const style = useInlineCSSVariables(customVariables);\n *\n * return <div style={style}>{children}</div>;\n * }\n * ```\n *\n * @since 6.0.0\n */\nexport function useInlineCSSVariables<Name extends CSSVariableName>(\n variables: ReadonlyCSSVariableList<Name>\n): CSSProperties {\n return useMemo(() => {\n return variables.reduce<CSSVariablesProperties<Name>>(\n (style, { name, value }) => {\n style[name] = value;\n return style;\n },\n {}\n );\n }, [variables]);\n}\n"],"names":["useMemo","useInlineCSSVariables","variables","reduce","style","name","value"],"mappings":"AAAA,SAA6BA,OAAO,QAAQ,QAAQ;AAQpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BC,GACD,OAAO,SAASC,sBACdC,SAAwC;IAExC,OAAOF,QAAQ;QACb,OAAOE,UAAUC,MAAM,CACrB,CAACC,OAAO,EAAEC,IAAI,EAAEC,KAAK,EAAE;YACrBF,KAAK,CAACC,KAAK,GAAGC;YACd,OAAOF;QACT,GACA,CAAC;IAEL,GAAG;QAACF;KAAU;AAChB"}
1
+ {"version":3,"sources":["../../src/theme/useInlineCSSVariables.ts"],"sourcesContent":["import { type CSSProperties, useMemo } from \"react\";\n\nimport {\n type CSSVariableName,\n type CSSVariablesProperties,\n type ReadonlyCSSVariableList,\n} from \"./types.js\";\n\n/**\n * @example Applying variables through inline styles\n * ```tsx\n * import { purple500 } from \"@react-md/core/theme/colors\";\n * import { type ReadonlyCSSVariableList } from \"@react-md/core/theme/types\";\n * import { useInlineCSSVariables } from \"@react-md/core/theme/useInlineCSSVariables\";\n * import { contrastColor } from \"@react-md/core/theme/utils\";\n * import { type ReactElement, type ReactNode, useMemo } from \"react\";\n *\n * function Example({ children }: { children: ReactNode }): ReactElement {\n * const customVariables = useMemo<ReadonlyCSSVariableList>(() => {\n * return [\n * {\n * name: \"--rmd-primary-color\",\n * value: purple500,\n * },\n * {\n * name: \"--rmd-on-primary-color\",\n * value: contrastColor(purple500),\n * },\n * ];\n * }, []);\n * const style = useInlineCSSVariables(customVariables);\n *\n * return <div style={style}>{children}</div>;\n * }\n * ```\n *\n * @since 6.0.0\n */\nexport function useInlineCSSVariables<Name extends CSSVariableName>(\n variables: ReadonlyCSSVariableList<Name>\n): CSSProperties {\n return useMemo(() => {\n const style: CSSVariablesProperties<Name> = {};\n for (const { name, value } of variables) {\n style[name] = value;\n }\n\n return style;\n }, [variables]);\n}\n"],"names":["useMemo","useInlineCSSVariables","variables","style","name","value"],"mappings":"AAAA,SAA6BA,OAAO,QAAQ,QAAQ;AAQpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BC,GACD,OAAO,SAASC,sBACdC,SAAwC;IAExC,OAAOF,QAAQ;QACb,MAAMG,QAAsC,CAAC;QAC7C,KAAK,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAE,IAAIH,UAAW;YACvCC,KAAK,CAACC,KAAK,GAAGC;QAChB;QAEA,OAAOF;IACT,GAAG;QAACD;KAAU;AAChB"}
@@ -14,9 +14,9 @@ const VERBOSE_REGEX = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i;
14
14
  }
15
15
  hex = hex.replace(SHORTHAND_REGEX, (_m, r, g, b)=>`${r}${r}${g}${g}${b}${b}`);
16
16
  const result = hex.match(VERBOSE_REGEX) || [];
17
- const r = parseInt(result[1] || "", 16) || 0;
18
- const g = parseInt(result[2] || "", 16) || 0;
19
- const b = parseInt(result[3] || "", 16) || 0;
17
+ const r = Number.parseInt(result[1] || "", 16) || 0;
18
+ const g = Number.parseInt(result[2] || "", 16) || 0;
19
+ const b = Number.parseInt(result[3] || "", 16) || 0;
20
20
  return [
21
21
  r,
22
22
  g,
@@ -26,12 +26,12 @@ const VERBOSE_REGEX = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i;
26
26
  export function getRGB(color) {
27
27
  // chrome 102.0.50005.63 apparently has whitespace when calling `window.getComputedStyle(element)`
28
28
  // remove whitespace to make it easy for supporting rgb or hex
29
- color = color.replace(/\s/g, "");
29
+ color = color.replaceAll(/\s/g, "");
30
30
  const rgbMatches = color.match(RGB_REGEX);
31
31
  if (rgbMatches) {
32
- const r = parseInt(rgbMatches[1] || "", 16) || 0;
33
- const g = parseInt(rgbMatches[2] || "", 16) || 0;
34
- const b = parseInt(rgbMatches[3] || "", 16) || 0;
32
+ const r = Number.parseInt(rgbMatches[1] || "", 16) || 0;
33
+ const g = Number.parseInt(rgbMatches[2] || "", 16) || 0;
34
+ const b = Number.parseInt(rgbMatches[3] || "", 16) || 0;
35
35
  return [
36
36
  r,
37
37
  g,
@@ -51,7 +51,7 @@ const BLUE_MULTIPLIER = 0.0722;
51
51
  * @internal
52
52
  */ function get8BitColor(color) {
53
53
  color /= 255;
54
- if (color <= 0.03928) {
54
+ if (color <= 0.039_28) {
55
55
  return color / 12.92;
56
56
  }
57
57
  return ((color + 0.055) / 1.055) ** 2.4;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/theme/utils.ts"],"sourcesContent":["/* eslint-disable no-param-reassign */\nimport { black, white } from \"./colors.js\";\n\nconst RGB_REGEX = /^rgb\\(((\\b([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\b),?){3}\\)$/;\nconst SHORTHAND_REGEX = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\nconst VERBOSE_REGEX = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i;\n\nexport type RGB = readonly [red: number, green: number, blue: number];\n\n/**\n * Converts a hex string into an rgb value. This is useful for detecting color\n * contrast ratios and other stuff.\n *\n * @param hex - The hex string to convert\n * @returns an object containing the r, g, b values for the color.\n */\nexport function hexToRGB(hex: string): RGB {\n if (\n process.env.NODE_ENV !== \"production\" &&\n !SHORTHAND_REGEX.test(hex) &&\n !VERBOSE_REGEX.test(hex)\n ) {\n throw new TypeError(\"Invalid color string.\");\n }\n\n hex = hex.replace(\n SHORTHAND_REGEX,\n (_m, r, g, b) => `${r}${r}${g}${g}${b}${b}`\n );\n\n const result = hex.match(VERBOSE_REGEX) || [];\n const r = parseInt(result[1] || \"\", 16) || 0;\n const g = parseInt(result[2] || \"\", 16) || 0;\n const b = parseInt(result[3] || \"\", 16) || 0;\n\n return [r, g, b];\n}\n\nexport function getRGB(color: string): RGB {\n // chrome 102.0.50005.63 apparently has whitespace when calling `window.getComputedStyle(element)`\n // remove whitespace to make it easy for supporting rgb or hex\n color = color.replace(/\\s/g, \"\");\n const rgbMatches = color.match(RGB_REGEX);\n if (rgbMatches) {\n const r = parseInt(rgbMatches[1] || \"\", 16) || 0;\n const g = parseInt(rgbMatches[2] || \"\", 16) || 0;\n const b = parseInt(rgbMatches[3] || \"\", 16) || 0;\n\n return [r, g, b];\n }\n\n return hexToRGB(color);\n}\n\nconst RED_MULTIPLIER = 0.2126;\nconst GREEN_MULTIPLIER = 0.7152;\nconst BLUE_MULTIPLIER = 0.0722;\n\n/**\n * I really couldn't figure out how to name these \"magic\" numbers since the\n * formula doesn't really describe it much:\n *\n * @see https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n * @internal\n */\nfunction get8BitColor(color: number): number {\n color /= 255;\n\n if (color <= 0.03928) {\n return color / 12.92;\n }\n\n return ((color + 0.055) / 1.055) ** 2.4;\n}\n\n/**\n * A number closest to 0 should be closest to black while a number closest to 1\n * should be closest to white.\n *\n * @see https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n * @internal\n */\nexport function getLuminance(color: string): number {\n const [r, g, b] = getRGB(color);\n\n const red = get8BitColor(r) * RED_MULTIPLIER;\n const green = get8BitColor(g) * GREEN_MULTIPLIER;\n const blue = get8BitColor(b) * BLUE_MULTIPLIER;\n\n return red + green + blue;\n}\n\n/**\n * Gets the contrast ratio between a background color and a foreground color.\n *\n * @see https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n *\n * @param background - The background color\n * @param foreground - The foreground color. This is normally the `color` css\n * value.\n * @returns the contrast ratio between the background and foreground colors.\n */\nexport function getContrastRatio(\n background: string,\n foreground: string\n): number {\n const backgroundLuminance = getLuminance(background) + 0.05;\n const foregroundLuminance = getLuminance(foreground) + 0.05;\n\n return (\n Math.max(backgroundLuminance, foregroundLuminance) /\n Math.min(backgroundLuminance, foregroundLuminance)\n );\n}\n\n/**\n * The type of contrast ratio compliance to confirm to. The ratios in order are:\n * - 3:1 for large text (18pt normal or 14pt bold)\n * - 4.5:1 for normal text\n * - 7:1 for Level AAA requirements.\n *\n * @see https://www.w3.org/TR/WCAG20/#visual-audio-contrast\n * @see https://www.w3.org/TR/WCAG20/#larger-scaledef\n */\nexport type ContrastRatioCompliance = \"large\" | \"normal\" | \"AAA\";\n\n/**\n * The contrast ratio that can be used for large text where large text is\n * considered 18pt or 14pt bold.\n */\nexport const LARGE_TEXT_CONTRAST_RATIO = 3;\n\n/**\n * The contrast ratio that can be used for normal text.\n */\nexport const NORMAL_TEXT_CONTRAST_RATIO = 4.5;\n\n/**\n * The AAA contrast ratio for passing WGAC 2.0 color contrast ratios.\n */\nexport const AAA_CONTRAST_RATIO = 7;\n\n/**\n * Checks if there is an acceptable contrast ratio between the background and\n * foreground colors based on the provided compliance level.\n *\n * @param background - The background color to check against\n * @param foreground - The foreground color to check against\n * @param compliance - The compliance level to use or a custom number as a\n * ratio.\n * @returns true if there is enough contrast between the foreground and\n * background colors for the provided compliance level.\n */\nexport function isContrastCompliant(\n background: string,\n foreground: string,\n compliance: ContrastRatioCompliance | number = \"normal\"\n): boolean {\n let ratio: number;\n switch (compliance) {\n case \"large\":\n ratio = LARGE_TEXT_CONTRAST_RATIO;\n break;\n case \"normal\":\n ratio = NORMAL_TEXT_CONTRAST_RATIO;\n break;\n case \"AAA\":\n ratio = AAA_CONTRAST_RATIO;\n break;\n default:\n ratio = compliance;\n }\n\n return getContrastRatio(background, foreground) >= ratio;\n}\n\n/**\n * Returns the highest contrast color to the provided `backgroundColor`. This is\n * normally used to ensure that a new background color can use an accessible text\n * color of either `#000` or `#fff`.\n *\n * This is pretty much a javascript implementation as the `contrast-color` Sass\n * function.\n *\n * @since 6.0.0\n */\nexport function contrastColor(\n backgroundColor: string,\n lightColor = white,\n darkColor = black\n): string {\n const lightContrast = getContrastRatio(backgroundColor, lightColor);\n const darkContrast = getContrastRatio(backgroundColor, darkColor);\n\n return lightContrast > darkContrast ? lightColor : darkColor;\n}\n"],"names":["black","white","RGB_REGEX","SHORTHAND_REGEX","VERBOSE_REGEX","hexToRGB","hex","process","env","NODE_ENV","test","TypeError","replace","_m","r","g","b","result","match","parseInt","getRGB","color","rgbMatches","RED_MULTIPLIER","GREEN_MULTIPLIER","BLUE_MULTIPLIER","get8BitColor","getLuminance","red","green","blue","getContrastRatio","background","foreground","backgroundLuminance","foregroundLuminance","Math","max","min","LARGE_TEXT_CONTRAST_RATIO","NORMAL_TEXT_CONTRAST_RATIO","AAA_CONTRAST_RATIO","isContrastCompliant","compliance","ratio","contrastColor","backgroundColor","lightColor","darkColor","lightContrast","darkContrast"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/theme/utils.ts"],"sourcesContent":["/* eslint-disable no-param-reassign */\nimport { black, white } from \"./colors.js\";\n\nconst RGB_REGEX = /^rgb\\(((\\b([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\b),?){3}\\)$/;\nconst SHORTHAND_REGEX = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\nconst VERBOSE_REGEX = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i;\n\nexport type RGB = readonly [red: number, green: number, blue: number];\n\n/**\n * Converts a hex string into an rgb value. This is useful for detecting color\n * contrast ratios and other stuff.\n *\n * @param hex - The hex string to convert\n * @returns an object containing the r, g, b values for the color.\n */\nexport function hexToRGB(hex: string): RGB {\n if (\n process.env.NODE_ENV !== \"production\" &&\n !SHORTHAND_REGEX.test(hex) &&\n !VERBOSE_REGEX.test(hex)\n ) {\n throw new TypeError(\"Invalid color string.\");\n }\n\n hex = hex.replace(\n SHORTHAND_REGEX,\n (_m, r, g, b) => `${r}${r}${g}${g}${b}${b}`\n );\n\n const result = hex.match(VERBOSE_REGEX) || [];\n const r = Number.parseInt(result[1] || \"\", 16) || 0;\n const g = Number.parseInt(result[2] || \"\", 16) || 0;\n const b = Number.parseInt(result[3] || \"\", 16) || 0;\n\n return [r, g, b];\n}\n\nexport function getRGB(color: string): RGB {\n // chrome 102.0.50005.63 apparently has whitespace when calling `window.getComputedStyle(element)`\n // remove whitespace to make it easy for supporting rgb or hex\n color = color.replaceAll(/\\s/g, \"\");\n const rgbMatches = color.match(RGB_REGEX);\n if (rgbMatches) {\n const r = Number.parseInt(rgbMatches[1] || \"\", 16) || 0;\n const g = Number.parseInt(rgbMatches[2] || \"\", 16) || 0;\n const b = Number.parseInt(rgbMatches[3] || \"\", 16) || 0;\n\n return [r, g, b];\n }\n\n return hexToRGB(color);\n}\n\nconst RED_MULTIPLIER = 0.2126;\nconst GREEN_MULTIPLIER = 0.7152;\nconst BLUE_MULTIPLIER = 0.0722;\n\n/**\n * I really couldn't figure out how to name these \"magic\" numbers since the\n * formula doesn't really describe it much:\n *\n * @see https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n * @internal\n */\nfunction get8BitColor(color: number): number {\n color /= 255;\n\n if (color <= 0.039_28) {\n return color / 12.92;\n }\n\n return ((color + 0.055) / 1.055) ** 2.4;\n}\n\n/**\n * A number closest to 0 should be closest to black while a number closest to 1\n * should be closest to white.\n *\n * @see https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n * @internal\n */\nexport function getLuminance(color: string): number {\n const [r, g, b] = getRGB(color);\n\n const red = get8BitColor(r) * RED_MULTIPLIER;\n const green = get8BitColor(g) * GREEN_MULTIPLIER;\n const blue = get8BitColor(b) * BLUE_MULTIPLIER;\n\n return red + green + blue;\n}\n\n/**\n * Gets the contrast ratio between a background color and a foreground color.\n *\n * @see https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n *\n * @param background - The background color\n * @param foreground - The foreground color. This is normally the `color` css\n * value.\n * @returns the contrast ratio between the background and foreground colors.\n */\nexport function getContrastRatio(\n background: string,\n foreground: string\n): number {\n const backgroundLuminance = getLuminance(background) + 0.05;\n const foregroundLuminance = getLuminance(foreground) + 0.05;\n\n return (\n Math.max(backgroundLuminance, foregroundLuminance) /\n Math.min(backgroundLuminance, foregroundLuminance)\n );\n}\n\n/**\n * The type of contrast ratio compliance to confirm to. The ratios in order are:\n * - 3:1 for large text (18pt normal or 14pt bold)\n * - 4.5:1 for normal text\n * - 7:1 for Level AAA requirements.\n *\n * @see https://www.w3.org/TR/WCAG20/#visual-audio-contrast\n * @see https://www.w3.org/TR/WCAG20/#larger-scaledef\n */\nexport type ContrastRatioCompliance = \"large\" | \"normal\" | \"AAA\";\n\n/**\n * The contrast ratio that can be used for large text where large text is\n * considered 18pt or 14pt bold.\n */\nexport const LARGE_TEXT_CONTRAST_RATIO = 3;\n\n/**\n * The contrast ratio that can be used for normal text.\n */\nexport const NORMAL_TEXT_CONTRAST_RATIO = 4.5;\n\n/**\n * The AAA contrast ratio for passing WGAC 2.0 color contrast ratios.\n */\nexport const AAA_CONTRAST_RATIO = 7;\n\n/**\n * Checks if there is an acceptable contrast ratio between the background and\n * foreground colors based on the provided compliance level.\n *\n * @param background - The background color to check against\n * @param foreground - The foreground color to check against\n * @param compliance - The compliance level to use or a custom number as a\n * ratio.\n * @returns true if there is enough contrast between the foreground and\n * background colors for the provided compliance level.\n */\nexport function isContrastCompliant(\n background: string,\n foreground: string,\n compliance: ContrastRatioCompliance | number = \"normal\"\n): boolean {\n let ratio: number;\n switch (compliance) {\n case \"large\":\n ratio = LARGE_TEXT_CONTRAST_RATIO;\n break;\n case \"normal\":\n ratio = NORMAL_TEXT_CONTRAST_RATIO;\n break;\n case \"AAA\":\n ratio = AAA_CONTRAST_RATIO;\n break;\n default:\n ratio = compliance;\n }\n\n return getContrastRatio(background, foreground) >= ratio;\n}\n\n/**\n * Returns the highest contrast color to the provided `backgroundColor`. This is\n * normally used to ensure that a new background color can use an accessible text\n * color of either `#000` or `#fff`.\n *\n * This is pretty much a javascript implementation as the `contrast-color` Sass\n * function.\n *\n * @since 6.0.0\n */\nexport function contrastColor(\n backgroundColor: string,\n lightColor = white,\n darkColor = black\n): string {\n const lightContrast = getContrastRatio(backgroundColor, lightColor);\n const darkContrast = getContrastRatio(backgroundColor, darkColor);\n\n return lightContrast > darkContrast ? lightColor : darkColor;\n}\n"],"names":["black","white","RGB_REGEX","SHORTHAND_REGEX","VERBOSE_REGEX","hexToRGB","hex","process","env","NODE_ENV","test","TypeError","replace","_m","r","g","b","result","match","Number","parseInt","getRGB","color","replaceAll","rgbMatches","RED_MULTIPLIER","GREEN_MULTIPLIER","BLUE_MULTIPLIER","get8BitColor","getLuminance","red","green","blue","getContrastRatio","background","foreground","backgroundLuminance","foregroundLuminance","Math","max","min","LARGE_TEXT_CONTRAST_RATIO","NORMAL_TEXT_CONTRAST_RATIO","AAA_CONTRAST_RATIO","isContrastCompliant","compliance","ratio","contrastColor","backgroundColor","lightColor","darkColor","lightContrast","darkContrast"],"mappings":"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"}
@@ -136,7 +136,7 @@ const noop = ()=>{
136
136
  let tooltipSpacing = dense ? denseSpacing : spacing;
137
137
  const tooltip = tooltipRef.current;
138
138
  if (!disableAutoSpacing && tooltip) {
139
- tooltipSpacing = window.getComputedStyle(tooltip).getPropertyValue(TOOLTIP_SPACING_VAR) || spacing;
139
+ tooltipSpacing = globalThis.getComputedStyle(tooltip).getPropertyValue(TOOLTIP_SPACING_VAR) || spacing;
140
140
  }
141
141
  const currentSpacing = parseCssLengthUnit({
142
142
  value: tooltipSpacing
@@ -184,13 +184,13 @@ const noop = ()=>{
184
184
  hideTooltip();
185
185
  }
186
186
  };
187
- window.addEventListener("keydown", handleKeyDown);
187
+ globalThis.addEventListener("keydown", handleKeyDown);
188
188
  window.addEventListener("scroll", hideTooltip, true);
189
- window.addEventListener("touchend", hideTooltip, true);
189
+ globalThis.addEventListener("touchend", hideTooltip, true);
190
190
  return ()=>{
191
- window.removeEventListener("keydown", handleKeyDown);
191
+ globalThis.removeEventListener("keydown", handleKeyDown);
192
192
  window.removeEventListener("scroll", hideTooltip, true);
193
- window.removeEventListener("touchend", hideTooltip, true);
193
+ globalThis.removeEventListener("touchend", hideTooltip, true);
194
194
  };
195
195
  }, [
196
196
  hideTooltip,
@@ -203,7 +203,7 @@ const noop = ()=>{
203
203
  onDisabledCleanup: hideTooltip,
204
204
  onChange (active) {
205
205
  if (active) {
206
- refocusFrame.current = window.requestAnimationFrame(()=>{
206
+ refocusFrame.current = globalThis.requestAnimationFrame(()=>{
207
207
  pageInactive.current = false;
208
208
  });
209
209
  return;
@@ -304,7 +304,7 @@ const noop = ()=>{
304
304
  return;
305
305
  }
306
306
  event.preventDefault();
307
- const selection = window.getSelection();
307
+ const selection = globalThis.getSelection();
308
308
  const node = selection?.anchorNode?.parentElement;
309
309
  if (node && event.currentTarget.contains(node)) {
310
310
  selection.empty();