@astryxdesign/core 0.4.4 → 0.4.5-canary.0472ec1

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 (522) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/AvatarGroup/AvatarGroupOverflow.js +1 -1
  3. package/dist/Blockquote/Blockquote.d.ts +4 -3
  4. package/dist/Blockquote/Blockquote.d.ts.map +1 -1
  5. package/dist/Blockquote/Blockquote.js +9 -10
  6. package/dist/BottomSheet/BottomSheet.d.ts +11 -2
  7. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  8. package/dist/BottomSheet/BottomSheet.js +4 -0
  9. package/dist/BottomSheet/BottomSheetPanel.d.ts +5 -2
  10. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  11. package/dist/BottomSheet/BottomSheetPanel.js +77 -18
  12. package/dist/BottomSheet/index.d.ts +1 -1
  13. package/dist/BottomSheet/index.d.ts.map +1 -1
  14. package/dist/BottomSheet/snapOffsets.d.ts +57 -20
  15. package/dist/BottomSheet/snapOffsets.d.ts.map +1 -1
  16. package/dist/BottomSheet/snapOffsets.js +106 -30
  17. package/dist/BottomSheet/useSheetGestures.d.ts +13 -8
  18. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  19. package/dist/BottomSheet/useSheetGestures.js +160 -64
  20. package/dist/Breadcrumbs/BreadcrumbItem.js +6 -6
  21. package/dist/Button/Button.js +5 -5
  22. package/dist/Calendar/Calendar.d.ts +17 -0
  23. package/dist/Calendar/Calendar.d.ts.map +1 -1
  24. package/dist/Calendar/Calendar.js +55 -15
  25. package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts +14 -0
  26. package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts.map +1 -0
  27. package/dist/Calendar/getStandaloneShortWeekdayNames.js +26 -0
  28. package/dist/Calendar/hooks/useCalendarConstraints.d.ts +22 -1
  29. package/dist/Calendar/hooks/useCalendarConstraints.d.ts.map +1 -1
  30. package/dist/Calendar/hooks/useCalendarConstraints.js +26 -4
  31. package/dist/Calendar/hooks/useCalendarDays.d.ts.map +1 -1
  32. package/dist/Calendar/hooks/useCalendarDays.js +14 -10
  33. package/dist/Calendar/hooks/useCalendarNavigation.d.ts.map +1 -1
  34. package/dist/Calendar/hooks/useCalendarNavigation.js +8 -4
  35. package/dist/Calendar/standaloneShortWeekdayNames.generated.d.ts +47 -0
  36. package/dist/Calendar/standaloneShortWeekdayNames.generated.d.ts.map +1 -0
  37. package/dist/Calendar/standaloneShortWeekdayNames.generated.js +40 -0
  38. package/dist/Calendar/styles.js +3 -3
  39. package/dist/Center/Center.d.ts +23 -1
  40. package/dist/Center/Center.d.ts.map +1 -1
  41. package/dist/Center/Center.js +12 -6
  42. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  43. package/dist/Chat/ChatComposer.js +2 -2
  44. package/dist/Chat/ChatToolCalls.js +1 -1
  45. package/dist/Chat/useChatDictation.d.ts +1 -1
  46. package/dist/Chat/useChatDictation.d.ts.map +1 -1
  47. package/dist/Chat/useSpeechRecognition.d.ts +1 -1
  48. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  49. package/dist/Chat/useSpeechRecognition.js +4 -3
  50. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  51. package/dist/CheckboxInput/CheckboxInput.js +9 -0
  52. package/dist/Citation/Citation.js +3 -3
  53. package/dist/ClickableCard/ClickableCard.js +2 -2
  54. package/dist/CommandPalette/CommandPaletteItem.js +1 -1
  55. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  56. package/dist/ComplexSelector/ComplexSelector.js +8 -3
  57. package/dist/DateInput/DateInput.d.ts +31 -2
  58. package/dist/DateInput/DateInput.d.ts.map +1 -1
  59. package/dist/DateInput/DateInput.js +92 -19
  60. package/dist/DateInput/MonthScroller.d.ts +35 -0
  61. package/dist/DateInput/MonthScroller.d.ts.map +1 -0
  62. package/dist/DateInput/MonthScroller.js +573 -0
  63. package/dist/DateInput/MonthYearWheels.d.ts +24 -0
  64. package/dist/DateInput/MonthYearWheels.d.ts.map +1 -0
  65. package/dist/DateInput/MonthYearWheels.js +114 -0
  66. package/dist/DateInput/TouchDateField.d.ts +10 -0
  67. package/dist/DateInput/TouchDateField.d.ts.map +1 -0
  68. package/dist/DateInput/TouchDateField.js +810 -0
  69. package/dist/DateInput/Wheel.d.ts +41 -0
  70. package/dist/DateInput/Wheel.d.ts.map +1 -0
  71. package/dist/DateInput/Wheel.js +315 -0
  72. package/dist/DateInput/monthGeometry.d.ts +65 -0
  73. package/dist/DateInput/monthGeometry.d.ts.map +1 -0
  74. package/dist/DateInput/monthGeometry.js +98 -0
  75. package/dist/DateInput/tokens.stylex.d.ts +63 -0
  76. package/dist/DateInput/tokens.stylex.d.ts.map +1 -0
  77. package/dist/DateInput/tokens.stylex.js +74 -0
  78. package/dist/DateInput/useOwnScrollGesture.d.ts +41 -0
  79. package/dist/DateInput/useOwnScrollGesture.d.ts.map +1 -0
  80. package/dist/DateInput/useOwnScrollGesture.js +202 -0
  81. package/dist/DateInput/usePointerDragScroll.d.ts +15 -0
  82. package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -0
  83. package/dist/DateInput/usePointerDragScroll.js +216 -0
  84. package/dist/DateInput/useScrollSettle.d.ts +26 -0
  85. package/dist/DateInput/useScrollSettle.d.ts.map +1 -0
  86. package/dist/DateInput/useScrollSettle.js +149 -0
  87. package/dist/DateRangeInput/DateRangeInput.d.ts +23 -1
  88. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  89. package/dist/DateRangeInput/DateRangeInput.js +47 -9
  90. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  91. package/dist/DateTimeInput/DateTimeInput.js +18 -10
  92. package/dist/Dialog/Dialog.d.ts.map +1 -1
  93. package/dist/Dialog/Dialog.js +3 -3
  94. package/dist/Field/FieldLabel.d.ts +2 -1
  95. package/dist/Field/FieldLabel.d.ts.map +1 -1
  96. package/dist/Field/FieldLabel.js +21 -3
  97. package/dist/Field/InputClearButton.d.ts +2 -1
  98. package/dist/Field/InputClearButton.d.ts.map +1 -1
  99. package/dist/Field/InputClearButton.js +12 -1
  100. package/dist/Field/inputStyles.stylex.d.ts.map +1 -1
  101. package/dist/Field/inputStyles.stylex.js +4 -4
  102. package/dist/FileInput/FileInput.d.ts.map +1 -1
  103. package/dist/FileInput/FileInput.js +2 -2
  104. package/dist/FormLayout/FormLayout.d.ts +24 -2
  105. package/dist/FormLayout/FormLayout.d.ts.map +1 -1
  106. package/dist/FormLayout/FormLayout.js +7 -2
  107. package/dist/FormLayout/FormLayoutContext.d.ts +15 -2
  108. package/dist/FormLayout/FormLayoutContext.d.ts.map +1 -1
  109. package/dist/FormLayout/FormLayoutContext.js +19 -4
  110. package/dist/FormLayout/index.d.ts +1 -1
  111. package/dist/FormLayout/index.d.ts.map +1 -1
  112. package/dist/HoverCard/HoverCard.d.ts +13 -3
  113. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  114. package/dist/HoverCard/HoverCard.js +2 -0
  115. package/dist/HoverCard/index.d.ts +1 -1
  116. package/dist/HoverCard/index.d.ts.map +1 -1
  117. package/dist/HoverCard/useHoverCard.d.ts +17 -2
  118. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  119. package/dist/HoverCard/useHoverCard.js +78 -9
  120. package/dist/Item/Item.d.ts +9 -1
  121. package/dist/Item/Item.d.ts.map +1 -1
  122. package/dist/Item/Item.js +46 -8
  123. package/dist/Layer/index.d.ts +4 -2
  124. package/dist/Layer/index.d.ts.map +1 -1
  125. package/dist/Layer/index.js +2 -0
  126. package/dist/Layer/useLayer.d.ts.map +1 -1
  127. package/dist/Layer/useLayer.js +3 -2
  128. package/dist/Layer/useTouchTrigger.d.ts +113 -0
  129. package/dist/Layer/useTouchTrigger.d.ts.map +1 -0
  130. package/dist/Layer/useTouchTrigger.js +241 -0
  131. package/dist/Layout/container.stylex.d.ts +4 -2
  132. package/dist/Layout/container.stylex.d.ts.map +1 -1
  133. package/dist/Layout/container.stylex.js +19 -11
  134. package/dist/Layout/index.d.ts +1 -0
  135. package/dist/Layout/index.d.ts.map +1 -1
  136. package/dist/Layout/index.js +4 -0
  137. package/dist/Layout/padding.stylex.d.ts +315 -12
  138. package/dist/Layout/padding.stylex.d.ts.map +1 -1
  139. package/dist/Layout/padding.stylex.js +389 -12
  140. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  141. package/dist/Lightbox/Lightbox.js +2 -1
  142. package/dist/Link/Link.js +4 -4
  143. package/dist/Markdown/Markdown.d.ts +8 -0
  144. package/dist/Markdown/Markdown.d.ts.map +1 -1
  145. package/dist/Markdown/Markdown.js +31 -3
  146. package/dist/Markdown/parser.d.ts +14 -2
  147. package/dist/Markdown/parser.d.ts.map +1 -1
  148. package/dist/Markdown/parser.js +50 -2
  149. package/dist/MobileNav/MobileNav.d.ts +1 -0
  150. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  151. package/dist/MobileNav/MobileNav.js +24 -6
  152. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  153. package/dist/MultiSelector/MultiSelector.js +8 -3
  154. package/dist/NavItem/navItemStyles.stylex.d.ts +2 -2
  155. package/dist/NavItem/navItemStyles.stylex.js +2 -2
  156. package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
  157. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  158. package/dist/NumberInput/NumberInput.js +38 -5
  159. package/dist/Outline/Outline.js +2 -2
  160. package/dist/Outline/parseOutlineFromMarkdown.d.ts +2 -0
  161. package/dist/Outline/parseOutlineFromMarkdown.d.ts.map +1 -1
  162. package/dist/Outline/parseOutlineFromMarkdown.js +5 -31
  163. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  164. package/dist/PowerSearch/PowerSearch.js +11 -12
  165. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  166. package/dist/PowerSearch/PowerSearchToken.js +3 -1
  167. package/dist/PowerSearch/formatFilterValue.d.ts +11 -2
  168. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  169. package/dist/PowerSearch/formatFilterValue.js +23 -8
  170. package/dist/RadioList/RadioList.d.ts.map +1 -1
  171. package/dist/RadioList/RadioList.js +12 -1
  172. package/dist/RadioList/RadioListItem.d.ts +2 -2
  173. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  174. package/dist/RadioList/RadioListItem.js +68 -38
  175. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  176. package/dist/Resizable/ResizeHandle.js +3 -3
  177. package/dist/Section/Section.d.ts +36 -1
  178. package/dist/Section/Section.d.ts.map +1 -1
  179. package/dist/Section/Section.js +12 -2
  180. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  181. package/dist/SegmentedControl/SegmentedControlItem.js +6 -1
  182. package/dist/SelectableCard/SelectableCard.js +1 -1
  183. package/dist/Selector/Selector.d.ts +26 -1
  184. package/dist/Selector/Selector.d.ts.map +1 -1
  185. package/dist/Selector/Selector.js +95 -17
  186. package/dist/Selector/SelectorOption.d.ts +14 -1
  187. package/dist/Selector/SelectorOption.d.ts.map +1 -1
  188. package/dist/Selector/SelectorOption.js +6 -0
  189. package/dist/Selector/SelectorRowLayoutContext.d.ts +8 -0
  190. package/dist/Selector/SelectorRowLayoutContext.d.ts.map +1 -0
  191. package/dist/Selector/SelectorRowLayoutContext.js +27 -0
  192. package/dist/Selector/types.d.ts +1 -0
  193. package/dist/Selector/types.d.ts.map +1 -1
  194. package/dist/SideNav/SideNavHeading.js +1 -1
  195. package/dist/SideNav/SideNavItem.js +1 -1
  196. package/dist/Slider/Slider.d.ts.map +1 -1
  197. package/dist/Slider/Slider.js +3 -3
  198. package/dist/Stack/Stack.d.ts +23 -1
  199. package/dist/Stack/Stack.d.ts.map +1 -1
  200. package/dist/Stack/Stack.js +12 -6
  201. package/dist/StatusDot/StatusDot.d.ts +43 -3
  202. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  203. package/dist/StatusDot/StatusDot.js +42 -5
  204. package/dist/Switch/Switch.d.ts.map +1 -1
  205. package/dist/Switch/Switch.js +9 -0
  206. package/dist/TabList/TabMenu.js +1 -1
  207. package/dist/Table/TableRow.js +4 -4
  208. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  209. package/dist/Table/plugins/columnResize/useTableColumnResize.js +1 -1
  210. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  211. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +1 -1
  212. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  213. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
  214. package/dist/Table/plugins/sortable/useTableSortableState.d.ts +5 -3
  215. package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
  216. package/dist/Table/plugins/sortable/useTableSortableState.js +12 -9
  217. package/dist/Table/plugins/tree/useTableTreeData.js +2 -2
  218. package/dist/TextArea/TextArea.d.ts.map +1 -1
  219. package/dist/TextArea/TextArea.js +6 -1
  220. package/dist/TextInput/TextInput.d.ts.map +1 -1
  221. package/dist/TextInput/TextInput.js +6 -1
  222. package/dist/Thumbnail/Thumbnail.js +1 -1
  223. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  224. package/dist/TimeInput/TimeInput.js +6 -1
  225. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  226. package/dist/Timestamp/Timestamp.js +6 -4
  227. package/dist/Timestamp/formatInstant.d.ts +3 -2
  228. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  229. package/dist/Timestamp/formatInstant.js +8 -8
  230. package/dist/Timestamp/tooltipEntries.d.ts +2 -1
  231. package/dist/Timestamp/tooltipEntries.d.ts.map +1 -1
  232. package/dist/Timestamp/tooltipEntries.js +5 -3
  233. package/dist/Token/Token.js +1 -1
  234. package/dist/Tooltip/Tooltip.d.ts +16 -3
  235. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  236. package/dist/Tooltip/Tooltip.js +2 -0
  237. package/dist/Tooltip/index.d.ts +1 -1
  238. package/dist/Tooltip/index.d.ts.map +1 -1
  239. package/dist/Tooltip/useTooltip.d.ts +21 -2
  240. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  241. package/dist/Tooltip/useTooltip.js +71 -13
  242. package/dist/TopNav/TopNavHeading.js +2 -2
  243. package/dist/TopNav/TopNavItem.js +2 -2
  244. package/dist/TopNav/TopNavMegaMenu.js +1 -1
  245. package/dist/TopNav/TopNavMegaMenuItem.js +1 -1
  246. package/dist/TopNav/TopNavMenu.js +2 -2
  247. package/dist/TreeList/TreeListItem.js +1 -1
  248. package/dist/astryx.css +123 -60
  249. package/dist/hooks/containerReveal.stylex.d.ts.map +1 -1
  250. package/dist/hooks/containerReveal.stylex.js +18 -18
  251. package/dist/hooks/scrollbarGutter.d.ts +28 -0
  252. package/dist/hooks/scrollbarGutter.d.ts.map +1 -0
  253. package/dist/hooks/scrollbarGutter.js +103 -0
  254. package/dist/hooks/useResolvedRequired.d.ts +19 -0
  255. package/dist/hooks/useResolvedRequired.d.ts.map +1 -0
  256. package/dist/hooks/useResolvedRequired.js +40 -0
  257. package/dist/hooks/useScrollLock.d.ts +4 -0
  258. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  259. package/dist/hooks/useScrollLock.js +13 -1
  260. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  261. package/dist/i18n/InternationalizationContext.js +2 -0
  262. package/dist/i18n/index.d.ts +6 -0
  263. package/dist/i18n/index.d.ts.map +1 -1
  264. package/dist/i18n/index.js +6 -0
  265. package/dist/i18n/useCollator.d.ts +12 -0
  266. package/dist/i18n/useCollator.d.ts.map +1 -0
  267. package/dist/i18n/useCollator.js +40 -0
  268. package/dist/i18n/useLocale.d.ts +3 -0
  269. package/dist/i18n/useLocale.d.ts.map +1 -0
  270. package/dist/i18n/useLocale.js +31 -0
  271. package/dist/theme/defineTheme.d.ts +5 -0
  272. package/dist/theme/defineTheme.d.ts.map +1 -1
  273. package/dist/theme/defineTheme.js +5 -0
  274. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  275. package/dist/theme/derivedVarRegistry.js +7 -0
  276. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  277. package/dist/theme/generateThemeRules.js +66 -5
  278. package/dist/theme/syntax/index.d.ts +6 -0
  279. package/dist/theme/syntax/index.d.ts.map +1 -1
  280. package/dist/theme/syntax/index.js +7 -2
  281. package/dist/utils/dateParser.d.ts +4 -3
  282. package/dist/utils/dateParser.d.ts.map +1 -1
  283. package/dist/utils/dateParser.js +8 -8
  284. package/dist/utils/index.d.ts +1 -1
  285. package/dist/utils/index.d.ts.map +1 -1
  286. package/dist/utils/index.js +1 -1
  287. package/dist/utils/plainDate.d.ts +11 -2
  288. package/dist/utils/plainDate.d.ts.map +1 -1
  289. package/dist/utils/plainDate.js +32 -4
  290. package/locales/af-ZA.json +958 -0
  291. package/locales/ar-SA.json +998 -0
  292. package/locales/ca-ES.json +974 -0
  293. package/locales/cs-CZ.json +990 -0
  294. package/locales/da-DK.json +966 -0
  295. package/locales/de-DE.json +966 -0
  296. package/locales/el-GR.json +990 -0
  297. package/locales/en.json +32 -0
  298. package/locales/es-ES.json +978 -0
  299. package/locales/fi-FI.json +990 -0
  300. package/locales/fr-FR.json +928 -0
  301. package/locales/he-IL.json +990 -0
  302. package/locales/hu-HU.json +990 -0
  303. package/locales/it-IT.json +978 -0
  304. package/locales/ja-JP.json +998 -0
  305. package/locales/ko-KR.json +990 -0
  306. package/locales/nl-NL.json +954 -0
  307. package/locales/no-NO.json +978 -0
  308. package/locales/pl-PL.json +982 -0
  309. package/locales/pseudo.json +24 -0
  310. package/locales/pt-BR.json +982 -0
  311. package/locales/pt-PT.json +982 -0
  312. package/locales/ro-RO.json +982 -0
  313. package/locales/ru-RU.json +990 -0
  314. package/locales/sr-SP.json +990 -0
  315. package/locales/sv-SE.json +986 -0
  316. package/locales/tr-TR.json +990 -0
  317. package/locales/uk-UA.json +990 -0
  318. package/locales/vi-VN.json +986 -0
  319. package/locales/zh-CN.json +998 -0
  320. package/locales/zh-TW.json +998 -0
  321. package/package.json +3 -3
  322. package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -1
  323. package/src/Banner/Banner.doc.mjs +2 -0
  324. package/src/Blockquote/Blockquote.doc.mjs +30 -7
  325. package/src/Blockquote/Blockquote.test.tsx +34 -3
  326. package/src/Blockquote/Blockquote.tsx +11 -9
  327. package/src/BottomSheet/BottomSheet.doc.mjs +36 -3
  328. package/src/BottomSheet/BottomSheet.test.tsx +177 -2
  329. package/src/BottomSheet/BottomSheet.tsx +16 -2
  330. package/src/BottomSheet/BottomSheetPanel.test.tsx +91 -0
  331. package/src/BottomSheet/BottomSheetPanel.tsx +121 -15
  332. package/src/BottomSheet/index.ts +5 -1
  333. package/src/BottomSheet/snapOffsets.test.ts +114 -47
  334. package/src/BottomSheet/snapOffsets.ts +119 -33
  335. package/src/BottomSheet/useSheetGestures.test.ts +113 -15
  336. package/src/BottomSheet/useSheetGestures.ts +196 -100
  337. package/src/Breadcrumbs/BreadcrumbItem.tsx +1 -1
  338. package/src/Button/Button.tsx +7 -7
  339. package/src/Calendar/Calendar.doc.mjs +16 -0
  340. package/src/Calendar/Calendar.test.tsx +137 -0
  341. package/src/Calendar/Calendar.tsx +80 -11
  342. package/src/Calendar/getStandaloneShortWeekdayNames.test.ts +54 -0
  343. package/src/Calendar/getStandaloneShortWeekdayNames.ts +38 -0
  344. package/src/Calendar/hooks/useCalendarConstraints.ts +54 -3
  345. package/src/Calendar/hooks/useCalendarDays.ts +13 -10
  346. package/src/Calendar/hooks/useCalendarNavigation.ts +6 -4
  347. package/src/Calendar/standaloneShortWeekdayNames.generated.ts +50 -0
  348. package/src/Calendar/styles.ts +3 -3
  349. package/src/Center/Center.doc.mjs +48 -0
  350. package/src/Center/Center.test.tsx +158 -0
  351. package/src/Center/Center.tsx +50 -9
  352. package/src/Chat/ChatComposer.tsx +7 -4
  353. package/src/Chat/ChatToolCalls.tsx +1 -1
  354. package/src/Chat/{useChatDictation.test.ts → useChatDictation.test.tsx} +29 -14
  355. package/src/Chat/useChatDictation.ts +1 -1
  356. package/src/Chat/useSpeechRecognition.ts +5 -3
  357. package/src/CheckboxInput/CheckboxInput.tsx +6 -0
  358. package/src/Citation/Citation.tsx +3 -3
  359. package/src/ClickableCard/ClickableCard.tsx +2 -2
  360. package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
  361. package/src/ComplexSelector/ComplexSelector.doc.mjs +10 -0
  362. package/src/ComplexSelector/ComplexSelector.tsx +8 -5
  363. package/src/DateInput/DateInput.test.tsx +17 -1
  364. package/src/DateInput/DateInput.tsx +90 -19
  365. package/src/DateInput/DateInputTouch.test.tsx +2393 -0
  366. package/src/DateInput/MonthScroller.tsx +784 -0
  367. package/src/DateInput/MonthYearWheels.tsx +147 -0
  368. package/src/DateInput/TouchDateField.tsx +1214 -0
  369. package/src/DateInput/Wheel.tsx +470 -0
  370. package/src/DateInput/monthGeometry.ts +118 -0
  371. package/src/DateInput/tokens.stylex.ts +99 -0
  372. package/src/DateInput/useOwnScrollGesture.ts +227 -0
  373. package/src/DateInput/usePointerDragScroll.ts +220 -0
  374. package/src/DateInput/useScrollSettle.ts +164 -0
  375. package/src/DateRangeInput/DateRangeInput.doc.mjs +16 -0
  376. package/src/DateRangeInput/DateRangeInput.test.tsx +81 -1
  377. package/src/DateRangeInput/DateRangeInput.tsx +88 -8
  378. package/src/DateTimeInput/DateTimeInput.tsx +23 -8
  379. package/src/Dialog/Dialog.test.tsx +24 -0
  380. package/src/Dialog/Dialog.tsx +3 -0
  381. package/src/Field/Field.doc.mjs +3 -0
  382. package/src/Field/FieldLabel.tsx +20 -4
  383. package/src/Field/InputClearButton.test.tsx +134 -2
  384. package/src/Field/InputClearButton.tsx +42 -1
  385. package/src/Field/inputStyles.stylex.ts +16 -12
  386. package/src/FileInput/FileInput.tsx +5 -4
  387. package/src/FormLayout/FormLayout.doc.mjs +13 -0
  388. package/src/FormLayout/FormLayout.test.tsx +181 -4
  389. package/src/FormLayout/FormLayout.tsx +33 -2
  390. package/src/FormLayout/FormLayoutContext.ts +22 -7
  391. package/src/FormLayout/index.ts +1 -1
  392. package/src/HoverCard/HoverCard.doc.mjs +18 -0
  393. package/src/HoverCard/HoverCard.test.tsx +189 -0
  394. package/src/HoverCard/HoverCard.tsx +22 -2
  395. package/src/HoverCard/index.ts +1 -0
  396. package/src/HoverCard/useHoverCard.doc.mjs +2 -0
  397. package/src/HoverCard/useHoverCard.tsx +103 -7
  398. package/src/Item/Item.doc.mjs +1 -0
  399. package/src/Item/Item.test.tsx +50 -0
  400. package/src/Item/Item.tsx +41 -2
  401. package/src/Layer/index.ts +10 -0
  402. package/src/Layer/useLayer.tsx +13 -2
  403. package/src/Layer/useTouchTrigger.test.ts +70 -0
  404. package/src/Layer/useTouchTrigger.ts +366 -0
  405. package/src/Layout/Layout.doc.mjs +18 -0
  406. package/src/Layout/container.stylex.ts +11 -3
  407. package/src/Layout/index.ts +4 -0
  408. package/src/Layout/overlayPaddingReset.test.tsx +222 -0
  409. package/src/Layout/padding.stylex.ts +192 -12
  410. package/src/Lightbox/Lightbox.tsx +2 -1
  411. package/src/Link/Link.tsx +4 -4
  412. package/src/Markdown/Markdown.doc.mjs +3 -0
  413. package/src/Markdown/Markdown.test.tsx +78 -0
  414. package/src/Markdown/Markdown.tsx +41 -1
  415. package/src/Markdown/parser.ts +60 -2
  416. package/src/MobileNav/MobileNav.tsx +61 -5
  417. package/src/MobileNav/MobileNavEntryAnimation.test.tsx +212 -0
  418. package/src/MobileNav/MobileNavScrollbarGutter.test.tsx +109 -0
  419. package/src/MultiSelector/MultiSelector.test.tsx +1 -1
  420. package/src/MultiSelector/MultiSelector.tsx +8 -5
  421. package/src/NavItem/navItemStyles.stylex.ts +2 -2
  422. package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
  423. package/src/NumberInput/NumberInput.doc.mjs +24 -0
  424. package/src/NumberInput/NumberInput.test.tsx +138 -0
  425. package/src/NumberInput/NumberInput.tsx +44 -6
  426. package/src/Outline/Outline.doc.mjs +2 -0
  427. package/src/Outline/Outline.tsx +1 -1
  428. package/src/Outline/parseOutlineFromMarkdown.ts +10 -40
  429. package/src/PowerSearch/PowerSearch.tsx +17 -8
  430. package/src/PowerSearch/PowerSearchToken.tsx +3 -0
  431. package/src/PowerSearch/formatFilterValue.test.ts +22 -2
  432. package/src/PowerSearch/formatFilterValue.ts +31 -6
  433. package/src/RadioList/RadioList.doc.mjs +1 -1
  434. package/src/RadioList/RadioList.test.tsx +170 -2
  435. package/src/RadioList/RadioList.tsx +9 -1
  436. package/src/RadioList/RadioListItem.tsx +83 -51
  437. package/src/Resizable/ResizeHandle.test.tsx +22 -0
  438. package/src/Resizable/ResizeHandle.tsx +9 -3
  439. package/src/Section/Section.doc.mjs +55 -0
  440. package/src/Section/Section.test.tsx +201 -4
  441. package/src/Section/Section.tsx +69 -0
  442. package/src/SegmentedControl/SegmentedControl.test.tsx +31 -0
  443. package/src/SegmentedControl/SegmentedControlItem.tsx +11 -2
  444. package/src/SelectableCard/SelectableCard.tsx +1 -1
  445. package/src/Selector/Selector.doc.mjs +16 -2
  446. package/src/Selector/Selector.test.tsx +525 -1
  447. package/src/Selector/Selector.tsx +166 -21
  448. package/src/Selector/SelectorOption.doc.mjs +7 -0
  449. package/src/Selector/SelectorOption.tsx +21 -0
  450. package/src/Selector/SelectorRowLayoutContext.ts +32 -0
  451. package/src/Selector/types.ts +4 -4
  452. package/src/SideNav/SideNavHeading.tsx +2 -2
  453. package/src/SideNav/SideNavItem.tsx +1 -1
  454. package/src/Slider/Slider.tsx +11 -1
  455. package/src/Stack/Stack.doc.mjs +72 -0
  456. package/src/Stack/Stack.test.tsx +156 -0
  457. package/src/Stack/Stack.tsx +50 -8
  458. package/src/StatusDot/StatusDot.doc.mjs +13 -0
  459. package/src/StatusDot/StatusDot.test.tsx +115 -8
  460. package/src/StatusDot/StatusDot.tsx +74 -9
  461. package/src/Switch/Switch.tsx +6 -0
  462. package/src/TabList/TabMenu.tsx +1 -1
  463. package/src/Table/TableRow.tsx +4 -4
  464. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +2 -1
  465. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +2 -1
  466. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +22 -4
  467. package/src/Table/plugins/sortable/useTableSortableState.test.tsx +34 -0
  468. package/src/Table/plugins/sortable/useTableSortableState.tsx +26 -23
  469. package/src/Table/plugins/tree/useTableTreeData.tsx +2 -2
  470. package/src/TextArea/TextArea.doc.mjs +1 -1
  471. package/src/TextArea/TextArea.tsx +3 -1
  472. package/src/TextInput/TextInput.tsx +3 -1
  473. package/src/Thumbnail/Thumbnail.tsx +1 -1
  474. package/src/TimeInput/TimeInput.tsx +3 -1
  475. package/src/Timestamp/Timestamp.test.tsx +27 -7
  476. package/src/Timestamp/Timestamp.tsx +8 -4
  477. package/src/Timestamp/formatInstant.ts +9 -7
  478. package/src/Timestamp/tooltipEntries.test.ts +11 -6
  479. package/src/Timestamp/tooltipEntries.ts +6 -2
  480. package/src/Token/Token.tsx +1 -1
  481. package/src/Tooltip/Tooltip.doc.mjs +18 -0
  482. package/src/Tooltip/Tooltip.test.tsx +254 -1
  483. package/src/Tooltip/Tooltip.tsx +22 -2
  484. package/src/Tooltip/index.ts +1 -0
  485. package/src/Tooltip/useTooltip.doc.mjs +2 -0
  486. package/src/Tooltip/useTooltip.tsx +99 -21
  487. package/src/TopNav/TopNavHeading.tsx +1 -1
  488. package/src/TopNav/TopNavItem.tsx +2 -2
  489. package/src/TopNav/TopNavMegaMenu.tsx +1 -1
  490. package/src/TopNav/TopNavMegaMenuItem.tsx +1 -1
  491. package/src/TopNav/TopNavMenu.tsx +2 -2
  492. package/src/TreeList/TreeListItem.tsx +1 -1
  493. package/src/hooks/containerReveal.stylex.ts +54 -18
  494. package/src/hooks/scrollbarGutter.test.ts +167 -0
  495. package/src/hooks/scrollbarGutter.ts +121 -0
  496. package/src/hooks/useResolvedRequired.ts +42 -0
  497. package/src/hooks/useScrollLock.doc.mjs +4 -4
  498. package/src/hooks/useScrollLock.test.ts +73 -0
  499. package/src/hooks/useScrollLock.ts +14 -0
  500. package/src/i18n/InternationalizationContext.ts +2 -0
  501. package/src/i18n/__tests__/e2e-powersearch.test.tsx +37 -1
  502. package/src/i18n/__tests__/useCollator.test.tsx +115 -0
  503. package/src/i18n/__tests__/useLocale.test.tsx +52 -0
  504. package/src/i18n/index.ts +6 -0
  505. package/src/i18n/useCollator.doc.mjs +84 -0
  506. package/src/i18n/useCollator.ts +44 -0
  507. package/src/i18n/useLocale.doc.mjs +70 -0
  508. package/src/i18n/useLocale.ts +34 -0
  509. package/src/i18n/useTranslator.doc.mjs +1 -1
  510. package/src/theme/defineTheme.test.ts +9 -3
  511. package/src/theme/defineTheme.ts +5 -0
  512. package/src/theme/derivedVarRegistry.test.ts +19 -5
  513. package/src/theme/derivedVarRegistry.ts +4 -0
  514. package/src/theme/generateThemeRules.test.ts +118 -0
  515. package/src/theme/generateThemeRules.ts +83 -5
  516. package/src/theme/syntax/index.ts +6 -2
  517. package/src/theme/syntax/serverSafeSyntax.test.ts +68 -0
  518. package/src/utils/dateParser.test.ts +20 -0
  519. package/src/utils/dateParser.ts +14 -7
  520. package/src/utils/index.ts +2 -0
  521. package/src/utils/plainDate.test.ts +56 -0
  522. package/src/utils/plainDate.ts +33 -4
