@astryxdesign/core 0.7.8 → 0.7.9-canary.0236bb8

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 (560) 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 +7 -2
  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/DateRangeInput/DateRangeInput.d.ts +17 -1
  62. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  63. package/dist/DateRangeInput/DateRangeInput.js +15 -8
  64. package/dist/DateTimeInput/DateTimeInput.d.ts +26 -3
  65. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  66. package/dist/DateTimeInput/DateTimeInput.js +92 -88
  67. package/dist/DateTimeInput/TouchDateTimeField.d.ts +1 -1
  68. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  69. package/dist/DateTimeInput/TouchDateTimeField.js +26 -20
  70. package/dist/Dialog/Dialog.d.ts +2 -1
  71. package/dist/Dialog/Dialog.d.ts.map +1 -1
  72. package/dist/Dialog/Dialog.js +14 -3
  73. package/dist/Drawer/useDrawerDialogPresence.d.ts +2 -1
  74. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  75. package/dist/Drawer/useDrawerDialogPresence.js +11 -2
  76. package/dist/DropdownMenu/DropdownMenu.d.ts +9 -1
  77. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  78. package/dist/DropdownMenu/DropdownMenu.js +11 -8
  79. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  80. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +3 -2
  81. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  82. package/dist/DropdownMenu/DropdownMenuItem.js +3 -2
  83. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  84. package/dist/DropdownMenu/DropdownMenuRadioItem.js +3 -2
  85. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  86. package/dist/DropdownMenu/DropdownMenuSubMenu.js +3 -2
  87. package/dist/Field/inputDisabledFocus.d.ts +4 -4
  88. package/dist/Field/inputStyles.stylex.d.ts +1 -1
  89. package/dist/FileInput/FileInput.d.ts.map +1 -1
  90. package/dist/FileInput/FileInput.js +16 -2
  91. package/dist/HoverCard/useHoverCard.d.ts +3 -1
  92. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  93. package/dist/Icon/Icon.d.ts +1 -1
  94. package/dist/InfoTip/InfoTip.d.ts +1 -0
  95. package/dist/InfoTip/InfoTip.d.ts.map +1 -1
  96. package/dist/InfoTip/InfoTip.js +6 -18
  97. package/dist/InputGroup/InputGroup.d.ts +4 -3
  98. package/dist/InputGroup/InputGroup.d.ts.map +1 -1
  99. package/dist/InputGroup/InputGroup.js +2 -2
  100. package/dist/InputGroup/groupStyles.d.ts +1 -1
  101. package/dist/InputGroup/groupStyles.d.ts.map +1 -1
  102. package/dist/InputGroup/groupStyles.js +1 -1
  103. package/dist/Item/Item.d.ts +20 -1
  104. package/dist/Item/Item.d.ts.map +1 -1
  105. package/dist/Item/Item.js +97 -29
  106. package/dist/Item/ItemListRowContext.d.ts +2 -0
  107. package/dist/Item/ItemListRowContext.d.ts.map +1 -0
  108. package/dist/Item/ItemListRowContext.js +16 -0
  109. package/dist/Layer/holdEntranceInput.d.ts +24 -0
  110. package/dist/Layer/holdEntranceInput.d.ts.map +1 -0
  111. package/dist/Layer/holdEntranceInput.js +65 -0
  112. package/dist/Layer/inputHold.d.ts +49 -0
  113. package/dist/Layer/inputHold.d.ts.map +1 -0
  114. package/dist/Layer/inputHold.js +636 -0
  115. package/dist/Layer/outsidePress.d.ts +4 -0
  116. package/dist/Layer/outsidePress.d.ts.map +1 -1
  117. package/dist/Layer/outsidePress.js +18 -1
  118. package/dist/Layer/preserveAnimations.d.ts +1 -5
  119. package/dist/Layer/preserveAnimations.d.ts.map +1 -1
  120. package/dist/Layer/preserveAnimations.js +12 -214
  121. package/dist/Layer/useBackdropPress.d.ts +8 -0
  122. package/dist/Layer/useBackdropPress.d.ts.map +1 -1
  123. package/dist/Layer/useBackdropPress.js +31 -2
  124. package/dist/Layer/useLayer.d.ts +3 -1
  125. package/dist/Layer/useLayer.d.ts.map +1 -1
  126. package/dist/Layer/useLayer.js +64 -4
  127. package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
  128. package/dist/Layer/useTouchTrigger.js +4 -0
  129. package/dist/Layout/LayoutContent.d.ts +3 -1
  130. package/dist/Layout/LayoutContent.d.ts.map +1 -1
  131. package/dist/Layout/LayoutContent.js +12 -4
  132. package/dist/Layout/LayoutPanel.d.ts +13 -10
  133. package/dist/Layout/LayoutPanel.d.ts.map +1 -1
  134. package/dist/Layout/LayoutPanel.js +70 -9
  135. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  136. package/dist/Lightbox/Lightbox.js +4 -0
  137. package/dist/List/List.d.ts.map +1 -1
  138. package/dist/List/List.js +1 -0
  139. package/dist/List/ListItem.d.ts +5 -4
  140. package/dist/List/ListItem.d.ts.map +1 -1
  141. package/dist/List/ListItem.js +45 -9
  142. package/dist/Markdown/parser.d.ts.map +1 -1
  143. package/dist/Markdown/parser.js +56 -39
  144. package/dist/MetadataList/MetadataList.js +1 -1
  145. package/dist/MobileNav/MobileNav.d.ts +11 -1
  146. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  147. package/dist/MobileNav/MobileNav.js +39 -1
  148. package/dist/MoreMenu/MoreMenu.d.ts +5 -3
  149. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  150. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  151. package/dist/MultiSelector/MultiSelector.js +6 -9
  152. package/dist/NumberInput/NumberInput.d.ts +4 -2
  153. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  154. package/dist/NumberInput/NumberInput.js +244 -11
  155. package/dist/Popover/usePopover.d.ts +1 -0
  156. package/dist/Popover/usePopover.d.ts.map +1 -1
  157. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  158. package/dist/PowerSearch/PowerSearch.js +12 -5
  159. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -1
  160. package/dist/PowerSearch/PowerSearchBottomSheet.js +4 -2
  161. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  162. package/dist/PowerSearch/PowerSearchToken.js +3 -1
  163. package/dist/PowerSearch/formatFilterValue.d.ts +9 -3
  164. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  165. package/dist/PowerSearch/formatFilterValue.js +14 -11
  166. package/dist/PowerSearch/formatTokenValue.d.ts +6 -2
  167. package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -1
  168. package/dist/PowerSearch/formatTokenValue.js +6 -3
  169. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  170. package/dist/RadioList/RadioListItem.js +16 -3
  171. package/dist/Resizable/ResizeHandle.d.ts +5 -5
  172. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  173. package/dist/Resizable/ResizeHandle.js +44 -5
  174. package/dist/Resizable/resizablePane.d.ts +58 -0
  175. package/dist/Resizable/resizablePane.d.ts.map +1 -0
  176. package/dist/Resizable/resizablePane.js +137 -0
  177. package/dist/Resizable/useResizable.d.ts +7 -0
  178. package/dist/Resizable/useResizable.d.ts.map +1 -1
  179. package/dist/Resizable/useResizable.js +13 -0
  180. package/dist/SelectableCard/SelectableCard.d.ts +1 -1
  181. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  182. package/dist/SelectableCard/SelectableCard.js +5 -1
  183. package/dist/Selector/Selector.d.ts.map +1 -1
  184. package/dist/Selector/Selector.js +51 -10
  185. package/dist/SideNav/SideNav.d.ts +9 -3
  186. package/dist/SideNav/SideNav.d.ts.map +1 -1
  187. package/dist/SideNav/SideNav.js +45 -10
  188. package/dist/Spinner/Spinner.d.ts.map +1 -1
  189. package/dist/Spinner/Spinner.js +14 -71
  190. package/dist/Spinner/index.d.ts +1 -1
  191. package/dist/Spinner/index.d.ts.map +1 -1
  192. package/dist/Spinner/spinnerRotor.d.ts +28 -0
  193. package/dist/Spinner/spinnerRotor.d.ts.map +1 -0
  194. package/dist/Spinner/spinnerRotor.js +98 -0
  195. package/dist/Stack/StackItem.d.ts +8 -4
  196. package/dist/Stack/StackItem.d.ts.map +1 -1
  197. package/dist/Stack/StackItem.js +17 -4
  198. package/dist/Switch/Switch.d.ts.map +1 -1
  199. package/dist/Switch/Switch.js +13 -10
  200. package/dist/TabList/Tab.d.ts.map +1 -1
  201. package/dist/TabList/Tab.js +5 -1
  202. package/dist/Table/plugins/sortable/useTableSortable.js +1 -1
  203. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  204. package/dist/Timestamp/Timestamp.js +14 -8
  205. package/dist/Timestamp/formatInstant.d.ts +10 -1
  206. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  207. package/dist/Timestamp/formatInstant.js +13 -27
  208. package/dist/Timestamp/tooltipEntries.d.ts +5 -3
  209. package/dist/Timestamp/tooltipEntries.d.ts.map +1 -1
  210. package/dist/Timestamp/tooltipEntries.js +6 -4
  211. package/dist/Token/Token.d.ts.map +1 -1
  212. package/dist/Token/Token.js +9 -0
  213. package/dist/Token/TokenLink.d.ts +1 -1
  214. package/dist/Token/TokenLink.d.ts.map +1 -1
  215. package/dist/Token/TokenLink.js +4 -1
  216. package/dist/Tokenizer/Tokenizer.d.ts +14 -10
  217. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  218. package/dist/Tokenizer/Tokenizer.js +189 -89
  219. package/dist/Tooltip/useTooltip.d.ts +3 -1
  220. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  221. package/dist/Tooltip/useTooltip.js +164 -59
  222. package/dist/TreeList/TreeListItem.d.ts +2 -1
  223. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  224. package/dist/TreeList/TreeListItem.js +27 -3
  225. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  226. package/dist/Typeahead/BaseTypeahead.js +2 -1
  227. package/dist/astryx.css +362 -325
  228. package/dist/gestures/GestureHost.d.ts +2 -2
  229. package/dist/gestures/GestureHost.d.ts.map +1 -1
  230. package/dist/gestures/GestureHost.js +21 -6
  231. package/dist/gestures/PanGestureRecognizer.d.ts +11 -1
  232. package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
  233. package/dist/gestures/PanGestureRecognizer.js +15 -1
  234. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +6 -1
  235. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -1
  236. package/dist/gestures/nativeScroll.d.ts +3 -6
  237. package/dist/gestures/nativeScroll.d.ts.map +1 -1
  238. package/dist/gestures/nativeScroll.js +7 -52
  239. package/dist/gestures/wheelSegmenter.d.ts +68 -1
  240. package/dist/gestures/wheelSegmenter.d.ts.map +1 -1
  241. package/dist/gestures/wheelSegmenter.js +199 -10
  242. package/dist/hooks/StackItemScrollRegion.d.ts +31 -0
  243. package/dist/hooks/StackItemScrollRegion.d.ts.map +1 -0
  244. package/dist/hooks/StackItemScrollRegion.js +40 -0
  245. package/dist/hooks/computeOverflow.d.ts +2 -0
  246. package/dist/hooks/computeOverflow.d.ts.map +1 -1
  247. package/dist/hooks/computeOverflow.js +1 -1
  248. package/dist/hooks/menuPressGesture.d.ts +133 -21
  249. package/dist/hooks/menuPressGesture.d.ts.map +1 -1
  250. package/dist/hooks/menuPressGesture.js +155 -30
  251. package/dist/hooks/menuPressValues.d.ts +16 -0
  252. package/dist/hooks/menuPressValues.d.ts.map +1 -0
  253. package/dist/hooks/menuPressValues.js +18 -0
  254. package/dist/hooks/useClickableContainer.d.ts +36 -7
  255. package/dist/hooks/useClickableContainer.d.ts.map +1 -1
  256. package/dist/hooks/useClickableContainer.js +63 -14
  257. package/dist/hooks/useFocusTrap.d.ts +10 -0
  258. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  259. package/dist/hooks/useFocusTrap.js +225 -132
  260. package/dist/hooks/useKeyboardHighlight.d.ts +17 -0
  261. package/dist/hooks/useKeyboardHighlight.d.ts.map +1 -0
  262. package/dist/hooks/useKeyboardHighlight.js +38 -0
  263. package/dist/hooks/useMediaQuery.d.ts +2 -1
  264. package/dist/hooks/useMediaQuery.d.ts.map +1 -1
  265. package/dist/hooks/useMediaQuery.js +37 -12
  266. package/dist/hooks/useMenuPress.d.ts +34 -1
  267. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  268. package/dist/hooks/useMenuPress.js +93 -5
  269. package/dist/hooks/useOverflow.d.ts.map +1 -1
  270. package/dist/hooks/useOverflow.js +190 -21
  271. package/dist/hooks/usePressFeedback.d.ts +6 -6
  272. package/dist/hooks/usePressFeedback.js +6 -6
  273. package/dist/hooks/useScrollRegionProps.d.ts +35 -0
  274. package/dist/hooks/useScrollRegionProps.d.ts.map +1 -0
  275. package/dist/hooks/useScrollRegionProps.js +51 -0
  276. package/dist/i18n/InternationalizationContext.d.ts +6 -0
  277. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  278. package/dist/i18n/InternationalizationProvider.d.ts +23 -3
  279. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  280. package/dist/i18n/InternationalizationProvider.js +8 -3
  281. package/dist/i18n/generated-english/DateInput/DateInput.generated.d.ts.map +1 -1
  282. package/dist/i18n/generated-english/DateInput/DateInput.generated.js +0 -1
  283. package/dist/i18n/generated-english/DateInput/useTypedDate.generated.d.ts +8 -0
  284. package/dist/i18n/generated-english/DateInput/useTypedDate.generated.d.ts.map +1 -0
  285. package/dist/i18n/generated-english/DateInput/useTypedDate.generated.js +16 -0
  286. package/dist/i18n/generated-english/DateTimeInput/DateTimeInput.generated.d.ts.map +1 -1
  287. package/dist/i18n/generated-english/DateTimeInput/DateTimeInput.generated.js +0 -1
  288. package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.d.ts +8 -0
  289. package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.d.ts.map +1 -0
  290. package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.js +12 -0
  291. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  292. package/dist/i18n/generated-locales/en.generated.js +5 -0
  293. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  294. package/dist/i18n/generated-locales/pseudo.generated.js +5 -0
  295. package/dist/i18n/index.d.ts +2 -0
  296. package/dist/i18n/index.d.ts.map +1 -1
  297. package/dist/i18n/index.js +1 -0
  298. package/dist/i18n/useCalendarSystem.d.ts +19 -0
  299. package/dist/i18n/useCalendarSystem.d.ts.map +1 -0
  300. package/dist/i18n/useCalendarSystem.js +61 -0
  301. package/dist/internal/calendar-system.d.ts +18 -0
  302. package/dist/internal/calendar-system.d.ts.map +1 -0
  303. package/dist/internal/calendar-system.js +19 -0
  304. package/dist/internal/spinner-rotor.d.ts +16 -0
  305. package/dist/internal/spinner-rotor.d.ts.map +1 -0
  306. package/dist/internal/spinner-rotor.js +16 -0
  307. package/dist/internal/touch.d.ts +14 -1
  308. package/dist/internal/touch.d.ts.map +1 -1
  309. package/dist/internal/touch.js +20 -2
  310. package/dist/motion/carryAnimations.d.ts +58 -0
  311. package/dist/motion/carryAnimations.d.ts.map +1 -0
  312. package/dist/motion/carryAnimations.js +305 -0
  313. package/dist/motion/transientCopy.d.ts +4 -2
  314. package/dist/motion/transientCopy.d.ts.map +1 -1
  315. package/dist/motion/transientCopy.js +34 -5
  316. package/dist/motion/uikit/gestures.d.ts +41 -0
  317. package/dist/motion/uikit/gestures.d.ts.map +1 -1
  318. package/dist/motion/uikit/gestures.js +25 -0
  319. package/dist/motion/uikit/index.d.ts +1 -1
  320. package/dist/motion/uikit/index.d.ts.map +1 -1
  321. package/dist/motion/uikit/index.js +1 -1
  322. package/dist/motion/uikit/timing.d.ts +14 -10
  323. package/dist/motion/uikit/timing.d.ts.map +1 -1
  324. package/dist/motion/uikit/timing.js +7 -5
  325. package/dist/privateAttributes/menuPressLit.stylex.d.ts +52 -0
  326. package/dist/privateAttributes/menuPressLit.stylex.d.ts.map +1 -0
  327. package/dist/privateAttributes/menuPressLit.stylex.js +99 -0
  328. package/dist/privateAttributes/press.stylex.d.ts +142 -0
  329. package/dist/privateAttributes/press.stylex.d.ts.map +1 -0
  330. package/dist/privateAttributes/press.stylex.js +101 -0
  331. package/dist/theme/themeMotion.d.ts +3 -2
  332. package/dist/theme/themeMotion.d.ts.map +1 -1
  333. package/dist/theme/themeMotion.js +3 -2
  334. package/dist/theme/tokens.stylex.d.ts +2 -2
  335. package/dist/theme/tokens.stylex.js +1 -1
  336. package/dist/utils/calendarDateParser.d.ts +110 -0
  337. package/dist/utils/calendarDateParser.d.ts.map +1 -0
  338. package/dist/utils/calendarDateParser.js +1225 -0
  339. package/dist/utils/calendarSystem.d.ts +176 -0
  340. package/dist/utils/calendarSystem.d.ts.map +1 -0
  341. package/dist/utils/calendarSystem.js +569 -0
  342. package/dist/utils/coarsePointer.d.ts +5 -0
  343. package/dist/utils/coarsePointer.d.ts.map +1 -1
  344. package/dist/utils/coarsePointer.js +22 -13
  345. package/dist/utils/flatTree.d.ts +6 -3
  346. package/dist/utils/flatTree.d.ts.map +1 -1
  347. package/dist/utils/flatTree.js +13 -3
  348. package/dist/utils/focusReturn.d.ts +10 -2
  349. package/dist/utils/focusReturn.d.ts.map +1 -1
  350. package/dist/utils/focusReturn.js +16 -3
  351. package/dist/utils/hitArea.d.ts +8 -1
  352. package/dist/utils/hitArea.d.ts.map +1 -1
  353. package/dist/utils/hitArea.js +99 -9
  354. package/dist/utils/inputPresentation.d.ts +9 -1
  355. package/dist/utils/inputPresentation.d.ts.map +1 -1
  356. package/dist/utils/inputPresentation.js +15 -1
  357. package/dist/utils/inputStream.d.ts +14 -1
  358. package/dist/utils/inputStream.d.ts.map +1 -1
  359. package/dist/utils/inputStream.js +40 -9
  360. package/dist/utils/interactionOverlay.stylex.d.ts +5 -9
  361. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  362. package/dist/utils/interactionOverlay.stylex.js +29 -31
  363. package/dist/utils/plainDate.d.ts +38 -7
  364. package/dist/utils/plainDate.d.ts.map +1 -1
  365. package/dist/utils/plainDate.js +92 -18
  366. package/dist/utils/pressFeedback.d.ts +10 -2
  367. package/dist/utils/pressFeedback.d.ts.map +1 -1
  368. package/dist/utils/pressFeedback.js +40 -15
  369. package/dist/utils/pressGesture.d.ts +12 -6
  370. package/dist/utils/pressGesture.d.ts.map +1 -1
  371. package/dist/utils/pressGesture.js +26 -8
  372. package/dist/utils/scrollView.d.ts +25 -0
  373. package/dist/utils/scrollView.d.ts.map +1 -0
  374. package/dist/utils/scrollView.js +108 -0
  375. package/dist/utils/selectionLock.d.ts.map +1 -1
  376. package/dist/utils/selectionLock.js +1 -10
  377. package/dist/utils/touchHitArea.d.ts +30 -0
  378. package/dist/utils/touchHitArea.d.ts.map +1 -0
  379. package/dist/utils/touchHitArea.js +167 -0
  380. package/dist/utils/touchHitArea.stylex.d.ts +38 -0
  381. package/dist/utils/touchHitArea.stylex.d.ts.map +1 -0
  382. package/dist/utils/touchHitArea.stylex.js +48 -0
  383. package/dist/utils/triggerFocus.d.ts +5 -0
  384. package/dist/utils/triggerFocus.d.ts.map +1 -1
  385. package/dist/utils/triggerFocus.js +9 -2
  386. package/locales/en.json +21 -1
  387. package/locales/pseudo.json +15 -0
  388. package/package.json +15 -4
  389. package/src/AppShell/observeMainOverflow.ts +9 -6
  390. package/src/BottomSheet/BottomSheet.tsx +7 -2
  391. package/src/BottomSheet/BottomSheetPanel.tsx +64 -7
  392. package/src/BottomSheet/bottomSheetStack.ts +4 -3
  393. package/src/BottomSheet/useSheetGestures.ts +83 -20
  394. package/src/Calendar/Calendar.doc.mjs +76 -6
  395. package/src/Calendar/Calendar.tsx +123 -104
  396. package/src/Calendar/getInitialFocusDate.ts +22 -8
  397. package/src/Calendar/hooks/useCalendarDays.ts +89 -63
  398. package/src/Calendar/hooks/useCalendarNavigation.ts +68 -26
  399. package/src/CheckboxInput/CheckboxInput.doc.mjs +5 -4
  400. package/src/CheckboxInput/CheckboxInput.tsx +105 -20
  401. package/src/CheckboxInput/CheckboxRowPressContext.ts +22 -0
  402. package/src/CheckboxList/CheckboxList.doc.mjs +9 -0
  403. package/src/CheckboxList/CheckboxListItem.doc.mjs +3 -3
  404. package/src/CheckboxList/CheckboxListItem.tsx +35 -14
  405. package/src/ClickableCard/ClickableCard.tsx +8 -1
  406. package/src/ContextMenu/ContextMenu.tsx +2 -0
  407. package/src/DateInput/DateInput.doc.mjs +45 -12
  408. package/src/DateInput/DateInput.tsx +165 -179
  409. package/src/DateInput/MonthScroller.tsx +39 -37
  410. package/src/DateInput/MonthYearWheels.tsx +68 -47
  411. package/src/DateInput/PickerWheel.tsx +7 -2
  412. package/src/DateInput/TouchDateField.tsx +45 -17
  413. package/src/DateInput/monthGeometry.ts +110 -8
  414. package/src/DateInput/useCalendarPresentation.ts +64 -0
  415. package/src/DateInput/useTypedDate.ts +469 -0
  416. package/src/DateRangeInput/DateRangeInput.doc.mjs +9 -0
  417. package/src/DateRangeInput/DateRangeInput.tsx +43 -9
  418. package/src/DateTimeInput/DateTimeInput.doc.mjs +42 -9
  419. package/src/DateTimeInput/DateTimeInput.tsx +138 -148
  420. package/src/DateTimeInput/TouchDateTimeField.tsx +31 -16
  421. package/src/Dialog/Dialog.doc.mjs +1 -1
  422. package/src/Dialog/Dialog.tsx +14 -2
  423. package/src/Drawer/Drawer.doc.mjs +1 -1
  424. package/src/Drawer/useDrawerDialogPresence.ts +9 -2
  425. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -2
  426. package/src/DropdownMenu/DropdownMenu.tsx +31 -7
  427. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +5 -1
  428. package/src/DropdownMenu/DropdownMenuItem.tsx +8 -4
  429. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +5 -1
  430. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +5 -1
  431. package/src/FileInput/FileInput.tsx +16 -2
  432. package/src/HoverCard/useHoverCard.tsx +3 -1
  433. package/src/InfoTip/InfoTip.doc.mjs +26 -2
  434. package/src/InfoTip/InfoTip.tsx +6 -27
  435. package/src/InputGroup/InputGroup.doc.mjs +4 -3
  436. package/src/InputGroup/InputGroup.tsx +4 -3
  437. package/src/InputGroup/groupStyles.ts +3 -1
  438. package/src/Item/Item.tsx +139 -35
  439. package/src/Item/ItemListRowContext.tsx +18 -0
  440. package/src/Layer/holdEntranceInput.ts +84 -0
  441. package/src/Layer/inputHold.ts +734 -0
  442. package/src/Layer/outsidePress.ts +18 -1
  443. package/src/Layer/preserveAnimations.ts +12 -275
  444. package/src/Layer/useBackdropPress.ts +41 -1
  445. package/src/Layer/useLayer.tsx +77 -4
  446. package/src/Layer/useTouchTrigger.ts +4 -0
  447. package/src/Layout/LayoutContent.doc.mjs +6 -3
  448. package/src/Layout/LayoutContent.tsx +10 -4
  449. package/src/Layout/LayoutPanel.doc.mjs +14 -11
  450. package/src/Layout/LayoutPanel.tsx +98 -15
  451. package/src/Lightbox/Lightbox.tsx +4 -0
  452. package/src/List/List.doc.mjs +10 -1
  453. package/src/List/List.tsx +5 -0
  454. package/src/List/ListItem.tsx +63 -8
  455. package/src/Markdown/parser.ts +65 -42
  456. package/src/MetadataList/MetadataList.tsx +1 -1
  457. package/src/MobileNav/MobileNav.doc.mjs +3 -3
  458. package/src/MobileNav/MobileNav.tsx +39 -1
  459. package/src/MoreMenu/MoreMenu.doc.mjs +2 -4
  460. package/src/MoreMenu/MoreMenu.tsx +5 -3
  461. package/src/MultiSelector/MultiSelector.tsx +7 -17
  462. package/src/NumberInput/NumberInput.doc.mjs +1 -1
  463. package/src/NumberInput/NumberInput.tsx +259 -11
  464. package/src/Popover/usePopover.tsx +1 -0
  465. package/src/PowerSearch/PowerSearch.doc.mjs +3 -3
  466. package/src/PowerSearch/PowerSearch.tsx +20 -3
  467. package/src/PowerSearch/PowerSearchBottomSheet.tsx +4 -1
  468. package/src/PowerSearch/PowerSearchToken.tsx +3 -0
  469. package/src/PowerSearch/formatFilterValue.ts +21 -11
  470. package/src/PowerSearch/formatTokenValue.ts +7 -1
  471. package/src/RadioList/RadioListItem.doc.mjs +3 -2
  472. package/src/RadioList/RadioListItem.tsx +16 -6
  473. package/src/Resizable/Resizable.doc.mjs +40 -12
  474. package/src/Resizable/ResizeHandle.tsx +68 -6
  475. package/src/Resizable/resizablePane.ts +179 -0
  476. package/src/Resizable/useResizable.ts +15 -0
  477. package/src/SelectableCard/SelectableCard.tsx +8 -1
  478. package/src/Selector/Selector.tsx +83 -8
  479. package/src/SideNav/SideNav.doc.mjs +2 -2
  480. package/src/SideNav/SideNav.tsx +87 -12
  481. package/src/Spinner/Spinner.tsx +7 -89
  482. package/src/Spinner/index.ts +1 -5
  483. package/src/Spinner/spinnerRotor.ts +113 -0
  484. package/src/Stack/Stack.doc.mjs +1 -1
  485. package/src/Stack/StackItem.tsx +27 -13
  486. package/src/Switch/Switch.tsx +7 -6
  487. package/src/TabList/Tab.tsx +5 -1
  488. package/src/Table/plugins/sortable/useTableSortable.tsx +1 -1
  489. package/src/Timestamp/Timestamp.doc.mjs +3 -3
  490. package/src/Timestamp/Timestamp.tsx +13 -8
  491. package/src/Timestamp/formatInstant.ts +49 -28
  492. package/src/Timestamp/tooltipEntries.ts +7 -3
  493. package/src/Token/Token.tsx +18 -1
  494. package/src/Token/TokenLink.tsx +7 -1
  495. package/src/Tokenizer/Tokenizer.doc.mjs +3 -3
  496. package/src/Tokenizer/Tokenizer.tsx +252 -115
  497. package/src/Tooltip/useTooltip.tsx +180 -80
  498. package/src/TreeList/TreeListItem.tsx +36 -2
  499. package/src/Typeahead/BaseTypeahead.tsx +2 -0
  500. package/src/gestures/GestureHost.ts +21 -5
  501. package/src/gestures/PanGestureRecognizer.ts +19 -2
  502. package/src/gestures/README.md +14 -5
  503. package/src/gestures/ScreenEdgePanGestureRecognizer.ts +6 -1
  504. package/src/gestures/nativeScroll.ts +12 -68
  505. package/src/gestures/wheelSegmenter.ts +243 -10
  506. package/src/hooks/StackItemScrollRegion.tsx +57 -0
  507. package/src/hooks/computeOverflow.ts +1 -1
  508. package/src/hooks/menuPressGesture.ts +244 -38
  509. package/src/hooks/menuPressValues.ts +18 -0
  510. package/src/hooks/useClickableContainer.doc.mjs +8 -2
  511. package/src/hooks/useClickableContainer.ts +93 -15
  512. package/src/hooks/useFocusTrap.ts +268 -151
  513. package/src/hooks/useKeyboardHighlight.ts +71 -0
  514. package/src/hooks/useMediaQuery.ts +41 -12
  515. package/src/hooks/useMenuPress.ts +118 -11
  516. package/src/hooks/useOverflow.ts +297 -73
  517. package/src/hooks/usePressFeedback.doc.mjs +3 -3
  518. package/src/hooks/usePressFeedback.ts +6 -6
  519. package/src/hooks/useScrollRegionProps.ts +76 -0
  520. package/src/i18n/InternationalizationContext.ts +6 -0
  521. package/src/i18n/InternationalizationProvider.doc.mjs +29 -1
  522. package/src/i18n/InternationalizationProvider.tsx +35 -3
  523. package/src/i18n/generated-english/DateInput/DateInput.generated.ts +0 -1
  524. package/src/i18n/generated-english/DateInput/useTypedDate.generated.ts +17 -0
  525. package/src/i18n/generated-english/DateTimeInput/DateTimeInput.generated.ts +0 -1
  526. package/src/i18n/generated-english/hooks/useScrollRegionProps.generated.ts +13 -0
  527. package/src/i18n/generated-locales/en.generated.ts +7 -0
  528. package/src/i18n/generated-locales/pseudo.generated.ts +7 -0
  529. package/src/i18n/index.ts +2 -0
  530. package/src/i18n/useCalendarSystem.ts +95 -0
  531. package/src/internal/calendar-system.ts +26 -0
  532. package/src/internal/spinner-rotor.ts +20 -0
  533. package/src/internal/touch.ts +34 -1
  534. package/src/motion/MEASUREMENTS.md +11 -0
  535. package/src/motion/carryAnimations.ts +389 -0
  536. package/src/motion/transientCopy.ts +45 -5
  537. package/src/motion/uikit/gestures.ts +22 -0
  538. package/src/motion/uikit/index.ts +1 -0
  539. package/src/motion/uikit/timing.ts +7 -5
  540. package/src/privateAttributes/menuPressLit.stylex.ts +104 -0
  541. package/src/privateAttributes/press.stylex.ts +261 -0
  542. package/src/theme/themeMotion.ts +3 -2
  543. package/src/theme/tokens.stylex.ts +1 -1
  544. package/src/utils/calendarDateParser.ts +1385 -0
  545. package/src/utils/calendarSystem.ts +832 -0
  546. package/src/utils/coarsePointer.ts +27 -14
  547. package/src/utils/flatTree.ts +15 -3
  548. package/src/utils/focusReturn.ts +17 -3
  549. package/src/utils/hitArea.ts +138 -9
  550. package/src/utils/inputPresentation.ts +21 -1
  551. package/src/utils/inputStream.ts +47 -10
  552. package/src/utils/interactionOverlay.stylex.ts +19 -22
  553. package/src/utils/plainDate.ts +130 -19
  554. package/src/utils/pressFeedback.ts +46 -14
  555. package/src/utils/pressGesture.ts +35 -9
  556. package/src/utils/scrollView.ts +135 -0
  557. package/src/utils/selectionLock.ts +5 -10
  558. package/src/utils/touchHitArea.stylex.ts +56 -0
  559. package/src/utils/touchHitArea.ts +177 -0
  560. 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,
