@astryxdesign/core 0.1.4 → 0.1.5-canary.76e6697

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 (635) hide show
  1. package/CHANGELOG.md +141 -0
  2. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +20 -18
  5. package/dist/AlertDialog/useImperativeAlertDialog.d.ts +0 -2
  6. package/dist/AlertDialog/useImperativeAlertDialog.d.ts.map +1 -1
  7. package/dist/AlertDialog/useImperativeAlertDialog.js +3 -5
  8. package/dist/AppShell/AppShell.d.ts +1 -1
  9. package/dist/AppShell/AppShell.d.ts.map +1 -1
  10. package/dist/AppShell/AppShell.js +55 -53
  11. package/dist/AspectRatio/AspectRatio.d.ts +48 -10
  12. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  13. package/dist/AspectRatio/AspectRatio.js +33 -12
  14. package/dist/AspectRatio/index.d.ts +1 -1
  15. package/dist/AspectRatio/index.d.ts.map +1 -1
  16. package/dist/Avatar/Avatar.d.ts.map +1 -1
  17. package/dist/Avatar/Avatar.js +28 -26
  18. package/dist/Avatar/AvatarStatusDot.js +6 -6
  19. package/dist/AvatarGroup/AvatarGroup.js +6 -6
  20. package/dist/AvatarGroup/AvatarGroupOverflow.js +7 -7
  21. package/dist/Badge/Badge.js +3 -3
  22. package/dist/Banner/Banner.d.ts.map +1 -1
  23. package/dist/Banner/Banner.js +32 -25
  24. package/dist/Blockquote/Blockquote.js +7 -7
  25. package/dist/Breadcrumbs/BreadcrumbItem.js +17 -17
  26. package/dist/Breadcrumbs/Breadcrumbs.js +7 -7
  27. package/dist/Button/Button.js +19 -19
  28. package/dist/ButtonGroup/ButtonGroup.js +7 -7
  29. package/dist/Calendar/Calendar.d.ts.map +1 -1
  30. package/dist/Calendar/Calendar.js +68 -48
  31. package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
  32. package/dist/Calendar/styles.d.ts +2 -2
  33. package/dist/Calendar/styles.d.ts.map +1 -1
  34. package/dist/Calendar/styles.js +2 -2
  35. package/dist/Card/Card.d.ts +4 -2
  36. package/dist/Card/Card.d.ts.map +1 -1
  37. package/dist/Card/Card.js +18 -10
  38. package/dist/Carousel/Carousel.d.ts.map +1 -1
  39. package/dist/Carousel/Carousel.js +24 -21
  40. package/dist/Center/Center.js +3 -3
  41. package/dist/Chat/ChatComposer.js +23 -23
  42. package/dist/Chat/ChatComposerDrawer.js +14 -14
  43. package/dist/Chat/ChatComposerInput.d.ts +1 -1
  44. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  45. package/dist/Chat/ChatComposerInput.js +27 -15
  46. package/dist/Chat/ChatDictationButton.d.ts +1 -1
  47. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  48. package/dist/Chat/ChatDictationButton.js +13 -11
  49. package/dist/Chat/ChatLayout.js +17 -17
  50. package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
  51. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  52. package/dist/Chat/ChatLayoutScrollButton.js +12 -10
  53. package/dist/Chat/ChatMessage.js +12 -12
  54. package/dist/Chat/ChatMessageBubble.js +7 -7
  55. package/dist/Chat/ChatMessageList.js +14 -14
  56. package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
  57. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  58. package/dist/Chat/ChatMessageMetadata.js +14 -12
  59. package/dist/Chat/ChatPastedTextToken.js +13 -13
  60. package/dist/Chat/ChatSendButton.js +3 -3
  61. package/dist/Chat/ChatSystemMessage.d.ts +1 -1
  62. package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
  63. package/dist/Chat/ChatSystemMessage.js +17 -17
  64. package/dist/Chat/ChatTokenizedText.d.ts +1 -1
  65. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  66. package/dist/Chat/ChatTokenizedText.js +24 -15
  67. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  68. package/dist/Chat/ChatToolCalls.js +81 -74
  69. package/dist/Chat/index.d.ts +1 -1
  70. package/dist/Chat/index.d.ts.map +1 -1
  71. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  72. package/dist/Chat/useTriggerMenu.js +15 -15
  73. package/dist/CheckboxInput/CheckboxInput.d.ts +1 -1
  74. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  75. package/dist/CheckboxInput/CheckboxInput.js +25 -23
  76. package/dist/CheckboxList/CheckboxList.js +9 -9
  77. package/dist/CheckboxList/CheckboxListItem.d.ts +1 -1
  78. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  79. package/dist/CheckboxList/CheckboxListItem.js +8 -6
  80. package/dist/Citation/Citation.js +10 -10
  81. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  82. package/dist/ClickableCard/ClickableCard.js +32 -9
  83. package/dist/Code/Code.js +3 -3
  84. package/dist/CodeBlock/CodeBlock.d.ts +10 -1
  85. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  86. package/dist/CodeBlock/CodeBlock.js +88 -52
  87. package/dist/Collapsible/Collapsible.d.ts +9 -3
  88. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  89. package/dist/Collapsible/Collapsible.js +109 -22
  90. package/dist/Collapsible/CollapsibleGroup.d.ts +37 -7
  91. package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
  92. package/dist/Collapsible/CollapsibleGroup.js +64 -12
  93. package/dist/Collapsible/CollapsibleGroupContext.d.ts +24 -0
  94. package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
  95. package/dist/Collapsible/CollapsibleGroupContext.js +26 -3
  96. package/dist/Collapsible/index.d.ts +1 -0
  97. package/dist/Collapsible/index.d.ts.map +1 -1
  98. package/dist/Collapsible/useCollapsible.d.ts +4 -1
  99. package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
  100. package/dist/Collapsible/useCollapsible.js +20 -6
  101. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  102. package/dist/CommandPalette/CommandPalette.js +36 -34
  103. package/dist/CommandPalette/CommandPaletteEmpty.js +3 -3
  104. package/dist/CommandPalette/CommandPaletteFooter.js +16 -16
  105. package/dist/CommandPalette/CommandPaletteGroup.js +5 -5
  106. package/dist/CommandPalette/CommandPaletteInput.js +13 -13
  107. package/dist/CommandPalette/CommandPaletteItem.js +3 -3
  108. package/dist/CommandPalette/CommandPaletteList.js +3 -3
  109. package/dist/ContextMenu/ContextMenu.d.ts +7 -2
  110. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  111. package/dist/ContextMenu/ContextMenu.js +76 -43
  112. package/dist/DateInput/DateInput.js +18 -18
  113. package/dist/DateRangeInput/DateRangeInput.js +21 -21
  114. package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
  115. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  116. package/dist/DateTimeInput/DateTimeInput.js +30 -26
  117. package/dist/DateTimeInput/index.d.ts +1 -1
  118. package/dist/DateTimeInput/index.d.ts.map +1 -1
  119. package/dist/Dialog/Dialog.js +9 -9
  120. package/dist/Dialog/DialogHeader.js +16 -16
  121. package/dist/Dialog/useImperativeDialog.js +3 -3
  122. package/dist/Divider/Divider.js +7 -7
  123. package/dist/DropdownMenu/DropdownMenu.js +10 -10
  124. package/dist/DropdownMenu/DropdownMenuItem.d.ts +2 -17
  125. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  126. package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
  127. package/dist/DropdownMenu/renderDropdownItems.js +10 -10
  128. package/dist/EmptyState/EmptyState.js +9 -9
  129. package/dist/Field/Field.js +17 -17
  130. package/dist/Field/FieldLabel.js +15 -15
  131. package/dist/Field/InputClearButton.js +5 -5
  132. package/dist/FieldStatus/FieldStatus.js +3 -3
  133. package/dist/FileInput/FileInput.js +29 -29
  134. package/dist/FormLayout/FormLayout.js +5 -5
  135. package/dist/Grid/Grid.d.ts +4 -3
  136. package/dist/Grid/Grid.d.ts.map +1 -1
  137. package/dist/Grid/Grid.js +29 -12
  138. package/dist/Grid/GridSpan.js +3 -3
  139. package/dist/HStack/HStack.js +3 -3
  140. package/dist/Heading/Heading.js +10 -10
  141. package/dist/HoverCard/HoverCard.js +9 -9
  142. package/dist/HoverCard/useHoverCard.d.ts +5 -1
  143. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  144. package/dist/HoverCard/useHoverCard.js +3 -3
  145. package/dist/Icon/Icon.d.ts.map +1 -1
  146. package/dist/Icon/Icon.js +16 -12
  147. package/dist/Icon/defaultIcons.js +116 -116
  148. package/dist/IconButton/IconButton.js +3 -3
  149. package/dist/InputGroup/InputGroup.js +11 -11
  150. package/dist/InputGroup/InputGroupText.js +3 -3
  151. package/dist/Item/Item.js +18 -18
  152. package/dist/Kbd/Kbd.js +5 -5
  153. package/dist/Layer/LayerProvider.js +7 -7
  154. package/dist/Layer/useLayer.d.ts +29 -2
  155. package/dist/Layer/useLayer.d.ts.map +1 -1
  156. package/dist/Layer/useLayer.js +44 -31
  157. package/dist/Layout/Layout.js +21 -21
  158. package/dist/Layout/LayoutContent.js +3 -3
  159. package/dist/Layout/LayoutFooter.js +5 -5
  160. package/dist/Layout/LayoutHeader.js +5 -5
  161. package/dist/Layout/LayoutPanel.js +3 -3
  162. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  163. package/dist/Lightbox/Lightbox.js +55 -31
  164. package/dist/Lightbox/useLightbox.d.ts +0 -1
  165. package/dist/Lightbox/useLightbox.d.ts.map +1 -1
  166. package/dist/Lightbox/useLightbox.js +3 -4
  167. package/dist/Link/Link.d.ts +0 -2
  168. package/dist/Link/Link.d.ts.map +1 -1
  169. package/dist/Link/Link.js +15 -17
  170. package/dist/Link/LinkProvider.js +3 -3
  171. package/dist/Link/useLinkify.js +3 -3
  172. package/dist/List/List.js +11 -11
  173. package/dist/List/ListItem.js +11 -11
  174. package/dist/Markdown/Markdown.d.ts.map +1 -1
  175. package/dist/Markdown/Markdown.js +102 -102
  176. package/dist/MetadataList/MetadataList.js +10 -10
  177. package/dist/MetadataList/MetadataListItem.js +15 -15
  178. package/dist/MobileNav/MobileNav.d.ts +1 -1
  179. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  180. package/dist/MobileNav/MobileNav.js +26 -23
  181. package/dist/MobileNav/MobileNavToggle.js +5 -5
  182. package/dist/MoreMenu/MoreMenu.js +3 -3
  183. package/dist/MultiSelector/MultiSelector.js +56 -56
  184. package/dist/NavIcon/NavIcon.js +3 -3
  185. package/dist/NavMenu/NavHeadingMenu.js +5 -5
  186. package/dist/NavMenu/NavHeadingMenuItem.js +8 -8
  187. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  188. package/dist/NumberInput/NumberInput.js +48 -32
  189. package/dist/Outline/Outline.js +15 -15
  190. package/dist/OverflowList/OverflowList.js +8 -8
  191. package/dist/Overlay/Overlay.js +3 -3
  192. package/dist/Overlay/OverlayScrim.js +5 -5
  193. package/dist/Overlay/useOverlay.d.ts +0 -3
  194. package/dist/Overlay/useOverlay.d.ts.map +1 -1
  195. package/dist/Overlay/useOverlay.js +3 -6
  196. package/dist/Pagination/Pagination.d.ts +1 -1
  197. package/dist/Pagination/Pagination.d.ts.map +1 -1
  198. package/dist/Pagination/Pagination.js +125 -72
  199. package/dist/Popover/Popover.js +16 -16
  200. package/dist/Popover/usePopover.js +7 -7
  201. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  202. package/dist/PowerSearch/PowerSearch.js +110 -92
  203. package/dist/PowerSearch/PowerSearchEditPopover.js +84 -84
  204. package/dist/PowerSearch/PowerSearchFilterEditor.js +3 -3
  205. package/dist/PowerSearch/PowerSearchToken.js +5 -5
  206. package/dist/PowerSearch/PowerSearchValueEditor.js +54 -54
  207. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  208. package/dist/ProgressBar/ProgressBar.js +25 -18
  209. package/dist/RadioList/RadioList.js +7 -7
  210. package/dist/RadioList/RadioListItem.d.ts +1 -1
  211. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  212. package/dist/RadioList/RadioListItem.js +24 -21
  213. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  214. package/dist/Resizable/ResizeHandle.js +28 -10
  215. package/dist/Section/Section.js +5 -5
  216. package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
  217. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  218. package/dist/SegmentedControl/SegmentedControl.js +32 -10
  219. package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
  220. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  221. package/dist/SegmentedControl/SegmentedControlItem.js +18 -12
  222. package/dist/SelectableCard/SelectableCard.js +5 -5
  223. package/dist/Selector/Selector.js +46 -46
  224. package/dist/Selector/SelectorOption.js +3 -3
  225. package/dist/SideNav/SideNav.d.ts.map +1 -1
  226. package/dist/SideNav/SideNav.js +38 -34
  227. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  228. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  229. package/dist/SideNav/SideNavCollapseButton.js +8 -6
  230. package/dist/SideNav/SideNavHeading.js +87 -87
  231. package/dist/SideNav/SideNavItem.js +42 -42
  232. package/dist/SideNav/SideNavSection.d.ts +1 -1
  233. package/dist/SideNav/SideNavSection.d.ts.map +1 -1
  234. package/dist/SideNav/SideNavSection.js +18 -16
  235. package/dist/Skeleton/Skeleton.js +3 -3
  236. package/dist/Slider/Slider.js +23 -23
  237. package/dist/Spinner/Spinner.js +9 -9
  238. package/dist/StatusDot/StatusDot.js +5 -5
  239. package/dist/Switch/Switch.d.ts +8 -4
  240. package/dist/Switch/Switch.d.ts.map +1 -1
  241. package/dist/Switch/Switch.js +34 -29
  242. package/dist/TabList/Tab.js +18 -18
  243. package/dist/TabList/TabList.js +5 -5
  244. package/dist/TabList/TabMenu.d.ts.map +1 -1
  245. package/dist/TabList/TabMenu.js +57 -30
  246. package/dist/TabList/tab.markers.stylex.d.ts +1 -1
  247. package/dist/Table/BaseTable.d.ts.map +1 -1
  248. package/dist/Table/BaseTable.js +50 -39
  249. package/dist/Table/Table.js +7 -7
  250. package/dist/Table/TableBody.d.ts +1 -1
  251. package/dist/Table/TableBody.d.ts.map +1 -1
  252. package/dist/Table/TableBody.js +9 -5
  253. package/dist/Table/TableCell.js +3 -3
  254. package/dist/Table/TableFooter.d.ts +1 -1
  255. package/dist/Table/TableFooter.d.ts.map +1 -1
  256. package/dist/Table/TableFooter.js +9 -5
  257. package/dist/Table/TableHeader.d.ts +1 -1
  258. package/dist/Table/TableHeader.d.ts.map +1 -1
  259. package/dist/Table/TableHeader.js +9 -5
  260. package/dist/Table/TableHeaderCell.js +3 -3
  261. package/dist/Table/TableRow.js +5 -5
  262. package/dist/Table/index.d.ts +2 -0
  263. package/dist/Table/index.d.ts.map +1 -1
  264. package/dist/Table/index.js +1 -0
  265. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  266. package/dist/Table/plugins/columnResize/useTableColumnResize.js +14 -11
  267. package/dist/Table/plugins/filtering/useTableFiltering.js +71 -71
  268. package/dist/Table/plugins/groupedRows/index.d.ts +3 -0
  269. package/dist/Table/plugins/groupedRows/index.d.ts.map +1 -0
  270. package/dist/Table/plugins/groupedRows/index.js +3 -0
  271. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +78 -0
  272. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -0
  273. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +250 -0
  274. package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
  275. package/dist/Table/plugins/pagination/paginateData.js +5 -1
  276. package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
  277. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +1 -1
  278. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +23 -23
  279. package/dist/Table/plugins/selection/useTableSelection.js +18 -18
  280. package/dist/Table/plugins/selection/useTableSelectionState.d.ts.map +1 -1
  281. package/dist/Table/plugins/selection/useTableSelectionState.js +11 -1
  282. package/dist/Table/plugins/sortable/useTableSortable.js +17 -17
  283. package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
  284. package/dist/Table/plugins/sortable/useTableSortableState.js +8 -4
  285. package/dist/Table/tableContextMenu.js +9 -9
  286. package/dist/Text/Text.js +10 -10
  287. package/dist/TextArea/TextArea.js +14 -14
  288. package/dist/TextInput/TextInput.js +15 -15
  289. package/dist/Thumbnail/Thumbnail.d.ts +3 -2
  290. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  291. package/dist/Thumbnail/Thumbnail.js +30 -29
  292. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  293. package/dist/TimeInput/TimeInput.js +26 -21
  294. package/dist/Timestamp/Timestamp.d.ts +1 -1
  295. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  296. package/dist/Timestamp/Timestamp.js +37 -26
  297. package/dist/Toast/Toast.d.ts.map +1 -1
  298. package/dist/Toast/Toast.js +25 -17
  299. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  300. package/dist/Toast/ToastViewport.js +23 -11
  301. package/dist/Toast/useToast.d.ts.map +1 -1
  302. package/dist/Toast/useToast.js +44 -4
  303. package/dist/ToggleButton/ToggleButton.js +12 -12
  304. package/dist/ToggleButton/ToggleButtonGroup.js +5 -5
  305. package/dist/Token/Token.js +21 -21
  306. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  307. package/dist/Tokenizer/Tokenizer.js +36 -34
  308. package/dist/Toolbar/Toolbar.js +18 -18
  309. package/dist/Tooltip/Tooltip.js +11 -11
  310. package/dist/Tooltip/useTooltip.d.ts +5 -1
  311. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  312. package/dist/Tooltip/useTooltip.js +3 -3
  313. package/dist/TopNav/TopNav.js +32 -32
  314. package/dist/TopNav/TopNavHeading.js +67 -67
  315. package/dist/TopNav/TopNavItem.js +5 -5
  316. package/dist/TopNav/TopNavMegaMenu.js +30 -30
  317. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
  318. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  319. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +25 -14
  320. package/dist/TopNav/TopNavMegaMenuItem.js +16 -16
  321. package/dist/TopNav/TopNavMenu.js +32 -32
  322. package/dist/TreeList/TreeList.js +8 -8
  323. package/dist/TreeList/TreeListBranches.js +11 -11
  324. package/dist/TreeList/TreeListItem.js +30 -30
  325. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  326. package/dist/Typeahead/BaseTypeahead.js +23 -20
  327. package/dist/Typeahead/Typeahead.js +12 -12
  328. package/dist/Typeahead/TypeaheadItem.js +10 -10
  329. package/dist/VStack/VStack.js +3 -3
  330. package/dist/VisuallyHidden/VisuallyHidden.d.ts +0 -3
  331. package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
  332. package/dist/VisuallyHidden/VisuallyHidden.js +0 -3
  333. package/dist/astryx.css +7 -0
  334. package/dist/astryx.umd.js +63 -63
  335. package/dist/astryx.umd.js.map +4 -4
  336. package/dist/docs-types.d.ts +8 -2
  337. package/dist/docs-types.d.ts.map +1 -1
  338. package/dist/hooks/focusableSelector.d.ts +1 -1
  339. package/dist/hooks/focusableSelector.d.ts.map +1 -1
  340. package/dist/hooks/focusableSelector.js +1 -1
  341. package/dist/hooks/index.d.ts +2 -0
  342. package/dist/hooks/index.d.ts.map +1 -1
  343. package/dist/hooks/index.js +1 -0
  344. package/dist/hooks/useFocusTrap.d.ts +3 -0
  345. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  346. package/dist/hooks/useFocusTrap.js +38 -1
  347. package/dist/hooks/useHotkeys.d.ts +51 -0
  348. package/dist/hooks/useHotkeys.d.ts.map +1 -0
  349. package/dist/hooks/useHotkeys.js +160 -0
  350. package/dist/hooks/useInteractiveRole.d.ts +6 -2
  351. package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
  352. package/dist/hooks/useInteractiveRole.js +6 -2
  353. package/dist/hooks/useKeyboardHint.js +9 -9
  354. package/dist/hooks/useStreamingText.d.ts +3 -1
  355. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  356. package/dist/hooks/useStreamingText.js +14 -5
  357. package/dist/theme/MediaTheme.js +3 -3
  358. package/dist/theme/Theme.js +7 -7
  359. package/dist/theme/defineTheme.d.ts +1 -1
  360. package/dist/theme/defineTheme.d.ts.map +1 -1
  361. package/dist/theme/expandColorScale.d.ts.map +1 -1
  362. package/dist/theme/expandColorScale.js +10 -3
  363. package/dist/theme/hct.d.ts +0 -15
  364. package/dist/theme/hct.d.ts.map +1 -1
  365. package/dist/theme/hct.js +9 -9
  366. package/dist/theme/syntax/SyntaxTheme.js +5 -5
  367. package/dist/theme/tokens.d.ts +10 -2
  368. package/dist/theme/tokens.d.ts.map +1 -1
  369. package/dist/theme/tokens.js +220 -4
  370. package/dist/theme/useTheme.d.ts +3 -2
  371. package/dist/theme/useTheme.d.ts.map +1 -1
  372. package/dist/theme/useTheme.js +73 -6
  373. package/dist/utils/color.d.ts +42 -0
  374. package/dist/utils/color.d.ts.map +1 -0
  375. package/dist/utils/color.js +150 -0
  376. package/dist/utils/composeEventHandlers.d.ts +30 -0
  377. package/dist/utils/composeEventHandlers.d.ts.map +1 -0
  378. package/dist/utils/composeEventHandlers.js +40 -0
  379. package/dist/utils/index.d.ts +3 -0
  380. package/dist/utils/index.d.ts.map +1 -1
  381. package/dist/utils/index.js +3 -1
  382. package/dist/utils/timeParser.d.ts.map +1 -1
  383. package/dist/utils/timeParser.js +8 -5
  384. package/package.json +4 -4
  385. package/src/AlertDialog/AlertDialog.doc.mjs +4 -0
  386. package/src/AlertDialog/AlertDialog.tsx +2 -0
  387. package/src/AlertDialog/useImperativeAlertDialog.tsx +0 -2
  388. package/src/AppShell/AppShell.tsx +2 -0
  389. package/src/AspectRatio/AspectRatio.doc.mjs +28 -1
  390. package/src/AspectRatio/AspectRatio.test.tsx +142 -1
  391. package/src/AspectRatio/AspectRatio.tsx +70 -10
  392. package/src/AspectRatio/index.ts +5 -1
  393. package/src/Avatar/Avatar.doc.mjs +11 -0
  394. package/src/Avatar/Avatar.test.tsx +32 -1
  395. package/src/Avatar/Avatar.tsx +14 -22
  396. package/src/Avatar/AvatarStatusDot.tsx +2 -2
  397. package/src/AvatarGroup/AvatarGroup.doc.mjs +1 -0
  398. package/src/AvatarGroup/AvatarGroup.tsx +2 -2
  399. package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -2
  400. package/src/Banner/Banner.doc.mjs +8 -0
  401. package/src/Banner/Banner.test.tsx +38 -0
  402. package/src/Banner/Banner.tsx +8 -1
  403. package/src/Calendar/Calendar.doc.mjs +1 -1
  404. package/src/Calendar/Calendar.test.tsx +122 -17
  405. package/src/Calendar/Calendar.tsx +26 -5
  406. package/src/Calendar/dayCellUtils.ts +3 -1
  407. package/src/Calendar/styles.ts +12 -2
  408. package/src/Card/Card.doc.mjs +1 -1
  409. package/src/Card/Card.tsx +16 -6
  410. package/src/Carousel/Carousel.doc.mjs +12 -12
  411. package/src/Carousel/Carousel.test.tsx +13 -0
  412. package/src/Carousel/Carousel.tsx +4 -2
  413. package/src/Chat/Chat.doc.mjs +1 -1
  414. package/src/Chat/ChatComposerInput.test.tsx +27 -1
  415. package/src/Chat/ChatComposerInput.tsx +20 -15
  416. package/src/Chat/ChatDictationButton.test.tsx +43 -0
  417. package/src/Chat/ChatDictationButton.tsx +4 -4
  418. package/src/Chat/ChatLayoutScrollButton.test.tsx +33 -0
  419. package/src/Chat/ChatLayoutScrollButton.tsx +3 -1
  420. package/src/Chat/ChatMessageMetadata.test.tsx +32 -0
  421. package/src/Chat/ChatMessageMetadata.tsx +4 -6
  422. package/src/Chat/ChatSystemMessage.test.tsx +26 -11
  423. package/src/Chat/ChatSystemMessage.tsx +7 -7
  424. package/src/Chat/ChatTokenizedText.test.tsx +29 -16
  425. package/src/Chat/ChatTokenizedText.tsx +15 -8
  426. package/src/Chat/ChatToolCalls.test.tsx +55 -0
  427. package/src/Chat/ChatToolCalls.tsx +10 -12
  428. package/src/Chat/index.ts +1 -4
  429. package/src/Chat/useTriggerMenu.tsx +1 -4
  430. package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -3
  431. package/src/CheckboxInput/CheckboxInput.test.tsx +71 -4
  432. package/src/CheckboxInput/CheckboxInput.tsx +2 -0
  433. package/src/CheckboxList/CheckboxList.test.tsx +19 -0
  434. package/src/CheckboxList/CheckboxListItem.tsx +11 -2
  435. package/src/Citation/Citation.doc.mjs +5 -0
  436. package/src/ClickableCard/ClickableCard.tsx +45 -2
  437. package/src/CodeBlock/CodeBlock.doc.mjs +7 -2
  438. package/src/CodeBlock/CodeBlock.test.tsx +122 -3
  439. package/src/CodeBlock/CodeBlock.tsx +62 -4
  440. package/src/Collapsible/Collapsible.doc.mjs +8 -4
  441. package/src/Collapsible/Collapsible.test.tsx +403 -0
  442. package/src/Collapsible/Collapsible.tsx +85 -10
  443. package/src/Collapsible/CollapsibleGroup.doc.mjs +27 -3
  444. package/src/Collapsible/CollapsibleGroup.test.tsx +314 -0
  445. package/src/Collapsible/CollapsibleGroup.tsx +97 -9
  446. package/src/Collapsible/CollapsibleGroupContext.tsx +34 -2
  447. package/src/Collapsible/index.ts +1 -0
  448. package/src/Collapsible/useCollapsible.ts +20 -6
  449. package/src/CommandPalette/CommandPalette.doc.mjs +5 -0
  450. package/src/CommandPalette/CommandPalette.tsx +5 -3
  451. package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +5 -0
  452. package/src/CommandPalette/CommandPaletteGroup.doc.mjs +10 -0
  453. package/src/CommandPalette/CommandPaletteInput.doc.mjs +6 -0
  454. package/src/CommandPalette/CommandPaletteItem.doc.mjs +6 -0
  455. package/src/CommandPalette/CommandPaletteList.doc.mjs +9 -0
  456. package/src/ContextMenu/ContextMenu.doc.mjs +15 -0
  457. package/src/ContextMenu/ContextMenu.test.tsx +87 -0
  458. package/src/ContextMenu/ContextMenu.tsx +87 -28
  459. package/src/ContextMenu/ContextMenuItem.doc.mjs +6 -0
  460. package/src/DateInput/DateInput.test.tsx +11 -20
  461. package/src/DateRangeInput/DateRangeInput.doc.mjs +9 -6
  462. package/src/DateRangeInput/DateRangeInput.test.tsx +31 -44
  463. package/src/DateTimeInput/DateTimeInput.doc.mjs +3 -2
  464. package/src/DateTimeInput/DateTimeInput.test.tsx +118 -16
  465. package/src/DateTimeInput/DateTimeInput.tsx +8 -2
  466. package/src/DateTimeInput/index.ts +1 -0
  467. package/src/Dialog/Dialog.doc.mjs +4 -0
  468. package/src/Dialog/DialogHeader.doc.mjs +45 -0
  469. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
  470. package/src/DropdownMenu/DropdownMenu.test.tsx +22 -2
  471. package/src/DropdownMenu/DropdownMenuItem.tsx +5 -17
  472. package/src/EmptyState/EmptyState.doc.mjs +1 -1
  473. package/src/Field/Field.test.tsx +1 -4
  474. package/src/Field/FieldLabel.test.tsx +2 -2
  475. package/src/FieldStatus/FieldStatus.test.tsx +282 -0
  476. package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -3
  477. package/src/Grid/Grid.test.tsx +43 -18
  478. package/src/Grid/Grid.tsx +26 -9
  479. package/src/HoverCard/HoverCard.doc.mjs +6 -6
  480. package/src/HoverCard/useHoverCard.doc.mjs +5 -5
  481. package/src/HoverCard/useHoverCard.tsx +9 -2
  482. package/src/Icon/Icon.test.tsx +41 -29
  483. package/src/Icon/Icon.tsx +6 -2
  484. package/src/InputGroup/InputGroup.doc.mjs +1 -0
  485. package/src/InputGroup/InputGroup.tsx +2 -2
  486. package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +185 -0
  487. package/src/Item/Item.tsx +1 -1
  488. package/src/Layer/useLayer.doc.mjs +2 -2
  489. package/src/Layer/useLayer.test.tsx +221 -2
  490. package/src/Layer/useLayer.tsx +69 -30
  491. package/src/Layout/Layout.test.tsx +285 -0
  492. package/src/Layout/LayoutContent.doc.mjs +12 -0
  493. package/src/Layout/LayoutPanel.doc.mjs +40 -0
  494. package/src/Layout/LayoutSlots.test.tsx +364 -0
  495. package/src/Lightbox/Lightbox.doc.mjs +5 -0
  496. package/src/Lightbox/Lightbox.test.tsx +123 -2
  497. package/src/Lightbox/Lightbox.tsx +29 -1
  498. package/src/Lightbox/useLightbox.tsx +0 -1
  499. package/src/Link/Link.tsx +0 -2
  500. package/src/Markdown/Markdown.tsx +9 -7
  501. package/src/Markdown/parser.perf.test.ts +34 -12
  502. package/src/MobileNav/MobileNav.test.tsx +56 -0
  503. package/src/MobileNav/MobileNav.tsx +13 -8
  504. package/src/NavMenu/NavMenu.doc.mjs +15 -0
  505. package/src/NumberInput/NumberInput.test.tsx +48 -3
  506. package/src/NumberInput/NumberInput.tsx +32 -15
  507. package/src/Outline/Outline.doc.mjs +2 -0
  508. package/src/Outline/parseOutlineFromMarkdown.test.ts +80 -0
  509. package/src/OverflowList/OverflowList.test.tsx +416 -0
  510. package/src/Overlay/Overlay.doc.mjs +6 -0
  511. package/src/Overlay/Overlay.test.tsx +356 -0
  512. package/src/Overlay/useOverlay.tsx +0 -3
  513. package/src/Pagination/Pagination.test.tsx +162 -0
  514. package/src/Pagination/Pagination.tsx +80 -26
  515. package/src/Popover/Popover.doc.mjs +6 -6
  516. package/src/Popover/Popover.test.tsx +65 -0
  517. package/src/Popover/usePopover.doc.mjs +1 -1
  518. package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
  519. package/src/PowerSearch/PowerSearch.test.tsx +109 -1
  520. package/src/PowerSearch/PowerSearch.tsx +37 -16
  521. package/src/ProgressBar/ProgressBar.doc.mjs +2 -0
  522. package/src/ProgressBar/ProgressBar.test.tsx +30 -0
  523. package/src/ProgressBar/ProgressBar.tsx +12 -5
  524. package/src/RadioList/RadioList.test.tsx +19 -0
  525. package/src/RadioList/RadioListItem.tsx +9 -4
  526. package/src/Resizable/ResizeHandle.test.tsx +218 -0
  527. package/src/Resizable/ResizeHandle.tsx +22 -4
  528. package/src/SegmentedControl/SegmentedControl.doc.mjs +1 -1
  529. package/src/SegmentedControl/SegmentedControl.test.tsx +192 -0
  530. package/src/SegmentedControl/SegmentedControl.tsx +27 -5
  531. package/src/SegmentedControl/SegmentedControlItem.tsx +9 -4
  532. package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
  533. package/src/Selector/Selector.test.tsx +27 -1
  534. package/src/SideNav/SideNav.doc.mjs +7 -1
  535. package/src/SideNav/SideNav.test.tsx +66 -0
  536. package/src/SideNav/SideNav.tsx +6 -2
  537. package/src/SideNav/SideNavCollapseButton.tsx +4 -3
  538. package/src/SideNav/SideNavSection.tsx +6 -4
  539. package/src/SizeContext/SizeContext.test.tsx +226 -0
  540. package/src/Switch/Switch.doc.mjs +7 -7
  541. package/src/Switch/Switch.test.tsx +102 -3
  542. package/src/Switch/Switch.tsx +20 -7
  543. package/src/TabList/TabList.test.tsx +185 -1
  544. package/src/TabList/TabMenu.tsx +45 -9
  545. package/src/Table/BaseTable.tsx +13 -2
  546. package/src/Table/Table.doc.mjs +6 -1
  547. package/src/Table/Table.test.tsx +87 -0
  548. package/src/Table/TableBody.tsx +15 -2
  549. package/src/Table/TableFooter.tsx +15 -2
  550. package/src/Table/TableHeader.tsx +15 -2
  551. package/src/Table/index.ts +5 -0
  552. package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +13 -0
  553. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +3 -1
  554. package/src/Table/plugins/groupedRows/index.ts +7 -0
  555. package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +231 -0
  556. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +349 -0
  557. package/src/Table/plugins/pagination/paginateData.ts +5 -1
  558. package/src/Table/plugins/pagination/useTablePagination.test.tsx +13 -0
  559. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +1 -1
  560. package/src/Table/plugins/selection/useTableSelectionState.test.tsx +23 -0
  561. package/src/Table/plugins/selection/useTableSelectionState.tsx +11 -6
  562. package/src/Table/plugins/sortable/useTableSortableState.test.tsx +35 -1
  563. package/src/Table/plugins/sortable/useTableSortableState.tsx +8 -4
  564. package/src/Table/useTableGroupedRows.doc.mjs +71 -0
  565. package/src/TextArea/TextArea.test.tsx +3 -3
  566. package/src/TextInput/TextInput.test.tsx +3 -3
  567. package/src/Thumbnail/Thumbnail.test.tsx +36 -2
  568. package/src/Thumbnail/Thumbnail.tsx +4 -2
  569. package/src/TimeInput/TimeInput.test.tsx +37 -0
  570. package/src/TimeInput/TimeInput.tsx +11 -1
  571. package/src/Timestamp/Timestamp.doc.mjs +1 -1
  572. package/src/Timestamp/Timestamp.test.tsx +52 -0
  573. package/src/Timestamp/Timestamp.tsx +30 -16
  574. package/src/Toast/Toast.tsx +11 -3
  575. package/src/Toast/ToastViewport.test.tsx +64 -0
  576. package/src/Toast/ToastViewport.tsx +12 -0
  577. package/src/Toast/useToast.test.tsx +258 -0
  578. package/src/Toast/useToast.tsx +41 -0
  579. package/src/ToggleButton/ToggleButton.doc.mjs +1 -0
  580. package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
  581. package/src/Tokenizer/Tokenizer.test.tsx +54 -0
  582. package/src/Tokenizer/Tokenizer.tsx +5 -4
  583. package/src/Tooltip/Tooltip.doc.mjs +6 -6
  584. package/src/Tooltip/useTooltip.doc.mjs +5 -5
  585. package/src/Tooltip/useTooltip.tsx +12 -2
  586. package/src/TopNav/TopNav.doc.mjs +1 -1
  587. package/src/TopNav/TopNav.test.tsx +23 -7
  588. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +9 -2
  589. package/src/TreeList/TreeList.doc.mjs +2 -2
  590. package/src/Typeahead/BaseTypeahead.doc.mjs +19 -0
  591. package/src/Typeahead/BaseTypeahead.tsx +5 -2
  592. package/src/Typeahead/Typeahead.doc.mjs +1 -1
  593. package/src/Typeahead/Typeahead.test.tsx +45 -1
  594. package/src/VisuallyHidden/VisuallyHidden.tsx +0 -3
  595. package/src/__tests__/TestIcon.tsx +26 -0
  596. package/src/__tests__/fastRoleQueries.ts +66 -0
  597. package/src/docPropReferences.test.ts +178 -0
  598. package/src/docs-types.ts +9 -1
  599. package/src/hooks/focusableSelector.ts +1 -1
  600. package/src/hooks/index.ts +3 -0
  601. package/src/hooks/useFocusTrap.doc.mjs +4 -2
  602. package/src/hooks/useFocusTrap.test.tsx +149 -1
  603. package/src/hooks/useFocusTrap.ts +50 -1
  604. package/src/hooks/useHotkeys.doc.mjs +52 -0
  605. package/src/hooks/useHotkeys.test.ts +245 -0
  606. package/src/hooks/useHotkeys.ts +203 -0
  607. package/src/hooks/useInteractiveRole.ts +12 -4
  608. package/src/hooks/useStreamingText.test.ts +54 -19
  609. package/src/hooks/useStreamingText.ts +16 -5
  610. package/src/hooks/useTreeFocus.test.tsx +1 -3
  611. package/src/reset.css +29 -0
  612. package/src/theme/SyntaxTheme.doc.mjs +4 -4
  613. package/src/theme/defineTheme.ts +4 -13
  614. package/src/theme/derivedVarRegistry.test.ts +2 -2
  615. package/src/theme/expandColorScale.test.ts +29 -0
  616. package/src/theme/expandColorScale.ts +11 -6
  617. package/src/theme/hct.ts +9 -17
  618. package/src/theme/themingTargets.test.ts +353 -0
  619. package/src/theme/tokens.test.ts +182 -9
  620. package/src/theme/tokens.ts +239 -4
  621. package/src/theme/useTheme.test.tsx +126 -2
  622. package/src/theme/useTheme.ts +87 -6
  623. package/src/utils/color.test.ts +133 -0
  624. package/src/utils/color.ts +148 -0
  625. package/src/utils/composeEventHandlers.test.ts +71 -0
  626. package/src/utils/composeEventHandlers.ts +44 -0
  627. package/src/utils/index.ts +4 -0
  628. package/src/utils/mergeProps.test.ts +166 -0
  629. package/src/utils/sharedResizeObserver.test.ts +2 -2
  630. package/src/utils/timeParser.test.ts +13 -0
  631. package/src/utils/timeParser.ts +8 -5
  632. package/dist/Carousel/carousel.markers.stylex.d.ts +0 -7
  633. package/dist/Carousel/carousel.markers.stylex.d.ts.map +0 -1
  634. package/dist/Carousel/carousel.markers.stylex.js +0 -12
  635. package/src/Carousel/carousel.markers.stylex.ts +0 -10
