@astryxdesign/core 0.7.8 → 0.7.9-canary.0200dfe

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 (585) hide show
  1. package/dist/AppShell/observeMainOverflow.d.ts.map +1 -1
  2. package/dist/AppShell/observeMainOverflow.js +9 -6
  3. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  4. package/dist/BottomSheet/BottomSheet.js +37 -3
  5. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  6. package/dist/BottomSheet/BottomSheetPanel.js +40 -8
  7. package/dist/BottomSheet/bottomSheetStack.d.ts.map +1 -1
  8. package/dist/BottomSheet/bottomSheetStack.js +4 -3
  9. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  10. package/dist/BottomSheet/useSheetGestures.js +61 -21
  11. package/dist/Calendar/Calendar.d.ts +14 -2
  12. package/dist/Calendar/Calendar.d.ts.map +1 -1
  13. package/dist/Calendar/Calendar.js +63 -74
  14. package/dist/Calendar/getInitialFocusDate.d.ts +4 -1
  15. package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -1
  16. package/dist/Calendar/getInitialFocusDate.js +7 -5
  17. package/dist/Calendar/hooks/useCalendarDays.d.ts +19 -2
  18. package/dist/Calendar/hooks/useCalendarDays.d.ts.map +1 -1
  19. package/dist/Calendar/hooks/useCalendarDays.js +57 -64
  20. package/dist/Calendar/hooks/useCalendarNavigation.d.ts +28 -3
  21. package/dist/Calendar/hooks/useCalendarNavigation.d.ts.map +1 -1
  22. package/dist/Calendar/hooks/useCalendarNavigation.js +33 -22
  23. package/dist/Calendar/styles.d.ts +1 -1
  24. package/dist/CheckboxInput/CheckboxInput.d.ts +2 -1
  25. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  26. package/dist/CheckboxInput/CheckboxInput.js +74 -18
  27. package/dist/CheckboxInput/CheckboxRowPressContext.d.ts +2 -0
  28. package/dist/CheckboxInput/CheckboxRowPressContext.d.ts.map +1 -0
  29. package/dist/CheckboxInput/CheckboxRowPressContext.js +20 -0
  30. package/dist/CheckboxList/CheckboxListItem.d.ts +2 -1
  31. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  32. package/dist/CheckboxList/CheckboxListItem.js +40 -14
  33. package/dist/ClickableCard/ClickableCard.d.ts +1 -1
  34. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  35. package/dist/ClickableCard/ClickableCard.js +5 -1
  36. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  37. package/dist/ContextMenu/ContextMenu.js +2 -0
  38. package/dist/DateInput/DateInput.d.ts +37 -6
  39. package/dist/DateInput/DateInput.d.ts.map +1 -1
  40. package/dist/DateInput/DateInput.js +97 -124
  41. package/dist/DateInput/MonthScroller.d.ts +5 -2
  42. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  43. package/dist/DateInput/MonthScroller.js +26 -29
  44. package/dist/DateInput/MonthYearWheels.d.ts +10 -1
  45. package/dist/DateInput/MonthYearWheels.d.ts.map +1 -1
  46. package/dist/DateInput/MonthYearWheels.js +54 -42
  47. package/dist/DateInput/PickerWheel.d.ts.map +1 -1
  48. package/dist/DateInput/PickerWheel.js +7 -1
  49. package/dist/DateInput/TouchDateField.d.ts +1 -1
  50. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  51. package/dist/DateInput/TouchDateField.js +26 -21
  52. package/dist/DateInput/monthGeometry.d.ts +42 -8
  53. package/dist/DateInput/monthGeometry.d.ts.map +1 -1
  54. package/dist/DateInput/monthGeometry.js +81 -7
  55. package/dist/DateInput/useCalendarPresentation.d.ts +10 -0
  56. package/dist/DateInput/useCalendarPresentation.d.ts.map +1 -0
  57. package/dist/DateInput/useCalendarPresentation.js +32 -0
  58. package/dist/DateInput/useTypedDate.d.ts +92 -0
  59. package/dist/DateInput/useTypedDate.d.ts.map +1 -0
  60. package/dist/DateInput/useTypedDate.js +269 -0
  61. package/dist/DateInput/wheelStrip.js +2 -2
  62. package/dist/DateRangeInput/DateRangeInput.d.ts +17 -1
  63. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  64. package/dist/DateRangeInput/DateRangeInput.js +15 -8
  65. package/dist/DateTimeInput/DateTimeInput.d.ts +26 -3
  66. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  67. package/dist/DateTimeInput/DateTimeInput.js +92 -88
  68. package/dist/DateTimeInput/TouchDateTimeField.d.ts +1 -1
  69. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  70. package/dist/DateTimeInput/TouchDateTimeField.js +26 -20
  71. package/dist/Dialog/Dialog.d.ts +2 -1
  72. package/dist/Dialog/Dialog.d.ts.map +1 -1
  73. package/dist/Dialog/Dialog.js +14 -3
  74. package/dist/Drawer/useDrawerDialogPresence.d.ts +2 -1
  75. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  76. package/dist/Drawer/useDrawerDialogPresence.js +11 -2
  77. package/dist/DropdownMenu/DropdownMenu.d.ts +9 -1
  78. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  79. package/dist/DropdownMenu/DropdownMenu.js +11 -8
  80. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  81. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +3 -2
  82. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  83. package/dist/DropdownMenu/DropdownMenuItem.js +3 -2
  84. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  85. package/dist/DropdownMenu/DropdownMenuRadioItem.js +3 -2
  86. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  87. package/dist/DropdownMenu/DropdownMenuSubMenu.js +3 -2
  88. package/dist/Field/inputDisabledFocus.d.ts +4 -4
  89. package/dist/Field/inputStyles.stylex.d.ts +1 -1
  90. package/dist/FileInput/FileInput.d.ts.map +1 -1
  91. package/dist/FileInput/FileInput.js +16 -2
  92. package/dist/HoverCard/useHoverCard.d.ts +3 -1
  93. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  94. package/dist/Icon/Icon.d.ts +1 -1
  95. package/dist/InfoTip/InfoTip.d.ts +1 -0
  96. package/dist/InfoTip/InfoTip.d.ts.map +1 -1
  97. package/dist/InfoTip/InfoTip.js +6 -18
  98. package/dist/InputGroup/InputGroup.d.ts +4 -3
  99. package/dist/InputGroup/InputGroup.d.ts.map +1 -1
  100. package/dist/InputGroup/InputGroup.js +2 -2
  101. package/dist/InputGroup/InputGroupText.d.ts +2 -1
  102. package/dist/InputGroup/InputGroupText.d.ts.map +1 -1
  103. package/dist/InputGroup/InputGroupText.js +2 -1
  104. package/dist/InputGroup/groupStyles.d.ts +1 -1
  105. package/dist/InputGroup/groupStyles.d.ts.map +1 -1
  106. package/dist/InputGroup/groupStyles.js +1 -1
  107. package/dist/Item/Item.d.ts +20 -1
  108. package/dist/Item/Item.d.ts.map +1 -1
  109. package/dist/Item/Item.js +97 -29
  110. package/dist/Item/ItemListRowContext.d.ts +2 -0
  111. package/dist/Item/ItemListRowContext.d.ts.map +1 -0
  112. package/dist/Item/ItemListRowContext.js +16 -0
  113. package/dist/Layer/holdEntranceInput.d.ts +24 -0
  114. package/dist/Layer/holdEntranceInput.d.ts.map +1 -0
  115. package/dist/Layer/holdEntranceInput.js +65 -0
  116. package/dist/Layer/inputHold.d.ts +49 -0
  117. package/dist/Layer/inputHold.d.ts.map +1 -0
  118. package/dist/Layer/inputHold.js +636 -0
  119. package/dist/Layer/outsidePress.d.ts +4 -0
  120. package/dist/Layer/outsidePress.d.ts.map +1 -1
  121. package/dist/Layer/outsidePress.js +18 -1
  122. package/dist/Layer/preserveAnimations.d.ts +1 -5
  123. package/dist/Layer/preserveAnimations.d.ts.map +1 -1
  124. package/dist/Layer/preserveAnimations.js +12 -214
  125. package/dist/Layer/useBackdropPress.d.ts +8 -0
  126. package/dist/Layer/useBackdropPress.d.ts.map +1 -1
  127. package/dist/Layer/useBackdropPress.js +31 -2
  128. package/dist/Layer/useLayer.d.ts +3 -1
  129. package/dist/Layer/useLayer.d.ts.map +1 -1
  130. package/dist/Layer/useLayer.js +64 -4
  131. package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
  132. package/dist/Layer/useTouchTrigger.js +4 -0
  133. package/dist/Layout/LayoutContent.d.ts +3 -1
  134. package/dist/Layout/LayoutContent.d.ts.map +1 -1
  135. package/dist/Layout/LayoutContent.js +12 -4
  136. package/dist/Layout/LayoutPanel.d.ts +13 -10
  137. package/dist/Layout/LayoutPanel.d.ts.map +1 -1
  138. package/dist/Layout/LayoutPanel.js +81 -11
  139. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  140. package/dist/Lightbox/Lightbox.js +4 -0
  141. package/dist/List/List.d.ts.map +1 -1
  142. package/dist/List/List.js +1 -0
  143. package/dist/List/ListItem.d.ts +5 -4
  144. package/dist/List/ListItem.d.ts.map +1 -1
  145. package/dist/List/ListItem.js +45 -9
  146. package/dist/Markdown/parser.d.ts.map +1 -1
  147. package/dist/Markdown/parser.js +56 -39
  148. package/dist/MetadataList/MetadataList.js +1 -1
  149. package/dist/MobileNav/MobileNav.d.ts +11 -1
  150. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  151. package/dist/MobileNav/MobileNav.js +39 -1
  152. package/dist/MoreMenu/MoreMenu.d.ts +5 -3
  153. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  154. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  155. package/dist/MultiSelector/MultiSelector.js +6 -9
  156. package/dist/NumberInput/NumberInput.d.ts +4 -2
  157. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  158. package/dist/NumberInput/NumberInput.js +244 -11
  159. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  160. package/dist/OverflowList/OverflowList.js +7 -2
  161. package/dist/Popover/usePopover.d.ts +1 -0
  162. package/dist/Popover/usePopover.d.ts.map +1 -1
  163. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  164. package/dist/PowerSearch/PowerSearch.js +12 -5
  165. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -1
  166. package/dist/PowerSearch/PowerSearchBottomSheet.js +4 -2
  167. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  168. package/dist/PowerSearch/PowerSearchToken.js +3 -1
  169. package/dist/PowerSearch/formatFilterValue.d.ts +9 -3
  170. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  171. package/dist/PowerSearch/formatFilterValue.js +14 -11
  172. package/dist/PowerSearch/formatTokenValue.d.ts +6 -2
  173. package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -1
  174. package/dist/PowerSearch/formatTokenValue.js +6 -3
  175. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  176. package/dist/RadioList/RadioListItem.js +16 -3
  177. package/dist/Resizable/ResizeHandle.d.ts +5 -5
  178. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  179. package/dist/Resizable/ResizeHandle.js +44 -5
  180. package/dist/Resizable/resizablePane.d.ts +58 -0
  181. package/dist/Resizable/resizablePane.d.ts.map +1 -0
  182. package/dist/Resizable/resizablePane.js +137 -0
  183. package/dist/Resizable/useResizable.d.ts +7 -0
  184. package/dist/Resizable/useResizable.d.ts.map +1 -1
  185. package/dist/Resizable/useResizable.js +13 -0
  186. package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
  187. package/dist/SelectableCard/SelectableCard.d.ts +1 -1
  188. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  189. package/dist/SelectableCard/SelectableCard.js +5 -1
  190. package/dist/Selector/Selector.d.ts.map +1 -1
  191. package/dist/Selector/Selector.js +51 -10
  192. package/dist/SideNav/SideNav.d.ts +9 -3
  193. package/dist/SideNav/SideNav.d.ts.map +1 -1
  194. package/dist/SideNav/SideNav.js +45 -10
  195. package/dist/Slider/sliderTouchController.js +2 -2
  196. package/dist/Spinner/Spinner.d.ts.map +1 -1
  197. package/dist/Spinner/Spinner.js +14 -71
  198. package/dist/Spinner/index.d.ts +1 -1
  199. package/dist/Spinner/index.d.ts.map +1 -1
  200. package/dist/Spinner/spinnerRotor.d.ts +28 -0
  201. package/dist/Spinner/spinnerRotor.d.ts.map +1 -0
  202. package/dist/Spinner/spinnerRotor.js +98 -0
  203. package/dist/Stack/StackItem.d.ts +8 -4
  204. package/dist/Stack/StackItem.d.ts.map +1 -1
  205. package/dist/Stack/StackItem.js +17 -4
  206. package/dist/Switch/Switch.d.ts.map +1 -1
  207. package/dist/Switch/Switch.js +13 -10
  208. package/dist/Switch/useSwitchTouch.js +4 -4
  209. package/dist/TabList/Tab.d.ts.map +1 -1
  210. package/dist/TabList/Tab.js +5 -1
  211. package/dist/Table/plugins/sortable/useTableSortable.js +1 -1
  212. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  213. package/dist/Timestamp/Timestamp.js +14 -8
  214. package/dist/Timestamp/formatInstant.d.ts +10 -1
  215. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  216. package/dist/Timestamp/formatInstant.js +13 -27
  217. package/dist/Timestamp/tooltipEntries.d.ts +5 -3
  218. package/dist/Timestamp/tooltipEntries.d.ts.map +1 -1
  219. package/dist/Timestamp/tooltipEntries.js +6 -4
  220. package/dist/Token/Token.d.ts.map +1 -1
  221. package/dist/Token/Token.js +9 -0
  222. package/dist/Token/TokenLink.d.ts +1 -1
  223. package/dist/Token/TokenLink.d.ts.map +1 -1
  224. package/dist/Token/TokenLink.js +4 -1
  225. package/dist/Tokenizer/Tokenizer.d.ts +14 -10
  226. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  227. package/dist/Tokenizer/Tokenizer.js +189 -89
  228. package/dist/Tooltip/useTooltip.d.ts +3 -1
  229. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  230. package/dist/Tooltip/useTooltip.js +164 -59
  231. package/dist/TreeList/TreeListItem.d.ts +2 -1
  232. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  233. package/dist/TreeList/TreeListItem.js +27 -3
  234. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  235. package/dist/Typeahead/BaseTypeahead.js +2 -1
  236. package/dist/animator/createAnimator.js +2 -2
  237. package/dist/astryx.css +362 -325
  238. package/dist/gestures/GestureHost.d.ts +2 -2
  239. package/dist/gestures/GestureHost.d.ts.map +1 -1
  240. package/dist/gestures/GestureHost.js +21 -6
  241. package/dist/gestures/PanGestureRecognizer.d.ts +11 -1
  242. package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
  243. package/dist/gestures/PanGestureRecognizer.js +15 -1
  244. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +6 -1
  245. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -1
  246. package/dist/gestures/nativeScroll.d.ts +3 -6
  247. package/dist/gestures/nativeScroll.d.ts.map +1 -1
  248. package/dist/gestures/nativeScroll.js +7 -52
  249. package/dist/gestures/wheelSegmenter.d.ts +68 -1
  250. package/dist/gestures/wheelSegmenter.d.ts.map +1 -1
  251. package/dist/gestures/wheelSegmenter.js +199 -10
  252. package/dist/hooks/StackItemScrollRegion.d.ts +31 -0
  253. package/dist/hooks/StackItemScrollRegion.d.ts.map +1 -0
  254. package/dist/hooks/StackItemScrollRegion.js +40 -0
  255. package/dist/hooks/computeOverflow.d.ts +2 -0
  256. package/dist/hooks/computeOverflow.d.ts.map +1 -1
  257. package/dist/hooks/computeOverflow.js +1 -1
  258. package/dist/hooks/menuPressGesture.d.ts +133 -21
  259. package/dist/hooks/menuPressGesture.d.ts.map +1 -1
  260. package/dist/hooks/menuPressGesture.js +155 -30
  261. package/dist/hooks/menuPressValues.d.ts +16 -0
  262. package/dist/hooks/menuPressValues.d.ts.map +1 -0
  263. package/dist/hooks/menuPressValues.js +18 -0
  264. package/dist/hooks/useClickableContainer.d.ts +36 -7
  265. package/dist/hooks/useClickableContainer.d.ts.map +1 -1
  266. package/dist/hooks/useClickableContainer.js +63 -14
  267. package/dist/hooks/useFocusTrap.d.ts +10 -0
  268. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  269. package/dist/hooks/useFocusTrap.js +225 -132
  270. package/dist/hooks/useKeyboardHighlight.d.ts +17 -0
  271. package/dist/hooks/useKeyboardHighlight.d.ts.map +1 -0
  272. package/dist/hooks/useKeyboardHighlight.js +38 -0
  273. package/dist/hooks/useMediaQuery.d.ts +2 -1
  274. package/dist/hooks/useMediaQuery.d.ts.map +1 -1
  275. package/dist/hooks/useMediaQuery.js +37 -12
  276. package/dist/hooks/useMenuPress.d.ts +34 -1
  277. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  278. package/dist/hooks/useMenuPress.js +93 -5
  279. package/dist/hooks/useOverflow.d.ts +10 -0
  280. package/dist/hooks/useOverflow.d.ts.map +1 -1
  281. package/dist/hooks/useOverflow.js +214 -23
  282. package/dist/hooks/usePressFeedback.d.ts +6 -6
  283. package/dist/hooks/usePressFeedback.js +6 -6
  284. package/dist/hooks/useScrollRegionProps.d.ts +35 -0
  285. package/dist/hooks/useScrollRegionProps.d.ts.map +1 -0
  286. package/dist/hooks/useScrollRegionProps.js +51 -0
  287. package/dist/i18n/InternationalizationContext.d.ts +6 -0
  288. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  289. package/dist/i18n/InternationalizationProvider.d.ts +23 -3
  290. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  291. package/dist/i18n/InternationalizationProvider.js +8 -3
  292. package/dist/i18n/generated-english/DateInput/DateInput.generated.d.ts.map +1 -1
  293. package/dist/i18n/generated-english/DateInput/DateInput.generated.js +0 -1
  294. package/dist/i18n/generated-english/DateInput/useTypedDate.generated.d.ts +8 -0
  295. package/dist/i18n/generated-english/DateInput/useTypedDate.generated.d.ts.map +1 -0
  296. package/dist/i18n/generated-english/DateInput/useTypedDate.generated.js +16 -0
  297. package/dist/i18n/generated-english/DateTimeInput/DateTimeInput.generated.d.ts.map +1 -1
  298. package/dist/i18n/generated-english/DateTimeInput/DateTimeInput.generated.js +0 -1
  299. package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.d.ts +8 -0
  300. package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.d.ts.map +1 -0
  301. package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.js +12 -0
  302. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  303. package/dist/i18n/generated-locales/en.generated.js +5 -0
  304. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  305. package/dist/i18n/generated-locales/pseudo.generated.js +5 -0
  306. package/dist/i18n/index.d.ts +2 -0
  307. package/dist/i18n/index.d.ts.map +1 -1
  308. package/dist/i18n/index.js +1 -0
  309. package/dist/i18n/useCalendarSystem.d.ts +19 -0
  310. package/dist/i18n/useCalendarSystem.d.ts.map +1 -0
  311. package/dist/i18n/useCalendarSystem.js +61 -0
  312. package/dist/internal/calendar-system.d.ts +18 -0
  313. package/dist/internal/calendar-system.d.ts.map +1 -0
  314. package/dist/internal/calendar-system.js +19 -0
  315. package/dist/internal/spinner-rotor.d.ts +16 -0
  316. package/dist/internal/spinner-rotor.d.ts.map +1 -0
  317. package/dist/internal/spinner-rotor.js +16 -0
  318. package/dist/internal/touch.d.ts +20 -2
  319. package/dist/internal/touch.d.ts.map +1 -1
  320. package/dist/internal/touch.js +29 -3
  321. package/dist/motion/animator.d.ts +5 -5
  322. package/dist/motion/animator.d.ts.map +1 -1
  323. package/dist/motion/animator.js +7 -6
  324. package/dist/motion/carryAnimations.d.ts +58 -0
  325. package/dist/motion/carryAnimations.d.ts.map +1 -0
  326. package/dist/motion/carryAnimations.js +305 -0
  327. package/dist/motion/transientCopy.d.ts +4 -2
  328. package/dist/motion/transientCopy.d.ts.map +1 -1
  329. package/dist/motion/transientCopy.js +34 -5
  330. package/dist/motion/uikit/gestures.d.ts +41 -0
  331. package/dist/motion/uikit/gestures.d.ts.map +1 -1
  332. package/dist/motion/uikit/gestures.js +25 -0
  333. package/dist/motion/uikit/index.d.ts +1 -1
  334. package/dist/motion/uikit/index.d.ts.map +1 -1
  335. package/dist/motion/uikit/index.js +1 -1
  336. package/dist/motion/uikit/timing.d.ts +14 -10
  337. package/dist/motion/uikit/timing.d.ts.map +1 -1
  338. package/dist/motion/uikit/timing.js +7 -5
  339. package/dist/privateAttributes/menuPressLit.stylex.d.ts +52 -0
  340. package/dist/privateAttributes/menuPressLit.stylex.d.ts.map +1 -0
  341. package/dist/privateAttributes/menuPressLit.stylex.js +99 -0
  342. package/dist/privateAttributes/press.stylex.d.ts +142 -0
  343. package/dist/privateAttributes/press.stylex.d.ts.map +1 -0
  344. package/dist/privateAttributes/press.stylex.js +101 -0
  345. package/dist/theme/themeMotion.d.ts +3 -2
  346. package/dist/theme/themeMotion.d.ts.map +1 -1
  347. package/dist/theme/themeMotion.js +3 -2
  348. package/dist/theme/tokens.stylex.d.ts +2 -2
  349. package/dist/theme/tokens.stylex.js +1 -1
  350. package/dist/utils/calendarDateParser.d.ts +110 -0
  351. package/dist/utils/calendarDateParser.d.ts.map +1 -0
  352. package/dist/utils/calendarDateParser.js +1225 -0
  353. package/dist/utils/calendarSystem.d.ts +176 -0
  354. package/dist/utils/calendarSystem.d.ts.map +1 -0
  355. package/dist/utils/calendarSystem.js +569 -0
  356. package/dist/utils/coarsePointer.d.ts +5 -0
  357. package/dist/utils/coarsePointer.d.ts.map +1 -1
  358. package/dist/utils/coarsePointer.js +22 -13
  359. package/dist/utils/flatTree.d.ts +6 -3
  360. package/dist/utils/flatTree.d.ts.map +1 -1
  361. package/dist/utils/flatTree.js +13 -3
  362. package/dist/utils/focusReturn.d.ts +34 -13
  363. package/dist/utils/focusReturn.d.ts.map +1 -1
  364. package/dist/utils/focusReturn.js +64 -17
  365. package/dist/utils/hitArea.d.ts +8 -1
  366. package/dist/utils/hitArea.d.ts.map +1 -1
  367. package/dist/utils/hitArea.js +99 -9
  368. package/dist/utils/inputPresentation.d.ts +9 -1
  369. package/dist/utils/inputPresentation.d.ts.map +1 -1
  370. package/dist/utils/inputPresentation.js +15 -1
  371. package/dist/utils/inputStream.d.ts +14 -1
  372. package/dist/utils/inputStream.d.ts.map +1 -1
  373. package/dist/utils/inputStream.js +40 -9
  374. package/dist/utils/interactionOverlay.stylex.d.ts +5 -9
  375. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  376. package/dist/utils/interactionOverlay.stylex.js +29 -31
  377. package/dist/utils/plainDate.d.ts +38 -7
  378. package/dist/utils/plainDate.d.ts.map +1 -1
  379. package/dist/utils/plainDate.js +92 -18
  380. package/dist/utils/pressFeedback.d.ts +10 -2
  381. package/dist/utils/pressFeedback.d.ts.map +1 -1
  382. package/dist/utils/pressFeedback.js +40 -15
  383. package/dist/utils/pressGesture.d.ts +12 -6
  384. package/dist/utils/pressGesture.d.ts.map +1 -1
  385. package/dist/utils/pressGesture.js +26 -8
  386. package/dist/utils/scrollView.d.ts +25 -0
  387. package/dist/utils/scrollView.d.ts.map +1 -0
  388. package/dist/utils/scrollView.js +108 -0
  389. package/dist/utils/selectionLock.d.ts.map +1 -1
  390. package/dist/utils/selectionLock.js +1 -10
  391. package/dist/utils/touchHitArea.d.ts +30 -0
  392. package/dist/utils/touchHitArea.d.ts.map +1 -0
  393. package/dist/utils/touchHitArea.js +167 -0
  394. package/dist/utils/touchHitArea.stylex.d.ts +38 -0
  395. package/dist/utils/touchHitArea.stylex.d.ts.map +1 -0
  396. package/dist/utils/touchHitArea.stylex.js +48 -0
  397. package/dist/utils/triggerFocus.d.ts +5 -0
  398. package/dist/utils/triggerFocus.d.ts.map +1 -1
  399. package/dist/utils/triggerFocus.js +9 -2
  400. package/locales/en.json +21 -1
  401. package/locales/pseudo.json +15 -0
  402. package/package.json +15 -4
  403. package/src/AppShell/observeMainOverflow.ts +9 -6
  404. package/src/BottomSheet/BottomSheet.tsx +45 -3
  405. package/src/BottomSheet/BottomSheetPanel.tsx +64 -7
  406. package/src/BottomSheet/bottomSheetStack.ts +4 -3
  407. package/src/BottomSheet/useSheetGestures.ts +83 -20
  408. package/src/Calendar/Calendar.doc.mjs +76 -6
  409. package/src/Calendar/Calendar.tsx +123 -104
  410. package/src/Calendar/getInitialFocusDate.ts +22 -8
  411. package/src/Calendar/hooks/useCalendarDays.ts +89 -63
  412. package/src/Calendar/hooks/useCalendarNavigation.ts +68 -26
  413. package/src/CheckboxInput/CheckboxInput.doc.mjs +5 -4
  414. package/src/CheckboxInput/CheckboxInput.tsx +105 -20
  415. package/src/CheckboxInput/CheckboxRowPressContext.ts +22 -0
  416. package/src/CheckboxList/CheckboxList.doc.mjs +9 -0
  417. package/src/CheckboxList/CheckboxListItem.doc.mjs +3 -3
  418. package/src/CheckboxList/CheckboxListItem.tsx +35 -14
  419. package/src/ClickableCard/ClickableCard.tsx +8 -1
  420. package/src/ContextMenu/ContextMenu.tsx +2 -0
  421. package/src/DateInput/DateInput.doc.mjs +45 -12
  422. package/src/DateInput/DateInput.tsx +165 -179
  423. package/src/DateInput/MonthScroller.tsx +39 -37
  424. package/src/DateInput/MonthYearWheels.tsx +68 -47
  425. package/src/DateInput/PickerWheel.tsx +7 -2
  426. package/src/DateInput/TouchDateField.tsx +45 -17
  427. package/src/DateInput/monthGeometry.ts +110 -8
  428. package/src/DateInput/useCalendarPresentation.ts +64 -0
  429. package/src/DateInput/useTypedDate.ts +469 -0
  430. package/src/DateInput/wheelStrip.ts +2 -2
  431. package/src/DateRangeInput/DateRangeInput.doc.mjs +9 -0
  432. package/src/DateRangeInput/DateRangeInput.tsx +43 -9
  433. package/src/DateTimeInput/DateTimeInput.doc.mjs +42 -9
  434. package/src/DateTimeInput/DateTimeInput.tsx +138 -148
  435. package/src/DateTimeInput/TouchDateTimeField.tsx +31 -16
  436. package/src/Dialog/Dialog.doc.mjs +1 -1
  437. package/src/Dialog/Dialog.tsx +14 -2
  438. package/src/Drawer/Drawer.doc.mjs +1 -1
  439. package/src/Drawer/useDrawerDialogPresence.ts +9 -2
  440. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -2
  441. package/src/DropdownMenu/DropdownMenu.tsx +31 -7
  442. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +5 -1
  443. package/src/DropdownMenu/DropdownMenuItem.tsx +8 -4
  444. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +5 -1
  445. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +5 -1
  446. package/src/FileInput/FileInput.tsx +16 -2
  447. package/src/HoverCard/useHoverCard.tsx +3 -1
  448. package/src/Icon/useIcon.doc.mjs +94 -0
  449. package/src/InfoTip/InfoTip.doc.mjs +26 -2
  450. package/src/InfoTip/InfoTip.tsx +6 -27
  451. package/src/InputGroup/InputGroup.doc.mjs +4 -3
  452. package/src/InputGroup/InputGroup.tsx +4 -3
  453. package/src/InputGroup/InputGroupText.doc.mjs +45 -3
  454. package/src/InputGroup/InputGroupText.tsx +2 -1
  455. package/src/InputGroup/groupStyles.ts +3 -1
  456. package/src/Item/Item.tsx +139 -35
  457. package/src/Item/ItemListRowContext.tsx +18 -0
  458. package/src/Layer/holdEntranceInput.ts +84 -0
  459. package/src/Layer/inputHold.ts +734 -0
  460. package/src/Layer/outsidePress.ts +18 -1
  461. package/src/Layer/preserveAnimations.ts +12 -275
  462. package/src/Layer/useBackdropPress.ts +41 -1
  463. package/src/Layer/useLayer.tsx +77 -4
  464. package/src/Layer/useTouchTrigger.ts +4 -0
  465. package/src/Layout/LayoutContent.doc.mjs +6 -3
  466. package/src/Layout/LayoutContent.tsx +10 -4
  467. package/src/Layout/LayoutPanel.doc.mjs +14 -11
  468. package/src/Layout/LayoutPanel.tsx +113 -16
  469. package/src/Lightbox/Lightbox.tsx +4 -0
  470. package/src/List/List.doc.mjs +10 -1
  471. package/src/List/List.tsx +5 -0
  472. package/src/List/ListItem.tsx +63 -8
  473. package/src/Markdown/parser.ts +65 -42
  474. package/src/MetadataList/MetadataList.tsx +1 -1
  475. package/src/MobileNav/MobileNav.doc.mjs +3 -3
  476. package/src/MobileNav/MobileNav.tsx +39 -1
  477. package/src/MoreMenu/MoreMenu.doc.mjs +2 -4
  478. package/src/MoreMenu/MoreMenu.tsx +5 -3
  479. package/src/MultiSelector/MultiSelector.tsx +7 -17
  480. package/src/NumberInput/NumberInput.doc.mjs +1 -1
  481. package/src/NumberInput/NumberInput.tsx +259 -11
  482. package/src/OverflowList/OverflowList.tsx +15 -9
  483. package/src/Popover/usePopover.tsx +1 -0
  484. package/src/PowerSearch/PowerSearch.doc.mjs +3 -3
  485. package/src/PowerSearch/PowerSearch.tsx +20 -3
  486. package/src/PowerSearch/PowerSearchBottomSheet.tsx +4 -1
  487. package/src/PowerSearch/PowerSearchToken.tsx +3 -0
  488. package/src/PowerSearch/formatFilterValue.ts +21 -11
  489. package/src/PowerSearch/formatTokenValue.ts +7 -1
  490. package/src/RadioList/RadioListItem.doc.mjs +3 -2
  491. package/src/RadioList/RadioListItem.tsx +16 -6
  492. package/src/Resizable/Resizable.doc.mjs +40 -12
  493. package/src/Resizable/ResizeHandle.tsx +68 -6
  494. package/src/Resizable/resizablePane.ts +179 -0
  495. package/src/Resizable/useResizable.ts +15 -0
  496. package/src/SegmentedControl/useSegmentedSelectionMotion.ts +3 -3
  497. package/src/SelectableCard/SelectableCard.tsx +8 -1
  498. package/src/Selector/Selector.tsx +83 -8
  499. package/src/SideNav/SideNav.doc.mjs +2 -2
  500. package/src/SideNav/SideNav.tsx +87 -12
  501. package/src/Slider/sliderTouchController.ts +2 -2
  502. package/src/Spinner/Spinner.tsx +7 -89
  503. package/src/Spinner/index.ts +1 -5
  504. package/src/Spinner/spinnerRotor.ts +113 -0
  505. package/src/Stack/Stack.doc.mjs +1 -1
  506. package/src/Stack/StackItem.tsx +27 -13
  507. package/src/Switch/Switch.tsx +7 -6
  508. package/src/Switch/useSwitchTouch.ts +4 -4
  509. package/src/TabList/Tab.tsx +5 -1
  510. package/src/Table/plugins/sortable/useTableSortable.tsx +1 -1
  511. package/src/Timestamp/Timestamp.doc.mjs +3 -3
  512. package/src/Timestamp/Timestamp.tsx +13 -8
  513. package/src/Timestamp/formatInstant.ts +49 -28
  514. package/src/Timestamp/tooltipEntries.ts +7 -3
  515. package/src/Token/Token.tsx +18 -1
  516. package/src/Token/TokenLink.tsx +7 -1
  517. package/src/Tokenizer/Tokenizer.doc.mjs +3 -3
  518. package/src/Tokenizer/Tokenizer.tsx +252 -115
  519. package/src/Tooltip/useTooltip.tsx +180 -80
  520. package/src/TreeList/TreeListItem.tsx +36 -2
  521. package/src/Typeahead/BaseTypeahead.tsx +2 -0
  522. package/src/animator/createAnimator.ts +3 -3
  523. package/src/gestures/GestureHost.ts +21 -5
  524. package/src/gestures/PanGestureRecognizer.ts +19 -2
  525. package/src/gestures/README.md +14 -5
  526. package/src/gestures/ScreenEdgePanGestureRecognizer.ts +6 -1
  527. package/src/gestures/nativeScroll.ts +12 -68
  528. package/src/gestures/wheelSegmenter.ts +243 -10
  529. package/src/hooks/StackItemScrollRegion.tsx +57 -0
  530. package/src/hooks/computeOverflow.ts +1 -1
  531. package/src/hooks/menuPressGesture.ts +244 -38
  532. package/src/hooks/menuPressValues.ts +18 -0
  533. package/src/hooks/useClickableContainer.doc.mjs +8 -2
  534. package/src/hooks/useClickableContainer.ts +93 -15
  535. package/src/hooks/useFocusTrap.ts +268 -151
  536. package/src/hooks/useKeyboardHighlight.ts +71 -0
  537. package/src/hooks/useMediaQuery.ts +41 -12
  538. package/src/hooks/useMenuPress.ts +118 -11
  539. package/src/hooks/useOverflow.ts +321 -75
  540. package/src/hooks/usePressFeedback.doc.mjs +3 -3
  541. package/src/hooks/usePressFeedback.ts +6 -6
  542. package/src/hooks/useScrollRegionProps.ts +76 -0
  543. package/src/i18n/InternationalizationContext.ts +6 -0
  544. package/src/i18n/InternationalizationProvider.doc.mjs +29 -1
  545. package/src/i18n/InternationalizationProvider.tsx +35 -3
  546. package/src/i18n/generated-english/DateInput/DateInput.generated.ts +0 -1
  547. package/src/i18n/generated-english/DateInput/useTypedDate.generated.ts +17 -0
  548. package/src/i18n/generated-english/DateTimeInput/DateTimeInput.generated.ts +0 -1
  549. package/src/i18n/generated-english/hooks/useScrollRegionProps.generated.ts +13 -0
  550. package/src/i18n/generated-locales/en.generated.ts +7 -0
  551. package/src/i18n/generated-locales/pseudo.generated.ts +7 -0
  552. package/src/i18n/index.ts +2 -0
  553. package/src/i18n/useCalendarSystem.ts +95 -0
  554. package/src/internal/calendar-system.ts +26 -0
  555. package/src/internal/spinner-rotor.ts +20 -0
  556. package/src/internal/touch.ts +43 -2
  557. package/src/motion/MEASUREMENTS.md +11 -0
  558. package/src/motion/README.md +3 -3
  559. package/src/motion/animator.ts +7 -7
  560. package/src/motion/carryAnimations.ts +389 -0
  561. package/src/motion/transientCopy.ts +45 -5
  562. package/src/motion/uikit/gestures.ts +22 -0
  563. package/src/motion/uikit/index.ts +1 -0
  564. package/src/motion/uikit/timing.ts +7 -5
  565. package/src/privateAttributes/menuPressLit.stylex.ts +104 -0
  566. package/src/privateAttributes/press.stylex.ts +261 -0
  567. package/src/theme/themeMotion.ts +3 -2
  568. package/src/theme/tokens.stylex.ts +1 -1
  569. package/src/utils/calendarDateParser.ts +1385 -0
  570. package/src/utils/calendarSystem.ts +832 -0
  571. package/src/utils/coarsePointer.ts +27 -14
  572. package/src/utils/flatTree.ts +15 -3
  573. package/src/utils/focusReturn.ts +78 -18
  574. package/src/utils/hitArea.ts +138 -9
  575. package/src/utils/inputPresentation.ts +21 -1
  576. package/src/utils/inputStream.ts +47 -10
  577. package/src/utils/interactionOverlay.stylex.ts +19 -22
  578. package/src/utils/plainDate.ts +130 -19
  579. package/src/utils/pressFeedback.ts +46 -14
  580. package/src/utils/pressGesture.ts +35 -9
  581. package/src/utils/scrollView.ts +135 -0
  582. package/src/utils/selectionLock.ts +5 -10
  583. package/src/utils/touchHitArea.stylex.ts +56 -0
  584. package/src/utils/touchHitArea.ts +177 -0
  585. package/src/utils/triggerFocus.ts +17 -4
