@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
@@ -14,6 +14,8 @@ import {render, screen, fireEvent} from '@testing-library/react';
14
14
  import userEvent from '@testing-library/user-event';
15
15
  import {TreeList} from './TreeList';
16
16
  import type {TreeListItemData} from './TreeListTypes';
17
+ import {defineTheme} from '../theme/defineTheme';
18
+ import {generateThemeCSSFlat} from '../theme/generateThemeRules';
17
19
 
18
20
  const simpleItems: TreeListItemData[] = [
19
21
  {id: 'a', label: 'Item A'},
@@ -393,6 +395,115 @@ describe('TreeList', () => {
393
395
  expect(screen.getByRole('tree')).toBeInTheDocument();
394
396
  });
395
397
 
398
+ // ===========================================================================
399
+ // Variant (guide lines)
400
+ // ===========================================================================
401
+
402
+ describe('variant', () => {
403
+ it('renders guide lines by default', () => {
404
+ const {container} = render(<TreeList items={nestedItemsExpanded} />);
405
+ expect(container.querySelector('.astryx-tree-list-guide')).not.toBeNull();
406
+ });
407
+
408
+ it("variant='lineGuides' renders guide lines (explicit == default)", () => {
409
+ const {container} = render(
410
+ <TreeList items={nestedItemsExpanded} variant="lineGuides" />,
411
+ );
412
+ expect(container.querySelector('.astryx-tree-list-guide')).not.toBeNull();
413
+ });
414
+
415
+ it("variant='noGuides' renders NO guide lines", () => {
416
+ const {container} = render(
417
+ <TreeList items={nestedItemsExpanded} variant="noGuides" />,
418
+ );
419
+ expect(container.querySelector('.astryx-tree-list-guide')).toBeNull();
420
+ });
421
+
422
+ it("variant='noGuides' preserves the tree structure and items", () => {
423
+ render(<TreeList items={nestedItemsExpanded} variant="noGuides" />);
424
+ // Rows, roles, and nesting are all intact — only the connectors are gone.
425
+ expect(screen.getByRole('tree')).toBeInTheDocument();
426
+ expect(screen.getAllByRole('treeitem')).toHaveLength(4);
427
+ expect(screen.getByText('Parent')).toBeInTheDocument();
428
+ expect(screen.getByText('Child 1')).toBeInTheDocument();
429
+ expect(screen.getByText('Child 2')).toBeInTheDocument();
430
+ expect(screen.getByText('Sibling')).toBeInTheDocument();
431
+ });
432
+
433
+ it("variant='noGuides' preserves per-level indentation on the rows", () => {
434
+ // Indentation lives on the row's marginLeft (not the guide element), so
435
+ // it must survive when the connectors are suppressed. A deeper row is
436
+ // indented more than a shallower one.
437
+ const {container} = render(
438
+ <TreeList items={deepItems} variant="noGuides" />,
439
+ );
440
+ const marginOf = (text: string): string => {
441
+ const li = screen.getByText(text).closest('li')!;
442
+ const styled = li.querySelector('[style*="margin-left"]');
443
+ return styled?.getAttribute('style') ?? '';
444
+ };
445
+ // Guides are gone…
446
+ expect(container.querySelector('.astryx-tree-list-guide')).toBeNull();
447
+ // …but each level still carries an inline margin-left, and the level
448
+ // multiplier grows with depth (0, 1, 2).
449
+ expect(marginOf('Root')).toContain('margin-left');
450
+ expect(marginOf('Mid')).toContain('margin-left');
451
+ expect(marginOf('Leaf')).toContain('margin-left');
452
+ const level = (text: string): number => {
453
+ const m = /calc\((\d+)/.exec(marginOf(text));
454
+ return m ? Number(m[1]) : NaN;
455
+ };
456
+ expect(level('Mid')).toBeGreaterThan(level('Root'));
457
+ expect(level('Leaf')).toBeGreaterThan(level('Mid'));
458
+ });
459
+ });
460
+
461
+ // ===========================================================================
462
+ // Guide theme target
463
+ // ===========================================================================
464
+
465
+ describe('guide theme target', () => {
466
+ it('renders the astryx-tree-list-guide target on the connector lines', () => {
467
+ const {container} = render(<TreeList items={nestedItemsExpanded} />);
468
+ const guide = container.querySelector('.astryx-tree-list-guide');
469
+ // A dedicated, stable target so a theme can recolor or hide the guides
470
+ // without hiding the built-in connectors and reimplementing them.
471
+ expect(guide).not.toBeNull();
472
+ });
473
+
474
+ it('exposes tree-list-guide as a themeable defineTheme target', () => {
475
+ // jsdom cannot resolve the @layer cascade, so the generated CSS is what
476
+ // proves a theme override reaches the guide element.
477
+ const theme = defineTheme({
478
+ name: 'tree-list-guide-test',
479
+ components: {
480
+ 'tree-list-guide': {
481
+ base: {backgroundColor: 'var(--color-accent)'},
482
+ },
483
+ },
484
+ });
485
+ const css = generateThemeCSSFlat(theme);
486
+ expect(css).toContain('.astryx-tree-list-guide {');
487
+ expect(css).toContain('background-color: var(--color-accent)');
488
+ });
489
+
490
+ it('lets a theme hide the guides via display: none on the target', () => {
491
+ // Hiding the guides is done through the theme target, not a prop — the
492
+ // theme rule lands in @layer astryx-theme, above StyleX's base layer.
493
+ const theme = defineTheme({
494
+ name: 'tree-list-guide-hidden-test',
495
+ components: {
496
+ 'tree-list-guide': {
497
+ base: {display: 'none'},
498
+ },
499
+ },
500
+ });
501
+ const css = generateThemeCSSFlat(theme);
502
+ expect(css).toContain('.astryx-tree-list-guide {');
503
+ expect(css).toContain('display: none');
504
+ });
505
+ });
506
+
396
507
  // ===========================================================================
397
508
  // xds class name
398
509
  // ===========================================================================
@@ -403,6 +514,127 @@ describe('TreeList', () => {
403
514
  expect(root.className).toContain('astryx-tree-list');
404
515
  });
405
516
 
517
+ // ===========================================================================
518
+ // Chevron theme target
519
+ // ===========================================================================
520
+
521
+ describe('chevron theme target', () => {
522
+ it('renders the astryx-tree-list-chevron target on the toggle button', () => {
523
+ render(<TreeList items={nestedItems} />);
524
+ const toggle = screen
525
+ .getByText('Parent')
526
+ .closest('li')!
527
+ .querySelector('[data-tree-toggle]')!;
528
+
529
+ // Dedicated, stable theme target on the expand/collapse control, so a
530
+ // theme can restyle the chevron without a fragile [data-tree-toggle] hook.
531
+ expect(toggle).toHaveClass('astryx-tree-list-chevron');
532
+ // Open/closed state is reflected so a theme can target each state alone.
533
+ expect(toggle).toHaveAttribute('data-state', 'collapsed');
534
+ });
535
+
536
+ it('reflects the expanded state on the toggle when open', () => {
537
+ render(<TreeList items={nestedItemsExpanded} />);
538
+ const toggle = screen
539
+ .getByText('Parent')
540
+ .closest('li')!
541
+ .querySelector('[data-tree-toggle]')!;
542
+
543
+ expect(toggle).toHaveClass('astryx-tree-list-chevron');
544
+ expect(toggle).toHaveAttribute('data-state', 'expanded');
545
+ });
546
+
547
+ it('keeps the functional data-tree-toggle hook alongside the new target', () => {
548
+ // The theme target is additive — the toggle is still a real <button> and
549
+ // still carries the functional activation attribute TreeList relies on.
550
+ render(<TreeList items={nestedItems} />);
551
+ const toggle = screen
552
+ .getByText('Parent')
553
+ .closest('li')!
554
+ .querySelector('[data-tree-toggle]')!;
555
+ expect(toggle.tagName).toBe('BUTTON');
556
+ expect(toggle).toHaveAttribute('data-tree-toggle');
557
+ });
558
+
559
+ it('exposes tree-list-chevron as a themeable defineTheme target', () => {
560
+ // The generated CSS is what proves the target is reachable by a theme:
561
+ // jsdom cannot resolve the @layer cascade, so the DOM-class assertions
562
+ // above and this generation assertion together cover the seam.
563
+ const theme = defineTheme({
564
+ name: 'tree-list-chevron-test',
565
+ components: {
566
+ 'tree-list-chevron': {
567
+ base: {color: 'var(--color-accent)'},
568
+ 'state:expanded': {color: 'var(--color-text-primary)'},
569
+ },
570
+ },
571
+ });
572
+ const css = generateThemeCSSFlat(theme);
573
+ expect(css).toContain('.astryx-tree-list-chevron {');
574
+ expect(css).toContain('color: var(--color-accent)');
575
+ expect(css).toContain('.astryx-tree-list-chevron.expanded');
576
+ expect(css).toContain('color: var(--color-text-primary)');
577
+ });
578
+ });
579
+
580
+ // ===========================================================================
581
+ // Item label theme target
582
+ // ===========================================================================
583
+
584
+ describe('item label theme target', () => {
585
+ it('renders the astryx-tree-list-item-label target on the label span', () => {
586
+ render(<TreeList items={simpleItems} />);
587
+ const label = screen.getByText('Item A');
588
+
589
+ // Dedicated, stable theme target on the label text, so a theme can style
590
+ // just the label without a fragile `button:not([data-tree-toggle]) > span`
591
+ // structural selector.
592
+ expect(label).toHaveClass('astryx-tree-list-item-label');
593
+ // A non-selected item's label carries no selected reflection.
594
+ expect(label).not.toHaveAttribute('data-selected');
595
+ });
596
+
597
+ it('reflects the selected state on the selected item label', () => {
598
+ render(
599
+ <TreeList items={[{id: 'a', label: 'Item A', isSelected: true}]} />,
600
+ );
601
+ const label = screen.getByText('Item A');
602
+ expect(label).toHaveClass('astryx-tree-list-item-label');
603
+ expect(label).toHaveAttribute('data-selected', 'selected');
604
+ });
605
+
606
+ it('keeps the label linked to its row via aria-labelledby', () => {
607
+ // The theme target is additive — the label still owns the id the
608
+ // interactive row references for its accessible name.
609
+ render(
610
+ <TreeList items={[{id: 'a', label: 'Item A', onClick: () => {}}]} />,
611
+ );
612
+ const label = screen.getByText('Item A');
613
+ const action = screen.getByRole('button');
614
+ expect(action).toHaveAttribute('aria-labelledby', label.id);
615
+ });
616
+
617
+ it('exposes tree-list-item-label as a themeable defineTheme target', () => {
618
+ // The generated CSS is what proves the target is reachable by a theme:
619
+ // jsdom cannot resolve the @layer cascade, so the DOM-class assertions
620
+ // above and this generation assertion together cover the seam.
621
+ const theme = defineTheme({
622
+ name: 'tree-list-item-label-test',
623
+ components: {
624
+ 'tree-list-item-label': {
625
+ base: {color: 'var(--color-text-primary)'},
626
+ selected: {fontWeight: 'var(--font-weight-bold)'},
627
+ },
628
+ },
629
+ });
630
+ const css = generateThemeCSSFlat(theme);
631
+ expect(css).toContain('.astryx-tree-list-item-label {');
632
+ expect(css).toContain('color: var(--color-text-primary)');
633
+ expect(css).toContain('.astryx-tree-list-item-label.selected');
634
+ expect(css).toContain('font-weight: var(--font-weight-bold)');
635
+ });
636
+ });
637
+
406
638
  // ===========================================================================
407
639
  // APG structural ARIA (aria-level / aria-posinset / aria-setsize)
408
640
  // ===========================================================================
@@ -21,7 +21,11 @@ import {spacingVars} from '../theme/tokens.stylex';
21
21
  import {mergeProps} from '../utils';
22
22
  import type {BaseProps} from '../BaseProps';
23
23
  import {TreeListItem} from './TreeListItem';
24
- import type {TreeListItemData, TreeListDensity} from './TreeListTypes';
24
+ import type {
25
+ TreeListItemData,
26
+ TreeListDensity,
27
+ TreeListVariant,
28
+ } from './TreeListTypes';
25
29
  import {themeProps} from '../utils/themeProps';
26
30
  import {useTreeFocus} from '../hooks/useTreeFocus';
27
31
 
@@ -29,7 +33,7 @@ import {useTreeFocus} from '../hooks/useTreeFocus';
29
33
  // Types
30
34
  // =============================================================================
31
35
 
32
- export {type TreeListDensity} from './TreeListTypes';
36
+ export {type TreeListDensity, type TreeListVariant} from './TreeListTypes';
33
37
 
34
38
  export interface TreeListProps extends BaseProps<HTMLDivElement> {
35
39
  /** Ref forwarded to the root element */
@@ -50,6 +54,16 @@ export interface TreeListProps extends BaseProps<HTMLDivElement> {
50
54
  */
51
55
  density?: TreeListDensity;
52
56
 
57
+ /**
58
+ * Visual treatment of the hierarchy guide (connector) lines.
59
+ * - `lineGuides`: connector lines between parent and child rows
60
+ * - `noGuides`: no connector lines; indentation alone conveys nesting
61
+ *
62
+ * Orthogonal to `density` (which controls spacing) — the two compose.
63
+ * @default 'lineGuides'
64
+ */
65
+ variant?: TreeListVariant;
66
+
53
67
  /**
54
68
  * Header content rendered above the tree list.
55
69
  * Semantically associated via aria-labelledby.
@@ -156,6 +170,7 @@ function findInitialTabbableId(items: TreeListItemData[]): string | undefined {
156
170
  export function TreeList({
157
171
  items,
158
172
  density = 'balanced',
173
+ variant = 'lineGuides',
159
174
  header,
160
175
  xstyle,
161
176
  className,
@@ -275,6 +290,7 @@ export function TreeList({
275
290
  isExpanded={isExpanded}
276
291
  onToggle={handleToggle}
277
292
  density={density}
293
+ variant={variant}
278
294
  renderedChildren={renderedChildren}
279
295
  posInSet={index + 1}
280
296
  setSize={items.length}
@@ -16,6 +16,7 @@
16
16
  import * as stylex from '@stylexjs/stylex';
17
17
  import {colorVars, spacingVars} from '../theme/tokens.stylex';
18
18
  import {mergeProps} from '../utils';
19
+ import {themeProps} from '../utils/themeProps';
19
20
 
20
21
  const LINE_WIDTH = 1;
21
22
 
@@ -65,6 +66,11 @@ interface TreeListBranchesProps {
65
66
  /**
66
67
  * Renders vertical lines showing parent-child relationships in the tree.
67
68
  * Positioned in a full-height container to span the entire item including children.
69
+ *
70
+ * The line element carries the stable `astryx-tree-list-guide` theme target so a
71
+ * theme can recolor or hide the connectors via `defineTheme` (e.g.
72
+ * `backgroundColor` or `display: 'none'`) instead of hiding the built-in guides
73
+ * and reimplementing them.
68
74
  */
69
75
  export function TreeListBranches({
70
76
  ancestorsIsLast,
@@ -90,7 +96,10 @@ export function TreeListBranches({
90
96
  },
91
97
  })}>
92
98
  <div
93
- {...stylex.props(styles.verticalLine, styles.verticalFull)}
99
+ {...mergeProps(
100
+ themeProps('tree-list-guide'),
101
+ stylex.props(styles.verticalLine, styles.verticalFull),
102
+ )}
94
103
  />
95
104
  </div>
96
105
  )
@@ -103,7 +112,12 @@ export function TreeListBranches({
103
112
  left: `calc(${BRANCH_MARGIN} + ${nestedLevel - 1} * ${LEVEL_INDENT})`,
104
113
  },
105
114
  })}>
106
- <div {...stylex.props(styles.verticalLine, styles.verticalFull)} />
115
+ <div
116
+ {...mergeProps(
117
+ themeProps('tree-list-guide'),
118
+ stylex.props(styles.verticalLine, styles.verticalFull),
119
+ )}
120
+ />
107
121
  </div>
108
122
  )}
