@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
@@ -2,7 +2,7 @@
2
2
 
3
3
  /**
4
4
  * @file tooltipEntries.ts
5
- * @input A Date and the consumer's tooltip entry list
5
+ * @input A Date, the consumer's tooltip entry list, a locale and a calendar
6
6
  * @output Pure formatting of one tooltip line per entry, plus the entry types
7
7
  * @position Leaf module; owns which zone each tooltip line names and whether
8
8
  * it needs a zone abbreviation, then defers to formatInstant to render it
@@ -25,6 +25,7 @@ import {devWarn} from '../utils/devWarning';
25
25
  import {formatInstant} from './formatInstant';
26
26
  import type {InstantFormat} from './formatInstant';
27
27
  import type {Locale} from '../i18n/types';
28
+ import type {CalendarSystem} from '../utils/calendarSystem';
28
29
 
29
30
  // =============================================================================
30
31
  // Types
@@ -197,15 +198,17 @@ function shouldShowZoneName(
197
198
  }
198
199
 
199
200
  /**
200
- * Renders one tooltip line per entry, in the order given.
201
+ * Renders one tooltip line per entry, in the order given, with dates in
202
+ * `calendar`.
201
203
  *
202
204
  * Pure: the same `date` and `entries` always produce the same lines for a given
203
- * host zone and locale.
205
+ * host zone, locale, and calendar.
204
206
  */
