@astryxdesign/core 0.1.8 → 0.1.9-canary.09e9ddd

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 (610) hide show
  1. package/CHANGELOG.md +100 -0
  2. package/dist/AppShell/AppShell.d.ts.map +1 -1
  3. package/dist/AppShell/AppShell.js +6 -2
  4. package/dist/AppShell/AppShellMobileContext.d.ts +8 -0
  5. package/dist/AppShell/AppShellMobileContext.d.ts.map +1 -1
  6. package/dist/Avatar/Avatar.d.ts +53 -3
  7. package/dist/Avatar/Avatar.d.ts.map +1 -1
  8. package/dist/Avatar/Avatar.js +203 -49
  9. package/dist/Avatar/AvatarStatusDot.d.ts +33 -5
  10. package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
  11. package/dist/Avatar/AvatarStatusDot.js +144 -19
  12. package/dist/AvatarGroup/AvatarGroup.d.ts +7 -1
  13. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  14. package/dist/AvatarGroup/AvatarGroup.js +58 -6
  15. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  16. package/dist/AvatarGroup/AvatarGroupOverflow.js +1 -0
  17. package/dist/Banner/Banner.d.ts +9 -1
  18. package/dist/Banner/Banner.d.ts.map +1 -1
  19. package/dist/Banner/Banner.js +33 -4
  20. package/dist/Breadcrumbs/BreadcrumbItem.d.ts +31 -2
  21. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  22. package/dist/Breadcrumbs/BreadcrumbItem.js +208 -6
  23. package/dist/Breadcrumbs/index.d.ts +5 -0
  24. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  25. package/dist/Breadcrumbs/index.js +9 -1
  26. package/dist/Button/Button.d.ts +8 -2
  27. package/dist/Button/Button.d.ts.map +1 -1
  28. package/dist/Button/Button.js +33 -4
  29. package/dist/ButtonGroup/ButtonGroup.d.ts +9 -1
  30. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  31. package/dist/ButtonGroup/ButtonGroup.js +30 -1
  32. package/dist/Calendar/Calendar.d.ts.map +1 -1
  33. package/dist/Calendar/Calendar.js +30 -2
  34. package/dist/Calendar/dayCellUtils.js +1 -1
  35. package/dist/Card/Card.d.ts +8 -2
  36. package/dist/Card/Card.d.ts.map +1 -1
  37. package/dist/Card/Card.js +28 -2
  38. package/dist/Carousel/Carousel.d.ts +4 -1
  39. package/dist/Carousel/Carousel.d.ts.map +1 -1
  40. package/dist/Carousel/Carousel.js +24 -4
  41. package/dist/Chat/ChatComposer.d.ts +8 -0
  42. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  43. package/dist/Chat/ChatComposer.js +46 -7
  44. package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
  45. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  46. package/dist/Chat/ChatComposerDrawer.js +11 -1
  47. package/dist/Chat/ChatComposerInput.d.ts +20 -3
  48. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  49. package/dist/Chat/ChatComposerInput.js +36 -4
  50. package/dist/Chat/ChatContext.d.ts +33 -0
  51. package/dist/Chat/ChatContext.d.ts.map +1 -1
  52. package/dist/Chat/ChatContext.js +16 -2
  53. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  54. package/dist/Chat/ChatDictationButton.js +1 -1
  55. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  56. package/dist/Chat/ChatLayout.js +4 -4
  57. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  58. package/dist/Chat/ChatLayoutScrollButton.js +4 -4
  59. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  60. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  61. package/dist/Chat/ChatSendButton.js +7 -1
  62. package/dist/Chat/ChatToolCalls.d.ts +5 -1
  63. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  64. package/dist/Chat/ChatToolCalls.js +18 -9
  65. package/dist/Chat/index.d.ts +2 -1
  66. package/dist/Chat/index.d.ts.map +1 -1
  67. package/dist/Chat/index.js +1 -1
  68. package/dist/Chat/useChatStreamScroll.d.ts +2 -1
  69. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  70. package/dist/Chat/useChatStreamScroll.js +22 -8
  71. package/dist/Chat/useSpeechRecognition.d.ts +0 -1
  72. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  73. package/dist/Chat/useSpeechRecognition.js +1 -1
  74. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  75. package/dist/Chat/useTriggerMenu.js +2 -2
  76. package/dist/CheckboxInput/CheckboxInput.js +1 -1
  77. package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
  78. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  79. package/dist/CheckboxList/CheckboxListItem.js +11 -1
  80. package/dist/Citation/Citation.d.ts +22 -1
  81. package/dist/Citation/Citation.d.ts.map +1 -1
  82. package/dist/Citation/Citation.js +20 -6
  83. package/dist/ClickableCard/ClickableCard.d.ts +9 -2
  84. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  85. package/dist/ClickableCard/ClickableCard.js +5 -2
  86. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  87. package/dist/CodeBlock/CodeBlock.js +9 -2
  88. package/dist/CommandPalette/CommandPalette.d.ts +1 -1
  89. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  90. package/dist/CommandPalette/CommandPalette.js +3 -1
  91. package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
  92. package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
  93. package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
  94. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  95. package/dist/CommandPalette/CommandPaletteInput.js +6 -1
  96. package/dist/CommandPalette/CommandPaletteItem.js +1 -1
  97. package/dist/DateInput/DateInput.d.ts +55 -2
  98. package/dist/DateInput/DateInput.d.ts.map +1 -1
  99. package/dist/DateInput/DateInput.js +28 -2
  100. package/dist/DateInput/index.d.ts +1 -1
  101. package/dist/DateInput/index.d.ts.map +1 -1
  102. package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
  103. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  104. package/dist/DateRangeInput/DateRangeInput.js +3 -1
  105. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  106. package/dist/DateTimeInput/DateTimeInput.js +18 -3
  107. package/dist/Dialog/Dialog.d.ts +3 -0
  108. package/dist/Dialog/Dialog.d.ts.map +1 -1
  109. package/dist/Dialog/Dialog.js +57 -6
  110. package/dist/Dialog/DialogContext.d.ts +7 -0
  111. package/dist/Dialog/DialogContext.d.ts.map +1 -1
  112. package/dist/Dialog/DialogContext.js +2 -2
  113. package/dist/Dialog/DialogHeader.d.ts +5 -2
  114. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  115. package/dist/Dialog/DialogHeader.js +6 -1
  116. package/dist/Divider/Divider.js +1 -1
  117. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
  118. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  119. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +1 -2
  120. package/dist/DropdownMenu/DropdownMenuItem.js +1 -1
  121. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
  122. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
  123. package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
  124. package/dist/Field/Field.d.ts.map +1 -1
  125. package/dist/Field/Field.js +2 -3
  126. package/dist/Field/FieldLabel.d.ts +1 -1
  127. package/dist/Field/FieldLabel.d.ts.map +1 -1
  128. package/dist/Field/FieldLabel.js +43 -16
  129. package/dist/FieldStatus/FieldStatus.d.ts +15 -0
  130. package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
  131. package/dist/FieldStatus/FieldStatus.js +58 -6
  132. package/dist/FileInput/FileInput.d.ts +9 -2
  133. package/dist/FileInput/FileInput.d.ts.map +1 -1
  134. package/dist/FileInput/FileInput.js +42 -20
  135. package/dist/HoverCard/HoverCard.d.ts +9 -1
  136. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  137. package/dist/HoverCard/HoverCard.js +2 -0
  138. package/dist/HoverCard/useHoverCard.d.ts +8 -0
  139. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  140. package/dist/HoverCard/useHoverCard.js +7 -2
  141. package/dist/Icon/Icon.d.ts +7 -2
  142. package/dist/Icon/Icon.d.ts.map +1 -1
  143. package/dist/Item/Item.d.ts +6 -1
  144. package/dist/Item/Item.d.ts.map +1 -1
  145. package/dist/Item/Item.js +22 -1
  146. package/dist/Layer/useLayer.d.ts +6 -0
  147. package/dist/Layer/useLayer.d.ts.map +1 -1
  148. package/dist/Layer/useLayer.js +2 -0
  149. package/dist/Lightbox/Lightbox.js +4 -4
  150. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  151. package/dist/MobileNav/MobileNav.js +6 -1
  152. package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
  153. package/dist/MobileNav/MobileNavToggle.js +4 -0
  154. package/dist/MultiSelector/MultiSelector.d.ts +9 -1
  155. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  156. package/dist/MultiSelector/MultiSelector.js +41 -12
  157. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  158. package/dist/MultiSelector/hooks.js +16 -0
  159. package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
  160. package/dist/NumberInput/NumberInput.d.ts +9 -2
  161. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  162. package/dist/NumberInput/NumberInput.js +8 -1
  163. package/dist/Outline/Outline.d.ts +0 -1
  164. package/dist/Outline/Outline.d.ts.map +1 -1
  165. package/dist/Outline/Outline.js +0 -1
  166. package/dist/OverflowList/OverflowList.d.ts +20 -3
  167. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  168. package/dist/OverflowList/OverflowList.js +29 -4
  169. package/dist/Pagination/Pagination.d.ts.map +1 -1
  170. package/dist/Pagination/Pagination.js +11 -3
  171. package/dist/Popover/Popover.d.ts.map +1 -1
  172. package/dist/Popover/Popover.js +3 -2
  173. package/dist/Popover/usePopover.d.ts.map +1 -1
  174. package/dist/Popover/usePopover.js +3 -9
  175. package/dist/PowerSearch/PowerSearch.d.ts +9 -2
  176. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  177. package/dist/PowerSearch/PowerSearch.js +2 -0
  178. package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
  179. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  180. package/dist/SelectableCard/SelectableCard.d.ts +9 -2
  181. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  182. package/dist/SelectableCard/SelectableCard.js +16 -13
  183. package/dist/Selector/Selector.d.ts +8 -0
  184. package/dist/Selector/Selector.d.ts.map +1 -1
  185. package/dist/Selector/Selector.js +7 -3
  186. package/dist/Selector/hooks.d.ts.map +1 -1
  187. package/dist/Selector/hooks.js +16 -0
  188. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  189. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  190. package/dist/SideNav/SideNavHeading.js +21 -8
  191. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  192. package/dist/Slider/Slider.d.ts.map +1 -1
  193. package/dist/Slider/Slider.js +19 -2
  194. package/dist/Stack/stack.stylex.d.ts +9 -9
  195. package/dist/TabList/Tab.js +2 -2
  196. package/dist/TabList/TabMenu.js +1 -1
  197. package/dist/Table/BaseTable.d.ts.map +1 -1
  198. package/dist/Table/BaseTable.js +3 -2
  199. package/dist/Table/TableCell.js +3 -3
  200. package/dist/Table/TableHeaderCell.js +3 -3
  201. package/dist/Table/index.d.ts +2 -0
  202. package/dist/Table/index.d.ts.map +1 -1
  203. package/dist/Table/index.js +1 -0
  204. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  205. package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
  206. package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
  207. package/dist/Table/plugins/rowStatus/index.js +3 -0
  208. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
  209. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
  210. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
  211. package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
  212. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  213. package/dist/Table/plugins/selection/useTableSelection.js +4 -1
  214. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
  215. package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
  216. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  217. package/dist/Table/plugins/tree/useTableTreeData.js +87 -0
  218. package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
  219. package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
  220. package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
  221. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  222. package/dist/Table/useBaseTablePlugins.js +5 -3
  223. package/dist/TextArea/TextArea.d.ts +9 -1
  224. package/dist/TextArea/TextArea.d.ts.map +1 -1
  225. package/dist/TextArea/TextArea.js +2 -0
  226. package/dist/TextInput/TextInput.d.ts +9 -2
  227. package/dist/TextInput/TextInput.d.ts.map +1 -1
  228. package/dist/TextInput/TextInput.js +6 -1
  229. package/dist/Thumbnail/Thumbnail.d.ts +26 -5
  230. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  231. package/dist/Thumbnail/Thumbnail.js +97 -54
  232. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
  233. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
  234. package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
  235. package/dist/TimeInput/TimeInput.d.ts +9 -2
  236. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  237. package/dist/TimeInput/TimeInput.js +17 -4
  238. package/dist/Timestamp/Timestamp.d.ts +3 -1
  239. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  240. package/dist/Timestamp/Timestamp.js +8 -6
  241. package/dist/Toast/useToast.d.ts.map +1 -1
  242. package/dist/Toast/useToast.js +2 -5
  243. package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
  244. package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
  245. package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
  246. package/dist/Tokenizer/Tokenizer.d.ts +10 -3
  247. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  248. package/dist/Tokenizer/Tokenizer.js +18 -4
  249. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  250. package/dist/TopNav/TopNavHeading.js +18 -8
  251. package/dist/TopNav/TopNavMegaMenu.js +10 -4
  252. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
  253. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  254. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
  255. package/dist/TopNav/TopNavMenu.d.ts +2 -1
  256. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  257. package/dist/TopNav/TopNavMenu.js +68 -6
  258. package/dist/TreeList/TreeList.d.ts +12 -3
  259. package/dist/TreeList/TreeList.d.ts.map +1 -1
  260. package/dist/TreeList/TreeList.js +2 -0
  261. package/dist/TreeList/TreeListBranches.d.ts +5 -0
  262. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  263. package/dist/TreeList/TreeListBranches.js +10 -4
  264. package/dist/TreeList/TreeListItem.d.ts +8 -2
  265. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  266. package/dist/TreeList/TreeListItem.js +28 -8
  267. package/dist/TreeList/TreeListTypes.d.ts +25 -1
  268. package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
  269. package/dist/TreeList/index.d.ts +2 -2
  270. package/dist/TreeList/index.d.ts.map +1 -1
  271. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  272. package/dist/Typeahead/BaseTypeahead.js +20 -11
  273. package/dist/Typeahead/Typeahead.d.ts +9 -2
  274. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  275. package/dist/Typeahead/Typeahead.js +2 -0
  276. package/dist/astryx.css +41 -31
  277. package/dist/astryx.umd.js +51 -51
  278. package/dist/astryx.umd.js.map +4 -4
  279. package/dist/authoring/doc.d.ts.map +1 -1
  280. package/dist/docs-types.d.ts +8 -0
  281. package/dist/docs-types.d.ts.map +1 -1
  282. package/dist/hooks/computeOverflow.d.ts +47 -0
  283. package/dist/hooks/computeOverflow.d.ts.map +1 -0
  284. package/dist/hooks/computeOverflow.js +213 -0
  285. package/dist/hooks/index.d.ts +1 -0
  286. package/dist/hooks/index.d.ts.map +1 -1
  287. package/dist/hooks/index.js +2 -1
  288. package/dist/hooks/isRtlElement.d.ts +18 -0
  289. package/dist/hooks/isRtlElement.d.ts.map +1 -0
  290. package/dist/hooks/isRtlElement.js +27 -0
  291. package/dist/hooks/useDevWarning.d.ts +18 -0
  292. package/dist/hooks/useDevWarning.d.ts.map +1 -0
  293. package/dist/hooks/useDevWarning.js +49 -0
  294. package/dist/hooks/useGridFocus.d.ts +6 -1
  295. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  296. package/dist/hooks/useGridFocus.js +12 -9
  297. package/dist/hooks/useListFocus.d.ts +6 -1
  298. package/dist/hooks/useListFocus.d.ts.map +1 -1
  299. package/dist/hooks/useListFocus.js +12 -4
  300. package/dist/hooks/useOverflow.d.ts +19 -0
  301. package/dist/hooks/useOverflow.d.ts.map +1 -1
  302. package/dist/hooks/useOverflow.js +36 -25
  303. package/dist/i18n/InternationalizationContext.d.ts +1 -0
  304. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  305. package/dist/i18n/InternationalizationContext.js +3 -0
  306. package/dist/i18n/InternationalizationProvider.d.ts +8 -1
  307. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  308. package/dist/i18n/InternationalizationProvider.js +5 -1
  309. package/dist/i18n/getLocaleDirection.d.ts +18 -0
  310. package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
  311. package/dist/i18n/getLocaleDirection.js +29 -0
  312. package/dist/i18n/index.d.ts +6 -0
  313. package/dist/i18n/index.d.ts.map +1 -1
  314. package/dist/i18n/index.js +7 -1
  315. package/dist/i18n/resolve.d.ts.map +1 -1
  316. package/dist/i18n/resolve.js +7 -18
  317. package/dist/i18n/useDirection.d.ts +2 -0
  318. package/dist/i18n/useDirection.d.ts.map +1 -0
  319. package/dist/i18n/useDirection.js +27 -0
  320. package/dist/theme/Theme.d.ts.map +1 -1
  321. package/dist/theme/Theme.js +2 -7
  322. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  323. package/dist/theme/derivedVarRegistry.js +13 -0
  324. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  325. package/dist/theme/generateThemeRules.js +51 -0
  326. package/dist/theme/hct.d.ts +0 -1
  327. package/dist/theme/hct.d.ts.map +1 -1
  328. package/dist/theme/hct.js +1 -1
  329. package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
  330. package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
  331. package/dist/utils/devWarning.d.ts +42 -0
  332. package/dist/utils/devWarning.d.ts.map +1 -0
  333. package/dist/utils/devWarning.js +88 -0
  334. package/dist/utils/index.d.ts +3 -1
  335. package/dist/utils/index.d.ts.map +1 -1
  336. package/dist/utils/index.js +3 -2
  337. package/dist/utils/plainDate.d.ts +30 -0
  338. package/dist/utils/plainDate.d.ts.map +1 -1
  339. package/dist/utils/plainDate.js +53 -0
  340. package/dist/utils/types.d.ts +13 -0
  341. package/dist/utils/types.d.ts.map +1 -1
  342. package/locales/en.json +32 -0
  343. package/locales/fr-FR.json +14 -0
  344. package/locales/pseudo.json +24 -0
  345. package/package.json +1 -1
  346. package/src/AppShell/AppShell.tsx +6 -0
  347. package/src/AppShell/AppShellMobileContext.tsx +8 -0
  348. package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
  349. package/src/Avatar/Avatar.doc.mjs +60 -3
  350. package/src/Avatar/Avatar.test.tsx +281 -1
  351. package/src/Avatar/Avatar.tsx +324 -64
  352. package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
  353. package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
  354. package/src/Avatar/AvatarStatusDot.tsx +178 -21
  355. package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
  356. package/src/AvatarGroup/AvatarGroup.test.tsx +125 -0
  357. package/src/AvatarGroup/AvatarGroup.tsx +58 -3
  358. package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
  359. package/src/Banner/Banner.doc.mjs +9 -0
  360. package/src/Banner/Banner.test.tsx +30 -0
  361. package/src/Banner/Banner.tsx +53 -9
  362. package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
  363. package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
  364. package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
  365. package/src/Breadcrumbs/Breadcrumbs.test.tsx +284 -2
  366. package/src/Breadcrumbs/index.ts +27 -0
  367. package/src/Button/Button.doc.mjs +9 -4
  368. package/src/Button/Button.test.tsx +49 -0
  369. package/src/Button/Button.tsx +27 -3
  370. package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
  371. package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
  372. package/src/ButtonGroup/ButtonGroup.tsx +32 -0
  373. package/src/Calendar/Calendar.doc.mjs +12 -1
  374. package/src/Calendar/Calendar.test.tsx +193 -0
  375. package/src/Calendar/Calendar.tsx +38 -16
  376. package/src/Calendar/dayCellUtils.test.ts +5 -0
  377. package/src/Calendar/dayCellUtils.ts +1 -1
  378. package/src/Card/Card.doc.mjs +9 -0
  379. package/src/Card/Card.test.tsx +21 -3
  380. package/src/Card/Card.tsx +35 -2
  381. package/src/Carousel/Carousel.doc.mjs +1 -0
  382. package/src/Carousel/Carousel.test.tsx +53 -0
  383. package/src/Carousel/Carousel.tsx +34 -4
  384. package/src/Chat/ChatComposer.doc.mjs +12 -3
  385. package/src/Chat/ChatComposer.test.tsx +115 -0
  386. package/src/Chat/ChatComposer.tsx +73 -9
  387. package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
  388. package/src/Chat/ChatComposerDrawer.tsx +11 -1
  389. package/src/Chat/ChatComposerInput.doc.mjs +7 -0
  390. package/src/Chat/ChatComposerInput.test.tsx +103 -0
  391. package/src/Chat/ChatComposerInput.tsx +51 -5
  392. package/src/Chat/ChatContext.tsx +37 -10
  393. package/src/Chat/ChatDictationButton.tsx +4 -1
  394. package/src/Chat/ChatLayout.tsx +7 -5
  395. package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
  396. package/src/Chat/ChatMessageMetadata.tsx +1 -2
  397. package/src/Chat/ChatSendButton.tsx +11 -1
  398. package/src/Chat/ChatToolCalls.test.tsx +64 -0
  399. package/src/Chat/ChatToolCalls.tsx +25 -4
  400. package/src/Chat/index.ts +5 -1
  401. package/src/Chat/useChatStreamScroll.test.tsx +49 -0
  402. package/src/Chat/useChatStreamScroll.ts +27 -10
  403. package/src/Chat/useSpeechRecognition.ts +1 -1
  404. package/src/Chat/useTriggerMenu.tsx +4 -2
  405. package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
  406. package/src/CheckboxInput/CheckboxInput.tsx +1 -1
  407. package/src/CheckboxList/CheckboxList.test.tsx +81 -3
  408. package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
  409. package/src/CheckboxList/CheckboxListItem.tsx +41 -5
  410. package/src/Citation/Citation.doc.mjs +4 -3
  411. package/src/Citation/Citation.test.tsx +97 -0
  412. package/src/Citation/Citation.tsx +43 -11
  413. package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
  414. package/src/ClickableCard/ClickableCard.test.tsx +34 -0
  415. package/src/ClickableCard/ClickableCard.tsx +13 -3
  416. package/src/CodeBlock/CodeBlock.test.tsx +56 -0
  417. package/src/CodeBlock/CodeBlock.tsx +10 -2
  418. package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
  419. package/src/CommandPalette/CommandPalette.tsx +3 -1
  420. package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
  421. package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
  422. package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
  423. package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
  424. package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
  425. package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
  426. package/src/ContextMenu/ContextMenu.test.tsx +193 -0
  427. package/src/DateInput/DateInput.doc.mjs +31 -0
  428. package/src/DateInput/DateInput.test.tsx +131 -0
  429. package/src/DateInput/DateInput.tsx +78 -3
  430. package/src/DateInput/index.ts +1 -0
  431. package/src/DateRangeInput/DateRangeInput.doc.mjs +8 -0
  432. package/src/DateRangeInput/DateRangeInput.test.tsx +23 -0
  433. package/src/DateRangeInput/DateRangeInput.tsx +13 -3
  434. package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -1
  435. package/src/DateTimeInput/DateTimeInput.test.tsx +147 -0
  436. package/src/DateTimeInput/DateTimeInput.tsx +42 -18
  437. package/src/Dialog/Dialog.doc.mjs +2 -2
  438. package/src/Dialog/Dialog.test.tsx +77 -4
  439. package/src/Dialog/Dialog.tsx +89 -5
  440. package/src/Dialog/DialogContext.ts +9 -2
  441. package/src/Dialog/DialogHeader.doc.mjs +2 -2
  442. package/src/Dialog/DialogHeader.tsx +9 -2
  443. package/src/Divider/Divider.tsx +2 -2
  444. package/src/DropdownMenu/DropdownMenu.test.tsx +169 -0
  445. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +1 -2
  446. package/src/DropdownMenu/DropdownMenuItem.tsx +1 -1
  447. package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
  448. package/src/Field/Field.test.tsx +57 -12
  449. package/src/Field/Field.tsx +6 -5
  450. package/src/Field/FieldLabel.tsx +9 -1
  451. package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
  452. package/src/FieldStatus/FieldStatus.test.tsx +150 -40
  453. package/src/FieldStatus/FieldStatus.tsx +63 -5
  454. package/src/FileInput/FileInput.doc.mjs +17 -2
  455. package/src/FileInput/FileInput.test.tsx +135 -12
  456. package/src/FileInput/FileInput.tsx +53 -28
  457. package/src/HoverCard/HoverCard.doc.mjs +13 -0
  458. package/src/HoverCard/HoverCard.test.tsx +21 -2
  459. package/src/HoverCard/HoverCard.tsx +11 -0
  460. package/src/HoverCard/useHoverCard.doc.mjs +2 -0
  461. package/src/HoverCard/useHoverCard.tsx +24 -2
  462. package/src/Icon/Icon.doc.mjs +3 -2
  463. package/src/Icon/Icon.tsx +7 -2
  464. package/src/IconButton/IconButton.doc.mjs +8 -0
  465. package/src/IconButton/IconButton.test.tsx +15 -18
  466. package/src/Item/Item.test.tsx +40 -18
  467. package/src/Item/Item.tsx +38 -2
  468. package/src/Layer/useLayer.tsx +8 -0
  469. package/src/Lightbox/Lightbox.tsx +4 -4
  470. package/src/List/List.test.tsx +9 -8
  471. package/src/MobileNav/MobileNav.tsx +12 -1
  472. package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
  473. package/src/MobileNav/MobileNavToggle.tsx +9 -1
  474. package/src/MultiSelector/MultiSelector.doc.mjs +13 -2
  475. package/src/MultiSelector/MultiSelector.test.tsx +195 -3
  476. package/src/MultiSelector/MultiSelector.tsx +65 -12
  477. package/src/MultiSelector/hooks.ts +17 -0
  478. package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
  479. package/src/NumberInput/NumberInput.doc.mjs +15 -0
  480. package/src/NumberInput/NumberInput.test.tsx +82 -7
  481. package/src/NumberInput/NumberInput.tsx +21 -4
  482. package/src/Outline/Outline.tsx +0 -1
  483. package/src/OverflowList/OverflowList.doc.mjs +39 -6
  484. package/src/OverflowList/OverflowList.test.tsx +111 -0
  485. package/src/OverflowList/OverflowList.tsx +48 -8
  486. package/src/Pagination/Pagination.tsx +11 -3
  487. package/src/Popover/Popover.tsx +7 -4
  488. package/src/Popover/usePopover.tsx +9 -13
  489. package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
  490. package/src/PowerSearch/PowerSearch.test.tsx +43 -0
  491. package/src/PowerSearch/PowerSearch.tsx +10 -1
  492. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
  493. package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
  494. package/src/PowerSearch/usePowerSearchSource.ts +1 -2
  495. package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
  496. package/src/SelectableCard/SelectableCard.test.tsx +46 -4
  497. package/src/SelectableCard/SelectableCard.tsx +29 -16
  498. package/src/Selector/Selector.doc.mjs +7 -0
  499. package/src/Selector/Selector.test.tsx +92 -0
  500. package/src/Selector/Selector.tsx +16 -2
  501. package/src/Selector/hooks.ts +17 -0
  502. package/src/SideNav/SideNav.test.tsx +119 -3
  503. package/src/SideNav/SideNavCollapseButton.tsx +6 -1
  504. package/src/SideNav/SideNavHeading.tsx +24 -8
  505. package/src/SideNav/SideNavItem.tsx +5 -1
  506. package/src/Slider/Slider.test.tsx +75 -2
  507. package/src/Slider/Slider.tsx +21 -5
  508. package/src/Switch/Switch.test.tsx +32 -1
  509. package/src/TabList/Tab.tsx +2 -2
  510. package/src/TabList/TabMenu.tsx +2 -2
  511. package/src/Table/BaseTable.tsx +3 -5
  512. package/src/Table/TableCell.tsx +3 -3
  513. package/src/Table/TableHeaderCell.tsx +3 -3
  514. package/src/Table/index.ts +5 -0
  515. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +6 -2
  516. package/src/Table/plugins/rowStatus/index.ts +7 -0
  517. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
  518. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
  519. package/src/Table/plugins/selection/useTableSelection.test.tsx +16 -0
  520. package/src/Table/plugins/selection/useTableSelection.tsx +19 -1
  521. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
  522. package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
  523. package/src/Table/plugins/tree/useTableTreeData.tsx +128 -1
  524. package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
  525. package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
  526. package/src/Table/useBaseTablePlugins.ts +10 -6
  527. package/src/Table/useTableRowStatus.doc.mjs +30 -0
  528. package/src/Table/useTableSelection.doc.mjs +65 -14
  529. package/src/Table/useTableTreeData.doc.mjs +29 -0
  530. package/src/Table/useTableTreeState.doc.mjs +2 -2
  531. package/src/TextArea/TextArea.doc.mjs +15 -0
  532. package/src/TextArea/TextArea.test.tsx +32 -1
  533. package/src/TextArea/TextArea.tsx +10 -0
  534. package/src/TextInput/TextInput.doc.mjs +15 -0
  535. package/src/TextInput/TextInput.test.tsx +44 -0
  536. package/src/TextInput/TextInput.tsx +13 -1
  537. package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
  538. package/src/Thumbnail/Thumbnail.test.tsx +98 -7
  539. package/src/Thumbnail/Thumbnail.tsx +142 -42
  540. package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
  541. package/src/TimeInput/TimeInput.doc.mjs +15 -0
  542. package/src/TimeInput/TimeInput.test.tsx +99 -1
  543. package/src/TimeInput/TimeInput.tsx +29 -6
  544. package/src/Timestamp/Timestamp.doc.mjs +4 -4
  545. package/src/Timestamp/Timestamp.test.tsx +32 -0
  546. package/src/Timestamp/Timestamp.tsx +28 -8
  547. package/src/Toast/useToast.tsx +7 -8
  548. package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
  549. package/src/Tokenizer/Tokenizer.doc.mjs +30 -1
  550. package/src/Tokenizer/Tokenizer.test.tsx +206 -2
  551. package/src/Tokenizer/Tokenizer.tsx +26 -4
  552. package/src/TopNav/TopNav.test.tsx +125 -1
  553. package/src/TopNav/TopNavHeading.tsx +24 -8
  554. package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
  555. package/src/TopNav/TopNavMegaMenu.tsx +10 -4
  556. package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
  557. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
  558. package/src/TopNav/TopNavMenu.test.tsx +118 -4
  559. package/src/TopNav/TopNavMenu.tsx +83 -5
  560. package/src/TreeList/TreeList.doc.mjs +22 -0
  561. package/src/TreeList/TreeList.test.tsx +232 -0
  562. package/src/TreeList/TreeList.tsx +18 -2
  563. package/src/TreeList/TreeListBranches.tsx +16 -2
  564. package/src/TreeList/TreeListItem.tsx +52 -12
  565. package/src/TreeList/TreeListTypes.ts +27 -1
  566. package/src/TreeList/index.ts +2 -2
  567. package/src/Typeahead/BaseTypeahead.tsx +30 -15
  568. package/src/Typeahead/Typeahead.doc.mjs +7 -0
  569. package/src/Typeahead/Typeahead.test.tsx +50 -0
  570. package/src/Typeahead/Typeahead.tsx +10 -0
  571. package/src/authoring/doc.ts +1 -3
  572. package/src/docs-types.ts +5 -0
  573. package/src/hooks/computeOverflow.test.ts +422 -0
  574. package/src/hooks/computeOverflow.ts +290 -0
  575. package/src/hooks/index.ts +2 -0
  576. package/src/hooks/isRtlElement.ts +27 -0
  577. package/src/hooks/useDevWarning.test.tsx +45 -0
  578. package/src/hooks/useDevWarning.ts +54 -0
  579. package/src/hooks/useGridFocus.doc.mjs +3 -3
  580. package/src/hooks/useGridFocus.test.tsx +41 -0
  581. package/src/hooks/useGridFocus.ts +21 -10
  582. package/src/hooks/useListFocus.doc.mjs +3 -3
  583. package/src/hooks/useListFocus.test.tsx +67 -1
  584. package/src/hooks/useListFocus.ts +21 -5
  585. package/src/hooks/useOverflow.test.ts +96 -4
  586. package/src/hooks/useOverflow.ts +74 -33
  587. package/src/i18n/InternationalizationContext.ts +4 -0
  588. package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
  589. package/src/i18n/InternationalizationProvider.tsx +12 -2
  590. package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
  591. package/src/i18n/__tests__/useDirection.test.tsx +66 -0
  592. package/src/i18n/getLocaleDirection.ts +29 -0
  593. package/src/i18n/index.ts +6 -0
  594. package/src/i18n/resolve.ts +9 -21
  595. package/src/i18n/useDirection.ts +29 -0
  596. package/src/reset.css +0 -26
  597. package/src/reset.test.ts +60 -0
  598. package/src/theme/Theme.tsx +11 -14
  599. package/src/theme/derivedVarRegistry.test.ts +1 -0
  600. package/src/theme/derivedVarRegistry.ts +6 -0
  601. package/src/theme/generateThemeRules.test.ts +107 -0
  602. package/src/theme/generateThemeRules.ts +56 -0
  603. package/src/theme/hct.ts +1 -1
  604. package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
  605. package/src/utils/devWarning.test.ts +56 -0
  606. package/src/utils/devWarning.ts +102 -0
  607. package/src/utils/index.ts +6 -0
  608. package/src/utils/plainDate.test.ts +22 -0
  609. package/src/utils/plainDate.ts +61 -0
  610. package/src/utils/types.ts +14 -0
