@astryxdesign/core 0.1.6 → 0.1.7-canary.04cd8f7

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 (571) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +25 -14
  3. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  4. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  5. package/dist/AlertDialog/AlertDialog.js +4 -1
  6. package/dist/AppShell/AppShell.d.ts.map +1 -1
  7. package/dist/AppShell/AppShell.js +3 -1
  8. package/dist/AvatarGroup/AvatarGroup.d.ts +1 -1
  9. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  10. package/dist/AvatarGroup/AvatarGroup.js +4 -1
  11. package/dist/Banner/Banner.d.ts.map +1 -1
  12. package/dist/Banner/Banner.js +8 -6
  13. package/dist/Breadcrumbs/Breadcrumbs.d.ts +1 -1
  14. package/dist/Breadcrumbs/Breadcrumbs.d.ts.map +1 -1
  15. package/dist/Breadcrumbs/Breadcrumbs.js +4 -1
  16. package/dist/Button/Button.d.ts +10 -2
  17. package/dist/Button/Button.d.ts.map +1 -1
  18. package/dist/Button/Button.js +49 -6
  19. package/dist/ButtonGroup/ButtonGroup.d.ts +20 -5
  20. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  21. package/dist/ButtonGroup/ButtonGroup.js +27 -11
  22. package/dist/Calendar/Calendar.d.ts.map +1 -1
  23. package/dist/Calendar/Calendar.js +29 -7
  24. package/dist/Carousel/Carousel.d.ts +1 -1
  25. package/dist/Carousel/Carousel.d.ts.map +1 -1
  26. package/dist/Carousel/Carousel.js +8 -5
  27. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  28. package/dist/Chat/ChatComposer.js +4 -1
  29. package/dist/Chat/ChatComposerDrawer.d.ts +1 -1
  30. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  31. package/dist/Chat/ChatComposerDrawer.js +9 -2
  32. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  33. package/dist/Chat/ChatComposerInput.js +6 -2
  34. package/dist/Chat/ChatLayout.d.ts +1 -11
  35. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  36. package/dist/Chat/ChatLayout.js +6 -4
  37. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  38. package/dist/Chat/ChatLayoutScrollButton.js +4 -2
  39. package/dist/Chat/ChatMessage.d.ts +1 -1
  40. package/dist/Chat/ChatMessage.d.ts.map +1 -1
  41. package/dist/Chat/ChatMessage.js +8 -2
  42. package/dist/Chat/ChatMessageBubble.d.ts +1 -1
  43. package/dist/Chat/ChatMessageBubble.d.ts.map +1 -1
  44. package/dist/Chat/ChatMessageBubble.js +3 -1
  45. package/dist/Chat/ChatMessageList.d.ts +1 -1
  46. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  47. package/dist/Chat/ChatMessageList.js +3 -1
  48. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  49. package/dist/Chat/ChatMessageMetadata.js +13 -8
  50. package/dist/Chat/ChatPastedTextToken.d.ts.map +1 -1
  51. package/dist/Chat/ChatPastedTextToken.js +3 -1
  52. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  53. package/dist/Chat/ChatSendButton.js +3 -1
  54. package/dist/Chat/index.d.ts +1 -1
  55. package/dist/Chat/index.d.ts.map +1 -1
  56. package/dist/Chat/useChatStreamScroll.d.ts +12 -1
  57. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  58. package/dist/Chat/useChatStreamScroll.js +43 -6
  59. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  60. package/dist/Chat/useSpeechRecognition.js +4 -2
  61. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  62. package/dist/Chat/useTriggerMenu.js +4 -2
  63. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  64. package/dist/CheckboxInput/CheckboxInput.js +4 -2
  65. package/dist/CheckboxList/CheckboxList.d.ts +1 -1
  66. package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
  67. package/dist/CheckboxList/CheckboxList.js +3 -1
  68. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  69. package/dist/CheckboxList/CheckboxListItem.js +3 -1
  70. package/dist/Citation/Citation.d.ts.map +1 -1
  71. package/dist/Citation/Citation.js +10 -2
  72. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  73. package/dist/CodeBlock/CodeBlock.js +71 -53
  74. package/dist/Collapsible/Collapsible.d.ts +11 -1
  75. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  76. package/dist/Collapsible/Collapsible.js +36 -4
  77. package/dist/CommandPalette/CommandPalette.d.ts +1 -1
  78. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  79. package/dist/CommandPalette/CommandPalette.js +8 -3
  80. package/dist/CommandPalette/CommandPaletteInput.d.ts +1 -1
  81. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  82. package/dist/CommandPalette/CommandPaletteInput.js +4 -1
  83. package/dist/CommandPalette/CommandPaletteList.d.ts +1 -1
  84. package/dist/CommandPalette/CommandPaletteList.d.ts.map +1 -1
  85. package/dist/CommandPalette/CommandPaletteList.js +4 -1
  86. package/dist/ContextMenu/ContextMenu.d.ts +1 -1
  87. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  88. package/dist/ContextMenu/ContextMenu.js +8 -4
  89. package/dist/ContextMenu/index.d.ts +3 -0
  90. package/dist/ContextMenu/index.d.ts.map +1 -1
  91. package/dist/ContextMenu/index.js +7 -1
  92. package/dist/DateInput/DateInput.d.ts +1 -1
  93. package/dist/DateInput/DateInput.d.ts.map +1 -1
  94. package/dist/DateInput/DateInput.js +10 -5
  95. package/dist/DateRangeInput/DateRangeInput.d.ts +1 -1
  96. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  97. package/dist/DateRangeInput/DateRangeInput.js +11 -6
  98. package/dist/DateTimeInput/DateTimeInput.d.ts +1 -1
  99. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  100. package/dist/DateTimeInput/DateTimeInput.js +15 -7
  101. package/dist/Dialog/Dialog.d.ts.map +1 -1
  102. package/dist/Dialog/Dialog.js +15 -12
  103. package/dist/Dialog/DialogHeader.d.ts +1 -1
  104. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  105. package/dist/Dialog/DialogHeader.js +7 -3
  106. package/dist/DropdownMenu/DropdownMenu.d.ts +1 -1
  107. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  108. package/dist/DropdownMenu/DropdownMenu.js +19 -9
  109. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +89 -0
  110. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -0
  111. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +170 -0
  112. package/dist/DropdownMenu/DropdownMenuContext.d.ts +17 -1
  113. package/dist/DropdownMenu/DropdownMenuContext.d.ts.map +1 -1
  114. package/dist/DropdownMenu/DropdownMenuContext.js +18 -0
  115. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +69 -0
  116. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -0
  117. package/dist/DropdownMenu/DropdownMenuRadioGroup.js +70 -0
  118. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +69 -0
  119. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -0
  120. package/dist/DropdownMenu/DropdownMenuRadioItem.js +178 -0
  121. package/dist/DropdownMenu/index.d.ts +5 -1
  122. package/dist/DropdownMenu/index.d.ts.map +1 -1
  123. package/dist/DropdownMenu/index.js +10 -1
  124. package/dist/DropdownMenu/menuItemRoles.d.ts +13 -0
  125. package/dist/DropdownMenu/menuItemRoles.d.ts.map +1 -0
  126. package/dist/DropdownMenu/menuItemRoles.js +15 -0
  127. package/dist/EmptyState/EmptyState.d.ts +4 -1
  128. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  129. package/dist/FileInput/FileInput.d.ts.map +1 -1
  130. package/dist/FileInput/FileInput.js +11 -1
  131. package/dist/Icon/Icon.d.ts +17 -12
  132. package/dist/Icon/Icon.d.ts.map +1 -1
  133. package/dist/Icon/Icon.js +28 -20
  134. package/dist/Kbd/Kbd.js +1 -1
  135. package/dist/Layer/useLayer.d.ts +10 -0
  136. package/dist/Layer/useLayer.d.ts.map +1 -1
  137. package/dist/Layer/useLayer.js +23 -1
  138. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  139. package/dist/Lightbox/Lightbox.js +6 -4
  140. package/dist/Link/Link.d.ts +5 -1
  141. package/dist/Link/Link.d.ts.map +1 -1
  142. package/dist/Link/Link.js +32 -1
  143. package/dist/Markdown/Markdown.d.ts.map +1 -1
  144. package/dist/Markdown/Markdown.js +10 -8
  145. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  146. package/dist/MobileNav/MobileNav.js +4 -2
  147. package/dist/MobileNav/MobileNavToggle.d.ts +1 -1
  148. package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
  149. package/dist/MobileNav/MobileNavToggle.js +4 -1
  150. package/dist/MoreMenu/MoreMenu.d.ts +1 -1
  151. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  152. package/dist/MoreMenu/MoreMenu.js +4 -1
  153. package/dist/MultiSelector/MultiSelector.d.ts +1 -1
  154. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  155. package/dist/MultiSelector/MultiSelector.js +13 -6
  156. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  157. package/dist/NumberInput/NumberInput.js +5 -1
  158. package/dist/Outline/Outline.d.ts +1 -1
  159. package/dist/Outline/Outline.d.ts.map +1 -1
  160. package/dist/Outline/Outline.js +4 -1
  161. package/dist/Pagination/Pagination.d.ts +1 -1
  162. package/dist/Pagination/Pagination.d.ts.map +1 -1
  163. package/dist/Pagination/Pagination.js +38 -11
  164. package/dist/Popover/usePopover.d.ts.map +1 -1
  165. package/dist/Popover/usePopover.js +4 -1
  166. package/dist/PowerSearch/PowerSearch.d.ts +1 -1
  167. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  168. package/dist/PowerSearch/PowerSearch.js +22 -12
  169. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +1 -1
  170. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  171. package/dist/PowerSearch/PowerSearchEditPopover.js +26 -20
  172. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  173. package/dist/PowerSearch/PowerSearchToken.js +7 -3
  174. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  175. package/dist/PowerSearch/PowerSearchValueEditor.js +34 -21
  176. package/dist/PowerSearch/formatFilterValue.d.ts +2 -1
  177. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  178. package/dist/PowerSearch/formatFilterValue.js +19 -9
  179. package/dist/PowerSearch/index.d.ts +2 -1
  180. package/dist/PowerSearch/index.d.ts.map +1 -1
  181. package/dist/PowerSearch/index.js +1 -0
  182. package/dist/PowerSearch/resolveOperatorLabel.d.ts +23 -0
  183. package/dist/PowerSearch/resolveOperatorLabel.d.ts.map +1 -0
  184. package/dist/PowerSearch/resolveOperatorLabel.js +28 -0
  185. package/dist/PowerSearch/types.d.ts +28 -2
  186. package/dist/PowerSearch/types.d.ts.map +1 -1
  187. package/dist/PowerSearch/usePowerSearchConfig.d.ts.map +1 -1
  188. package/dist/PowerSearch/usePowerSearchConfig.js +27 -27
  189. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  190. package/dist/PowerSearch/usePowerSearchSource.js +15 -8
  191. package/dist/Resizable/ResizeHandle.d.ts +1 -1
  192. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  193. package/dist/Resizable/ResizeHandle.js +4 -1
  194. package/dist/Selector/Selector.d.ts.map +1 -1
  195. package/dist/Selector/Selector.js +52 -14
  196. package/dist/SideNav/SideNav.d.ts.map +1 -1
  197. package/dist/SideNav/SideNav.js +4 -2
  198. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  199. package/dist/SideNav/SideNavCollapseButton.js +3 -1
  200. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  201. package/dist/SideNav/SideNavHeading.js +5 -3
  202. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  203. package/dist/SideNav/SideNavItem.js +7 -1
  204. package/dist/Switch/Switch.d.ts.map +1 -1
  205. package/dist/Switch/Switch.js +4 -2
  206. package/dist/TabList/Tab.d.ts.map +1 -1
  207. package/dist/TabList/Tab.js +2 -2
  208. package/dist/TabList/TabList.d.ts +1 -1
  209. package/dist/TabList/TabList.d.ts.map +1 -1
  210. package/dist/TabList/TabList.js +6 -1
  211. package/dist/TabList/TabMenu.d.ts.map +1 -1
  212. package/dist/TabList/TabMenu.js +1 -1
  213. package/dist/Table/BaseTable.d.ts.map +1 -1
  214. package/dist/Table/BaseTable.js +29 -16
  215. package/dist/Table/Table.d.ts.map +1 -1
  216. package/dist/Table/Table.js +5 -3
  217. package/dist/Table/index.d.ts +2 -0
  218. package/dist/Table/index.d.ts.map +1 -1
  219. package/dist/Table/index.js +1 -0
  220. package/dist/Table/plugins/columnResize/useTableColumnResize.js +1 -1
  221. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  222. package/dist/Table/plugins/filtering/useTableFiltering.js +56 -19
  223. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
  224. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  225. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +12 -5
  226. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  227. package/dist/Table/plugins/pagination/useTablePagination.js +6 -3
  228. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  229. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +8 -6
  230. package/dist/Table/plugins/rowIndex/useTableRowIndex.d.ts +1 -1
  231. package/dist/Table/plugins/rowIndex/useTableRowIndex.js +1 -1
  232. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  233. package/dist/Table/plugins/selection/useTableSelection.js +5 -2
  234. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  235. package/dist/Table/plugins/sortable/useTableSortable.js +6 -4
  236. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +2 -2
  237. package/dist/Table/plugins/tree/index.d.ts +5 -0
  238. package/dist/Table/plugins/tree/index.d.ts.map +1 -0
  239. package/dist/Table/plugins/tree/index.js +4 -0
  240. package/dist/Table/plugins/tree/useTableTreeData.d.ts +38 -0
  241. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -0
  242. package/dist/Table/plugins/tree/useTableTreeData.js +358 -0
  243. package/dist/Table/plugins/tree/useTableTreeState.d.ts +51 -0
  244. package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -0
  245. package/dist/Table/plugins/tree/useTableTreeState.js +175 -0
  246. package/dist/Table/types.d.ts +17 -10
  247. package/dist/Table/types.d.ts.map +1 -1
  248. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  249. package/dist/Table/useBaseTablePlugins.js +6 -3
  250. package/dist/TextInput/TextInput.d.ts.map +1 -1
  251. package/dist/TextInput/TextInput.js +5 -1
  252. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  253. package/dist/Thumbnail/Thumbnail.js +8 -2
  254. package/dist/TimeInput/TimeInput.d.ts +1 -1
  255. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  256. package/dist/TimeInput/TimeInput.js +7 -2
  257. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  258. package/dist/Timestamp/Timestamp.js +18 -3
  259. package/dist/Toast/Toast.d.ts.map +1 -1
  260. package/dist/Toast/Toast.js +3 -1
  261. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  262. package/dist/Toast/ToastViewport.js +3 -1
  263. package/dist/Token/Token.d.ts.map +1 -1
  264. package/dist/Token/Token.js +8 -2
  265. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  266. package/dist/Tokenizer/Tokenizer.js +3 -1
  267. package/dist/Toolbar/Toolbar.d.ts.map +1 -1
  268. package/dist/Toolbar/Toolbar.js +8 -1
  269. package/dist/TopNav/TopNav.d.ts +2 -1
  270. package/dist/TopNav/TopNav.d.ts.map +1 -1
  271. package/dist/TopNav/TopNav.js +4 -1
  272. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  273. package/dist/TopNav/TopNavHeading.js +5 -3
  274. package/dist/TreeList/TreeList.d.ts.map +1 -1
  275. package/dist/TreeList/TreeList.js +5 -1
  276. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  277. package/dist/TreeList/TreeListItem.js +7 -1
  278. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  279. package/dist/Typeahead/BaseTypeahead.js +8 -4
  280. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  281. package/dist/Typeahead/Typeahead.js +3 -1
  282. package/dist/VisuallyHidden/VisuallyHidden.d.ts +1 -0
  283. package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
  284. package/dist/VisuallyHidden/VisuallyHidden.js +1 -0
  285. package/dist/astryx.css +38 -4
  286. package/dist/astryx.umd.js +62 -60
  287. package/dist/astryx.umd.js.map +4 -4
  288. package/dist/authoring/doc.d.ts +145 -0
  289. package/dist/authoring/doc.d.ts.map +1 -0
  290. package/dist/authoring/doc.js +100 -0
  291. package/dist/authoring/index.d.ts +29 -0
  292. package/dist/authoring/index.d.ts.map +1 -0
  293. package/dist/authoring/index.js +28 -0
  294. package/dist/authoring/integration.d.ts +35 -0
  295. package/dist/authoring/integration.d.ts.map +1 -0
  296. package/dist/authoring/integration.js +30 -0
  297. package/dist/authoring/template.d.ts +66 -0
  298. package/dist/authoring/template.d.ts.map +1 -0
  299. package/dist/authoring/template.js +55 -0
  300. package/dist/config.d.ts +80 -0
  301. package/dist/config.d.ts.map +1 -0
  302. package/dist/config.js +40 -0
  303. package/dist/docs-types.d.ts +13 -4
  304. package/dist/docs-types.d.ts.map +1 -1
  305. package/dist/i18n/InternationalizationContext.d.ts +12 -0
  306. package/dist/i18n/InternationalizationContext.d.ts.map +1 -0
  307. package/dist/i18n/InternationalizationContext.js +29 -0
  308. package/dist/i18n/InternationalizationProvider.d.ts +61 -0
  309. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -0
  310. package/dist/i18n/InternationalizationProvider.js +44 -0
  311. package/dist/i18n/index.d.ts +24 -0
  312. package/dist/i18n/index.d.ts.map +1 -0
  313. package/dist/i18n/index.js +21 -0
  314. package/dist/i18n/resolve.d.ts +22 -0
  315. package/dist/i18n/resolve.d.ts.map +1 -0
  316. package/dist/i18n/resolve.js +141 -0
  317. package/dist/i18n/translator.d.ts +25 -0
  318. package/dist/i18n/translator.d.ts.map +1 -0
  319. package/dist/i18n/translator.js +1 -0
  320. package/dist/i18n/types.d.ts +47 -0
  321. package/dist/i18n/types.d.ts.map +1 -0
  322. package/dist/i18n/types.js +1 -0
  323. package/dist/i18n/useTranslator.d.ts +15 -0
  324. package/dist/i18n/useTranslator.d.ts.map +1 -0
  325. package/dist/i18n/useTranslator.js +39 -0
  326. package/dist/index.d.ts +1 -0
  327. package/dist/index.d.ts.map +1 -1
  328. package/dist/index.js +3 -0
  329. package/dist/theme/Theme.js +1 -1
  330. package/dist/theme/defineTheme.d.ts +1 -1
  331. package/dist/theme/defineTheme.js +1 -1
  332. package/dist/theme/hct.d.ts +0 -1
  333. package/dist/theme/hct.d.ts.map +1 -1
  334. package/dist/theme/hct.js +0 -3
  335. package/dist/utils/color.d.ts +13 -1
  336. package/dist/utils/color.d.ts.map +1 -1
  337. package/dist/utils/color.js +23 -1
  338. package/dist/utils/index.d.ts +1 -1
  339. package/dist/utils/index.d.ts.map +1 -1
  340. package/dist/utils/index.js +1 -1
  341. package/locales/en.json +754 -0
  342. package/locales/pseudo.json +566 -0
  343. package/package.json +23 -2
  344. package/src/AlertDialog/AlertDialog.doc.mjs +5 -0
  345. package/src/AlertDialog/AlertDialog.tsx +4 -1
  346. package/src/AppShell/AppShell.doc.mjs +8 -2
  347. package/src/AppShell/AppShell.tsx +3 -1
  348. package/src/AvatarGroup/AvatarGroup.tsx +4 -1
  349. package/src/Banner/Banner.tsx +10 -5
  350. package/src/Breadcrumbs/Breadcrumbs.tsx +4 -1
  351. package/src/Button/Button.doc.mjs +8 -0
  352. package/src/Button/Button.test.tsx +27 -0
  353. package/src/Button/Button.tsx +51 -5
  354. package/src/ButtonGroup/ButtonGroup.test.tsx +386 -2
  355. package/src/ButtonGroup/ButtonGroup.tsx +27 -11
  356. package/src/Calendar/Calendar.test.tsx +103 -2
  357. package/src/Calendar/Calendar.tsx +29 -6
  358. package/src/Card/Card.doc.mjs +3 -3
  359. package/src/Carousel/Carousel.tsx +10 -7
  360. package/src/Chat/ChatComposer.tsx +5 -1
  361. package/src/Chat/ChatComposerDrawer.tsx +9 -2
  362. package/src/Chat/ChatComposerInput.tsx +10 -4
  363. package/src/Chat/ChatLayout.test.tsx +127 -2
  364. package/src/Chat/ChatLayout.tsx +5 -12
  365. package/src/Chat/ChatLayoutScrollButton.tsx +4 -2
  366. package/src/Chat/ChatMessage.tsx +5 -1
  367. package/src/Chat/ChatMessageBubble.tsx +2 -0
  368. package/src/Chat/ChatMessageList.doc.mjs +1 -1
  369. package/src/Chat/ChatMessageList.tsx +2 -0
  370. package/src/Chat/ChatMessageMetadata.tsx +15 -9
  371. package/src/Chat/ChatPastedTextToken.tsx +3 -1
  372. package/src/Chat/ChatSendButton.tsx +3 -1
  373. package/src/Chat/ChatToolCalls.doc.mjs +1 -1
  374. package/src/Chat/index.ts +1 -0
  375. package/src/Chat/useChatStreamScroll.test.tsx +168 -0
  376. package/src/Chat/useChatStreamScroll.ts +67 -11
  377. package/src/Chat/useSpeechRecognition.ts +11 -2
  378. package/src/Chat/useTriggerMenu.tsx +4 -2
  379. package/src/CheckboxInput/CheckboxInput.doc.mjs +1 -1
  380. package/src/CheckboxInput/CheckboxInput.test.tsx +16 -0
  381. package/src/CheckboxInput/CheckboxInput.tsx +4 -2
  382. package/src/CheckboxList/CheckboxList.doc.mjs +6 -1
  383. package/src/CheckboxList/CheckboxList.tsx +2 -0
  384. package/src/CheckboxList/CheckboxListItem.tsx +7 -1
  385. package/src/Citation/Citation.tsx +4 -2
  386. package/src/ClickableCard/ClickableCard.doc.mjs +1 -1
  387. package/src/CodeBlock/CodeBlock.tsx +91 -40
  388. package/src/Collapsible/Collapsible.doc.mjs +7 -0
  389. package/src/Collapsible/Collapsible.test.tsx +80 -0
  390. package/src/Collapsible/Collapsible.tsx +58 -5
  391. package/src/CommandPalette/CommandPalette.tsx +10 -3
  392. package/src/CommandPalette/CommandPaletteInput.test.tsx +1 -1
  393. package/src/CommandPalette/CommandPaletteInput.tsx +5 -1
  394. package/src/CommandPalette/CommandPaletteList.tsx +4 -1
  395. package/src/ContextMenu/ContextMenu.test.tsx +75 -1
  396. package/src/ContextMenu/ContextMenu.tsx +14 -6
  397. package/src/ContextMenu/index.ts +15 -0
  398. package/src/DateInput/DateInput.doc.mjs +2 -2
  399. package/src/DateInput/DateInput.test.tsx +17 -5
  400. package/src/DateInput/DateInput.tsx +13 -5
  401. package/src/DateRangeInput/DateRangeInput.doc.mjs +1 -1
  402. package/src/DateRangeInput/DateRangeInput.tsx +14 -6
  403. package/src/DateTimeInput/DateTimeInput.doc.mjs +2 -2
  404. package/src/DateTimeInput/DateTimeInput.tsx +17 -7
  405. package/src/Dialog/Dialog.tsx +11 -15
  406. package/src/Dialog/DialogHeader.tsx +7 -3
  407. package/src/DropdownMenu/DropdownMenu.doc.mjs +23 -0
  408. package/src/DropdownMenu/DropdownMenu.tsx +23 -14
  409. package/src/DropdownMenu/DropdownMenuCheckboxItem.doc.mjs +95 -0
  410. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +237 -0
  411. package/src/DropdownMenu/DropdownMenuContext.tsx +29 -1
  412. package/src/DropdownMenu/DropdownMenuItem.doc.mjs +7 -1
  413. package/src/DropdownMenu/DropdownMenuRadioGroup.doc.mjs +80 -0
  414. package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +119 -0
  415. package/src/DropdownMenu/DropdownMenuRadioItem.doc.mjs +80 -0
  416. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +232 -0
  417. package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +163 -0
  418. package/src/DropdownMenu/index.ts +23 -3
  419. package/src/DropdownMenu/menuItemRoles.ts +22 -0
  420. package/src/EmptyState/EmptyState.doc.mjs +3 -3
  421. package/src/EmptyState/EmptyState.tsx +4 -1
  422. package/src/Field/Field.doc.mjs +3 -3
  423. package/src/Field/FieldLabel.doc.mjs +1 -1
  424. package/src/FileInput/FileInput.test.tsx +40 -1
  425. package/src/FileInput/FileInput.tsx +12 -1
  426. package/src/Grid/Grid.doc.mjs +5 -5
  427. package/src/Icon/Icon.test.tsx +46 -0
  428. package/src/Icon/Icon.tsx +37 -24
  429. package/src/InputGroup/InputGroup.doc.mjs +1 -1
  430. package/src/Kbd/Kbd.test.tsx +26 -0
  431. package/src/Kbd/Kbd.tsx +1 -1
  432. package/src/Layer/useLayer.doc.mjs +8 -5
  433. package/src/Layer/useLayer.test.tsx +136 -1
  434. package/src/Layer/useLayer.tsx +34 -2
  435. package/src/Lightbox/Lightbox.doc.mjs +7 -2
  436. package/src/Lightbox/Lightbox.tsx +6 -4
  437. package/src/Link/Link.test.tsx +74 -2
  438. package/src/Link/Link.tsx +48 -1
  439. package/src/Markdown/Markdown.tsx +12 -4
  440. package/src/MobileNav/MobileNav.tsx +4 -2
  441. package/src/MobileNav/MobileNavToggle.tsx +5 -3
  442. package/src/MoreMenu/MoreMenu.tsx +4 -1
  443. package/src/MultiSelector/MultiSelector.tsx +14 -5
  444. package/src/NumberInput/NumberInput.doc.mjs +2 -2
  445. package/src/NumberInput/NumberInput.tsx +3 -1
  446. package/src/Outline/Outline.tsx +4 -1
  447. package/src/OverflowList/OverflowList.doc.mjs +2 -2
  448. package/src/Pagination/Pagination.tsx +35 -12
  449. package/src/Popover/usePopover.tsx +6 -1
  450. package/src/PowerSearch/PowerSearch.doc.mjs +9 -4
  451. package/src/PowerSearch/PowerSearch.tsx +22 -10
  452. package/src/PowerSearch/PowerSearchEditPopover.tsx +27 -20
  453. package/src/PowerSearch/PowerSearchToken.tsx +17 -6
  454. package/src/PowerSearch/PowerSearchValueEditor.tsx +34 -21
  455. package/src/PowerSearch/formatFilterValue.test.ts +282 -0
  456. package/src/PowerSearch/formatFilterValue.ts +21 -8
  457. package/src/PowerSearch/index.ts +5 -0
  458. package/src/PowerSearch/resolveOperatorLabel.ts +34 -0
  459. package/src/PowerSearch/types.ts +33 -9
  460. package/src/PowerSearch/usePowerSearchConfig.ts +59 -27
  461. package/src/PowerSearch/usePowerSearchSource.ts +17 -8
  462. package/src/RadioList/RadioList.doc.mjs +1 -1
  463. package/src/Resizable/ResizeHandle.tsx +4 -1
  464. package/src/Section/Section.doc.mjs +4 -4
  465. package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
  466. package/src/Selector/Selector.doc.mjs +6 -3
  467. package/src/Selector/Selector.test.tsx +114 -6
  468. package/src/Selector/Selector.tsx +68 -17
  469. package/src/Selector/SelectorOption.doc.mjs +1 -1
  470. package/src/SideNav/SideNav.tsx +4 -2
  471. package/src/SideNav/SideNavCollapseButton.tsx +3 -1
  472. package/src/SideNav/SideNavHeading.tsx +5 -3
  473. package/src/SideNav/SideNavItem.doc.mjs +2 -2
  474. package/src/SideNav/SideNavItem.tsx +3 -1
  475. package/src/Slider/Slider.doc.mjs +2 -2
  476. package/src/Stack/Stack.doc.mjs +10 -10
  477. package/src/Switch/Switch.doc.mjs +3 -3
  478. package/src/Switch/Switch.test.tsx +16 -0
  479. package/src/Switch/Switch.tsx +4 -2
  480. package/src/TabList/Tab.tsx +5 -1
  481. package/src/TabList/TabList.doc.mjs +3 -3
  482. package/src/TabList/TabList.test.tsx +66 -0
  483. package/src/TabList/TabList.tsx +12 -1
  484. package/src/TabList/TabMenu.tsx +4 -1
  485. package/src/Table/BaseTable.tsx +36 -19
  486. package/src/Table/Table.doc.mjs +2 -0
  487. package/src/Table/Table.test.tsx +132 -1
  488. package/src/Table/Table.tsx +6 -4
  489. package/src/Table/index.ts +7 -0
  490. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +1 -1
  491. package/src/Table/plugins/filtering/useTableFiltering.tsx +31 -30
  492. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +7 -5
  493. package/src/Table/plugins/pagination/useTablePagination.tsx +4 -1
  494. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -8
  495. package/src/Table/plugins/rowIndex/useTableRowIndex.tsx +1 -1
  496. package/src/Table/plugins/selection/useTableSelection.tsx +6 -7
  497. package/src/Table/plugins/sortable/useTableSortable.tsx +8 -5
  498. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +4 -4
  499. package/src/Table/plugins/tree/index.ts +12 -0
  500. package/src/Table/plugins/tree/useTableTreeData-perf.test.tsx +163 -0
  501. package/src/Table/plugins/tree/useTableTreeData.test.tsx +594 -0
  502. package/src/Table/plugins/tree/useTableTreeData.tsx +495 -0
  503. package/src/Table/plugins/tree/useTableTreeState.test.tsx +636 -0
  504. package/src/Table/plugins/tree/useTableTreeState.tsx +253 -0
  505. package/src/Table/types.ts +18 -12
  506. package/src/Table/useBaseTablePlugins.ts +6 -2
  507. package/src/Table/useTableFiltering.doc.mjs +2 -2
  508. package/src/Table/useTableGroupedRows.doc.mjs +3 -3
  509. package/src/Table/useTableSortable.doc.mjs +11 -11
  510. package/src/Table/useTableTreeData.doc.mjs +75 -0
  511. package/src/Table/useTableTreeState.doc.mjs +98 -0
  512. package/src/Text/Text.doc.mjs +2 -2
  513. package/src/TextArea/TextArea.doc.mjs +1 -1
  514. package/src/TextInput/TextInput.doc.mjs +1 -1
  515. package/src/TextInput/TextInput.tsx +3 -1
  516. package/src/Thumbnail/Thumbnail.tsx +4 -2
  517. package/src/TimeInput/TimeInput.doc.mjs +2 -2
  518. package/src/TimeInput/TimeInput.tsx +6 -2
  519. package/src/Timestamp/Timestamp.doc.mjs +4 -4
  520. package/src/Timestamp/Timestamp.test.tsx +120 -7
  521. package/src/Timestamp/Timestamp.tsx +21 -1
  522. package/src/Toast/Toast.tsx +3 -1
  523. package/src/Toast/ToastViewport.tsx +3 -1
  524. package/src/Token/Token.tsx +4 -2
  525. package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
  526. package/src/Tokenizer/Tokenizer.tsx +4 -4
  527. package/src/Toolbar/Toolbar.doc.mjs +1 -1
  528. package/src/Toolbar/Toolbar.tsx +10 -3
  529. package/src/TopNav/TopNav.doc.mjs +1 -0
  530. package/src/TopNav/TopNav.test.tsx +30 -0
  531. package/src/TopNav/TopNav.tsx +6 -4
  532. package/src/TopNav/TopNavHeading.tsx +5 -3
  533. package/src/TreeList/TreeList.tsx +5 -1
  534. package/src/TreeList/TreeListItem.tsx +6 -1
  535. package/src/Typeahead/BaseTypeahead.tsx +11 -4
  536. package/src/Typeahead/Typeahead.doc.mjs +1 -1
  537. package/src/Typeahead/Typeahead.tsx +3 -1
  538. package/src/VisuallyHidden/VisuallyHidden.tsx +1 -0
  539. package/src/authoring/doc.ts +166 -0
  540. package/src/authoring/index.test.ts +52 -0
  541. package/src/authoring/index.ts +50 -0
  542. package/src/authoring/integration.ts +42 -0
  543. package/src/authoring/template.ts +74 -0
  544. package/src/config.test.ts +16 -0
  545. package/src/config.ts +92 -0
  546. package/src/docPropLiterals.test.ts +938 -0
  547. package/src/docs-types.ts +15 -10
  548. package/src/i18n/InternationalizationContext.ts +39 -0
  549. package/src/i18n/InternationalizationProvider.doc.mjs +72 -0
  550. package/src/i18n/InternationalizationProvider.tsx +82 -0
  551. package/src/i18n/__tests__/e2e-pagination.test.tsx +172 -0
  552. package/src/i18n/__tests__/e2e-powersearch.test.tsx +130 -0
  553. package/src/i18n/__tests__/resolve.test.ts +284 -0
  554. package/src/i18n/index.ts +32 -0
  555. package/src/i18n/resolve.ts +165 -0
  556. package/src/i18n/translator.ts +31 -0
  557. package/src/i18n/types.ts +53 -0
  558. package/src/i18n/useTranslator.doc.mjs +46 -0
  559. package/src/i18n/useTranslator.ts +50 -0
  560. package/src/index.ts +3 -0
  561. package/src/theme/Theme.doc.mjs +4 -4
  562. package/src/theme/Theme.tsx +1 -1
  563. package/src/theme/defineTheme.ts +1 -1
  564. package/src/theme/hct.ts +0 -4
  565. package/src/utils/color.test.ts +101 -1
  566. package/src/utils/color.ts +23 -1
  567. package/src/utils/index.ts +8 -1
  568. package/dist/NavItem/index.d.ts +0 -9
  569. package/dist/NavItem/index.d.ts.map +0 -1
  570. package/dist/NavItem/index.js +0 -10
  571. package/src/NavItem/index.ts +0 -11
