@astryxdesign/core 0.1.8 → 0.1.9

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 (487) 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 +18 -2
  7. package/dist/Avatar/Avatar.d.ts.map +1 -1
  8. package/dist/Avatar/Avatar.js +63 -7
  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/Banner/Banner.d.ts +9 -1
  13. package/dist/Banner/Banner.d.ts.map +1 -1
  14. package/dist/Banner/Banner.js +31 -2
  15. package/dist/Breadcrumbs/BreadcrumbItem.d.ts +31 -2
  16. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  17. package/dist/Breadcrumbs/BreadcrumbItem.js +208 -6
  18. package/dist/Breadcrumbs/index.d.ts +5 -0
  19. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  20. package/dist/Breadcrumbs/index.js +9 -1
  21. package/dist/Button/Button.d.ts +8 -2
  22. package/dist/Button/Button.d.ts.map +1 -1
  23. package/dist/Button/Button.js +31 -2
  24. package/dist/ButtonGroup/ButtonGroup.d.ts +9 -1
  25. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  26. package/dist/ButtonGroup/ButtonGroup.js +30 -1
  27. package/dist/Calendar/Calendar.d.ts.map +1 -1
  28. package/dist/Calendar/Calendar.js +30 -2
  29. package/dist/Calendar/dayCellUtils.js +1 -1
  30. package/dist/Card/Card.d.ts +8 -2
  31. package/dist/Card/Card.d.ts.map +1 -1
  32. package/dist/Card/Card.js +28 -2
  33. package/dist/Carousel/Carousel.d.ts +4 -1
  34. package/dist/Carousel/Carousel.d.ts.map +1 -1
  35. package/dist/Carousel/Carousel.js +24 -4
  36. package/dist/Chat/ChatComposer.d.ts +8 -0
  37. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  38. package/dist/Chat/ChatComposer.js +46 -7
  39. package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
  40. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  41. package/dist/Chat/ChatComposerDrawer.js +11 -1
  42. package/dist/Chat/ChatComposerInput.d.ts +20 -3
  43. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  44. package/dist/Chat/ChatComposerInput.js +35 -3
  45. package/dist/Chat/ChatContext.d.ts +33 -0
  46. package/dist/Chat/ChatContext.d.ts.map +1 -1
  47. package/dist/Chat/ChatContext.js +16 -2
  48. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  49. package/dist/Chat/ChatDictationButton.js +1 -1
  50. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  51. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  52. package/dist/Chat/ChatLayoutScrollButton.js +4 -4
  53. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  54. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  55. package/dist/Chat/ChatSendButton.js +7 -1
  56. package/dist/Chat/ChatToolCalls.d.ts +5 -1
  57. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  58. package/dist/Chat/ChatToolCalls.js +18 -9
  59. package/dist/Chat/index.d.ts +2 -1
  60. package/dist/Chat/index.d.ts.map +1 -1
  61. package/dist/Chat/index.js +1 -1
  62. package/dist/Chat/useChatStreamScroll.d.ts +2 -1
  63. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  64. package/dist/Chat/useChatStreamScroll.js +22 -8
  65. package/dist/Chat/useSpeechRecognition.d.ts +0 -1
  66. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  67. package/dist/Chat/useSpeechRecognition.js +1 -1
  68. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  69. package/dist/CheckboxInput/CheckboxInput.js +1 -1
  70. package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
  71. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  72. package/dist/CheckboxList/CheckboxListItem.js +11 -1
  73. package/dist/ClickableCard/ClickableCard.d.ts +9 -2
  74. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  75. package/dist/ClickableCard/ClickableCard.js +5 -2
  76. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  77. package/dist/CodeBlock/CodeBlock.js +8 -1
  78. package/dist/CommandPalette/CommandPalette.d.ts +1 -1
  79. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  80. package/dist/CommandPalette/CommandPalette.js +3 -1
  81. package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
  82. package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
  83. package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
  84. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  85. package/dist/CommandPalette/CommandPaletteInput.js +6 -1
  86. package/dist/DateInput/DateInput.d.ts +47 -1
  87. package/dist/DateInput/DateInput.d.ts.map +1 -1
  88. package/dist/DateInput/DateInput.js +26 -2
  89. package/dist/DateInput/index.d.ts +1 -1
  90. package/dist/DateInput/index.d.ts.map +1 -1
  91. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  92. package/dist/DateTimeInput/DateTimeInput.js +10 -1
  93. package/dist/Dialog/Dialog.d.ts +3 -0
  94. package/dist/Dialog/Dialog.d.ts.map +1 -1
  95. package/dist/Dialog/Dialog.js +57 -6
  96. package/dist/Dialog/DialogContext.d.ts +7 -0
  97. package/dist/Dialog/DialogContext.d.ts.map +1 -1
  98. package/dist/Dialog/DialogContext.js +2 -2
  99. package/dist/Dialog/DialogHeader.d.ts +5 -2
  100. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  101. package/dist/Dialog/DialogHeader.js +6 -1
  102. package/dist/Divider/Divider.js +1 -1
  103. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
  104. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  105. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +1 -2
  106. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
  107. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
  108. package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
  109. package/dist/Field/Field.d.ts.map +1 -1
  110. package/dist/Field/Field.js +2 -3
  111. package/dist/Field/FieldLabel.d.ts +1 -1
  112. package/dist/Field/FieldLabel.d.ts.map +1 -1
  113. package/dist/Field/FieldLabel.js +42 -15
  114. package/dist/FieldStatus/FieldStatus.d.ts +8 -0
  115. package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
  116. package/dist/FieldStatus/FieldStatus.js +22 -4
  117. package/dist/FileInput/FileInput.d.ts.map +1 -1
  118. package/dist/FileInput/FileInput.js +10 -2
  119. package/dist/HoverCard/HoverCard.d.ts +9 -1
  120. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  121. package/dist/HoverCard/HoverCard.js +2 -0
  122. package/dist/HoverCard/useHoverCard.d.ts +8 -0
  123. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  124. package/dist/HoverCard/useHoverCard.js +7 -2
  125. package/dist/Icon/Icon.d.ts +7 -2
  126. package/dist/Icon/Icon.d.ts.map +1 -1
  127. package/dist/Item/Item.d.ts +6 -1
  128. package/dist/Item/Item.d.ts.map +1 -1
  129. package/dist/Item/Item.js +22 -1
  130. package/dist/Layer/useLayer.d.ts +6 -0
  131. package/dist/Layer/useLayer.d.ts.map +1 -1
  132. package/dist/Layer/useLayer.js +2 -0
  133. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  134. package/dist/MobileNav/MobileNav.js +6 -1
  135. package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
  136. package/dist/MobileNav/MobileNavToggle.js +4 -0
  137. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  138. package/dist/MultiSelector/MultiSelector.js +39 -12
  139. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  140. package/dist/MultiSelector/hooks.js +16 -0
  141. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  142. package/dist/Outline/Outline.d.ts +0 -1
  143. package/dist/Outline/Outline.d.ts.map +1 -1
  144. package/dist/Outline/Outline.js +0 -1
  145. package/dist/OverflowList/OverflowList.d.ts +20 -3
  146. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  147. package/dist/OverflowList/OverflowList.js +29 -4
  148. package/dist/Popover/Popover.d.ts.map +1 -1
  149. package/dist/Popover/Popover.js +3 -2
  150. package/dist/Popover/usePopover.d.ts.map +1 -1
  151. package/dist/Popover/usePopover.js +3 -9
  152. package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
  153. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  154. package/dist/SelectableCard/SelectableCard.d.ts +9 -2
  155. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  156. package/dist/SelectableCard/SelectableCard.js +16 -13
  157. package/dist/Selector/Selector.d.ts.map +1 -1
  158. package/dist/Selector/Selector.js +4 -2
  159. package/dist/Selector/hooks.d.ts.map +1 -1
  160. package/dist/Selector/hooks.js +16 -0
  161. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  162. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  163. package/dist/SideNav/SideNavHeading.js +21 -8
  164. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  165. package/dist/Slider/Slider.d.ts.map +1 -1
  166. package/dist/Slider/Slider.js +19 -2
  167. package/dist/Stack/stack.stylex.d.ts +9 -9
  168. package/dist/Table/BaseTable.d.ts.map +1 -1
  169. package/dist/Table/BaseTable.js +3 -2
  170. package/dist/Table/index.d.ts +2 -0
  171. package/dist/Table/index.d.ts.map +1 -1
  172. package/dist/Table/index.js +1 -0
  173. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  174. package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
  175. package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
  176. package/dist/Table/plugins/rowStatus/index.js +3 -0
  177. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
  178. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
  179. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
  180. package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
  181. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  182. package/dist/Table/plugins/selection/useTableSelection.js +4 -1
  183. package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
  184. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  185. package/dist/Table/plugins/tree/useTableTreeData.js +87 -0
  186. package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
  187. package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
  188. package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
  189. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  190. package/dist/Table/useBaseTablePlugins.js +5 -3
  191. package/dist/Thumbnail/Thumbnail.d.ts +26 -5
  192. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  193. package/dist/Thumbnail/Thumbnail.js +97 -54
  194. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
  195. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
  196. package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
  197. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  198. package/dist/TimeInput/TimeInput.js +15 -4
  199. package/dist/Timestamp/Timestamp.d.ts +3 -1
  200. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  201. package/dist/Timestamp/Timestamp.js +8 -6
  202. package/dist/Toast/useToast.d.ts.map +1 -1
  203. package/dist/Toast/useToast.js +2 -5
  204. package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
  205. package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
  206. package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
  207. package/dist/Tokenizer/Tokenizer.d.ts +1 -1
  208. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  209. package/dist/Tokenizer/Tokenizer.js +16 -4
  210. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  211. package/dist/TopNav/TopNavHeading.js +18 -8
  212. package/dist/TopNav/TopNavMegaMenu.js +10 -4
  213. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
  214. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  215. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
  216. package/dist/TopNav/TopNavMenu.d.ts +2 -1
  217. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  218. package/dist/TopNav/TopNavMenu.js +68 -6
  219. package/dist/TreeList/TreeList.d.ts +12 -3
  220. package/dist/TreeList/TreeList.d.ts.map +1 -1
  221. package/dist/TreeList/TreeList.js +2 -0
  222. package/dist/TreeList/TreeListBranches.d.ts +5 -0
  223. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  224. package/dist/TreeList/TreeListBranches.js +10 -4
  225. package/dist/TreeList/TreeListItem.d.ts +8 -2
  226. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  227. package/dist/TreeList/TreeListItem.js +27 -7
  228. package/dist/TreeList/TreeListTypes.d.ts +25 -1
  229. package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
  230. package/dist/TreeList/index.d.ts +2 -2
  231. package/dist/TreeList/index.d.ts.map +1 -1
  232. package/dist/astryx.css +28 -18
  233. package/dist/astryx.umd.js +51 -51
  234. package/dist/astryx.umd.js.map +4 -4
  235. package/dist/authoring/doc.d.ts.map +1 -1
  236. package/dist/docs-types.d.ts +8 -0
  237. package/dist/docs-types.d.ts.map +1 -1
  238. package/dist/hooks/computeOverflow.d.ts +47 -0
  239. package/dist/hooks/computeOverflow.d.ts.map +1 -0
  240. package/dist/hooks/computeOverflow.js +213 -0
  241. package/dist/hooks/index.d.ts +1 -0
  242. package/dist/hooks/index.d.ts.map +1 -1
  243. package/dist/hooks/index.js +2 -1
  244. package/dist/hooks/useDevWarning.d.ts +18 -0
  245. package/dist/hooks/useDevWarning.d.ts.map +1 -0
  246. package/dist/hooks/useDevWarning.js +49 -0
  247. package/dist/hooks/useOverflow.d.ts +19 -0
  248. package/dist/hooks/useOverflow.d.ts.map +1 -1
  249. package/dist/hooks/useOverflow.js +36 -25
  250. package/dist/i18n/resolve.d.ts.map +1 -1
  251. package/dist/i18n/resolve.js +7 -18
  252. package/dist/theme/Theme.d.ts.map +1 -1
  253. package/dist/theme/Theme.js +2 -7
  254. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  255. package/dist/theme/generateThemeRules.js +51 -0
  256. package/dist/theme/hct.d.ts +0 -1
  257. package/dist/theme/hct.d.ts.map +1 -1
  258. package/dist/theme/hct.js +1 -1
  259. package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
  260. package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
  261. package/dist/utils/devWarning.d.ts +42 -0
  262. package/dist/utils/devWarning.d.ts.map +1 -0
  263. package/dist/utils/devWarning.js +88 -0
  264. package/dist/utils/index.d.ts +3 -1
  265. package/dist/utils/index.d.ts.map +1 -1
  266. package/dist/utils/index.js +3 -2
  267. package/dist/utils/plainDate.d.ts +30 -0
  268. package/dist/utils/plainDate.d.ts.map +1 -1
  269. package/dist/utils/plainDate.js +53 -0
  270. package/dist/utils/types.d.ts +13 -0
  271. package/dist/utils/types.d.ts.map +1 -1
  272. package/locales/en.json +24 -0
  273. package/locales/fr-FR.json +14 -0
  274. package/locales/pseudo.json +18 -0
  275. package/package.json +1 -1
  276. package/src/AppShell/AppShell.tsx +6 -0
  277. package/src/AppShell/AppShellMobileContext.tsx +8 -0
  278. package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
  279. package/src/Avatar/Avatar.doc.mjs +15 -3
  280. package/src/Avatar/Avatar.test.tsx +156 -1
  281. package/src/Avatar/Avatar.tsx +96 -4
  282. package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
  283. package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
  284. package/src/Avatar/AvatarStatusDot.tsx +178 -21
  285. package/src/Banner/Banner.doc.mjs +9 -0
  286. package/src/Banner/Banner.test.tsx +30 -0
  287. package/src/Banner/Banner.tsx +47 -3
  288. package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
  289. package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
  290. package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
  291. package/src/Breadcrumbs/Breadcrumbs.test.tsx +284 -2
  292. package/src/Breadcrumbs/index.ts +27 -0
  293. package/src/Button/Button.doc.mjs +9 -0
  294. package/src/Button/Button.test.tsx +49 -0
  295. package/src/Button/Button.tsx +25 -1
  296. package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
  297. package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
  298. package/src/ButtonGroup/ButtonGroup.tsx +32 -0
  299. package/src/Calendar/Calendar.doc.mjs +12 -1
  300. package/src/Calendar/Calendar.test.tsx +193 -0
  301. package/src/Calendar/Calendar.tsx +38 -16
  302. package/src/Calendar/dayCellUtils.test.ts +5 -0
  303. package/src/Calendar/dayCellUtils.ts +1 -1
  304. package/src/Card/Card.doc.mjs +9 -0
  305. package/src/Card/Card.test.tsx +21 -3
  306. package/src/Card/Card.tsx +35 -2
  307. package/src/Carousel/Carousel.doc.mjs +1 -0
  308. package/src/Carousel/Carousel.test.tsx +53 -0
  309. package/src/Carousel/Carousel.tsx +34 -4
  310. package/src/Chat/ChatComposer.doc.mjs +12 -3
  311. package/src/Chat/ChatComposer.test.tsx +115 -0
  312. package/src/Chat/ChatComposer.tsx +73 -9
  313. package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
  314. package/src/Chat/ChatComposerDrawer.tsx +11 -1
  315. package/src/Chat/ChatComposerInput.doc.mjs +7 -0
  316. package/src/Chat/ChatComposerInput.test.tsx +103 -0
  317. package/src/Chat/ChatComposerInput.tsx +49 -3
  318. package/src/Chat/ChatContext.tsx +37 -10
  319. package/src/Chat/ChatDictationButton.tsx +4 -1
  320. package/src/Chat/ChatLayout.tsx +3 -1
  321. package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
  322. package/src/Chat/ChatMessageMetadata.tsx +1 -2
  323. package/src/Chat/ChatSendButton.tsx +11 -1
  324. package/src/Chat/ChatToolCalls.test.tsx +64 -0
  325. package/src/Chat/ChatToolCalls.tsx +25 -4
  326. package/src/Chat/index.ts +5 -1
  327. package/src/Chat/useChatStreamScroll.test.tsx +49 -0
  328. package/src/Chat/useChatStreamScroll.ts +27 -10
  329. package/src/Chat/useSpeechRecognition.ts +1 -1
  330. package/src/Chat/useTriggerMenu.tsx +3 -1
  331. package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
  332. package/src/CheckboxInput/CheckboxInput.tsx +1 -1
  333. package/src/CheckboxList/CheckboxList.test.tsx +81 -3
  334. package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
  335. package/src/CheckboxList/CheckboxListItem.tsx +41 -5
  336. package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
  337. package/src/ClickableCard/ClickableCard.test.tsx +34 -0
  338. package/src/ClickableCard/ClickableCard.tsx +13 -3
  339. package/src/CodeBlock/CodeBlock.test.tsx +56 -0
  340. package/src/CodeBlock/CodeBlock.tsx +9 -1
  341. package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
  342. package/src/CommandPalette/CommandPalette.tsx +3 -1
  343. package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
  344. package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
  345. package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
  346. package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
  347. package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
  348. package/src/ContextMenu/ContextMenu.test.tsx +193 -0
  349. package/src/DateInput/DateInput.doc.mjs +16 -0
  350. package/src/DateInput/DateInput.test.tsx +108 -0
  351. package/src/DateInput/DateInput.tsx +68 -3
  352. package/src/DateInput/index.ts +1 -0
  353. package/src/DateTimeInput/DateTimeInput.test.tsx +35 -0
  354. package/src/DateTimeInput/DateTimeInput.tsx +14 -2
  355. package/src/Dialog/Dialog.doc.mjs +2 -2
  356. package/src/Dialog/Dialog.test.tsx +77 -4
  357. package/src/Dialog/Dialog.tsx +89 -5
  358. package/src/Dialog/DialogContext.ts +9 -2
  359. package/src/Dialog/DialogHeader.doc.mjs +2 -2
  360. package/src/Dialog/DialogHeader.tsx +9 -2
  361. package/src/Divider/Divider.tsx +2 -2
  362. package/src/DropdownMenu/DropdownMenu.test.tsx +169 -0
  363. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +1 -2
  364. package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
  365. package/src/Field/Field.test.tsx +57 -12
  366. package/src/Field/Field.tsx +6 -5
  367. package/src/Field/FieldLabel.tsx +8 -0
  368. package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
  369. package/src/FieldStatus/FieldStatus.test.tsx +78 -40
  370. package/src/FieldStatus/FieldStatus.tsx +22 -4
  371. package/src/FileInput/FileInput.test.tsx +52 -3
  372. package/src/FileInput/FileInput.tsx +13 -2
  373. package/src/HoverCard/HoverCard.doc.mjs +13 -0
  374. package/src/HoverCard/HoverCard.test.tsx +21 -2
  375. package/src/HoverCard/HoverCard.tsx +11 -0
  376. package/src/HoverCard/useHoverCard.doc.mjs +2 -0
  377. package/src/HoverCard/useHoverCard.tsx +24 -2
  378. package/src/Icon/Icon.doc.mjs +3 -2
  379. package/src/Icon/Icon.tsx +7 -2
  380. package/src/IconButton/IconButton.doc.mjs +8 -0
  381. package/src/IconButton/IconButton.test.tsx +15 -18
  382. package/src/Item/Item.test.tsx +40 -18
  383. package/src/Item/Item.tsx +38 -2
  384. package/src/Layer/useLayer.tsx +8 -0
  385. package/src/List/List.test.tsx +9 -8
  386. package/src/MobileNav/MobileNav.tsx +12 -1
  387. package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
  388. package/src/MobileNav/MobileNavToggle.tsx +9 -1
  389. package/src/MultiSelector/MultiSelector.doc.mjs +4 -2
  390. package/src/MultiSelector/MultiSelector.test.tsx +172 -3
  391. package/src/MultiSelector/MultiSelector.tsx +55 -12
  392. package/src/MultiSelector/hooks.ts +17 -0
  393. package/src/NumberInput/NumberInput.test.tsx +11 -7
  394. package/src/NumberInput/NumberInput.tsx +1 -2
  395. package/src/Outline/Outline.tsx +0 -1
  396. package/src/OverflowList/OverflowList.doc.mjs +39 -6
  397. package/src/OverflowList/OverflowList.test.tsx +111 -0
  398. package/src/OverflowList/OverflowList.tsx +48 -8
  399. package/src/Popover/Popover.tsx +7 -4
  400. package/src/Popover/usePopover.tsx +9 -13
  401. package/src/PowerSearch/PowerSearch.doc.mjs +14 -0
  402. package/src/PowerSearch/PowerSearch.test.tsx +20 -0
  403. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
  404. package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
  405. package/src/PowerSearch/usePowerSearchSource.ts +1 -2
  406. package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
  407. package/src/SelectableCard/SelectableCard.test.tsx +46 -4
  408. package/src/SelectableCard/SelectableCard.tsx +29 -16
  409. package/src/Selector/Selector.test.tsx +69 -0
  410. package/src/Selector/Selector.tsx +5 -1
  411. package/src/Selector/hooks.ts +17 -0
  412. package/src/SideNav/SideNav.test.tsx +119 -3
  413. package/src/SideNav/SideNavCollapseButton.tsx +6 -1
  414. package/src/SideNav/SideNavHeading.tsx +24 -8
  415. package/src/SideNav/SideNavItem.tsx +5 -1
  416. package/src/Slider/Slider.test.tsx +75 -2
  417. package/src/Slider/Slider.tsx +21 -5
  418. package/src/Switch/Switch.test.tsx +32 -1
  419. package/src/Table/BaseTable.tsx +3 -5
  420. package/src/Table/index.ts +5 -0
  421. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +6 -2
  422. package/src/Table/plugins/rowStatus/index.ts +7 -0
  423. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
  424. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
  425. package/src/Table/plugins/selection/useTableSelection.test.tsx +16 -0
  426. package/src/Table/plugins/selection/useTableSelection.tsx +19 -1
  427. package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
  428. package/src/Table/plugins/tree/useTableTreeData.tsx +128 -1
  429. package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
  430. package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
  431. package/src/Table/useBaseTablePlugins.ts +10 -6
  432. package/src/Table/useTableRowStatus.doc.mjs +30 -0
  433. package/src/Table/useTableSelection.doc.mjs +65 -14
  434. package/src/Table/useTableTreeData.doc.mjs +29 -0
  435. package/src/Table/useTableTreeState.doc.mjs +2 -2
  436. package/src/TextArea/TextArea.test.tsx +9 -1
  437. package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
  438. package/src/Thumbnail/Thumbnail.test.tsx +98 -7
  439. package/src/Thumbnail/Thumbnail.tsx +141 -41
  440. package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
  441. package/src/TimeInput/TimeInput.test.tsx +76 -1
  442. package/src/TimeInput/TimeInput.tsx +19 -6
  443. package/src/Timestamp/Timestamp.doc.mjs +4 -4
  444. package/src/Timestamp/Timestamp.test.tsx +32 -0
  445. package/src/Timestamp/Timestamp.tsx +28 -8
  446. package/src/Toast/useToast.tsx +7 -8
  447. package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
  448. package/src/Tokenizer/Tokenizer.doc.mjs +15 -1
  449. package/src/Tokenizer/Tokenizer.test.tsx +183 -2
  450. package/src/Tokenizer/Tokenizer.tsx +16 -4
  451. package/src/TopNav/TopNav.test.tsx +125 -1
  452. package/src/TopNav/TopNavHeading.tsx +24 -8
  453. package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
  454. package/src/TopNav/TopNavMegaMenu.tsx +10 -4
  455. package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
  456. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
  457. package/src/TopNav/TopNavMenu.test.tsx +118 -4
  458. package/src/TopNav/TopNavMenu.tsx +83 -5
  459. package/src/TreeList/TreeList.doc.mjs +22 -0
  460. package/src/TreeList/TreeList.test.tsx +232 -0
  461. package/src/TreeList/TreeList.tsx +18 -2
  462. package/src/TreeList/TreeListBranches.tsx +16 -2
  463. package/src/TreeList/TreeListItem.tsx +51 -11
  464. package/src/TreeList/TreeListTypes.ts +27 -1
  465. package/src/TreeList/index.ts +2 -2
  466. package/src/authoring/doc.ts +1 -3
  467. package/src/docs-types.ts +5 -0
  468. package/src/hooks/computeOverflow.test.ts +422 -0
  469. package/src/hooks/computeOverflow.ts +290 -0
  470. package/src/hooks/index.ts +2 -0
  471. package/src/hooks/useDevWarning.test.tsx +45 -0
  472. package/src/hooks/useDevWarning.ts +54 -0
  473. package/src/hooks/useOverflow.test.ts +96 -4
  474. package/src/hooks/useOverflow.ts +74 -33
  475. package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
  476. package/src/i18n/resolve.ts +9 -21
  477. package/src/theme/Theme.tsx +11 -14
  478. package/src/theme/generateThemeRules.test.ts +65 -0
  479. package/src/theme/generateThemeRules.ts +56 -0
  480. package/src/theme/hct.ts +1 -1
  481. package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
  482. package/src/utils/devWarning.test.ts +56 -0
  483. package/src/utils/devWarning.ts +102 -0
  484. package/src/utils/index.ts +6 -0
  485. package/src/utils/plainDate.test.ts +22 -0
  486. package/src/utils/plainDate.ts +61 -0
  487. package/src/utils/types.ts +14 -0