@@ -171,6 +171,33 @@ describe('BaseTypeahead', () => {
171
171
  });
172
172
  });
173
173
 
174
+ describe('empty results active descendant (#4059)', () => {
175
+ it('does not set aria-activedescendant when search has 0 results', async () => {
176
+ render(
177
+ <BaseTypeahead
178
+ searchSource={fruitSource}
179
+ value={null}
180
+ onChange={() => {}}
181
+ debounceMs={0}
182
+ />,
183
+ );
184
+ const input = screen.getByRole('combobox');
185
+ fireEvent.change(input, {target: {value: 'zzzzz'}});
186
+
187
+ await waitFor(() => {
188
+ expect(input).not.toHaveAttribute('aria-activedescendant');
189
+ });
190
+
191
+ // Press ArrowDown — should NOT set aria-activedescendant to option-0
192
+ fireEvent.keyDown(input, {key: 'ArrowDown'});
193
+ expect(input).not.toHaveAttribute('aria-activedescendant');
194
+
195
+ // Press Home — should NOT set aria-activedescendant
196
+ fireEvent.keyDown(input, {key: 'Home'});
197
+ expect(input).not.toHaveAttribute('aria-activedescendant');
198
+ });
199
+ });
200
+
174
201
  it('disables input when isDisabled', () => {
175
202
  render(
176
203
  <BaseTypeahead
@@ -948,3 +975,26 @@ describe('Typeahead disabledMessage', () => {
948
975
  expect(input).not.toHaveAttribute('aria-disabled');
949
976
  });
950
977
  });
978
+
979
+
980
+ describe('Typeahead statusVariant forwarding', () => {
981
+ it('defaults to attached (status renders with data-variant="attached")', () => {
982
+ const {container} = render(
983
+ <Typeahead label="Fruit" searchSource={fruitSource} value={null} onChange={() => {}} status={{type: 'error', message: 'Required'}} />,
984
+ );
985
+ expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
986
+ 'data-variant',
987
+ 'attached',
988
+ );
989
+ });
990
+
991
+ it('forwards statusVariant="detached" to the underlying Field status', () => {
992
+ const {container} = render(
993
+ <Typeahead label="Fruit" searchSource={fruitSource} value={null} onChange={() => {}} status={{type: 'error', message: 'Required'}} statusVariant="detached" />,
994
+ );
995
+ expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
996
+ 'data-variant',
997
+ 'detached',
998
+ );
999
+ });
1000
+ });
@@ -36,6 +36,7 @@ import {
36
36
  inputStatusBorderStyles,
37
37
  inputStatusHoverShadowStyles,
38
38
  inputStatusFocusWithinStyles,
39
+ type FieldStatusVariant,
39
40
  } from '../Field';