@@ -53,7 +53,8 @@ export const docs = {
53
53
  {
54
54
  name: 'label',
55
55
  type: 'string',
56
- description: 'Accessible label for the landmark element.',
56
+ description:
57
+ 'Accessible label for the landmark element. While the region scrolls, it also names the scrolling region, which otherwise takes a translated "Content".',
57
58
  },
58
59
  {
59
60
  name: 'role',
@@ -64,13 +65,13 @@ export const docs = {
64
65
  name: 'width',
65
66
  type: 'number | string',
66
67
  description:
67
- 'Width of the panel. Numbers are treated as pixels, strings are used as-is. Ignored when resizable is provided; the hook controls width.',
68
+ "Width of the panel. Numbers are treated as pixels, strings are used as-is. Ignored when resizable is provided; the hook controls width. Beside a ResizeHandle given a useResizable region's props, a panel at width={region.size} is inert while the region is collapsed, and focus inside it moves to the handle as it collapses.",
68
69
  },
69
70
  {
70
71
  name: 'resizable',
71
- type: 'ResizableProps',
72
+ type: 'ResizableRegion | ResizableProps',
72
73
  description:
73
- "Resize props from useResizable(). When provided, the hook drives the panel width and a ResizeHandle should be placed adjacent to the panel. Carries the region's axis ('horizontal' | 'vertical'), which must match the adjacent ResizeHandle's direction.",
74
+ "The output of useResizable(), or its props. When provided, the hook drives the panel width and a ResizeHandle should be placed adjacent to the panel. Carries the region's axis ('horizontal' | 'vertical'), which must match the adjacent ResizeHandle's direction. Focus inside the panel moves to its ResizeHandle as it collapses, and the panel is inert while collapsed.",
74
75
  },
75
76
  ],
76
77
  };
