@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/tabs/useTabList.ts"],"sourcesContent":["\"use client\";\n\nimport type {\n CSSProperties,\n FocusEventHandler,\n KeyboardEventHandler,\n MouseEventHandler,\n Ref,\n RefObject,\n} from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useAppSize } from \"../media-queries/AppSizeProvider.js\";\nimport type {\n KeyboardMovementContext,\n KeyboardMovementProps,\n} from \"../movement/types.js\";\nimport { useKeyboardMovementProvider } from \"../movement/useKeyboardMovementProvider.js\";\nimport { useDir } from \"../typography/WritingDirectionProvider.js\";\nimport { useEnsuredRef } from \"../useEnsuredRef.js\";\nimport { useResizeObserver } from \"../useResizeObserver.js\";\nimport {\n type TabListActivationMode,\n type TabListScrollButtonsBehavior,\n} from \"./types.js\";\nimport { getTabRoleOnly, scrollTabIntoView } from \"./utils.js\";\n\nconst TAB_SIZE_VAR = \"--rmd-tab-size\";\nconst TAB_OFFSET_VAR = \"--rmd-tab-offset\";\n\nconst noop = (): void => {\n // do nothing\n};\n\nexport type TabWidthVar = typeof TAB_SIZE_VAR;\nexport type TabOffsetVar = typeof TAB_OFFSET_VAR;\n\nexport type IndicatorCSSProperties = CSSProperties &\n Record<TabWidthVar | TabOffsetVar, string>;\n\nexport interface TabListHookOptions {\n ref: Ref<HTMLDivElement> | undefined;\n style: CSSProperties | undefined;\n activeIndex: number;\n setActiveIndex: (nextActiveIndex: number) => void;\n scrollButtons: TabListScrollButtonsBehavior;\n activationMode: TabListActivationMode;\n vertical: boolean;\n onClick: MouseEventHandler<HTMLDivElement> | undefined;\n onFocus: FocusEventHandler<HTMLDivElement> | undefined;\n onKeyDown: KeyboardEventHandler<HTMLDivElement> | undefined;\n disableTransition: boolean;\n}\n\nexport interface TabListHookReturnValue {\n elementProps: KeyboardMovementProps<HTMLDivElement> & {\n \"aria-orientation\": \"horizontal\" | \"vertical\";\n style: CSSProperties;\n ref: Ref<HTMLDivElement>;\n onClick: MouseEventHandler<HTMLDivElement>;\n };\n movementContext: KeyboardMovementContext;\n backwardProps: {\n ref: RefObject<HTMLDivElement>;\n type: \"back\";\n vertical: boolean;\n disableTransition?: boolean;\n };\n forwardProps: {\n ref: RefObject<HTMLDivElement>;\n type: \"forward\";\n vertical: boolean;\n disableTransition?: boolean;\n };\n showScrollButtons: boolean;\n}\n\n/**\n * @internal\n */\nexport function useTabList(\n options: TabListHookOptions\n): TabListHookReturnValue {\n const {\n ref: propRef,\n style,\n activeIndex,\n scrollButtons,\n onClick = noop,\n onFocus,\n onKeyDown,\n activationMode,\n vertical,\n setActiveIndex,\n disableTransition,\n } = options;\n\n const isRTL = useDir().dir === \"rtl\";\n const { isPhone } = useAppSize();\n const isScrollObserverEnabled =\n scrollButtons === \"auto\" ||\n (scrollButtons === \"auto-tablet-or-above\" && !isPhone);\n const [autoScrollButtons, setAutoScrollButtons] = useState(false);\n const showScrollButtons =\n scrollButtons === true ||\n (scrollButtons === \"tablet-or-above\" && !isPhone) ||\n (isScrollObserverEnabled && autoScrollButtons);\n\n const [indicatorStyles, setIndicatorStyles] =\n useState<IndicatorCSSProperties>(() => {\n const tabWidth = `${100 / 3}%`;\n return {\n [TAB_SIZE_VAR]: tabWidth,\n [TAB_OFFSET_VAR]: \"0px\",\n };\n });\n\n const [nodeRef, ref] = useEnsuredRef(propRef);\n const tabListRef = useResizeObserver({\n ref,\n disabled: disableTransition && !isScrollObserverEnabled,\n disableHeight: disableTransition && !isScrollObserverEnabled && !vertical,\n disableWidth: disableTransition && !isScrollObserverEnabled && vertical,\n onUpdate: useCallback(\n (entry) => {\n // this is kind of hacky -- the styles should update when switching\n // between RTL or when the scroll buttons appear, but they aren't\n // required for any styles. Just reference them so that the hooks\n // eslint rule doesn't show a warning...\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n isRTL;\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n showScrollButtons;\n\n if (isScrollObserverEnabled && nodeRef.current) {\n setAutoScrollButtons(\n nodeRef.current.scrollWidth > nodeRef.current.offsetWidth\n );\n }\n\n const activeTab = getTabRoleOnly(entry.target)[activeIndex];\n if (!activeTab || disableTransition) {\n return;\n }\n\n const size = vertical ? activeTab.offsetHeight : activeTab.offsetWidth;\n const offset = vertical ? activeTab.offsetTop : activeTab.offsetLeft;\n const cssVars: IndicatorCSSProperties = {\n [TAB_SIZE_VAR]: `${size}px`,\n [TAB_OFFSET_VAR]: `${offset}px`,\n };\n\n setIndicatorStyles((prevStyles) => {\n if (\n prevStyles &&\n prevStyles[TAB_SIZE_VAR] === cssVars[TAB_SIZE_VAR] &&\n prevStyles[TAB_OFFSET_VAR] === cssVars[TAB_OFFSET_VAR]\n ) {\n return prevStyles;\n }\n\n return cssVars;\n });\n },\n [\n activeIndex,\n disableTransition,\n isRTL,\n isScrollObserverEnabled,\n nodeRef,\n showScrollButtons,\n vertical,\n ]\n ),\n });\n const forwardRef = useRef<HTMLDivElement>(null);\n const backwardRef = useRef<HTMLDivElement>(null);\n const { movementProps, movementContext } = useKeyboardMovementProvider({\n ref: tabListRef,\n onClick(event) {\n onClick(event);\n if (event.isPropagationStopped() || !(event.target instanceof Element)) {\n return;\n }\n\n const clickedTab = event.target.closest(\"[role='tab']\");\n const tabs = getTabRoleOnly(event.currentTarget);\n const i = tabs.findIndex((tab) => tab === clickedTab);\n if (i !== -1) {\n setActiveIndex(i);\n }\n },\n onFocus,\n onKeyDown,\n onFocusChange(event) {\n const { index } = event;\n if (activationMode === \"automatic\") {\n setActiveIndex(index);\n } else if (scrollButtons) {\n scrollTabIntoView({\n activeIndex: index,\n backward: backwardRef.current,\n container: nodeRef.current,\n forward: forwardRef.current,\n vertical,\n });\n }\n },\n loopable: true,\n searchable: true,\n horizontal: !vertical,\n includeDisabled: true,\n tabIndexBehavior: \"roving\",\n getFocusableElements: getTabRoleOnly,\n });\n\n useEffect(() => {\n scrollTabIntoView({\n activeIndex,\n backward: backwardRef.current,\n container: nodeRef.current,\n forward: forwardRef.current,\n vertical,\n });\n }, [activeIndex, nodeRef, vertical]);\n\n return {\n elementProps: {\n \"aria-orientation\": vertical ? \"vertical\" : \"horizontal\",\n style: {\n ...style,\n ...(disableTransition ? undefined : indicatorStyles),\n },\n ...movementProps,\n },\n backwardProps: {\n ref: backwardRef,\n type: \"back\",\n vertical,\n disableTransition,\n },\n forwardProps: {\n ref: forwardRef,\n type: \"forward\",\n vertical,\n disableTransition,\n },\n movementContext,\n showScrollButtons,\n };\n}\n"],"names":["useCallback","useEffect","useRef","useState","useAppSize","useKeyboardMovementProvider","useDir","useEnsuredRef","useResizeObserver","getTabRoleOnly","scrollTabIntoView","TAB_SIZE_VAR","TAB_OFFSET_VAR","noop","useTabList","options","ref","propRef","style","activeIndex","scrollButtons","onClick","onFocus","onKeyDown","activationMode","vertical","setActiveIndex","disableTransition","isRTL","dir","isPhone","isScrollObserverEnabled","autoScrollButtons","setAutoScrollButtons","showScrollButtons","indicatorStyles","setIndicatorStyles","tabWidth","nodeRef","tabListRef","disabled","disableHeight","disableWidth","onUpdate","entry","current","scrollWidth","offsetWidth","activeTab","target","size","offsetHeight","offset","offsetTop","offsetLeft","cssVars","prevStyles","forwardRef","backwardRef","movementProps","movementContext","event","isPropagationStopped","Element","clickedTab","closest","tabs","currentTarget","i","findIndex","tab","onFocusChange","index","backward","container","forward","loopable","searchable","horizontal","includeDisabled","tabIndexBehavior","getFocusableElements","elementProps","undefined","backwardProps","type","forwardProps"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/tabs/useTabList.ts"],"sourcesContent":["\"use client\";\n\nimport type {\n CSSProperties,\n FocusEventHandler,\n KeyboardEventHandler,\n MouseEventHandler,\n Ref,\n RefObject,\n} from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useAppSize } from \"../media-queries/AppSizeProvider.js\";\nimport type {\n KeyboardMovementContext,\n KeyboardMovementProps,\n} from \"../movement/types.js\";\nimport { useKeyboardMovementProvider } from \"../movement/useKeyboardMovementProvider.js\";\nimport { useDir } from \"../typography/WritingDirectionProvider.js\";\nimport { useEnsuredRef } from \"../useEnsuredRef.js\";\nimport { useResizeObserver } from \"../useResizeObserver.js\";\nimport {\n type TabListActivationMode,\n type TabListScrollButtonsBehavior,\n} from \"./types.js\";\nimport { getTabRoleOnly, scrollTabIntoView } from \"./utils.js\";\n\nconst TAB_SIZE_VAR = \"--rmd-tab-size\";\nconst TAB_OFFSET_VAR = \"--rmd-tab-offset\";\n\nconst noop = (): void => {\n // do nothing\n};\n\nexport type TabWidthVar = typeof TAB_SIZE_VAR;\nexport type TabOffsetVar = typeof TAB_OFFSET_VAR;\n\nexport type IndicatorCSSProperties = CSSProperties &\n Record<TabWidthVar | TabOffsetVar, string>;\n\nexport interface TabListHookOptions {\n ref: Ref<HTMLDivElement> | undefined;\n style: CSSProperties | undefined;\n activeIndex: number;\n setActiveIndex: (nextActiveIndex: number) => void;\n scrollButtons: TabListScrollButtonsBehavior;\n activationMode: TabListActivationMode;\n vertical: boolean;\n onClick: MouseEventHandler<HTMLDivElement> | undefined;\n onFocus: FocusEventHandler<HTMLDivElement> | undefined;\n onKeyDown: KeyboardEventHandler<HTMLDivElement> | undefined;\n disableTransition: boolean;\n}\n\nexport interface TabListHookReturnValue {\n elementProps: KeyboardMovementProps<HTMLDivElement> & {\n \"aria-orientation\": \"horizontal\" | \"vertical\";\n style: CSSProperties;\n ref: Ref<HTMLDivElement>;\n onClick: MouseEventHandler<HTMLDivElement>;\n };\n movementContext: KeyboardMovementContext;\n backwardProps: {\n ref: RefObject<HTMLDivElement>;\n type: \"back\";\n vertical: boolean;\n disableTransition?: boolean;\n };\n forwardProps: {\n ref: RefObject<HTMLDivElement>;\n type: \"forward\";\n vertical: boolean;\n disableTransition?: boolean;\n };\n showScrollButtons: boolean;\n}\n\n/**\n * @internal\n */\nexport function useTabList(\n options: TabListHookOptions\n): TabListHookReturnValue {\n const {\n ref: propRef,\n style,\n activeIndex,\n scrollButtons,\n onClick = noop,\n onFocus,\n onKeyDown,\n activationMode,\n vertical,\n setActiveIndex,\n disableTransition,\n } = options;\n\n const isRTL = useDir().dir === \"rtl\";\n const { isPhone } = useAppSize();\n const isScrollObserverEnabled =\n scrollButtons === \"auto\" ||\n (scrollButtons === \"auto-tablet-or-above\" && !isPhone);\n const [autoScrollButtons, setAutoScrollButtons] = useState(false);\n const showScrollButtons =\n scrollButtons === true ||\n (scrollButtons === \"tablet-or-above\" && !isPhone) ||\n (isScrollObserverEnabled && autoScrollButtons);\n\n const [indicatorStyles, setIndicatorStyles] =\n useState<IndicatorCSSProperties>(() => {\n const tabWidth = `${100 / 3}%`;\n return {\n [TAB_SIZE_VAR]: tabWidth,\n [TAB_OFFSET_VAR]: \"0px\",\n };\n });\n\n const [nodeRef, ref] = useEnsuredRef(propRef);\n const tabListRef = useResizeObserver({\n ref,\n disabled: disableTransition && !isScrollObserverEnabled,\n disableHeight: disableTransition && !isScrollObserverEnabled && !vertical,\n disableWidth: disableTransition && !isScrollObserverEnabled && vertical,\n onUpdate: useCallback(\n (entry) => {\n // this is kind of hacky -- the styles should update when switching\n // between RTL or when the scroll buttons appear, but they aren't\n // required for any styles. Just reference them so that the hooks\n // eslint rule doesn't show a warning...\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n isRTL;\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n showScrollButtons;\n\n if (isScrollObserverEnabled && nodeRef.current) {\n setAutoScrollButtons(\n nodeRef.current.scrollWidth > nodeRef.current.offsetWidth\n );\n }\n\n const activeTab = getTabRoleOnly(entry.target)[activeIndex];\n if (!activeTab || disableTransition) {\n return;\n }\n\n const size = vertical ? activeTab.offsetHeight : activeTab.offsetWidth;\n const offset = vertical ? activeTab.offsetTop : activeTab.offsetLeft;\n const cssVars: IndicatorCSSProperties = {\n [TAB_SIZE_VAR]: `${size}px`,\n [TAB_OFFSET_VAR]: `${offset}px`,\n };\n\n setIndicatorStyles((prevStyles) => {\n if (\n prevStyles &&\n prevStyles[TAB_SIZE_VAR] === cssVars[TAB_SIZE_VAR] &&\n prevStyles[TAB_OFFSET_VAR] === cssVars[TAB_OFFSET_VAR]\n ) {\n return prevStyles;\n }\n\n return cssVars;\n });\n },\n [\n activeIndex,\n disableTransition,\n isRTL,\n isScrollObserverEnabled,\n nodeRef,\n showScrollButtons,\n vertical,\n ]\n ),\n });\n const forwardRef = useRef<HTMLDivElement>(null);\n const backwardRef = useRef<HTMLDivElement>(null);\n const { movementProps, movementContext } = useKeyboardMovementProvider({\n ref: tabListRef,\n onClick(event) {\n onClick(event);\n if (event.isPropagationStopped() || !(event.target instanceof Element)) {\n return;\n }\n\n const clickedTab = event.target.closest<HTMLElement>(\"[role='tab']\");\n const tabs = getTabRoleOnly(event.currentTarget);\n const i = clickedTab ? tabs.indexOf(clickedTab) : -1;\n if (i !== -1) {\n setActiveIndex(i);\n }\n },\n onFocus,\n onKeyDown,\n onFocusChange(event) {\n const { index } = event;\n if (activationMode === \"automatic\") {\n setActiveIndex(index);\n } else if (scrollButtons) {\n scrollTabIntoView({\n activeIndex: index,\n backward: backwardRef.current,\n container: nodeRef.current,\n forward: forwardRef.current,\n vertical,\n });\n }\n },\n loopable: true,\n searchable: true,\n horizontal: !vertical,\n includeDisabled: true,\n tabIndexBehavior: \"roving\",\n getFocusableElements: getTabRoleOnly,\n });\n\n useEffect(() => {\n scrollTabIntoView({\n activeIndex,\n backward: backwardRef.current,\n container: nodeRef.current,\n forward: forwardRef.current,\n vertical,\n });\n }, [activeIndex, nodeRef, vertical]);\n\n return {\n elementProps: {\n \"aria-orientation\": vertical ? \"vertical\" : \"horizontal\",\n style: {\n ...style,\n ...(disableTransition ? undefined : indicatorStyles),\n },\n ...movementProps,\n },\n backwardProps: {\n ref: backwardRef,\n type: \"back\",\n vertical,\n disableTransition,\n },\n forwardProps: {\n ref: forwardRef,\n type: \"forward\",\n vertical,\n disableTransition,\n },\n movementContext,\n showScrollButtons,\n };\n}\n"],"names":["useCallback","useEffect","useRef","useState","useAppSize","useKeyboardMovementProvider","useDir","useEnsuredRef","useResizeObserver","getTabRoleOnly","scrollTabIntoView","TAB_SIZE_VAR","TAB_OFFSET_VAR","noop","useTabList","options","ref","propRef","style","activeIndex","scrollButtons","onClick","onFocus","onKeyDown","activationMode","vertical","setActiveIndex","disableTransition","isRTL","dir","isPhone","isScrollObserverEnabled","autoScrollButtons","setAutoScrollButtons","showScrollButtons","indicatorStyles","setIndicatorStyles","tabWidth","nodeRef","tabListRef","disabled","disableHeight","disableWidth","onUpdate","entry","current","scrollWidth","offsetWidth","activeTab","target","size","offsetHeight","offset","offsetTop","offsetLeft","cssVars","prevStyles","forwardRef","backwardRef","movementProps","movementContext","event","isPropagationStopped","Element","clickedTab","closest","tabs","currentTarget","i","indexOf","onFocusChange","index","backward","container","forward","loopable","searchable","horizontal","includeDisabled","tabIndexBehavior","getFocusableElements","elementProps","undefined","backwardProps","type","forwardProps"],"mappings":"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"}
@@ -28,4 +28,4 @@ import { type MatchMediaChangeViewport, type MatchMediaMatcher } from "../mocks/
28
28
  *