109
123
  </>
@@ -28,7 +28,7 @@ import {getIcon} from '../Icon/globalIconRegistry';
28
28
  import {mergeProps} from '../utils';
29
29
  import {useLinkComponent} from '../Link/useLinkComponent';
30
30
  import {TreeListBranches} from './TreeListBranches';
31
- import type {TreeListDensity} from './TreeListTypes';
31
+ import type {TreeListDensity, TreeListVariant} from './TreeListTypes';
32
32
  import {themeProps} from '../utils/themeProps';
33
33
  import {useTranslator} from '../i18n';
34
34
 
@@ -268,6 +268,12 @@ export interface TreeListItemInternalProps {
268
268
  isExpanded: boolean;
269
269
  onToggle?: (id: string) => void;
270
270
  density: TreeListDensity;
271
+ /**
272
+ * Guide-line visual treatment. `noGuides` suppresses the connector lines;
273
+ * indentation is unaffected (it lives on the row's `marginLeft`, not the
274
+ * guide element).
275
+ */
276
+ variant: TreeListVariant;
271
277
  /** Pre-rendered children subtree (rendered by the parent recursion) */
272
278
  renderedChildren?: ReactNode;
273
279
  /** 1-based position of this item among its siblings (aria-posinset). */
@@ -304,6 +310,7 @@ export function TreeListItem({
304
310
  isExpanded,
305
311
  onToggle,
306
312
  density,
313
+ variant,
307
314
  renderedChildren,
308
315
  posInSet,
309
316
  setSize,
@@ -352,7 +359,20 @@ export function TreeListItem({
352
359
 
353
360
  const labelAndDescription = (
354
361
  <>
355
- <span id={labelId} {...stylex.props(styles.label)}>
362
+ <span
363
+ id={labelId}
364
+ {...mergeProps(
365
+ // Stable theme target for the item's label text. The label carries no
366
+ // themeable handle today, so a theme can only reach it through a
367
+ // fragile structural selector (a content button's first span). This
368
+ // adds an `astryx-tree-list-item-label` class and reflects the row's
369
+ // `selected` state so a theme can, e.g., bold just the selected
370
+ // item's label via `defineTheme`.
371
+ themeProps('tree-list-item-label', {
372
+ selected: isSelected ? 'selected' : null,
373
+ }),
374
+ stylex.props(styles.label),
375
+ )}>
356
376
  {label}
357
377
  </span>
358
378
  {description != null && (
@@ -394,12 +414,30 @@ export function TreeListItem({
394
414
  // a separate tab stop. Row-level Enter/Space forwards to this button.
395
415
  tabIndex={-1}
396
416
  onClick={handleToggle}
397
- {...stylex.props(styles.chevronButton)}>
417
+ {...mergeProps(
418
+ // Stable theme target for the expand/collapse control. `data-tree-toggle`
419
+ // stays as the functional activation hook; this adds a themeable
420
+ // `astryx-tree-list-chevron` class and reflects the open/closed state so
421
+ // a theme can restyle the toggle (and each state) without a fragile
422
+ // `[data-tree-toggle]` selector.
423
+ themeProps('tree-list-chevron', {
424
+ state: isExpanded ? 'expanded' : 'collapsed',
425
+ }),
426
+ stylex.props(styles.chevronButton),
427
+ )}>
398
428
  {chevronIcon}
399
429
  </button>
400
430
  ) : (
401
431
  // Non-interactive chevron only when toggling is not wired up at all
402
- <span {...stylex.props(styles.chevronContainer)}>{chevronIcon}</span>
432
+ <span
433
+ {...mergeProps(
434
+ themeProps('tree-list-chevron', {
435
+ state: isExpanded ? 'expanded' : 'collapsed',
436
+ }),
437
+ stylex.props(styles.chevronContainer),
438
+ )}>
439
+ {chevronIcon}
440
+ </span>
403
441
  )
404
442
  ) : null;
405
443
 
@@ -461,13 +499,15 @@ export function TreeListItem({
461
499
  data-tree-level={nestedLevel + 1}
462
500
  data-tree-disabled={isDisabled || undefined}
463
501
  {...stylex.props(styles.wrapper)}>
464
- <div {...stylex.props(styles.treeBranches)}>
465
- <TreeListBranches
466
- ancestorsIsLast={ancestorsIsLast}
467
- isLast={isLast}
468
- nestedLevel={nestedLevel}
469
- />
470
- </div>
502
+ {variant !== 'noGuides' && (
503
+ <div {...stylex.props(styles.treeBranches)}>
504
+ <TreeListBranches
505
+ ancestorsIsLast={ancestorsIsLast}
506
+ isLast={isLast}
507
+ nestedLevel={nestedLevel}
508
+ />
509
+ </div>
510
+ )}
471
511
  <div {...stylex.props(styles.rowWrapper)}>
472
512
  <div
473
513
  {...mergeProps(
@@ -3,7 +3,7 @@
3
3
  /**
4
4
  * @file TreeListTypes.ts
5
5
  * @input Uses React types
6
- * @output Exports TreeListItemData, TreeListDensity types
6
+ * @output Exports TreeListItemData, TreeListDensity, TreeListVariant types
7
7
  * @position Type definitions; consumed by TreeList.tsx, TreeListItem.tsx, index.ts
8
8
  *
9
9
  * SYNC: When modified, update these files to stay in sync:
@@ -16,6 +16,32 @@ import type {ReactNode} from 'react';
16
16
  /** Spacing density for tree list items. */
17
17
  export type TreeListDensity = 'compact' | 'balanced' | 'spacious';
18
18
 
19
+ /**
20
+ * Extensible variant map for TreeList.
21
+ *
22
+ * Theme packages can add custom variants via TypeScript module augmentation:
23
+ * @example
24
+ * ```
25
+ * declare module '@astryxdesign/core/TreeList' {
26
+ * interface TreeListVariantMap {
27
+ * 'dotted': true;
28
+ * }
29
+ * }
30
+ * ```
31
+ */
32
+ export interface TreeListVariantMap {
33
+ lineGuides: true;
34
+ noGuides: true;
35
+ }
36
+
37
+ /**
38
+ * Visual treatment of the hierarchy guide (connector) lines. Extensible via
39
+ * module augmentation of TreeListVariantMap.
40
+ * - `lineGuides`: connector lines between parent and child rows (default)
41
+ * - `noGuides`: no connector lines; indentation alone conveys nesting
42
+ */
43
+ export type TreeListVariant = keyof TreeListVariantMap;
44
+
19
45
  /** Recursive item configuration for TreeList. */
20
46
  export interface TreeListItemData {
21
47
  /** Unique identifier for the item. Used as React key and for expansion tracking. */
@@ -12,5 +12,5 @@
12
12
  */
13
13
 
14
14
  export {TreeList} from './TreeList';
15
- export type {TreeListProps, TreeListDensity} from './TreeList';
16
- export type {TreeListItemData} from './TreeListTypes';
15
+ export type {TreeListProps, TreeListDensity, TreeListVariant} from './TreeList';
16
+ export type {TreeListItemData, TreeListVariantMap} from './TreeListTypes';
@@ -130,9 +130,7 @@ export type AstryxGenericDocInput = AstryxBaseDocInput;
130
130
  * any code referring to the old name.
131
131
  */
132
132
  export type AstryxComponentDoc =
133
- | AstryxComponentDocInput
134
- | AstryxFunctionDocInput
135
- | AstryxGenericDocInput;
133
+ AstryxComponentDocInput | AstryxFunctionDocInput | AstryxGenericDocInput;
136
134
 
137
135
  /**
138
136
  * Author a component doc. Stamp-only: returns the def with `type: 'component'`
package/src/docs-types.ts CHANGED
@@ -669,6 +669,7 @@ export interface TranslationDoc {
669
669
  * @example
670
670
  * ```
671
671
  * { type: 'prose', text: 'Spacing tokens control gap and padding...' }
672
+ * { type: 'heading', level: 3, text: 'Examples' }
672
673
  * { type: 'code', lang: 'tsx', code: 'padding: spacingVars[...]' }
673
674
  * { type: 'table', headers: ['Token', 'Value'], rows: [['--spacing-4', '16px']] }
674
675
  * { type: 'list', style: 'do', items: ['Use semantic tokens'] }
@@ -677,6 +678,7 @@ export interface TranslationDoc {
677
678
  */
678
679
  export type ContentBlock =
679
680
  | {type: 'prose'; text: string}
681
+ | {type: 'heading'; level: 3 | 4 | 5 | 6; text: string}
680
682
  | {type: 'code'; lang: string; code: string; label?: string}
681
683
  | {type: 'table'; headers: string[]; rows: string[][]}
682
684
  | {
@@ -729,6 +731,9 @@ export type TokenPreviewType =
729
731
  export interface ReferenceSection {
730
732
  /** Section title, e.g. "Spacing Tokens", "Light/Dark Mode" */
731
733
  title: string;
734
+ /** Navigation category ('guide' | 'foundations'). Mirrors the parent doc's
735
+ * category so sections can be grouped independently in the docsite nav. */
736
+ category?: string;
732
737
  /** Ordered content blocks. Mix prose, code, tables, and lists freely. */
733
738
  content: ContentBlock[];
734
739
  /** Preview type for token tables in this section. When set, the docsite