@@ -106,7 +107,8 @@ export const docsZh = {
106
107
  {
107
108
  name: 'label',
108
109
  type: 'string',
109
- description: '地标元素的无障碍标签。',
110
+ description:
111
+ '地标元素的无障碍标签。区域滚动时,它也为滚动区域命名;未提供时使用已翻译的“Content”(内容)。',
110
112
  },
111
113
  {
112
114
  name: 'role',
@@ -117,13 +119,13 @@ export const docsZh = {
117
119
  name: 'width',
118
120
  type: 'number | string',
119
121
  description:
120
- '面板宽度。数字按像素处理,字符串按原样使用。提供 resizable 时忽略,宽度由 hook 控制。',
122
+ '面板宽度。数字按像素处理,字符串按原样使用。提供 resizable 时忽略,宽度由 hook 控制。放在接收 useResizable 区域 props 的 ResizeHandle 旁边、以 width={region.size} 渲染时,区域折叠期间面板为 inert,折叠时面板内的焦点移到手柄上。',
121
123
  },
122
124
  {
123
125
  name: 'resizable',
124
- type: 'ResizableProps',
126
+ type: 'ResizableRegion | ResizableProps',
125
127
  description:
126
- "来自 useResizable() 的调整大小属性。提供时面板宽度由 hook 驱动,应在面板旁放置 ResizeHandle。其中携带区域的轴向('horizontal' | 'vertical'),必须与相邻 ResizeHandle 的 direction 一致。",
128
+ "useResizable() 的返回值或其 props。提供时面板宽度由 hook 驱动,应在面板旁放置 ResizeHandle。其中携带区域的轴向('horizontal' | 'vertical'),必须与相邻 ResizeHandle 的 direction 一致。折叠时面板内的焦点会移到其 ResizeHandle 上,折叠期间面板为 inert。",
127
129
  },
128
130
  ],
129
131
  };
@@ -139,11 +141,12 @@ export const docsDense = {
139
141
  padding:
140
142
  'Internal padding on spacing scale. Overrides layout container default.',
141
143
  isScrollable: 'Enable scrollable overflow.',
142
- label: 'Accessible label for landmark element.',
144
+ label:
145
+ 'Accessible label for landmark element; also names the region while it scrolls (default "Content").',
143
146
  role: 'ARIA landmark role.',
144
147
  width:
145
- 'Panel width. Numbers = pixels, strings as-is. Ignored when resizable provided; hook controls width.',
148
+ 'Panel width. Numbers = pixels, strings as-is. Ignored when resizable provided; hook controls width. width={region.size} beside a ResizeHandle given the region props: inert while collapsed; focus inside moves to the handle on collapse.',
146
149
  resizable:
147
- 'Resize props from useResizable(). Hook drives panel width; place ResizeHandle adjacent.',
150
+ 'useResizable() output or its props. Hook drives panel width; place ResizeHandle adjacent. Focus inside moves to the handle on collapse; inert while collapsed.',
148
151
  },
149
152
  };
@@ -4,7 +4,8 @@
4
4
 
5
5
  /**
6
6
  * @file LayoutPanel.tsx
7
- * @input Uses React StyleX, LayoutAreaContext, LayoutSlotsContext
7
+ * @input Uses React StyleX, LayoutAreaContext, LayoutSlotsContext,
8
+ * useScrollRegionProps, resizablePane.ts
8
9
  * @output Exports LayoutPanel component and LayoutPanelProps
9
10
  * @position Sidebar panel for Layout start/end slots. Use for navigation panels,
10
11
  * settings sidebars, detail panels, or any fixed-width side content.
@@ -17,14 +18,28 @@
17
18
 
18
19
  import type {AriaRole, ReactNode} from 'react';
19
20
  import type {BaseProps} from '../BaseProps';
20
- import {use} from 'react';
21
+ import {use, useCallback, useRef, useState, useSyncExternalStore} from 'react';
21
22
  import * as stylex from '@stylexjs/stylex';
22
23
  import {colorVars, spacingVars} from '../theme/tokens.stylex';
23
24
  import {LayoutAreaContext} from './LayoutAreaContext';
24
25
  import {LayoutSlotsContext} from './LayoutSlotsContext';
26
+ import {useMergedRefs} from '../hooks/useMergedRefs';
27
+ import {useScrollRegionProps} from '../hooks/useScrollRegionProps';
25
28
  import {mergeProps} from '../utils';
26
29
  import type {SizeValue, SpacingStep} from '../utils/types';
27
- import type {ResizableProps} from '../Resizable/useResizable';
30
+ import {
31
+ resizablePropsOf,
32
+ type ResizableProps,
33
+ type ResizableRegion,
34
+ } from '../Resizable/useResizable';
35
+ import {
36
+ createResizablePaneLink,
37
+ resizeHandleBeside,
38
+ } from '../Resizable/resizablePane';
39
+ import {LayoutChangeSnapshot} from '../motion/LayoutChangeSnapshot';
40
+ import {useIsomorphicLayoutEffect} from '../hooks/useIsomorphicLayoutEffect';
41
+ import {moveFocusLeftBehind, noteFocusWithin} from '../utils/focusReturn';
42
+ import {useFocusLeavingChange} from '../utils/useFocusLeavingChange';
28
43
  import {themeProps} from '../utils/themeProps';
29
44
  import {
30
45
  paddingStyles,
@@ -77,6 +92,12 @@ const styles = stylex.create({
77
92
  scrollable: {
78
93
  overflow: 'auto',
79
94
  },
95
+ // At width 0 the padding box is 0 too, so the clip hides every child.
96
+ zeroWidth: {
97
+ paddingInlineStart: 0,
98
+ paddingInlineEnd: 0,
99
+ overflow: 'clip',
100
+ },
80
101
  // For start panel: divider on end edge
81
102
  dividerEnd: {
82
103
  borderInlineEndWidth: 1,
@@ -100,6 +121,8 @@ const styles = stylex.create({
100
121
  },
101
122
  });
102
123
 
124
+ const returnFalse = () => false;
125
+
103
126
  // Dynamic styles for sizing props
104
127
  const dynamicStyles = stylex.create({
105
128
  sizing: (width: SizeValue | null) => ({
@@ -144,6 +167,8 @@ export interface LayoutPanelProps extends BaseProps<HTMLDivElement> {
144
167
  /**
145
168
  * Accessible label for the landmark.
146
169
  * Required when role is set and multiple landmarks of the same type exist.
170
+ * While the panel scrolls, it also names the scrolling region, which
171
+ * otherwise takes a translated "Content".
147
172
  */
148
173
  label?: string;
149
174
 
@@ -161,20 +186,20 @@ export interface LayoutPanelProps extends BaseProps<HTMLDivElement> {
161
186
  width?: SizeValue;
162
187
 
163
188
  /**
164
- * Resize props from `useResizable()`. When provided, the panel width
165
- * is driven by the hook and a resize handle should be placed adjacent
166
- * to this panel.
189
+ * The output of `useResizable()`, or its `props`. When provided, the panel
190
+ * width is driven by the hook and a resize handle should be placed
191
+ * adjacent to this panel.
167
192
  *
168
193
  * @example
169
194
  * ```
170
- * const sidebar = useResizable({ defaultSize: 250, minSize: 200 });
171
- * <LayoutPanel resizable={sidebar.props}>
195
+ * const resizable = useResizable({ defaultSize: 250, minSize: 200 });
196
+ * <LayoutPanel resizable={resizable}>
172
197
  * <Navigation />
173
198
  * </LayoutPanel>
174
- * <ResizeHandle resizable={sidebar.props} />
199
+ * <ResizeHandle resizable={resizable} />
175
200
  * ```
176
201
  */
177
- resizable?: ResizableProps;
202
+ resizable?: ResizableRegion | ResizableProps;
178
203
  }
179
204
 