205
207
  export function formatTooltipLines(
206
208
  date: Date,
207
209
  entries: ReadonlyArray<TimestampTooltipEntry>,
208
210
  locale: Locale,
211
+ calendar: CalendarSystem = 'gregory',
209
212
  ): ReadonlyArray<TimestampTooltipLine> {
210
213
  const resolved = entries.map(entry => resolveTimezoneID(entry.timezoneID));
211
214
  const hasMultipleZones = new Set(resolved.map(zoneKey)).size > 1;
@@ -219,6 +222,7 @@ export function formatTooltipLines(
219
222
  isCopyable: entry.isCopyable ?? false,
220
223
  value: formatInstant(date, format, locale, {
221
224
  timeZone,
225
+ calendar,
222
226
  isTimezoneShown: shouldShowZoneName(
223
227
  format,
224
228
  hasMultipleZones,
@@ -39,6 +39,7 @@ import {themeProps} from '../utils/themeProps';
39
39
  import {focusOutlineProps} from '../utils/focusOutline.stylex';
40
40
  import {interactionOverlayStyles} from '../utils/interactionOverlay.stylex';
41
41
  import {usePressFeedback} from '../hooks/usePressFeedback';
42
+ import {cancelNestedTouchPress} from '../hooks/useClickableContainer';
42
43
  import type {TokenColorMap} from './index';
43
44
  import {disabledInteractionProps} from '../utils/disabledInteraction';
44
45
  import {TokenNamingContext} from './TokenNamingContext';
@@ -510,6 +511,19 @@ export function Token({
510
511
  }
511
512
  effectiveOnClick(e);
512
513
  };
514
+ // A finger press on Remove or a control in end content does not run the
515
+ // token's action, so the token shows no press for it. The inner button,
516
+ // the first button child, is the token's own action.
517
+ const handleContainerPointerDown = (
518
+ e: React.PointerEvent<HTMLSpanElement>,
519
+ ) => {
520
+ rest.onPointerDown?.(e);
521
+ cancelNestedTouchPress(
522
+ e,
523
+ e.currentTarget,
524
+ e.currentTarget.querySelector(':scope > button'),
525
+ );
526
+ };
513
527
 
514
528
  return (
515
529
  <span
@@ -535,7 +549,10 @@ export function Token({
535
549
  style,
536
550
  )}
537
551
  {...rest}
538
- {...sharedProps}>
552
+ {...sharedProps}
553
+ onPointerDown={
554
+ isDisabled ? rest.onPointerDown : handleContainerPointerDown
555
+ }>
539
556
  {icon}
540
557
  <button
541
558
  type="button"
@@ -90,12 +90,13 @@ export function TokenLink({
90
90
  removeButton,
91
91
  onClick: onClickProp,
92
92
  onMouseUp: onMouseUpProp,
93
+ onPointerDown: onPointerDownProp,
93
94
  ...containerProps
94
95
  }: TokenLinkProps) {
95
96
  const containerRef = useRef<HTMLElement | null>(null);
96
97
  const linkRef = useRef<HTMLElement | null>(null);
97
98
 
98
- const {onClick, onMouseUp} = useClickableContainer({
99
+ const {onClick, onMouseUp, onPointerDown} = useClickableContainer({
99
100
  containerRef,
100
101
  interactiveRef: linkRef,
101
102
  href,
@@ -113,6 +114,11 @@ export function TokenLink({
113
114
  isDisabled
114
115
  ? onMouseUpProp
115
116
  : composeEventHandlers(onMouseUpProp, onMouseUp)
117
+ }
118
+ onPointerDown={
119
+ isDisabled
120
+ ? onPointerDownProp
121
+ : composeEventHandlers(onPointerDownProp, onPointerDown)
116
122
  }>
117
123
  {icon}
118
124
  {isDisabled ? (
@@ -296,7 +296,7 @@ export const docs = {
296
296
  name: 'presentation',
297
297
  type: "'popover' | 'bottom-sheet' | 'adaptive'",
298
298
  description:
299
- 'How the field presents its choices. adaptive (the default) uses the bottom sheet on compact touch screens and the popover otherwise, resolved the same way Selector resolves it; the server render and the hydrating render are the popover. popover is the inline combobox with its anchored suggestion menu on every device. bottom-sheet replaces it on every device with a trigger showing the selected tokens that opens one tall modal sheet: a search row on top, full-width checkbox rows that keep their place while the sheet is open, a Create row with hasCreate, and a footer pinned in every state with a confirmed Clear all and Save; the sheet edits a draft, so onChange fires once, when Save commits it, and a swipe, scrim or Escape close of a changed draft asks before discarding. In the sheet presentation the trigger is the control: ref, id, aria-* and data-* reach it, and ref receives the trigger button there, so type it Ref<HTMLInputElement | HTMLButtonElement>, which the component accepts (TokenizerProps keeps its released input ref type). renderItem, renderToken, endContent, hasClear, hasEntriesOnFocus, menuWidth, tokenOverflowBehavior and hasAutoFocus have no surface in the sheet, and the field warns once in development when they are passed. Pass presentation="popover" to keep the inline field and those props on every device.',
299
+ 'How the field presents its choices. adaptive (the default) uses the bottom sheet on compact touch screens and the popover otherwise, resolved the same way Selector resolves it; the server render and the hydrating render are the popover. popover is the inline combobox with its anchored suggestion menu on every device. bottom-sheet replaces it on every device with a field showing the selected tokens, whose trigger opens one tall modal sheet: a search row on top, full-width checkbox rows that keep their place while the sheet is open, a Create row with hasCreate, and a footer pinned in every state with a confirmed Clear all and Save; the sheet edits a draft, so onChange fires once, when Save commits it, and a swipe, scrim or Escape close of a changed draft asks before discarding. In the sheet presentation the field box holds the trigger, the tokens and endContent, and keeps the box, theming target and focus ring of the inline field; the trigger is the control: ref, id, aria-* and data-* reach it, and ref receives the trigger button there, so type it Ref<HTMLInputElement | HTMLButtonElement>, which the component accepts (TokenizerProps keeps its released input ref type). endContent sits at the inline end of the field and renderToken renders its tokens, as in the inline field; their own controls act without opening the sheet. renderItem, hasClear (the sheet has its own Clear all), hasEntriesOnFocus, menuWidth, tokenOverflowBehavior (the field wraps its tokens) and hasAutoFocus have no surface in the sheet, and the field warns once in development when they are passed. Pass presentation="popover" to keep the inline field and those props on every device.',
300
300
  default: "'adaptive'",
301
301
  },
302
302
  ],
@@ -642,7 +642,7 @@ export const docsZh = {
642
642
  name: 'presentation',
643
643
  type: "'popover' | 'bottom-sheet' | 'adaptive'",
644
644
  description:
645
- '字段如何呈现选项。adaptive(默认)在紧凑触摸屏上使用底部面板,其他情况使用 popover,解析方式与 Selector 相同;服务端渲染和水合期间的渲染均为 popover。popover 在所有设备上为内联组合框及其锚定建议菜单。bottom-sheet 在所有设备上改为一个显示已选标记的触发按钮,点按后打开一个高的模态底部面板——顶部为搜索行,下方为整行复选框行(面板打开期间位置保持不变),hasCreate 时有「创建」行,底部固定显示需确认的「全部清除」和「保存」;面板编辑的是草稿,onChange 仅在「保存」提交时触发一次,草稿有改动时滑动、点击遮罩或按 Escape 关闭会先询问是否放弃。在底部面板呈现中,触发按钮即为控件:ref、id、aria-* 和 data-* 都作用于它,ref 在该呈现中收到的是触发按钮,因此请将其类型声明为组件所接受的 Ref<HTMLInputElement | HTMLButtonElement>(TokenizerProps 保留已发布的输入框 ref 类型)。renderItem、renderToken、endContent、hasClear、hasEntriesOnFocus、menuWidth、tokenOverflowBehavior 和 hasAutoFocus 在底部面板中没有作用对象,传入时开发模式下会警告一次。传入 presentation="popover" 可在所有设备上保留内联字段和这些属性。',
645
+ '字段如何呈现选项。adaptive(默认)在紧凑触摸屏上使用底部面板,其他情况使用 popover,解析方式与 Selector 相同;服务端渲染和水合期间的渲染均为 popover。popover 在所有设备上为内联组合框及其锚定建议菜单。bottom-sheet 在所有设备上改为一个显示已选标记的字段,点按其中的触发按钮后打开一个高的模态底部面板——顶部为搜索行,下方为整行复选框行(面板打开期间位置保持不变),hasCreate 时有「创建」行,底部固定显示需确认的「全部清除」和「保存」;面板编辑的是草稿,onChange 仅在「保存」提交时触发一次,草稿有改动时滑动、点击遮罩或按 Escape 关闭会先询问是否放弃。在底部面板呈现中,字段框包含触发按钮、标记和 endContent,并保留内联字段的外框、主题目标和焦点环;触发按钮即为控件:ref、id、aria-* 和 data-* 都作用于它,ref 在该呈现中收到的是触发按钮,因此请将其类型声明为组件所接受的 Ref<HTMLInputElement | HTMLButtonElement>(TokenizerProps 保留已发布的输入框 ref 类型)。endContent 位于字段的行内末端,renderToken 渲染字段中的标记,与内联字段相同;其中的控件可直接操作,不会打开底部面板。renderItem、hasClear(底部面板自带“全部清除”)、hasEntriesOnFocus、menuWidth、tokenOverflowBehavior(字段会换行显示标记)和 hasAutoFocus 在底部面板中没有作用对象,传入时开发模式下会警告一次。传入 presentation="popover" 可在所有设备上保留内联字段和这些属性。',
646
646
  default: "'adaptive'",
647
647
  },
648
648
  ],
@@ -845,6 +845,6 @@ export const docsDense = {
845
845
  endContent: 'Content at input row end. For buttons, counts, controls.',
846
846
  handleRef: 'Imperative handle for focus() and blur() control.',
847
847
  presentation:
848
- "'adaptive' (default: sheet on compact touch, else popover; SSR/hydration render popover) | 'popover' (inline combobox, every device) | 'bottom-sheet' (trigger + one searchable modal sheet of checkbox rows editing a draft that Save commits; onChange fires once, on Save). Sheet: ref reaches the trigger button; renderItem/renderToken/endContent/hasClear/hasEntriesOnFocus/menuWidth/tokenOverflowBehavior/hasAutoFocus inert (dev warning). presentation=\"popover\" keeps them on every device.",
848
+ "'adaptive' (default: sheet on compact touch, else popover; SSR/hydration render popover) | 'popover' (inline combobox, every device) | 'bottom-sheet' (field box with trigger + one searchable modal sheet of checkbox rows editing a draft that Save commits; onChange fires once, on Save). Sheet: field box keeps the inline box, theming target and focus ring; ref reaches the trigger button; endContent (field end) and renderToken (field tokens) work as inline; renderItem/hasClear/hasEntriesOnFocus/menuWidth/tokenOverflowBehavior/hasAutoFocus inert (dev warning). presentation=\"popover\" keeps them on every device.",
849
849
  },
850
850
  };
@@ -8,8 +8,8 @@
8
8
  * useAdaptivePresentation, and TokenizerBottomSheet (lazy)
9
9
  * @output Exports Tokenizer multi-select typeahead component
10
10
  * @position Composed component; forwards DOM ref and exposes focus control via
11
- * handleRef. The `presentation` prop swaps the inline combobox for a
12
- * trigger that opens TokenizerBottomSheet.
11
+ * handleRef. The `presentation` prop swaps the inline combobox for a field
12
+ * box whose trigger opens TokenizerBottomSheet.
13
13
  *
14
14
  * SYNC: When modified, update:
15
15
  * - /packages/core/src/Tokenizer/index.ts
@@ -48,6 +48,7 @@ import {
48
48
  } from '../Field/fieldParts';
49
49
  import {inputDisabledFocusStyles} from '../Field/inputDisabledFocus';
50
50
  import {useMergedRefs} from '../hooks/useMergedRefs';
51
+ import {hasInteractiveAncestor} from '../hooks/useClickableContainer';
51
52
  import {TokenizerClearAllMessageContext} from './TokenizerClearAllMessageContext';
52
53
  import {TokenizerItemRemovableContext} from './TokenizerItemRemovableContext';
53
54
  import {useBusyAnnouncement} from '../hooks/useBusyAnnouncement';
@@ -303,8 +304,8 @@ export interface TokenizerProps<T extends SearchableItem> extends Omit<
303
304
  * How the field presents its choices.
304
305
  * - `'popover'`: the inline combobox with its anchored suggestion menu, on
305
306
  * every device.
306
- * - `'bottom-sheet'`: a trigger showing the selected tokens that opens one
307
- * tall modal sheet: a search row on top, full-width checkbox rows that
307
+ * - `'bottom-sheet'`: a field showing the selected tokens, whose trigger
308
+ * opens one tall modal sheet: a search row on top, full-width checkbox rows that
308
309
  * keep their place while the sheet is open, a create row with
309
310
  * `hasCreate`, and a footer pinned in every state with a confirmed Clear
310
311
  * all and Save. The sheet edits a draft: `onChange` fires once, when Save
@@ -315,12 +316,16 @@ export interface TokenizerProps<T extends SearchableItem> extends Omit<
315
316
  * otherwise the popover — the same resolution Selector uses. The server
316
317
  * render and the hydrating render are the popover.
317
318
  *
318
- * In the sheet presentation the trigger is the control: `ref`, `id`,
319
- * `aria-*`, and `data-*` reach it. `renderItem`, `renderToken`,
320
- * `endContent`, `hasClear`, `hasEntriesOnFocus`, `menuWidth`,
321
- * `tokenOverflowBehavior`, and `hasAutoFocus` have no surface to act on
322
- * and warn once in development. Pass `'popover'` to keep the inline field
323
- * and those props on every device.
319
+ * In the sheet presentation the field's box keeps the inline field's box,
320
+ * theming target and focus ring, and holds the trigger, the tokens and
321
+ * `endContent`. The trigger is the control: `ref`, `id`, `aria-*`, and
322
+ * `data-*` reach it. `endContent` renders at the field's
323
+ * inline end and `renderToken` renders the field's tokens, as in the inline
324
+ * field. `renderItem`, `hasClear` (the sheet has its own Clear all),
325
+ * `hasEntriesOnFocus`, `menuWidth`, `tokenOverflowBehavior` (the field
326
+ * wraps its tokens), and `hasAutoFocus` have no surface to act on and warn
327
+ * once in development. Pass `'popover'` to keep the inline field and those
328
+ * props on every device.
324
329
  * @default 'adaptive'
325
330
  */
326
331
  presentation?: TokenizerPresentation;
@@ -487,20 +492,52 @@ const styles = stylex.create({
487
492
  color: colorVars['--color-text-secondary'],
488
493
  paddingInline: spacingVars['--spacing-1'],
489
494
  },
490
- // The sheet presentation's trigger: the field's own control box, as a
491
- // button. It wraps tokens like the inline field, but there is no input to
492
- // type into, so the cursor says "press".
493
- sheetTrigger: {
495
+ // The sheet presentation's field: the inline field's own control box. A
496
+ // button cannot contain controls, so the trigger, the tokens and the end lane
497
+ // are siblings in this box. `endContent` and a custom token can then hold their
498
+ // own controls. There is no input to type into, so the cursor says "press".
499
+ sheetField: {
494
500
  width: '100%',
501
+ cursor: {
502
+ default: 'pointer',
503
+ ':is(:disabled,[aria-disabled="true"])': 'default',
504
+ },
505
+ },
506
+ // The box carries no aria-disabled: that would expose a caller's operable
507
+ // `endContent` as disabled. The trigger carries it, so the box keys its
508
+ // disabled cursor on the prop.
509
+ sheetFieldDisabled: {
510
+ cursor: 'default',
511
+ },
512
+ // With tokens, the button covers the box beneath them. A tap on a token or
513
+ // on empty space then opens the sheet. The box draws the focus ring, so the
514
+ // button draws none.
515
+ sheetTrigger: {
516
+ appearance: 'none',
517
+ flexGrow: 1,
518
+ alignSelf: 'stretch',
519
+ display: 'flex',
520
+ alignItems: 'center',
521
+ minWidth: 0,
522
+ padding: 0,
523
+ margin: 0,
524
+ borderWidth: 0,
525
+ borderStyle: 'none',
526
+ backgroundColor: 'transparent',
495
527
  fontFamily: 'inherit',
496
528
  fontSize: 'inherit',
529
+ lineHeight: 'inherit',
497
530
  color: 'inherit',
498
531
  textAlign: 'start',
499
- appearance: 'none',
500
532
  cursor: {
501
533
  default: 'pointer',
502
534
  ':is(:disabled,[aria-disabled="true"])': 'default',
503
535
  },
536
+ outline: 'none',
537
+ },
538
+ sheetTriggerWithTokens: {
539
+ position: 'absolute',
540
+ inset: 0,
504
541
  },
505
542
  // An aria-disabled button gets no system disabled paint in forced colors;
506
543
  // GrayText is the platform's disabled affordance there. Defaults repeat the
@@ -906,8 +943,6 @@ export function Tokenizer<T extends SearchableItem>({
906
943
  ? (
907
944
  [
908
945
  ['renderItem', renderItem],
909
- ['renderToken', renderToken],
910
- ['endContent', endContent],
911
946
  ['hasClear', hasClear || undefined],
912
947
  ['hasEntriesOnFocus', hasEntriesOnFocus || undefined],
913
948
  ['menuWidth', menuWidth],
@@ -989,12 +1024,32 @@ export function Tokenizer<T extends SearchableItem>({
989
1024
  [tooltipAnchorRef],
990
1025
  );
991
1026
 
1027
+ // A swap also removes `endContent` and a custom token's remove. If focus is
1028
+ // in the box when it detaches, the new control takes it. The box also anchors
1029
+ // the disabled-message tooltip.
1030
+ const sheetFieldCallbackRef = useCallback(
1031
+ (el: HTMLDivElement | null) => {
1032
+ tooltipAnchorRef(el);
1033
+ if (el == null) {
1034
+ return;
1035
+ }
1036
+ return () => {
1037
+ if (el.contains(el.ownerDocument.activeElement)) {
1038
+ isFocusPendingHandOffRef.current = true;
1039
+ }
1040
+ tooltipAnchorRef(null);
1041
+ };
1042
+ },
1043
+ [tooltipAnchorRef],
1044
+ );
1045
+
992
1046
  // The sheet presentation has no input; the public ref reaches the trigger,
993
- // the control it stands for (`family:input-fields` FR10).
1047
+ // the control it stands for (`family:input-fields` FR10). The
1048
+ // disabled-message tooltip anchors to the field box around it, as it
1049
+ // anchors to the inline field's wrapper.
994
1050
  const triggerMergedRef = useMergedRefs<HTMLButtonElement>(
995
1051
  triggerRef,
996
1052
  ref as React.Ref<HTMLButtonElement> | undefined,
997
- disabledMessageTooltip.ref,
998
1053
  handOffFocusRef,
999
1054
  );
1000
1055
 
@@ -1019,6 +1074,14 @@ export function Tokenizer<T extends SearchableItem>({
1019
1074
  // `endContent`, a clear button, or all three — so its width is measured
1020
1075
  // rather than assumed, and the input reserves it.
1021
1076
  const [laneRef, laneReserve] = useEndLaneReserve(END_LANE_INSET);
1077
+ // `laneRef` publishes the lane's width, so token rows and the placeholder
1078
+ // stop short of it. `sheetLaneRef` tells a tap in the lane from a tap on the
1079
+ // field.
1080
+ const sheetLaneRef = useRef<HTMLDivElement | null>(null);
1081
+ const sheetLaneMergedRef = useMergedRefs<HTMLDivElement>(
1082
+ laneRef,
1083
+ sheetLaneRef,
1084
+ );
1022
1085
  // A composing component can lock tokens (PowerSearch's read-only filters
1023
1086
  // and read-only field). No remove path removes a locked token.
1024
1087
  const isItemRemovable = use(TokenizerItemRemovableContext);
@@ -1556,92 +1619,91 @@ export function Tokenizer<T extends SearchableItem>({
1556
1619
  </div>
1557
1620
  );
1558
1621
 
1622
+ // A `renderToken` token's own remove control in the sheet field removes at
1623
+ // once, as it does in the inline field. Its control leaves with it, so
1624
+ // focus moves to the trigger.
1625
+ const handleSheetTokenRemove = (item: T) => {
1626
+ if (handleRemove(item)) {
1627
+ triggerRef.current?.focus();
1628
+ }
1629
+ };
1630
+ // A tap on a token, the placeholder or empty space opens the sheet, as a tap
1631
+ // on the trigger does. The trigger, `endContent` and a custom token's
1632
+ // controls handle their own clicks.
1633
+ const handleSheetFieldClick = (event: React.MouseEvent<HTMLDivElement>) => {
1634
+ const trigger = triggerRef.current;
1635
+ const target = event.target;
1636
+ if (trigger == null || !(target instanceof Element)) {
1637
+ return;
1638
+ }
1639
+ if (
1640
+ trigger.contains(target) ||
1641
+ sheetLaneRef.current?.contains(target) ||
1642
+ hasInteractiveAncestor(target, event.currentTarget)
1643
+ ) {
1644
+ return;
1645
+ }
1646
+ trigger.click();
1647
+ };
1648
+
1649
+ // The caller's onFocus and onBlur report focus entering and leaving the whole
1650
+ // box, as for the inline wrapper. A move between the trigger, `endContent`
1651
+ // and a custom token's controls stays inside the field.
1652
+ const handleSheetFieldFocus = (event: React.FocusEvent<HTMLDivElement>) => {
1653
+ // BottomSheet focuses the trigger only after its exit completes; that
1654
+ // focus is the signal that the retained sheet can leave. If the
1655
+ // resolution moved to the popover meanwhile, the inline input takes the
1656
+ // focus over once it mounts.
1657
+ const isReturningFromSheet =
1658
+ (event.target as EventTarget) === triggerRef.current &&
1659
+ !isSheetOpen &&
1660
+ isSheetPresented;
1661
+ if (isReturningFromSheet) {
1662
+ setIsSheetPresented(false);
1663
+ }
1664
+ const relatedTarget = event.relatedTarget;
1665
+ if (
1666
+ relatedTarget instanceof Node &&
1667
+ event.currentTarget.contains(relatedTarget)
1668
+ ) {
1669
+ return;
1670
+ }
1671
+ // Focus that returns from the field's own sheet, or that a presentation swap
1672
+ // hands over, does not enter from outside. The caller's onFocus stays quiet
1673
+ // for it (`family:input-fields` FR10).
1674
+ const isInsideTheField =
1675
+ (isReturningFromSheet && hasReportedFocusRef.current) ||
1676
+ isHandingOffFocusRef.current;
1677
+ if (!isInsideTheField) {
1678
+ hasReportedFocusRef.current = true;
1679
+ onFocus?.(event);
1680
+ }
1681
+ };
1682
+ const handleSheetFieldBlur = (event: React.FocusEvent<HTMLDivElement>) => {
1683
+ // Focus moving into the sheet, or to another control in the box, is
1684
+ // still the field's. Only a blur to somewhere else reports.
1685
+ const relatedTarget = event.relatedTarget;
1686
+ if (
1687
+ isSheetOpen ||
1688
+ (relatedTarget instanceof Node &&
1689
+ event.currentTarget.contains(relatedTarget))
1690
+ ) {
1691
+ return;
1692
+ }
1693
+ hasReportedFocusRef.current = false;
1694
+ isFocusPendingHandOffRef.current = false;
1695
+ onBlur?.(event);
1696
+ };
1697
+
1559
1698
  let tokenizerContent: ReactNode;
1560
1699
  if (isSheetPresentation) {
1561
1700
  tokenizerContent = (
1562
1701
  <>
1563
- <button
1564
- // The field-level pass-through props (`data-*`, `aria-*`) were typed
1565
- // for the inline input; here the control is a button.
1566
- {...(restWithoutClick as React.ButtonHTMLAttributes<HTMLButtonElement>)}
1567
- ref={triggerMergedRef}
1568
- type="button"
1569
- id={inputId}
1570
- aria-labelledby={fieldLabelledBy}
1571
- aria-haspopup="dialog"
1572
- aria-expanded={isSheetOpen}
1573
- aria-disabled={isDisabled || undefined}
1574
- // The description is what the inline input's is, in its order —
1575
- // the caller's ids, the field description, the status message, the
1576
- // disabled reason (`spec:AST-085` FR5: a disabled control exposes
1577
- // its description and reason on itself) — then the hidden count and
1578
- // the rendered tokens themselves, each by id: the
1579
- // accessible-description algorithm reads the referenced elements in
1580
- // order and separates them, so every label renders once
1581
- // (`architecture:component-style-authoring` INV7) and no locale's
1582
- // list punctuation is written here (AR6).
1583
- aria-describedby={
1584
- [
1585
- ariaDescribedByProp,
1586
- ariaDescribedBy,
1587
- value.length > 0 ? triggerTokensId : null,
1588
- ...value.map(item => tokenElementId(item.id)),
1589
- ]
1590
- .filter(Boolean)
1591
- .join(' ') || undefined
1592
- }
1593
- // The open runs first and the caller's onClick after it, as the
1594
- // inline input composes its click: a caller observes the click but
1595
- // cannot cancel the field's own handling
1596
- // (`family:input-fields` FR10).
1597
- onClick={composeEventHandlers<React.MouseEvent<HTMLButtonElement>>(
1598
- () => {
1599
- if (isDisabled) {
1600
- return;
1601
- }
1602
- setIsSheetPresented(true);
1603
- setSheetInitialQuery(sheetQueryRef.current);
1604
- setIsSheetOpen(true);
1605
- },
1606
- // Typed for the input by the base props; here the control is the
1607
- // trigger button, and the handler only reads the event.
1608
- callerOnClick as unknown as
1609
- React.MouseEventHandler<HTMLButtonElement> | undefined,
1610
- )}
1611
- onFocus={event => {
1612
- // BottomSheet focuses the trigger only after its exit completes;
1613
- // that focus is the signal that the retained sheet can leave. If
1614
- // the resolution moved to the popover meanwhile, the inline input
1615
- // takes the focus over once it mounts. The field's own sheet is
1616
- // part of the field: focus coming back from it, or handed over by
1617
- // a presentation swap, is not focus entering from outside, so the
1618
- // caller's onFocus — "when focus enters the tokenizer from
1619
- // outside" — stays quiet for it (`family:input-fields` FR10).
1620
- const isReturningFromSheet = !isSheetOpen && isSheetPresented;
1621
- if (isReturningFromSheet) {
1622
- setIsSheetPresented(false);
1623
- }
1624
- const isInsideTheField =
1625
- (isReturningFromSheet && hasReportedFocusRef.current) ||
1626
- isHandingOffFocusRef.current;
1627
- if (!isInsideTheField) {
1628
- hasReportedFocusRef.current = true;
1629
- onFocus?.(event);
1630
- }
1631
- }}
1632
- onBlur={event => {
1633
- // Focus moving into the sheet is still the field's: the flag
1634
- // stays, and the caller's onBlur — "when focus leaves the
1635
- // tokenizer entirely" — stays quiet. Only a blur to somewhere
1636
- // else reports.
1637
- if (isSheetOpen) {
1638
- return;
1639
- }
1640
- hasReportedFocusRef.current = false;
1641
- isFocusPendingHandOffRef.current = false;
1642
- onBlur?.(event);
1643
- }}
1644
- onKeyDown={onKeyDown}
1702
+ <div
1703
+ ref={sheetFieldCallbackRef}
1704
+ onClick={handleSheetFieldClick}
1705
+ onFocus={handleSheetFieldFocus}
1706
+ onBlur={handleSheetFieldBlur}
1645
1707
  {...mergeProps(
1646
1708
  themeProps('tokenizer', {
1647
1709
  size,
@@ -1651,8 +1713,9 @@ export function Tokenizer<T extends SearchableItem>({
1651
1713
  stylex.props(
1652
1714
  inputWrapperStyles.base,
1653
1715
  styles.wrapper,
1654
- styles.sheetTrigger,
1655
- // The trigger keeps the inline field's height for its size step,
1716
+ styles.sheetField,
1717
+ isDisabled && styles.sheetFieldDisabled,
1718
+ // The field keeps the inline field's height for its size step,
1656
1719
  // as Selector's bottom-sheet trigger does; the sheet's own rows
1657
1720
  // and search field carry the touch-sized targets.
1658
1721
  sizeStyles[size],
@@ -1675,8 +1738,77 @@ export function Tokenizer<T extends SearchableItem>({
1675
1738
  {renderIconSlot(startIcon, {size: 'sm', color: 'secondary'})}
1676
1739
  </span>
1677
1740
  )}
1678
- {value.length > 0 ? (
1679
- value.map(item => (
1741
+ <button
1742
+ // The field-level pass-through props (`data-*`, `aria-*`) were typed
1743
+ // for the inline input; here the control is a button.
1744
+ {...(restWithoutClick as React.ButtonHTMLAttributes<HTMLButtonElement>)}
1745
+ ref={triggerMergedRef}
1746
+ type="button"
1747
+ id={inputId}
1748
+ aria-labelledby={fieldLabelledBy}
1749
+ aria-haspopup="dialog"
1750
+ aria-expanded={isSheetOpen}
1751
+ aria-disabled={isDisabled || undefined}
1752
+ // The description follows the inline input's order: the caller's
1753
+ // ids, the field description, the status message, then the
1754
+ // disabled reason (`spec:AST-085` FR5). The hidden count and the
1755
+ // token labels follow, each by id. The algorithm separates
1756
+ // referenced elements, so no list punctuation is written here
1757
+ // (AR6). A default token is display-only and is its own label. A
1758
+ // custom token can hold controls, so a hidden copy of its item
1759
+ // label stands in.
1760
+ aria-describedby={
1761
+ [
1762
+ ariaDescribedByProp,
1763
+ ariaDescribedBy,
1764
+ value.length > 0 ? triggerTokensId : null,
1765
+ ...value.map(item => tokenElementId(item.id)),
1766
+ ]
1767
+ .filter(Boolean)
1768
+ .join(' ') || undefined
1769
+ }
1770
+ // The open runs first and the caller's onClick after it, as the
1771
+ // inline input composes its click: a caller observes the click but
1772
+ // cannot cancel the field's own handling
1773
+ // (`family:input-fields` FR10).
1774
+ onClick={composeEventHandlers<React.MouseEvent<HTMLButtonElement>>(
1775
+ () => {
1776
+ if (isDisabled) {
1777
+ return;
1778
+ }
1779
+ setIsSheetPresented(true);
1780
+ setSheetInitialQuery(sheetQueryRef.current);
1781
+ setIsSheetOpen(true);
1782
+ },
1783
+ // Typed for the input by the base props; here the control is the
1784
+ // trigger button, and the handler only reads the event.
1785
+ callerOnClick as unknown as
1786
+ React.MouseEventHandler<HTMLButtonElement> | undefined,
1787
+ )}
1788
+ onKeyDown={onKeyDown}
1789
+ {...stylex.props(
1790
+ styles.sheetTrigger,
1791
+ value.length > 0 && styles.sheetTriggerWithTokens,
1792
+ // With no token the placeholder stops short of the end lane, as
1793
+ // the inline input's text does.
1794
+ value.length === 0 && laneReserve,
1795
+ )}>
1796
+ {value.length === 0 && (
1797
+ <span
1798
+ {...stylex.props(
1799
+ styles.sheetTriggerPlaceholder,
1800
+ isDisabled && styles.sheetTriggerPlaceholderDisabled,
1801
+ )}>
1802
+ {placeholder ?? ''}
1803
+ </span>
1804
+ )}
1805
+ </button>
1806
+ {value.map(item =>
1807
+ renderToken ? (
1808
+ <span key={item.id} {...stylex.props(styles.token)}>
1809
+ {renderToken(item, () => handleSheetTokenRemove(item))}
1810
+ </span>
1811
+ ) : (
1680
1812
  <Token
1681
1813
  key={item.id}
1682
1814
  id={tokenElementId(item.id)}
@@ -1685,22 +1817,27 @@ export function Tokenizer<T extends SearchableItem>({
1685
1817
  isDisabled={isDisabled}
1686
1818
  xstyle={isDisabled ? styles.sheetTokenDisabled : undefined}
1687
1819
  />
1688
- ))
1689
- ) : (
1690
- <span
1691
- {...stylex.props(
1692
- styles.sheetTriggerPlaceholder,
1693
- isDisabled && styles.sheetTriggerPlaceholderDisabled,
1694
- )}>
1695
- {placeholder ?? ''}
1696
- </span>
1820
+ ),
1821
+ )}
1822
+ {isRenderable(endContent) && (
1823
+ <div
1824
+ ref={sheetLaneMergedRef}
1825
+ {...stylex.props(styles.endSection, endSectionSizeStyles[size])}>
1826
+ {endContent}
1827
+ </div>
1697
1828
  )}
1698
- </button>
1829
+ </div>
1699
1830
  {value.length > 0 && (
1700
1831
  <VisuallyHidden id={triggerTokensId}>
1701
1832
  {t('@astryx.tokenizer.selectedCount', {count: value.length})}
1702
1833
  </VisuallyHidden>
1703
1834
  )}
1835
+ {renderToken != null &&
1836
+ value.map(item => (
1837
+ <span key={item.id} id={tokenElementId(item.id)} hidden>
1838
+ {item.label}
1839
+ </span>
1840
+ ))}
1704
1841
  {/* Form carriers, gated exactly as the inline branch gates its own: a
1705
1842
  disabled field submits nothing. */}
1706
1843
  {htmlName != null &&