@@ -45,6 +45,7 @@ import type {SyntaxToken, TokenLine} from './tokenizer';
45
45
  import {ensureHighlightStyles} from './highlightStyles';
46
46
  import {applyHighlightRangesChunked} from './highlightRanges';
47
47
  import {themeProps} from '../utils/themeProps';
48
+ import {useTranslator} from '../i18n';
48
49
  import {SyntaxTheme, type SyntaxThemeDefinition} from '../theme/syntax';
49
50
 
50
51
  // ---------------------------------------------------------------------------
@@ -78,6 +79,13 @@ const dynamicStyles = stylex.create({
78
79
  minWidth: value === 'fit-content' ? 'min(100%, 400px)' : null,
79
80
  maxWidth: value === 'fit-content' ? '100%' : null,
80
81
  }),
82
+ // Width of the line-number column, sized to the widest number. `ch` is the
83
+ // advance of "0" in the (monospace) code font, so N digits => N ch. Set on
84
+ // <code>; `--_codeblock-gutter-width` is unregistered so it inherits (with its var()
85
+ // substituted) down to the line divs that read it for their grid track.
86
+ gutterWidth: (digits: number) => ({
87
+ '--_codeblock-gutter-width': `${digits}ch`,
88
+ }),
81
89
  });
82
90
 