180
205
  /**
@@ -213,28 +238,94 @@ export function LayoutPanel({
213
238
  padding,
214
239
  role,
215
240
  width,
216
- resizable,
241
+ resizable: resizableValue,
217
242
  xstyle,
218
243
  className,
219
244
  style,
220
245
  ref,
221
246
  ...props
222
247
  }: LayoutPanelProps) {
248
+ const resizable =
249
+ resizableValue == null ? undefined : resizablePropsOf(resizableValue);
223
250
  const area = use(LayoutAreaContext);
224
251
  const {hasHeader, hasFooter} = use(LayoutSlotsContext);
225
252
 
226
253
  // When resizable props are provided, use the hook-driven size
227
254
  const effectiveWidth = resizable ? resizable._size : width;
228
255
 
256
+ // With no `resizable`, a ResizeHandle beside the panel that has a region's
257
+ // props finds the panel and holds it collapsed with the region. The panel
258
+ // lends its element in its callback ref for that.
259
+ const [paneLink] = useState(createResizablePaneLink);
260
+ const isHeldCollapsed = useSyncExternalStore(
261
+ paneLink.subscribe,
262
+ paneLink.isCollapsed,
263
+ returnFalse,
264
+ );
265
+ const isLentBeside = resizable == null;
266
+ const lendRef = useCallback(
267
+ (element: HTMLDivElement | null) => {
268
+ paneLink.attach(isLentBeside ? element : null);
269
+ },
270
+ [paneLink, isLentBeside],
271
+ );
272
+
273
+ // A collapsing panel moves focus inside it to its ResizeHandle, through the
274
+ // focus-leaving sequence that disclosures share. It goes inert and hidden
275
+ // from assistive technology a commit later, so inert never drops that focus
276
+ // to the page. Opening drops both at once. The ResizeHandle beside it holds
277
+ // the region's collapse state, or else the `resizable` props hold it.
278
+ const elementRef = useRef<HTMLDivElement>(null);
279
+ const isRegionCollapsed =
280
+ resizable == null ? isHeldCollapsed : resizable._isCollapsed;
281
+ const noteFocusBeforeCollapse = useFocusLeavingChange(
282
+ isRegionCollapsed,
283
+ (wasCollapsed: boolean) =>
284
+ wasCollapsed ? null : noteFocusWithin(elementRef.current),
285
+ (noted, isCollapsed) => {
286
+ const panel = elementRef.current;
287
+ if (isCollapsed && panel != null) {
288
+ moveFocusLeftBehind(
289
+ noted,
290
+ paneLink.focusTarget() ?? resizeHandleBeside(panel, area),
291
+ panel,
292
+ );
293
+ }
294
+ },
295
+ );
296
+ const [isSettledCollapsed, setIsSettledCollapsed] =
297
+ useState(isRegionCollapsed);
298
+ if (!isRegionCollapsed && isSettledCollapsed) {
299
+ setIsSettledCollapsed(false);
300
+ }
301
+ // Syncs `inert` with the browser's focus: the panel goes inert only after
302
+ // this commit's focus move.
303
+ useIsomorphicLayoutEffect(() => {
304
+ if (isRegionCollapsed && !isSettledCollapsed) {
305
+ // eslint-disable-next-line @eslint-react/set-state-in-effect -- the panel goes inert only after the focus-leaving move above ran in this commit; inert in the collapsing commit would drop that focus to the page first
306
+ setIsSettledCollapsed(true);
307
+ }
308
+ }, [isRegionCollapsed, isSettledCollapsed]);
309
+ const isConcealed = isRegionCollapsed && isSettledCollapsed;
310
+
229
311
  // Determine panel position
230
312
  const isStartPanel = area === 'start';
231
313
  const isEndPanel = area === 'end';
232
314
 
233
315
  const isZeroPadding = padding === 0;
316
+ // A collapsed region sizes its panel to 0.
317
+ const isZeroWidth = effectiveWidth === 0;
234
318
 
235
319
  // When no divider, collapse spacing for seamless visual flow
236
320
  const shouldCollapseSpacing =
237
- !hasDivider && !isZeroPadding && padding == null;
321
+ !hasDivider && !isZeroPadding && padding == null && !isZeroWidth;
322
+ // At width 0 the panel clips its content, so it does not scroll.
323
+ const region = useScrollRegionProps({
324
+ isScrollable: isScrollable && !isZeroWidth,
325
+ role,
326
+ label,
327
+ });
328
+ const mergedRef = useMergedRefs(ref, region.ref, elementRef, lendRef);
238
329
 
239
330
  // Select divider style based on position
240
331
  const dividerStyle = isStartPanel
@@ -252,9 +343,9 @@ export function LayoutPanel({
252
343
 
253
344
  return (
254
345
  <div
255
- ref={ref}
256
- role={role}
257
- aria-label={label}
346
+ ref={mergedRef}
347
+ role={region.role}
348
+ aria-label={region['aria-label']}
258
349
  {...mergeProps(
259
350
  themeProps('layout-panel'),
260
351
  stylex.props(
@@ -276,12 +367,18 @@ export function LayoutPanel({
276
367
  padding != null && containerPaddingBlockEndVarStyles[padding],
277
368
  hasDivider && dividerStyle,
278
369
  shouldCollapseSpacing && collapseStyle,
370
+ isZeroWidth && styles.zeroWidth,
279
371
  xstyle,
280
372
  ),
281
373
  className,
282
374
  style,
283
375
  )}
284
- {...props}>
376
+ {...props}
377
+ {...(isConcealed ? {inert: true, 'aria-hidden': true} : {})}>
378
+ <LayoutChangeSnapshot
379
+ value={isRegionCollapsed}
380
+ onBeforeChange={noteFocusBeforeCollapse}
381
+ />
285
382
  {children}
286
383
  </div>
287
384
  );
@@ -46,6 +46,7 @@ import {ModalAnnounceProvider} from '../hooks/ModalAnnounceProvider';
46
46
  import {overlayPaddingReset} from '../Layout/overlayPaddingReset.stylex';
47
47
  import {LayerDepthProvider} from '../Layer/LayerDepthContext';
48
48
  import {useLayerDismissal} from '../Layer/useLayerDismissal';
49
+ import {useFocusRegionContainment} from '../hooks/useFocusTrap';
49
50
 
50
51
  import {useMergedRefs} from '../hooks/useMergedRefs';
51
52
  import {isRtlElement} from '../hooks/isRtlElement';
@@ -341,6 +342,9 @@ export function Lightbox({
341
342
  const t = useComponentTranslator();
342
343
  const dialogRef = useRef<HTMLDialogElement>(null);
343
344
  const mergedDialogRef = useMergedRefs(ref, dialogRef);
345
+ // Native showModal() lets Tab leave for the browser's own UI, so the shared
346
+ // module wraps it.
347
+ useFocusRegionContainment(dialogRef, isOpen);
344
348
  const containerRef = useRef<HTMLDivElement>(null);
345
349
  const imageWrapperRef = useRef<HTMLDivElement>(null);
346
350
  const triggerElementRef = useRef<Element | null>(null);
@@ -13,6 +13,15 @@ export const docs = {
13
13
  {className: 'astryx-list', visualProps: ['density', 'listStyle']},
14
14
  {className: 'astryx-list-item'},
15
15
  ],
16
+ vars: [
17
+ {
18
+ name: '--_hit-border-bottom',
19
+ description:
20
+ "Width of the divider below a divided row, 0 on the last row. The row's touch hit layer adds it to its offset, so its band starts past the divider. ListItem sets it on the row's own ::after from --border-width under hasDividers, so content inside the row never inherits it, and a theme changes the divider through that token.",
21
+ default: '0px',
22
+ private: true,
23
+ },
24
+ ],
16
25
  },
17
26
  description: 'List container with density, dividers, and header support.',
18
27
  props: [
@@ -32,7 +41,7 @@ export const docs = {
32
41
  {
33
42
  name: 'density',
34
43
  type: "'compact' | 'balanced' | 'spacious'",
35
- description: 'Spacing density for items.',
44
+ description: "Spacing density for items. Under a finger, an interactive row's hit target reaches 44px where its neighbors leave room, with no change to how rows look or lay out.",
36
45
  default: "'balanced'",
37
46
  },
38
47
  {
package/src/List/List.tsx CHANGED
@@ -148,6 +148,11 @@ const styles = stylex.create({
148
148
  // `hidden`: hidden makes a scroll container, which fights the list's
149
149
  // vertical scroller. (StyleX emits the physical longhand of this axis.)
150
150
  overflowInline: 'clip',
151
+ // Under a finger, the isolation boundary for what rises inside the list.
152
+ // A row's touch band and a swipeable row order above the rows after them.
153
+ // They stay below a page-level sticky header at the same z-index. With a
154
+ // mouse nothing rises, so the list keeps its stacking.
155
+ isolation: {default: null, '@media (pointer: coarse)': 'isolate'},
151
156
  },
152
157
  // Subgridded numbered rows contribute their marker's intrinsic width to
153
158
  // one column, so text and nested lists never move with an individual number.
@@ -4,10 +4,11 @@
4
4
 
5
5
  /**
6
6
  * @file ListItem.tsx
7
- * @input Uses React, ReactNode, StyleXStyles, theme tokens, the List row edge
8
- * treatment, CheckboxInput, and the marker or task checkbox a
9
- * ListMarkerScope sets (Markdown's nested lists and the task items of mixed
10
- * lists), and Item's private exact-marker formatting scope for numbered
7
+ * @input Uses React, ReactNode, StyleXStyles, theme tokens and the List row
8
+ * edge treatment. It also uses the touch hit area (utils/touchHitArea.ts and
9
+ * its layer) and CheckboxInput. It reads the marker or task checkbox a
10
+ * ListMarkerScope sets, for Markdown's nested lists and the task items of mixed
11
+ * lists. It also reads Item's private exact-marker formatting scope for numbered
11
12
  * rows. Number markers stay on one line in the List's shared column,
12
13
  * keeping every sibling's text and nested list on the same start line;
13
14
  * they end on one line too, right-aligned with tabular figures, and hang
@@ -41,10 +42,14 @@ import type {BaseProps} from '../BaseProps';
41
42
  import {ListContext, type ListMarker} from './ListContext';
42
43
  import {CheckboxInput} from '../CheckboxInput/CheckboxInput';
43
44
  import {mergeProps} from '../utils/mergeProps';
44
- import {Item} from '../Item/Item';
45
+ import {Item, servesSwipeActions} from '../Item/Item';
46
+ import {ItemListRowContext} from '../Item/ItemListRowContext';
45
47
  import {ItemMarkerColumnsContext} from '../Item/ItemMarkerColumnsContext';
46
48
  import type {ItemAlign, ItemSwipeActions, ItemSwipeBehavior} from '../Item';
47
49
  import {themeProps} from '../utils/themeProps';
50
+ import {useMergedRefs} from '../hooks/useMergedRefs';
51
+ import {useTouchHitArea} from '../utils/touchHitArea';
52
+ import {touchHitAreaStyles} from '../utils/touchHitArea.stylex';
48
53
 
49
54
  // =============================================================================
50
55
  // Types
@@ -198,6 +203,21 @@ const styles = stylex.create({
198
203
  'max(var(--container-padding-inline-end, 0px), var(--_item-inset-inline))',
199
204
  borderRadius: 0,
200
205
  },
206
+ // Under a finger, the row's touch band rises above the rows after it. A
207
+ // later row is positioned with no z-index, so it would paint and hit-test
208
+ // over the band. Only inside a List (isInList).
209
+ bandRaised: {
210
+ '::after': {
211
+ zIndex: {default: null, '@media (pointer: coarse)': 1},
212
+ },
213
+ },
214
+ // A swipeable row is a stacking context at rest, since Item translates its
215
+ // swipe root. So its band's own z-index orders only inside it. Under a
216
+ // finger the row itself rises above the rows after it, whose boxes its band
217
+ // reaches into. The list isolates, so the row stays below a sticky header.
218
+ swipeRaised: {
219
+ zIndex: {default: null, '@media (pointer: coarse)': 1},
220
+ },
201
221
  withDivider: {
202
222
  borderBlockEndWidth: borderVars['--border-width'],
203
223
  borderBlockEndStyle: 'solid',
@@ -209,6 +229,15 @@ const styles = stylex.create({
209
229
  ':last-child': {
210
230
  borderBlockEndWidth: 0,
211
231
  },
232
+ // The touch hit layer's band starts past the divider, the edge of the box
233
+ // its insets are measured from (utils/touchHitArea.stylex.ts). The width
234
+ // sits on the layer itself, so content inside the row never inherits it.
235
+ '::after': {
236
+ '--_hit-border-bottom': {
237
+ default: borderVars['--border-width'],
238
+ ':last-child': '0px',
239
+ },
240
+ },
212
241
  },
213
242
  });
214
243
 
@@ -378,6 +407,28 @@ export function ListItem({
378
407
  ...restProps
379
408
  }: ListItemProps) {
380
409
  const ctx = use(ListContext);
410
+ // A List isolates its rows, so what a row raises stays below a page-level
411
+ // sticky header. Outside a List nothing bounds a raise, so a row raises
412
+ // nothing there.
413
+ const isInList = ctx != null;
414
+ // Under a finger, the row's hit target grows where its neighbors leave room.
415
+ const isTouchTarget =
416
+ (onClick != null || href != null || interactiveRef != null) && !isDisabled;
417
+ const hitAreaRef = useTouchHitArea(isTouchTarget);
418
+ const mergedRef = useMergedRefs(ref, hitAreaRef);
419
+ // A row that Item serves swipe actions on is a stacking context at rest. So
420
+ // its band's own z-index orders only inside it, and under a finger the row
421
+ // raises itself. Its root is its `<li>`, never a link.
422
+ const isRaisedSwipeRow =
423
+ isInList &&
424
+ isTouchTarget &&
425
+ servesSwipeActions({
426
+ swipeActions: restProps.swipeActions,
427
+ isDisabled,
428
+ isDelegate: interactiveRef != null,
429
+ isLinkRoot: false,
430
+ role: restProps.role,
431
+ });
381
432
  const density = ctx?.density ?? 'balanced';
382
433
  const hasDividers = ctx?.hasDividers ?? false;
383
434
  const edge = ctx?.edge ?? 'padded';
@@ -432,7 +483,7 @@ export function ListItem({
432
483
  const item = (
433
484
  <Item
434
485
  as="li"
435
- ref={ref}
486
+ ref={mergedRef}
436
487
  marker={marker}
437
488
  startContent={startContent}
438
489
  label={label}
@@ -453,6 +504,9 @@ export function ListItem({
453
504
  hasMarkers && styles.withCounter,
454
505
  hasDividers && styles.withDivider,
455
506
  hasDividers && embeddedStyles.noRadius,
507
+ isTouchTarget && touchHitAreaStyles.layer,
508
+ isTouchTarget && isInList && styles.bandRaised,
509
+ isRaisedSwipeRow && styles.swipeRaised,
456
510
  edge === 'flush' && styles.edgeFlush,
457
511
  edge === 'outset' && styles.edgeOutset,
458
512
  edge === 'bleed' && styles.edgeBleed,
@@ -463,12 +517,13 @@ export function ListItem({
463
517
  {...restProps}
464
518
  />
465
519
  );
520
+ const row = <ItemListRowContext value>{item}</ItemListRowContext>;
466
521
  // Only numbered rows contribute two cells to List's shared counter grid.
467
522
  // Passing the marker identity keeps this request off unrelated Items in slots.
468
523
  return listStyle === 'decimal' ? (
469
- <ItemMarkerColumnsContext value={marker}>{item}</ItemMarkerColumnsContext>
524
+ <ItemMarkerColumnsContext value={marker}>{row}</ItemMarkerColumnsContext>
470
525
  ) : (
471
- item
526
+ row
472
527
  );
473
528
  }
474
529
 
@@ -2748,11 +2748,12 @@ const URL_LITERAL_RE = new RegExp(
2748
2748
  /** Bare www. URL. Resulting href gets `http://` prepended. */