@@ -0,0 +1,35 @@
1
+ import { type DayOfWeek, type ISODateString, type PlainDate } from '../utils';
2
+ export interface MonthScrollerHandle {
3
+ /** Bring a month to rest at the top of the scrollport. */
4
+ scrollToMonth: (monthIndex: number, behavior?: ScrollBehavior) => void;
5
+ }
6
+ export interface MonthScrollerProps {
7
+ /** Imperative handle for programmatic navigation (Today, the wheels). */
8
+ handleRef?: React.RefObject<MonthScrollerHandle | null>;
9
+ /** First reachable month, as a month index. */
10
+ minMonthIndex: number;
11
+ /** Last reachable month, as a month index. */
12
+ maxMonthIndex: number;
13
+ /** Month to rest on at mount. */
14
+ initialMonthIndex: number;
15
+ /** Fires as the scroller passes each month, settled or not. */
16
+ onVisibleMonthChange: (monthIndex: number) => void;
17
+ /** Currently selected date. */
18
+ selectedDate: PlainDate | null;
19
+ /** Today, for the `aria-current` marker. */
20
+ today: PlainDate;
21
+ /** Whether a date fails min/max or a custom constraint. */
22
+ isDateDisabled: (date: PlainDate) => boolean;
23
+ /** First column of the week. */
24
+ weekStartsOn: DayOfWeek;
25
+ /** Fired when a day is tapped. */
26
+ onSelect: (value: ISODateString) => void;
27
+ }
28
+ /**
29
+ * A vertically continuous, snap-paged run of month grids.
30
+ */
31
+ export declare function MonthScroller({ handleRef, minMonthIndex, maxMonthIndex, initialMonthIndex, onVisibleMonthChange, selectedDate, today, isDateDisabled, weekStartsOn, onSelect, }: MonthScrollerProps): import("react").JSX.Element;
32
+ export declare namespace MonthScroller {
33
+ var displayName: string;
34
+ }
35
+ //# sourceMappingURL=MonthScroller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MonthScroller.d.ts","sourceRoot":"","sources":["../../src/DateInput/MonthScroller.tsx"],"names":[],"mappings":"AAmDA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,SAAS,EAQf,MAAM,UAAU,CAAC;AAyMlB,MAAM,WAAW,mBAAmB;IAClC,0DAA0D;IAC1D,aAAa,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;CACxE;AAED,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IACxD,+CAA+C;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,oBAAoB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,+BAA+B;IAC/B,YAAY,EAAE,SAAS,GAAG,IAAI,CAAC;IAC/B,4CAA4C;IAC5C,KAAK,EAAE,SAAS,CAAC;IACjB,2DAA2D;IAC3D,cAAc,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC;IAC7C,gCAAgC;IAChC,YAAY,EAAE,SAAS,CAAC;IACxB,kCAAkC;IAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC1C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,KAAK,EACL,cAAc,EACd,YAAY,EACZ,QAAQ,GACT,EAAE,kBAAkB,+BAwUpB;yBAnVe,aAAa"}
@@ -0,0 +1,573 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file MonthScroller.tsx
7
+ * @input Month bounds, selected value, constraints, week start
8
+ * @output Exports MonthScroller and MonthScrollerHandle
9
+ * @position Internal component; consumed by TouchDateField.tsx
10
+ *
11
+ * The continuous surface: months stacked vertically in one scroller, each pane
12
+ * exactly as tall as the scrollport and snapped to its start. Two consequences
13
+ * fall out of that single geometric choice — the picker never changes height,
14
+ * and there is no resting position that shows half of two months.
15
+ *
16
+ * Every pane is a fixed six-row grid, including the months that only need
17
+ * four or five, because a pane whose height depended on its contents would
18
+ * make snap offsets vary from month to month and the scroll position drift.
19
+ *
20
+ * The list is long (a century by default) but only a few panes are ever
21
+ * mounted: a spacer holds the full scroll height and the visible panes are
22
+ * positioned into it absolutely. Nothing is stitched or recycled during a
23
+ * scroll, so snap offsets are constant and momentum is never interrupted —
24
+ * which is the failure mode of the usual "append months at the edge" approach.
25
+ *
26
+ * SYNC: When modified, update:
27
+ * - /packages/core/src/DateInput/TouchDateField.tsx
28
+ * - /packages/core/src/DateInput/DateInput.doc.mjs
29
+ * - /packages/core/src/DateInput/DateInputTouch.test.tsx
30
+ */
31
+ import { useCallback, useEffect, useImperativeHandle, useLayoutEffect, useRef, useState } from 'react';
32
+ import * as stylex from '@stylexjs/stylex';
33
+ import { useCalendarDays } from "../Calendar/index.js";
34
+ import { useDirection } from "../i18n/index.js";
35
+ import "../theme/tokens.stylex.js";
36
+ import { colorVars, radiusVars, fontWeightVars, typeScaleVars, durationVars, borderVars } from "../theme/tokens.stylex.js";
37
+ import { focusOutlineStyles } from "../utils/index.js";
38
+ import { plainDateAddDays, plainDateDayOfWeek, plainDateFormat, plainDateIsEqual, plainDateToISO, DATE_FORMAT_MONTH_YEAR, DATE_FORMAT_WITH_WEEKDAY } from "../utils/index.js";
39
+ import "./tokens.stylex.js";
40
+ import { dateInputTouchSizes, dateInputTouchGeometry } from "./tokens.stylex.js";
41
+ import { useOwnScrollGesture } from "./useOwnScrollGesture.js";
42
+ import { fromMonthIndex, monthIndexOf, paneWindow, rowAtScrollOffset, rowsIn, scrollOffsetForRow } from "./monthGeometry.js";
43
+ import { jsx as _jsx } from "react/jsx-runtime";
44
+ const DAY_SIZE = dateInputTouchSizes.daySize;
45
+
46
+ /**
47
+ * Panes mounted on each side of the visible one. Sized against a fast fling:
48
+ * the window widens once per animation frame, so it only fails if a single
49
+ * frame travels further than this — three months, about 800px at the default
50
+ * day size. Under `scroll-snap-type: mandatory`, landing on an unmounted pane
51
+ * would not merely show a gap, it would re-snap to the nearest mounted one.
52
+ */
53
+ const OVERSCAN = 3;
54
+ const styles = {
55
+ spacer: {
56
+ kVAEAm: "x1n2onr6",
57
+ kZKoxP: "x5yr21d",
58
+ $$css: true
59
+ },
60
+ pane: {
61
+ kVAEAm: "x10l6tqk",
62
+ kYYq5F: "x10no89f",
63
+ kZKoxP: "xm8gem",
64
+ k5xd4v: "x1bhewko",
65
+ k1xSpc: "xrvj5dj",
66
+ kumcoG: "x1mzazjb",
67
+ k9llMU: "xy8nx85",
68
+ $$css: true
69
+ },
70
+ day: {
71
+ k1xSpc: "x78zum5",
72
+ kGNEyG: "x6s0dn4",
73
+ kjj79g: "xl56j7k",
74
+ kzqmXN: "xh8yej3",
75
+ kZKoxP: "x5yr21d",
76
+ k7Eaqz: "x1tutbut",
77
+ kAzted: "x1dg37ty",
78
+ kmVPX3: "x1717udv",
79
+ kMzoRj: "xc342km",
80
+ ksu8eU: "xng3xce",
81
+ kWkggS: "xjbqb8w",
82
+ kMwMTN: "x1tgivj0",
83
+ kGuDYH: "xjm74w1",
84
+ k63SB2: "x1sodnla",
85
+ kkrTdU: "x1ypdohk",
86
+ kfSwDN: "x87ps6o",
87
+ kQizK7: "x1i10hfl",
88
+ $$css: true
89
+ },
90
+ dayOutside: {
91
+ kMwMTN: "xv1l7n4",
92
+ kSiTet: "xbyyjgo",
93
+ $$css: true
94
+ },
95
+ dayDisabled: {
96
+ kSiTet: "xuzhngd",
97
+ kkrTdU: "x1h6gzvc",
98
+ $$css: true
99
+ }
100
+ };
101
+ const _temp = {
102
+ kzqmXN: "x1uyokj7",
103
+ "$$css": true
104
+ };
105
+ const _temp2 = {
106
+ kLqNvP: "x1lxsm33",
107
+ kzqmXN: "x1uyokj7",
108
+ "$$css": true
109
+ };
110
+ const dynamic = {
111
+ spacer: inlineSize => [_temp, {
112
+ "--x-inlineSize": (val => typeof val === "number" ? val + "px" : val != null ? val : undefined)(`${inlineSize}px`)
113
+ }],
114
+ pane: (insetInlineStart, inlineSize) => [_temp2, {
115
+ "--x-insetInlineStart": (val => typeof val === "number" ? val + "px" : val != null ? val : undefined)(`${insetInlineStart}px`),
116
+ "--x-inlineSize": (val => typeof val === "number" ? val + "px" : val != null ? val : undefined)(`${inlineSize}px`)
117
+ }]
118
+ };
119
+ /**
120
+ * A vertically continuous, snap-paged run of month grids.
121
+ */
122
+ export function MonthScroller({
123
+ handleRef,
124
+ minMonthIndex,
125
+ maxMonthIndex,
126
+ initialMonthIndex,
127
+ onVisibleMonthChange,
128
+ selectedDate,
129
+ today,
130
+ isDateDisabled,
131
+ weekStartsOn,
132
+ onSelect
133
+ }) {
134
+ const scrollerRef = useRef(null);
135
+ const rowCount = maxMonthIndex - minMonthIndex + 1;
136
+
137
+ // Pane WIDTH is read from layout, never assumed: it is whatever the CSS
138
+ // says the scrollport is, so the snap offsets and the virtualization follow
139
+ // a resize (rotation, a split-screen change) without re-deriving anything.
140
+ const [paneSize, setPaneSize] = useState(0);
141
+ // Which way the inline axis runs. Under RTL the panes lay out from the
142
+ // right and scrollLeft counts DOWN from 0, so every conversion between a
143
+ // row and a scroll offset has to know.
144
+ const isRTL = useDirection() === 'rtl';
145
+ const [centerRow, setCenterRow] = useState(initialMonthIndex - minMonthIndex);
146
+ // The visible row, mirrored so the scroll handler can tell "changed" from
147
+ // "same" without reading state, and notify the parent OUTSIDE a state
148
+ // updater — React runs updaters during render, where another component's
149
+ // setState is illegal.
150
+ const centerRowRef = useRef(centerRow);
151
+ // A row to scroll to once its pane is mounted; see scrollToMonth.
152
+ const pendingScrollRef = useRef(null);
153
+
154
+ /**
155
+ * The row a programmatic scroll is heading for, so its own scroll events
156
+ * are not reported back as if the user had gone there. Null once a finger
157
+ * touches the scroller, or once the steered scroll has arrived.
158
+ */
159
+ const steeredRowRef = useRef(null);
160
+
161
+ // Keyboard focus moves by date, not by cell index, so it crosses month
162
+ // boundaries the way a calendar should. Null until the user takes the grid
163
+ // with the keyboard.
164
+ const [focusedDate, setFocusedDate] = useState(null);
165
+ const shouldRestoreFocusRef = useRef(false);
166
+ const onVisibleMonthChangeRef = useRef(onVisibleMonthChange);
167
+ onVisibleMonthChangeRef.current = onVisibleMonthChange;
168
+ useLayoutEffect(() => {
169
+ const scroller = scrollerRef.current;
170
+ if (scroller == null) {
171
+ return;
172
+ }
173
+ const measure = () => {
174
+ // Ignore zero: the picker can be mounted inside something not yet
175
+ // displayed (a closed BottomSheet), and a zero width would unmount
176
+ // every pane and lose the scroll position.
177
+ const measured = scroller.clientWidth;
178
+ if (measured > 0) {
179
+ // eslint-disable-next-line @eslint-react/set-state-in-effect -- pane width is a measurement; layout is the only place it exists
180
+ setPaneSize(measured);
181
+ }
182
+ };
183
+ measure();
184
+ const observer = new ResizeObserver(measure);
185
+ observer.observe(scroller);
186
+ return () => observer.disconnect();
187
+ }, []);
188
+
189
+ // Land on the initial month before the first paint. Runs once the height is
190
+ // known; `hasPositioned` keeps a later resize from yanking the user back.
191
+ const hasPositionedRef = useRef(false);
192
+ useLayoutEffect(() => {
193
+ const scroller = scrollerRef.current;
194
+ if (scroller == null || paneSize === 0 || hasPositionedRef.current) {
195
+ return;
196
+ }
197
+ hasPositionedRef.current = true;
198
+ scroller.scrollLeft = scrollOffsetForRow(initialMonthIndex - minMonthIndex, paneSize, isRTL);
199
+ }, [paneSize, initialMonthIndex, minMonthIndex, isRTL]);
200
+ const scrollToMonth = useCallback((monthIndex, behavior = 'smooth') => {
201
+ const scroller = scrollerRef.current;
202
+ if (scroller == null || paneSize === 0) {
203
+ return;
204
+ }
205
+ const row = Math.min(rowCount - 1, Math.max(0, monthIndex - minMonthIndex));
206
+ if (Math.abs(row - centerRowRef.current) > OVERSCAN) {
207
+ // Beyond the mounted window there is no pane at the target offset, and
208
+ // `scroll-snap-type: mandatory` will not leave the scroller resting
209
+ // where no snap area is — it re-snaps to the nearest mounted pane, so
210
+ // a jump to another year lands one month away instead. Mount the
211
+ // target first and scroll once it exists (see the layout effect
212
+ // below); a jump that far is never worth animating either.
213
+ pendingScrollRef.current = row;
214
+ centerRowRef.current = row;
215
+ setCenterRow(row);
216
+ return;
217
+ }
218
+ steeredRowRef.current = row;
219
+ scroller.scrollTo({
220
+ left: scrollOffsetForRow(row, paneSize, isRTL),
221
+ behavior
222
+ });
223
+ }, [paneSize, minMonthIndex, rowCount, isRTL]);
224
+
225
+ // Deliberately un-keyed: it runs after every render, costs a null check, and
226
+ // must fire on whichever render finally mounts the pending row's pane.
227
+ useLayoutEffect(() => {
228
+ const row = pendingScrollRef.current;
229
+ const scroller = scrollerRef.current;
230
+ if (row == null || scroller == null || paneSize === 0) {
231
+ return;
232
+ }
233
+ pendingScrollRef.current = null;
234
+ scroller.scrollTo({
235
+ left: scrollOffsetForRow(row, paneSize, isRTL),
236
+ behavior: 'auto'
237
+ });
238
+ });
239
+ useImperativeHandle(handleRef, () => ({
240
+ scrollToMonth
241
+ }), [scrollToMonth]);
242
+
243
+ // Claim horizontal gestures, leave vertical ones to the sheet.
244
+ //
245
+ // `touch-action: pan-x` alone is NOT enough: it governs what the browser
246
+ // pans natively, and the sheet's listener is JavaScript whose
247
+ // preventDefault() cancels the scroll regardless. Measured — a swipe 9° off
248
+ // horizontal had every touchmove cancelled by the sheet and the month never
249
+ // changed. The axis lock is biased toward horizontal, because a thumb arcs
250
+ // as it swipes; `onSwipe` then pages the diagonals the browser itself
251
+ // declines to pan, so no angle is left doing nothing. See
252
+ // useOwnScrollGesture.
253
+ useOwnScrollGesture(scrollerRef, 'inline', {
254
+ onSwipe: direction => {
255
+ const scroller = scrollerRef.current;
256
+ if (scroller == null || paneSize === 0) {
257
+ return;
258
+ }
259
+ scroller.scrollBy({
260
+ left: direction * paneSize,
261
+ behavior: 'smooth'
262
+ });
263
+ }
264
+ });
265
+
266
+ // rAF-throttled: a touch scroll fires far more scroll events than frames,
267
+ // and all this does is move a label and widen a window.
268
+ const frameRef = useRef(undefined);
269
+ useEffect(() => {
270
+ const scroller = scrollerRef.current;
271
+ // Not before the height is known. A listener attached while it was zero
272
+ // would close over that zero and report row 0 for any scroll — and the
273
+ // scroll event fired by the initial positioning arrives just late enough
274
+ // to be handled by that stale listener. Every pane then unmounts except
275
+ // rows 0-2, and `scroll-snap-type: mandatory` yanks the scroller to the
276
+ // nearest surviving snap area, a century away from where it just landed.
277
+ if (scroller == null || paneSize === 0) {
278
+ return;
279
+ }
280
+ // A finger on the scroller ends any steering: from here the months it
281
+ // passes are the user's doing and every one of them is worth reporting.
282
+ const onTouchStart = () => {
283
+ steeredRowRef.current = null;
284
+ };
285
+ const onScroll = () => {
286
+ if (frameRef.current != null) {
287
+ return;
288
+ }
289
+ frameRef.current = requestAnimationFrame(() => {
290
+ frameRef.current = undefined;
291
+ const row = rowAtScrollOffset(scroller.scrollLeft, paneSize, rowCount, isRTL);
292
+ if (row === centerRowRef.current) {
293
+ return;
294
+ }
295
+ centerRowRef.current = row;
296
+ setCenterRow(row);
297
+ // Report nothing while a steer is in flight. `scrollToMonth` is only
298
+ // ever called by something that already knows the month — a wheel
299
+ // commit, a header arrow, the re-assert when the wheels close — so
300
+ // none of the scrolling it causes is news, including whatever the
301
+ // scroller passes through on the way.
302
+ //
303
+ // Reporting it is a feedback cycle, and worse on iOS. A wheel commit
304
+ // steers this scroller while it is hidden behind the wheels, and a
305
+ // hidden scroller does not reliably stay where it was put: iOS
306
+ // re-snaps it when the panel becomes visible again, firing scrolls at
307
+ // the exact moment reports start being trusted again. The month drifted
308
+ // on the way back to the calendar.
309
+ //
310
+ // Cleared on arrival, or by a touch below — once a finger is on the
311
+ // scroller the user owns it, and every month it passes is worth
312
+ // reporting.
313
+ if (steeredRowRef.current != null) {
314
+ if (steeredRowRef.current === row) {
315
+ steeredRowRef.current = null;
316
+ }
317
+ return;
318
+ }
319
+ onVisibleMonthChangeRef.current(minMonthIndex + row);
320
+ });
321
+ };
322
+ scroller.addEventListener('scroll', onScroll, {
323
+ passive: true
324
+ });
325
+ scroller.addEventListener('touchstart', onTouchStart, {
326
+ passive: true
327
+ });
328
+ return () => {
329
+ scroller.removeEventListener('scroll', onScroll);
330
+ scroller.removeEventListener('touchstart', onTouchStart);
331
+ if (frameRef.current != null) {
332
+ cancelAnimationFrame(frameRef.current);
333
+ frameRef.current = undefined;
334
+ }
335
+ };
336
+ }, [paneSize, rowCount, minMonthIndex, isRTL]);
337
+
338
+ // Move the keyboard focus by whole days and let the scroller follow. Paging
339
+ // by month is PageUp/PageDown; everything else is the APG grid vocabulary.
340
+ const moveFocus = useCallback((from, deltaDays) => {
341
+ const next = plainDateAddDays(from, deltaDays);
342
+ const nextIndex = monthIndexOf(next);
343
+ if (nextIndex < minMonthIndex || nextIndex > maxMonthIndex) {
344
+ return;
345
+ }
346
+ shouldRestoreFocusRef.current = true;
347
+ setFocusedDate(next);
348
+ if (nextIndex !== monthIndexOf(from)) {
349
+ scrollToMonth(nextIndex, 'smooth');
350
+ }
351
+ }, [minMonthIndex, maxMonthIndex, scrollToMonth]);
352
+ const handleKeyDown = useCallback((event, date) => {
353
+ // Column within the displayed week, which is what Home/End move to —
354
+ // not the day of the month.
355
+ const column = (plainDateDayOfWeek(date) - weekStartsOn + 7) % 7;
356
+ switch (event.key) {
357
+ case 'ArrowLeft':
358
+ event.preventDefault();
359
+ moveFocus(date, -1);
360
+ break;
361
+ case 'ArrowRight':
362
+ event.preventDefault();
363
+ moveFocus(date, 1);
364
+ break;
365
+ case 'ArrowUp':
366
+ event.preventDefault();
367
+ moveFocus(date, -7);
368
+ break;
369
+ case 'ArrowDown':
370
+ event.preventDefault();
371
+ moveFocus(date, 7);
372
+ break;
373
+ case 'Home':
374
+ event.preventDefault();
375
+ moveFocus(date, -column);
376
+ break;
377
+ case 'End':
378
+ event.preventDefault();
379
+ moveFocus(date, 6 - column);
380
+ break;
381
+ default:
382
+ break;
383
+ }
384
+ }, [moveFocus, weekStartsOn]);
385
+
386
+ // The focused day may have been in an unmounted pane a frame ago; focus it
387
+ // once it exists, and only in response to a key press so a scroll never
388
+ // steals focus.
389
+ const focusedISO = focusedDate == null ? null : plainDateToISO(focusedDate);
390
+ useEffect(() => {
391
+ if (!shouldRestoreFocusRef.current || focusedISO == null) {
392
+ return;
393
+ }
394
+ const target = scrollerRef.current?.querySelector(`[data-date="${focusedISO}"]`);
395
+ if (target != null) {
396
+ shouldRestoreFocusRef.current = false;
397
+ // preventScroll: the scroller is already snapping to this month; a
398
+ // browser scroll-into-view here would fight the snap and land between
399
+ // two panes.
400
+ target.focus({
401
+ preventScroll: true
402
+ });
403
+ }
404
+ }, [focusedISO]);
405
+ const visibleRows = paneWindow(centerRow, rowCount, OVERSCAN);
406
+
407
+ // A focus event fires for the programmatic focus above too; only take the
408
+ // date when it is actually a different day.
409
+ const handleDayFocus = useCallback(date => {
410
+ setFocusedDate(previous => previous != null && plainDateIsEqual(previous, date) ? previous : date);
411
+ }, []);
412
+ return /*#__PURE__*/_jsx("div", {
413
+ ref: scrollerRef,
414
+ "data-scroller": "months",
415
+ ...{
416
+ className: "x1n2onr6 xm8gem x9f619 xw2csxc x10wlt62 xhfbhpw xish69e x1rohswg x1bblx7b"
417
+ },
418
+ children: /*#__PURE__*/_jsx("div", {
419
+ ...stylex.props(styles.spacer, dynamic.spacer(rowCount * paneSize)),
420
+ children: paneSize > 0 && rowsIn(visibleRows).map(row => /*#__PURE__*/_jsx(MonthPane, {
421
+ monthIndex: minMonthIndex + row,
422
+ insetInlineStart: row * paneSize,
423
+ inlineSize: paneSize,
424
+ selectedDate: selectedDate,
425
+ focusedDate: focusedDate,
426
+ today: today,
427
+ isDateDisabled: isDateDisabled,
428
+ weekStartsOn: weekStartsOn,
429
+ onSelect: onSelect,
430
+ onDayKeyDown: handleKeyDown,
431
+ onDayFocus: handleDayFocus
432
+ }, row))
433
+ })
434
+ });
435
+ }
436
+ MonthScroller.displayName = 'MonthScroller';
437
+ /**
438
+ * One month, as a six-row grid.
439
+ *
440
+ * There is no `role="columnheader"` row in here: the weekday names are a
441
+ * single sticky row outside the scroller (they would otherwise scroll away),
442
+ * so each day instead carries its weekday in its accessible name.
443
+ */
444
+ function MonthPane({
445
+ monthIndex,
446
+ insetInlineStart,
447
+ inlineSize,
448
+ selectedDate,
449
+ focusedDate,
450
+ today,
451
+ isDateDisabled,
452
+ weekStartsOn,
453
+ onSelect,
454
+ onDayKeyDown,
455
+ onDayFocus
456
+ }) {
457
+ const {
458
+ year,
459
+ month
460
+ } = fromMonthIndex(monthIndex);
461
+ const {
462
+ weeks
463
+ } = useCalendarDays({
464
+ year,
465
+ month,
466
+ weekStartsOn,
467
+ // Always six rows: a variable grid would make pane heights differ, and
468
+ // with them every snap offset below this month.
469
+ hasVariableRowCount: false
470
+ });
471
+ const monthLabel = plainDateFormat({
472
+ year,
473
+ month,
474
+ day: 1
475
+ }, DATE_FORMAT_MONTH_YEAR);
476
+
477
+ // Exactly one day per pane is tab-reachable, so Tab moves through the
478
+ // picker rather than through 42 buttons: the focused day if the keyboard
479
+ // owns one, else the selection, else the first of the month.
480
+ const tabbableISO = (() => {
481
+ if (focusedDate != null && focusedDate.year === year && focusedDate.month === month) {
482
+ return plainDateToISO(focusedDate);
483
+ }
484
+ if (selectedDate != null && selectedDate.year === year && selectedDate.month === month) {
485
+ return plainDateToISO(selectedDate);
486
+ }
487
+ return plainDateToISO({
488
+ year,
489
+ month,
490
+ day: 1
491
+ });
492
+ })();
493
+ return /*#__PURE__*/_jsx("div", {
494
+ role: "grid",
495
+ "aria-label": monthLabel,
496
+ "data-month": monthLabel,
497
+ ...stylex.props(styles.pane, dynamic.pane(insetInlineStart, inlineSize)),
498
+ children: weeks.map(week => /*#__PURE__*/_jsx("div", {
499
+ role: "row",
500
+ ...{
501
+ className: "xjp7ctv"
502
+ },
503
+ children: week.map(day => {
504
+ // A spilled day is context, not a choice. Calendar computes the
505
+ // same thing as `effectivelyDisabled: isDisabled || isOutside`,
506
+ // and guards today/selected on `!isOutside` beside it, so a date
507
+ // borrowed from a neighbouring month never carries a ring or a
508
+ // puck in the pane that is only showing it.
509
+ const isDisabled = day.isOutside || isDateDisabled(day.date);
510
+ const isSelected = !day.isOutside && selectedDate != null && plainDateIsEqual(day.date, selectedDate);
511
+ const isToday = !day.isOutside && plainDateIsEqual(day.date, today);
512
+ return /*#__PURE__*/_jsx("div", {
513
+ role: "gridcell",
514
+ "aria-selected": isSelected || undefined,
515
+ ...{
516
+ className: "x1n2onr6 x78zum5 x6s0dn4 xl56j7k"
517
+ },
518
+ children: /*#__PURE__*/_jsx("button", {
519
+ type: "button",
520
+ "data-date": day.iso,
521
+ tabIndex: day.iso === tabbableISO ? 0 : -1,
522
+ "aria-label": plainDateFormat(day.date, DATE_FORMAT_WITH_WEEKDAY),
523
+ "aria-disabled": isDisabled || undefined,
524
+ "aria-current": isToday ? 'date' : undefined,
525
+ onClick: () => {
526
+ if (!isDisabled) {
527
+ onSelect(day.iso);
528
+ }
529
+ },
530
+ onFocus: () => onDayFocus(day.date),
531
+ onKeyDown: event => onDayKeyDown(event, day.date),
532
+ ...stylex.props(styles.day, focusOutlineStyles.focusVisible,
533
+ // Outside FIRST, so disabled wins where both apply: a
534
+ // spilled day past the range is unselectable, and must
535
+ // not be painted more available than the in-month days
536
+ // beside it.
537
+ day.isOutside && styles.dayOutside, isDisabled && styles.dayDisabled),
538
+ children: /*#__PURE__*/_jsx("span", {
539
+ ...{
540
+ 0: {
541
+ className: "x78zum5 x6s0dn4 xl56j7k x1y2t9nm xw1wawg xjspbzw x1litavf x1y0btm7 x9r1u3d xjbqb8w xzo0q3i xuedmi6"
542
+ },
543
+ 4: {
544
+ className: "x78zum5 x6s0dn4 xl56j7k x1y2t9nm xw1wawg xjspbzw x1litavf x1y0btm7 x9r1u3d xzo0q3i xuedmi6 xjbqb8w x150ydqw xoevpu5"
545
+ },
546
+ 2: {
547
+ className: "x78zum5 x6s0dn4 xl56j7k x1y2t9nm xw1wawg xjspbzw x1litavf x1y0btm7 xjbqb8w xzo0q3i xuedmi6 xvy26l8 x2mo6ok"
548
+ },
549
+ 6: {
550
+ className: "x78zum5 x6s0dn4 xl56j7k x1y2t9nm xw1wawg xjspbzw x1litavf x1y0btm7 xzo0q3i xuedmi6 xjbqb8w x150ydqw xoevpu5 xvy26l8 x2mo6ok"
551
+ },
552
+ 1: {
553
+ className: "x78zum5 x6s0dn4 xl56j7k x1y2t9nm xw1wawg xjspbzw x1litavf x1y0btm7 xzo0q3i xuedmi6 x1ewilqj x1spg45b xad5do x17wrial x2mo6ok"
554
+ },
555
+ 5: {
556
+ className: "x78zum5 x6s0dn4 xl56j7k x1y2t9nm xw1wawg xjspbzw x1litavf x1y0btm7 xzo0q3i xuedmi6 x1ewilqj x1spg45b xad5do x17wrial x2mo6ok"
557
+ },
558
+ 3: {
559
+ className: "x78zum5 x6s0dn4 xl56j7k x1y2t9nm xw1wawg xjspbzw x1litavf x1y0btm7 xzo0q3i xuedmi6 x1ewilqj x1spg45b xad5do x17wrial x2mo6ok"
560
+ },
561
+ 7: {
562
+ className: "x78zum5 x6s0dn4 xl56j7k x1y2t9nm xw1wawg xjspbzw x1litavf x1y0btm7 xzo0q3i xuedmi6 x1ewilqj x1spg45b xad5do x17wrial x2mo6ok"
563
+ }
564
+ }[!!!isDisabled << 2 | !!isToday << 1 | !!isSelected << 0],
565
+ children: day.dayNumber
566
+ })
567
+ })
568
+ }, day.iso);
569
+ })
570
+ }, week[0].iso))
571
+ });
572
+ }
573
+ MonthPane.displayName = 'MonthPane';
@@ -0,0 +1,24 @@
1
+ export interface MonthYearWheelsProps {
2
+ /** The month the wheels currently show. */
3
+ monthIndex: number;
4
+ /** First reachable month. */
5
+ minMonthIndex: number;
6
+ /** Last reachable month. */
7
+ maxMonthIndex: number;
8
+ /** Fired when either wheel comes to rest on a new month. */
9
+ onChange: (monthIndex: number) => void;
10
+ /** Accessible name for the month wheel. */
11
+ monthLabel: string;
12
+ /** Accessible name for the year wheel. */
13
+ yearLabel: string;
14
+ /** False while the panel is hidden. */
15
+ isActive?: boolean;
16
+ }
17
+ /**
18
+ * Month and year wheels, bounded by the same range as the scroller.
19
+ */
20
+ export declare function MonthYearWheels({ monthIndex, minMonthIndex, maxMonthIndex, onChange, monthLabel, yearLabel, isActive, }: MonthYearWheelsProps): import("react").JSX.Element;
21
+ export declare namespace MonthYearWheels {
22
+ var displayName: string;
23
+ }
24
+ //# sourceMappingURL=MonthYearWheels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MonthYearWheels.d.ts","sourceRoot":"","sources":["../../src/DateInput/MonthYearWheels.tsx"],"names":[],"mappings":"AAuCA,MAAM,WAAW,oBAAoB;IACnC,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC9B,UAAU,EACV,aAAa,EACb,aAAa,EACb,QAAQ,EACR,UAAU,EACV,SAAS,EACT,QAAe,GAChB,EAAE,oBAAoB,+BA6EtB;yBArFe,eAAe"}