@astryxdesign/core 0.5.0 → 0.5.1-canary.70169cd

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 (622) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +45 -20
  5. package/dist/AspectRatio/AspectRatio.d.ts +6 -6
  6. package/dist/Avatar/Avatar.d.ts +25 -1
  7. package/dist/Avatar/Avatar.d.ts.map +1 -1
  8. package/dist/Avatar/Avatar.js +43 -9
  9. package/dist/Avatar/index.d.ts +2 -2
  10. package/dist/Avatar/index.d.ts.map +1 -1
  11. package/dist/Avatar/index.js +1 -1
  12. package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
  13. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  14. package/dist/AvatarGroup/AvatarGroup.js +5 -2
  15. package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
  16. package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
  17. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  18. package/dist/AvatarGroup/AvatarGroupOverflow.js +11 -7
  19. package/dist/Badge/Badge.d.ts.map +1 -1
  20. package/dist/Badge/Badge.js +26 -2
  21. package/dist/Banner/Banner.d.ts +10 -1
  22. package/dist/Banner/Banner.d.ts.map +1 -1
  23. package/dist/Banner/Banner.js +11 -2
  24. package/dist/Button/Button.d.ts.map +1 -1
  25. package/dist/Button/Button.js +8 -7
  26. package/dist/Calendar/Calendar.d.ts +4 -2
  27. package/dist/Calendar/Calendar.d.ts.map +1 -1
  28. package/dist/Calendar/Calendar.js +15 -21
  29. package/dist/Calendar/hooks/useCalendarDays.js +4 -6
  30. package/dist/Calendar/hooks/useCalendarNavigation.js +4 -6
  31. package/dist/Calendar/styles.d.ts +5 -20
  32. package/dist/Calendar/styles.d.ts.map +1 -1
  33. package/dist/Calendar/styles.js +15 -17
  34. package/dist/Card/Card.d.ts +12 -12
  35. package/dist/Card/Card.d.ts.map +1 -1
  36. package/dist/Card/Card.js +17 -9
  37. package/dist/Card/index.d.ts +35 -1
  38. package/dist/Card/index.d.ts.map +1 -1
  39. package/dist/Card/index.js +21 -1
  40. package/dist/Carousel/Carousel.d.ts.map +1 -1
  41. package/dist/Carousel/Carousel.js +108 -7
  42. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  43. package/dist/CheckboxInput/CheckboxInput.js +7 -1
  44. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  45. package/dist/CodeBlock/CodeBlock.js +15 -4
  46. package/dist/CodeBlock/highlightRanges.js +1 -1
  47. package/dist/CodeBlock/highlightStyles.js +13 -13
  48. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  49. package/dist/CommandPalette/CommandPaletteItem.js +2 -7
  50. package/dist/ComplexSelector/ComplexSelector.d.ts +10 -2
  51. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  52. package/dist/ComplexSelector/ComplexSelector.js +14 -7
  53. package/dist/DateInput/DateInput.d.ts +43 -0
  54. package/dist/DateInput/DateInput.d.ts.map +1 -1
  55. package/dist/DateInput/DateInput.js +22 -5
  56. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  57. package/dist/DateInput/MonthScroller.js +5 -3
  58. package/dist/DateInput/MonthYearWheels.d.ts.map +1 -1
  59. package/dist/DateInput/MonthYearWheels.js +6 -4
  60. package/dist/DateInput/NativeDateField.d.ts +10 -0
  61. package/dist/DateInput/NativeDateField.d.ts.map +1 -0
  62. package/dist/DateInput/NativeDateField.js +494 -0
  63. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  64. package/dist/DateInput/TouchDateField.js +52 -25
  65. package/dist/DateInput/Wheel.d.ts.map +1 -1
  66. package/dist/DateInput/Wheel.js +1 -0
  67. package/dist/DateInput/index.d.ts +1 -1
  68. package/dist/DateInput/index.d.ts.map +1 -1
  69. package/dist/DateInput/nativeDateSegments.d.ts +22 -0
  70. package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
  71. package/dist/DateInput/nativeDateSegments.js +111 -0
  72. package/dist/DateRangeInput/DateRangeInput.d.ts +4 -2
  73. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  74. package/dist/DateRangeInput/DateRangeInput.js +3 -5
  75. package/dist/DateTimeInput/DateTimeInput.d.ts +23 -24
  76. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  77. package/dist/DateTimeInput/DateTimeInput.js +35 -10
  78. package/dist/DateTimeInput/TouchDateTimeField.d.ts +6 -0
  79. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -0
  80. package/dist/DateTimeInput/TouchDateTimeField.js +1021 -0
  81. package/dist/Dialog/Dialog.d.ts +16 -2
  82. package/dist/Dialog/Dialog.d.ts.map +1 -1
  83. package/dist/Dialog/Dialog.js +28 -7
  84. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  85. package/dist/DropdownMenu/DropdownMenu.js +4 -13
  86. package/dist/Field/FieldLabel.d.ts.map +1 -1
  87. package/dist/Field/FieldLabel.js +9 -1
  88. package/dist/Field/InputClearButton.d.ts +9 -3
  89. package/dist/Field/InputClearButton.d.ts.map +1 -1
  90. package/dist/Field/InputClearButton.js +14 -3
  91. package/dist/Heading/Heading.d.ts.map +1 -1
  92. package/dist/Heading/Heading.js +0 -1
  93. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  94. package/dist/HoverCard/HoverCard.js +104 -3
  95. package/dist/HoverCard/useHoverCard.d.ts +14 -2
  96. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  97. package/dist/HoverCard/useHoverCard.js +7 -1
  98. package/dist/Icon/Icon.d.ts +4 -2
  99. package/dist/Icon/Icon.d.ts.map +1 -1
  100. package/dist/Icon/defaultIcons.d.ts +3 -2
  101. package/dist/Icon/defaultIcons.d.ts.map +1 -1
  102. package/dist/Icon/defaultIcons.js +7 -0
  103. package/dist/Icon/globalIconRegistry.d.ts +13 -0
  104. package/dist/Icon/globalIconRegistry.d.ts.map +1 -1
  105. package/dist/Icon/globalIconRegistry.js +34 -6
  106. package/dist/Icon/index.d.ts +1 -1
  107. package/dist/Icon/index.d.ts.map +1 -1
  108. package/dist/Icon/useIcon.d.ts +5 -2
  109. package/dist/Icon/useIcon.d.ts.map +1 -1
  110. package/dist/Icon/useIcon.js +3 -0
  111. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  112. package/dist/Indicator/CheckboxIndicator.js +6 -2
  113. package/dist/Item/Item.d.ts.map +1 -1
  114. package/dist/Item/Item.js +2 -2
  115. package/dist/Kbd/Kbd.d.ts.map +1 -1
  116. package/dist/Kbd/Kbd.js +2 -26
  117. package/dist/Layer/gestureCounter.d.ts +8 -0
  118. package/dist/Layer/gestureCounter.d.ts.map +1 -0
  119. package/dist/Layer/gestureCounter.js +53 -0
  120. package/dist/Layer/useLayer.d.ts +23 -13
  121. package/dist/Layer/useLayer.d.ts.map +1 -1
  122. package/dist/Layer/useLayer.js +146 -24
  123. package/dist/List/List.d.ts +1 -1
  124. package/dist/List/List.d.ts.map +1 -1
  125. package/dist/List/List.js +15 -4
  126. package/dist/Markdown/Markdown.d.ts +1 -1
  127. package/dist/Markdown/Markdown.d.ts.map +1 -1
  128. package/dist/Markdown/Markdown.js +20 -7
  129. package/dist/Markdown/parser.d.ts.map +1 -1
  130. package/dist/Markdown/parser.js +5 -3
  131. package/dist/MetadataList/MetadataListItem.d.ts +1 -1
  132. package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
  133. package/dist/MetadataList/MetadataListItem.js +4 -1
  134. package/dist/MultiSelector/MultiSelector.d.ts +18 -1
  135. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  136. package/dist/MultiSelector/MultiSelector.js +58 -11
  137. package/dist/MultiSelector/hooks.d.ts +7 -1
  138. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  139. package/dist/MultiSelector/hooks.js +3 -2
  140. package/dist/NavIcon/NavIcon.d.ts.map +1 -1
  141. package/dist/NavIcon/NavIcon.js +5 -1
  142. package/dist/NavItem/navItemStyles.stylex.d.ts +0 -8
  143. package/dist/NavItem/navItemStyles.stylex.d.ts.map +1 -1
  144. package/dist/NavItem/navItemStyles.stylex.js +0 -2
  145. package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
  146. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  147. package/dist/NavMenu/NavHeadingMenu.js +7 -4
  148. package/dist/NumberInput/NumberInput.d.ts +6 -1
  149. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  150. package/dist/NumberInput/NumberInput.js +95 -126
  151. package/dist/NumberInput/numberInputCommit.d.ts +34 -0
  152. package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
  153. package/dist/NumberInput/numberInputCommit.js +71 -0
  154. package/dist/NumberInput/numberParser.d.ts +64 -0
  155. package/dist/NumberInput/numberParser.d.ts.map +1 -0
  156. package/dist/NumberInput/numberParser.js +350 -0
  157. package/dist/Outline/Outline.d.ts.map +1 -1
  158. package/dist/Outline/Outline.js +2 -3
  159. package/dist/OverflowList/OverflowList.d.ts +41 -1
  160. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  161. package/dist/OverflowList/OverflowList.js +43 -2
  162. package/dist/Popover/Popover.d.ts.map +1 -1
  163. package/dist/Popover/Popover.js +8 -14
  164. package/dist/Popover/usePopover.d.ts +15 -41
  165. package/dist/Popover/usePopover.d.ts.map +1 -1
  166. package/dist/Popover/usePopover.js +26 -7
  167. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  168. package/dist/PowerSearch/PowerSearchValueEditor.js +91 -18
  169. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  170. package/dist/PowerSearch/formatFilterValue.js +4 -2
  171. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  172. package/dist/ProgressBar/ProgressBar.js +18 -5
  173. package/dist/Resizable/useResizable.d.ts +19 -1
  174. package/dist/Resizable/useResizable.d.ts.map +1 -1
  175. package/dist/Resizable/useResizable.js +104 -38
  176. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  177. package/dist/SelectableCard/SelectableCard.js +9 -0
  178. package/dist/Selector/Selector.d.ts +18 -1
  179. package/dist/Selector/Selector.d.ts.map +1 -1
  180. package/dist/Selector/Selector.js +92 -21
  181. package/dist/Selector/hooks.d.ts +7 -1
  182. package/dist/Selector/hooks.d.ts.map +1 -1
  183. package/dist/Selector/hooks.js +3 -2
  184. package/dist/SideNav/SideNav.d.ts +6 -1
  185. package/dist/SideNav/SideNav.d.ts.map +1 -1
  186. package/dist/SideNav/SideNav.js +57 -27
  187. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  188. package/dist/SideNav/SideNavHeading.js +5 -4
  189. package/dist/SideNav/SideNavItem.d.ts +29 -4
  190. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  191. package/dist/SideNav/SideNavItem.js +75 -20
  192. package/dist/Slider/Slider.d.ts.map +1 -1
  193. package/dist/Slider/Slider.js +34 -2
  194. package/dist/Spinner/Spinner.d.ts +3 -1
  195. package/dist/Spinner/Spinner.d.ts.map +1 -1
  196. package/dist/Spinner/Spinner.js +199 -20
  197. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  198. package/dist/StatusDot/StatusDot.js +6 -1
  199. package/dist/Stepper/Step.d.ts.map +1 -1
  200. package/dist/Stepper/Step.js +7 -6
  201. package/dist/Switch/Switch.d.ts.map +1 -1
  202. package/dist/Switch/Switch.js +5 -1
  203. package/dist/Table/BaseTable.d.ts.map +1 -1
  204. package/dist/Table/BaseTable.js +6 -1
  205. package/dist/Table/Table.d.ts.map +1 -1
  206. package/dist/Table/Table.js +3 -6
  207. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  208. package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
  209. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +26 -0
  210. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  211. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +34 -3
  212. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  213. package/dist/Table/plugins/selection/useTableSelection.js +25 -1
  214. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  215. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
  216. package/dist/Text/Text.d.ts.map +1 -1
  217. package/dist/Text/Text.js +0 -1
  218. package/dist/TextArea/TextArea.d.ts.map +1 -1
  219. package/dist/TextArea/TextArea.js +13 -8
  220. package/dist/Timestamp/Timestamp.d.ts +1 -1
  221. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  222. package/dist/Timestamp/Timestamp.js +10 -18
  223. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  224. package/dist/Timestamp/formatInstant.js +10 -5
  225. package/dist/Toast/Toast.d.ts +17 -2
  226. package/dist/Toast/Toast.d.ts.map +1 -1
  227. package/dist/Toast/Toast.js +77 -11
  228. package/dist/Toast/ToastViewport.d.ts +1 -0
  229. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  230. package/dist/Toast/ToastViewport.js +76 -21
  231. package/dist/Toast/index.d.ts +1 -1
  232. package/dist/Toast/index.d.ts.map +1 -1
  233. package/dist/Toast/types.d.ts +38 -0
  234. package/dist/Toast/types.d.ts.map +1 -1
  235. package/dist/Toast/useToastGesture.d.ts +26 -0
  236. package/dist/Toast/useToastGesture.d.ts.map +1 -0
  237. package/dist/Toast/useToastGesture.js +223 -0
  238. package/dist/Token/Token.d.ts +1 -1
  239. package/dist/Token/Token.d.ts.map +1 -1
  240. package/dist/Token/Token.js +23 -12
  241. package/dist/Token/TokenLink.d.ts +1 -1
  242. package/dist/Token/TokenLink.d.ts.map +1 -1
  243. package/dist/Token/TokenLink.js +5 -2
  244. package/dist/Tokenizer/Tokenizer.d.ts +12 -1
  245. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  246. package/dist/Tokenizer/Tokenizer.js +31 -21
  247. package/dist/TopNav/TopNavHeading.js +2 -2
  248. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  249. package/dist/TopNav/TopNavItem.js +3 -3
  250. package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
  251. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  252. package/dist/TopNav/TopNavMegaMenu.js +30 -9
  253. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  254. package/dist/TopNav/TopNavMegaMenuItem.js +3 -3
  255. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  256. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  257. package/dist/TopNav/TopNavMenu.js +21 -6
  258. package/dist/TreeList/TreeList.d.ts +1 -1
  259. package/dist/TreeList/TreeList.d.ts.map +1 -1
  260. package/dist/TreeList/TreeList.js +7 -2
  261. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  262. package/dist/TreeList/TreeListItem.js +2 -2
  263. package/dist/Typeahead/BaseTypeahead.d.ts +33 -0
  264. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  265. package/dist/Typeahead/BaseTypeahead.js +51 -8
  266. package/dist/Typeahead/Typeahead.d.ts +8 -1
  267. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  268. package/dist/Typeahead/Typeahead.js +2 -0
  269. package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
  270. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  271. package/dist/Typeahead/TypeaheadItem.js +7 -2
  272. package/dist/astryx.css +87 -22
  273. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  274. package/dist/hooks/useHotkeys.js +3 -25
  275. package/dist/hooks/useOverflow.d.ts.map +1 -1
  276. package/dist/hooks/useOverflow.js +14 -4
  277. package/dist/i18n/InternationalizationContext.d.ts +2 -0
  278. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  279. package/dist/i18n/InternationalizationContext.js +3 -1
  280. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  281. package/dist/i18n/InternationalizationProvider.js +3 -1
  282. package/dist/i18n/resolve.d.ts +1 -1
  283. package/dist/i18n/resolve.d.ts.map +1 -1
  284. package/dist/i18n/resolve.js +37 -38
  285. package/dist/i18n/useTranslator.d.ts.map +1 -1
  286. package/dist/i18n/useTranslator.js +2 -3
  287. package/dist/index.d.ts +1 -1
  288. package/dist/index.d.ts.map +1 -1
  289. package/dist/theme/Theme.d.ts.map +1 -1
  290. package/dist/theme/Theme.js +46 -10
  291. package/dist/theme/defineTheme.d.ts +9 -3
  292. package/dist/theme/defineTheme.d.ts.map +1 -1
  293. package/dist/theme/defineTheme.js +5 -0
  294. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  295. package/dist/theme/derivedVarRegistry.js +24 -4
  296. package/dist/theme/generateThemeRules.d.ts +21 -0
  297. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  298. package/dist/theme/generateThemeRules.js +26 -0
  299. package/dist/theme/syntax/tokens.d.ts +1 -1
  300. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  301. package/dist/theme/syntax/tokens.js +5 -2
  302. package/dist/theme/useTheme.d.ts.map +1 -1
  303. package/dist/theme/useTheme.js +6 -7
  304. package/dist/utils/dateParser.d.ts +5 -8
  305. package/dist/utils/dateParser.d.ts.map +1 -1
  306. package/dist/utils/dateParser.js +10 -11
  307. package/dist/utils/focusOutline.stylex.d.ts +25 -0
  308. package/dist/utils/focusOutline.stylex.d.ts.map +1 -1
  309. package/dist/utils/focusOutline.stylex.js +15 -0
  310. package/dist/utils/interactionOverlay.stylex.d.ts +26 -0
  311. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -0
  312. package/dist/utils/interactionOverlay.stylex.js +42 -0
  313. package/dist/utils/isApplePlatform.d.ts +18 -0
  314. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  315. package/dist/utils/isApplePlatform.js +37 -0
  316. package/dist/utils/plainDate.d.ts +11 -0
  317. package/dist/utils/plainDate.d.ts.map +1 -1
  318. package/dist/utils/plainDate.js +20 -4
  319. package/locales/af-ZA.json +7 -7
  320. package/locales/ar-SA.json +7 -7
  321. package/locales/ca-ES.json +6 -6
  322. package/locales/cs-CZ.json +7 -7
  323. package/locales/da-DK.json +7 -7
  324. package/locales/de-DE.json +7 -7
  325. package/locales/el-GR.json +7 -7
  326. package/locales/en.json +178 -6
  327. package/locales/es-ES.json +6 -6
  328. package/locales/fi-FI.json +7 -7
  329. package/locales/fr-FR.json +7 -7
  330. package/locales/he-IL.json +7 -7
  331. package/locales/hu-HU.json +7 -7
  332. package/locales/it-IT.json +7 -7
  333. package/locales/ja-JP.json +7 -7
  334. package/locales/ko-KR.json +7 -7
  335. package/locales/nl-NL.json +7 -7
  336. package/locales/no-NO.json +7 -7
  337. package/locales/pl-PL.json +7 -7
  338. package/locales/pseudo.json +130 -1
  339. package/locales/pt-BR.json +7 -7
  340. package/locales/pt-PT.json +7 -7
  341. package/locales/ro-RO.json +7 -7
  342. package/locales/ru-RU.json +7 -7
  343. package/locales/sr-SP.json +7 -7
  344. package/locales/sv-SE.json +7 -7
  345. package/locales/tr-TR.json +7 -7
  346. package/locales/uk-UA.json +7 -7
  347. package/locales/vi-VN.json +7 -7
  348. package/locales/zh-CN.json +7 -7
  349. package/locales/zh-TW.json +7 -7
  350. package/package.json +4 -5
  351. package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
  352. package/src/AlertDialog/AlertDialog.test.tsx +211 -2
  353. package/src/AlertDialog/AlertDialog.tsx +62 -20
  354. package/src/AspectRatio/AspectRatio.doc.mjs +3 -3
  355. package/src/AspectRatio/AspectRatio.tsx +6 -6
  356. package/src/Avatar/Avatar.doc.mjs +12 -2
  357. package/src/Avatar/Avatar.test.tsx +80 -0
  358. package/src/Avatar/Avatar.tsx +64 -14
  359. package/src/Avatar/index.ts +2 -2
  360. package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
  361. package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
  362. package/src/AvatarGroup/AvatarGroup.tsx +12 -4
  363. package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
  364. package/src/AvatarGroup/AvatarGroupOverflow.tsx +12 -12
  365. package/src/Badge/Badge.doc.mjs +3 -2
  366. package/src/Badge/Badge.test.tsx +32 -3
  367. package/src/Badge/Badge.tsx +42 -1
  368. package/src/Banner/Banner.doc.mjs +9 -0
  369. package/src/Banner/Banner.test.tsx +76 -11
  370. package/src/Banner/Banner.tsx +21 -2
  371. package/src/Button/Button.doc.mjs +2 -1
  372. package/src/Button/Button.test.tsx +19 -4
  373. package/src/Button/Button.tsx +9 -29
  374. package/src/ButtonGroup/ButtonGroup.doc.mjs +2 -2
  375. package/src/ButtonGroup/ButtonGroup.test.tsx +13 -0
  376. package/src/Calendar/Calendar.doc.mjs +4 -4
  377. package/src/Calendar/Calendar.test.tsx +112 -0
  378. package/src/Calendar/Calendar.tsx +18 -16
  379. package/src/Calendar/hooks/useCalendarDays.ts +4 -4
  380. package/src/Calendar/hooks/useCalendarNavigation.ts +4 -4
  381. package/src/Calendar/styles.ts +48 -42
  382. package/src/Card/Card.doc.mjs +10 -7
  383. package/src/Card/Card.test.tsx +113 -19
  384. package/src/Card/Card.tsx +67 -89
  385. package/src/Card/index.ts +36 -1
  386. package/src/Carousel/Carousel.doc.mjs +3 -0
  387. package/src/Carousel/Carousel.test.tsx +360 -0
  388. package/src/Carousel/Carousel.tsx +116 -15
  389. package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -1
  390. package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
  391. package/src/CheckboxInput/CheckboxInput.tsx +5 -0
  392. package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
  393. package/src/CodeBlock/CodeBlock.doc.mjs +10 -4
  394. package/src/CodeBlock/CodeBlock.test.tsx +37 -0
  395. package/src/CodeBlock/CodeBlock.tsx +20 -4
  396. package/src/CodeBlock/highlightRanges.ts +1 -1
  397. package/src/CodeBlock/highlightStyles.ts +13 -13
  398. package/src/CommandPalette/CommandPaletteItem.tsx +2 -12
  399. package/src/ComplexSelector/ComplexSelector.doc.mjs +9 -2
  400. package/src/ComplexSelector/ComplexSelector.test.tsx +183 -0
  401. package/src/ComplexSelector/ComplexSelector.tsx +22 -12
  402. package/src/DateInput/DateInput.doc.mjs +17 -1
  403. package/src/DateInput/DateInput.test.tsx +9 -4
  404. package/src/DateInput/DateInput.tsx +54 -3
  405. package/src/DateInput/DateInputTouch.test.tsx +146 -32
  406. package/src/DateInput/MonthScroller.tsx +5 -1
  407. package/src/DateInput/MonthYearWheels.tsx +7 -4
  408. package/src/DateInput/NativeDateField.test.tsx +635 -0
  409. package/src/DateInput/NativeDateField.tsx +641 -0
  410. package/src/DateInput/TouchDateField.tsx +83 -33
  411. package/src/DateInput/Wheel.tsx +1 -0
  412. package/src/DateInput/index.ts +1 -0
  413. package/src/DateInput/nativeDateSegments.ts +127 -0
  414. package/src/DateRangeInput/DateRangeInput.doc.mjs +3 -3
  415. package/src/DateRangeInput/DateRangeInput.test.tsx +46 -0
  416. package/src/DateRangeInput/DateRangeInput.tsx +8 -13
  417. package/src/DateTimeInput/DateTimeInput.doc.mjs +39 -22
  418. package/src/DateTimeInput/DateTimeInput.test.tsx +76 -0
  419. package/src/DateTimeInput/DateTimeInput.tsx +54 -20
  420. package/src/DateTimeInput/DateTimeInputTouch.test.tsx +980 -0
  421. package/src/DateTimeInput/TouchDateTimeField.tsx +1437 -0
  422. package/src/Dialog/Dialog.test.tsx +185 -18
  423. package/src/Dialog/Dialog.tsx +35 -11
  424. package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
  425. package/src/DropdownMenu/DropdownMenu.tsx +4 -13
  426. package/src/Field/Field.doc.mjs +1 -1
  427. package/src/Field/FieldLabel.test.tsx +29 -0
  428. package/src/Field/FieldLabel.tsx +7 -0
  429. package/src/Field/InputClearButton.test.tsx +15 -1
  430. package/src/Field/InputClearButton.tsx +28 -4
  431. package/src/FieldStatus/FieldStatus.doc.mjs +1 -1
  432. package/src/FileInput/FileInput.doc.mjs +1 -1
  433. package/src/Heading/Heading.tsx +0 -1
  434. package/src/HoverCard/HoverCard.doc.mjs +8 -2
  435. package/src/HoverCard/HoverCard.test.tsx +154 -4
  436. package/src/HoverCard/HoverCard.tsx +137 -3
  437. package/src/HoverCard/useHoverCard.tsx +23 -3
  438. package/src/Icon/Icon.test.tsx +55 -1
  439. package/src/Icon/Icon.tsx +5 -3
  440. package/src/Icon/defaultIcons.tsx +11 -2
  441. package/src/Icon/globalIconRegistry.test.tsx +16 -3
  442. package/src/Icon/globalIconRegistry.tsx +37 -6
  443. package/src/Icon/index.ts +1 -0
  444. package/src/Icon/useIcon.ts +9 -2
  445. package/src/Indicator/CheckboxIndicator.tsx +14 -8
  446. package/src/Indicator/Indicator.doc.mjs +3 -1
  447. package/src/InputGroup/InputGroup.doc.mjs +1 -1
  448. package/src/Item/Item.tsx +2 -7
  449. package/src/Kbd/Kbd.test.tsx +0 -17
  450. package/src/Kbd/Kbd.tsx +2 -26
  451. package/src/Layer/gestureCounter.ts +57 -0
  452. package/src/Layer/useLayer.test.tsx +368 -16
  453. package/src/Layer/useLayer.tsx +208 -35
  454. package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
  455. package/src/List/List.test.tsx +38 -0
  456. package/src/List/List.tsx +8 -1
  457. package/src/Markdown/Markdown.test.tsx +37 -0
  458. package/src/Markdown/Markdown.tsx +16 -5
  459. package/src/Markdown/parser.test.ts +33 -0
  460. package/src/Markdown/parser.ts +9 -3
  461. package/src/MetadataList/MetadataList.test.tsx +75 -2
  462. package/src/MetadataList/MetadataListItem.tsx +5 -2
  463. package/src/MultiSelector/MultiSelector.doc.mjs +23 -2
  464. package/src/MultiSelector/MultiSelector.test.tsx +205 -0
  465. package/src/MultiSelector/MultiSelector.tsx +103 -16
  466. package/src/MultiSelector/hooks.ts +9 -2
  467. package/src/NavIcon/NavIcon.doc.mjs +8 -2
  468. package/src/NavIcon/NavIcon.test.tsx +9 -0
  469. package/src/NavIcon/NavIcon.tsx +5 -1
  470. package/src/NavItem/navItemStyles.stylex.ts +0 -8
  471. package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
  472. package/src/NavMenu/NavHeadingMenu.tsx +7 -4
  473. package/src/NumberInput/NumberInput.doc.mjs +27 -8
  474. package/src/NumberInput/NumberInput.test.tsx +563 -8
  475. package/src/NumberInput/NumberInput.tsx +77 -131
  476. package/src/NumberInput/numberInputCommit.test.ts +72 -0
  477. package/src/NumberInput/numberInputCommit.ts +103 -0
  478. package/src/NumberInput/numberParser.docblock.test.ts +234 -0
  479. package/src/NumberInput/numberParser.test.ts +222 -0
  480. package/src/NumberInput/numberParser.ts +403 -0
  481. package/src/Outline/Outline.tsx +2 -4
  482. package/src/OverflowList/OverflowList.doc.mjs +102 -21
  483. package/src/OverflowList/OverflowList.test.tsx +550 -4
  484. package/src/OverflowList/OverflowList.tsx +100 -2
  485. package/src/Pagination/Pagination.test.tsx +3 -2
  486. package/src/Popover/Popover.doc.mjs +2 -2
  487. package/src/Popover/Popover.test.tsx +38 -0
  488. package/src/Popover/Popover.tsx +28 -66
  489. package/src/Popover/usePopover.tsx +44 -5
  490. package/src/PowerSearch/PowerSearch.doc.mjs +1 -1
  491. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +87 -0
  492. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +64 -0
  493. package/src/PowerSearch/PowerSearchValueEditor.tsx +109 -10
  494. package/src/PowerSearch/formatFilterValue.test.ts +16 -1
  495. package/src/PowerSearch/formatFilterValue.ts +2 -0
  496. package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
  497. package/src/ProgressBar/ProgressBar.test.tsx +24 -0
  498. package/src/ProgressBar/ProgressBar.tsx +28 -8
  499. package/src/RadioList/RadioList.doc.mjs +1 -1
  500. package/src/Resizable/Resizable.doc.mjs +2 -2
  501. package/src/Resizable/useResizable.doc.mjs +21 -2
  502. package/src/Resizable/useResizable.test.ts +421 -0
  503. package/src/Resizable/useResizable.ts +133 -48
  504. package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
  505. package/src/SelectableCard/SelectableCard.tsx +16 -0
  506. package/src/Selector/Selector.doc.mjs +15 -1
  507. package/src/Selector/Selector.source-build.test.mjs +65 -0
  508. package/src/Selector/Selector.test.tsx +301 -0
  509. package/src/Selector/Selector.tsx +145 -32
  510. package/src/Selector/hooks.ts +17 -2
  511. package/src/SideNav/SideNav.doc.mjs +2 -2
  512. package/src/SideNav/SideNav.test.tsx +1069 -6
  513. package/src/SideNav/SideNav.tsx +109 -38
  514. package/src/SideNav/SideNavHeading.tsx +5 -2
  515. package/src/SideNav/SideNavItem.doc.mjs +24 -3
  516. package/src/SideNav/SideNavItem.tsx +134 -44
  517. package/src/Slider/Slider.doc.mjs +2 -2
  518. package/src/Slider/Slider.test.tsx +106 -1
  519. package/src/Slider/Slider.tsx +52 -1
  520. package/src/Spinner/Spinner.doc.mjs +17 -5
  521. package/src/Spinner/Spinner.test.tsx +164 -0
  522. package/src/Spinner/Spinner.tsx +252 -22
  523. package/src/StatusDot/StatusDot.doc.mjs +8 -2
  524. package/src/StatusDot/StatusDot.test.tsx +9 -0
  525. package/src/StatusDot/StatusDot.tsx +7 -1
  526. package/src/Stepper/Step.doc.mjs +1 -1
  527. package/src/Stepper/Step.tsx +7 -14
  528. package/src/Switch/Switch.doc.mjs +3 -1
  529. package/src/Switch/Switch.test.tsx +10 -0
  530. package/src/Switch/Switch.tsx +3 -0
  531. package/src/Table/BaseTable.tsx +6 -1
  532. package/src/Table/Table.doc.mjs +5 -3
  533. package/src/Table/Table.tsx +3 -8
  534. package/src/Table/TableBody.doc.mjs +2 -2
  535. package/src/Table/TableFooter.doc.mjs +1 -1
  536. package/src/Table/TableHeader.doc.mjs +1 -1
  537. package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
  538. package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
  539. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +50 -4
  540. package/src/Table/plugins/selection/useTableSelection.test.tsx +62 -0
  541. package/src/Table/plugins/selection/useTableSelection.tsx +25 -2
  542. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
  543. package/src/Table/useTableGroupedRows.doc.mjs +3 -3
  544. package/src/Table/useTablePagination.doc.mjs +1 -1
  545. package/src/Table/useTableSelection.doc.mjs +1 -1
  546. package/src/Text/Text.test.tsx +44 -0
  547. package/src/Text/Text.tsx +0 -1
  548. package/src/TextArea/TextArea.doc.mjs +13 -3
  549. package/src/TextArea/TextArea.test.tsx +11 -0
  550. package/src/TextArea/TextArea.tsx +34 -22
  551. package/src/TextInput/TextInput.doc.mjs +1 -1
  552. package/src/TimeInput/TimeInput.doc.mjs +1 -1
  553. package/src/Timestamp/Timestamp.test.tsx +89 -0
  554. package/src/Timestamp/Timestamp.tsx +8 -8
  555. package/src/Timestamp/formatInstant.ts +5 -0
  556. package/src/Toast/Toast.doc.mjs +213 -44
  557. package/src/Toast/Toast.tsx +118 -23
  558. package/src/Toast/ToastViewport.test.tsx +1434 -8
  559. package/src/Toast/ToastViewport.tsx +85 -14
  560. package/src/Toast/index.ts +2 -0
  561. package/src/Toast/types.ts +43 -5
  562. package/src/Toast/useToastGesture.ts +361 -0
  563. package/src/Token/Token.test.tsx +95 -0
  564. package/src/Token/Token.tsx +19 -17
  565. package/src/Token/TokenLink.tsx +12 -3
  566. package/src/Tokenizer/Tokenizer.doc.mjs +17 -4
  567. package/src/Tokenizer/Tokenizer.test.tsx +161 -0
  568. package/src/Tokenizer/Tokenizer.tsx +49 -24
  569. package/src/TopNav/TopNavHeading.tsx +2 -2
  570. package/src/TopNav/TopNavItem.tsx +3 -7
  571. package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
  572. package/src/TopNav/TopNavMegaMenu.tsx +47 -4
  573. package/src/TopNav/TopNavMegaMenuItem.tsx +10 -9
  574. package/src/TopNav/TopNavMenu.test.tsx +133 -1
  575. package/src/TopNav/TopNavMenu.tsx +38 -5
  576. package/src/TreeList/TreeList.test.tsx +49 -0
  577. package/src/TreeList/TreeList.tsx +7 -2
  578. package/src/TreeList/TreeListItem.tsx +2 -7
  579. package/src/Typeahead/BaseTypeahead.doc.mjs +13 -0
  580. package/src/Typeahead/BaseTypeahead.tsx +96 -6
  581. package/src/Typeahead/Typeahead.doc.mjs +7 -1
  582. package/src/Typeahead/Typeahead.test.tsx +154 -0
  583. package/src/Typeahead/Typeahead.tsx +9 -0
  584. package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
  585. package/src/Typeahead/TypeaheadItem.tsx +8 -1
  586. package/src/hooks/useAnnounce.doc.mjs +96 -0
  587. package/src/hooks/useDevWarning.doc.mjs +96 -0
  588. package/src/hooks/useHotkeys.test.ts +0 -18
  589. package/src/hooks/useHotkeys.ts +3 -25
  590. package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
  591. package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
  592. package/src/hooks/useInteractiveRole.doc.mjs +119 -0
  593. package/src/hooks/useLongPress.doc.mjs +123 -0
  594. package/src/hooks/useOverflow.doc.mjs +58 -17
  595. package/src/hooks/useOverflow.ts +16 -4
  596. package/src/hooks/useTypeahead.doc.mjs +153 -0
  597. package/src/i18n/InternationalizationContext.ts +3 -0
  598. package/src/i18n/InternationalizationProvider.tsx +8 -1
  599. package/src/i18n/__tests__/resolve.test.ts +23 -1
  600. package/src/i18n/resolve.ts +46 -49
  601. package/src/i18n/useTranslator.ts +2 -7
  602. package/src/index.ts +2 -0
  603. package/src/raw-import.d.ts +14 -0
  604. package/src/theme/Theme.test.tsx +104 -2
  605. package/src/theme/Theme.tsx +49 -14
  606. package/src/theme/defineTheme.test.ts +23 -0
  607. package/src/theme/defineTheme.ts +12 -3
  608. package/src/theme/derivedVarRegistry.test.ts +87 -3
  609. package/src/theme/derivedVarRegistry.ts +23 -4
  610. package/src/theme/generateThemeRules.test.ts +99 -1
  611. package/src/theme/generateThemeRules.ts +28 -0
  612. package/src/theme/syntax/tokens.ts +5 -2
  613. package/src/theme/useTheme.test.tsx +10 -0
  614. package/src/theme/useTheme.ts +16 -10
  615. package/src/utils/dateParser.test.ts +34 -2
  616. package/src/utils/dateParser.ts +11 -14
  617. package/src/utils/focusOutline.stylex.ts +50 -0
  618. package/src/utils/interactionOverlay.stylex.ts +74 -0
  619. package/src/utils/isApplePlatform.test.ts +61 -0
  620. package/src/utils/isApplePlatform.ts +37 -0
  621. package/src/utils/plainDate.test.ts +46 -0
  622. package/src/utils/plainDate.ts +18 -3