@@ -0,0 +1,353 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /* eslint-disable @typescript-eslint/no-require-imports */
4
+ /**
5
+ * @file Guards `theming.targets` against the real `themeProps()` call sites (#3741).
6
+ * @input Component sources (*.tsx/*.ts) and their `{Name}.doc.mjs` files.
7
+ * @output Vitest failures naming each undocumented class / visual prop.
8
+ * @position Sibling of derivedVarRegistry.test.ts, which already validates the
9
+ * OTHER fields of the same `theming` block (`vars`, `derived`). `targets` was
10
+ * the one field with no machine check, so it drifted — twice (#3652, #3680).
11
+ *
12
+ * `theming.targets` is the documented CSS surface of a component: the stable
13
+ * `astryx-*` classes it renders and the visual props it reflects as data
14
+ * attributes. It is hand-authored, while the truth lives in `themeProps()`
15
+ * calls in the source. Nothing kept the two in agreement.
16
+ *
17
+ * Drift is not cosmetic. `targets` is what theme authors and codegen read to
18
+ * learn which selectors exist; an undocumented class is an unthemeable element.
19
+ *
20
+ * Policy is SUBSET, not equality: every class rendered by `themeProps()` must be
21
+ * documented, and every prop key passed to it must appear in that target's
22
+ * `visualProps` or `states`. Docs may list MORE than the source passes —
23
+ * components forward props they don't themselves reflect (Timestamp passes
24
+ * `{format}` but documents `type`/`color`/`format`), and that is intentional.
25
+ */
26
+
27
+ import {describe, it, expect} from 'vitest';
28
+ import {readdirSync, readFileSync} from 'node:fs';
29
+ import {join} from 'node:path';
30
+ import ts from 'typescript';
31
+ import {stableClassName} from '../naming';
32
+
33
+ const SRC_DIR = join(__dirname, '..');
34
+
35
+ // ---------------------------------------------------------------------------
36
+ // Source scanning: find themeProps() call sites via the TypeScript AST
37
+ // ---------------------------------------------------------------------------
38
+
39
+ interface ThemeTargetSite {
40
+ /** Full stable class, e.g. 'astryx-progressbar-fill'. */
41
+ className: string;
42
+ /** Keys of the object literal passed as the 2nd arg (may be empty). */
43
+ propKeys: string[];
44
+ /** True when the 2nd arg exists but its keys can't be read statically. */
45
+ isOpaque: boolean;
46
+ }
47
+
48
+ /**
49
+ * Extract every `themeProps('name', {...})` call from a source file.
50
+ *
51
+ * Uses the AST rather than a regex because the call sites use every object
52
+ * form: shorthand (`{variant}`), renamed (`{variant: fillVariant}` — the KEY is
53
+ * the prop, not the value), and multi-line. A regex reading identifiers after
54
+ * `:` would record `fillVariant`, a prop that does not exist.
55
+ */
56
+ function extractThemeTargets(
57
+ sourceText: string,
58
+ fileName = 'source.tsx',
59
+ ): ThemeTargetSite[] {
60
+ const sourceFile = ts.createSourceFile(
61
+ fileName,
62
+ sourceText,
63
+ ts.ScriptTarget.Latest,
64
+ /* setParentNodes */ true,
65
+ fileName.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS,
66
+ );
67
+
68
+ const sites: ThemeTargetSite[] = [];
69
+
70
+ const visit = (node: ts.Node): void => {
71
+ if (
72
+ ts.isCallExpression(node) &&
73
+ ts.isIdentifier(node.expression) &&
74
+ node.expression.text === 'themeProps'
75
+ ) {
76
+ const [nameArg, propsArg] = node.arguments;
77
+
78
+ // Only string-literal component names are resolvable. A dynamic name
79
+ // can't be checked statically; skip rather than guess.
80
+ if (nameArg != null && ts.isStringLiteralLike(nameArg)) {
81
+ const site: ThemeTargetSite = {
82
+ className: stableClassName(nameArg.text),
83
+ propKeys: [],
84
+ isOpaque: false,
85
+ };
86
+
87
+ if (propsArg != null) {
88
+ if (ts.isObjectLiteralExpression(propsArg)) {
89
+ for (const prop of propsArg.properties) {
90
+ if (ts.isSpreadAssignment(prop)) {
91
+ // {...rest} — keys unknown at parse time.
92
+ site.isOpaque = true;
93
+ continue;
94
+ }
95
+ const name = prop.name;
96
+ if (name == null) {
97
+ site.isOpaque = true;
98
+ continue;
99
+ }
100
+ if (ts.isIdentifier(name) || ts.isStringLiteralLike(name)) {
101
+ site.propKeys.push(name.text);
102
+ } else {
103
+ // Computed key: themeProps('x', {[k]: v})
104
+ site.isOpaque = true;
105
+ }
106
+ }
107
+ } else {
108
+ // A variable or call passed as the props bag.
109
+ site.isOpaque = true;
110
+ }
111
+ }
112
+
113
+ sites.push(site);
114
+ }
115
+ }
116
+
117
+ ts.forEachChild(node, visit);
118
+ };
119
+
120
+ visit(sourceFile);
121
+ return sites;
122
+ }
123
+
124
+ // ---------------------------------------------------------------------------
125
+ // The extractor must be right before its verdicts mean anything.
126
+ // ---------------------------------------------------------------------------
127
+
128
+ describe('extractThemeTargets', () => {
129
+ it('reads a bare call with no props', () => {
130
+ expect(extractThemeTargets(`themeProps('progressbar-track')`)).toEqual([
131
+ {className: 'astryx-progressbar-track', propKeys: [], isOpaque: false},
132
+ ]);
133
+ });
134
+
135
+ it('reads shorthand props', () => {
136
+ expect(extractThemeTargets(`themeProps('progressbar', {variant})`)).toEqual(
137
+ [
138
+ {
139
+ className: 'astryx-progressbar',
140
+ propKeys: ['variant'],
141
+ isOpaque: false,
142
+ },
143
+ ],
144
+ );
145
+ });
146
+
147
+ it('records the KEY, not the value, when a prop is renamed', () => {
148
+ // The trap a regex falls into: `fillVariant` is a local, not a prop.
149
+ expect(
150
+ extractThemeTargets(
151
+ `themeProps('progressbar-fill', {variant: fillVariant})`,
152
+ ),
153
+ ).toEqual([
154
+ {
155
+ className: 'astryx-progressbar-fill',
156
+ propKeys: ['variant'],
157
+ isOpaque: false,
158
+ },
159
+ ]);
160
+ });
161
+
162
+ it('reads multi-line object literals', () => {
163
+ const src = `
164
+ const p = themeProps('outline', {
165
+ variant,
166
+ size: resolvedSize,
167
+ });
168
+ `;
169
+ expect(extractThemeTargets(src)).toEqual([
170
+ {
171
+ className: 'astryx-outline',
172
+ propKeys: ['variant', 'size'],
173
+ isOpaque: false,
174
+ },
175
+ ]);
176
+ });
177
+
178
+ it('reads a call whose result is immediately accessed', () => {
179
+ // Table does `themeProps('table').className` — still a rendered class.
180
+ expect(extractThemeTargets(`themeProps('table').className`)).toEqual([
181
+ {className: 'astryx-table', propKeys: [], isOpaque: false},
182
+ ]);
183
+ });
184
+
185
+ it('finds every call in a file', () => {
186
+ const src = `
187
+ <div {...themeProps('card', {variant})}>
188
+ <span {...themeProps('card-header')} />
189
+ </div>
190
+ `;
191
+ expect(extractThemeTargets(src).map(s => s.className)).toEqual([
192
+ 'astryx-card',
193
+ 'astryx-card-header',
194
+ ]);
195
+ });
196
+
197
+ it('marks a spread props bag opaque rather than guessing its keys', () => {
198
+ const [site] = extractThemeTargets(`themeProps('card', {...rest})`);
199
+ expect(site.isOpaque).toBe(true);
200
+ expect(site.propKeys).toEqual([]);
201
+ });
202
+
203
+ it('marks a non-literal props bag opaque', () => {
204
+ const [site] = extractThemeTargets(`themeProps('card', visualProps)`);
205
+ expect(site.isOpaque).toBe(true);
206
+ });
207
+
208
+ it('ignores a dynamic component name it cannot resolve', () => {
209
+ expect(extractThemeTargets(`themeProps(name, {variant})`)).toEqual([]);
210
+ });
211
+
212
+ it('ignores an unrelated function of a similar shape', () => {
213
+ expect(extractThemeTargets(`stylex.props('card', {variant})`)).toEqual([]);
214
+ });
215
+ });
216
+
217
+ // ---------------------------------------------------------------------------
218
+ // Discovery: every component dir's rendered classes vs its documented targets
219
+ // ---------------------------------------------------------------------------
220
+
221
+ interface DocTarget {
222
+ className: string;
223
+ visualProps?: string[];
224
+ states?: string[];
225
+ }
226
+
227
+ type DocBlock = {theming?: {targets?: DocTarget[]}};
228
+ type ComponentDocModule = {docs?: DocBlock; docsZh?: DocBlock};
229
+
230
+ interface ComponentInfo {
231
+ dir: string;
232
+ sites: ThemeTargetSite[];
233
+ /** The doc blocks that carry theming.targets, by the key they live under. */
234
+ docBlocks: {key: 'docs' | 'docsZh'; targets: DocTarget[]}[];
235
+ }
236
+
237
+ function discoverComponents(): ComponentInfo[] {
238
+ const results: ComponentInfo[] = [];
239
+ const dirs = readdirSync(SRC_DIR, {withFileTypes: true})
240
+ .filter(d => d.isDirectory())
241
+ .map(d => d.name);
242
+
243
+ for (const dir of dirs) {
244
+ const dirPath = join(SRC_DIR, dir);
245
+ const dirEntries = readdirSync(dirPath);
246
+
247
+ const sourceFiles = dirEntries.filter(
248
+ f =>
249
+ (f.endsWith('.tsx') || f.endsWith('.ts')) &&
250
+ !f.includes('.test.') &&
251
+ !f.endsWith('.d.ts'),
252
+ );
253
+
254
+ const sites: ThemeTargetSite[] = [];
255
+ for (const f of sourceFiles) {
256
+ const filePath = join(dirPath, f);
257
+ sites.push(
258
+ ...extractThemeTargets(readFileSync(filePath, 'utf-8'), filePath),
259
+ );
260
+ }
261
+ if (sites.length === 0) {
262
+ continue;
263
+ }
264
+
265
+ // Match the on-disk listing rather than existsSync: on case-insensitive
266
+ // filesystems existsSync would match a differently-cased doc file that CI
267
+ // never checks. (Same guard as derivedVarRegistry.test.ts.)
268
+ if (!dirEntries.includes(`${dir}.doc.mjs`)) {
269
+ continue;
270
+ }
271
+
272
+ let mod: ComponentDocModule;
273
+ try {
274
+ mod = require(join(dirPath, `${dir}.doc.mjs`)) as ComponentDocModule;
275
+ } catch {
276
+ continue;
277
+ }
278
+
279
+ const docBlocks: ComponentInfo['docBlocks'] = [];
280
+ for (const key of ['docs', 'docsZh'] as const) {
281
+ const targets = mod[key]?.theming?.targets;
282
+ // Only blocks that already document a theming surface are held to it —
283
+ // a doc with no theming block at all is a separate (documentation) gap.
284
+ if (targets != null) {
285
+ docBlocks.push({key, targets});
286
+ }
287
+ }
288
+ if (docBlocks.length === 0) {
289
+ continue;
290
+ }
291
+
292
+ results.push({dir, sites, docBlocks});
293
+ }
294
+ return results;
295
+ }
296
+
297
+ // ---------------------------------------------------------------------------
298
+ // The guard
299
+ // ---------------------------------------------------------------------------
300
+
301
+ describe('theming.targets matches the themeProps() call sites', () => {
302
+ const components = discoverComponents();
303
+
304
+ it('finds components to check', () => {
305
+ // A refactor that renames themeProps must not silently disable this file.
306
+ expect(components.length).toBeGreaterThan(0);
307
+ });
308
+
309
+ for (const {dir, sites, docBlocks} of components) {
310
+ const renderedClasses = [...new Set(sites.map(s => s.className))].sort();
311
+
312
+ for (const {key, targets} of docBlocks) {
313
+ const documented = new Set(targets.map(t => t.className));
314
+
315
+ it(`${dir} (${key}): every rendered class is documented`, () => {
316
+ const undocumented = renderedClasses.filter(c => !documented.has(c));
317
+ expect(
318
+ undocumented,
319
+ `${dir} renders ${undocumented.length} astryx-* class(es) that ` +
320
+ `${dir}.doc.mjs ${key}.theming.targets does not document: ` +
321
+ `${undocumented.join(', ')}. An undocumented class is an ` +
322
+ `unthemeable element — theme authors and codegen read targets[] ` +
323
+ `to learn which selectors exist. Add {className: '...'} entries.`,
324
+ ).toEqual([]);
325
+ });
326
+
327
+ it(`${dir} (${key}): every visual prop passed to themeProps is documented`, () => {
328
+ const missing: string[] = [];
329
+ for (const site of sites) {
330
+ const target = targets.find(t => t.className === site.className);
331
+ if (target == null) {
332
+ continue; // Reported by the class test above.
333
+ }
334
+ const known = new Set([
335
+ ...(target.visualProps || []),
336
+ ...(target.states || []),
337
+ ]);
338
+ for (const propKey of site.propKeys) {
339
+ if (!known.has(propKey)) {
340
+ missing.push(`${site.className}: ${propKey}`);
341
+ }
342
+ }
343
+ }
344
+ expect(
345
+ [...new Set(missing)],
346
+ `${dir} passes prop keys to themeProps() that ${dir}.doc.mjs ` +
347
+ `${key}.theming.targets does not list under visualProps/states. ` +
348
+ `Each one is a [data-*] selector consumers cannot discover.`,
349
+ ).toEqual([]);
350
+ });
351
+ }
352
+ }
353
+ });
@@ -20,9 +20,7 @@ const testTheme = defineTheme({
20
20
 
21
21
  describe('tokenVar', () => {
22
22
  it('returns a CSS var() reference for known token names', () => {
23
- expect(tokenVar('--color-text-primary')).toBe(
24
- 'var(--color-text-primary)',
25
- );
23
+ expect(tokenVar('--color-text-primary')).toBe('var(--color-text-primary)');
26
24
  });
27
25
 
28
26
  it('returns a CSS var() reference for custom token names', () => {
@@ -32,9 +30,7 @@ describe('tokenVar', () => {
32
30
 
33
31
  describe('tokenVars', () => {
34
32
  it('contains var() references for known tokens', () => {
35
- expect(tokenVars['--color-text-primary']).toBe(
36
- 'var(--color-text-primary)',
37
- );
33
+ expect(tokenVars['--color-text-primary']).toBe('var(--color-text-primary)');
38
34
  expect(tokenVars['--spacing-4']).toBe('var(--spacing-4)');
39
35
  });
40
36
  });
@@ -87,9 +83,9 @@ describe('resolveThemeTokens', () => {
87
83
 
88
84
  describe('resolveThemeToken', () => {
89
85
  it('resolves one token', () => {
90
- expect(
91
- resolveThemeToken(testTheme, '--color-accent', {mode: 'dark'}),
92
- ).toBe('#FF5555');
86
+ expect(resolveThemeToken(testTheme, '--color-accent', {mode: 'dark'})).toBe(
87
+ '#FF5555',
88
+ );
93
89
  });
94
90
 
95
91
  it('returns fallback for unknown token names', () => {
@@ -107,3 +103,180 @@ describe('resolveThemeToken', () => {
107
103
  ).toBe('');
108
104
  });
109
105
  });
106
+
107
+ describe('resolveThemeTokens — reference resolution', () => {
108
+ it('resolves a token that references another token to a raw value', () => {
109
+ const theme = defineTheme({
110
+ name: 'ref',
111
+ tokens: {
112
+ '--color-accent': ['#0058D2', '#BBC2FF'],
113
+ '--color-text-accent': 'var(--color-accent)',
114
+ },
115
+ });
116
+
117
+ const light = resolveThemeTokens(theme, {mode: 'light'});
118
+ const dark = resolveThemeTokens(theme, {mode: 'dark'});
119
+
120
+ expect(light['--color-text-accent']).toBe('#0058D2');
121
+ expect(dark['--color-text-accent']).toBe('#BBC2FF');
122
+ });
123
+
124
+ it('resolves reference chains iteratively', () => {
125
+ const theme = defineTheme({
126
+ name: 'chain',
127
+ tokens: {
128
+ '--color-accent': ['#112233', '#445566'],
129
+ '--color-icon-accent': 'var(--color-accent)',
130
+ '--color-text-accent': 'var(--color-icon-accent)',
131
+ },
132
+ });
133
+
134
+ const light = resolveThemeTokens(theme, {mode: 'light'});
135
+ expect(light['--color-icon-accent']).toBe('#112233');
136
+ expect(light['--color-text-accent']).toBe('#112233');
137
+ });
138
+
139
+ it('uses the var() fallback when the referenced token is unknown', () => {
140
+ const theme = defineTheme({
141
+ name: 'fallback',
142
+ tokens: {
143
+ '--color-text-accent': 'var(--not-a-token, #ABCDEF)',
144
+ },
145
+ });
146
+
147
+ const tokens = resolveThemeTokens(theme, {mode: 'light'});
148
+ expect(tokens['--color-text-accent']).toBe('#ABCDEF');
149
+ });
150
+
151
+ it('leaves an unresolvable reference as a literal var()', () => {
152
+ const theme = defineTheme({
153
+ name: 'unresolvable',
154
+ tokens: {
155
+ '--color-text-accent': 'var(--not-a-token)',
156
+ },
157
+ });
158
+
159
+ const tokens = resolveThemeTokens(theme, {mode: 'light'});
160
+ expect(tokens['--color-text-accent']).toBe('var(--not-a-token)');
161
+ });
162
+
163
+ it('does not loop forever on a reference cycle', () => {
164
+ const theme = defineTheme({
165
+ name: 'cycle',
166
+ tokens: {
167
+ '--color-text-accent': 'var(--color-icon-accent)',
168
+ '--color-icon-accent': 'var(--color-text-accent)',
169
+ },
170
+ });
171
+
172
+ const tokens = resolveThemeTokens(theme, {mode: 'light'});
173
+ // The cycle collapses to a literal reference rather than hanging.
174
+ expect(tokens['--color-text-accent']).toContain('var(');
175
+ expect(tokens['--color-icon-accent']).toContain('var(');
176
+ });
177
+ });
178
+
179
+ describe('resolveThemeTokens — CSS color functions', () => {
180
+ it('evaluates color-mix with transparent to an rgba() value', () => {
181
+ const theme = defineTheme({
182
+ name: 'mix',
183
+ tokens: {
184
+ '--color-accent': ['#0058D2', '#BBC2FF'],
185
+ '--color-accent-muted':
186
+ 'color-mix(in srgb, var(--color-accent) 20%, transparent)',
187
+ },
188
+ });
189
+
190
+ const light = resolveThemeTokens(theme, {mode: 'light'});
191
+ const dark = resolveThemeTokens(theme, {mode: 'dark'});
192
+
193
+ expect(light['--color-accent-muted']).toBe('rgba(0, 88, 210, 0.2)');
194
+ expect(dark['--color-accent-muted']).toBe('rgba(187, 194, 255, 0.2)');
195
+ });
196
+
197
+ it('resolves the muted token inside a light-dark() tuple per mode', () => {
198
+ const theme = defineTheme({
199
+ name: 'ld-mix',
200
+ tokens: {
201
+ '--color-accent': ['#FF0000', '#00FF00'],
202
+ '--color-accent-muted': [
203
+ 'color-mix(in srgb, var(--color-accent) 20%, transparent)',
204
+ 'color-mix(in srgb, var(--color-accent) 25%, transparent)',
205
+ ],
206
+ },
207
+ });
208
+
209
+ const light = resolveThemeTokens(theme, {mode: 'light'});
210
+ const dark = resolveThemeTokens(theme, {mode: 'dark'});
211
+
212
+ expect(light['--color-accent-muted']).toBe('rgba(255, 0, 0, 0.2)');
213
+ expect(dark['--color-accent-muted']).toBe('rgba(0, 255, 0, 0.25)');
214
+ });
215
+
216
+ it('mixes two opaque colors by weight', () => {
217
+ const theme = defineTheme({
218
+ name: 'two-color',
219
+ tokens: {
220
+ '--color-neutral': 'color-mix(in srgb, #000000, #FFFFFF)',
221
+ },
222
+ });
223
+
224
+ const tokens = resolveThemeTokens(theme, {mode: 'light'});
225
+ expect(tokens['--color-neutral']).toBe('#808080');
226
+ });
227
+
228
+ it('mixes two opaque colors with an explicit percentage', () => {
229
+ const theme = defineTheme({
230
+ name: 'weighted',
231
+ tokens: {
232
+ '--color-neutral': 'color-mix(in srgb, #000000 25%, #FFFFFF)',
233
+ },
234
+ });
235
+
236
+ const tokens = resolveThemeTokens(theme, {mode: 'light'});
237
+ expect(tokens['--color-neutral']).toBe('#BFBFBF');
238
+ });
239
+
240
+ it('preserves an unsupported color space rather than guessing', () => {
241
+ const theme = defineTheme({
242
+ name: 'oklab',
243
+ tokens: {
244
+ '--color-accent': ['#0058D2', '#BBC2FF'],
245
+ '--color-neutral':
246
+ 'color-mix(in oklab, var(--color-accent), black 15%)',
247
+ },
248
+ });
249
+
250
+ const tokens = resolveThemeTokens(theme, {mode: 'light'});
251
+ // var() still resolves; the unsupported mix stays as a color-mix() expression.
252
+ expect(tokens['--color-neutral']).toContain('color-mix(in oklab');
253
+ expect(tokens['--color-neutral']).toContain('#0058D2');
254
+ });
255
+ });
256
+
257
+ describe('resolveThemeTokens — generated themes end to end', () => {
258
+ it('resolves derived accent tokens from defineTheme({color}) to raw values', () => {
259
+ const theme = defineTheme({name: 'brand', color: {accent: '#0064E0'}});
260
+
261
+ const light = resolveThemeTokens(theme, {mode: 'light'});
262
+ const dark = resolveThemeTokens(theme, {mode: 'dark'});
263
+
264
+ const isConcreteColor = (value: string): boolean => /^(#|rgb)/.test(value);
265
+
266
+ for (const key of [
267
+ '--color-accent',
268
+ '--color-text-accent',
269
+ '--color-icon-accent',
270
+ '--color-accent-muted',
271
+ ]) {
272
+ expect(isConcreteColor(light[key])).toBe(true);
273
+ expect(isConcreteColor(dark[key])).toBe(true);
274
+ expect(light[key]).not.toContain('var(');
275
+ expect(light[key]).not.toContain('color-mix');
276
+ }
277
+
278
+ // The derived accent tokens resolve to the base accent.
279
+ expect(light['--color-text-accent']).toBe(light['--color-accent']);
280
+ expect(light['--color-icon-accent']).toBe(light['--color-accent']);
281
+ });
282
+ });