@@ -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', () => {
@@ -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
+ }
@@ -42,12 +42,16 @@ export {
42
42
  plainDateSetEndOfWeekExclusive,
43
43
  plainDateGetWeekNumber,
44
44
  plainDateFormat,
45
+ formatSharedDate,
45
46
  DATE_FORMAT_WITH_WEEKDAY,
47
+ DATE_FORMAT_SHORT_WITH_WEEKDAY,
46
48
  DATE_FORMAT_LONG,
47
49
  DATE_FORMAT_MONTH_YEAR,
48
50
  DATE_FORMAT_SHORT,
49
51
  DATE_FORMAT_SHORT_WITH_YEAR,
52
+ SHARED_DATE_FORMAT_OPTIONS,
50
53
  } from './plainDate';
54
+ export type {SharedDateFormat} from './plainDate';
51
55
 
52
56
  export {
53
57
  parseISOTime,
@@ -92,3 +96,5 @@ export {
92
96
  toGLFloats,
93
97
  } from './color';
94
98
  export type {RGBA} from './color';
99
+
100
+ export {devWarn, devError, warnOnce, formatDevMessage} from './devWarning';
@@ -26,6 +26,7 @@ import {
26
26
  plainDateSetEndOfWeekExclusive,
27
27
  plainDateGetWeekNumber,
28
28
  plainDateFormat,
29
+ formatSharedDate,
29
30
  DATE_FORMAT_WITH_WEEKDAY,
30
31
  } from './plainDate';
31
32
  import type {ISODateString} from './dateTypes';
@@ -521,3 +522,24 @@ describe('plainDateFormat', () => {
521
522
  expect(result).toContain('25');
522
523
  });
523
524
  });