@@ -34,6 +34,16 @@ import {themeProps} from '../utils/themeProps';
34
34
  */
35
35
  const ARC_FRACTION = 0.375;
36
36
 
37
+ /**
38
+ * The dash pattern, per unit of diameter: one arc, then the gap that closes
39
+ * the circle. The circumference is `pi x diameter`, so multiplying the
40
+ * resolved diameter by these two constants gives exactly the lengths the
41
+ * default render has always used, and scales them with a themed diameter.
42
+ */
43
+ const PI = 3.141592653589793;
44
+ const ARC_DASH = PI * ARC_FRACTION;
45
+ const ARC_GAP = PI * (1 - ARC_FRACTION);
46
+
37
47
  const SIZES = {
38
48
  sm: {diameter: 10, border: 2},
39
49
  md: {diameter: 14, border: 3},
@@ -41,14 +51,103 @@ const SIZES = {
41
51
  xl: {diameter: 28, border: 4},
42
52
  };
43
53
 
44
- /** `onMedia` keeps the 77/255 its token's `4D` hex suffix used to encode. */
45
- const TRACK_OPACITY = {
54
+ /**
55
+ * Opacity the track is drawn at, per shade. `77 / 255` is the `4D` the onMedia
56
+ * track used to append to the token's hex — the same composite, but applied as
57
+ * `stroke-opacity` to a color off the cascade, so it no longer depends on the
58
+ * token being hex notation and it applies to a themed color too.
59
+ */
60
+ const TRACK_OPACITY: Record<SpinnerShade, number> = {
46
61
  default: 1,
47
62
  subtle: 1,
48
63
  onMedia: 77 / 255,
49
64
  inherit: 0.3,
50
65
  };
51
66
 
67
+ /**
68
+ * Where the resolved geometry lands: the public var, resolved into a registered
69
+ * `<length>` the `calc()`s below can do arithmetic on. The box and the ring
70
+ * read these; the public vars are declared once, on the element carrying the
71
+ * theme target, by `sizeStyles`.
72
+ */
73
+ const RESOLVED_DIAMETER = '--_spinner-ring-diameter';
74
+ const RESOLVED_STROKE = '--_spinner-ring-stroke';
75
+ const RESOLVED_GEOMETRY_VARS = [RESOLVED_DIAMETER, RESOLVED_STROKE];
76
+
77
+ /**
78
+ * The composed box size: diameter plus a stroke width on each side.
79
+ *
80
+ * It is deliberately NOT registered, unlike the pair above. The element reads
81
+ * it through an inline `width`/`height` with the size's own default as the
82
+ * `var()` fallback, so a render with no stylesheet — where nothing declares
83
+ * it — still sizes the box the way it always did. A registered property always
84
+ * has a value (its `initial-value`), which would swallow that fallback and
85
+ * collapse the box to zero.
86
+ */
87
+ const BOX_SIZE = '--_spinner-box-size';
88
+
89
+ /**
90
+ * Register the resolved geometry vars as `<length>`.
91
+ *
92
+ * Both are consumed inside `calc()` — the box adds two stroke widths to a diameter,
93
+ * the circle halves one. Unregistered, a custom property substitutes as text,
94
+ * so whatever a theme wrote lands in the expression verbatim and a bare `0`
95
+ * (a valid length on its own, a `<number>` inside `calc()`) poisons the sum:
96
+ * `calc(28px + 0 * 2)` is invalid at computed-value time and the box loses its
97
+ * size. Registered, the value is already an absolute length by the time the
98
+ * `calc()` sees it, so `0` means `0px` — a zero-width stroke that paints
99
+ * nothing — rather than a bare `0` that invalidates the sum and leaves the box
100
+ * with no size at all. One `stroke-width` drives both circles, so a themed
101
+ * stroke width of `0` hides the arc along with the track; an arc with no track behind
102
+ * it is `--spinner-track-color: transparent`.
103
+ *
104
+ * Only these private vars are registered. The four public ones deliberately
105
+ * are not: a registered property has an `initial-value`, so every element in
106
+ * the document would report a value for it — and
107
+ * `.github/scripts/theme-var-reachability.js` finds a var's declaring element
108
+ * by exactly that test, so registering them would point the guard at `<html>`
109
+ * and report a var no theme can select.
110
+ */
111
+ function registerSpinnerVars(): void {
112
+ if (
113
+ typeof CSS === 'undefined' ||
114
+ typeof CSS.registerProperty !== 'function'
115
+ ) {
116
+ return;
117
+ }
118
+ for (const name of RESOLVED_GEOMETRY_VARS) {
119
+ try {
120
+ CSS.registerProperty({
121
+ name,
122
+ syntax: '<length>',
123
+ inherits: true,
124
+ initialValue: '0px',
125
+ });
126
+ } catch {
127
+ // Already registered — a second copy of the package on the page, or a
128
+ // fast-refresh re-evaluation. registerProperty throws rather than
129
+ // replacing, and the existing registration is this same one.
130
+ }
131
+ }
132
+ }
133
+
134
+ // Registering an inherited property with an `initial-value` invalidates style
135
+ // for the whole document, so this runs when the module is evaluated rather
136
+ // than when a spinner mounts. A spinner is the loading indicator: it mounts
137
+ // onto a page that is already rendered, with someone already waiting, and the
138
+ // recalc it triggers there is paid on the full tree. At import the tree is
139
+ // whatever has rendered so far, which for a bundle loaded in the head is
140
+ // nothing.
141
+ //
142
+ // It is safe at module scope in both directions. The `typeof CSS` guard above
143
+ // keeps it out of the server render, and tree-shaking cannot strip it from a
144
+ // build that renders a spinner: core's `sideEffects` allowlist does not name
145
+ // this file, so a bundle that never imports `Spinner` drops the module whole —
146
+ // registration and all, which is the outcome you want — while one that does
147
+ // import it keeps the module, and a bare call is not something a bundler may
148
+ // elide.
149
+ registerSpinnerVars();
150
+
52
151
  /**
53
152
  * Pin every ring's rotation to the document timeline's origin instead of its
54
153
  * own start time, so spinners mounted seconds apart turn in phase.
@@ -78,12 +177,20 @@ function pinRingsToTimelineOrigin(): void {
78
177
  }
79
178
  }
80
179
 
180
+ /**
181
+ * Ref callback for the ring: the one place a mounted ring touches the DOM.
182
+ *
183
+ * It reads nothing back — the geometry is resolved by the cascade, not in JS.
184
+ */
81
185
  function syncRotationPhase(
82
186
  svg: SVGSVGElement | null,
83
187
  ): (() => void) | undefined {
188
+ if (svg == null) {
189
+ return undefined;
190
+ }
84
191
  // jsdom implements no Web Animations, and this runs in every consumer's
85
192
  // component tests.
86
- if (svg == null || typeof svg.getAnimations !== 'function') {
193
+ if (typeof svg.getAnimations !== 'function') {
87
194
  return undefined;
88
195
  }
89
196
  pendingRings.add(svg);
@@ -121,11 +228,31 @@ const styles = stylex.create({
121
228
  placeItems: 'center',
122
229
  overflow: 'hidden',
123
230
  verticalAlign: 'middle',
231
+ // The public geometry vars, resolved into the registered `<length>` pair
232
+ // the arithmetic below needs. Reading them here rather than in each
233
+ // `calc()` keeps one place where a themed value enters the component, and
234
+ // it is the span that reads them whether the theme target is the span or
235
+ // the wrapper — a custom property inherits either way.
236
+ [RESOLVED_DIAMETER]: 'var(--spinner-diameter)',
237
+ [RESOLVED_STROKE]: 'var(--spinner-stroke-width)',
238
+ // The size of the box, composed here and applied as an inline style at the
239
+ // element, so that the box and the drawn ring come from the same two vars
240
+ // and a themed size moves both together — without the sizing moving from
241
+ // an inline style to a rule, which would hand a caller's `style={{width}}`
242
+ // a precedence over the box that it has never had.
243
+ [BOX_SIZE]: `calc(var(${RESOLVED_DIAMETER}) + var(${RESOLVED_STROKE}) * 2)`,
124
244
  },
125
245
  ring: {
126
246
  backfaceVisibility: 'hidden',
127
247
  display: 'block',
128
248
  willChange: 'transform',
249
+ // The svg keeps the size its `viewBox` describes, so one user unit is one
250
+ // CSS pixel and the lengths below mean what they say. A themed diameter
251
+ // therefore draws a ring wider than the svg's own box — which is fine, and
252
+ // stays centered, because the box it is centered in is the span, sized
253
+ // from the same two vars. Clipping it to the default frame is the one
254
+ // thing that would break that, hence `visible`.
255
+ overflow: 'visible',
129
256
  // Slow the rotation dramatically under reduced-motion rather than freezing
130
257
  // it (a frozen spinner reads as broken), matching ProgressBar's approach.
131
258
  // The role="status" + "Loading" label still convey busy state (obs-6).
@@ -140,30 +267,98 @@ const styles = stylex.create({
140
267
  circle: {
141
268
  fill: 'none',
142
269
  strokeLinecap: 'round',
270
+ // The geometry the ring is actually drawn at. `r` and `stroke-width` are
271
+ // CSS properties on an SVG shape, and a CSS declaration outranks the
272
+ // presentation attribute of the same name — so the attributes below stay
273
+ // as the size's default (and as what a server render and a no-CSS render
274
+ // draw), and these take over the moment the cascade has a themed value.
275
+ r: `calc(var(${RESOLVED_DIAMETER}) / 2)`,
276
+ strokeWidth: `var(${RESOLVED_STROKE})`,
143
277
  },
278
+ // The two ring colors ride `stroke` directly, read off the public vars the
279
+ // shade declares. The paint comes from the cascade, so every notation a
280
+ // theme can write — `var()`, `color-mix()`, and the `currentColor` the
281
+ // inherit shade is built on — resolves where it is used, and a color changed
282
+ // after mount repaints instead of going stale.
283
+ //
284
+ // The dash pattern is composed from the resolved diameter the same way, so a
285
+ // themed ring keeps the same fraction of arc rather than the same absolute
286
+ // dash. `pathLength` would be the shorter route to that, but it rescales the
287
+ // pattern against the path length the UA measures on its own approximation
288
+ // of the circle — 87.398 against the 87.965 of pi x 28 — which shortens the
289
+ // default arc by 0.64% and moves the cap by half a pixel. Composing the
290
+ // lengths keeps the default byte-identical to what it drew before.
291
+ arc: {
292
+ stroke: 'var(--spinner-color)',
293
+ strokeDasharray: `calc(var(${RESOLVED_DIAMETER}) * ${ARC_DASH}) calc(var(${RESOLVED_DIAMETER}) * ${ARC_GAP})`,
294
+ },
295
+ track: {stroke: 'var(--spinner-track-color)'},
144
296
  });
145
297
 
146
- const arcStyles = stylex.create({
147
- default: {stroke: colorVars['--color-accent']},
148
- subtle: {stroke: colorVars['--color-text-secondary']},
149
- onMedia: {stroke: colorVars['--color-on-dark']},
150
- inherit: {stroke: 'currentColor'},
298
+ // What each named `size` and `shade` resolve to. Both groups DECLARE the four
299
+ // public vars, on the element that carries the `spinner` theme target, and
300
+ // everything downstream reads them — so a theme's `@layer astryx-theme` rule
301
+ // against `.astryx-spinner.xl` overrides the default the same way it does for
302
+ // `--tree-list-indent` or `--button-focus-offset`, e.g.
303
+ // spinner: { 'size:xl': { '--spinner-diameter': '40px' } }.
304
+ //
305
+ // Declaring is only safe because #5410 moved the compiled StyleX CSS inside
306
+ // `@layer astryx-base`. Before it, StyleX emitted custom-property
307
+ // declarations at priority 0 and therefore OUTSIDE its layers, and an
308
+ // unlayered declaration beats every layer — so a StyleX-declared
309
+ // `--spinner-diameter: 10px` shadowed the theme's own rule no matter how
310
+ // specific the theme got. An earlier revision of this component worked around
311
+ // that by never declaring the public var and reading it with the default as a
312
+ // `var()` fallback; that is no longer necessary, and the fallback shape has a
313
+ // cost of its own — with nothing declaring the var,
314
+ // `theme-var-reachability.js` cannot find an element to check, so a documented
315
+ // var reads as unreachable.
316
+ const sizeStyles = stylex.create({
317
+ sm: {
318
+ '--spinner-diameter': `${SIZES.sm.diameter}px`,
319
+ '--spinner-stroke-width': `${SIZES.sm.border}px`,
320
+ },
321
+ md: {
322
+ '--spinner-diameter': `${SIZES.md.diameter}px`,
323
+ '--spinner-stroke-width': `${SIZES.md.border}px`,
324
+ },
325
+ lg: {
326
+ '--spinner-diameter': `${SIZES.lg.diameter}px`,
327
+ '--spinner-stroke-width': `${SIZES.lg.border}px`,
328
+ },
329
+ xl: {
330
+ '--spinner-diameter': `${SIZES.xl.diameter}px`,
331
+ '--spinner-stroke-width': `${SIZES.xl.border}px`,
332
+ },
151
333
  });
152
334
 
153
- const trackStyles = stylex.create({
335
+ const shadeStyles = stylex.create({
154
336
  default: {
155
- stroke: colorVars['--color-track'],
156
- strokeOpacity: TRACK_OPACITY.default,
337
+ '--spinner-color': colorVars['--color-accent'],
338
+ '--spinner-track-color': colorVars['--color-track'],
157
339
  },
158
340
  subtle: {
159
- stroke: colorVars['--color-track'],
160
- strokeOpacity: TRACK_OPACITY.subtle,
341
+ '--spinner-color': colorVars['--color-text-secondary'],
342
+ '--spinner-track-color': colorVars['--color-track'],
161
343
  },
162
344
  onMedia: {
163
- stroke: colorVars['--color-on-dark'],
164
- strokeOpacity: TRACK_OPACITY.onMedia,
345
+ '--spinner-color': colorVars['--color-on-dark'],
346
+ '--spinner-track-color': colorVars['--color-on-dark'],
347
+ },
348
+ inherit: {
349
+ '--spinner-color': 'currentColor',
350
+ '--spinner-track-color': 'currentColor',
165
351
  },
166
- inherit: {stroke: 'currentColor', strokeOpacity: TRACK_OPACITY.inherit},
352
+ });
353
+
354
+ // The track's alpha is a property, not a color: it composites over whatever
355
+ // color the shade or the theme supplies. `77 / 255` is the `4D` the onMedia
356
+ // token's hex used to carry.
357
+ const trackOpacityStyles = stylex.create({
358
+ default: {strokeOpacity: TRACK_OPACITY.default},
359
+ subtle: {strokeOpacity: TRACK_OPACITY.subtle},
360
+ onMedia: {strokeOpacity: TRACK_OPACITY.onMedia},
361
+ inherit: {strokeOpacity: TRACK_OPACITY.inherit},
167
362
  });
168
363
 
169
364
  // =============================================================================
@@ -178,7 +373,9 @@ export interface SpinnerProps extends BaseProps<HTMLSpanElement> {
178
373
  /** Ref forwarded to the root element */
179
374
  ref?: React.Ref<HTMLSpanElement>;
180
375
  /**
181
- * Spinner size.
376
+ * Spinner size. The diameter is the ring itself; the rendered box adds the
377
+ * stroke width on each side (xl draws a 28px ring in a 36px box). A theme can
378
+ * redefine what each named size resolves to — see `--spinner-diameter`.
182
379
  * - 'sm': 10px diameter
183
380
  * - 'md': 14px diameter
184
381
  * - 'lg': 18px diameter
@@ -275,9 +472,30 @@ export function Spinner({
275
472
  {...(hasLabel ? {} : restProps)}
276
473
  {...mergeProps(
277
474
  hasLabel ? '' : themeProps('spinner', {size, shade}),
278
- stylex.props(styles.spinner, !hasLabel && xstyle),
475
+ stylex.props(
476
+ styles.spinner,
477
+ // The defaults are declared on whichever element carries the theme
478
+ // target, and only there: when a label moves the target to the
479
+ // wrapper, this span must inherit the wrapper's value rather than
480
+ // declare its own, which would shadow a theme's override with the
481
+ // default it is trying to replace.
482
+ !hasLabel && sizeStyles[size],
483
+ !hasLabel && shadeStyles[shade],
484
+ !hasLabel && xstyle,
485
+ ),
279
486
  hasLabel ? undefined : className,
280
- {...(hasLabel ? {} : style), width: frameSize, height: frameSize},
487
+ // The box is sized here, after the caller's `style`, exactly as it was
488
+ // before the geometry became themeable: the component's own size wins
489
+ // over a `style={{width}}` a caller passes, and the precedence between
490
+ // the two is unchanged by this PR. What the value is made of has
491
+ // changed — it is the composed var rather than a number — so a themed
492
+ // diameter moves the box with the ring. The fallback is the size's own
493
+ // frame, for the render where no stylesheet has declared the var.
494
+ {
495
+ ...(hasLabel ? {} : style),
496
+ width: `var(${BOX_SIZE}, ${frameSize}px)`,
497
+ height: `var(${BOX_SIZE}, ${frameSize}px)`,
498
+ },
281
499
  )}>
282
500
  <svg
283
501
  ref={syncRotationPhase}
@@ -291,16 +509,23 @@ export function Spinner({
291
509
  cy={center}
292
510
  r={diameter / 2}
293
511
  strokeWidth={border}
294
- {...stylex.props(styles.circle, trackStyles[shade])}
512
+ {...stylex.props(
513
+ styles.circle,
514
+ styles.track,
515
+ trackOpacityStyles[shade],
516
+ )}
295
517
  />
296
518
  <circle
297
519
  cx={center}
298
520
  cy={center}
299
521
  r={diameter / 2}
300
522
  strokeWidth={border}
523
+ // The size's own dash, for the render with no stylesheet. The rule
524
+ // above composes the same lengths from the resolved diameter, so a
525
+ // themed ring keeps this fraction of arc rather than this length.
301
526
  strokeDasharray={`${arcLength} ${circumference - arcLength}`}
302
527
  transform={`rotate(-90 ${center} ${center})`}
303
- {...stylex.props(styles.circle, arcStyles[shade])}
528
+ {...stylex.props(styles.circle, styles.arc)}
304
529
  />
305
530
  </svg>
306
531
  </span>
@@ -317,7 +542,12 @@ export function Spinner({
317
542
  {...restProps}
318
543
  {...mergeProps(
319
544
  themeProps('spinner', {size, shade}),
320
- stylex.props(styles.wrapper, xstyle),
545
+ stylex.props(
546
+ styles.wrapper,
547
+ sizeStyles[size],
548
+ shadeStyles[shade],
549
+ xstyle,
550
+ ),
321
551
  className,
322
552
  style,
323
553
  )}>
@@ -48,7 +48,10 @@ export const docs = {
48
48
  ],
49
49
  theming: {
50
50
  targets: [
51
- {className: 'astryx-statusdot', visualProps: ['variant']},
51
+ {className: 'astryx-status-dot', visualProps: ['variant']},
52
+ // Still emitted beside the names above, so themes written against
53
+ // them keep working. Drop in the next major.
54
+ {className: 'astryx-statusdot', visualProps: ['variant'], deprecatedFor: 'status-dot'},
52
55
  ],
53
56
  },
54
57
  usage: {
@@ -105,7 +108,10 @@ export const docsZh = {
105
108
  ],
106
109
  theming: {
107
110
  targets: [
108
- {className: 'astryx-statusdot', visualProps: ['variant']},
111
+ {className: 'astryx-status-dot', visualProps: ['variant']},
112
+ // Still emitted beside the names above, so themes written against
113
+ // them keep working. Drop in the next major.
114
+ {className: 'astryx-statusdot', visualProps: ['variant'], deprecatedFor: 'status-dot'},
109
115
  ],
110
116
  },
111
117
  usage: {
@@ -189,3 +189,12 @@ describe('StatusDot', () => {
189
189
  });
190
190
  });
191
191
  });
192
+
193
+ describe('StatusDot theme target names', () => {
194
+ it('renders the deprecated class beside the current one', () => {
195
+ render(<StatusDot variant="success" label="Online" />);
196
+ const dot = screen.getByRole('img', {name: 'Online'});
197
+ expect(dot).toHaveClass('astryx-status-dot');
198
+ expect(dot).toHaveClass('astryx-statusdot');
199
+ });
200
+ });
@@ -200,7 +200,13 @@ export function StatusDot({
200
200
  role="img"
201
201
  aria-label={label}
202
202
  {...mergeProps(
203
- themeProps('statusdot', {variant}),
203
+ themeProps(
204
+ 'status-dot',
205
+ {variant},
206
+ // `statusdot` ran the compound name together; themes styling it keep
207
+ // working until the next major.
208
+ {legacyNames: ['statusdot']},
209
+ ),
204
210
  stylex.props(
205
211
  styles.base,
206
212
  variants[variant],
@@ -10,7 +10,7 @@ export const docs = {
10
10
  category: 'Navigation',
11
11
  isHiddenFromOverview: true,
12
12
  description:
13
- 'Individual step within a Stepper. Renders a progress-bar segment, an indicator, and a label with optional description. Progress (completed/active/not-started) is derived from the parent Stepper\u2019s activeStep and this step\u2019s step index.',
13
+ 'Individual step within a Stepper. Renders a progress-bar segment, an indicator, and a label with optional description. Progress (completed/active/not-started) is derived from the parent Stepper\'s activeStep and this step\'s step index.',
14
14
  props: [
15
15
  {
16
16
  name: 'step',
@@ -51,6 +51,7 @@ import {
51
51
  isRenderable,
52
52
  themeProps,
53
53
  } from '../utils';
54
+ import {interactionOverlayStyles} from '../utils/interactionOverlay.stylex';
54
55
  import type {BaseProps} from '../BaseProps';
55
56
  import {Icon} from '../Icon';
56
57
  import {VisuallyHidden} from '../VisuallyHidden';
@@ -655,13 +656,7 @@ const styles = stylex.create({
655
656
  '@media (prefers-reduced-motion: reduce)': '0s',
656
657
  },
657
658
  transitionTimingFunction: easeVars['--ease-standard'],
658
- backgroundColor: {
659
- default: 'transparent',
660
- ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
661
- '@media (hover: hover)': colorVars['--color-overlay-hover'],
662
- },
663
- ':active': colorVars['--color-overlay-pressed'],
664
- },
659
+ backgroundColor: 'transparent',
665
660
  },
666
661
 
667
662
  // ===================== ON-TRACK LAYOUT =====================
@@ -702,13 +697,7 @@ const styles = stylex.create({
702
697
  '@media (prefers-reduced-motion: reduce)': '0s',
703
698
  },
704
699
  transitionTimingFunction: easeVars['--ease-standard'],
705
- backgroundColor: {
706
- default: 'transparent',
707
- ':hover:where(:not(:disabled,[aria-disabled="true"]))': {
708
- '@media (hover: hover)': colorVars['--color-overlay-hover'],
709
- },
710
- ':active': colorVars['--color-overlay-pressed'],
711
- },
700
+ backgroundColor: 'transparent',
712
701
  },
713
702
 
714
703
  otRowWrap: {
@@ -1411,6 +1400,7 @@ export function Step({
1411
1400
  aria-label={stepAriaLabel}
1412
1401
  {...stylex.props(
1413
1402
  styles.otInteractive,
1403
+ interactionOverlayStyles.backgroundColor,
1414
1404
  styles.otRowWrap,
1415
1405
  styles.otRowPadV(densitySpace),
1416
1406
  focusOutlineStyles.focusVisible,
@@ -1493,6 +1483,7 @@ export function Step({
1493
1483
  aria-label={stepAriaLabel}
1494
1484
  {...stylex.props(
1495
1485
  styles.otInteractive,
1486
+ interactionOverlayStyles.backgroundColor,
1496
1487
  styles.otColWrap,
1497
1488
  styles.otPadBlock(densitySpace),
1498
1489
  focusOutlineStyles.focusVisible,
@@ -1549,6 +1540,7 @@ export function Step({
1549
1540
  aria-label={stepAriaLabel}
1550
1541
  {...stylex.props(
1551
1542
  styles.buttonReset,
1543
+ interactionOverlayStyles.backgroundColor,
1552
1544
  focusOutlineStyles.focusVisible,
1553
1545
  density === 'compact' && styles.densityCompact,
1554
1546
  density === 'balanced' && styles.densityBalanced,
@@ -1609,6 +1601,7 @@ export function Step({
1609
1601
  aria-label={stepAriaLabel}
1610
1602
  {...stylex.props(
1611
1603
  styles.buttonReset,
1604
+ interactionOverlayStyles.backgroundColor,
1612
1605
  focusOutlineStyles.focusVisible,
1613
1606
  density === 'compact' && styles.densityCompact,
1614
1607
  density === 'balanced' && styles.densityBalanced,
@@ -5,7 +5,7 @@
5
5
  export const docs = {
6
6
  name: 'Switch',
7
7
  displayName: 'Switch',
8
- category: 'Data Input',
8
+ category: 'Form Controls',
9
9
  keywords: [
10
10
  'switch',
11
11
  'toggle',
@@ -167,6 +167,7 @@ export const docs = {
167
167
  className: 'astryx-switch-field',
168
168
  visualProps: ['labelPosition', 'labelSpacing'],
169
169
  },
170
+ {className: 'astryx-switch-label'},
170
171
  ],
171
172
  },
172
173
  usage: {
@@ -338,6 +339,7 @@ export const docsZh = {
338
339
  className: 'astryx-switch-field',
339
340
  visualProps: ['labelPosition', 'labelSpacing'],
340
341
  },
342
+ {className: 'astryx-switch-label'},
341
343
  ],
342
344
  },
343
345
  usage: {
@@ -823,3 +823,13 @@ describe('forced colors (WCAG 1.4.11)', () => {
823
823
  expect(getForcedColorsRules()).not.toContain('color-mix');
824
824
  });
825
825
  });
826
+
827
+ describe('label theme target', () => {
828
+ it('names its own label so a theme can style it apart from a field label', () => {
829
+ // See CheckboxInput: the control names the label it owns.
830
+ render(<Switch label="Wi-Fi" value={false} onChange={() => {}} />);
831
+ const label = screen.getByText('Wi-Fi').closest('label');
832
+ expect(label).toHaveClass('astryx-field-label');
833
+ expect(label).toHaveClass('astryx-switch-label');
834
+ });
835
+ });
@@ -633,6 +633,9 @@ export function Switch({
633
633
  const labelElement = (
634
634
  <div {...stylex.props(styles.labelWrapper, labelWrapperSizeStyles[size])}>
635
635
  <FieldLabel
636
+ // See CheckboxInput: the control names its own label target rather
637
+ // than the label guessing at its placement.
638
+ {...themeProps('switch-label')}
636
639
  label={label}
637
640
  inputID={id}
638
641
  isLabelHidden={isLabelHidden}
@@ -528,7 +528,12 @@ function BaseTableInner<T extends Record<string, unknown>>({
528
528
  {...(ariaRowCount != null ? {'aria-rowcount': ariaRowCount} : null)}
529
529
  {...tableRenderProps.htmlProps}
530
530
  {...mergeProps(
531
- themeProps('base-table'),
531
+ themeProps('table', undefined, {
532
+ // `base-table` was a second root on the same <table> element that
533
+ // `table` names; themes styling it keep working until the next
534
+ // major.
535
+ legacyNames: ['base-table'],
536
+ }),
532
537
  stylex.props(...tableRenderProps.xstyle, xstyle),
533
538
  [tableRenderProps.htmlProps.className, className]
534
539
  .filter(Boolean)
@@ -24,7 +24,6 @@ export const docs = {
24
24
  },
25
25
  theming: {
26
26
  targets: [
27
- {className: 'astryx-base-table'},
28
27
  {className: 'astryx-table'},
29
28
  {className: 'astryx-table-scroll-wrapper'},
30
29
  {className: 'astryx-table-header'},
@@ -33,6 +32,9 @@ export const docs = {
33
32
  {className: 'astryx-table-row'},
34
33
  {className: 'astryx-table-cell', visualProps: ['density']},
35
34
  {className: 'astryx-table-header-cell', visualProps: ['density']},
35
+ // Still emitted beside the names above, so themes written against
36
+ // them keep working. Drop in the next major.
37
+ {className: 'astryx-base-table', deprecatedFor: 'table'},
36
38
  ],
37
39
  },
38
40
  description: 'Styled, data-driven table with density, dividers, hover highlight, striped rows, and named plugin support. T must extend Record<string, unknown>.',
@@ -107,7 +109,7 @@ export const docs = {
107
109
  {
108
110
  name: 'children',
109
111
  type: 'ReactNode',
110
- description: 'Children mode: compose the table yourself from TableHeader / TableBody / TableFooter, each holding TableRow and TableCell, instead of using data-driven rendering. The children are passed straight to the <table>, so the section is yours to supply — a TableRow placed directly in Table emits <table><tr>, which is invalid HTML and mismatches on hydration (the parser inserts an implied <tbody> for server-rendered markup; React does not on the client). Data-driven mode renders the sections for you.',
112
+ description: 'Children mode: compose the table yourself from TableHeader / TableBody / TableFooter, each holding TableRow and TableCell, instead of using data-driven rendering. The children are passed straight to the <table>, so the section is yours to supply. A TableRow placed directly in Table emits <table><tr>, which is invalid HTML and mismatches on hydration (the parser inserts an implied <tbody> for server-rendered markup; React does not on the client). Data-driven mode renders the sections for you.',
111
113
  },
112
114
  {
113
115
  name: 'xstyle',
@@ -187,7 +189,7 @@ export const docsDense = {
187
189
  bestPractices: [
188
190
  { guidance: true, description: 'Use density and divider variants to match the information density and scanning needs of your data.' },
189
191
  { guidance: true, description: 'Compose rich cell content with Astryx components like Badge, StatusDot, and Avatar via renderCell.' },
190
- { guidance: true, description: 'Children mode: wrap rows in TableHeader/TableBody/TableFooter. <table> cannot hold a <tr> directly — parser adds an implied <tbody> for SSR markup, React does not on the client, so unwrapped rows mismatch on hydration.' },
192
+ { guidance: true, description: 'Children mode: wrap rows in TableHeader/TableBody/TableFooter. <table> cannot hold a <tr> directly; the parser adds an implied <tbody> for SSR markup, React does not on the client, so unwrapped rows mismatch on hydration.' },
191
193
  { guidance: true, description: 'Set explicit width on every column via proportional() or pixel(). proportional(1) = equal flex w/ 120px min preventing collapse on narrow viewports. Omitting width skips the minimum.' },
192
194
  { guidance: true, description: 'Data-driven API is RSC-safe: proportional(), pixel(), column defs w/o function props work in Server Components. renderCell (any function prop) requires a "use client" wrapper.' },
193
195
  { guidance: false, description: 'Use a table for data without consistent columns. Use a list or card layout for heterogeneous content.' },
@@ -186,16 +186,11 @@ function buildTableStylePlugin<
186
186
  >(): TablePlugin<T> {
187
187
  return {
188
188
  transformTable(props: TableRenderProps): TableRenderProps {
189
- const existingClass = props.htmlProps.className ?? '';
190
- const tableClass = themeProps('table').className;
189
+ // The `astryx-table` class itself comes from BaseTable, which renders
190
+ // the <table> element and now names it `table` (with `base-table` as its
191
+ // legacy name). Adding it here too would put the token on twice.
191
192
  return {
192
193
  ...props,
193
- htmlProps: {
194
- ...props.htmlProps,
195
- className: existingClass
196
- ? `${existingClass} ${tableClass}`
197
- : tableClass,
198
- },
199
194
  xstyle: [...props.xstyle, tableStyles.base],
200
195
  };
201
196
  },
@@ -8,7 +8,7 @@ export const docs = {
8
8
  displayName: 'Table Body',
9
9
  isHiddenFromOverview: true,
10
10
  description:
11
- '<tbody> wrapper for children mode. Holds the data rows. A row must sit inside a section — <table> cannot contain a <tr> directly, because the HTML parser inserts an implied <tbody> when it parses server-rendered markup and React does not when it renders on the client, so rows written straight into Table mismatch on hydration. The data-driven data={...} mode renders this element itself; in children mode it is yours to supply.',
11
+ '<tbody> wrapper for children mode. Holds the data rows. A row must sit inside a section: <table> cannot contain a <tr> directly, because the HTML parser inserts an implied <tbody> when it parses server-rendered markup and React does not when it renders on the client, so rows written straight into Table mismatch on hydration. The data-driven data={...} mode renders this element itself; in children mode it is yours to supply.',
12
12
  props: [
13
13
  {
14
14
  name: 'children',
@@ -32,7 +32,7 @@ export const docsDense = {
32
32
  name: 'TableBody',
33
33
  isHiddenFromOverview: true,
34
34
  displayName: 'Table Body',
35
- description: '<tbody> wrapper for children mode; holds the data rows — children mode does not add one for you',
35
+ description: '<tbody> wrapper for children mode; holds the data rows; children mode does not add one for you',
36
36
  propDescriptions: {
37
37
  children: 'The <tbody> rows.',
38
38
  xstyle: 'StyleX styles for layout customization',
@@ -8,7 +8,7 @@ export const docs = {
8
8
  displayName: 'Table Footer',
9
9
  isHiddenFromOverview: true,
10
10
  description:
11
- '<tfoot> wrapper for children mode. Holds summary or total rows beneath the body. A row must sit inside a section — <table> cannot contain a <tr> directly, because the HTML parser inserts an implied <tbody> when it parses server-rendered markup and React does not when it renders on the client, so the two trees mismatch on hydration. Children mode only: the data-driven data={...} path renders a header and a body, never a footer.',
11
+ '<tfoot> wrapper for children mode. Holds summary or total rows beneath the body. A row must sit inside a section: <table> cannot contain a <tr> directly, because the HTML parser inserts an implied <tbody> when it parses server-rendered markup and React does not when it renders on the client, so the two trees mismatch on hydration. Children mode only: the data-driven data={...} path renders a header and a body, never a footer.',
12
12
  props: [
13
13
  {
14
14
  name: 'children',