2749
2749
  const WWW_LITERAL_RE = new RegExp(`www\\.${ANY_NON_WHITESPACE_OR_ANGLE}`, 'g');
2750
2750
 
2751
- /** Bare email: local-part@domain (at least one dot in domain). */
2752
- const EMAIL_LITERAL_RE = new RegExp(
2753
- `${EMAIL_LOCAL_PART}@${DOMAIN_WITH_DOT}`,
2754
- 'g',
2755
- );
2751
+ /**
2752
+ * The domain of a bare email, with at least one dot. The scan matches it after
2753
+ * each `@`. A pattern that starts at every character rereads a long run each
2754
+ * time, so its cost grows with the square of the run.
2755
+ */
2756
+ const EMAIL_DOMAIN_RE = new RegExp(DOMAIN_WITH_DOT, 'y');
2756
2757
 
2757
2758
  /** Angle-bracket autolink: `<scheme:url>` (CommonMark §6.5). */
2758
2759
  const ANGLE_URL_RE = new RegExp(`<(${ANGLE_SCHEME}:${ANGLE_URL_BODY})>`, 'g');
@@ -2771,6 +2772,11 @@ const EMAIL_LOCAL_CHARS = new Set(
2771
2772
  'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._%+-@',
2772
2773
  );
2773
2774
 
