@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
package/src/i18n/index.ts CHANGED
@@ -10,10 +10,14 @@
10
10
  * The public API is deliberately small:
11
11
  * - InternationalizationProvider — provider component
12
12
  * - useTranslator — hook returning a translator function
13
+ * - useDirection — hook returning the ambient text direction
14
+ * - getLocaleDirection — server-safe locale → direction helper
13
15
  * - Translator — interface for consumer-injected runtimes
14
16
  *
15
17
  * SYNC: When modified, update these files to stay in sync:
16
18
  * - /packages/core/src/index.ts
19
+ * - /packages/core/src/i18n/useDirection.ts
20
+ * - /packages/core/src/i18n/getLocaleDirection.ts
17
21
  */
18
22
 
19
23
  export {InternationalizationProvider} from './InternationalizationProvider';
@@ -22,6 +26,8 @@ export {InternationalizationContext} from './InternationalizationContext';
22
26
  export type {InternationalizationContextValue} from './InternationalizationContext';
23
27
  export {useTranslator} from './useTranslator';
24
28
  export type {TranslatorFn} from './useTranslator';
29
+ export {useDirection} from './useDirection';
30
+ export {getLocaleDirection} from './getLocaleDirection';
25
31
  export type {Translator} from './translator';
26
32
  export type {
27
33
  Locale,
@@ -22,6 +22,7 @@
22
22
  import IntlMessageFormat from 'intl-messageformat';
23
23
  import type {Catalog, Locale, MessagesByLocale, Overrides} from './types';
24
24
  import enSource from '../../locales/en.json' with {type: 'json'};
25
+ import {warnOnce, __resetDevWarnings} from '../utils/devWarning';
25
26
 
26
27
  const EN_CATALOG = enSource as Catalog;
27
28
 
@@ -72,23 +73,6 @@ export function resolveLocaleChain(locale: Locale): Locale[] {
72
73
  return chain;
73
74
  }
74
75
 
75
- /**
76
- * Missing-key warn-once tracking. Fires ONLY when a key is missing from
77
- * every source including the shipped `en` catalog — that's a real bug
78
- * (typo, stale catalog, deleted key). Fallback to `en` from a non-en
79
- * locale is expected and silent, matching the FormatJS / i18next default
80
- * of not spamming the console when a translation simply hasn't been
81
- * written yet.
82
- */
83
- const warnedMissing = new Set<string>();
84
-
85
- function warnOnce(bucket: Set<string>, key: string, message: string): void {
86
- if (!bucket.has(key)) {
87
- bucket.add(key);
88
- console.warn(message);
89
- }
90
- }
91
-
92
76
  function lookup(
93
77
  key: string,
94
78
  locale: Locale,
@@ -135,10 +119,14 @@ export function resolve(
135
119
  const result = lookup(key, locale, messages, overrides);
136
120
 
137
121
  if (result === null) {
122
+ // Fires ONLY when a key is missing from every source including the
123
+ // shipped `en` catalog — a real bug (typo, stale catalog, deleted key).
124
+ // Fallback to `en` from a non-en locale is expected and stays silent,
125
+ // matching the FormatJS / i18next default.
138
126
  warnOnce(
139
- warnedMissing,
140
- `${locale}::${key}`,
141
- `[astryx-i18n] missing key: ${key} (locale: ${locale})`,
127
+ `astryx-i18n:${locale}::${key}`,
128
+ 'astryx-i18n',
129
+ `missing key: ${key} (locale: ${locale})`,
142
130
  );
143
131
  return key;
144
132
  }
@@ -161,5 +149,5 @@ export function resolve(
161
149
  */
162
150
  export function __resetForTests(): void {
163
151
  formatterCache.clear();
164
- warnedMissing.clear();
152
+ __resetDevWarnings();
165
153
  }
@@ -0,0 +1,29 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file useDirection.ts
7
+ * @input InternationalizationContext (via use())
8
+ * @output 'ltr' | 'rtl'
9
+ * @position Client hook for reading the ambient text direction. Returns 'ltr'
10
+ * when called outside a provider (matches the silent-en-fallback pattern of
11
+ * useTranslator).
12
+ *
13
+ * Use this in components that need to swap directional icons, mirror
14
+ * behavioral logic (slider math, keyboard nav), or apply direction-specific
15
+ * styling that CSS logical properties can't express.
16
+ *
17
+ * SYNC: When modified, update these files to stay in sync:
18
+ * - /packages/core/src/i18n/InternationalizationContext.ts
19
+ * - /packages/core/src/i18n/getLocaleDirection.ts (server-safe counterpart)
20
+ * - /packages/core/src/i18n/index.ts
21
+ */
22
+
23
+ import {use} from 'react';
24
+ import {InternationalizationContext} from './InternationalizationContext';
25
+
26
+ export function useDirection(): 'ltr' | 'rtl' {
27
+ const ctx = use(InternationalizationContext);
28
+ return ctx.direction;
29
+ }
package/src/reset.css CHANGED
@@ -360,32 +360,6 @@
360
360
  -webkit-tap-highlight-color: transparent;
361
361
  }
362
362
 
363
- /* ===========================================================================
364
- Touch Devices
365
- =========================================================================== */
366
-
367
- /*
368
- * Suppress focus-visible outlines on touch-only devices.
369
- *
370
- * Focus rings exist to show keyboard users where focus is. On devices
371
- * with no hover capability and a coarse pointer (phones, tablets),
372
- * there's no keyboard navigation — focus rings are visual noise that
373
- * can flash on tap, on dialog open (showModal auto-focus), or on
374
- * programmatic focus.
375
- *
376
- * This targets touch-only devices specifically:
377
- * - (hover: none) — no hover capability (not a mouse)
378
- * - (pointer: coarse) — imprecise pointer (finger, not stylus)
379
- *
380
- * Hybrid devices (laptop with touchscreen) are NOT affected because
381
- * their primary pointer is fine (trackpad/mouse) and hover is available.
382
- */
383
- @media (hover: none) and (pointer: coarse) {
384
- :where(:focus-visible) {
385
- outline: none;
386
- }
387
- }
388
-
389
363
  /* ===========================================================================
390
364
  Color Scheme
391
365
  =========================================================================== */
@@ -0,0 +1,60 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * Tests for reset.css invariants that components rely on.
5
+ *
6
+ * reset.css is a plain stylesheet, so these tests assert on its source
7
+ * text (same approach as the reset.css baseline checks in
8
+ * theme/onMediaTokens.test.ts and AspectRatio/AspectRatio.test.tsx).
9
+ */
10
+
11
+ import fs from 'fs';
12
+ import path from 'path';
13
+
14
+ import {beforeAll, describe, expect, it} from 'vitest';
15
+
16
+ describe('reset.css accessibility invariants', () => {
17
+ let ruleBlocks: {selector: string; body: string}[];
18
+
19
+ beforeAll(() => {
20
+ const resetCSS = fs.readFileSync(
21
+ path.resolve(__dirname, './reset.css'),
22
+ 'utf-8',
23
+ );
24
+ // Strip comments, then collect every innermost `selector { body }`
25
+ // block. `[^{}]` keeps at-rule preludes (@media, @layer) out of the
26
+ // selector capture, since their own `{` terminates any earlier match.
27
+ const stripped = resetCSS.replace(/\/\*[\s\S]*?\*\//g, '');
28
+ ruleBlocks = [...stripped.matchAll(/([^{}]+)\{([^{}]*)\}/g)].map(
29
+ ([, selector, body]) => ({selector: selector.trim(), body}),
30
+ );
31
+ });
32
+
33
+ it('parses rule blocks out of reset.css', () => {
34
+ // Guards the WCAG assertion below against silently passing if the
35
+ // block parsing ever breaks.
36
+ expect(ruleBlocks.length).toBeGreaterThan(20);
37
+ expect(
38
+ ruleBlocks.some(({body}) => body.includes('box-sizing: border-box')),
39
+ ).toBe(true);
40
+ });
41
+
42
+ /**
43
+ * WCAG 2.4.7 (Focus Visible, Level AA): keyboard focus indicators must
44
+ * not be suppressed. `:focus-visible` only matches keyboard-style focus,
45
+ * so any `outline: none` on it removes the focus indicator for keyboard
46
+ * users — and a `@media (hover: none) and (pointer: coarse)` guard does
47
+ * not exempt keyboard users on coarse-pointer devices (iPad/phone with a
48
+ * Bluetooth keyboard, switch-control users).
49
+ */
50
+ it('does not suppress :focus-visible outlines (WCAG 2.4.7)', () => {
51
+ const focusVisibleBlocks = ruleBlocks.filter(({selector}) =>
52
+ selector.includes(':focus-visible'),
53
+ );
54
+ for (const {selector, body} of focusVisibleBlocks) {
55
+ expect
56
+ .soft(body, `":focus-visible" rule "${selector}" must keep the outline`)
57
+ .not.toMatch(/outline(?:-style|-width)?\s*:\s*(?:none|0)/);
58
+ }
59
+ });
60
+ });
@@ -45,6 +45,7 @@ import {registerIcons} from '../Icon/globalIconRegistry';
45
45
  import {generateThemeCSS, type DefinedTheme} from './defineTheme';
46
46
  import {dataAttr} from '../naming';
47
47
  import {ThemeContext} from './useTheme';
48
+ import {warnOnce} from '../utils/devWarning';
48
49
 
49
50
  /**
50
51
  * Theme provider props
@@ -97,9 +98,6 @@ ThemeNestingContext.displayName = 'ThemeNestingContext';
97
98
  /** Track which themes have already been injected */
98
99
  const injectedThemes = new Set<string>();
99
100
 
100
- /** Track which themes have already logged the perf warning */
101
- const warnedThemes = new Set<string>();
102
-
103
101
  /**
104
102
  * Hook to inject theme CSS into the document.
105
103
  * Built themes (from `astryx theme build`) skip injection — their CSS
@@ -120,17 +118,16 @@ function useThemeStyleInjection(theme: DefinedTheme): void {
120
118
  }
121
119
 
122
120
  // One-time perf hint per theme
123
- if (!warnedThemes.has(theme.name)) {
124
- warnedThemes.add(theme.name);
125
- console.warn(
126
- `[Astryx] Theme "${theme.name}" is using runtime style injection. ` +
127
- `For better performance, use the pre-built theme:\n\n` +
128
- ` import {${theme.name}Theme} from '@astryxdesign/theme-${theme.name}/built';\n` +
129
- ` import '@astryxdesign/theme-${theme.name}/theme.css';\n\n` +
130
- `For custom themes, run \`npx @astryxdesign/cli theme build <file>\` to generate ` +
131
- `the built artifacts.`,
132
- );
133
- }
121
+ warnOnce(
122
+ `theme-injection:${theme.name}`,
123
+ 'Theme',
124
+ `"${theme.name}" is using runtime style injection. ` +
125
+ `For better performance, use the pre-built theme:\n\n` +
126
+ ` import {${theme.name}Theme} from '@astryxdesign/theme-${theme.name}/built';\n` +
127
+ ` import '@astryxdesign/theme-${theme.name}/theme.css';\n\n` +
128
+ `For custom themes, run \`npx @astryxdesign/cli theme build <file>\` to generate ` +
129
+ `the built artifacts.`,
130
+ );
134
131
 
135
132
  const {prose, component} = generateThemeCSS(theme);
136
133
  if (!prose && !component) {
@@ -186,6 +186,7 @@ function discoverComponents(): ComponentInfo[] {
186
186
  // ---------------------------------------------------------------------------
187
187
 
188
188
  const DIR_TO_REGISTRY_KEY: Record<string, string> = {
189
+ Avatar: 'avatar',
189
190
  Banner: 'banner',
190
191
  Button: 'button',
191
192
  Card: 'card',
@@ -35,6 +35,12 @@ export interface DerivedVarEntry {
35
35
  * entries share the same property.
36
36
  */
37
37
  export const derivedVarRegistry: Record<string, DerivedVarEntry[]> = {
38
+ avatar: [
39
+ {property: 'fontSize', vars: ['--_avatar-fallback-font-size']},
40
+ {property: 'fontWeight', vars: ['--_avatar-fallback-font-weight']},
41
+ {property: 'color', vars: ['--_avatar-fallback-color']},
42
+ {property: 'backgroundColor', vars: ['--_avatar-fallback-background']},
43
+ ],
38
44
  banner: [{property: 'borderRadius', vars: ['--_banner-radius']}],
39
45
  button: [{property: 'borderRadius', vars: ['--_button-radius']}],
40
46
  card: [
@@ -190,6 +190,61 @@ describe('generateThemeRules', () => {
190
190
  expect(rules.some(r => r.includes('.astryx-text.accent'))).toBe(true);
191
191
  });
192
192
 
193
+ // --- Size-prop overrides (so `size` beats a themed `type`) ---
194
+
195
+ it('emits Text size-prop font-size overrides in the same layer as type rules', () => {
196
+ // Digit-leading sizes are prefixed (size-2xs); word sizes stay bare.
197
+ const sizeRule = rules.find(
198
+ r => r.includes('.astryx-text.size-2xs') && r.includes('font-size'),
199
+ );
200
+ expect(sizeRule).toBeDefined();
201
+ expect(sizeRule).toContain('var(--font-size-2xs)');
202
+
203
+ // `xsm` maps to the --font-size-xs token (matches sizeStyles).
204
+ const xsmRule = rules.find(r => r.includes('.astryx-text.xsm'));
205
+ expect(xsmRule).toBeDefined();
206
+ expect(xsmRule).toContain('var(--font-size-xs)');
207
+
208
+ // Overrides set only font-size — line-height/family come from `type`.
209
+ expect(xsmRule).not.toContain('line-height');
210
+ });
211
+
212
+ it('emits a size override for every TextSize value', () => {
213
+ const sizes = [
214
+ 'size-4xs',
215
+ 'size-3xs',
216
+ 'size-2xs',
217
+ 'xsm',
218
+ 'sm',
219
+ 'base',
220
+ 'lg',
221
+ 'xl',
222
+ 'size-2xl',
223
+ 'size-3xl',
224
+ 'size-4xl',
225
+ ];
226
+ for (const cls of sizes) {
227
+ expect(
228
+ rules.some(
229
+ r => r.includes(`.astryx-text.${cls}`) && r.includes('font-size'),
230
+ ),
231
+ ).toBe(true);
232
+ }
233
+ });
234
+
235
+ it('orders size overrides after the themed type font-size rules', () => {
236
+ // Source order breaks specificity ties within a layer, so the size
237
+ // override must come after the `.astryx-text.<type>` type rule.
238
+ const typeIdx = rules.findIndex(
239
+ r => r.includes('.astryx-text.supporting') && r.includes('font-size'),
240
+ );
241
+ const sizeIdx = rules.findIndex(
242
+ r => r.includes('.astryx-text.size-2xs') && r.includes('font-size'),
243
+ );
244
+ expect(typeIdx).toBeGreaterThanOrEqual(0);
245
+ expect(sizeIdx).toBeGreaterThan(typeIdx);
246
+ });
247
+
193
248
  // --- Consistency ---
194
249
 
195
250
  it('generateThemeCSS returns prose and component blocks with @scope', () => {
@@ -202,6 +257,16 @@ describe('generateThemeRules', () => {
202
257
  expect(combined).toContain(rule);
203
258
  }
204
259
  });
260
+
261
+ it('routes Text size overrides into the component (astryx-theme) block', () => {
262
+ // The size override only beats a themed type if it lands in the same
263
+ // layer as the type rules (astryx-theme / component block), not the
264
+ // reset-tier prose block.
265
+ const {prose, component} = generateThemeCSS(theme);
266
+ expect(component).toContain('.astryx-text.size-2xs');
267
+ expect(component).toContain('.astryx-text.xsm');
268
+ expect(prose).not.toContain('.astryx-text.size-2xs');
269
+ });
205
270
  });
206
271
 
207
272
  describe('generateThemeRules with weight overrides', () => {
@@ -320,6 +385,48 @@ describe('derived var expansion', () => {
320
385
  expect(rule).toContain('--_button-radius: 8px');
321
386
  });
322
387
 
388
+ it('emits internal vars for avatar fallback typography (base)', () => {
389
+ const theme = defineTheme({
390
+ name: 'test-derived-avatar',
391
+ components: {
392
+ avatar: {
393
+ base: {
394
+ fontWeight: 'var(--font-weight-normal)',
395
+ color: 'var(--color-text-secondary)',
396
+ backgroundColor: 'var(--color-accent-muted)',
397
+ },
398
+ },
399
+ },
400
+ });
401
+ const rules = generateThemeRules(theme);
402
+ const rule = rules.find(r => r.includes('.astryx-avatar'));
403
+ expect(rule).toBeDefined();
404
+ expect(rule).toContain(
405
+ '--_avatar-fallback-font-weight: var(--font-weight-normal)',
406
+ );
407
+ expect(rule).toContain(
408
+ '--_avatar-fallback-color: var(--color-text-secondary)',
409
+ );
410
+ expect(rule).toContain(
411
+ '--_avatar-fallback-background: var(--color-accent-muted)',
412
+ );
413
+ });
414
+
415
+ it('emits a per-size fallback font-size for avatar (size:sm)', () => {
416
+ const theme = defineTheme({
417
+ name: 'test-derived-avatar-size',
418
+ components: {
419
+ avatar: {
420
+ 'size:sm': {fontSize: '9px'},
421
+ },
422
+ },
423
+ });
424
+ const rules = generateThemeRules(theme);
425
+ const rule = rules.find(r => r.includes('.astryx-avatar.sm'));
426
+ expect(rule).toBeDefined();
427
+ expect(rule).toContain('--_avatar-fallback-font-size: 9px');
428
+ });
429
+
323
430
  it('does not emit derived vars for components without registry entries', () => {
324
431
  const theme = defineTheme({
325
432
  name: 'test-no-derived',
@@ -301,6 +301,10 @@ export function generateThemeRules(theme: DefinedTheme): string[] {
301
301
  // 4. Prop-level color overrides (for text/heading/link specificity)
302
302
  generateColorOverrides(theme.components || {}, parts);
303
303
 
304
+ // 5. Text `size`-prop font-size overrides (so an explicit size beats a
305
+ // themed type's font-size across the astryx-base → astryx-theme layers)
306
+ generateSizeOverrides(theme.components || {}, parts);
307
+
304
308
  // (on-media rules are generated separately — see generateOnMediaCSS)
305
309
 
306
310
  return parts;
@@ -500,6 +504,58 @@ function generateColorOverrides(
500
504
  }
501
505
  }
502
506
 
507
+ /**
508
+ * Map a Text `size` prop value to its raw font-size token.
509
+ * Mirrors `sizeStyles` in `Text/text.stylex.ts` (note `xsm` → `--font-size-xs`).
510
+ * <!-- SYNC: packages/core/src/Text/text.stylex.ts (sizeStyles) -->
511
+ */
512
+ const TEXT_SIZE_TOKEN_MAP: Record<string, string> = {
513
+ '4xs': 'var(--font-size-4xs)',
514
+ '3xs': 'var(--font-size-3xs)',
515
+ '2xs': 'var(--font-size-2xs)',
516
+ xsm: 'var(--font-size-xs)',
517
+ sm: 'var(--font-size-sm)',
518
+ base: 'var(--font-size-base)',
519
+ lg: 'var(--font-size-lg)',
520
+ xl: 'var(--font-size-xl)',
521
+ '2xl': 'var(--font-size-2xl)',
522
+ '3xl': 'var(--font-size-3xl)',
523
+ '4xl': 'var(--font-size-4xl)',
524
+ };
525
+
526
+ /**
527
+ * Generate `size`-prop font-size overrides for the Text component.
528
+ *
529
+ * The `size` prop is documented as a font-size override that wins over the
530
+ * size implied by `type`. Its StyleX class lives in `@layer astryx-base`, but a
531
+ * theme's per-type font-size rule (`.astryx-text.<type>`) lives in the higher
532
+ * `@layer astryx-theme`, so the layer cascade let the theme silently shadow
533
+ * `size` for any `type` the theme styled. Re-emitting the size classes here —
534
+ * same layer as the type rules, same `.astryx-text.<x>` specificity, later in
535
+ * source — restores `size` as a real override.
536
+ *
537
+ * Only `font-size` is overridden; line-height and other type properties are
538
+ * intentionally preserved, matching the prop's documented contract.
539
+ *
540
+ * Gated on the theme touching `text` (which includes the auto-generated
541
+ * type-scale rules) — with no theme type rule to beat, the base-layer StyleX
542
+ * class already wins and no override is needed.
543
+ */
544
+ function generateSizeOverrides(
545
+ components: Record<string, unknown>,
546
+ parts: string[],
547
+ ): void {
548
+ if (!('text' in components)) {
549
+ return;
550
+ }
551
+ for (const [sizeName, sizeValue] of Object.entries(TEXT_SIZE_TOKEN_MAP)) {
552
+ const suffix = parseStyleKey(`size:${sizeName}`);
553
+ parts.push(
554
+ ` ${componentClassSelector('text', suffix)} { font-size: ${sizeValue}; }`,
555
+ );
556
+ }
557
+ }
558
+
503
559
  /**
504
560
  * Generate theme rules split into component and prose groups.
505
561
  *
package/src/theme/hct.ts CHANGED
@@ -110,7 +110,7 @@ function labToXyz(L: number, a: number, b: number): [number, number, number] {
110
110
  // Tone <-> Y (CIE Luminance)
111
111
  // =============================================================================
112
112
 
113
- export function toneToY(tone: number): number {
113
+ function toneToY(tone: number): number {
114
114
  return labFInv((tone + 16) / 116);
115
115
  }
116
116
 
@@ -12,6 +12,7 @@
12
12
  */
13
13
 
14
14
  import {syntaxTokenDefaults, type SyntaxTokenName} from './tokens';
15
+ import {devWarn} from '../../utils/devWarning';
15
16
 
16
17
  // =============================================================================
17
18
  // Types
@@ -139,12 +140,10 @@ export function defineSyntaxTheme(
139
140
  ): SyntaxThemeDefinition {
140
141
  const missing = ALL_SYNTAX_KEYS.filter(key => !(key in input.tokens));
141
142
  if (missing.length > 0) {
142
- console.warn(
143
- '[Astryx] defineSyntaxTheme("' +
144
- input.name +
145
- '"): missing tokens: ' +
146
- missing.join(', ') +
147
- '. All 14 syntax tokens are required.',
143
+ devWarn(
144
+ 'defineSyntaxTheme',
145
+ `"${input.name}": missing tokens: ${missing.join(', ')}. ` +
146
+ `All 14 syntax tokens are required.`,
148
147
  );
149
148
  }
150
149
 
@@ -0,0 +1,56 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {afterEach, describe, expect, it, vi} from 'vitest';
4
+ import {
5
+ devWarn,
6
+ devError,
7
+ warnOnce,
8
+ formatDevMessage,
9
+ __resetDevWarnings,
10
+ } from './devWarning';
11
+
12
+ afterEach(() => {
13
+ __resetDevWarnings();
14
+ vi.restoreAllMocks();
15
+ });
16
+
17
+ describe('formatDevMessage', () => {
18
+ it('formats as "Component: message"', () => {
19
+ expect(formatDevMessage('Field', 'oops')).toBe('Field: oops');
20
+ });
21
+ });
22
+
23
+ describe('devWarn', () => {
24
+ it('warns in the standardized format and forwards extra args', () => {
25
+ const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
26
+ const detail = {a: 1};
27
+ devWarn('Popover', 'no button', detail);
28
+ expect(warn).toHaveBeenCalledWith('Popover: no button', detail);
29
+ });
30
+ });
31
+
32
+ describe('devError', () => {
33
+ it('errors in the standardized format', () => {
34
+ const error = vi.spyOn(console, 'error').mockImplementation(() => {});
35
+ const err = new Error('boom');
36
+ devError('Table', 'plugin threw:', err);
37
+ expect(error).toHaveBeenCalledWith('Table: plugin threw:', err);
38
+ });
39
+ });
40
+
41
+ describe('warnOnce', () => {
42
+ it('fires at most once per key', () => {
43
+ const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
44
+ warnOnce('k', 'Theme', 'runtime injection');
45
+ warnOnce('k', 'Theme', 'runtime injection');
46
+ expect(warn).toHaveBeenCalledTimes(1);
47
+ expect(warn).toHaveBeenCalledWith('Theme: runtime injection');
48
+ });
49
+
50
+ it('fires again for a different key', () => {
51
+ const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
52
+ warnOnce('a', 'Theme', 'one');
53
+ warnOnce('b', 'Theme', 'two');
54
+ expect(warn).toHaveBeenCalledTimes(2);
55
+ });
56
+ });
@@ -0,0 +1,102 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file devWarning.ts
5
+ * @input A component/hook name and a message
6
+ * @output Standardized `Component: message` console warnings and errors
7
+ * @position Shared dev-logging utility used across components and hooks
8
+ *
9
+ * Standardizes how the design system surfaces information to the builder:
10
+ * every message reads `Component: message` (e.g. `Field: isOptional and
11
+ * isRequired are mutually exclusive.`), so the source is always obvious in
12
+ * the console.
13
+ *
14
+ * Prefer the `useDevWarning` hook inside components — it guards against
15
+ * repeating a warning on every render. These imperative helpers exist for
16
+ * the non-render contexts a hook can't cover: plain functions, module
17
+ * initialization, and inside effects.
18
+ *
19
+ * SYNC: When modified, update:
20
+ * - /packages/core/src/utils/index.ts
21
+ * - /packages/core/src/hooks/useDevWarning.ts (the render-path counterpart)
22
+ */
23
+
24
+ const isDev = process.env.NODE_ENV !== 'production';
25
+
26
+ /** Format a message as `Component: message`. */
27
+ export function formatDevMessage(component: string, message: string): string {
28
+ return `${component}: ${message}`;
29
+ }
30
+
31
+ /**
32
+ * Dev-only `console.warn` in the standardized `Component: message` format.
33
+ * A no-op in production — warnings are builder guardrails, not shipped noise.
34
+ * Extra args (e.g. an offending value) are forwarded to `console.warn`.
35
+ *
36
+ * @example
37
+ * ```
38
+ * devWarn('Popover', 'children must contain a <button>.');
39
+ * ```
40
+ */
41
+ export function devWarn(
42
+ component: string,
43
+ message: string,
44
+ ...args: unknown[]
45
+ ): void {
46
+ if (!isDev) {
47
+ return;
48
+ }
49
+ console.warn(formatDevMessage(component, message), ...args);
50
+ }
51
+
52
+ /**
53
+ * `console.error` in the standardized `Component: message` format. Unlike
54
+ * {@link devWarn}, this runs in production too: it reports real runtime
55
+ * failures (e.g. a thrown callback) that should reach error telemetry.
56
+ *
57
+ * @example
58
+ * ```
59
+ * devError('Table', 'Plugin at index 0 threw in transform:', error);
60
+ * ```
61
+ */
62
+ export function devError(
63
+ component: string,
64
+ message: string,
65
+ ...args: unknown[]
66
+ ): void {
67
+ console.error(formatDevMessage(component, message), ...args);
68
+ }
69
+
70
+ const warnedKeys = new Set<string>();
71
+
72
+ /**
73
+ * Dev-only warning that fires at most once per `key` for the lifetime of the
74
+ * app. Use for singleton warnings that aren't tied to a component instance —
75
+ * a missing translation key, a per-theme perf hint, a one-time fallback.
76
+ * For per-component-instance warnings, use the `useDevWarning` hook instead.
77
+ *
78
+ * @example
79
+ * ```
80
+ * warnOnce(`theme:${name}`, 'Theme', `"${name}" uses runtime injection.`);
81
+ * ```
82
+ */
83
+ export function warnOnce(
84
+ key: string,
85
+ component: string,
86
+ message: string,
87
+ ...args: unknown[]
88
+ ): void {
89
+ if (!isDev || warnedKeys.has(key)) {
90
+ return;
91
+ }
92
+ warnedKeys.add(key);
93
+ console.warn(formatDevMessage(component, message), ...args);
94
+ }
95
+
96
+ /**
97
+ * Clear `warnOnce` dedup state. Test-only.
98
+ * @internal
99
+ */
100
+ export function __resetDevWarnings(): void {
101
+ warnedKeys.clear();
102
+ }