40
41
  import {Token} from '../Token';
41
42
  import {useTooltip} from '../Tooltip';
@@ -75,6 +76,13 @@ export interface TypeaheadProps<T extends SearchableItem> extends Omit<
75
76
  isOptional?: boolean;
76
77
  /** Validation status. */
77
78
  status?: InputStatus;
79
+ /**
80
+ * How the status message is placed relative to the input.
81
+ * - 'attached': message overlaps directly below the input (bordered treatment)
82
+ * - 'detached': message floats below as a separate element with spacing
83
+ * @default 'attached'
84
+ */
85
+ statusVariant?: FieldStatusVariant;
78
86
  /**
79
87
  * Icon to display at the start of the input.
80
88
  * Accepts a ReactNode (e.g. `<Icon icon={SearchIcon} />`) or an SVG icon component directly.
@@ -226,6 +234,7 @@ export function Typeahead<T extends SearchableItem>({
226
234
  isRequired = false,
227
235
  isOptional = false,
228
236
  status,
237
+ statusVariant = 'attached',
229
238
  startIcon,
230
239
  labelTooltip,
231
240
  searchSource,
@@ -500,6 +509,7 @@ export function Typeahead<T extends SearchableItem>({
500
509
  }
501
510
  : undefined
502
511
  }
512
+ statusVariant={statusVariant}
503
513
  labelTooltip={labelTooltip}
504
514
  width={width}
505
515
  xstyle={xstyle}
@@ -130,9 +130,7 @@ export type AstryxGenericDocInput = AstryxBaseDocInput;
130
130
  * any code referring to the old name.
131
131
  */
132
132
  export type AstryxComponentDoc =
133
- | AstryxComponentDocInput
134
- | AstryxFunctionDocInput
135
- | AstryxGenericDocInput;
133
+ AstryxComponentDocInput | AstryxFunctionDocInput | AstryxGenericDocInput;
136
134
 
137
135
  /**
138
136
  * Author a component doc. Stamp-only: returns the def with `type: 'component'`
package/src/docs-types.ts CHANGED
@@ -669,6 +669,7 @@ export interface TranslationDoc {
669
669
  * @example
670
670
  * ```
671
671
  * { type: 'prose', text: 'Spacing tokens control gap and padding...' }
672
+ * { type: 'heading', level: 3, text: 'Examples' }
672
673
  * { type: 'code', lang: 'tsx', code: 'padding: spacingVars[...]' }
673
674
  * { type: 'table', headers: ['Token', 'Value'], rows: [['--spacing-4', '16px']] }
674
675
  * { type: 'list', style: 'do', items: ['Use semantic tokens'] }
@@ -677,6 +678,7 @@ export interface TranslationDoc {
677
678
  */
678
679
  export type ContentBlock =
679
680
  | {type: 'prose'; text: string}
681
+ | {type: 'heading'; level: 3 | 4 | 5 | 6; text: string}
680
682
  | {type: 'code'; lang: string; code: string; label?: string}