2775
+ /** The characters `EMAIL_LOCAL_PART` allows. */
2776
+ const EMAIL_LOCAL_PART_CHARS = new Set(
2777
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._%+-',
2778
+ );
2779
+
2774
2780
  interface AutolinkMatch {
2775
2781
  start: number;
2776
2782
  end: number;
@@ -2786,35 +2792,30 @@ interface AutolinkMatch {
2786
2792
  * `https://example.com/Foo_(bar)` keeps the inner pair).
2787
2793
  */
2788
2794
  function peelTrailingPunctAndParens(url: string): string {
2789
- let s = url;
2790
- while (s.length > 0) {
2791
- // Peel trailing punctuation characters in one pass.
2792
- if (TRAILING_PUNCT_CHARS.has(s[s.length - 1])) {
2793
- let end = s.length - 1;
2794
- while (end > 0 && TRAILING_PUNCT_CHARS.has(s[end - 1])) {
2795
- end--;
2796
- }
2797
- s = s.slice(0, end);
2798
- continue;
2799
- }
2800
- if (s.endsWith(')')) {
2801
- let open = 0;
2802
- let close = 0;
2803
- for (let idx = 0; idx < s.length; idx++) {
2804
- if (s[idx] === '(') {
2805
- open++;
2806
- } else if (s[idx] === ')') {
2807
- close++;
2808
- }
2809
- }
2810
- if (close > open) {
2811
- s = s.slice(0, -1);
2812
- continue;
2813
- }
2795
+ // Each peeled `)` lowers the close count instead of a recount, so a long
2796
+ // run of `)` costs one pass.
2797
+ let open = 0;
2798
+ let close = 0;
2799
+ for (let idx = 0; idx < url.length; idx++) {
2800
+ if (url[idx] === '(') {
2801
+ open++;
2802
+ } else if (url[idx] === ')') {
2803
+ close++;
2804
+ }
2805
+ }
2806
+ let end = url.length;
2807
+ while (end > 0) {
2808
+ const ch = url[end - 1];
2809
+ if (TRAILING_PUNCT_CHARS.has(ch)) {
2810
+ end--;
2811
+ } else if (ch === ')' && close > open) {
2812
+ close--;
2813
+ end--;
2814
+ } else {
2815
+ break;
2814
2816
  }
2815
- break;
2816
2817
  }
2817
- return s;
2818
+ return url.slice(0, end);
2818
2819
  }
2819
2820
 
2820
2821
  /** Characters that, when preceding a URL, indicate it's part of a larger token. */
@@ -2922,26 +2923,48 @@ function scanAutolinksInText(text: string): AutolinkMatch[] {
2922
2923
  }
2923
2924
  }
2924
2925
 
2925
- // bare email
2926
+ // bare email: local-part@domain, found from each `@`
2926
2927
  {
2927
- const re = new RegExp(EMAIL_LITERAL_RE.source, 'g');
2928
- let m: RegExpExecArray | null;
2929
- while ((m = re.exec(text)) !== null) {
2930
- const prev = text[m.index - 1];
2928
+ // A match, accepted or not, ends where the next one may start.
2929
+ let consumedTo = 0;
2930
+ for (
2931
+ let at = text.indexOf('@');
2932
+ at !== -1;
2933
+ at = text.indexOf('@', at + 1)
2934
+ ) {
2935
+ let start = at;
2936
+ while (
2937
+ start > consumedTo &&
2938
+ EMAIL_LOCAL_PART_CHARS.has(text[start - 1])
2939
+ ) {
2940
+ start--;
2941
+ }
2942
+ if (start === at) {
2943
+ continue;
2944
+ }
2945
+ EMAIL_DOMAIN_RE.lastIndex = at + 1;
2946
+ const domain = EMAIL_DOMAIN_RE.exec(text);
2947
+ if (domain === null) {
2948
+ continue;
2949
+ }
2950
+ const end = at + 1 + domain[0].length;
2951
+ consumedTo = end;
2952
+ const prev = text[start - 1];
2931
2953
  // Reject if previous char could be part of the local part or sits in
2932
2954
  // a position that would make this match continuation of something
2933
2955
  // bigger (`name@x.y@host`, `foo+bar@x`, `mailto:user@host`).
2934
2956
  if (prev != null && EMAIL_LOCAL_CHARS.has(prev)) {
2935
2957
  continue;
2936
2958
  }
2937
- if (text.slice(Math.max(0, m.index - 7), m.index) === 'mailto:') {
2959
+ if (text.slice(Math.max(0, start - 7), start) === 'mailto:') {
2938
2960
  continue;
2939
2961
  }
2962
+ const email = text.slice(start, end);
2940
2963
  matches.push({
2941
- start: m.index,
2942
- end: m.index + m[0].length,
2943
- href: `mailto:${m[0]}`,
2944
- display: m[0],
2964
+ start,
2965
+ end,
2966
+ href: `mailto:${email}`,
2967
+ display: email,
2945
2968
  });
2946
2969
  }
2947
2970
  }
@@ -158,7 +158,7 @@ const styles = stylex.create({
158
158
  default: 'pointer',
159
159
  ':is(:disabled,[aria-disabled="true"])': 'default',
160
160
  },
161
- color: colorVars['--color-accent'],
161
+ color: colorVars['--color-text-accent'],
162
162
  fontSize: typeScaleVars['--text-body-size'],
163
163
  lineHeight: typeScaleVars['--text-body-leading'],
164
164
  fontWeight: fontWeightVars['--font-weight-medium'],