525
+
526
+ describe('formatSharedDate', () => {
527
+ const pd: PlainDate = {year: 2026, month: 1, day: 25};
528
+
529
+ it('formats the short-month "date" shape', () => {
530
+ expect(formatSharedDate(pd, 'date')).toBe('Jan 25, 2026');
531
+ });
532
+
533
+ it('formats the long-month "date_long" shape', () => {
534
+ expect(formatSharedDate(pd, 'date_long')).toBe('January 25, 2026');
535
+ });
536
+
537
+ it('formats the weekday "date_weekday" shape', () => {
538
+ // 2026-01-25 is a Sunday.
539
+ expect(formatSharedDate(pd, 'date_weekday')).toBe('Sun, Jan 25, 2026');
540
+ });
541
+
542
+ it('formats the ISO "system_date" shape', () => {
543
+ expect(formatSharedDate(pd, 'system_date')).toBe('2026-01-25');
544
+ });
545
+ });
@@ -229,6 +229,15 @@ export const DATE_FORMAT_WITH_WEEKDAY: Intl.DateTimeFormatOptions = {
229
229
  day: 'numeric',
230
230
  };
231
231
 
232
+ // e.g. "Wed, May 21, 2026" (locale-dependent) — short weekday + short month.
233
+ // Backs the shared `date_weekday` format used by both Timestamp and DateInput.
234
+ export const DATE_FORMAT_SHORT_WITH_WEEKDAY: Intl.DateTimeFormatOptions = {
235
+ weekday: 'short',
236
+ month: 'short',
237
+ day: 'numeric',
238
+ year: 'numeric',
239
+ };
240
+
232
241
  // e.g. "May 21, 2026" (locale-dependent)