681
683
  | {type: 'table'; headers: string[]; rows: string[][]}
682
684
  | {
@@ -729,6 +731,9 @@ export type TokenPreviewType =
729
731
  export interface ReferenceSection {
730
732
  /** Section title, e.g. "Spacing Tokens", "Light/Dark Mode" */
731
733
  title: string;
734
+ /** Navigation category ('guide' | 'foundations'). Mirrors the parent doc's
735
+ * category so sections can be grouped independently in the docsite nav. */
736
+ category?: string;
732
737
  /** Ordered content blocks. Mix prose, code, tables, and lists freely. */
733
738
  content: ContentBlock[];
734
739
  /** Preview type for token tables in this section. When set, the docsite
@@ -0,0 +1,422 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {describe, it, expect} from 'vitest';
4
+ import {computeOverflow, type ComputeOverflowInput} from './computeOverflow';
5
+
6
+ // Convenience wrapper with sensible defaults so each test states only what it
7
+ // exercises. All widths/gaps are plain numbers — no DOM involved.
8
+ function compute(overrides: Partial<ComputeOverflowInput>) {
9
+ return computeOverflow({
10
+ widths: [],
11
+ gap: 0,
12
+ availableWidth: 0,
13
+ indicatorWidth: 0,
14
+ minVisibleItems: 0,
15
+ collapseFrom: 'end',
16
+ ...overrides,
17
+ });
18
+ }
19
+
20
+ describe('computeOverflow — single line, no limits (parity with legacy loop)', () => {
21
+ it('shows all items when they fit', () => {
22
+ // 3×50, gap 10 → 170 ≤ 200
23
+ expect(
24
+ compute({widths: [50, 50, 50], gap: 10, availableWidth: 200}),
25
+ ).toEqual({visibleCount: 3, rows: 1});
26
+ });
27
+
28
+ it('hides items that do not fit and reserves indicator space', () => {
29
+ // 4×50, gap 10, indicator 30, container 150 → 2 fit
30
+ expect(
31
+ compute({
32
+ widths: [50, 50, 50, 50],
33
+ gap: 10,
34
+ indicatorWidth: 30,
35
+ availableWidth: 150,
36
+ }),
37
+ ).toEqual({visibleCount: 2, rows: 1});
38
+ });
39
+
40
+ it('shows zero when nothing fits and floor is 0', () => {
41
+ expect(
42
+ compute({
43
+ widths: [100, 100, 100],
44
+ indicatorWidth: 30,
45
+ availableWidth: 50,
46
+ }),
47
+ ).toEqual({visibleCount: 0, rows: 0});
48
+ });
49
+
50
+ it('exact fit with indicator not needed shows all', () => {
51
+ // 3×50, gap 10 → 170 == 170
52
+ expect(
53
+ compute({
54
+ widths: [50, 50, 50],
55
+ gap: 10,
56
+ indicatorWidth: 30,
57
+ availableWidth: 170,
58
+ }),
59
+ ).toEqual({visibleCount: 3, rows: 1});
60
+ });
61
+
62
+ it('off-by-one: one pixel short drops the last item', () => {
63
+ expect(
64
+ compute({
65
+ widths: [50, 50, 50],
66
+ gap: 10,
67
+ indicatorWidth: 30,
68
+ availableWidth: 169,
69
+ }),
70
+ ).toEqual({visibleCount: 2, rows: 1});
71
+ });
72
+
73
+ it('works without an indicator', () => {
74
+ // 3×50, gap 10, container 130 → 2 fit
75
+ expect(
76
+ compute({widths: [50, 50, 50], gap: 10, availableWidth: 130}),
77
+ ).toEqual({visibleCount: 2, rows: 1});
78
+ });
79
+
80
+ it('varied widths', () => {
81
+ expect(
82
+ compute({
83
+ widths: [30, 80, 40, 60],
84
+ gap: 10,
85
+ indicatorWidth: 25,
86
+ availableWidth: 200,
87
+ }),
88
+ ).toEqual({visibleCount: 2, rows: 1});
89
+ });
90
+ });
91
+
92
+ describe('computeOverflow — floor (minVisibleItems)', () => {
93
+ it('respects the floor even when items do not fit', () => {
94
+ expect(
95
+ compute({
96
+ widths: [100, 100, 100],
97
+ indicatorWidth: 30,
98
+ availableWidth: 50,
99
+ minVisibleItems: 2,
100
+ }),
101
+ ).toEqual({visibleCount: 2, rows: 1});
102
+ });
103
+
104
+ it('floor larger than itemCount is clamped to itemCount', () => {
105
+ expect(
106
+ compute({
107
+ widths: [100, 100],
108
+ availableWidth: 10,
109
+ minVisibleItems: 5,
110
+ }),
111
+ ).toEqual({visibleCount: 2, rows: 1});
112
+ });
113
+ });
114
+
115
+ describe('computeOverflow — cap (maxVisibleItems)', () => {
116
+ it('caps below fit even when everything fits', () => {
117
+ // all 5 fit in a wide container, cap at 2
118
+ expect(
119
+ compute({
120
+ widths: [40, 40, 40, 40, 40],
121
+ gap: 8,
122
+ availableWidth: 10000,
123
+ maxVisibleItems: 2,
124
+ }),
125
+ ).toEqual({visibleCount: 2, rows: 1});
126
+ });
127
+
128
+ it('cap of 0 shows nothing', () => {
129
+ expect(
130
+ compute({
131
+ widths: [40, 40, 40],
132
+ availableWidth: 10000,
133
+ maxVisibleItems: 0,
134
+ }),
135
+ ).toEqual({visibleCount: 0, rows: 0});
136
+ });
137
+
138
+ it('cap greater than itemCount is a no-op', () => {
139
+ expect(
140
+ compute({
141
+ widths: [40, 40, 40],
142
+ gap: 8,
143
+ availableWidth: 10000,
144
+ maxVisibleItems: 99,
145
+ }),
146
+ ).toEqual({visibleCount: 3, rows: 1});
147
+ });
148
+
149
+ it('cap does not raise a fit-limited count', () => {
150
+ // container only fits 2, cap is 4 → still 2
151
+ expect(
152
+ compute({
153
+ widths: [50, 50, 50, 50],
154
+ gap: 10,
155
+ indicatorWidth: 30,
156
+ availableWidth: 150,
157
+ maxVisibleItems: 4,
158
+ }),
159
+ ).toEqual({visibleCount: 2, rows: 1});
160
+ });
161
+ });
162
+
163
+ describe('computeOverflow — cap + floor composition', () => {
164
+ it('both honored when min <= max', () => {
165
+ // fit would be 2; floor 1, cap 3 → 2
166
+ expect(
167
+ compute({
168
+ widths: [50, 50, 50, 50],
169
+ gap: 10,
170
+ indicatorWidth: 30,
171
+ availableWidth: 150,
172
+ minVisibleItems: 1,
173
+ maxVisibleItems: 3,
174
+ }),
175
+ ).toEqual({visibleCount: 2, rows: 1});
176
+ });
177
+
178
+ it('D1: when max < min, min wins', () => {
179
+ // wide container fits all 5; floor 3, cap 1 → floor wins → 3
180
+ expect(
181
+ compute({
182
+ widths: [40, 40, 40, 40, 40],
183
+ gap: 8,
184
+ availableWidth: 10000,
185
+ minVisibleItems: 3,
186
+ maxVisibleItems: 1,
187
+ }),
188
+ ).toEqual({visibleCount: 3, rows: 1});
189
+ });
190
+ });
191
+
192
+ describe('computeOverflow — collapseFrom start vs end + cap', () => {
193
+ it('single-line collapseFrom start keeps the tail', () => {
194
+ // Items: 30, 80, 40. gap 10, indicator 25, container 100.
195
+ // reversed: [40, 80, 30] → only 40 fits → visibleCount 1
196
+ expect(
197
+ compute({
198
+ widths: [30, 80, 40],
199
+ gap: 10,
200
+ indicatorWidth: 25,
201
+ availableWidth: 100,
202
+ collapseFrom: 'start',
203
+ }),
204
+ ).toEqual({visibleCount: 1, rows: 1});
205
+ });
206
+
207
+ it('collapseFrom start + cap trims from the correct end', () => {
208
+ expect(
209
+ compute({
210
+ widths: [40, 40, 40, 40],
211
+ gap: 8,
212
+ availableWidth: 10000,
213
+ collapseFrom: 'start',
214
+ maxVisibleItems: 2,
215
+ }),
216
+ ).toEqual({visibleCount: 2, rows: 1});
217
+ });
218
+ });
219
+
220
+ describe('computeOverflow — multi-row (maxRows)', () => {
221
+ it('maxRows 1 is equivalent to single line', () => {
222
+ const single = compute({
223
+ widths: [50, 50, 50, 50],
224
+ gap: 10,
225
+ indicatorWidth: 30,
226
+ availableWidth: 150,
227
+ });
228
+ const withMaxRows1 = compute({
229
+ widths: [50, 50, 50, 50],
230
+ gap: 10,
231
+ indicatorWidth: 30,
232
+ availableWidth: 150,
233
+ maxRows: 1,
234
+ });
235
+ expect(withMaxRows1).toEqual(single);
236
+ expect(withMaxRows1).toEqual({visibleCount: 2, rows: 1});
237
+ });
238
+
239
+ it('packs items onto exactly maxRows rows when all fit', () => {
240
+ // 6×50, gap 10 → each row of width 170 holds 3 (50+10+50+10+50=170).
241
+ // availableWidth 170, maxRows 2 → all 6 fit on 2 rows.
242
+ expect(
243
+ compute({
244
+ widths: [50, 50, 50, 50, 50, 50],
245
+ gap: 10,
246
+ availableWidth: 170,
247
+ maxRows: 2,
248
+ }),
249
+ ).toEqual({visibleCount: 6, rows: 2});
250
+ });
251
+
252
+ it('collapses overflow past maxRows into the indicator (reserved on last row)', () => {
253
+ // 8×50, gap 10, width 170 → 3 per row. maxRows 2.
254
+ // Row 1: 3 items (170). Row 2 (last): reserve indicator 40 + gap 10 = 50.
255
+ // available for items on row 2 = 170; place 50 (ok, rowWidth 50),
256
+ // next 50 → 50+10+50=110 + reserve 50 = 160 ≤ 170 ok (2 items),
257
+ // next 50 → 110+10+50=170 + 50 = 220 > 170 stop. Row 2 holds 2.
258
+ // → 3 + 2 = 5 visible, 2 rows.
259
+ expect(
260
+ compute({
261
+ widths: [50, 50, 50, 50, 50, 50, 50, 50],
262
+ gap: 10,
263
+ indicatorWidth: 40,
264
+ availableWidth: 170,
265
+ maxRows: 2,
266
+ }),
267
+ ).toEqual({visibleCount: 5, rows: 2});
268
+ });
269
+
270
+ it('all items on a single row still reports rows: 1 under maxRows 2', () => {
271
+ expect(
272
+ compute({
273
+ widths: [30, 30, 30],
274
+ gap: 5,
275
+ availableWidth: 500,
276
+ maxRows: 2,
277
+ }),
278
+ ).toEqual({visibleCount: 3, rows: 1});
279
+ });
280
+
281
+ it('cap wins when it is stricter than the rows allow', () => {
282
+ // 6 items fit on 2 rows, but cap at 4 → 4 visible.
283
+ expect(
284
+ compute({
285
+ widths: [50, 50, 50, 50, 50, 50],
286
+ gap: 10,
287
+ indicatorWidth: 40,
288
+ availableWidth: 170,
289
+ maxRows: 2,
290
+ maxVisibleItems: 4,
291
+ }),
292
+ ).toEqual({visibleCount: 4, rows: 2});
293
+ });
294
+
295
+ it('rows win when they are stricter than the cap', () => {
296
+ // maxRows 2 admits 5 (see above); cap 8 is looser → rows win → 5.
297
+ expect(
298
+ compute({
299
+ widths: [50, 50, 50, 50, 50, 50, 50, 50],
300
+ gap: 10,
301
+ indicatorWidth: 40,
302
+ availableWidth: 170,
303
+ maxRows: 2,
304
+ maxVisibleItems: 8,
305
+ }),
306
+ ).toEqual({visibleCount: 5, rows: 2});
307
+ });
308
+
309
+ it('multi-row collapseFrom start keeps the tail items', () => {
310
+ // 8 items, reversed packing; same geometry as the end case → 5 visible.
311
+ const res = compute({
312
+ widths: [50, 50, 50, 50, 50, 50, 50, 50],
313
+ gap: 10,
314
+ indicatorWidth: 40,
315
+ availableWidth: 170,
316
+ maxRows: 2,
317
+ collapseFrom: 'start',
318
+ });
319
+ expect(res).toEqual({visibleCount: 5, rows: 2});
320
+ });
321
+
322
+ it('maxRows taller than content does not add phantom rows', () => {
323
+ // 3 items fit on one row; maxRows 5 → rows 1, all visible.
324
+ expect(
325
+ compute({
326
+ widths: [40, 40, 40],
327
+ gap: 10,
328
+ availableWidth: 500,
329
+ maxRows: 5,
330
+ }),
331
+ ).toEqual({visibleCount: 3, rows: 1});
332
+ });
333
+
334
+ it('floor is honored in multi-row even when nothing fits', () => {
335
+ // Very narrow container, floor 2.
336
+ expect(
337
+ compute({
338
+ widths: [500, 500, 500],
339
+ gap: 10,
340
+ indicatorWidth: 40,
341
+ availableWidth: 100,
342
+ maxRows: 2,
343
+ minVisibleItems: 2,
344
+ }),
345
+ ).toEqual({visibleCount: 2, rows: 2});
346
+ });
347
+ });
348
+
349
+ describe('computeOverflow — resize behavior (shrink/grow re-clamps, never exceeds cap)', () => {
350
+ const base: Partial<ComputeOverflowInput> = {
351
+ widths: [50, 50, 50, 50, 50],
352
+ gap: 10,
353
+ indicatorWidth: 30,
354
+ maxVisibleItems: 3,
355
+ };
356
+
357
+ it('grows back only up to the cap', () => {
358
+ // Huge container would fit all 5, cap holds at 3.
359
+ expect(compute({...base, availableWidth: 10000})).toEqual({
360
+ visibleCount: 3,
361
+ rows: 1,
362
+ });
363
+ });
364
+
365
+ it('shrinks below the cap when space is tight', () => {
366
+ // Narrow container fits fewer than the cap.
367
+ expect(compute({...base, availableWidth: 150})).toEqual({
368
+ visibleCount: 2,
369
+ rows: 1,
370
+ });
371
+ });
372
+
373
+ it('never exceeds the cap across a shrink→grow cycle', () => {
374
+ const shrunk = compute({...base, availableWidth: 120});
375
+ const grown = compute({...base, availableWidth: 10000});
376
+ expect(grown.visibleCount).toBeLessThanOrEqual(3);
377
+ expect(shrunk.visibleCount).toBeLessThanOrEqual(grown.visibleCount);
378
+ });
379
+ });
380
+
381
+ describe('computeOverflow — degenerate inputs', () => {
382
+ it('empty list', () => {
383
+ expect(compute({widths: []})).toEqual({visibleCount: 0, rows: 0});
384
+ });
385
+
386
+ it('single item that fits', () => {
387
+ expect(compute({widths: [50], gap: 10, availableWidth: 100})).toEqual({
388
+ visibleCount: 1,
389
+ rows: 1,
390
+ });
391
+ });
392
+
393
+ it('single item that does not fit, no floor', () => {
394
+ expect(
395
+ compute({widths: [200], indicatorWidth: 30, availableWidth: 100}),
396
+ ).toEqual({visibleCount: 0, rows: 0});
397
+ });
398
+
399
+ it('maxRows 0 falls back to single-line semantics', () => {
400
+ // maxRows 0 is degenerate; treated as single line (not multi-row).
401
+ expect(
402
+ compute({
403
+ widths: [50, 50, 50],
404
+ gap: 10,
405
+ availableWidth: 130,
406
+ maxRows: 0,
407
+ }),
408
+ ).toEqual({visibleCount: 2, rows: 1});
409
+ });
410
+
411
+ it('cap 0 with floor 0 and multi-row shows nothing', () => {
412
+ expect(
413
+ compute({
414
+ widths: [50, 50],
415
+ gap: 10,
416
+ availableWidth: 500,
417
+ maxRows: 2,
418
+ maxVisibleItems: 0,
419
+ }),
420
+ ).toEqual({visibleCount: 0, rows: 0});
421
+ });
422
+ });