29
29
  * @since 6.0.0
30
30
  */
31
- export declare function spyOnMatchMedia(defaultMatch?: MatchMediaMatcher): jest.SpiedFunction<typeof window.matchMedia> & MatchMediaChangeViewport;
31
+ export declare function spyOnMatchMedia(defaultMatch?: MatchMediaMatcher): jest.SpiedFunction<typeof globalThis.matchMedia> & MatchMediaChangeViewport;
@@ -29,7 +29,7 @@ import { createMatchMediaSpy } from "../utils/createMatchMediaSpy.js";
29
29
  *
30
30
  * @since 6.0.0
31
31
  */ export function spyOnMatchMedia(defaultMatch = matchDesktop) {
32
- return createMatchMediaSpy(jest.spyOn(window, "matchMedia"), defaultMatch);
32
+ return createMatchMediaSpy(jest.spyOn(globalThis, "matchMedia"), defaultMatch);
33
33
  }
34
34
 
35
35
  //# sourceMappingURL=match-media.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/test-utils/jest-globals/match-media.ts"],"sourcesContent":["import { jest } from \"@jest/globals\";\n\nimport {\n type MatchMediaChangeViewport,\n type MatchMediaMatcher,\n matchDesktop,\n} from \"../mocks/match-media.js\";\nimport { createMatchMediaSpy } from \"../utils/createMatchMediaSpy.js\";\n\n/**\n * @example Default Behavior\n * ```tsx\n * import { matchPhone, render } from \"@react-md/core/test-utils\";\n * import { spyOnMatchMedia } from \"@react-md/core/test-utils/jest-globals\";\n *\n * const matchMedia = spyOnMatchMedia();\n * render(<Test />);\n *\n * // expect desktop results\n *\n * matchMedia.changeViewport(matchPhone);\n * // expect phone results\n * ```\n *\n * @example Set Default Media\n * ```tsx\n * import { matchPhone, render } from \"@react-md/core/test-utils\";\n * import { spyOnMatchMedia } from \"@react-md/core/test-utils/jest-globals\";\n *\n * const matchMedia = spyOnMatchMedia(matchPhone);\n * render(<Test />);\n *\n * // expect phone results\n * ```\n *\n * @since 6.0.0\n */\nexport function spyOnMatchMedia(\n defaultMatch: MatchMediaMatcher = matchDesktop\n): jest.SpiedFunction<typeof window.matchMedia> & MatchMediaChangeViewport {\n return createMatchMediaSpy(jest.spyOn(window, \"matchMedia\"), defaultMatch);\n}\n"],"names":["jest","matchDesktop","createMatchMediaSpy","spyOnMatchMedia","defaultMatch","spyOn","window"],"mappings":"AAAA,SAASA,IAAI,QAAQ,gBAAgB;AAErC,SAGEC,YAAY,QACP,0BAA0B;AACjC,SAASC,mBAAmB,QAAQ,kCAAkC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BC,GACD,OAAO,SAASC,gBACdC,eAAkCH,YAAY;IAE9C,OAAOC,oBAAoBF,KAAKK,KAAK,CAACC,QAAQ,eAAeF;AAC/D"}
1
+ {"version":3,"sources":["../../../src/test-utils/jest-globals/match-media.ts"],"sourcesContent":["import { jest } from \"@jest/globals\";\n\nimport {\n type MatchMediaChangeViewport,\n type MatchMediaMatcher,\n matchDesktop,\n} from \"../mocks/match-media.js\";\nimport { createMatchMediaSpy } from \"../utils/createMatchMediaSpy.js\";\n\n/**\n * @example Default Behavior\n * ```tsx\n * import { matchPhone, render } from \"@react-md/core/test-utils\";\n * import { spyOnMatchMedia } from \"@react-md/core/test-utils/jest-globals\";\n *\n * const matchMedia = spyOnMatchMedia();\n * render(<Test />);\n *\n * // expect desktop results\n *\n * matchMedia.changeViewport(matchPhone);\n * // expect phone results\n * ```\n *\n * @example Set Default Media\n * ```tsx\n * import { matchPhone, render } from \"@react-md/core/test-utils\";\n * import { spyOnMatchMedia } from \"@react-md/core/test-utils/jest-globals\";\n *\n * const matchMedia = spyOnMatchMedia(matchPhone);\n * render(<Test />);\n *\n * // expect phone results\n * ```\n *\n * @since 6.0.0\n */\nexport function spyOnMatchMedia(\n defaultMatch: MatchMediaMatcher = matchDesktop\n): jest.SpiedFunction<typeof globalThis.matchMedia> & MatchMediaChangeViewport {\n return createMatchMediaSpy(\n jest.spyOn(globalThis, \"matchMedia\"),\n defaultMatch\n );\n}\n"],"names":["jest","matchDesktop","createMatchMediaSpy","spyOnMatchMedia","defaultMatch","spyOn","globalThis"],"mappings":"AAAA,SAASA,IAAI,QAAQ,gBAAgB;AAErC,SAGEC,YAAY,QACP,0BAA0B;AACjC,SAASC,mBAAmB,QAAQ,kCAAkC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BC,GACD,OAAO,SAASC,gBACdC,eAAkCH,YAAY;IAE9C,OAAOC,oBACLF,KAAKK,KAAK,CAACC,YAAY,eACvBF;AAEJ"}
@@ -34,7 +34,7 @@ import { jest } from "@jest/globals";
34
34
  * ```
35
35
  *
36
36
  * @since 6.0.0
37
- */ export const testImmediateRaf = ()=>jest.spyOn(window, "requestAnimationFrame").mockImplementation((cb)=>{
37
+ */ export const testImmediateRaf = ()=>jest.spyOn(globalThis, "requestAnimationFrame").mockImplementation((cb)=>{
38
38
  cb(0);
39
39
  return 0;
40
40
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/test-utils/jest-globals/timers.ts"],"sourcesContent":["import { jest } from \"@jest/globals\";\n\n/**\n * @since 6.0.0\n */\nexport type RafSpy = jest.SpiedFunction<typeof requestAnimationFrame>;\n\n/**\n * @example\n * ```ts\n * import { testImmediateRaf } from \"@react-md/core/test-utils/jest-globals\";\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/jest-globals\";\n *\n * afterEach(() => {\n * jest.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 jest.spyOn(window, \"requestAnimationFrame\").mockImplementation((cb) => {\n cb(0);\n return 0;\n });\n"],"names":["jest","testImmediateRaf","spyOn","window","mockImplementation","cb"],"mappings":"AAAA,SAASA,IAAI,QAAQ,gBAAgB;AAOrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCC,GACD,OAAO,MAAMC,mBAAmB,IAC9BD,KAAKE,KAAK,CAACC,QAAQ,yBAAyBC,kBAAkB,CAAC,CAACC;QAC9DA,GAAG;QACH,OAAO;IACT,GAAG"}
1
+ {"version":3,"sources":["../../../src/test-utils/jest-globals/timers.ts"],"sourcesContent":["import { jest } from \"@jest/globals\";\n\n/**\n * @since 6.0.0\n */\nexport type RafSpy = jest.SpiedFunction<typeof requestAnimationFrame>;\n\n/**\n * @example\n * ```ts\n * import { testImmediateRaf } from \"@react-md/core/test-utils/jest-globals\";\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/jest-globals\";\n *\n * afterEach(() => {\n * jest.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 jest.spyOn(globalThis, \"requestAnimationFrame\").mockImplementation((cb) => {\n cb(0);\n return 0;\n });\n"],"names":["jest","testImmediateRaf","spyOn","globalThis","mockImplementation","cb"],"mappings":"AAAA,SAASA,IAAI,QAAQ,gBAAgB;AAOrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCC,GACD,OAAO,MAAMC,mBAAmB,IAC9BD,KAAKE,KAAK,CAACC,YAAY,yBAAyBC,kBAAkB,CAAC,CAACC;QAClEA,GAAG;QACH,OAAO;IACT,GAAG"}
@@ -29,7 +29,7 @@ import { createFileList } from "../utils/createFileList.js";
29
29
  jest.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/jest-globals/uploadMenuItemFileInput.ts"],"sourcesContent":["import { jest } from \"@jest/globals\";\nimport { fireEvent } from \"@testing-library/dom\";\nimport { type UserEvent } from \"@testing-library/user-event\";\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 jest.spyOn(document, \"createElement\").mockReturnValueOnce(input);\n jest.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":["jest","fireEvent","createFileList","uploadMenuItemFileUpload","options","user","files","menuItem","input","document","createElement","spyOn","mockReturnValueOnce","mockImplementationOnce","change","target","window","click"],"mappings":"AAAA,SAASA,IAAI,QAAQ,gBAAgB;AACrC,SAASC,SAAS,QAAQ,uBAAuB;AAGjD,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;IACrCV,KAAKW,KAAK,CAACF,UAAU,iBAAiBG,mBAAmB,CAACJ;IAC1DR,KAAKW,KAAK,CAACH,OAAO,SAASK,sBAAsB,CAAC;QAChDZ,UAAUa,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/jest-globals/uploadMenuItemFileInput.ts"],"sourcesContent":["import { jest } from \"@jest/globals\";\nimport { fireEvent } from \"@testing-library/dom\";\nimport { type UserEvent } from \"@testing-library/user-event\";\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 jest.spyOn(document, \"createElement\").mockReturnValueOnce(input);\n jest.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":["jest","fireEvent","createFileList","uploadMenuItemFileUpload","options","user","files","menuItem","input","document","createElement","spyOn","mockReturnValueOnce","mockImplementationOnce","change","target","globalThis","window","click"],"mappings":"AAAA,SAASA,IAAI,QAAQ,gBAAgB;AACrC,SAASC,SAAS,QAAQ,uBAAuB;AAGjD,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;IACrCV,KAAKW,KAAK,CAACF,UAAU,iBAAiBG,mBAAmB,CAACJ;IAC1DR,KAAKW,KAAK,CAACH,OAAO,SAASK,sBAAsB,CAAC;QAChDZ,UAAUa,MAAM,CAACN,OAAO;YACtBO,QAAQ;gBAAET,OAAOJ,eAAec,WAAWC,MAAM,EAAEX;YAAO;QAC5D;IACF;IAEA,MAAMD,KAAKa,KAAK,CAACX;AACnB"}
@@ -221,8 +221,8 @@ import { createResizeObserverEntry } from "../utils/createResizeObserverEntry.js
221
221
  const { raf, manager = resizeObserverManager } = options;
222
222
  const resizeObserver = new ResizeObserverMock((entries)=>{
223
223
  if (raf) {
224
- window.cancelAnimationFrame(manager.frame);
225
- manager.frame = window.requestAnimationFrame(()=>{
224
+ globalThis.cancelAnimationFrame(manager.frame);
225
+ manager.frame = globalThis.requestAnimationFrame(()=>{
226
226
  manager.handleResizeEntries(entries);
227
227
  });
228
228
  } else {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/test-utils/mocks/ResizeObserver.ts"],"sourcesContent":["import {\n type ResizeObserverManager,\n resizeObserverManager,\n} from \"../../useResizeObserver.js\";\nimport {\n type GetResizeObserverEntryMock,\n type ResizeObserverEntrySize,\n createResizeObserverEntry,\n} from \"../utils/createResizeObserverEntry.js\";\n\n/**\n * This is the default ResizeObserver implementation if it does not already\n * exist in jsdom. You normally should not use this directly and instead use the\n * {@link setupResizeObserverMock} instead.\n *\n * @since 6.0.0\n */\nexport class ResizeObserverMock implements ResizeObserver {\n elements: Set<Element>;\n\n constructor(public callback: ResizeObserverCallback) {\n this.elements = new Set();\n }\n\n observe = (target: Element): void => {\n this.elements.add(target);\n this.resizeAllElements(createResizeObserverEntry);\n };\n\n unobserve = (target: Element): void => {\n this.elements.delete(target);\n };\n\n disconnect = (): void => {\n this.elements.clear();\n };\n\n /**\n * Triggers the resize event for a specific element. This must be wrapped in\n * `act`.\n *\n * @example Main Usage\n * ```tsx\n * import {\n * setupResizeObserverMock,\n * } from \"@react-md/core/test-utils\";\n * import { useResizeObserver } from \"@react-md/core/useResizeObserver\";\n * import { ExampleComponent } from \"../ExampleComponent.js\";\n *\n * // choose your test framework\n * import { afterEach, cleanupResizeObserverAfterEach, jest } from \"@jest/globals\";\n * cleanupResizeObserverAfterEach();\n *\n * import { afterEach, cleanupResizeObserverAfterEach, vitest } from \"vitest\";\n * cleanupResizeObserverAfterEach();\n *\n * describe(\"ExampleComponent\", () => {\n * it(\"should do stuff\", () => {\n * const observer = setupResizeObserverMock();\n * render(<ExampleComponent />)\n *\n * const resizeTarget = screen.getByTestId(\"resize-target\")\n *\n * // you can trigger with a custom change\n * act(() => {\n * observer.resizeElement(resizeTarget, { height: 100, width: 100 });\n * });\n * // expect resize changes\n * });\n * })\n * ```\n */\n resizeElement = (\n target: Element,\n changesOrGetEntry:\n | GetResizeObserverEntryMock\n | ResizeObserverEntrySize\n | ResizeObserverEntry = createResizeObserverEntry\n ): void => {\n if (!this.elements.has(target)) {\n throw new Error(\n \"The `ResizeObserverMock` is not watching the target element and cannot be resized\"\n );\n }\n\n let entry: ResizeObserverEntry;\n if (typeof changesOrGetEntry === \"function\") {\n entry = changesOrGetEntry(target);\n } else if (!(\"contentRect\" in changesOrGetEntry)) {\n entry = createResizeObserverEntry(target, changesOrGetEntry);\n } else {\n entry = changesOrGetEntry;\n }\n\n this.callback([entry], this);\n };\n\n /**\n * You'll normally want to use {@link resizeElement} instead, but this can be\n * used to resize all the watched elements at once.\n *\n * @example\n * ```tsx\n * import {\n * act,\n * createResizeObserverEntry,\n * render,\n * screen,\n * setupResizeObserverMock,\n * } from \"@react-md/core/test-utils\";\n *\n * const observer = setupResizeObserverMock();\n * const { container } = render(<Test />)\n * expect(container).toMatchSnapshot()\n *\n * const target1 = screen.getByTestId('target-1');\n * const target2 = screen.getByTestId('target-2');\n * const target3 = screen.getByTestId('target-3');\n *\n * act(() => {\n * observer.resizeAllElements((element) => {\n * let height: number | undefined;\n * let width: number | undefined;\n * switch (element) {\n * case target1:\n * height = 400;\n * width = 250;\n * break;\n * case target2:\n * height = 100;\n * width = 380;\n * break;\n * case target3:\n * height = 24;\n * width = 24;\n * break;\n * }\n *\n * return createResizeObserverEntry(element, { height, width });\n * });\n * });\n * expect(container).toMatchSnapshot()\n * ```\n */\n resizeAllElements = (getEntry = createResizeObserverEntry): void => {\n const entries = [...this.elements].map((element) => getEntry(element));\n this.callback(entries, this);\n };\n}\n\n/**\n * @since 6.0.0\n */\nexport interface SetupResizeObserverMockOptions {\n /**\n * Set this to `true` to mimic the real `ResizeObserver` behavior where the\n * updates occur after an animation frame instead of invoking immediately.\n *\n * Keeping this as `false` is recommended since this option was only added to\n * make testing this function itself easier.\n *\n * @defaultValue `false`\n */\n raf?: boolean;\n\n /**\n * Keeping this as the `resizeObserverManager` is recommended since this\n * option was only added to make testing this function easier itself.\n *\n * @defaultValue `resizeObserverManager`\n */\n manager?: ResizeObserverManager;\n}\n\n/**\n * Initializes the `ResizeObserverMock` to be used for tests.\n *\n * @example Main Usage\n * ```tsx\n * import {\n * cleanupResizeObserverAfterEach,\n * render,\n * screen,\n * setupResizeObserverMock,\n * } from \"@react-md/core/test-utils\";\n * import { useResizeObserver } from \"@react-md/core/useResizeObserver\";\n * import { useCallback, useState } from \"react\";\n *\n * // choose your test framework\n * import { afterEach, jest } from \"@jest/globals\";\n * cleanupResizeObserverAfterEach(afterEach, jest.restoreAllMocks);\n *\n * import { afterEach, vitest } from \"vitest\";\n * cleanupResizeObserverAfterEach(afterEach, vitest.restoreAllMocks);\n *\n * function ExampleComponent() {\n * const [size, setSize] = useState({ height: 0, width: 0 });\n * const ref = useResizeObserver({\n * onUpdate: useCallback((entry) => {\n * setSize({\n * height: entry.contentRect.height,\n * width: entry.contentRect.width,\n * });\n * }, []),\n * });\n *\n * return (\n * <>\n * <div data-testid=\"size\">{JSON.stringify(size)}</div>\n * <div data-testid=\"resize-target\" ref={ref} />\n * </>\n * );\n * }\n *\n * describe(\"ExampleComponent\", () => {\n * it(\"should do stuff\", () => {\n * const observer = setupResizeObserverMock();\n * render(<ExampleComponent />);\n *\n * const size = screen.getByTestId(\"size\");\n * const resizeTarget = screen.getByTestId(\"resize-target\");\n *\n * // jsdom sets all element sizes to 0 by default\n * expect(size).toHaveTextContent(JSON.stringify({ height: 0, width: 0 }));\n *\n * // you can trigger with a custom change\n * act(() => {\n * observer.resizeElement(resizeTarget, { height: 100, width: 100 });\n * });\n * expect(size).toHaveTextContent(JSON.stringify({ height: 100, width: 100 }));\n *\n * // or you can mock the `getBoundingClientRect` result\n * jest.spyOn(resizeTarget, \"getBoundingClientRect\").mockReturnValue({\n * ...document.body.getBoundingClientRect(),\n * height: 200,\n * width: 200,\n * });\n *\n * act(() => {\n * observer.resizeElement(resizeTarget);\n * });\n * expect(size).toHaveTextContent(JSON.stringify({ height: 200, width: 200 }));\n * });\n * });\n * ```\n *\n * @since 6.0.0\n */\nexport function setupResizeObserverMock(\n options: SetupResizeObserverMockOptions = {}\n): ResizeObserverMock {\n const { raf, manager = resizeObserverManager } = options;\n\n const resizeObserver = new ResizeObserverMock((entries) => {\n if (raf) {\n window.cancelAnimationFrame(manager.frame);\n manager.frame = window.requestAnimationFrame(() => {\n manager.handleResizeEntries(entries);\n });\n } else {\n manager.handleResizeEntries(entries);\n }\n });\n manager.sharedObserver = resizeObserver;\n return resizeObserver;\n}\n\n/**\n * @see {@link setupResizeObserverMock}\n * @since 6.0.0\n * @internal\n */\nexport function cleanupRO(\n afterEach: (callback: () => void) => void,\n restoreAllMocks: () => void = () => {}\n): void {\n afterEach(() => {\n resizeObserverManager.frame = 0;\n resizeObserverManager.subscriptions = new Map();\n resizeObserverManager.sharedObserver = undefined;\n restoreAllMocks();\n });\n}\n"],"names":["resizeObserverManager","createResizeObserverEntry","ResizeObserverMock","callback","elements","observe","unobserve","disconnect","resizeElement","resizeAllElements","target","add","delete","clear","changesOrGetEntry","has","Error","entry","getEntry","entries","map","element","Set","setupResizeObserverMock","options","raf","manager","resizeObserver","window","cancelAnimationFrame","frame","requestAnimationFrame","handleResizeEntries","sharedObserver","cleanupRO","afterEach","restoreAllMocks","subscriptions","Map","undefined"],"mappings":";;;;;;;;;;;;;AAAA,SAEEA,qBAAqB,QAChB,6BAA6B;AACpC,SAGEC,yBAAyB,QACpB,wCAAwC;AAE/C;;;;;;CAMC,GACD,OAAO,MAAMC;IAGX,YAAY,AAAOC,QAAgC,CAAE;;QAFrDC,uBAAAA,YAAAA,KAAAA;QAMAC,uBAAAA,WAAAA,KAAAA;QAKAC,uBAAAA,aAAAA,KAAAA;QAIAC,uBAAAA,cAAAA,KAAAA;QAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCC,GACDC,uBAAAA,iBAAAA,KAAAA;QAyBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CC,GACDC,uBAAAA,qBAAAA,KAAAA;aA5HmBN,WAAAA;aAInBE,UAAU,CAACK;YACT,IAAI,CAACN,QAAQ,CAACO,GAAG,CAACD;YAClB,IAAI,CAACD,iBAAiB,CAACR;QACzB;aAEAK,YAAY,CAACI;YACX,IAAI,CAACN,QAAQ,CAACQ,MAAM,CAACF;QACvB;aAEAH,aAAa;YACX,IAAI,CAACH,QAAQ,CAACS,KAAK;QACrB;aAqCAL,gBAAgB,CACdE,QACAI,oBAG0Bb,yBAAyB;YAEnD,IAAI,CAAC,IAAI,CAACG,QAAQ,CAACW,GAAG,CAACL,SAAS;gBAC9B,MAAM,IAAIM,MACR;YAEJ;YAEA,IAAIC;YACJ,IAAI,OAAOH,sBAAsB,YAAY;gBAC3CG,QAAQH,kBAAkBJ;YAC5B,OAAO,IAAI,CAAE,CAAA,iBAAiBI,iBAAgB,GAAI;gBAChDG,QAAQhB,0BAA0BS,QAAQI;YAC5C,OAAO;gBACLG,QAAQH;YACV;YAEA,IAAI,CAACX,QAAQ,CAAC;gBAACc;aAAM,EAAE,IAAI;QAC7B;aAiDAR,oBAAoB,CAACS,WAAWjB,yBAAyB;YACvD,MAAMkB,UAAU;mBAAI,IAAI,CAACf,QAAQ;aAAC,CAACgB,GAAG,CAAC,CAACC,UAAYH,SAASG;YAC7D,IAAI,CAAClB,QAAQ,CAACgB,SAAS,IAAI;QAC7B;QA9HE,IAAI,CAACf,QAAQ,GAAG,IAAIkB;IACtB;AA8HF;AA0BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyEC,GACD,OAAO,SAASC,wBACdC,UAA0C,CAAC,CAAC;IAE5C,MAAM,EAAEC,GAAG,EAAEC,UAAU1B,qBAAqB,EAAE,GAAGwB;IAEjD,MAAMG,iBAAiB,IAAIzB,mBAAmB,CAACiB;QAC7C,IAAIM,KAAK;YACPG,OAAOC,oBAAoB,CAACH,QAAQI,KAAK;YACzCJ,QAAQI,KAAK,GAAGF,OAAOG,qBAAqB,CAAC;gBAC3CL,QAAQM,mBAAmB,CAACb;YAC9B;QACF,OAAO;YACLO,QAAQM,mBAAmB,CAACb;QAC9B;IACF;IACAO,QAAQO,cAAc,GAAGN;IACzB,OAAOA;AACT;AAEA;;;;CAIC,GACD,OAAO,SAASO,UACdC,SAAyC,EACzCC,kBAA8B,KAAO,CAAC;IAEtCD,UAAU;QACRnC,sBAAsB8B,KAAK,GAAG;QAC9B9B,sBAAsBqC,aAAa,GAAG,IAAIC;QAC1CtC,sBAAsBiC,cAAc,GAAGM;QACvCH;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/test-utils/mocks/ResizeObserver.ts"],"sourcesContent":["import {\n type ResizeObserverManager,\n resizeObserverManager,\n} from \"../../useResizeObserver.js\";\nimport {\n type GetResizeObserverEntryMock,\n type ResizeObserverEntrySize,\n createResizeObserverEntry,\n} from \"../utils/createResizeObserverEntry.js\";\n\n/**\n * This is the default ResizeObserver implementation if it does not already\n * exist in jsdom. You normally should not use this directly and instead use the\n * {@link setupResizeObserverMock} instead.\n *\n * @since 6.0.0\n */\nexport class ResizeObserverMock implements ResizeObserver {\n elements: Set<Element>;\n\n constructor(public callback: ResizeObserverCallback) {\n this.elements = new Set();\n }\n\n observe = (target: Element): void => {\n this.elements.add(target);\n this.resizeAllElements(createResizeObserverEntry);\n };\n\n unobserve = (target: Element): void => {\n this.elements.delete(target);\n };\n\n disconnect = (): void => {\n this.elements.clear();\n };\n\n /**\n * Triggers the resize event for a specific element. This must be wrapped in\n * `act`.\n *\n * @example Main Usage\n * ```tsx\n * import {\n * setupResizeObserverMock,\n * } from \"@react-md/core/test-utils\";\n * import { useResizeObserver } from \"@react-md/core/useResizeObserver\";\n * import { ExampleComponent } from \"../ExampleComponent.js\";\n *\n * // choose your test framework\n * import { afterEach, cleanupResizeObserverAfterEach, jest } from \"@jest/globals\";\n * cleanupResizeObserverAfterEach();\n *\n * import { afterEach, cleanupResizeObserverAfterEach, vitest } from \"vitest\";\n * cleanupResizeObserverAfterEach();\n *\n * describe(\"ExampleComponent\", () => {\n * it(\"should do stuff\", () => {\n * const observer = setupResizeObserverMock();\n * render(<ExampleComponent />)\n *\n * const resizeTarget = screen.getByTestId(\"resize-target\")\n *\n * // you can trigger with a custom change\n * act(() => {\n * observer.resizeElement(resizeTarget, { height: 100, width: 100 });\n * });\n * // expect resize changes\n * });\n * })\n * ```\n */\n resizeElement = (\n target: Element,\n changesOrGetEntry:\n | GetResizeObserverEntryMock\n | ResizeObserverEntrySize\n | ResizeObserverEntry = createResizeObserverEntry\n ): void => {\n if (!this.elements.has(target)) {\n throw new Error(\n \"The `ResizeObserverMock` is not watching the target element and cannot be resized\"\n );\n }\n\n let entry: ResizeObserverEntry;\n if (typeof changesOrGetEntry === \"function\") {\n entry = changesOrGetEntry(target);\n } else if (!(\"contentRect\" in changesOrGetEntry)) {\n entry = createResizeObserverEntry(target, changesOrGetEntry);\n } else {\n entry = changesOrGetEntry;\n }\n\n this.callback([entry], this);\n };\n\n /**\n * You'll normally want to use {@link resizeElement} instead, but this can be\n * used to resize all the watched elements at once.\n *\n * @example\n * ```tsx\n * import {\n * act,\n * createResizeObserverEntry,\n * render,\n * screen,\n * setupResizeObserverMock,\n * } from \"@react-md/core/test-utils\";\n *\n * const observer = setupResizeObserverMock();\n * const { container } = render(<Test />)\n * expect(container).toMatchSnapshot()\n *\n * const target1 = screen.getByTestId('target-1');\n * const target2 = screen.getByTestId('target-2');\n * const target3 = screen.getByTestId('target-3');\n *\n * act(() => {\n * observer.resizeAllElements((element) => {\n * let height: number | undefined;\n * let width: number | undefined;\n * switch (element) {\n * case target1:\n * height = 400;\n * width = 250;\n * break;\n * case target2:\n * height = 100;\n * width = 380;\n * break;\n * case target3:\n * height = 24;\n * width = 24;\n * break;\n * }\n *\n * return createResizeObserverEntry(element, { height, width });\n * });\n * });\n * expect(container).toMatchSnapshot()\n * ```\n */\n resizeAllElements = (getEntry = createResizeObserverEntry): void => {\n const entries = [...this.elements].map((element) => getEntry(element));\n this.callback(entries, this);\n };\n}\n\n/**\n * @since 6.0.0\n */\nexport interface SetupResizeObserverMockOptions {\n /**\n * Set this to `true` to mimic the real `ResizeObserver` behavior where the\n * updates occur after an animation frame instead of invoking immediately.\n *\n * Keeping this as `false` is recommended since this option was only added to\n * make testing this function itself easier.\n *\n * @defaultValue `false`\n */\n raf?: boolean;\n\n /**\n * Keeping this as the `resizeObserverManager` is recommended since this\n * option was only added to make testing this function easier itself.\n *\n * @defaultValue `resizeObserverManager`\n */\n manager?: ResizeObserverManager;\n}\n\n/**\n * Initializes the `ResizeObserverMock` to be used for tests.\n *\n * @example Main Usage\n * ```tsx\n * import {\n * cleanupResizeObserverAfterEach,\n * render,\n * screen,\n * setupResizeObserverMock,\n * } from \"@react-md/core/test-utils\";\n * import { useResizeObserver } from \"@react-md/core/useResizeObserver\";\n * import { useCallback, useState } from \"react\";\n *\n * // choose your test framework\n * import { afterEach, jest } from \"@jest/globals\";\n * cleanupResizeObserverAfterEach(afterEach, jest.restoreAllMocks);\n *\n * import { afterEach, vitest } from \"vitest\";\n * cleanupResizeObserverAfterEach(afterEach, vitest.restoreAllMocks);\n *\n * function ExampleComponent() {\n * const [size, setSize] = useState({ height: 0, width: 0 });\n * const ref = useResizeObserver({\n * onUpdate: useCallback((entry) => {\n * setSize({\n * height: entry.contentRect.height,\n * width: entry.contentRect.width,\n * });\n * }, []),\n * });\n *\n * return (\n * <>\n * <div data-testid=\"size\">{JSON.stringify(size)}</div>\n * <div data-testid=\"resize-target\" ref={ref} />\n * </>\n * );\n * }\n *\n * describe(\"ExampleComponent\", () => {\n * it(\"should do stuff\", () => {\n * const observer = setupResizeObserverMock();\n * render(<ExampleComponent />);\n *\n * const size = screen.getByTestId(\"size\");\n * const resizeTarget = screen.getByTestId(\"resize-target\");\n *\n * // jsdom sets all element sizes to 0 by default\n * expect(size).toHaveTextContent(JSON.stringify({ height: 0, width: 0 }));\n *\n * // you can trigger with a custom change\n * act(() => {\n * observer.resizeElement(resizeTarget, { height: 100, width: 100 });\n * });\n * expect(size).toHaveTextContent(JSON.stringify({ height: 100, width: 100 }));\n *\n * // or you can mock the `getBoundingClientRect` result\n * jest.spyOn(resizeTarget, \"getBoundingClientRect\").mockReturnValue({\n * ...document.body.getBoundingClientRect(),\n * height: 200,\n * width: 200,\n * });\n *\n * act(() => {\n * observer.resizeElement(resizeTarget);\n * });\n * expect(size).toHaveTextContent(JSON.stringify({ height: 200, width: 200 }));\n * });\n * });\n * ```\n *\n * @since 6.0.0\n */\nexport function setupResizeObserverMock(\n options: SetupResizeObserverMockOptions = {}\n): ResizeObserverMock {\n const { raf, manager = resizeObserverManager } = options;\n\n const resizeObserver = new ResizeObserverMock((entries) => {\n if (raf) {\n globalThis.cancelAnimationFrame(manager.frame);\n manager.frame = globalThis.requestAnimationFrame(() => {\n manager.handleResizeEntries(entries);\n });\n } else {\n manager.handleResizeEntries(entries);\n }\n });\n manager.sharedObserver = resizeObserver;\n return resizeObserver;\n}\n\n/**\n * @see {@link setupResizeObserverMock}\n * @since 6.0.0\n * @internal\n */\nexport function cleanupRO(\n afterEach: (callback: () => void) => void,\n restoreAllMocks: () => void = () => {}\n): void {\n afterEach(() => {\n resizeObserverManager.frame = 0;\n resizeObserverManager.subscriptions = new Map();\n resizeObserverManager.sharedObserver = undefined;\n restoreAllMocks();\n });\n}\n"],"names":["resizeObserverManager","createResizeObserverEntry","ResizeObserverMock","callback","elements","observe","unobserve","disconnect","resizeElement","resizeAllElements","target","add","delete","clear","changesOrGetEntry","has","Error","entry","getEntry","entries","map","element","Set","setupResizeObserverMock","options","raf","manager","resizeObserver","globalThis","cancelAnimationFrame","frame","requestAnimationFrame","handleResizeEntries","sharedObserver","cleanupRO","afterEach","restoreAllMocks","subscriptions","Map","undefined"],"mappings":";;;;;;;;;;;;;AAAA,SAEEA,qBAAqB,QAChB,6BAA6B;AACpC,SAGEC,yBAAyB,QACpB,wCAAwC;AAE/C;;;;;;CAMC,GACD,OAAO,MAAMC;IAGX,YAAY,AAAOC,QAAgC,CAAE;;QAFrDC,uBAAAA,YAAAA,KAAAA;QAMAC,uBAAAA,WAAAA,KAAAA;QAKAC,uBAAAA,aAAAA,KAAAA;QAIAC,uBAAAA,cAAAA,KAAAA;QAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCC,GACDC,uBAAAA,iBAAAA,KAAAA;QAyBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CC,GACDC,uBAAAA,qBAAAA,KAAAA;aA5HmBN,WAAAA;aAInBE,UAAU,CAACK;YACT,IAAI,CAACN,QAAQ,CAACO,GAAG,CAACD;YAClB,IAAI,CAACD,iBAAiB,CAACR;QACzB;aAEAK,YAAY,CAACI;YACX,IAAI,CAACN,QAAQ,CAACQ,MAAM,CAACF;QACvB;aAEAH,aAAa;YACX,IAAI,CAACH,QAAQ,CAACS,KAAK;QACrB;aAqCAL,gBAAgB,CACdE,QACAI,oBAG0Bb,yBAAyB;YAEnD,IAAI,CAAC,IAAI,CAACG,QAAQ,CAACW,GAAG,CAACL,SAAS;gBAC9B,MAAM,IAAIM,MACR;YAEJ;YAEA,IAAIC;YACJ,IAAI,OAAOH,sBAAsB,YAAY;gBAC3CG,QAAQH,kBAAkBJ;YAC5B,OAAO,IAAI,CAAE,CAAA,iBAAiBI,iBAAgB,GAAI;gBAChDG,QAAQhB,0BAA0BS,QAAQI;YAC5C,OAAO;gBACLG,QAAQH;YACV;YAEA,IAAI,CAACX,QAAQ,CAAC;gBAACc;aAAM,EAAE,IAAI;QAC7B;aAiDAR,oBAAoB,CAACS,WAAWjB,yBAAyB;YACvD,MAAMkB,UAAU;mBAAI,IAAI,CAACf,QAAQ;aAAC,CAACgB,GAAG,CAAC,CAACC,UAAYH,SAASG;YAC7D,IAAI,CAAClB,QAAQ,CAACgB,SAAS,IAAI;QAC7B;QA9HE,IAAI,CAACf,QAAQ,GAAG,IAAIkB;IACtB;AA8HF;AA0BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyEC,GACD,OAAO,SAASC,wBACdC,UAA0C,CAAC,CAAC;IAE5C,MAAM,EAAEC,GAAG,EAAEC,UAAU1B,qBAAqB,EAAE,GAAGwB;IAEjD,MAAMG,iBAAiB,IAAIzB,mBAAmB,CAACiB;QAC7C,IAAIM,KAAK;YACPG,WAAWC,oBAAoB,CAACH,QAAQI,KAAK;YAC7CJ,QAAQI,KAAK,GAAGF,WAAWG,qBAAqB,CAAC;gBAC/CL,QAAQM,mBAAmB,CAACb;YAC9B;QACF,OAAO;YACLO,QAAQM,mBAAmB,CAACb;QAC9B;IACF;IACAO,QAAQO,cAAc,GAAGN;IACzB,OAAOA;AACT;AAEA;;;;CAIC,GACD,OAAO,SAASO,UACdC,SAAyC,EACzCC,kBAA8B,KAAO,CAAC;IAEtCD,UAAU;QACRnC,sBAAsB8B,KAAK,GAAG;QAC9B9B,sBAAsBqC,aAAa,GAAG,IAAIC;QAC1CtC,sBAAsBiC,cAAc,GAAGM;QACvCH;IACF;AACF"}
@@ -1,6 +1,6 @@
1
1
  import { IntersectionObserverMock } from "../mocks/IntersectionObserver.js";
2
- if (typeof window !== "undefined" && typeof IntersectionObserver === "undefined") {
3
- window.IntersectionObserver = IntersectionObserverMock;
2
+ if (globalThis.window !== undefined && typeof IntersectionObserver === "undefined") {
3
+ globalThis.IntersectionObserver = IntersectionObserverMock;
4
4
  }
5
5
 
6
6
  //# sourceMappingURL=IntersectionObserver.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/test-utils/polyfills/IntersectionObserver.ts"],"sourcesContent":["import { IntersectionObserverMock } from \"../mocks/IntersectionObserver.js\";\n\nif (\n typeof window !== \"undefined\" &&\n typeof IntersectionObserver === \"undefined\"\n) {\n window.IntersectionObserver = IntersectionObserverMock;\n}\n"],"names":["IntersectionObserverMock","window","IntersectionObserver"],"mappings":"AAAA,SAASA,wBAAwB,QAAQ,mCAAmC;AAE5E,IACE,OAAOC,WAAW,eAClB,OAAOC,yBAAyB,aAChC;IACAD,OAAOC,oBAAoB,GAAGF;AAChC"}
1
+ {"version":3,"sources":["../../../src/test-utils/polyfills/IntersectionObserver.ts"],"sourcesContent":["import { IntersectionObserverMock } from \"../mocks/IntersectionObserver.js\";\n\nif (\n globalThis.window !== undefined &&\n typeof IntersectionObserver === \"undefined\"\n) {\n globalThis.IntersectionObserver = IntersectionObserverMock;\n}\n"],"names":["IntersectionObserverMock","globalThis","window","undefined","IntersectionObserver"],"mappings":"AAAA,SAASA,wBAAwB,QAAQ,mCAAmC;AAE5E,IACEC,WAAWC,MAAM,KAAKC,aACtB,OAAOC,yBAAyB,aAChC;IACAH,WAAWG,oBAAoB,GAAGJ;AACpC"}
@@ -1,6 +1,6 @@
1
1
  import { ResizeObserverMock } from "../mocks/ResizeObserver.js";
2
- if (typeof window !== "undefined" && typeof ResizeObserver === "undefined") {
3
- window.ResizeObserver = ResizeObserverMock;
2
+ if (globalThis.window !== undefined && typeof ResizeObserver === "undefined") {
3
+ globalThis.ResizeObserver = ResizeObserverMock;
4
4
  }
5
5
 
6
6
  //# sourceMappingURL=ResizeObserver.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/test-utils/polyfills/ResizeObserver.ts"],"sourcesContent":["import { ResizeObserverMock } from \"../mocks/ResizeObserver.js\";\n\nif (typeof window !== \"undefined\" && typeof ResizeObserver === \"undefined\") {\n window.ResizeObserver = ResizeObserverMock;\n}\n"],"names":["ResizeObserverMock","window","ResizeObserver"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,6BAA6B;AAEhE,IAAI,OAAOC,WAAW,eAAe,OAAOC,mBAAmB,aAAa;IAC1ED,OAAOC,cAAc,GAAGF;AAC1B"}
1
+ {"version":3,"sources":["../../../src/test-utils/polyfills/ResizeObserver.ts"],"sourcesContent":["import { ResizeObserverMock } from \"../mocks/ResizeObserver.js\";\n\nif (globalThis.window !== undefined && typeof ResizeObserver === \"undefined\") {\n globalThis.ResizeObserver = ResizeObserverMock;\n}\n"],"names":["ResizeObserverMock","globalThis","window","undefined","ResizeObserver"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,6BAA6B;AAEhE,IAAIC,WAAWC,MAAM,KAAKC,aAAa,OAAOC,mBAAmB,aAAa;IAC5EH,WAAWG,cAAc,GAAGJ;AAC9B"}
@@ -1,7 +1,7 @@
1
1
  import { TextDecoder } from "node:util";
2
- if (typeof global.TextDecoder === "undefined") {
2
+ if (globalThis.TextDecoder === undefined) {
3
3
  // @ts-expect-error browser TextDecoder does not support `null` while `node:util` does
4
- global.TextDecoder = TextDecoder;
4
+ globalThis.TextDecoder = TextDecoder;
5
5
  }
6
6
 
7
7
  //# sourceMappingURL=TextDecoder.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/test-utils/polyfills/TextDecoder.ts"],"sourcesContent":["import { TextDecoder } from \"node:util\";\n\nif (typeof global.TextDecoder === \"undefined\") {\n // @ts-expect-error browser TextDecoder does not support `null` while `node:util` does\n global.TextDecoder = TextDecoder;\n}\n"],"names":["TextDecoder","global"],"mappings":"AAAA,SAASA,WAAW,QAAQ,YAAY;AAExC,IAAI,OAAOC,OAAOD,WAAW,KAAK,aAAa;IAC7C,sFAAsF;IACtFC,OAAOD,WAAW,GAAGA;AACvB"}
1
+ {"version":3,"sources":["../../../src/test-utils/polyfills/TextDecoder.ts"],"sourcesContent":["import { TextDecoder } from \"node:util\";\n\nif (globalThis.TextDecoder === undefined) {\n // @ts-expect-error browser TextDecoder does not support `null` while `node:util` does\n globalThis.TextDecoder = TextDecoder;\n}\n"],"names":["TextDecoder","globalThis","undefined"],"mappings":"AAAA,SAASA,WAAW,QAAQ,YAAY;AAExC,IAAIC,WAAWD,WAAW,KAAKE,WAAW;IACxC,sFAAsF;IACtFD,WAAWD,WAAW,GAAGA;AAC3B"}
@@ -1,6 +1,6 @@
1
1
  import { TextEncoder } from "node:util";
2
- if (typeof global.TextEncoder === "undefined") {
3
- global.TextEncoder = TextEncoder;
2
+ if (globalThis.TextEncoder === undefined) {
3
+ globalThis.TextEncoder = TextEncoder;
4
4
  }
5
5
 
6
6
  //# sourceMappingURL=TextEncoder.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/test-utils/polyfills/TextEncoder.ts"],"sourcesContent":["import { TextEncoder } from \"node:util\";\n\nif (typeof global.TextEncoder === \"undefined\") {\n global.TextEncoder = TextEncoder;\n}\n"],"names":["TextEncoder","global"],"mappings":"AAAA,SAASA,WAAW,QAAQ,YAAY;AAExC,IAAI,OAAOC,OAAOD,WAAW,KAAK,aAAa;IAC7CC,OAAOD,WAAW,GAAGA;AACvB"}
1
+ {"version":3,"sources":["../../../src/test-utils/polyfills/TextEncoder.ts"],"sourcesContent":["import { TextEncoder } from \"node:util\";\n\nif (globalThis.TextEncoder === undefined) {\n globalThis.TextEncoder = TextEncoder;\n}\n"],"names":["TextEncoder","globalThis","undefined"],"mappings":"AAAA,SAASA,WAAW,QAAQ,YAAY;AAExC,IAAIC,WAAWD,WAAW,KAAKE,WAAW;IACxCD,WAAWD,WAAW,GAAGA;AAC3B"}
@@ -1,6 +1,6 @@
1
1
  import { BASE_MEDIA_QUERY_LIST, matchDesktop } from "../mocks/match-media.js";
2
- if (typeof window !== "undefined" && typeof window.matchMedia !== "function") {
3
- window.matchMedia = (query)=>({
2
+ if (globalThis.window !== undefined && typeof globalThis.matchMedia !== "function") {
3
+ globalThis.matchMedia = (query)=>({
4
4
  ...BASE_MEDIA_QUERY_LIST,
5
5
  matches: matchDesktop(query)
6
6
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/test-utils/polyfills/matchMedia.ts"],"sourcesContent":["import { BASE_MEDIA_QUERY_LIST, matchDesktop } from \"../mocks/match-media.js\";\n\nif (typeof window !== \"undefined\" && typeof window.matchMedia !== \"function\") {\n window.matchMedia = (query) => ({\n ...BASE_MEDIA_QUERY_LIST,\n matches: matchDesktop(query),\n });\n}\n"],"names":["BASE_MEDIA_QUERY_LIST","matchDesktop","window","matchMedia","query","matches"],"mappings":"AAAA,SAASA,qBAAqB,EAAEC,YAAY,QAAQ,0BAA0B;AAE9E,IAAI,OAAOC,WAAW,eAAe,OAAOA,OAAOC,UAAU,KAAK,YAAY;IAC5ED,OAAOC,UAAU,GAAG,CAACC,QAAW,CAAA;YAC9B,GAAGJ,qBAAqB;YACxBK,SAASJ,aAAaG;QACxB,CAAA;AACF"}
1
+ {"version":3,"sources":["../../../src/test-utils/polyfills/matchMedia.ts"],"sourcesContent":["import { BASE_MEDIA_QUERY_LIST, matchDesktop } from \"../mocks/match-media.js\";\n\nif (\n globalThis.window !== undefined &&\n typeof globalThis.matchMedia !== \"function\"\n) {\n globalThis.matchMedia = (query) => ({\n ...BASE_MEDIA_QUERY_LIST,\n matches: matchDesktop(query),\n });\n}\n"],"names":["BASE_MEDIA_QUERY_LIST","matchDesktop","globalThis","window","undefined","matchMedia","query","matches"],"mappings":"AAAA,SAASA,qBAAqB,EAAEC,YAAY,QAAQ,0BAA0B;AAE9E,IACEC,WAAWC,MAAM,KAAKC,aACtB,OAAOF,WAAWG,UAAU,KAAK,YACjC;IACAH,WAAWG,UAAU,GAAG,CAACC,QAAW,CAAA;YAClC,GAAGN,qBAAqB;YACxBO,SAASN,aAAaK;QACxB,CAAA;AACF"}
@@ -1,5 +1,5 @@
1
1
  // this polyfill was added to support the tree keyboard movement behavior
2
- if (typeof window !== "undefined") {
2
+ if (globalThis.window !== undefined) {
3
3
  // Based off of https://github.com/jsdom/jsdom/issues/1261#issuecomment-512217225
4
4
  //
5
5
  // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent
@@ -11,7 +11,7 @@ if (typeof window !== "undefined") {
11
11
  // - The element is <body> or <html>.
12
12
  Object.defineProperty(HTMLElement.prototype, "offsetParent", {
13
13
  get () {
14
- // eslint-disable-next-line @typescript-eslint/no-this-alias
14
+ // eslint-disable-next-line @typescript-eslint/no-this-alias, unicorn/no-this-assignment
15
15
  let element = this;
16
16
  while(element && // it'll almost always be an html element, unless using document fragments
17
17
  !element.hidden && element.style?.display?.toLowerCase() !== "none"){
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/test-utils/polyfills/offsetParent.ts"],"sourcesContent":["// this polyfill was added to support the tree keyboard movement behavior\nif (typeof window !== \"undefined\") {\n // Based off of https://github.com/jsdom/jsdom/issues/1261#issuecomment-512217225\n //\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n //\n // Note: offsetParent returns null in the following situations:\n //\n // - The element or any ancestor has the display property set to none.\n // - The element has the position property set to fixed (Firefox returns <body>).\n // - The element is <body> or <html>.\n Object.defineProperty(HTMLElement.prototype, \"offsetParent\", {\n get(this: HTMLElement) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let element: ParentNode | null = this;\n while (\n element &&\n // it'll almost always be an html element, unless using document fragments\n !(element as HTMLElement).hidden &&\n (element as HTMLElement).style?.display?.toLowerCase() !== \"none\"\n ) {\n element = element.parentNode;\n }\n\n if (\n // the current element or a parent has display: none\n element ||\n // the current element is fixed\n this.style?.position?.toLowerCase() === \"fixed\" ||\n this.tagName.toLowerCase() === \"html\" ||\n this.tagName.toLowerCase() === \"body\"\n ) {\n return null;\n }\n\n return this.parentNode;\n },\n });\n}\n"],"names":["window","Object","defineProperty","HTMLElement","prototype","get","element","hidden","style","display","toLowerCase","parentNode","position","tagName"],"mappings":"AAAA,yEAAyE;AACzE,IAAI,OAAOA,WAAW,aAAa;IACjC,iFAAiF;IACjF,EAAE;IACF,4EAA4E;IAC5E,EAAE;IACF,+DAA+D;IAC/D,EAAE;IACF,sEAAsE;IACtE,iFAAiF;IACjF,qCAAqC;IACrCC,OAAOC,cAAc,CAACC,YAAYC,SAAS,EAAE,gBAAgB;QAC3DC;YACE,4DAA4D;YAC5D,IAAIC,UAA6B,IAAI;YACrC,MACEA,WACA,0EAA0E;YAC1E,CAAC,AAACA,QAAwBC,MAAM,IAChC,AAACD,QAAwBE,KAAK,EAAEC,SAASC,kBAAkB,OAC3D;gBACAJ,UAAUA,QAAQK,UAAU;YAC9B;YAEA,IACE,oDAAoD;YACpDL,WACA,+BAA+B;YAC/B,IAAI,CAACE,KAAK,EAAEI,UAAUF,kBAAkB,WACxC,IAAI,CAACG,OAAO,CAACH,WAAW,OAAO,UAC/B,IAAI,CAACG,OAAO,CAACH,WAAW,OAAO,QAC/B;gBACA,OAAO;YACT;YAEA,OAAO,IAAI,CAACC,UAAU;QACxB;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/test-utils/polyfills/offsetParent.ts"],"sourcesContent":["// this polyfill was added to support the tree keyboard movement behavior\nif (globalThis.window !== undefined) {\n // Based off of https://github.com/jsdom/jsdom/issues/1261#issuecomment-512217225\n //\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n //\n // Note: offsetParent returns null in the following situations:\n //\n // - The element or any ancestor has the display property set to none.\n // - The element has the position property set to fixed (Firefox returns <body>).\n // - The element is <body> or <html>.\n Object.defineProperty(HTMLElement.prototype, \"offsetParent\", {\n get(this: HTMLElement) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias, unicorn/no-this-assignment\n let element: ParentNode | null = this;\n while (\n element &&\n // it'll almost always be an html element, unless using document fragments\n !(element as HTMLElement).hidden &&\n (element as HTMLElement).style?.display?.toLowerCase() !== \"none\"\n ) {\n element = element.parentNode;\n }\n\n if (\n // the current element or a parent has display: none\n element ||\n // the current element is fixed\n this.style?.position?.toLowerCase() === \"fixed\" ||\n this.tagName.toLowerCase() === \"html\" ||\n this.tagName.toLowerCase() === \"body\"\n ) {\n return null;\n }\n\n return this.parentNode;\n },\n });\n}\n"],"names":["globalThis","window","undefined","Object","defineProperty","HTMLElement","prototype","get","element","hidden","style","display","toLowerCase","parentNode","position","tagName"],"mappings":"AAAA,yEAAyE;AACzE,IAAIA,WAAWC,MAAM,KAAKC,WAAW;IACnC,iFAAiF;IACjF,EAAE;IACF,4EAA4E;IAC5E,EAAE;IACF,+DAA+D;IAC/D,EAAE;IACF,sEAAsE;IACtE,iFAAiF;IACjF,qCAAqC;IACrCC,OAAOC,cAAc,CAACC,YAAYC,SAAS,EAAE,gBAAgB;QAC3DC;YACE,wFAAwF;YACxF,IAAIC,UAA6B,IAAI;YACrC,MACEA,WACA,0EAA0E;YAC1E,CAAC,AAACA,QAAwBC,MAAM,IAChC,AAACD,QAAwBE,KAAK,EAAEC,SAASC,kBAAkB,OAC3D;gBACAJ,UAAUA,QAAQK,UAAU;YAC9B;YAEA,IACE,oDAAoD;YACpDL,WACA,+BAA+B;YAC/B,IAAI,CAACE,KAAK,EAAEI,UAAUF,kBAAkB,WACxC,IAAI,CAACG,OAAO,CAACH,WAAW,OAAO,UAC/B,IAAI,CAACG,OAAO,CAACH,WAAW,OAAO,QAC/B;gBACA,OAAO;YACT;YAEA,OAAO,IAAI,CAACC,UAAU;QACxB;IACF;AACF"}
@@ -1,4 +1,4 @@
1
- if (typeof window !== "undefined" && typeof HTMLElement.prototype.scrollIntoView !== "function") {
1
+ if (globalThis.window !== undefined && typeof HTMLElement.prototype.scrollIntoView !== "function") {
2
2
  // this is required for keyboard movement behavior
3
3
  HTMLElement.prototype.scrollIntoView = ()=>{
4
4
  // do nothing
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/test-utils/polyfills/scrollIntoView.ts"],"sourcesContent":["if (\n typeof window !== \"undefined\" &&\n typeof HTMLElement.prototype.scrollIntoView !== \"function\"\n) {\n // this is required for keyboard movement behavior\n HTMLElement.prototype.scrollIntoView = () => {\n // do nothing\n };\n}\n"],"names":["window","HTMLElement","prototype","scrollIntoView"],"mappings":"AAAA,IACE,OAAOA,WAAW,eAClB,OAAOC,YAAYC,SAAS,CAACC,cAAc,KAAK,YAChD;IACA,kDAAkD;IAClDF,YAAYC,SAAS,CAACC,cAAc,GAAG;IACrC,aAAa;IACf;AACF"}
1
+ {"version":3,"sources":["../../../src/test-utils/polyfills/scrollIntoView.ts"],"sourcesContent":["if (\n globalThis.window !== undefined &&\n typeof HTMLElement.prototype.scrollIntoView !== \"function\"\n) {\n // this is required for keyboard movement behavior\n HTMLElement.prototype.scrollIntoView = () => {\n // do nothing\n };\n}\n"],"names":["globalThis","window","undefined","HTMLElement","prototype","scrollIntoView"],"mappings":"AAAA,IACEA,WAAWC,MAAM,KAAKC,aACtB,OAAOC,YAAYC,SAAS,CAACC,cAAc,KAAK,YAChD;IACA,kDAAkD;IAClDF,YAAYC,SAAS,CAACC,cAAc,GAAG;IACrC,aAAa;IACf;AACF"}
@@ -38,7 +38,7 @@ import { screen, within } from "@testing-library/dom";
38
38
  });
39
39
  const selectedOption = select.firstElementChild;
40
40
  if (!(selectedOption instanceof HTMLDivElement)) {
41
- throw new Error("Unable to find the `Select` selected option element");
41
+ throw new TypeError("Unable to find the `Select` selected option element");
42
42
  }
43
43
  return {
44
44
  select,
@@ -57,7 +57,7 @@ import { screen, within } from "@testing-library/dom";
57
57
  });
58
58
  const selectedOption = select.firstElementChild;
59
59
  if (!(selectedOption instanceof HTMLDivElement)) {
60
- throw new Error("Unable to find the `Select` selected option element");
60
+ throw new TypeError("Unable to find the `Select` selected option element");
61
61
  }
62
62
  return {
63
63
  select,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/test-utils/queries/select.ts"],"sourcesContent":["import { screen, within } from \"@testing-library/dom\";\n\nimport { type GetPartsByRoleOptions } from \"./types.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface SelectTestElements {\n /**\n * The element that should be interacted with for showing and hiding the\n * listbox of available options in the `Select`.\n */\n select: HTMLDivElement;\n\n /**\n * The input element storing the current value for the `Select`. This should\n * be used to verify a specific option has been selected and will be the\n * `Option`'s `value` prop.\n *\n * i.e. Selecting `<Option value=\"a\">Option 1</Option>` -> `selectInput`\n * would have value `\"a\"`.\n */\n selectInput: HTMLInputElement;\n\n /**\n * The current selected option that is shown in the `Select` underneath the\n * floating label. This should be used if the selected option label needs to\n * be verified instead of the value.\n *\n * i.e. Selecting `<Option value=\"a\">Option 1</Option>` -> `selectedOption`\n * would have text content `\"Option 1\"`.\n */\n selectedOption: HTMLDivElement;\n}\n\n/**\n * @example Simple Example\n * ```tsx\n * import {\n * getSelectTestElements,\n * screen,\n * rmdRender,\n * userEvent,\n * } from \"@react-md/core/test-utils\";\n *\n * it(\"should be able to verify the display value\", async () => {\n * const user = userEvent.setup();\n * rmdRender(<SimpleSelect />);\n *\n * const { select, selectInput, selectedOption } = getSelectTestElements({\n * name: \"Label\",\n * });\n * // this isn't required, but added to show what element this is\n * expect(selectedOption).toHaveClass(\"rmd-selected-option\");\n *\n * // there is currently no selected value\n * expect(selectedOption).toHaveTextContent(\"\");\n *\n * await user.click(select);\n * await user.click(screen.getByRole(\"option\", { name: \"Option 1\" }));\n * expect(selectInput).toHaveValue(\"a\");\n * expect(selectedOption).toHaveTextContent(\"Option 1\");\n * });\n * ```\n *\n * @since 6.0.0\n */\nexport function getSelectTestElements(\n options: GetPartsByRoleOptions\n): SelectTestElements {\n const { container = screen, ...byRoleOptions } = options;\n const select = container.getByRole<HTMLDivElement>(\"combobox\", byRoleOptions);\n const selectInput = within(select).getByRole<HTMLInputElement>(\"textbox\", {\n hidden: true,\n });\n const selectedOption = select.firstElementChild;\n if (!(selectedOption instanceof HTMLDivElement)) {\n throw new Error(\"Unable to find the `Select` selected option element\");\n }\n\n return {\n select,\n selectInput,\n selectedOption,\n };\n}\n\n/**\n * @see {@link getSelectTestElements}\n * @since 6.0.0\n */\nexport async function findSelectTestElements(\n options: GetPartsByRoleOptions\n): Promise<SelectTestElements> {\n const { container = screen, ...byRoleOptions } = options;\n const select = await container.findByRole<HTMLDivElement>(\n \"combobox\",\n byRoleOptions\n );\n const selectInput = await within(select).findByRole<HTMLInputElement>(\n \"textbox\",\n {\n hidden: true,\n }\n );\n const selectedOption = select.firstElementChild;\n if (!(selectedOption instanceof HTMLDivElement)) {\n throw new Error(\"Unable to find the `Select` selected option element\");\n }\n\n return {\n select,\n selectInput,\n selectedOption,\n };\n}\n"],"names":["screen","within","getSelectTestElements","options","container","byRoleOptions","select","getByRole","selectInput","hidden","selectedOption","firstElementChild","HTMLDivElement","Error","findSelectTestElements","findByRole"],"mappings":"AAAA,SAASA,MAAM,EAAEC,MAAM,QAAQ,uBAAuB;AAmCtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BC,GACD,OAAO,SAASC,sBACdC,OAA8B;IAE9B,MAAM,EAAEC,YAAYJ,MAAM,EAAE,GAAGK,eAAe,GAAGF;IACjD,MAAMG,SAASF,UAAUG,SAAS,CAAiB,YAAYF;IAC/D,MAAMG,cAAcP,OAAOK,QAAQC,SAAS,CAAmB,WAAW;QACxEE,QAAQ;IACV;IACA,MAAMC,iBAAiBJ,OAAOK,iBAAiB;IAC/C,IAAI,CAAED,CAAAA,0BAA0BE,cAAa,GAAI;QAC/C,MAAM,IAAIC,MAAM;IAClB;IAEA,OAAO;QACLP;QACAE;QACAE;IACF;AACF;AAEA;;;CAGC,GACD,OAAO,eAAeI,uBACpBX,OAA8B;IAE9B,MAAM,EAAEC,YAAYJ,MAAM,EAAE,GAAGK,eAAe,GAAGF;IACjD,MAAMG,SAAS,MAAMF,UAAUW,UAAU,CACvC,YACAV;IAEF,MAAMG,cAAc,MAAMP,OAAOK,QAAQS,UAAU,CACjD,WACA;QACEN,QAAQ;IACV;IAEF,MAAMC,iBAAiBJ,OAAOK,iBAAiB;IAC/C,IAAI,CAAED,CAAAA,0BAA0BE,cAAa,GAAI;QAC/C,MAAM,IAAIC,MAAM;IAClB;IAEA,OAAO;QACLP;QACAE;QACAE;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/test-utils/queries/select.ts"],"sourcesContent":["import { screen, within } from \"@testing-library/dom\";\n\nimport { type GetPartsByRoleOptions } from \"./types.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface SelectTestElements {\n /**\n * The element that should be interacted with for showing and hiding the\n * listbox of available options in the `Select`.\n */\n select: HTMLDivElement;\n\n /**\n * The input element storing the current value for the `Select`. This should\n * be used to verify a specific option has been selected and will be the\n * `Option`'s `value` prop.\n *\n * i.e. Selecting `<Option value=\"a\">Option 1</Option>` -> `selectInput`\n * would have value `\"a\"`.\n */\n selectInput: HTMLInputElement;\n\n /**\n * The current selected option that is shown in the `Select` underneath the\n * floating label. This should be used if the selected option label needs to\n * be verified instead of the value.\n *\n * i.e. Selecting `<Option value=\"a\">Option 1</Option>` -> `selectedOption`\n * would have text content `\"Option 1\"`.\n */\n selectedOption: HTMLDivElement;\n}\n\n/**\n * @example Simple Example\n * ```tsx\n * import {\n * getSelectTestElements,\n * screen,\n * rmdRender,\n * userEvent,\n * } from \"@react-md/core/test-utils\";\n *\n * it(\"should be able to verify the display value\", async () => {\n * const user = userEvent.setup();\n * rmdRender(<SimpleSelect />);\n *\n * const { select, selectInput, selectedOption } = getSelectTestElements({\n * name: \"Label\",\n * });\n * // this isn't required, but added to show what element this is\n * expect(selectedOption).toHaveClass(\"rmd-selected-option\");\n *\n * // there is currently no selected value\n * expect(selectedOption).toHaveTextContent(\"\");\n *\n * await user.click(select);\n * await user.click(screen.getByRole(\"option\", { name: \"Option 1\" }));\n * expect(selectInput).toHaveValue(\"a\");\n * expect(selectedOption).toHaveTextContent(\"Option 1\");\n * });\n * ```\n *\n * @since 6.0.0\n */\nexport function getSelectTestElements(\n options: GetPartsByRoleOptions\n): SelectTestElements {\n const { container = screen, ...byRoleOptions } = options;\n const select = container.getByRole<HTMLDivElement>(\"combobox\", byRoleOptions);\n const selectInput = within(select).getByRole<HTMLInputElement>(\"textbox\", {\n hidden: true,\n });\n const selectedOption = select.firstElementChild;\n if (!(selectedOption instanceof HTMLDivElement)) {\n throw new TypeError(\"Unable to find the `Select` selected option element\");\n }\n\n return {\n select,\n selectInput,\n selectedOption,\n };\n}\n\n/**\n * @see {@link getSelectTestElements}\n * @since 6.0.0\n */\nexport async function findSelectTestElements(\n options: GetPartsByRoleOptions\n): Promise<SelectTestElements> {\n const { container = screen, ...byRoleOptions } = options;\n const select = await container.findByRole<HTMLDivElement>(\n \"combobox\",\n byRoleOptions\n );\n const selectInput = await within(select).findByRole<HTMLInputElement>(\n \"textbox\",\n {\n hidden: true,\n }\n );\n const selectedOption = select.firstElementChild;\n if (!(selectedOption instanceof HTMLDivElement)) {\n throw new TypeError(\"Unable to find the `Select` selected option element\");\n }\n\n return {\n select,\n selectInput,\n selectedOption,\n };\n}\n"],"names":["screen","within","getSelectTestElements","options","container","byRoleOptions","select","getByRole","selectInput","hidden","selectedOption","firstElementChild","HTMLDivElement","TypeError","findSelectTestElements","findByRole"],"mappings":"AAAA,SAASA,MAAM,EAAEC,MAAM,QAAQ,uBAAuB;AAmCtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BC,GACD,OAAO,SAASC,sBACdC,OAA8B;IAE9B,MAAM,EAAEC,YAAYJ,MAAM,EAAE,GAAGK,eAAe,GAAGF;IACjD,MAAMG,SAASF,UAAUG,SAAS,CAAiB,YAAYF;IAC/D,MAAMG,cAAcP,OAAOK,QAAQC,SAAS,CAAmB,WAAW;QACxEE,QAAQ;IACV;IACA,MAAMC,iBAAiBJ,OAAOK,iBAAiB;IAC/C,IAAI,CAAED,CAAAA,0BAA0BE,cAAa,GAAI;QAC/C,MAAM,IAAIC,UAAU;IACtB;IAEA,OAAO;QACLP;QACAE;QACAE;IACF;AACF;AAEA;;;CAGC,GACD,OAAO,eAAeI,uBACpBX,OAA8B;IAE9B,MAAM,EAAEC,YAAYJ,MAAM,EAAE,GAAGK,eAAe,GAAGF;IACjD,MAAMG,SAAS,MAAMF,UAAUW,UAAU,CACvC,YACAV;IAEF,MAAMG,cAAc,MAAMP,OAAOK,QAAQS,UAAU,CACjD,WACA;QACEN,QAAQ;IACV;IAEF,MAAMC,iBAAiBJ,OAAOK,iBAAiB;IAC/C,IAAI,CAAED,CAAAA,0BAA0BE,cAAa,GAAI;QAC/C,MAAM,IAAIC,UAAU;IACtB;IAEA,OAAO;QACLP;QACAE;QACAE;IACF;AACF"}
@@ -4,7 +4,7 @@ function getElements(slider) {
4
4
  const sliderTrack = slider.parentElement;
5
5
  const sliderContainer = sliderTrack?.parentElement;
6
6
  if (!(sliderInput instanceof HTMLInputElement)) {
7
- throw new Error("Unable to find the `Slider` input element");
7
+ throw new TypeError("Unable to find the `Slider` input element");
8
8
  }
9
9
  if (!(sliderTrack instanceof HTMLSpanElement) || !sliderTrack.classList.contains("rmd-slider-track")) {
10
10
  throw new Error("Unable to find the `Slider` track element");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/test-utils/queries/slider.ts"],"sourcesContent":["import {\n type BoundFunctions,\n type ByRoleOptions,\n type queries,\n screen,\n} from \"@testing-library/dom\";\n\nimport { type GetPartsByRoleOptions } from \"./types.js\";\n\ntype Elements = Omit<SliderTestElements, \"slider\">;\n\nfunction getElements(slider: HTMLSpanElement): Elements {\n const sliderInput = slider.nextElementSibling;\n const sliderTrack = slider.parentElement;\n const sliderContainer = sliderTrack?.parentElement;\n if (!(sliderInput instanceof HTMLInputElement)) {\n throw new Error(\"Unable to find the `Slider` input element\");\n }\n if (\n !(sliderTrack instanceof HTMLSpanElement) ||\n !sliderTrack.classList.contains(\"rmd-slider-track\")\n ) {\n throw new Error(\"Unable to find the `Slider` track element\");\n }\n if (\n !(sliderContainer instanceof HTMLDivElement) ||\n !sliderContainer.classList.contains(\"rmd-slider-container\")\n ) {\n throw new Error(\"Unable to find the `Slider` container element\");\n }\n\n return { sliderInput, sliderTrack, sliderContainer };\n}\n\n/**\n * @since 6.0.0\n */\nexport interface SliderTestElements {\n /**\n * The element that is visible to screen readers and can be updated using\n * drag, touch, or keyboard events. Since this is usually annoying for tests,\n * the `sliderInput` should normally be used instead.\n */\n slider: HTMLSpanElement;\n\n /**\n * The element that is hidden to screen readers but stores the current value\n * and can be updated using\n * `fireEvent.change(sliderInput, { target: { value: \"100\" }})`.\n */\n sliderInput: HTMLInputElement;\n\n /**\n * This is only useful when needing to verify that clicking somewhere on the\n * track updates the value. Most test cases can be solved through the\n * {@link slider} or {@link sliderInput} instead.\n */\n sliderTrack: HTMLSpanElement;\n\n /**\n * Returns the slider container element if it is needed for testing. It's\n * useful for simple snapshot tests.\n */\n sliderContainer: HTMLDivElement;\n}\n\n/**\n * @example Simple Example\n * ```tsx\n * function Test(): ReactElement {\n * const slider = useSlider({ defaultValue: 30 });\n * return <Slider {...slider} aria-label=\"Example\" />;\n * }\n *\n * rmdRender(<Test />);\n *\n * const { slider, sliderInput } = getSliderTestElements({ name: \"Example\" });\n *\n * expect(slider).toHaveValue(30);\n * expect(sliderInput).toHaveValue(\"30\");\n *\n * fireEvent.change(sliderInput, { target: { value: \"55\" }});\n * expect(slider).toHaveValue(55);\n * expect(sliderInput).toHaveValue(\"55\");\n * ```\n *\n * @since 6.0.0\n */\nexport function getSliderTestElements(\n options: GetPartsByRoleOptions\n): SliderTestElements {\n const { container = screen, ...byRoleOptions } = options;\n const slider = container.getByRole<HTMLSpanElement>(\"slider\", byRoleOptions);\n\n return {\n slider,\n ...getElements(slider),\n };\n}\n\n/**\n * @see {@link getSliderTestElements}\n * @since 6.0.0\n */\nexport async function findSliderTestElements(\n options: GetPartsByRoleOptions\n): Promise<SliderTestElements> {\n const { container = screen, ...byRoleOptions } = options;\n const slider = await container.findByRole<HTMLSpanElement>(\n \"slider\",\n byRoleOptions\n );\n\n return {\n slider,\n ...getElements(slider),\n };\n}\n\n/**\n * @since 6.0.0\n */\nexport interface GetRangeSliderTestElementsOptions {\n /** @defaultValue `screen` */\n container?: BoundFunctions<typeof queries>;\n\n /** @defaultValue `{ name: \"Min\" }` */\n min?: ByRoleOptions;\n\n /** @defaultValue `{ name: \"Max\" }` */\n max?: ByRoleOptions;\n}\n\n/**\n * @since 6.0.0\n */\nexport interface RangeSliderTestElements {\n /** @see {@link SliderTestElements.slider} */\n minSlider: HTMLSpanElement;\n /** @see {@link SliderTestElements.sliderInput} */\n minSliderInput: HTMLInputElement;\n /** @see {@link SliderTestElements.slider} */\n maxSlider: HTMLSpanElement;\n /** @see {@link SliderTestElements.sliderInput} */\n maxSliderInput: HTMLInputElement;\n /** @see {@link SliderTestElements.sliderTrack} */\n sliderTrack: HTMLSpanElement;\n /** @see {@link SliderTestElements.sliderContainer} */\n sliderContainer: HTMLDivElement;\n}\n\n/**\n * @example Simple Example\n * ```tsx\n * function Test(): ReactElement {\n * const slider = useRangeSlider({ defaultValue: [30, 60] });\n * return <Slider {...slider} aria-label=\"Example\" />;\n * }\n *\n * rmdRender(<Test />);\n *\n * const { slider, sliderInput } = getSliderTestElements();\n *\n * const { minSlider, minSliderInput, maxSlider, maxSliderInput } =\n * getRangeSliderTestElements();\n * expect(minSlider).toHaveValue(30);\n * expect(minSliderInput).toHaveValue(\"30\");\n * expect(maxSlider).toHaveAttribute(60);\n * expect(maxSliderInput).toHaveValue(\"60\");\n *\n * fireEvent.change(minSliderInput, { target: { value: \"55\" }});\n * expect(minSlider).toHaveValue(55);\n * expect(minSliderInput).toHaveValue(\"55\");\n * expect(maxSlider).toHaveAttribute(60);\n * expect(maxSliderInput).toHaveValue(\"60\");\n *\n * fireEvent.change(maxSliderInput, { target: { value: \"88\" }});\n * expect(minSlider).toHaveValue(55);\n * expect(minSliderInput).toHaveValue(\"55\");\n * expect(maxSlider).toHaveAttribute(88);\n * expect(maxSliderInput).toHaveValue(\"88\");\n * ```\n *\n * @since 6.0.0\n */\nexport function getRangeSliderTestElements(\n options: GetRangeSliderTestElementsOptions = {}\n): RangeSliderTestElements {\n const { container = screen, min, max } = options;\n const minSlider = container.getByRole<HTMLSpanElement>(\n \"slider\",\n min ?? { name: \"Min\" }\n );\n const maxSlider = container.getByRole<HTMLSpanElement>(\n \"slider\",\n max ?? { name: \"Max\" }\n );\n\n const {\n sliderInput: minSliderInput,\n sliderTrack,\n sliderContainer,\n } = getElements(minSlider);\n const { sliderInput: maxSliderInput } = getElements(maxSlider);\n\n return {\n minSlider,\n minSliderInput,\n maxSlider,\n maxSliderInput,\n sliderTrack,\n sliderContainer,\n };\n}\n\n/**\n * @see {@link getRangeSliderTestElements}\n * @since 6.0.0\n */\nexport async function findRangeSliderTestElements(\n options: GetRangeSliderTestElementsOptions = {}\n): Promise<RangeSliderTestElements> {\n const { container = screen, min, max } = options;\n const minSlider = await container.findByRole<HTMLSpanElement>(\n \"slider\",\n min ?? { name: \"Min\" }\n );\n const maxSlider = await container.findByRole<HTMLSpanElement>(\n \"slider\",\n max ?? { name: \"Max\" }\n );\n const {\n sliderInput: minSliderInput,\n sliderTrack,\n sliderContainer,\n } = getElements(minSlider);\n const { sliderInput: maxSliderInput } = getElements(maxSlider);\n\n return {\n minSlider,\n minSliderInput,\n maxSlider,\n maxSliderInput,\n sliderTrack,\n sliderContainer,\n };\n}\n"],"names":["screen","getElements","slider","sliderInput","nextElementSibling","sliderTrack","parentElement","sliderContainer","HTMLInputElement","Error","HTMLSpanElement","classList","contains","HTMLDivElement","getSliderTestElements","options","container","byRoleOptions","getByRole","findSliderTestElements","findByRole","getRangeSliderTestElements","min","max","minSlider","name","maxSlider","minSliderInput","maxSliderInput","findRangeSliderTestElements"],"mappings":"AAAA,SAIEA,MAAM,QACD,uBAAuB;AAM9B,SAASC,YAAYC,MAAuB;IAC1C,MAAMC,cAAcD,OAAOE,kBAAkB;IAC7C,MAAMC,cAAcH,OAAOI,aAAa;IACxC,MAAMC,kBAAkBF,aAAaC;IACrC,IAAI,CAAEH,CAAAA,uBAAuBK,gBAAe,GAAI;QAC9C,MAAM,IAAIC,MAAM;IAClB;IACA,IACE,CAAEJ,CAAAA,uBAAuBK,eAAc,KACvC,CAACL,YAAYM,SAAS,CAACC,QAAQ,CAAC,qBAChC;QACA,MAAM,IAAIH,MAAM;IAClB;IACA,IACE,CAAEF,CAAAA,2BAA2BM,cAAa,KAC1C,CAACN,gBAAgBI,SAAS,CAACC,QAAQ,CAAC,yBACpC;QACA,MAAM,IAAIH,MAAM;IAClB;IAEA,OAAO;QAAEN;QAAaE;QAAaE;IAAgB;AACrD;AAkCA;;;;;;;;;;;;;;;;;;;;;CAqBC,GACD,OAAO,SAASO,sBACdC,OAA8B;IAE9B,MAAM,EAAEC,YAAYhB,MAAM,EAAE,GAAGiB,eAAe,GAAGF;IACjD,MAAMb,SAASc,UAAUE,SAAS,CAAkB,UAAUD;IAE9D,OAAO;QACLf;QACA,GAAGD,YAAYC,OAAO;IACxB;AACF;AAEA;;;CAGC,GACD,OAAO,eAAeiB,uBACpBJ,OAA8B;IAE9B,MAAM,EAAEC,YAAYhB,MAAM,EAAE,GAAGiB,eAAe,GAAGF;IACjD,MAAMb,SAAS,MAAMc,UAAUI,UAAU,CACvC,UACAH;IAGF,OAAO;QACLf;QACA,GAAGD,YAAYC,OAAO;IACxB;AACF;AAkCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCC,GACD,OAAO,SAASmB,2BACdN,UAA6C,CAAC,CAAC;IAE/C,MAAM,EAAEC,YAAYhB,MAAM,EAAEsB,GAAG,EAAEC,GAAG,EAAE,GAAGR;IACzC,MAAMS,YAAYR,UAAUE,SAAS,CACnC,UACAI,OAAO;QAAEG,MAAM;IAAM;IAEvB,MAAMC,YAAYV,UAAUE,SAAS,CACnC,UACAK,OAAO;QAAEE,MAAM;IAAM;IAGvB,MAAM,EACJtB,aAAawB,cAAc,EAC3BtB,WAAW,EACXE,eAAe,EAChB,GAAGN,YAAYuB;IAChB,MAAM,EAAErB,aAAayB,cAAc,EAAE,GAAG3B,YAAYyB;IAEpD,OAAO;QACLF;QACAG;QACAD;QACAE;QACAvB;QACAE;IACF;AACF;AAEA;;;CAGC,GACD,OAAO,eAAesB,4BACpBd,UAA6C,CAAC,CAAC;IAE/C,MAAM,EAAEC,YAAYhB,MAAM,EAAEsB,GAAG,EAAEC,GAAG,EAAE,GAAGR;IACzC,MAAMS,YAAY,MAAMR,UAAUI,UAAU,CAC1C,UACAE,OAAO;QAAEG,MAAM;IAAM;IAEvB,MAAMC,YAAY,MAAMV,UAAUI,UAAU,CAC1C,UACAG,OAAO;QAAEE,MAAM;IAAM;IAEvB,MAAM,EACJtB,aAAawB,cAAc,EAC3BtB,WAAW,EACXE,eAAe,EAChB,GAAGN,YAAYuB;IAChB,MAAM,EAAErB,aAAayB,cAAc,EAAE,GAAG3B,YAAYyB;IAEpD,OAAO;QACLF;QACAG;QACAD;QACAE;QACAvB;QACAE;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/test-utils/queries/slider.ts"],"sourcesContent":["import {\n type BoundFunctions,\n type ByRoleOptions,\n type queries,\n screen,\n} from \"@testing-library/dom\";\n\nimport { type GetPartsByRoleOptions } from \"./types.js\";\n\ntype Elements = Omit<SliderTestElements, \"slider\">;\n\nfunction getElements(slider: HTMLSpanElement): Elements {\n const sliderInput = slider.nextElementSibling;\n const sliderTrack = slider.parentElement;\n const sliderContainer = sliderTrack?.parentElement;\n if (!(sliderInput instanceof HTMLInputElement)) {\n throw new TypeError(\"Unable to find the `Slider` input element\");\n }\n if (\n !(sliderTrack instanceof HTMLSpanElement) ||\n !sliderTrack.classList.contains(\"rmd-slider-track\")\n ) {\n throw new Error(\"Unable to find the `Slider` track element\");\n }\n if (\n !(sliderContainer instanceof HTMLDivElement) ||\n !sliderContainer.classList.contains(\"rmd-slider-container\")\n ) {\n throw new Error(\"Unable to find the `Slider` container element\");\n }\n\n return { sliderInput, sliderTrack, sliderContainer };\n}\n\n/**\n * @since 6.0.0\n */\nexport interface SliderTestElements {\n /**\n * The element that is visible to screen readers and can be updated using\n * drag, touch, or keyboard events. Since this is usually annoying for tests,\n * the `sliderInput` should normally be used instead.\n */\n slider: HTMLSpanElement;\n\n /**\n * The element that is hidden to screen readers but stores the current value\n * and can be updated using\n * `fireEvent.change(sliderInput, { target: { value: \"100\" }})`.\n */\n sliderInput: HTMLInputElement;\n\n /**\n * This is only useful when needing to verify that clicking somewhere on the\n * track updates the value. Most test cases can be solved through the\n * {@link slider} or {@link sliderInput} instead.\n */\n sliderTrack: HTMLSpanElement;\n\n /**\n * Returns the slider container element if it is needed for testing. It's\n * useful for simple snapshot tests.\n */\n sliderContainer: HTMLDivElement;\n}\n\n/**\n * @example Simple Example\n * ```tsx\n * function Test(): ReactElement {\n * const slider = useSlider({ defaultValue: 30 });\n * return <Slider {...slider} aria-label=\"Example\" />;\n * }\n *\n * rmdRender(<Test />);\n *\n * const { slider, sliderInput } = getSliderTestElements({ name: \"Example\" });\n *\n * expect(slider).toHaveValue(30);\n * expect(sliderInput).toHaveValue(\"30\");\n *\n * fireEvent.change(sliderInput, { target: { value: \"55\" }});\n * expect(slider).toHaveValue(55);\n * expect(sliderInput).toHaveValue(\"55\");\n * ```\n *\n * @since 6.0.0\n */\nexport function getSliderTestElements(\n options: GetPartsByRoleOptions\n): SliderTestElements {\n const { container = screen, ...byRoleOptions } = options;\n const slider = container.getByRole<HTMLSpanElement>(\"slider\", byRoleOptions);\n\n return {\n slider,\n ...getElements(slider),\n };\n}\n\n/**\n * @see {@link getSliderTestElements}\n * @since 6.0.0\n */\nexport async function findSliderTestElements(\n options: GetPartsByRoleOptions\n): Promise<SliderTestElements> {\n const { container = screen, ...byRoleOptions } = options;\n const slider = await container.findByRole<HTMLSpanElement>(\n \"slider\",\n byRoleOptions\n );\n\n return {\n slider,\n ...getElements(slider),\n };\n}\n\n/**\n * @since 6.0.0\n */\nexport interface GetRangeSliderTestElementsOptions {\n /** @defaultValue `screen` */\n container?: BoundFunctions<typeof queries>;\n\n /** @defaultValue `{ name: \"Min\" }` */\n min?: ByRoleOptions;\n\n /** @defaultValue `{ name: \"Max\" }` */\n max?: ByRoleOptions;\n}\n\n/**\n * @since 6.0.0\n */\nexport interface RangeSliderTestElements {\n /** @see {@link SliderTestElements.slider} */\n minSlider: HTMLSpanElement;\n /** @see {@link SliderTestElements.sliderInput} */\n minSliderInput: HTMLInputElement;\n /** @see {@link SliderTestElements.slider} */\n maxSlider: HTMLSpanElement;\n /** @see {@link SliderTestElements.sliderInput} */\n maxSliderInput: HTMLInputElement;\n /** @see {@link SliderTestElements.sliderTrack} */\n sliderTrack: HTMLSpanElement;\n /** @see {@link SliderTestElements.sliderContainer} */\n sliderContainer: HTMLDivElement;\n}\n\n/**\n * @example Simple Example\n * ```tsx\n * function Test(): ReactElement {\n * const slider = useRangeSlider({ defaultValue: [30, 60] });\n * return <Slider {...slider} aria-label=\"Example\" />;\n * }\n *\n * rmdRender(<Test />);\n *\n * const { slider, sliderInput } = getSliderTestElements();\n *\n * const { minSlider, minSliderInput, maxSlider, maxSliderInput } =\n * getRangeSliderTestElements();\n * expect(minSlider).toHaveValue(30);\n * expect(minSliderInput).toHaveValue(\"30\");\n * expect(maxSlider).toHaveAttribute(60);\n * expect(maxSliderInput).toHaveValue(\"60\");\n *\n * fireEvent.change(minSliderInput, { target: { value: \"55\" }});\n * expect(minSlider).toHaveValue(55);\n * expect(minSliderInput).toHaveValue(\"55\");\n * expect(maxSlider).toHaveAttribute(60);\n * expect(maxSliderInput).toHaveValue(\"60\");\n *\n * fireEvent.change(maxSliderInput, { target: { value: \"88\" }});\n * expect(minSlider).toHaveValue(55);\n * expect(minSliderInput).toHaveValue(\"55\");\n * expect(maxSlider).toHaveAttribute(88);\n * expect(maxSliderInput).toHaveValue(\"88\");\n * ```\n *\n * @since 6.0.0\n */\nexport function getRangeSliderTestElements(\n options: GetRangeSliderTestElementsOptions = {}\n): RangeSliderTestElements {\n const { container = screen, min, max } = options;\n const minSlider = container.getByRole<HTMLSpanElement>(\n \"slider\",\n min ?? { name: \"Min\" }\n );\n const maxSlider = container.getByRole<HTMLSpanElement>(\n \"slider\",\n max ?? { name: \"Max\" }\n );\n\n const {\n sliderInput: minSliderInput,\n sliderTrack,\n sliderContainer,\n } = getElements(minSlider);\n const { sliderInput: maxSliderInput } = getElements(maxSlider);\n\n return {\n minSlider,\n minSliderInput,\n maxSlider,\n maxSliderInput,\n sliderTrack,\n sliderContainer,\n };\n}\n\n/**\n * @see {@link getRangeSliderTestElements}\n * @since 6.0.0\n */\nexport async function findRangeSliderTestElements(\n options: GetRangeSliderTestElementsOptions = {}\n): Promise<RangeSliderTestElements> {\n const { container = screen, min, max } = options;\n const minSlider = await container.findByRole<HTMLSpanElement>(\n \"slider\",\n min ?? { name: \"Min\" }\n );\n const maxSlider = await container.findByRole<HTMLSpanElement>(\n \"slider\",\n max ?? { name: \"Max\" }\n );\n const {\n sliderInput: minSliderInput,\n sliderTrack,\n sliderContainer,\n } = getElements(minSlider);\n const { sliderInput: maxSliderInput } = getElements(maxSlider);\n\n return {\n minSlider,\n minSliderInput,\n maxSlider,\n maxSliderInput,\n sliderTrack,\n sliderContainer,\n };\n}\n"],"names":["screen","getElements","slider","sliderInput","nextElementSibling","sliderTrack","parentElement","sliderContainer","HTMLInputElement","TypeError","HTMLSpanElement","classList","contains","Error","HTMLDivElement","getSliderTestElements","options","container","byRoleOptions","getByRole","findSliderTestElements","findByRole","getRangeSliderTestElements","min","max","minSlider","name","maxSlider","minSliderInput","maxSliderInput","findRangeSliderTestElements"],"mappings":"AAAA,SAIEA,MAAM,QACD,uBAAuB;AAM9B,SAASC,YAAYC,MAAuB;IAC1C,MAAMC,cAAcD,OAAOE,kBAAkB;IAC7C,MAAMC,cAAcH,OAAOI,aAAa;IACxC,MAAMC,kBAAkBF,aAAaC;IACrC,IAAI,CAAEH,CAAAA,uBAAuBK,gBAAe,GAAI;QAC9C,MAAM,IAAIC,UAAU;IACtB;IACA,IACE,CAAEJ,CAAAA,uBAAuBK,eAAc,KACvC,CAACL,YAAYM,SAAS,CAACC,QAAQ,CAAC,qBAChC;QACA,MAAM,IAAIC,MAAM;IAClB;IACA,IACE,CAAEN,CAAAA,2BAA2BO,cAAa,KAC1C,CAACP,gBAAgBI,SAAS,CAACC,QAAQ,CAAC,yBACpC;QACA,MAAM,IAAIC,MAAM;IAClB;IAEA,OAAO;QAAEV;QAAaE;QAAaE;IAAgB;AACrD;AAkCA;;;;;;;;;;;;;;;;;;;;;CAqBC,GACD,OAAO,SAASQ,sBACdC,OAA8B;IAE9B,MAAM,EAAEC,YAAYjB,MAAM,EAAE,GAAGkB,eAAe,GAAGF;IACjD,MAAMd,SAASe,UAAUE,SAAS,CAAkB,UAAUD;IAE9D,OAAO;QACLhB;QACA,GAAGD,YAAYC,OAAO;IACxB;AACF;AAEA;;;CAGC,GACD,OAAO,eAAekB,uBACpBJ,OAA8B;IAE9B,MAAM,EAAEC,YAAYjB,MAAM,EAAE,GAAGkB,eAAe,GAAGF;IACjD,MAAMd,SAAS,MAAMe,UAAUI,UAAU,CACvC,UACAH;IAGF,OAAO;QACLhB;QACA,GAAGD,YAAYC,OAAO;IACxB;AACF;AAkCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCC,GACD,OAAO,SAASoB,2BACdN,UAA6C,CAAC,CAAC;IAE/C,MAAM,EAAEC,YAAYjB,MAAM,EAAEuB,GAAG,EAAEC,GAAG,EAAE,GAAGR;IACzC,MAAMS,YAAYR,UAAUE,SAAS,CACnC,UACAI,OAAO;QAAEG,MAAM;IAAM;IAEvB,MAAMC,YAAYV,UAAUE,SAAS,CACnC,UACAK,OAAO;QAAEE,MAAM;IAAM;IAGvB,MAAM,EACJvB,aAAayB,cAAc,EAC3BvB,WAAW,EACXE,eAAe,EAChB,GAAGN,YAAYwB;IAChB,MAAM,EAAEtB,aAAa0B,cAAc,EAAE,GAAG5B,YAAY0B;IAEpD,OAAO;QACLF;QACAG;QACAD;QACAE;QACAxB;QACAE;IACF;AACF;AAEA;;;CAGC,GACD,OAAO,eAAeuB,4BACpBd,UAA6C,CAAC,CAAC;IAE/C,MAAM,EAAEC,YAAYjB,MAAM,EAAEuB,GAAG,EAAEC,GAAG,EAAE,GAAGR;IACzC,MAAMS,YAAY,MAAMR,UAAUI,UAAU,CAC1C,UACAE,OAAO;QAAEG,MAAM;IAAM;IAEvB,MAAMC,YAAY,MAAMV,UAAUI,UAAU,CAC1C,UACAG,OAAO;QAAEE,MAAM;IAAM;IAEvB,MAAM,EACJvB,aAAayB,cAAc,EAC3BvB,WAAW,EACXE,eAAe,EAChB,GAAGN,YAAYwB;IAChB,MAAM,EAAEtB,aAAa0B,cAAc,EAAE,GAAG5B,YAAY0B;IAEpD,OAAO;QACLF;QACAG;QACAD;QACAE;QACAxB;QACAE;IACF;AACF"}
@@ -11,11 +11,13 @@
11
11
  // needs to be `any` to match the FileList definition
12
12
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
13
  [Symbol.iterator]: function* nextFile() {
14
+ // eslint-disable-next-line unicorn/no-for-loop
14
15
  for(let i = 0; i < fileList.length; i++){
15
16
  yield fileList[i];
16
17
  }
17
18
  }
18
19
  };
20
+ // eslint-disable-next-line unicorn/no-immediate-mutation
19
21
  fileList.constructor = window.FileList;
20
22
  if (window.FileList) {
21
23
  Object.setPrototypeOf(fileList, window.FileList.prototype);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/test-utils/utils/createFileList.ts"],"sourcesContent":["/**\n * @see https://github.com/testing-library/user-event/blob/d42954be66484bcf78486a298cc37f8a7c9e4bea/src/utils/dataTransfer/FileList.ts\n */\nexport function createFileList(\n window: Window & typeof globalThis,\n fileOrFiles: File | readonly File[]\n): FileList & Iterable<File> {\n const files = Array.isArray(fileOrFiles) ? fileOrFiles : [fileOrFiles];\n const fileList: FileList & Iterable<File> = {\n ...files,\n length: files.length,\n item: (index) => fileList[index],\n // needs to be `any` to match the FileList definition\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [Symbol.iterator]: function* nextFile(): Generator<File, any, any> {\n for (let i = 0; i < fileList.length; i++) {\n yield fileList[i];\n }\n },\n };\n fileList.constructor = window.FileList;\n if (window.FileList) {\n Object.setPrototypeOf(fileList, window.FileList.prototype);\n }\n Object.freeze(fileList);\n return fileList;\n}\n"],"names":["createFileList","window","fileOrFiles","files","Array","isArray","fileList","length","item","index","Symbol","iterator","nextFile","i","FileList","Object","setPrototypeOf","prototype","freeze"],"mappings":"AAAA;;CAEC,GACD,OAAO,SAASA,eACdC,MAAkC,EAClCC,WAAmC;IAEnC,MAAMC,QAAQC,MAAMC,OAAO,CAACH,eAAeA,cAAc;QAACA;KAAY;IACtE,MAAMI,WAAsC;QAC1C,GAAGH,KAAK;QACRI,QAAQJ,MAAMI,MAAM;QACpBC,MAAM,CAACC,QAAUH,QAAQ,CAACG,MAAM;QAChC,qDAAqD;QACrD,8DAA8D;QAC9D,CAACC,OAAOC,QAAQ,CAAC,EAAE,UAAUC;YAC3B,IAAK,IAAIC,IAAI,GAAGA,IAAIP,SAASC,MAAM,EAAEM,IAAK;gBACxC,MAAMP,QAAQ,CAACO,EAAE;YACnB;QACF;IACF;IACAP,SAAS,WAAW,GAAGL,OAAOa,QAAQ;IACtC,IAAIb,OAAOa,QAAQ,EAAE;QACnBC,OAAOC,cAAc,CAACV,UAAUL,OAAOa,QAAQ,CAACG,SAAS;IAC3D;IACAF,OAAOG,MAAM,CAACZ;IACd,OAAOA;AACT"}
1
+ {"version":3,"sources":["../../../src/test-utils/utils/createFileList.ts"],"sourcesContent":["/**\n * @see https://github.com/testing-library/user-event/blob/d42954be66484bcf78486a298cc37f8a7c9e4bea/src/utils/dataTransfer/FileList.ts\n */\nexport function createFileList(\n window: Window & typeof globalThis,\n fileOrFiles: File | readonly File[]\n): FileList & Iterable<File> {\n const files = Array.isArray(fileOrFiles) ? fileOrFiles : [fileOrFiles];\n const fileList: FileList & Iterable<File> = {\n ...files,\n length: files.length,\n item: (index) => fileList[index],\n // needs to be `any` to match the FileList definition\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [Symbol.iterator]: function* nextFile(): Generator<File, any, any> {\n // eslint-disable-next-line unicorn/no-for-loop\n for (let i = 0; i < fileList.length; i++) {\n yield fileList[i];\n }\n },\n };\n // eslint-disable-next-line unicorn/no-immediate-mutation\n fileList.constructor = window.FileList;\n if (window.FileList) {\n Object.setPrototypeOf(fileList, window.FileList.prototype);\n }\n Object.freeze(fileList);\n return fileList;\n}\n"],"names":["createFileList","window","fileOrFiles","files","Array","isArray","fileList","length","item","index","Symbol","iterator","nextFile","i","FileList","Object","setPrototypeOf","prototype","freeze"],"mappings":"AAAA;;CAEC,GACD,OAAO,SAASA,eACdC,MAAkC,EAClCC,WAAmC;IAEnC,MAAMC,QAAQC,MAAMC,OAAO,CAACH,eAAeA,cAAc;QAACA;KAAY;IACtE,MAAMI,WAAsC;QAC1C,GAAGH,KAAK;QACRI,QAAQJ,MAAMI,MAAM;QACpBC,MAAM,CAACC,QAAUH,QAAQ,CAACG,MAAM;QAChC,qDAAqD;QACrD,8DAA8D;QAC9D,CAACC,OAAOC,QAAQ,CAAC,EAAE,UAAUC;YAC3B,+CAA+C;YAC/C,IAAK,IAAIC,IAAI,GAAGA,IAAIP,SAASC,MAAM,EAAEM,IAAK;gBACxC,MAAMP,QAAQ,CAACO,EAAE;YACnB;QACF;IACF;IACA,yDAAyD;IACzDP,SAAS,WAAW,GAAGL,OAAOa,QAAQ;IACtC,IAAIb,OAAOa,QAAQ,EAAE;QACnBC,OAAOC,cAAc,CAACV,UAAUL,OAAOa,QAAQ,CAACG,SAAS;IAC3D;IACAF,OAAOG,MAAM,CAACZ;IACd,OAAOA;AACT"}
@@ -3,7 +3,7 @@ import { type MatchMediaChangeViewport, type MatchMediaMatcher } from "../mocks/
3
3
  * @since 6.0.0
4
4
  */
5
5
  export interface MatchMediaMockFunction {
6
- mockImplementation(fn: typeof window.matchMedia): this;
6
+ mockImplementation(fn: typeof globalThis.matchMedia): this;
7
7
  }
8
8
  /**
9
9
  * Used to create a `spyOn(window, "matchMedia")` without knowing the test
@@ -51,15 +51,15 @@ import { BASE_MEDIA_QUERY_LIST, matchDesktop } from "../mocks/match-media.js";
51
51
  }));
52
52
  const changeViewport = (matcher, disableAct = false)=>{
53
53
  const update = ()=>{
54
- window.dispatchEvent(new Event("resize"));
54
+ globalThis.dispatchEvent(new Event("resize"));
55
55
  const event = new Event("change");
56
- listeners.forEach((listener, query)=>{
56
+ for (const [query, listener] of listeners.entries()){
57
57
  listener({
58
58
  ...event,
59
59
  media: "",
60
60
  matches: matcher(query)
61
61
  });
62
- });
62
+ }
63
63
  };
64
64
  if (disableAct) {
65
65
  update();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/test-utils/utils/createMatchMediaSpy.ts"],"sourcesContent":["import { act } from \"@testing-library/react\";\n\nimport {\n BASE_MEDIA_QUERY_LIST,\n type MatchMediaChangeViewport,\n type MatchMediaMatcher,\n matchDesktop,\n} from \"../mocks/match-media.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface MatchMediaMockFunction {\n mockImplementation(fn: typeof window.matchMedia): this;\n}\n\n/**\n * Used to create a `spyOn(window, \"matchMedia\")` without knowing the test\n * framework.\n *\n * @example Setup Test Framework\n * ```tsx\n * export function spyOnMatchMedia(\n * defaultMatch: MatchMediaMatcher = matchDesktop\n * ): jest.SpiedFunction<typeof window.matchMedia> & MatchMediaChangeViewport {\n * return createMatchMediaSpy(jest.spyOn(window, \"matchMedia\"), defaultMatch);\n * }\n * ```\n *\n * NOTE: The `spyOnMatchMedia` function **must** not call the `.spyOn`\n * immediately to work correctly. The spy needs to be invoked whenever this is\n * called instead. For example, this is bad and will fail:\n *\n * @example Bad Example\n * ```tsx\n * export const spyOnMatchMedia = createMatchMediaSpy.bind(null, jest.spy(window, \"matchMedia\"));\n * ```\n *\n * This is mostly a reminder to myself since I wanted something like the\n * following code, but failed:\n *\n * ```ts\n * export const spyOnMatchMedia = createMatchMediaSpy(jest.spyOn(window, \"matchMedia\"));\n * ```\n *\n * @since 6.0.0\n * @internal\n */\nexport function createMatchMediaSpy<SpyFunction extends MatchMediaMockFunction>(\n matchMediaSpy: SpyFunction,\n defaultMatch: MatchMediaMatcher = matchDesktop\n): SpyFunction & MatchMediaChangeViewport {\n type Listener = (event: MediaQueryListEvent) => void;\n\n const listeners = new Map<string, Listener>();\n const matchMedia = matchMediaSpy.mockImplementation((query) => ({\n ...BASE_MEDIA_QUERY_LIST,\n addEventListener(type: string, listener: Listener | EventListenerObject) {\n /* c8 ignore start */\n if (typeof listener !== \"function\" || type !== \"change\") {\n return;\n }\n /* c8 ignore stop */\n\n listeners.set(query, listener);\n },\n removeEventListener(\n type: string,\n listener: Listener | EventListenerObject\n ) {\n /* c8 ignore start */\n if (typeof listener !== \"function\" || type !== \"change\") {\n return;\n }\n /* c8 ignore stop */\n\n listeners.delete(query);\n },\n matches: defaultMatch(query),\n }));\n\n const changeViewport = (\n matcher: MatchMediaMatcher,\n disableAct = false\n ): void => {\n const update = (): void => {\n window.dispatchEvent(new Event(\"resize\"));\n\n const event = new Event(\"change\");\n listeners.forEach((listener, query) => {\n listener({\n ...event,\n media: \"\",\n matches: matcher(query),\n });\n });\n };\n if (disableAct) {\n update();\n } else {\n act(update);\n }\n };\n\n const mock = matchMedia as SpyFunction & MatchMediaChangeViewport;\n mock.changeViewport = changeViewport;\n\n return mock;\n}\n"],"names":["act","BASE_MEDIA_QUERY_LIST","matchDesktop","createMatchMediaSpy","matchMediaSpy","defaultMatch","listeners","Map","matchMedia","mockImplementation","query","addEventListener","type","listener","set","removeEventListener","delete","matches","changeViewport","matcher","disableAct","update","window","dispatchEvent","Event","event","forEach","media","mock"],"mappings":"AAAA,SAASA,GAAG,QAAQ,yBAAyB;AAE7C,SACEC,qBAAqB,EAGrBC,YAAY,QACP,0BAA0B;AASjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BC,GACD,OAAO,SAASC,oBACdC,aAA0B,EAC1BC,eAAkCH,YAAY;IAI9C,MAAMI,YAAY,IAAIC;IACtB,MAAMC,aAAaJ,cAAcK,kBAAkB,CAAC,CAACC,QAAW,CAAA;YAC9D,GAAGT,qBAAqB;YACxBU,kBAAiBC,IAAY,EAAEC,QAAwC;gBACrE,mBAAmB,GACnB,IAAI,OAAOA,aAAa,cAAcD,SAAS,UAAU;oBACvD;gBACF;gBACA,kBAAkB,GAElBN,UAAUQ,GAAG,CAACJ,OAAOG;YACvB;YACAE,qBACEH,IAAY,EACZC,QAAwC;gBAExC,mBAAmB,GACnB,IAAI,OAAOA,aAAa,cAAcD,SAAS,UAAU;oBACvD;gBACF;gBACA,kBAAkB,GAElBN,UAAUU,MAAM,CAACN;YACnB;YACAO,SAASZ,aAAaK;QACxB,CAAA;IAEA,MAAMQ,iBAAiB,CACrBC,SACAC,aAAa,KAAK;QAElB,MAAMC,SAAS;YACbC,OAAOC,aAAa,CAAC,IAAIC,MAAM;YAE/B,MAAMC,QAAQ,IAAID,MAAM;YACxBlB,UAAUoB,OAAO,CAAC,CAACb,UAAUH;gBAC3BG,SAAS;oBACP,GAAGY,KAAK;oBACRE,OAAO;oBACPV,SAASE,QAAQT;gBACnB;YACF;QACF;QACA,IAAIU,YAAY;YACdC;QACF,OAAO;YACLrB,IAAIqB;QACN;IACF;IAEA,MAAMO,OAAOpB;IACboB,KAAKV,cAAc,GAAGA;IAEtB,OAAOU;AACT"}
1
+ {"version":3,"sources":["../../../src/test-utils/utils/createMatchMediaSpy.ts"],"sourcesContent":["import { act } from \"@testing-library/react\";\n\nimport {\n BASE_MEDIA_QUERY_LIST,\n type MatchMediaChangeViewport,\n type MatchMediaMatcher,\n matchDesktop,\n} from \"../mocks/match-media.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface MatchMediaMockFunction {\n mockImplementation(fn: typeof globalThis.matchMedia): this;\n}\n\n/**\n * Used to create a `spyOn(window, \"matchMedia\")` without knowing the test\n * framework.\n *\n * @example Setup Test Framework\n * ```tsx\n * export function spyOnMatchMedia(\n * defaultMatch: MatchMediaMatcher = matchDesktop\n * ): jest.SpiedFunction<typeof window.matchMedia> & MatchMediaChangeViewport {\n * return createMatchMediaSpy(jest.spyOn(window, \"matchMedia\"), defaultMatch);\n * }\n * ```\n *\n * NOTE: The `spyOnMatchMedia` function **must** not call the `.spyOn`\n * immediately to work correctly. The spy needs to be invoked whenever this is\n * called instead. For example, this is bad and will fail:\n *\n * @example Bad Example\n * ```tsx\n * export const spyOnMatchMedia = createMatchMediaSpy.bind(null, jest.spy(window, \"matchMedia\"));\n * ```\n *\n * This is mostly a reminder to myself since I wanted something like the\n * following code, but failed:\n *\n * ```ts\n * export const spyOnMatchMedia = createMatchMediaSpy(jest.spyOn(window, \"matchMedia\"));\n * ```\n *\n * @since 6.0.0\n * @internal\n */\nexport function createMatchMediaSpy<SpyFunction extends MatchMediaMockFunction>(\n matchMediaSpy: SpyFunction,\n defaultMatch: MatchMediaMatcher = matchDesktop\n): SpyFunction & MatchMediaChangeViewport {\n type Listener = (event: MediaQueryListEvent) => void;\n\n const listeners = new Map<string, Listener>();\n const matchMedia = matchMediaSpy.mockImplementation((query) => ({\n ...BASE_MEDIA_QUERY_LIST,\n addEventListener(type: string, listener: Listener | EventListenerObject) {\n /* c8 ignore start */\n if (typeof listener !== \"function\" || type !== \"change\") {\n return;\n }\n /* c8 ignore stop */\n\n listeners.set(query, listener);\n },\n removeEventListener(\n type: string,\n listener: Listener | EventListenerObject\n ) {\n /* c8 ignore start */\n if (typeof listener !== \"function\" || type !== \"change\") {\n return;\n }\n /* c8 ignore stop */\n\n listeners.delete(query);\n },\n matches: defaultMatch(query),\n }));\n\n const changeViewport = (\n matcher: MatchMediaMatcher,\n disableAct = false\n ): void => {\n const update = (): void => {\n globalThis.dispatchEvent(new Event(\"resize\"));\n\n const event = new Event(\"change\");\n for (const [query, listener] of listeners.entries()) {\n listener({\n ...event,\n media: \"\",\n matches: matcher(query),\n });\n }\n };\n if (disableAct) {\n update();\n } else {\n act(update);\n }\n };\n\n const mock = matchMedia as SpyFunction & MatchMediaChangeViewport;\n mock.changeViewport = changeViewport;\n\n return mock;\n}\n"],"names":["act","BASE_MEDIA_QUERY_LIST","matchDesktop","createMatchMediaSpy","matchMediaSpy","defaultMatch","listeners","Map","matchMedia","mockImplementation","query","addEventListener","type","listener","set","removeEventListener","delete","matches","changeViewport","matcher","disableAct","update","globalThis","dispatchEvent","Event","event","entries","media","mock"],"mappings":"AAAA,SAASA,GAAG,QAAQ,yBAAyB;AAE7C,SACEC,qBAAqB,EAGrBC,YAAY,QACP,0BAA0B;AASjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BC,GACD,OAAO,SAASC,oBACdC,aAA0B,EAC1BC,eAAkCH,YAAY;IAI9C,MAAMI,YAAY,IAAIC;IACtB,MAAMC,aAAaJ,cAAcK,kBAAkB,CAAC,CAACC,QAAW,CAAA;YAC9D,GAAGT,qBAAqB;YACxBU,kBAAiBC,IAAY,EAAEC,QAAwC;gBACrE,mBAAmB,GACnB,IAAI,OAAOA,aAAa,cAAcD,SAAS,UAAU;oBACvD;gBACF;gBACA,kBAAkB,GAElBN,UAAUQ,GAAG,CAACJ,OAAOG;YACvB;YACAE,qBACEH,IAAY,EACZC,QAAwC;gBAExC,mBAAmB,GACnB,IAAI,OAAOA,aAAa,cAAcD,SAAS,UAAU;oBACvD;gBACF;gBACA,kBAAkB,GAElBN,UAAUU,MAAM,CAACN;YACnB;YACAO,SAASZ,aAAaK;QACxB,CAAA;IAEA,MAAMQ,iBAAiB,CACrBC,SACAC,aAAa,KAAK;QAElB,MAAMC,SAAS;YACbC,WAAWC,aAAa,CAAC,IAAIC,MAAM;YAEnC,MAAMC,QAAQ,IAAID,MAAM;YACxB,KAAK,MAAM,CAACd,OAAOG,SAAS,IAAIP,UAAUoB,OAAO,GAAI;gBACnDb,SAAS;oBACP,GAAGY,KAAK;oBACRE,OAAO;oBACPV,SAASE,QAAQT;gBACnB;YACF;QACF;QACA,IAAIU,YAAY;YACdC;QACF,OAAO;YACLrB,IAAIqB;QACN;IACF;IAEA,MAAMO,OAAOpB;IACboB,KAAKV,cAAc,GAAGA;IAEtB,OAAOU;AACT"}
@@ -28,4 +28,4 @@ import { type MatchMediaChangeViewport, type MatchMediaMatcher } from "../mocks/
28
28
  *
29
29
  * @since 6.0.0
30
30
  */
31
- export declare function spyOnMatchMedia(defaultMatch?: MatchMediaMatcher): MockInstance<typeof window.matchMedia> & MatchMediaChangeViewport;
31
+ export declare function spyOnMatchMedia(defaultMatch?: MatchMediaMatcher): MockInstance<typeof globalThis.matchMedia> & MatchMediaChangeViewport;
@@ -29,7 +29,7 @@ import { createMatchMediaSpy } from "../utils/createMatchMediaSpy.js";
29
29
  *
30
30
  * @since 6.0.0
31
31
  */ export function spyOnMatchMedia(defaultMatch = matchDesktop) {
32
- return createMatchMediaSpy(vi.spyOn(window, "matchMedia"), defaultMatch);
32
+ return createMatchMediaSpy(vi.spyOn(globalThis, "matchMedia"), defaultMatch);
33
33
  }
34
34
 
35
35
  //# sourceMappingURL=match-media.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/test-utils/vitest/match-media.ts"],"sourcesContent":["import { type MockInstance, vi } from \"vitest\";\n\nimport {\n type MatchMediaChangeViewport,\n type MatchMediaMatcher,\n matchDesktop,\n} from \"../mocks/match-media.js\";\nimport { createMatchMediaSpy } from \"../utils/createMatchMediaSpy.js\";\n\n/**\n * @example Default Behavior\n * ```tsx\n * import { matchPhone, render } from \"@react-md/core/test-utils\";\n * import { spyOnMatchMedia } from \"@react-md/core/test-utils/vitest\";\n *\n * const matchMedia = spyOnMatchMedia();\n * render(<Test />);\n *\n * // expect desktop results\n *\n * matchMedia.changeViewport(matchPhone);\n * // expect phone results\n * ```\n *\n * @example Set Default Media\n * ```tsx\n * import { matchPhone, render } from \"@react-md/core/test-utils\";\n * import { spyOnMatchMedia } from \"@react-md/core/test-utils/vitest\";\n *\n * const matchMedia = spyOnMatchMedia(matchPhone);\n * render(<Test />);\n *\n * // expect phone results\n * ```\n *\n * @since 6.0.0\n */\nexport function spyOnMatchMedia(\n defaultMatch: MatchMediaMatcher = matchDesktop\n): MockInstance<typeof window.matchMedia> & MatchMediaChangeViewport {\n return createMatchMediaSpy(vi.spyOn(window, \"matchMedia\"), defaultMatch);\n}\n"],"names":["vi","matchDesktop","createMatchMediaSpy","spyOnMatchMedia","defaultMatch","spyOn","window"],"mappings":"AAAA,SAA4BA,EAAE,QAAQ,SAAS;AAE/C,SAGEC,YAAY,QACP,0BAA0B;AACjC,SAASC,mBAAmB,QAAQ,kCAAkC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BC,GACD,OAAO,SAASC,gBACdC,eAAkCH,YAAY;IAE9C,OAAOC,oBAAoBF,GAAGK,KAAK,CAACC,QAAQ,eAAeF;AAC7D"}
1
+ {"version":3,"sources":["../../../src/test-utils/vitest/match-media.ts"],"sourcesContent":["import { type MockInstance, vi } from \"vitest\";\n\nimport {\n type MatchMediaChangeViewport,\n type MatchMediaMatcher,\n matchDesktop,\n} from \"../mocks/match-media.js\";\nimport { createMatchMediaSpy } from \"../utils/createMatchMediaSpy.js\";\n\n/**\n * @example Default Behavior\n * ```tsx\n * import { matchPhone, render } from \"@react-md/core/test-utils\";\n * import { spyOnMatchMedia } from \"@react-md/core/test-utils/vitest\";\n *\n * const matchMedia = spyOnMatchMedia();\n * render(<Test />);\n *\n * // expect desktop results\n *\n * matchMedia.changeViewport(matchPhone);\n * // expect phone results\n * ```\n *\n * @example Set Default Media\n * ```tsx\n * import { matchPhone, render } from \"@react-md/core/test-utils\";\n * import { spyOnMatchMedia } from \"@react-md/core/test-utils/vitest\";\n *\n * const matchMedia = spyOnMatchMedia(matchPhone);\n * render(<Test />);\n *\n * // expect phone results\n * ```\n *\n * @since 6.0.0\n */\nexport function spyOnMatchMedia(\n defaultMatch: MatchMediaMatcher = matchDesktop\n): MockInstance<typeof globalThis.matchMedia> & MatchMediaChangeViewport {\n return createMatchMediaSpy(vi.spyOn(globalThis, \"matchMedia\"), defaultMatch);\n}\n"],"names":["vi","matchDesktop","createMatchMediaSpy","spyOnMatchMedia","defaultMatch","spyOn","globalThis"],"mappings":"AAAA,SAA4BA,EAAE,QAAQ,SAAS;AAE/C,SAGEC,YAAY,QACP,0BAA0B;AACjC,SAASC,mBAAmB,QAAQ,kCAAkC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BC,GACD,OAAO,SAASC,gBACdC,eAAkCH,YAAY;IAE9C,OAAOC,oBAAoBF,GAAGK,KAAK,CAACC,YAAY,eAAeF;AACjE"}
@@ -34,7 +34,7 @@ import { vi } from "vitest";
34
34
  * ```
35
35
  *
36
36
  * @since 6.0.0
37
- */ export const testImmediateRaf = ()=>vi.spyOn(window, "requestAnimationFrame").mockImplementation((cb)=>{
37
+ */ export const testImmediateRaf = ()=>vi.spyOn(globalThis, "requestAnimationFrame").mockImplementation((cb)=>{
38
38
  cb(0);
39
39
  return 0;
40
40
  });