233
242
  export const DATE_FORMAT_LONG: Intl.DateTimeFormatOptions = {
234
243
  year: 'numeric',
@@ -263,3 +272,55 @@ export function plainDateFormat(
263
272
  plainDateToDate(pd),
264
273
  );
265
274
  }
275
+
276
+ // =============================================================================
277
+ // Shared date-only format vocabulary
278
+ // =============================================================================
279
+
280
+ /**
281
+ * The date-only members of Timestamp's `format` vocabulary that a
282
+ * calendar-date field (no time-of-day) can render. Both Timestamp and
283
+ * DateInput share these string literals and the mapping below so that the same
284
+ * literal renders the same date shape in either component.
285
+ *
286
+ * - `date`: locale short-month date, e.g. "Mar 21, 2026"
287
+ * - `date_long`: locale long-month date, e.g. "March 21, 2026"
288
+ * - `date_weekday`: short weekday + short-month date, e.g. "Wed, Mar 21, 2026"
289
+ * - `system_date`: ISO 8601 calendar date, e.g. "2026-03-21"
290
+ */
291
+ export type SharedDateFormat =
292
+ 'date' | 'date_long' | 'date_weekday' | 'system_date';
293
+
294
+ /**
295
+ * Intl option bags for the locale-aware shared date members. `system_date` is
296
+ * intentionally absent — it is emitted as a fixed ISO `YYYY-MM-DD` string, not
297
+ * via `Intl` — and is handled directly by {@link formatSharedDate}.
298
+ *
299
+ * This is the single source of truth consumed by both Timestamp's
300
+ * `formatTimestamp` switch and DateInput's display path, so the two never
301
+ * drift for the members they share.
302
+ */
303
+ export const SHARED_DATE_FORMAT_OPTIONS: Record<
304
+ Exclude<SharedDateFormat, 'system_date'>,
305
+ Intl.DateTimeFormatOptions
306
+ > = {
307
+ date: DATE_FORMAT_SHORT_WITH_YEAR,
308
+ date_long: DATE_FORMAT_LONG,
309
+ date_weekday: DATE_FORMAT_SHORT_WITH_WEEKDAY,
310
+ };
311
+
312
+ /**
313
+ * Renders a {@link PlainDate} using one of the {@link SharedDateFormat}
314
+ * members. The shared entry point DateInput uses for the named-format path;
315
+ * Timestamp maps the same members onto {@link SHARED_DATE_FORMAT_OPTIONS} in
316
+ * its own `formatTimestamp` switch (its input is a `Date`, not a `PlainDate`).
317
+ */
318
+ export function formatSharedDate(
319
+ pd: PlainDate,
320
+ format: SharedDateFormat,
321
+ ): string {
322
+ if (format === 'system_date') {
323
+ return plainDateToISO(pd);
324
+ }
325
+ return plainDateFormat(pd, SHARED_DATE_FORMAT_OPTIONS[format]);
326
+ }
@@ -12,6 +12,20 @@
12
12
  */
13
13
  export type SizeValue = number | string;
14
14
 
15
+ /**
16
+ * Resting elevation level for configurable surfaces.
17
+ *
18
+ * Maps to the shadow token scale:
19
+ * - `none` = flat (`box-shadow: none`)
20
+ * - `low` = `--shadow-low`
21
+ * - `med` = `--shadow-med`
22
+ * - `high` = `--shadow-high`
23
+ *
24
+ * Components narrow this union to the steps they actually need — e.g. Card
25
+ * exposes all four, while ChatComposer exposes only `'none' | 'low'`.
26
+ */
27
+ export type Elevation = 'none' | 'low' | 'med' | 'high';
28
+
15
29
  /**
16
30
  * Numeric spacing step from the Astryx spacing scale.
17
31
  *