@astryxdesign/core 0.1.8 → 0.1.9-canary.1887ee2

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 -0
  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
@@ -634,3 +634,107 @@ describe('useTableTreeState — semantics edges', () => {
634
634
  expect(ids(result.current.visibleData)).toEqual(['src', 'readme']);
635
635
  });
636
636
  });
637
+
638
+ // =============================================================================
639
+ // isAllExpanded (drives the header expand-all control)
640
+ // =============================================================================
641
+
642
+ describe('useTableTreeState: isAllExpanded', () => {
643
+ it('reports false when nothing is expanded', () => {
644
+ const {result} = renderHook(() =>
645
+ useTableTreeState({data: fileTree, idKey: 'id'}),
646
+ );
647
+
648
+ expect(result.current.isAllExpanded).toBe(false);
649
+ });
650
+
651
+ it('reports true only when every expandable row is expanded', () => {
652
+ const {result} = renderHook(() =>
653
+ useTableTreeState({data: fileTree, idKey: 'id'}),
654
+ );
655
+
656
+ act(() => {
657
+ result.current.expandAll();
658
+ });
659
+
660
+ expect(result.current.isAllExpanded).toBe(true);
661
+ });
662
+
663
+ it("reports 'indeterminate' when some but not all expandable rows are expanded", () => {
664
+ const {result} = renderHook(() =>
665
+ useTableTreeState({
666
+ data: fileTree,
667
+ idKey: 'id',
668
+ defaultExpandedIds: ['src'],
669
+ }),
670
+ );
671
+
672
+ // 'src' and 'components' are both expandable; only 'src' is expanded.
673
+ expect(result.current.isAllExpanded).toBe('indeterminate');
674
+ });
675
+
676
+ it('returns to false after collapseAll', () => {
677
+ const {result} = renderHook(() =>
678
+ useTableTreeState({
679
+ data: fileTree,
680
+ idKey: 'id',
681
+ defaultExpandedIds: ['src', 'components'],
682
+ }),
683
+ );
684
+
685
+ act(() => {
686
+ result.current.collapseAll();
687
+ });
688
+
689
+ expect(result.current.isAllExpanded).toBe(false);
690
+ });
691
+
692
+ it('reports false for flat data (no expandable rows)', () => {
693
+ const flat: FileRow[] = [
694
+ {id: 'a', name: 'A', size: 1},
695
+ {id: 'b', name: 'B', size: 2},
696
+ ];
697
+ const {result} = renderHook(() =>
698
+ useTableTreeState({data: flat, idKey: 'id'}),
699
+ );
700
+
701
+ expect(result.current.isAllExpanded).toBe(false);
702
+ });
703
+
704
+ it('ignores expanded ids that match no expandable row when aggregating', () => {
705
+ // 'readme' is a leaf (not expandable) and 'ghost' matches nothing; neither
706
+ // should count toward the expandable total, so an all-expandable set that
707
+ // omits them still reads as fully expanded.
708
+ const {result} = renderHook(() =>
709
+ useTableTreeState({
710
+ data: fileTree,
711
+ idKey: 'id',
712
+ defaultExpandedIds: ['src', 'components', 'readme', 'ghost'],
713
+ }),
714
+ );
715
+
716
+ expect(result.current.isAllExpanded).toBe(true);
717
+ });
718
+
719
+ it('exposes the aggregate state and expand/collapse handlers through treeConfig', () => {
720
+ const {result} = renderHook(() =>
721
+ useTableTreeState({data: fileTree, idKey: 'id'}),
722
+ );
723
+
724
+ // The headless plugin reads everything it needs to render the header
725
+ // expand-all control from treeConfig, not from the state hook directly.
726
+ expect(result.current.treeConfig.isAllExpanded).toBe(false);
727
+
728
+ act(() => {
729
+ result.current.treeConfig.onExpandAll?.();
730
+ });
731
+ expect(result.current.isAllExpanded).toBe(true);
732
+ expect(result.current.treeConfig.isAllExpanded).toBe(true);
733
+
734
+ act(() => {
735
+ result.current.treeConfig.onCollapseAll?.();
736
+ });
737
+ expect(result.current.isAllExpanded).toBe(false);
738
+ expect(result.current.treeConfig.isAllExpanded).toBe(false);
739
+ });
740
+ });
@@ -74,6 +74,12 @@ export interface UseTableTreeStateResult<T extends Record<string, unknown>> {
74
74
  treeConfig: UseTableTreeDataConfig<T>;
75
75
  /** The current expanded row ids. */
76
76
  expandedIds: ReadonlySet<string>;
77
+ /**
78
+ * Aggregate expansion state across every expandable row: `true` when all are
79
+ * expanded, `false` when none are, `'indeterminate'` when some but not all
80
+ * are. Drives the header expand-all control. Reports `false` for flat data.
81
+ */
82
+ isAllExpanded: boolean | 'indeterminate';
77
83
  /** Expand every expandable row in the tree. */
78
84
  expandAll: () => void;
79
85
  /** Collapse every row. */
@@ -211,6 +217,25 @@ export function useTableTreeState<T extends Record<string, unknown>>(
211
217
 
212
218
  const hasExpandableRows = allExpandableIds.length > 0;
213
219
 
220
+ // Aggregate state for the header expand-all control. Only expandable ids
221
+ // count toward the total, so expanded ids that match a leaf or no row at
222
+ // all never skew the tally.
223
+ const isAllExpanded: boolean | 'indeterminate' = useMemo(() => {
224
+ if (!hasExpandableRows) {
225
+ return false;
226
+ }
227
+ const expandedCount = allExpandableIds.filter(id =>
228
+ expandedIds.has(id),
229
+ ).length;
230
+ if (expandedCount === 0) {
231
+ return false;
232
+ }
233
+ if (expandedCount === allExpandableIds.length) {
234
+ return true;
235
+ }
236
+ return 'indeterminate';
237
+ }, [hasExpandableRows, allExpandableIds, expandedIds]);
238
+
214
239
  const onToggleItem = useCallback(
215
240
  (item: T) => {
216
241
  const id = getId(item);
@@ -243,11 +268,30 @@ export function useTableTreeState<T extends Record<string, unknown>>(
243
268
  getRowMeta,
244
269
  onToggleItem,
245
270
  hasExpandableRows,
271
+ isAllExpanded,
272
+ onExpandAll: expandAll,
273
+ onCollapseAll: collapseAll,
246
274
  indent,
247
275
  treeColumnKey,
248
276
  }),
249
- [getRowMeta, onToggleItem, hasExpandableRows, indent, treeColumnKey],
277
+ [
278
+ getRowMeta,
279
+ onToggleItem,
280
+ hasExpandableRows,
281
+ isAllExpanded,
282
+ expandAll,
283
+ collapseAll,
284
+ indent,
285
+ treeColumnKey,
286
+ ],
250
287
  );
251
288
 
252
- return {visibleData, treeConfig, expandedIds, expandAll, collapseAll};
289
+ return {
290
+ visibleData,
291
+ treeConfig,
292
+ expandedIds,
293
+ isAllExpanded,
294
+ expandAll,
295
+ collapseAll,
296
+ };
253
297
  }
@@ -38,6 +38,7 @@
38
38
 
39
39
  import {useRef} from 'react';
40
40
  import type {TablePlugin} from './types';
41
+ import {devWarn} from '../utils/devWarning';
41
42
 
42
43
  // ======================================================================// Canonical Plugin Order
43
44
  // ======================================================================
@@ -112,8 +113,9 @@ function validatePlugin<T extends Record<string, unknown>>(
112
113
  // Warn about unknown keys (likely misspelled transform names)
113
114
  for (const key of keys) {
114
115
  if (!VALID_TRANSFORM_KEYS.has(key)) {
115
- console.warn(
116
- `[Table] Plugin "${name}" has unknown key "${key}". ` +
116
+ devWarn(
117
+ 'Table',
118
+ `Plugin "${name}" has unknown key "${key}". ` +
117
119
  `Valid keys: ${[...VALID_TRANSFORM_KEYS].join(', ')}. ` +
118
120
  `This key will be ignored.`,
119
121
  );
@@ -125,8 +127,9 @@ function validatePlugin<T extends Record<string, unknown>>(
125
127
  if (VALID_TRANSFORM_KEYS.has(key)) {
126
128
  const value = (plugin as Record<string, unknown>)[key];
127
129
  if (value != null && typeof value !== 'function') {
128
- console.warn(
129
- `[Table] Plugin "${name}" has non-function value for "${key}" ` +
130
+ devWarn(
131
+ 'Table',
132
+ `Plugin "${name}" has non-function value for "${key}" ` +
130
133
  `(got ${typeof value}). Transform will be skipped.`,
131
134
  );
132
135
  }
@@ -140,8 +143,9 @@ function validatePlugin<T extends Record<string, unknown>>(
140
143
  typeof (plugin as Record<string, unknown>)[key] === 'function',
141
144
  );
142
145
  if (!hasTransforms) {
143
- console.warn(
144
- `[Table] Plugin "${name}" has no transform methods. ` +
146
+ devWarn(
147
+ 'Table',
148
+ `Plugin "${name}" has no transform methods. ` +
145
149
  `It will be included in the pipeline but won't do anything.`,
146
150
  );
147
151
  }
@@ -0,0 +1,30 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /** @type {import('../docs-types').ComponentDoc} */
4
+
5
+ export const docs = {
6
+ name: 'useTableRowStatus',
7
+ subComponentOf: 'Table',
8
+ displayName: 'useTableRowStatus',
9
+ description:
10
+ 'Hook that returns a TablePlugin which prepends a narrow column signaling per-row status: a colored status dot by default, or an icon when provided (shape + color is more accessible than color alone). getStatus maps a row to a semantic color (mapped to a theme token) or raw CSS color, an optional icon, and a required accessible label (shown in a tooltip on hover and announced to assistive technology, so status is never color-only); return null for no indicator. Memoize getStatus with useCallback for a stable plugin identity.',
11
+ props: [
12
+ {
13
+ name: 'getStatus',
14
+ type: "(item: T) => { color: 'accent' | 'success' | 'error' | 'warning' | 'red' | 'orange' | 'green' | 'yellow' | 'blue' | 'gray' | string; icon?: IconName; label: string } | null",
15
+ description:
16
+ 'Derive the status indicator for a row: a semantic color (accent, success, error, warning, red, orange, green, yellow, blue, gray — mapped to a theme token) or a raw CSS color as an escape hatch; an optional icon to signal status by shape instead of the dot (recommended when multiple statuses coexist; valid names: close, chevronDown, chevronLeft, chevronRight, check, success, error, warning, info, calendar, clock, externalLink, menu, moreHorizontal, search, arrowUp, arrowDown, arrowsUpDown, funnel, eyeSlash, viewColumns, copy, checkDouble, wrench, stop, microphone); and a required accessible label (announced via role="img" and shown in a tooltip on hover, so a status is never conveyed by color alone). Return null for rows with no status. Memoize with useCallback for a stable plugin identity.',
17
+ required: true,
18
+ },
19
+ ],
20
+ };
21
+
22
+ /** @type {import('../docs-types').TranslationDoc} */
23
+ export const docsDense = {
24
+ description:
25
+ 'Returns a TablePlugin that prepends a narrow per-row status column: a colored dot, or an icon when provided (shape + color beats color alone for a11y). getStatus maps a row to {color, icon?, label} or null. color is a semantic name (success/error/warning/etc.) mapped to a theme token, or a raw CSS color. label is required (tooltip + accessible name). Memoize getStatus with useCallback.',
26
+ propDescriptions: {
27
+ getStatus:
28
+ 'Map a row to {color, icon?, label} or null. color = semantic status name (mapped to a token) or raw CSS; icon = shape signifier (a11y); label = required accessible name (tooltip + role="img"). Memoize with useCallback.',
29
+ },
30
+ };
@@ -6,7 +6,8 @@ export const docs = {
6
6
  name: 'useTableSelection',
7
7
  subComponentOf: 'Table',
8
8
  displayName: 'useTableSelection',
9
- description: 'Hook that returns a TablePlugin implementing row selection with checkboxes, select-all, and aria-selected. Uses React Context for independent checkbox re-renders.',
9
+ description:
10
+ 'Hook that returns a TablePlugin implementing row selection with checkboxes, select-all, and aria-selected. Uses React Context for independent checkbox re-renders.',
10
11
  props: [
11
12
  {
12
13
  name: 'getIsItemSelected',
@@ -17,7 +18,8 @@ export const docs = {
17
18
  {
18
19
  name: 'onSelectItem',
19
20
  type: '(event: {item: T; isSelected: boolean}) => void',
20
- description: 'Called when a row checkbox is toggled. isSelected is the new desired state.',
21
+ description:
22
+ 'Called when a row checkbox is toggled. isSelected is the new desired state.',
21
23
  required: true,
22
24
  },
23
25
  {
@@ -29,33 +31,67 @@ export const docs = {
29
31
  {
30
32
  name: 'getIsAllSelected',
31
33
  type: '() => boolean',
32
- description: 'Returns whether all selectable items are currently selected.',
34
+ description:
35
+ 'Returns whether all selectable items are currently selected.',
33
36
  required: true,
34
37
  },
35
38
  {
36
39
  name: 'getIsIndeterminate',
37
40
  type: '() => boolean',
38
- description: 'Returns whether selection is partial (some but not all). Renders the select-all checkbox in indeterminate state.',
41
+ description:
42
+ 'Returns whether selection is partial (some but not all). Renders the select-all checkbox in indeterminate state.',
39
43
  },
40
44
  {
41
45
  name: 'getIsItemSelectable',
42
46
  type: '(item: T) => boolean',
43
- description: 'Returns whether a row should show a checkbox. Non-selectable rows render nothing in the selection cell.',
47
+ description:
48
+ 'Returns whether a row should show a checkbox. Non-selectable rows render nothing in the selection cell.',
44
49
  default: '() => true',
45
50
  },
46
51
  {
47
52
  name: 'getIsItemEnabled',
48
53
  type: '(item: T) => boolean',
49
- description: 'Returns whether a row checkbox is interactive. Disabled rows show a disabled checkbox.',
54
+ description:
55
+ 'Returns whether a row checkbox is interactive. Disabled rows show a disabled checkbox.',
50
56
  default: '() => true',
51
57
  },
58
+ {
59
+ name: 'getRowLabel',
60
+ type: '(item: T) => string',
61
+ description:
62
+ 'Derives a human-readable identity for a row; the row checkbox\'s hidden label becomes `Select ${getRowLabel(item)}` so screen readers announce which row each checkbox selects. Falls back to "Select row" when omitted.',
63
+ },
64
+ ],
65
+ examples: [
66
+ {
67
+ label: 'Accessible per-row checkbox names',
68
+ code: `
69
+ const selectionPlugin = useTableSelection({
70
+ getIsItemSelected: item => selectedIds.has(item.id),
71
+ onSelectItem: ({item, isSelected}) => toggle(item.id, isSelected),
72
+ onSelectAll: ({isAllSelected}) => selectAll(isAllSelected),
73
+ getIsAllSelected: () => selectedIds.size === users.length,
74
+ // Screen readers announce "Select Alice", "Select Bob", ...
75
+ // instead of an undifferentiated "Select row" for every checkbox.
76
+ getRowLabel: item => item.name,
77
+ });
78
+
79
+ <Table
80
+ data={users}
81
+ columns={columns}
82
+ idKey="id"
83
+ plugins={{selection: selectionPlugin}}
84
+ />;
85
+ `,
86
+ },
52
87
  ],
53
88
  };
54
89
 
55
90
  export const docsZh = {
56
91
  name: 'useTableSelection',
57
92
  displayName: 'useTableSelection',
58
- description: '返回 TablePlugin 的 Hook,实现带复选框、全选和 aria-selected 的行选择功能。使用 React Context 实现独立的复选框重新渲染。',
93
+ description:
94
+ '返回 TablePlugin 的 Hook,实现带复选框、全选和 aria-selected 的行选择功能。使用 React Context 实现独立的复选框重新渲染。',
59
95
  props: [
60
96
  {
61
97
  name: 'getIsItemSelected',
@@ -84,12 +120,14 @@ export const docsZh = {
84
120
  {
85
121
  name: 'getIsIndeterminate',
86
122
  type: '() => boolean',
87
- description: '返回选择是否为部分选中(部分但非全部)。将全选复选框渲染为不确定状态。',
123
+ description:
124
+ '返回选择是否为部分选中(部分但非全部)。将全选复选框渲染为不确定状态。',
88
125
  },
89
126
  {
90
127
  name: 'getIsItemSelectable',
91
128
  type: '(item: T) => boolean',
92
- description: '返回行是否应显示复选框。不可选择的行在选择单元格中不渲染任何内容。',
129
+ description:
130
+ '返回行是否应显示复选框。不可选择的行在选择单元格中不渲染任何内容。',
93
131
  default: '() => true',
94
132
  },
95
133
  {
@@ -98,20 +136,33 @@ export const docsZh = {
98
136
  description: '返回行复选框是否可交互。禁用的行显示禁用状态的复选框。',
99
137
  default: '() => true',
100
138
  },
139
+ {
140
+ name: 'getRowLabel',
141
+ type: '(item: T) => string',
142
+ description:
143
+ '为行派生人类可读的标识;行复选框的隐藏标签变为 `Select ${getRowLabel(item)}`,让屏幕阅读器播报每个复选框选择的是哪一行。省略时回退为 "Select row"。',
144
+ },
101
145
  ],
102
146
  };
103
147
 
104
148
  export const docsDense = {
105
149
  name: 'useTableSelection',
106
150
  displayName: 'useTableSelection',
107
- description: 'Hook returning TablePlugin for row selection w/ checkboxes, select-all, aria-selected. Uses React Context for independent checkbox re-renders.',
151
+ description:
152
+ 'Hook returning TablePlugin for row selection w/ checkboxes, select-all, aria-selected. Uses React Context for independent checkbox re-renders.',
108
153
  propDescriptions: {
109
154
  getIsItemSelected: 'Returns whether item is selected.',
110
- onSelectItem: 'Called on row checkbox toggle; isSelected = new desired state.',
155
+ onSelectItem:
156
+ 'Called on row checkbox toggle; isSelected = new desired state.',
111
157
  onSelectAll: 'Called on select-all header checkbox toggle.',
112
158
  getIsAllSelected: 'Returns whether all selectable items are selected.',
113
- getIsIndeterminate: 'Returns partial selection state; renders indeterminate checkbox.',
114
- getIsItemSelectable: 'Returns whether row shows checkbox; non-selectable rows render nothing.',
115
- getIsItemEnabled: 'Returns whether row checkbox is interactive; disabled rows show disabled checkbox.',
159
+ getIsIndeterminate:
160
+ 'Returns partial selection state; renders indeterminate checkbox.',
161
+ getIsItemSelectable:
162
+ 'Returns whether row shows checkbox; non-selectable rows render nothing.',
163
+ getIsItemEnabled:
164
+ 'Returns whether row checkbox is interactive; disabled rows show disabled checkbox.',
165
+ getRowLabel:
166
+ 'Derives row identity for the checkbox\'s hidden label: `Select ${getRowLabel(item)}`. Falls back to "Select row" when omitted.',
116
167
  },
117
168
  };
@@ -29,6 +29,29 @@ export const docs = {
29
29
  'Whether any row in the dataset is expandable. When false the plugin is a no-op: no expanders, no indent, no tree ARIA.',
30
30
  required: true,
31
31
  },
32
+ {
33
+ name: 'hasExpandAllControl',
34
+ type: 'boolean',
35
+ description:
36
+ 'Show an expand-all/collapse-all toggle in the tree column header. Requires isAllExpanded plus onExpandAll/onCollapseAll (all supplied by useTableTreeState).',
37
+ default: 'false',
38
+ },
39
+ {
40
+ name: 'isAllExpanded',
41
+ type: "boolean | 'indeterminate'",
42
+ description:
43
+ 'Aggregate expansion state across every expandable row, driving the header expand-all toggle. true when all are expanded, false when none are, indeterminate when some are.',
44
+ },
45
+ {
46
+ name: 'onExpandAll',
47
+ type: '() => void',
48
+ description: 'Expand every expandable row. Wired to the header control.',
49
+ },
50
+ {
51
+ name: 'onCollapseAll',
52
+ type: '() => void',
53
+ description: 'Collapse every row. Wired to the header control.',
54
+ },
32
55
  {
33
56
  name: 'indent',
34
57
  type: "'sm' | 'md' | 'lg'",
@@ -71,5 +94,11 @@ export const docsDense = {
71
94
  indent:
72
95
  "indent step per level: 'sm' | 'md' | 'lg' (spacing-3/4/6). Defaults to 'md'.",
73
96
  treeColumnKey: 'column carrying indent + expander. Defaults to first column.',
97
+ hasExpandAllControl:
98
+ 'show expand-all/collapse-all toggle in tree column header. Needs isAllExpanded + onExpandAll/onCollapseAll (from useTableTreeState). Defaults to false.',
99
+ isAllExpanded:
100
+ "aggregate state driving the header toggle: true (all) | false (none) | 'indeterminate' (some).",
101
+ onExpandAll: 'expand every expandable row (header control)',
102
+ onCollapseAll: 'collapse every row (header control)',
74
103
  },
75
104
  };
@@ -7,7 +7,7 @@ export const docs = {
7
7
  subComponentOf: 'Table',
8
8
  displayName: 'useTableTreeState',
9
9
  description:
10
- 'State management companion for useTableTreeData. Owns the expanded set (controlled or uncontrolled) and flattens nested data into the visible row array; collapsed subtrees are unmounted, not hidden, so the table body contains exactly the visible rows. Returns expandAll/collapseAll helpers and a ready-to-use config for the tree plugin. Note: because collapsed rows unmount, cell-local React state inside collapsed subtrees is lost on collapse; lift state that must survive.',
10
+ 'State management companion for useTableTreeData. Owns the expanded set (controlled or uncontrolled) and flattens nested data into the visible row array; collapsed subtrees are unmounted, not hidden, so the table body contains exactly the visible rows. Returns expandAll/collapseAll helpers, the aggregate isAllExpanded state (true/false/indeterminate) for a header expand-all control, and a ready-to-use config for the tree plugin. Note: because collapsed rows unmount, cell-local React state inside collapsed subtrees is lost on collapse; lift state that must survive.',
11
11
  props: [
12
12
  {
13
13
  name: 'data',
@@ -79,7 +79,7 @@ export const docsDense = {
79
79
  name: 'useTableTreeState',
80
80
  displayName: 'useTableTreeState',
81
81
  description:
82
- 'State companion for useTableTreeData. Owns expanded set (controlled or uncontrolled), flattens nested data to visible rows (collapsed subtrees unmounted, not hidden). Returns {visibleData, treeConfig, expandedIds, expandAll, collapseAll}. Cell-local state in collapsed subtrees is lost on collapse; lift state that must survive.',
82
+ 'State companion for useTableTreeData. Owns expanded set (controlled or uncontrolled), flattens nested data to visible rows (collapsed subtrees unmounted, not hidden). Returns {visibleData, treeConfig, expandedIds, isAllExpanded, expandAll, collapseAll} (isAllExpanded = true/false/indeterminate for a header expand-all control). Cell-local state in collapsed subtrees is lost on collapse; lift state that must survive.',
83
83
  propDescriptions: {
84
84
  data: 'nested data; rows carry child rows under childrenKey. Flat data => plugin is a no-op.',
85
85
  idKey: 'row ID accessor: property name or fn returning unique id',
@@ -106,6 +106,13 @@ export const docs = {
106
106
  description:
107
107
  'Status indicator that applies a colored border and icon. An optional message is displayed in a floating box below the textarea.',
108
108
  },
109
+ {
110
+ name: 'statusVariant',
111
+ type: "'attached' | 'detached'",
112
+ description:
113
+ 'How the status message is placed relative to the input. attached overlaps directly below the input (bordered treatment); detached floats below as a separate element with spacing.',
114
+ default: "'attached'",
115
+ },
109
116
  {
110
117
  name: 'labelTooltip',
111
118
  type: 'string',
@@ -279,6 +286,13 @@ export const docsZh = {
279
286
  type: "{ type: 'warning' | 'error' | 'success'; message?: string }",
280
287
  description: '应用彩色边框和图标的状态指示器。可选消息显示在文本域下方的浮动框中。',
281
288
  },
289
+ {
290
+ name: 'statusVariant',
291
+ type: "'attached' | 'detached'",
292
+ description:
293
+ '状态消息相对于输入框的放置方式。attached 直接叠加在输入框下方(带边框处理);detached 作为独立元素浮于下方并留有间距。',
294
+ default: "'attached'",
295
+ },
282
296
  {
283
297
  name: 'labelTooltip',
284
298
  type: 'string',
@@ -389,6 +403,7 @@ export const docsDense = {
389
403
  rows: 'Visible text rows.',
390
404
  maxLength: 'Max chars allowed. Shows counter (current/max) below textarea. No native enforcement.',
391
405
  status: 'Colored border+icon status. Optional floating message below textarea.',
406
+ statusVariant: 'How status message is placed: attached overlaps below input; detached floats below w/ spacing.',
392
407
  labelTooltip: 'Tooltip in info icon at label end.',
393
408
  startIcon: 'Icon inside leading edge of textarea wrapper.',
394
409
  hasSpellCheck: 'Enables/disables browser spell checking.',
@@ -10,11 +10,19 @@
10
10
  */
11
11
 
12
12
  import {useState} from 'react';
13
- import {describe, it, expect, vi, beforeEach} from 'vitest';
13
+ import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
14
14
  import {render, screen, fireEvent, waitFor} from '@testing-library/react';
15
15
  import userEvent from '@testing-library/user-event';
16
16
  import {TestIcon} from '../__tests__/TestIcon';
17
17
  import {TextArea} from './TextArea';
18
+ import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
19
+
20
+ // FieldStatus announces status messages through the persistent useAnnounce
21
+ // singletons; remove them between tests so role/aria-live queries in this
22
+ // file never match a leftover region.
23
+ afterEach(() => {
24
+ __resetLiveRegionsForTest();
25
+ });
18
26
 
19
27
  // Mock showPopover/hidePopover since jsdom does not implement them. Used by the
20
28
  // disabledMessage tooltip.
@@ -728,3 +736,26 @@ describe('TextArea', () => {
728
736
  });
729
737
  });
730
738
  });
739
+
740
+
741
+ describe('TextArea statusVariant forwarding', () => {
742
+ it('defaults to attached (status renders with data-variant="attached")', () => {
743
+ const {container} = render(
744
+ <TextArea label="Bio" value="" onChange={() => {}} status={{type: 'error', message: 'Required'}} />,
745
+ );
746
+ expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
747
+ 'data-variant',
748
+ 'attached',
749
+ );
750
+ });
751
+
752
+ it('forwards statusVariant="detached" to the underlying Field status', () => {
753
+ const {container} = render(
754
+ <TextArea label="Bio" value="" onChange={() => {}} status={{type: 'error', message: 'Required'}} statusVariant="detached" />,
755
+ );
756
+ expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
757
+ 'data-variant',
758
+ 'detached',
759
+ );
760
+ });
761
+ });
@@ -40,6 +40,7 @@ import {
40
40
  inputStatusBorderStyles,
41
41
  inputStatusHoverShadowStyles,
42
42
  inputStatusFocusWithinStyles,
43
+ type FieldStatusVariant,
43
44
  } from '../Field';
44
45
  import {Icon, renderIconSlot, type IconType} from '../Icon';
45
46
  import {Spinner} from '../Spinner';
@@ -217,6 +218,13 @@ export interface TextAreaProps extends Omit<
217
218
  * If message is provided, displays a floating message box below the textarea.
218
219
  */
219
220
  status?: TextAreaStatus;
221
+ /**
222
+ * How the status message is placed relative to the input.
223
+ * - 'attached': message overlaps directly below the input (bordered treatment)
224
+ * - 'detached': message floats below as a separate element with spacing
225
+ * @default 'attached'
226
+ */
227
+ statusVariant?: FieldStatusVariant;
220
228
  /**
221
229
  * Width of the field. Numbers are treated as pixels, strings are used as-is
222
230
  * (e.g. `'100%'`). Sizes the whole field (label, control, and status) so they
@@ -298,6 +306,7 @@ export function TextArea({
298
306
  isDisabled = false,
299
307
  disabledMessage,
300
308
  status,
309
+ statusVariant = 'attached',
301
310
  labelTooltip,
302
311
  startIcon,
303
312
  hasSpellCheck = true,
@@ -412,6 +421,7 @@ export function TextArea({
412
421
  }
413
422
  : undefined
414
423
  }
424
+ statusVariant={statusVariant}
415
425
  labelTooltip={labelTooltip}
416
426
  width={width}>
417
427
  <div
@@ -114,6 +114,13 @@ export const docs = {
114
114
  description:
115
115
  'Validation status: applies a colored border and status icon. If message is provided, displays a floating message below the input. Error type also sets aria-invalid.',
116
116
  },
117
+ {
118
+ name: 'statusVariant',
119
+ type: "'attached' | 'detached'",
120
+ description:
121
+ 'How the status message is placed relative to the input. attached overlaps directly below the input (bordered treatment); detached floats below as a separate element with spacing.',
122
+ default: "'attached'",
123
+ },
117
124
  {
118
125
  name: 'hasClear',
119
126
  type: 'boolean',
@@ -274,6 +281,13 @@ export const docsZh = {
274
281
  description:
275
282
  '验证状态:应用彩色边框和状态图标。如果提供了 message,在输入框下方显示浮动消息。错误类型还会设置 aria-invalid。',
276
283
  },
284
+ {
285
+ name: 'statusVariant',
286
+ type: "'attached' | 'detached'",
287
+ description:
288
+ '状态消息相对于输入框的放置方式。attached 直接叠加在输入框下方(带边框处理);detached 作为独立元素浮于下方并留有间距。',
289
+ default: "'attached'",
290
+ },
277
291
  {
278
292
  name: 'hasClear',
279
293
  type: 'boolean',
@@ -368,6 +382,7 @@ export const docsDense = {
368
382
  labelTooltip: 'Tooltip in info icon at label end.',
369
383
  startIcon: 'SVG icon at input start (e.g. heroicons or lucide).',
370
384
  status: 'Validation status; colored border+icon. Message floats below. Error sets aria-invalid.',
385
+ statusVariant: 'How status message is placed: attached overlaps below input; detached floats below w/ spacing.',
371
386
  hasClear: 'Shows clear button when input has value. Clears value on click.',
372
387
  hasAutoFocus: 'Auto-focus input on mount.',
373
388
  htmlName: 'HTML name attr for form submissions.',