83
91
  const styles = stylex.create({
@@ -188,22 +196,6 @@ const styles = stylex.create({
188
196
  ':focus-visible': '2px',
189
197
  },
190
198
  },
191
- gutter: {
192
- flexShrink: 0,
193
- paddingBlock: spacingVars['--spacing-3'],
194
- paddingInlineStart: spacingVars['--spacing-4'],
195
- paddingInlineEnd: spacingVars['--spacing-3'],
196
- textAlign: 'end',
197
- userSelect: 'none',
198
- color: 'var(--color-syntax-punctuation)',
199
- borderRightWidth: borderVars['--border-width'],
200
- borderRightStyle: 'solid',
201
- borderRightColor: colorVars['--color-border'],
202
- },
203
- gutterLine: {
204
- fontFamily: typographyVars['--font-family-code'],
205
- lineHeight: typeScaleVars['--text-code-leading'],
206
- },
207
199
  code: {
208
200
  display: 'block',
209
201
  flex: 1,
@@ -222,9 +214,53 @@ const styles = stylex.create({
222
214
  wordBreak: 'break-all',
223
215
  overflowWrap: 'break-word',
224
216
  },
217
+ // With line numbers on, the <code> element hosts the full-height divider
218
+ // between the number gutter and the code. It spans the code's block padding
219
+ // too (inset-block: 0), so the rule reaches the top and bottom edges the way
220
+ // the old separate gutter column did. The numbers themselves are drawn per
221
+ // line (see `lineNumbered`) — a separate column can't track wrap height.
222
+ codeNumbered: {
223
+ position: 'relative',
224
+ '::after': {
225
+ content: '""',
226
+ position: 'absolute',
227
+ insetBlock: 0,
228
+ insetInlineStart: `calc(${spacingVars['--spacing-4']} + var(--_codeblock-gutter-width) + ${spacingVars['--spacing-3']})`,
229
+ width: 0,
230
+ borderInlineStartWidth: borderVars['--border-width'],
231
+ borderInlineStartStyle: 'solid',
232
+ borderInlineStartColor: colorVars['--color-border'],
233
+ pointerEvents: 'none',
234
+ },
235
+ },
225
236
  line: {
226
237
  lineHeight: typeScaleVars['--text-code-leading'],
227
238
  },
239
+ // Per-line number gutter: a two-column grid ([number] [code]). The number is
240
+ // a ::before generated from the data-line attribute. Because the number and
241
+ // its code occupy one grid row, the row grows to fit wrapped code while the
242
+ // number stays pinned to the row's first visual line (alignSelf: start) —
243
+ // this is what keeps numbers aligned when isWrapped wraps a line.
244
+ lineNumbered: {
245
+ display: 'grid',
246
+ gridTemplateColumns: 'var(--_codeblock-gutter-width) 1fr',
247
+ columnGap: `calc(${spacingVars['--spacing-3']} + ${borderVars['--border-width']} + ${spacingVars['--spacing-4']})`,
248
+ '::before': {
249
+ content: 'attr(data-line)',
250
+ gridColumn: '1',
251
+ alignSelf: 'start',
252
+ textAlign: 'end',
253
+ color: 'var(--color-syntax-punctuation)',
254
+ userSelect: 'none',
255
+ fontFamily: typographyVars['--font-family-code'],
256
+ },
257
+ },
258
+ // In span mode the tokens are wrapped in this element so they form a single
259
+ // grid item in column 2 (otherwise each token span would flow into its own
260
+ // grid cell). minWidth:0 lets it shrink so long lines wrap within the track.
261
+ lineContent: {
262
+ minWidth: 0,
263
+ },
228
264
  lineChunk: {
229
265
  contentVisibility: 'auto',
230
266
  },
@@ -239,12 +275,6 @@ const styles = stylex.create({
239
275
  sizeMd: {
240
276
  fontSize: typeScaleVars['--text-code-size'],
241
277
  },
242
- gutterSm: {
243
- fontSize: typeScaleVars['--text-supporting-size'],
244
- },
245
- gutterMd: {
246
- fontSize: typeScaleVars['--text-code-size'],
247
- },
248
278
  copyButton: {
249
279
  display: 'inline-flex',
250
280
  alignItems: 'center',
@@ -285,11 +315,13 @@ const CodeChunk = React.memo(function CodeChunk({
285
315
  startIndex,
286
316
  highlightSet,
287
317
  renderLineContent,
318
+ lineNumbers,
288
319
  }: {
289
320
  lines: string[];
290
321
  startIndex: number;
291
322
  highlightSet: Set<number> | null;
292
323
  renderLineContent: (line: string, lineIndex: number) => React.ReactNode;
324
+ lineNumbers: boolean;
293
325
  }) {
294
326
  return (
295
327
  <>
@@ -301,6 +333,7 @@ const CodeChunk = React.memo(function CodeChunk({
301
333
  data-line={i + 1}
302
334
  {...stylex.props(
303
335
  styles.line,
336
+ lineNumbers && styles.lineNumbered,
304
337
  (highlightSet?.has(i + 1) ?? false) && styles.lineHighlighted,
305
338
  )}>
306
339
  {renderLineContent(line, i)}
@@ -315,6 +348,7 @@ function renderLines(
315
348
  lines: string[],
316
349
  highlightSet: Set<number> | null,
317
350
  renderLineContent: (line: string, lineIndex: number) => React.ReactNode,
351
+ lineNumbers: boolean,
318
352
  chunkSize: number = LINE_CHUNK_SIZE,
319
353
  ): React.ReactNode {
320
354
  chunkSize = Math.max(1, Math.floor(chunkSize));
@@ -326,6 +360,7 @@ function renderLines(
326
360
  startIndex={0}
327
361
  highlightSet={highlightSet}
328
362
  renderLineContent={renderLineContent}
363
+ lineNumbers={lineNumbers}
329
364
  />
330
365
  );
331
366
  }
@@ -347,6 +382,7 @@ function renderLines(
347
382
  startIndex={start}
348
383
  highlightSet={highlightSet}
349
384
  renderLineContent={renderLineContent}
385
+ lineNumbers={lineNumbers}
350
386
  />
351
387
  </div>,
352
388
  );
@@ -542,12 +578,16 @@ function SpanCodeContent({
542
578
  highlightSet,
543
579
  isWrapped,
544
580
  sizeStyle,
581
+ hasLineNumbers,
582
+ maxDigits,
545
583
  }: {
546
584
  lines: string[];
547
585
  tokenLines: TokenLine[];
548
586
  highlightSet: Set<number> | null;
549
587
  isWrapped: boolean;
550
588
  sizeStyle: stylex.StyleXStyles;
589
+ hasLineNumbers: boolean;
590
+ maxDigits: number;
551
591
  }) {
552
592
  useInsertionEffect(() => {
553
593
  ensureHighlightStyles();
@@ -556,7 +596,13 @@ function SpanCodeContent({
556
596
  const renderLineContent = useCallback(
557
597
  (line: string, lineIndex: number): React.ReactNode => {
558
598
  const tokens = tokenLines[lineIndex] ?? [];
559
- return buildSpanLine(line, tokens);
599
+ // Wrap tokens in a single element so they occupy one grid cell when line
600
+ // numbers are on (see `lineNumbered`); an inline span is a no-op when off.
601
+ return (
602
+ <span {...stylex.props(styles.lineContent)}>
603
+ {buildSpanLine(line, tokens)}
604
+ </span>
605
+ );
560
606
  },
561
607
  [tokenLines],
562
608
  );
@@ -567,8 +613,10 @@ function SpanCodeContent({
567
613
  styles.code,
568
614
  sizeStyle,
569
615
  isWrapped && styles.codeWrapped,
616
+ hasLineNumbers && styles.codeNumbered,
617
+ hasLineNumbers && dynamicStyles.gutterWidth(maxDigits),
570
618
  )}>
571
- {renderLines(lines, highlightSet, renderLineContent)}
619
+ {renderLines(lines, highlightSet, renderLineContent, hasLineNumbers)}
572
620
  </code>
573
621
  );
574
622
  }
@@ -583,12 +631,16 @@ function RangeCodeContent({
583
631
  highlightSet,
584
632
  isWrapped,
585
633
  sizeStyle,
634
+ hasLineNumbers,
635
+ maxDigits,
586
636
  }: {
587
637
  lines: string[];
588
638
  tokenLines: TokenLine[];
589
639
  highlightSet: Set<number> | null;
590
640
  isWrapped: boolean;
591
641
  sizeStyle: stylex.StyleXStyles;
642
+ hasLineNumbers: boolean;
643
+ maxDigits: number;
592
644
  }) {
593
645
  const codeRef = useRef<HTMLElement>(null);
594
646
 
@@ -606,6 +658,9 @@ function RangeCodeContent({
606
658
  return applyHighlightRangesChunked(codeEl, tokenLines);
607
659
  }, [tokenLines]);
608
660
 
661
+ // Range mode keeps the line's text as a bare text node (its firstChild) so
662
+ // applyHighlightRangesChunked can map token offsets onto it \u2014 no wrapper. The
663
+ // number ::before is a pseudo-element, so it never becomes a child node here.
609
664
  const renderLineContent = useCallback(
610
665
  (line: string): React.ReactNode => line || '\u200b',
611
666
  [],
@@ -618,8 +673,10 @@ function RangeCodeContent({
618
673
  styles.code,
619
674
  sizeStyle,
620
675
  isWrapped && styles.codeWrapped,
676
+ hasLineNumbers && styles.codeNumbered,
677
+ hasLineNumbers && dynamicStyles.gutterWidth(maxDigits),
621
678
  )}>
622
- {renderLines(lines, highlightSet, renderLineContent)}
679
+ {renderLines(lines, highlightSet, renderLineContent, hasLineNumbers)}
623
680
  </code>
624
681
  );
625
682
  }
@@ -662,6 +719,7 @@ export function CodeBlock({
662
719
  ref,
663
720
  ...props
664
721
  }: CodeBlockProps) {
722
+ const t = useTranslator();
665
723
  const [copied, setCopied] = useState(false);
666
724
  const copyResetTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
667
725
  const announce = useAnnounce();
@@ -718,7 +776,8 @@ export function CodeBlock({
718
776
  }, [code, onCopy, announce]);
719
777
 
720
778
  const sizeStyle = size === 'sm' ? styles.sizeSm : styles.sizeMd;
721
- const gutterSizeStyle = size === 'sm' ? styles.gutterSm : styles.gutterMd;
779
+ // Digits in the largest line number — sizes the gutter column width.
780
+ const maxLineDigits = String(lines.length).length;
722
781
  const languageLabel =
723
782
  hasLanguageLabel && language !== 'plaintext' ? language : null;
724
783
  const showHeader = title != null || languageLabel != null;
@@ -748,7 +807,7 @@ export function CodeBlock({
748
807
  e.stopPropagation();
749
808
  void handleCopy();
750
809
  }}
751
- aria-label={copied ? 'Copied' : 'Copy code'}
810
+ aria-label={copied ? t('@astryx.codeBlock.copied') : t('@astryx.codeBlock.copyCode')}
752
811
  {...stylex.props(
753
812
  styles.copyButton,
754
813
  !showHeader && styles.copyButtonAbsolute,
@@ -811,7 +870,7 @@ export function CodeBlock({
811
870
  // create duplicate same-named landmarks (axe: landmark-unique).
812
871
  tabIndex={0}
813
872
  role="group"
814
- aria-label={languageLabel ?? 'Code'}
873
+ aria-label={languageLabel ?? t('@astryx.codeBlock.code')}
815
874
  {...mergeProps(stylex.props(styles.scrollContainer), {
816
875
  style: scrollStyle,
817
876
  })}>
@@ -820,18 +879,6 @@ export function CodeBlock({
820
879
  styles.codeWrapper,
821
880
  showHeader && !hasLineNumbers && styles.codeWrapperCompact,
822
881
  )}>
823
- {hasLineNumbers && (
824
- <div
825
- {...stylex.props(styles.gutter, gutterSizeStyle)}
826
- aria-hidden="true">
827
- {lines.map((_, i) => (
828
- // eslint-disable-next-line @eslint-react/no-array-index-key -- gutter line numbers are positional by definition
829
- <div key={i} {...stylex.props(styles.gutterLine)}>
830
- {i + 1}
831
- </div>
832
- ))}
833
- </div>
834
- )}
835
882
  {useSpans ? (
836
883
  <SpanCodeContent
837
884
  lines={lines}
@@ -839,6 +886,8 @@ export function CodeBlock({
839
886
  highlightSet={highlightSet}
840
887
  isWrapped={isWrapped}
841
888
  sizeStyle={sizeStyle}
889
+ hasLineNumbers={hasLineNumbers}
890
+ maxDigits={maxLineDigits}
842
891
  />
843
892
  ) : (
844
893
  <RangeCodeContent
@@ -847,6 +896,8 @@ export function CodeBlock({
847
896
  highlightSet={highlightSet}
848
897
  isWrapped={isWrapped}
849
898
  sizeStyle={sizeStyle}
899
+ hasLineNumbers={hasLineNumbers}
900
+ maxDigits={maxLineDigits}
850
901
  />
851
902
  )}
852
903
  </div>
@@ -17,6 +17,7 @@ export const docs = {
17
17
  theming: {
18
18
  targets: [
19
19
  {className: 'astryx-collapsible', visualProps: ['density']},
20
+ {className: 'astryx-collapsible-content', visualProps: ['density']},
20
21
  {className: 'astryx-collapsible-group', visualProps: ['density']},
21
22
  ],
22
23
  },
@@ -53,6 +54,12 @@ export const docs = {
53
54
  type: 'boolean',
54
55
  description: 'Controlled open state.',
55
56
  },
57
+ {
58
+ name: 'isDisabled',
59
+ type: 'boolean',
60
+ description: "Disable the item so its trigger can't be toggled (dimmed, aria-disabled, and out of the tab order). Doesn't collapse an already-open item.",
61
+ default: 'false',
62
+ },
56
63
  {
57
64
  name: 'onOpenChange',
58
65
  type: '(isOpen: boolean) => void',
@@ -72,6 +72,12 @@ describe('Collapsible', () => {
72
72
  expect(screen.getByTestId('root')).toHaveClass('astryx-collapsible');
73
73
  });
74
74
 
75
+ it('renders the stable astryx-collapsible-content class on the content area', () => {
76
+ render(<Collapsible trigger="T">c</Collapsible>);
77
+ const content = contentFor(screen.getByRole('button'));
78
+ expect(content).toHaveClass('astryx-collapsible-content');
79
+ });
80
+
75
81
  it('renders a ReactNode trigger, not just a string', () => {
76
82
  render(
77
83
  <Collapsible trigger={<span data-testid="rich">Rich</span>}>
@@ -240,6 +246,80 @@ describe('Collapsible', () => {
240
246
  });
241
247
  });
242
248
 
249
+ describe('disabled state', () => {
250
+ it('marks the trigger aria-disabled and drops it from the tab order', () => {
251
+ render(
252
+ <Collapsible trigger="T" isDisabled>
253
+ Body
254
+ </Collapsible>,
255
+ );
256
+ const button = screen.getByRole('button');
257
+ expect(button).toHaveAttribute('aria-disabled', 'true');
258
+ expect(button).toHaveAttribute('tabindex', '-1');
259
+ // Never the native disabled attribute — it stays focusable/perceivable.
260
+ expect(button).not.toBeDisabled();
261
+ });
262
+
263
+ it('is enabled by default (no aria-disabled, stays in tab order)', () => {
264
+ render(<Collapsible trigger="T">Body</Collapsible>);
265
+ const button = screen.getByRole('button');
266
+ expect(button).not.toHaveAttribute('aria-disabled');
267
+ expect(button).not.toHaveAttribute('tabindex', '-1');
268
+ });
269
+
270
+ it('does not toggle when the trigger is clicked while disabled', async () => {
271
+ const user = userEvent.setup();
272
+ render(
273
+ <Collapsible trigger="T" isDisabled defaultIsOpen>
274
+ Body
275
+ </Collapsible>,
276
+ );
277
+ const button = screen.getByRole('button');
278
+ expect(button).toHaveAttribute('aria-expanded', 'true');
279
+ await user.click(button);
280
+ expect(button).toHaveAttribute('aria-expanded', 'true');
281
+ });
282
+
283
+ it('does not fire onOpenChange while disabled', async () => {
284
+ const user = userEvent.setup();
285
+ const onOpenChange = vi.fn();
286
+ render(
287
+ <Collapsible trigger="T" isDisabled onOpenChange={onOpenChange}>
288
+ Body
289
+ </Collapsible>,
290
+ );
291
+ await user.click(screen.getByRole('button'));
292
+ expect(onOpenChange).not.toHaveBeenCalled();
293
+ });
294
+
295
+ it('does not collapse an already-open item — content stays visible', () => {
296
+ render(
297
+ <Collapsible trigger="T" isDisabled defaultIsOpen>
298
+ Body
299
+ </Collapsible>,
300
+ );
301
+ const content = contentFor(screen.getByRole('button'));
302
+ expect(content).not.toHaveStyle({display: 'none'});
303
+ });
304
+
305
+ it('does not toggle its group item when disabled', async () => {
306
+ const user = userEvent.setup();
307
+ render(
308
+ <CollapsibleGroup type="single">
309
+ <Collapsible trigger="A" value="a" isDisabled>
310
+ Body A
311
+ </Collapsible>
312
+ <Collapsible trigger="B" value="b">
313
+ Body B
314
+ </Collapsible>
315
+ </CollapsibleGroup>,
316
+ );
317
+ const triggerA = screen.getByRole('button', {name: /A/});
318
+ await user.click(triggerA);
319
+ expect(triggerA).toHaveAttribute('aria-expanded', 'false');
320
+ });
321
+ });
322
+
243
323
  describe('prop forwarding', () => {
244
324
  it('forwards a ref to the root element', () => {
245
325
  const ref = vi.fn();
@@ -39,6 +39,7 @@ import {
39
39
  durationVars,
40
40
  easeVars,
41
41
  } from '../theme/tokens.stylex';
42
+
42
43
  import {useCollapsible} from './useCollapsible';
43
44
  import {CollapsibleGroupPresentationContext} from './CollapsibleGroupContext';
44
45
  import {getIcon} from '../Icon/globalIconRegistry';
@@ -81,6 +82,13 @@ const styles = stylex.create({
81
82
  textBoxEdge: 'cap alphabetic',
82
83
  textBoxTrim: 'trim-both',
83
84
  },
85
+ // Disabled trigger — non-interactive, dimmed. Native `disabled` on the
86
+ // button blocks click + keyboard activation; these styles restore the
87
+ // visual affordance that `all: unset` wipes.
88
+ triggerDisabled: {
89
+ cursor: 'not-allowed',
90
+ opacity: 0.5,
91
+ },
84
92
  // Chevron indicator
85
93
  chevron: {
86
94
  display: 'inline-flex',
@@ -102,8 +110,17 @@ const styles = stylex.create({
102
110
  contentHidden: {
103
111
  display: 'none',
104
112
  },
113
+ // Anchors body typography so revealed text renders at the system's body
114
+ // scale (family/size/weight/leading) instead of inheriting from wherever
115
+ // the Collapsible is placed. External themes override via the
116
+ // `astryx-collapsible-content` target.
105
117
  content: {
106
118
  paddingBlockStart: spacingVars['--spacing-1'],
119
+ fontFamily: typographyVars['--font-family-body'],
120
+ fontSize: typeScaleVars['--text-body-size'],
121
+ fontWeight: typeScaleVars['--text-body-weight'],
122
+ lineHeight: typeScaleVars['--text-body-leading'],
123
+ color: colorVars['--color-text-primary'],
107
124
  },
108
125
  // Group divider chrome — a hairline above every item except the first.
109
126
  // The group's wrapper (or 'all' mode) owns the outer edges.
@@ -166,6 +183,17 @@ export interface CollapsibleProps extends BaseProps {
166
183
  */
167
184
  isOpen?: boolean;
168
185
 
186
+ /**
187
+ * Whether the collapsible is disabled. A disabled item can't be toggled —
188
+ * its trigger is non-interactive and dimmed. Following the system-wide
189
+ * disabled convention, the trigger uses `aria-disabled` (not the native
190
+ * `disabled` attribute) and drops out of the tab order, staying perceivable
191
+ * to assistive tech. The content stays in whatever open state it was;
192
+ * disabling doesn't collapse an already-open item.
193
+ * @default false
194
+ */
195
+ isDisabled?: boolean;
196
+
169
197
  /**
170
198
  * Callback when the open state changes.
171
199
  */
@@ -225,6 +253,7 @@ export function Collapsible({
225
253
  children,
226
254
  defaultIsOpen,
227
255
  isOpen: controlledIsOpen,
256
+ isDisabled = false,
228
257
  onOpenChange,
229
258
  value,
230
259
  ref,
@@ -244,6 +273,17 @@ export function Collapsible({
244
273
  value,
245
274
  });
246
275
 
276
+ // Activation is blocked by this guard rather than the native `disabled`
277
+ // attribute, so the trigger keeps `aria-disabled` semantics and stays
278
+ // discoverable. A native `disabled` button would silently swallow events
279
+ // (e.g. a wrapping tooltip's hover) — the system-wide disabled convention.
280
+ const handleToggle = () => {
281
+ if (isDisabled) {
282
+ return;
283
+ }
284
+ toggle();
285
+ };
286
+
247
287
  const presentation = use(CollapsibleGroupPresentationContext);
248
288
  const isDivided = presentation?.hasDividers ?? false;
249
289
  const density = presentation?.density ?? null;
@@ -268,12 +308,20 @@ export function Collapsible({
268
308
  {...props}>
269
309
  <button
270
310
  type="button"
271
- onClick={toggle}
311
+ onClick={handleToggle}
312
+ aria-disabled={isDisabled || undefined}
272
313
  aria-expanded={isOpen}
273
314
  aria-controls={contentId}
315
+ // A disabled trigger drops out of the tab order so it isn't a silently
316
+ // dead tab stop; activation stays blocked by the handleToggle guard,
317
+ // and aria-disabled keeps the state perceivable to assistive tech —
318
+ // the system-wide disabled convention (never native `disabled`, which
319
+ // would swallow events like a wrapping tooltip's hover).
320
+ tabIndex={isDisabled ? -1 : undefined}
274
321
  {...stylex.props(
275
322
  styles.trigger,
276
323
  density != null && triggerDensity[density],
324
+ isDisabled && styles.triggerDisabled,
277
325
  )}>
278
326
  <span {...stylex.props(styles.triggerLabel)}>{trigger}</span>
279
327
  <span
@@ -286,10 +334,15 @@ export function Collapsible({
286
334
  </button>
287
335
  <div
288
336
  id={contentId}
289
- {...stylex.props(
290
- styles.content,
291
- density != null && contentDensity[density],
292
- !isOpen && styles.contentHidden,
337
+ {...mergeProps(
338
+ themeProps('collapsible-content', {
339
+ density: density ?? undefined,
340
+ }),
341
+ stylex.props(
342
+ styles.content,
343
+ density != null && contentDensity[density],
344
+ !isOpen && styles.contentHidden,
345
+ ),
293
346
  )}>
294
347
  {presentation != null ? (
295
348
  <CollapsibleGroupPresentationContext value={null}>
@@ -36,6 +36,7 @@ import {CommandPaletteInput} from './CommandPaletteInput';
36
36
  import {CommandPaletteFooter} from './CommandPaletteFooter';
37
37
  import {CommandPaletteEmpty} from './CommandPaletteEmpty';
38
38
  import type {BaseProps} from '../BaseProps';
39
+ import {useTranslator} from '../i18n';
39
40
 
40
41
  export interface CommandPaletteProps<
41
42
  T extends SearchableItem = SearchableItem,
@@ -260,14 +261,20 @@ export function CommandPalette<T extends SearchableItem = SearchableItem>({
260
261
  input,
261
262
  footer,
262
263
  renderItem,
263
- emptySearchText = 'No results',
264
- emptyBootstrapText = 'Type to search',
264
+ emptySearchText: emptySearchTextFromProps,
265
+ emptyBootstrapText: emptyBootstrapTextFromProps,
265
266
  value: controlledValue,
266
267
  onValueChange,
267
- label = 'Command palette',
268
+ label: labelFromProps,
268
269
  width = 640,
269
270
  maxHeight = 480,
270
271
  }: CommandPaletteProps<T>) {
272
+ const t = useTranslator();
273
+ const label = labelFromProps ?? t('@astryx.commandPalette.label');
274
+ const emptySearchText =
275
+ emptySearchTextFromProps ?? t('@astryx.commandPalette.emptySearch');
276
+ const emptyBootstrapText =
277
+ emptyBootstrapTextFromProps ?? t('@astryx.commandPalette.emptyBootstrap');
271
278
  const listId = useId();
272
279
  // search: the committed query — only advances when async results arrive.
273
280
  // optimisticSearch: updates immediately on keystroke, drives input + empty state.
@@ -17,7 +17,7 @@ import type {CommandPaletteContextValue} from './CommandPaletteContext';
17
17
  describe('CommandPaletteInput', () => {
18
18
  it('renders with default placeholder', () => {
19
19
  render(<CommandPaletteInput />);
20
- expect(screen.getByPlaceholderText('Search...')).toBeInTheDocument();
20
+ expect(screen.getByPlaceholderText('Search…')).toBeInTheDocument();
21
21
  });
22
22
 
23
23
  it('renders with custom placeholder', () => {
@@ -27,6 +27,7 @@ import {useCommandPaletteContext} from './CommandPaletteContext';
27
27
  import {useDialogContext} from '../Dialog/DialogContext';
28
28
  import type {BaseProps} from '../BaseProps';
29
29
  import {themeProps} from '../utils/themeProps';
30
+ import {useTranslator} from '../i18n';
30
31
 
31
32
  const styles = stylex.create({
32
33
  wrapper: {
@@ -147,7 +148,7 @@ export interface CommandPaletteInputProps extends Omit<
147
148
  export function CommandPaletteInput({
148
149
  value: controlledValue,
149
150
  onValueChange,
150
- placeholder = 'Search...',
151
+ placeholder: placeholderFromProps,
151
152
  hasAutoFocus = true,
152
153
  endContent,
153
154
  onChange,
@@ -156,6 +157,9 @@ export function CommandPaletteInput({
156
157
  xstyle,
157
158
  ...props
158
159
  }: CommandPaletteInputProps) {
160
+ const t = useTranslator();
161
+ const placeholder =
162
+ placeholderFromProps ?? t('@astryx.commandPalette.input.placeholder');
159
163
  const ctx = useCommandPaletteContext();
160
164
  const dialogContext = useDialogContext();
161
165
  const inputRef = useRef<HTMLInputElement>(null);
@@ -20,6 +20,7 @@ import {mergeProps} from '../utils';
20
20
  import {spacingVars} from '../theme/tokens.stylex';
21
21
  import {useCommandPaletteContext} from './CommandPaletteContext';
22
22
  import {themeProps} from '../utils/themeProps';
23
+ import {useTranslator} from '../i18n';
23
24
 
24
25
  const styles = stylex.create({
25
26
  list: {
@@ -72,13 +73,15 @@ export interface CommandPaletteListProps extends BaseProps<HTMLDivElement> {
72
73
  */
73
74
  export function CommandPaletteList({
74
75
  children,
75
- label = 'Commands',
76
+ label: labelFromProps,
76
77
  ref,
77
78
  xstyle,
78
79
  className,
79
80
  style,
80
81
  ...props
81
82
  }: CommandPaletteListProps) {
83
+ const t = useTranslator();
84
+ const label = labelFromProps ?? t('@astryx.commandPalette.list.label');
82
85
  const ctx = useCommandPaletteContext();
83
86
 
84
87
  return (