@@ -100,6 +115,8 @@ const styles = stylex.create({
100
115
  },
101
116
  });
102
117
 
118
+ const returnFalse = () => false;
119
+
103
120
  // Dynamic styles for sizing props
104
121
  const dynamicStyles = stylex.create({
105
122
  sizing: (width: SizeValue | null) => ({
@@ -144,6 +161,8 @@ export interface LayoutPanelProps extends BaseProps<HTMLDivElement> {
144
161
  /**
145
162
  * Accessible label for the landmark.
146
163
  * Required when role is set and multiple landmarks of the same type exist.
164
+ * While the panel scrolls, it also names the scrolling region, which
165
+ * otherwise takes a translated "Content".
147
166
  */
148
167
  label?: string;
149
168
 
@@ -161,20 +180,20 @@ export interface LayoutPanelProps extends BaseProps<HTMLDivElement> {
161
180
  width?: SizeValue;
162
181
 
163
182
  /**
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.
183
+ * The output of `useResizable()`, or its `props`. When provided, the panel
184
+ * width is driven by the hook and a resize handle should be placed
185
+ * adjacent to this panel.
167
186
  *
168
187
  * @example
169
188
  * ```
170
- * const sidebar = useResizable({ defaultSize: 250, minSize: 200 });
171
- * <LayoutPanel resizable={sidebar.props}>
189
+ * const resizable = useResizable({ defaultSize: 250, minSize: 200 });
190
+ * <LayoutPanel resizable={resizable}>
172
191
  * <Navigation />
173
192
  * </LayoutPanel>
174
- * <ResizeHandle resizable={sidebar.props} />
193
+ * <ResizeHandle resizable={resizable} />
175
194
  * ```
176
195
  */
177
- resizable?: ResizableProps;
196
+ resizable?: ResizableRegion | ResizableProps;
178
197
  }
179
198
 
180
199
  /**
@@ -213,19 +232,76 @@ export function LayoutPanel({
213
232
  padding,
214
233
  role,
215
234
  width,
216
- resizable,
235
+ resizable: resizableValue,
217
236
  xstyle,
218
237
  className,
219
238
  style,
220
239
  ref,
221
240
  ...props
222
241
  }: LayoutPanelProps) {
242
+ const resizable =
243
+ resizableValue == null ? undefined : resizablePropsOf(resizableValue);
223
244
  const area = use(LayoutAreaContext);
224
245
  const {hasHeader, hasFooter} = use(LayoutSlotsContext);
225
246
 
226
247
  // When resizable props are provided, use the hook-driven size
227
248
  const effectiveWidth = resizable ? resizable._size : width;
228
249
 
250
+ // With no `resizable`, a ResizeHandle beside the panel that has a region's
251
+ // props finds the panel and holds it collapsed with the region. The panel
252
+ // lends its element in its callback ref for that.
253
+ const [paneLink] = useState(createResizablePaneLink);
254
+ const isHeldCollapsed = useSyncExternalStore(
255
+ paneLink.subscribe,
256
+ paneLink.isCollapsed,
257
+ returnFalse,
258
+ );
259
+ const isLentBeside = resizable == null;
260
+ const lendRef = useCallback(
261
+ (element: HTMLDivElement | null) => {
262
+ paneLink.attach(isLentBeside ? element : null);
263
+ },
264
+ [paneLink, isLentBeside],
265
+ );
266
+
267
+ // A collapsing panel moves focus inside it to its ResizeHandle, through the
268
+ // focus-leaving sequence that disclosures share. It goes inert and hidden
269
+ // from assistive technology a commit later, so inert never drops that focus
270
+ // to the page. Opening drops both at once. The ResizeHandle beside it holds
271
+ // the region's collapse state, or else the `resizable` props hold it.
272
+ const elementRef = useRef<HTMLDivElement>(null);
273
+ const isRegionCollapsed =
274
+ resizable == null ? isHeldCollapsed : resizable._isCollapsed;
275
+ const noteFocusBeforeCollapse = useFocusLeavingChange(
276
+ isRegionCollapsed,
277
+ (wasCollapsed: boolean) =>
278
+ wasCollapsed ? null : noteFocusWithin(elementRef.current),
279
+ (noted, isCollapsed) => {
280
+ const panel = elementRef.current;
281
+ if (isCollapsed && panel != null) {
282
+ moveFocusLeftBehind(
283
+ noted,
284
+ paneLink.focusTarget() ?? resizeHandleBeside(panel, area),
285
+ panel,
286
+ );
287
+ }
288
+ },
289
+ );
290
+ const [isSettledCollapsed, setIsSettledCollapsed] =
291
+ useState(isRegionCollapsed);
292
+ if (!isRegionCollapsed && isSettledCollapsed) {
293
+ setIsSettledCollapsed(false);
294
+ }
295
+ // Syncs `inert` with the browser's focus: the panel goes inert only after
296
+ // this commit's focus move.
297
+ useIsomorphicLayoutEffect(() => {
298
+ if (isRegionCollapsed && !isSettledCollapsed) {
299
+ // 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
300
+ setIsSettledCollapsed(true);
301
+ }
302
+ }, [isRegionCollapsed, isSettledCollapsed]);
303
+ const isConcealed = isRegionCollapsed && isSettledCollapsed;
304
+
229
305
  // Determine panel position
230
306
  const isStartPanel = area === 'start';
231
307
  const isEndPanel = area === 'end';
@@ -235,6 +311,8 @@ export function LayoutPanel({
235
311
  // When no divider, collapse spacing for seamless visual flow
236
312
  const shouldCollapseSpacing =
237
313
  !hasDivider && !isZeroPadding && padding == null;
314
+ const region = useScrollRegionProps({isScrollable, role, label});
315
+ const mergedRef = useMergedRefs(ref, region.ref, elementRef, lendRef);
238
316
 
239
317
  // Select divider style based on position
240
318
  const dividerStyle = isStartPanel
@@ -252,9 +330,9 @@ export function LayoutPanel({
252
330
 
253
331
  return (
254
332
  <div
255
- ref={ref}
256
- role={role}
257
- aria-label={label}
333
+ ref={mergedRef}
334
+ role={region.role}
335
+ aria-label={region['aria-label']}
258
336
  {...mergeProps(
259
337
  themeProps('layout-panel'),
260
338
  stylex.props(
@@ -281,7 +359,12 @@ export function LayoutPanel({
281
359
  className,
282
360
  style,
283
361
  )}
284
- {...props}>
362
+ {...props}
363
+ {...(isConcealed ? {inert: true, 'aria-hidden': true} : {})}>
364
+ <LayoutChangeSnapshot
365
+ value={isRegionCollapsed}
366
+ onBeforeChange={noteFocusBeforeCollapse}
367
+ />
285
368
  {children}
286
369
  </div>
287
370
  );
@@ -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'],
@@ -98,7 +98,7 @@ export const docs = {
98
98
  name: 'onOpenChange',
99
99
  type: '(isOpen: boolean) => void',
100
100
  description:
101
- 'Called when the drawer visibility changes (backdrop click, Escape key, or close button). Inside AppShell, this is managed automatically via context.',
101
+ 'Called when the drawer visibility changes (backdrop click, Escape key, or close button). Inside AppShell, this is managed automatically via context. On a phone or tablet (a coarse primary pointer), the drawer takes no tap or drag while it slides in; keys and assistive technology still act. After a close, focus returns to the element that opened it once its dialog closes.',
102
102
  },
103
103
  {
104
104
  name: 'children',
@@ -203,7 +203,7 @@ export const docsZh = {
203
203
  name: 'onOpenChange',
204
204
  type: '(isOpen: boolean) => void',
205
205
  description:
206
- '当抽屉可见性变化时调用(点击背景遮罩、按 Escape 键或点击关闭按钮)。',
206
+ '当抽屉可见性变化时调用(点击背景遮罩、按 Escape 键或点击关闭按钮)。在手机或平板上(主指针为粗指针时),抽屉滑入期间不接受点按或拖动;键盘和辅助技术仍可操作。关闭后,焦点会在对话框关闭时回到打开它的元素。',
207
207
  required: true,
208
208
  },
209
209
  {
@@ -311,7 +311,7 @@ export const docsDense = {
311
311
  propDescriptions: {
312
312
  isOpen: 'whether drawer is open',
313
313
  onOpenChange:
314
- 'called when drawer visibility changes (backdrop click, Escape, close button)',
314
+ 'called when drawer visibility changes (backdrop click, Escape, close button); under a coarse primary pointer the drawer takes no tap or drag while it slides in (keys still act)',
315
315
  children:
316
316
  'drawer content; typically SideNavSection/SideNavItem or any ReactNode',
317
317
  header: