@astryxdesign/core 0.6.2 → 0.6.3-canary.0788c49

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 (558) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/dist/BottomSheet/BottomSheet.d.ts +1 -1
  3. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  4. package/dist/BottomSheet/BottomSheet.js +3 -1
  5. package/dist/BottomSheet/BottomSheetPanel.d.ts +7 -5
  6. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  7. package/dist/BottomSheet/BottomSheetPanel.js +56 -19
  8. package/dist/Button/Button.d.ts.map +1 -1
  9. package/dist/Button/Button.js +13 -28
  10. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  11. package/dist/Chat/ChatComposer.js +10 -5
  12. package/dist/Chat/ChatComposerDrawer.d.ts +19 -5
  13. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  14. package/dist/Chat/ChatComposerDrawer.js +48 -23
  15. package/dist/Chat/ChatComposerInput.d.ts +11 -3
  16. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  17. package/dist/Chat/ChatComposerInput.js +63 -16
  18. package/dist/Chat/ChatDictationButton.d.ts +3 -2
  19. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  20. package/dist/Chat/ChatDictationButton.js +6 -4
  21. package/dist/Chat/ChatLayout.d.ts +19 -0
  22. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  23. package/dist/Chat/ChatLayout.js +19 -0
  24. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  25. package/dist/Chat/ChatLayoutScrollButton.js +44 -34
  26. package/dist/Chat/ChatMessageBubble.d.ts +2 -0
  27. package/dist/Chat/ChatMessageBubble.d.ts.map +1 -1
  28. package/dist/Chat/ChatMessageBubble.js +5 -3
  29. package/dist/Chat/ChatMessageList.d.ts +2 -1
  30. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  31. package/dist/Chat/ChatMessageList.js +4 -3
  32. package/dist/Chat/ChatMessageMetadata.d.ts +5 -4
  33. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  34. package/dist/Chat/ChatMessageMetadata.js +12 -9
  35. package/dist/Chat/ChatSendButton.d.ts +2 -1
  36. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  37. package/dist/Chat/ChatSendButton.js +6 -4
  38. package/dist/Chat/index.d.ts +1 -1
  39. package/dist/Chat/index.d.ts.map +1 -1
  40. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  41. package/dist/CheckboxInput/CheckboxInput.js +12 -2
  42. package/dist/Citation/Citation.d.ts +1 -1
  43. package/dist/Citation/Citation.d.ts.map +1 -1
  44. package/dist/Citation/Citation.js +3 -2
  45. package/dist/CodeBlock/highlightRanges.d.ts.map +1 -1
  46. package/dist/CodeBlock/highlightRanges.js +14 -3
  47. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  48. package/dist/Collapsible/Collapsible.js +6 -1
  49. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  50. package/dist/CommandPalette/CommandPaletteInput.js +1 -1
  51. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  52. package/dist/ComplexSelector/ComplexSelector.js +1 -1
  53. package/dist/DateInput/DateInput.d.ts.map +1 -1
  54. package/dist/DateInput/DateInput.js +4 -4
  55. package/dist/DateInput/NativeDateField.d.ts.map +1 -1
  56. package/dist/DateInput/NativeDateField.js +16 -16
  57. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  58. package/dist/DateInput/TouchDateField.js +2 -2
  59. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  60. package/dist/DateRangeInput/DateRangeInput.js +4 -4
  61. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  62. package/dist/DateTimeInput/DateTimeInput.js +8 -8
  63. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  64. package/dist/DateTimeInput/TouchDateTimeField.js +4 -4
  65. package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts +9 -3
  66. package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts.map +1 -1
  67. package/dist/DateTimeInput/nativePickerSegmentStyles.js +3 -3
  68. package/dist/Dialog/DialogHeader.d.ts +8 -1
  69. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  70. package/dist/Dialog/DialogHeader.js +13 -4
  71. package/dist/Field/InputClearButton.d.ts +4 -2
  72. package/dist/Field/InputClearButton.d.ts.map +1 -1
  73. package/dist/Field/InputClearButton.js +4 -2
  74. package/dist/Field/PanelSearchInput.d.ts.map +1 -1
  75. package/dist/Field/PanelSearchInput.js +1 -1
  76. package/dist/FileInput/FileInput.d.ts.map +1 -1
  77. package/dist/FileInput/FileInput.js +7 -7
  78. package/dist/Icon/Icon.d.ts +6 -31
  79. package/dist/Icon/Icon.d.ts.map +1 -1
  80. package/dist/Icon/Icon.js +8 -71
  81. package/dist/Icon/IconDefaultSizeContext.d.ts +4 -0
  82. package/dist/Icon/IconDefaultSizeContext.d.ts.map +1 -0
  83. package/dist/Icon/IconDefaultSizeContext.js +18 -0
  84. package/dist/Icon/IconSize.stylex.d.ts +65 -0
  85. package/dist/Icon/IconSize.stylex.d.ts.map +1 -0
  86. package/dist/Icon/IconSize.stylex.js +75 -0
  87. package/dist/Item/Item.d.ts +1 -1
  88. package/dist/Item/Item.d.ts.map +1 -1
  89. package/dist/Item/Item.js +4 -3
  90. package/dist/Kbd/Kbd.d.ts +5 -3
  91. package/dist/Kbd/Kbd.d.ts.map +1 -1
  92. package/dist/Kbd/Kbd.js +36 -42
  93. package/dist/Link/Link.d.ts.map +1 -1
  94. package/dist/Link/Link.js +6 -2
  95. package/dist/Link/useLinkComponent.d.ts +5 -15
  96. package/dist/Link/useLinkComponent.d.ts.map +1 -1
  97. package/dist/Link/useLinkComponent.js +34 -51
  98. package/dist/List/List.d.ts +19 -1
  99. package/dist/List/List.d.ts.map +1 -1
  100. package/dist/List/List.js +9 -2
  101. package/dist/List/ListContext.d.ts +1 -0
  102. package/dist/List/ListContext.d.ts.map +1 -1
  103. package/dist/List/ListContext.js +2 -1
  104. package/dist/List/ListItem.d.ts +1 -1
  105. package/dist/List/ListItem.d.ts.map +1 -1
  106. package/dist/List/ListItem.js +9 -2
  107. package/dist/Markdown/Markdown.d.ts +8 -2
  108. package/dist/Markdown/Markdown.d.ts.map +1 -1
  109. package/dist/Markdown/Markdown.fr23.bench.d.ts +2 -0
  110. package/dist/Markdown/Markdown.fr23.bench.d.ts.map +1 -0
  111. package/dist/Markdown/Markdown.fr23.bench.js +150 -0
  112. package/dist/Markdown/Markdown.fr23.sampling.d.ts +2 -0
  113. package/dist/Markdown/Markdown.fr23.sampling.d.ts.map +1 -0
  114. package/dist/Markdown/Markdown.fr23.sampling.js +43 -0
  115. package/dist/Markdown/Markdown.js +262 -109
  116. package/dist/Markdown/ast.d.ts +162 -0
  117. package/dist/Markdown/ast.d.ts.map +1 -0
  118. package/dist/Markdown/ast.js +74 -0
  119. package/dist/Markdown/index.d.ts +5 -3
  120. package/dist/Markdown/index.d.ts.map +1 -1
  121. package/dist/Markdown/index.js +3 -2
  122. package/dist/Markdown/parser/index.d.ts +10 -0
  123. package/dist/Markdown/parser/index.d.ts.map +1 -0
  124. package/dist/Markdown/parser/index.js +10 -0
  125. package/dist/Markdown/parser.d.ts +126 -58
  126. package/dist/Markdown/parser.d.ts.map +1 -1
  127. package/dist/Markdown/parser.js +726 -177
  128. package/dist/Markdown/plugins/frontmatter.d.ts +32 -0
  129. package/dist/Markdown/plugins/frontmatter.d.ts.map +1 -0
  130. package/dist/Markdown/plugins/frontmatter.js +132 -0
  131. package/dist/Markdown/plugins/index.d.ts +17 -0
  132. package/dist/Markdown/plugins/index.d.ts.map +1 -0
  133. package/dist/Markdown/plugins/index.js +14 -0
  134. package/dist/Markdown/plugins/protocol.d.ts +191 -0
  135. package/dist/Markdown/plugins/protocol.d.ts.map +1 -0
  136. package/dist/Markdown/plugins/protocol.js +957 -0
  137. package/dist/Markdown/plugins/semanticFence.d.ts +36 -0
  138. package/dist/Markdown/plugins/semanticFence.d.ts.map +1 -0
  139. package/dist/Markdown/plugins/semanticFence.js +213 -0
  140. package/dist/Markdown/plugins/softBreaks.d.ts +3 -0
  141. package/dist/Markdown/plugins/softBreaks.d.ts.map +1 -0
  142. package/dist/Markdown/plugins/softBreaks.js +172 -0
  143. package/dist/Markdown/plugins/sourceDecoration.d.ts +76 -0
  144. package/dist/Markdown/plugins/sourceDecoration.d.ts.map +1 -0
  145. package/dist/Markdown/plugins/sourceDecoration.js +393 -0
  146. package/dist/Markdown/plugins/textTransform.d.ts +30 -0
  147. package/dist/Markdown/plugins/textTransform.d.ts.map +1 -0
  148. package/dist/Markdown/plugins/textTransform.js +374 -0
  149. package/dist/Markdown/remark.d.ts +196 -0
  150. package/dist/Markdown/remark.d.ts.map +1 -0
  151. package/dist/Markdown/remark.js +1062 -0
  152. package/dist/Markdown/url.d.ts +6 -0
  153. package/dist/Markdown/url.d.ts.map +1 -0
  154. package/dist/Markdown/url.js +31 -0
  155. package/dist/Markdown/utils.d.ts +4 -2
  156. package/dist/Markdown/utils.d.ts.map +1 -1
  157. package/dist/Markdown/utils.js +2 -1
  158. package/dist/MetadataList/MetadataList.js +3 -3
  159. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  160. package/dist/NumberInput/NumberInput.js +4 -4
  161. package/dist/Outline/index.d.ts +1 -0
  162. package/dist/Outline/index.d.ts.map +1 -1
  163. package/dist/Outline/parseOutlineFromMarkdown.d.ts +7 -1
  164. package/dist/Outline/parseOutlineFromMarkdown.d.ts.map +1 -1
  165. package/dist/Outline/parseOutlineFromMarkdown.js +14 -8
  166. package/dist/Outline/useOutlineFromMarkdown.d.ts +3 -1
  167. package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
  168. package/dist/Outline/useOutlineFromMarkdown.js +8 -3
  169. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  170. package/dist/PowerSearch/PowerSearchEditPopover.js +46 -30
  171. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  172. package/dist/PowerSearch/PowerSearchValueEditor.js +5 -0
  173. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  174. package/dist/ProgressBar/ProgressBar.js +36 -31
  175. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  176. package/dist/RadioList/RadioListItem.js +13 -1
  177. package/dist/ScrollableArea/ScrollableArea.d.ts +1 -0
  178. package/dist/ScrollableArea/ScrollableArea.d.ts.map +1 -1
  179. package/dist/ScrollableArea/ScrollableArea.js +1 -0
  180. package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
  181. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  182. package/dist/SegmentedControl/SegmentedControl.js +1 -0
  183. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  184. package/dist/SegmentedControl/SegmentedControlItem.js +5 -5
  185. package/dist/Selector/Selector.d.ts +9 -7
  186. package/dist/Selector/Selector.d.ts.map +1 -1
  187. package/dist/Selector/Selector.js +16 -7
  188. package/dist/SideNav/SideNav.d.ts +2 -1
  189. package/dist/SideNav/SideNav.d.ts.map +1 -1
  190. package/dist/SideNav/SideNav.js +9 -3
  191. package/dist/Slider/Slider.d.ts.map +1 -1
  192. package/dist/Slider/Slider.js +28 -12
  193. package/dist/Spinner/Spinner.d.ts.map +1 -1
  194. package/dist/Spinner/Spinner.js +23 -7
  195. package/dist/Switch/Switch.d.ts.map +1 -1
  196. package/dist/Switch/Switch.js +11 -0
  197. package/dist/TabList/Tab.d.ts +1 -1
  198. package/dist/TabList/Tab.d.ts.map +1 -1
  199. package/dist/TabList/Tab.js +20 -7
  200. package/dist/Table/Table.d.ts +1 -0
  201. package/dist/Table/Table.d.ts.map +1 -1
  202. package/dist/Table/Table.js +29 -13
  203. package/dist/TextArea/TextArea.d.ts.map +1 -1
  204. package/dist/TextArea/TextArea.js +1 -1
  205. package/dist/TextInput/TextInput.d.ts.map +1 -1
  206. package/dist/TextInput/TextInput.js +2 -2
  207. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  208. package/dist/TimeInput/TimeInput.js +4 -4
  209. package/dist/Timer/Timer.d.ts +49 -0
  210. package/dist/Timer/Timer.d.ts.map +1 -0
  211. package/dist/Timer/Timer.js +158 -0
  212. package/dist/Timer/index.d.ts +9 -0
  213. package/dist/Timer/index.d.ts.map +1 -0
  214. package/dist/Timer/index.js +10 -0
  215. package/dist/ToggleButton/ToggleButton.d.ts +9 -6
  216. package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
  217. package/dist/ToggleButton/ToggleButton.js +15 -27
  218. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  219. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  220. package/dist/TopNav/TopNavMenu.js +3 -2
  221. package/dist/TreeList/TreeList.d.ts.map +1 -1
  222. package/dist/TreeList/TreeList.js +3 -0
  223. package/dist/TreeList/TreeListItem.d.ts +6 -1
  224. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  225. package/dist/TreeList/TreeListItem.js +12 -2
  226. package/dist/TreeList/TreeListTypes.d.ts +8 -1
  227. package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
  228. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  229. package/dist/Typeahead/BaseTypeahead.js +16 -7
  230. package/dist/astryx.css +27 -11
  231. package/dist/hooks/scrollKeyboardDelegation.d.ts +3 -0
  232. package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -0
  233. package/dist/hooks/scrollKeyboardDelegation.js +146 -0
  234. package/dist/hooks/useClickableContainer.d.ts +10 -1
  235. package/dist/hooks/useClickableContainer.d.ts.map +1 -1
  236. package/dist/hooks/useClickableContainer.js +15 -4
  237. package/dist/hooks/useScrollableArea.d.ts +6 -2
  238. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  239. package/dist/hooks/useScrollableArea.js +17 -5
  240. package/dist/index.d.ts +1 -0
  241. package/dist/index.d.ts.map +1 -1
  242. package/dist/index.js +3 -0
  243. package/dist/theme/declarationBoundary.d.ts +17 -0
  244. package/dist/theme/declarationBoundary.d.ts.map +1 -0
  245. package/dist/theme/declarationBoundary.js +343 -0
  246. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  247. package/dist/theme/derivedVarRegistry.js +4 -0
  248. package/dist/theme/generateThemeRules.d.ts +13 -7
  249. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  250. package/dist/theme/generateThemeRules.js +140 -34
  251. package/dist/utils/interactionOverlay.stylex.d.ts +8 -0
  252. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  253. package/dist/utils/interactionOverlay.stylex.js +9 -0
  254. package/dist/utils/safeUrl.d.ts +11 -0
  255. package/dist/utils/safeUrl.d.ts.map +1 -0
  256. package/dist/utils/safeUrl.js +78 -0
  257. package/locales/af-ZA.json +530 -1
  258. package/locales/ar-SA.json +490 -1
  259. package/locales/ca-ES.json +514 -1
  260. package/locales/cs-CZ.json +498 -1
  261. package/locales/da-DK.json +522 -1
  262. package/locales/de-DE.json +522 -1
  263. package/locales/el-GR.json +498 -1
  264. package/locales/es-ES.json +510 -1
  265. package/locales/fi-FI.json +498 -1
  266. package/locales/fr-FR.json +534 -1
  267. package/locales/he-IL.json +498 -1
  268. package/locales/hu-HU.json +498 -1
  269. package/locales/it-IT.json +510 -1
  270. package/locales/ja-JP.json +490 -1
  271. package/locales/ko-KR.json +498 -1
  272. package/locales/nl-NL.json +534 -1
  273. package/locales/no-NO.json +510 -1
  274. package/locales/pl-PL.json +506 -1
  275. package/locales/pt-BR.json +506 -1
  276. package/locales/pt-PT.json +506 -1
  277. package/locales/ro-RO.json +506 -1
  278. package/locales/ru-RU.json +498 -1
  279. package/locales/sr-SP.json +498 -1
  280. package/locales/sv-SE.json +502 -1
  281. package/locales/tr-TR.json +498 -1
  282. package/locales/uk-UA.json +498 -1
  283. package/locales/vi-VN.json +502 -1
  284. package/locales/zh-CN.json +490 -1
  285. package/locales/zh-TW.json +490 -1
  286. package/package.json +24 -4
  287. package/src/BottomSheet/BottomSheet.doc.mjs +8 -1
  288. package/src/BottomSheet/BottomSheet.spec.md +46 -20
  289. package/src/BottomSheet/BottomSheet.test.tsx +6 -3
  290. package/src/BottomSheet/BottomSheet.tsx +3 -1
  291. package/src/BottomSheet/BottomSheetKeyboard.test.tsx +195 -0
  292. package/src/BottomSheet/BottomSheetPanel.test.tsx +11 -1
  293. package/src/BottomSheet/BottomSheetPanel.tsx +49 -16
  294. package/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts +344 -0
  295. package/src/Button/Button.doc.mjs +5 -5
  296. package/src/Button/Button.tsx +15 -13
  297. package/src/Button/__tests__/Button.a11y.chromium.spec.ts +17 -1
  298. package/src/Button/__tests__/Button.a11y.known-failures.ts +0 -29
  299. package/src/Button/__tests__/Button.a11y.renders.tsx +9 -2
  300. package/src/Button/__tests__/Button.a11y.states.ts +9 -0
  301. package/src/Chat/ChatComposer.doc.mjs +14 -0
  302. package/src/Chat/ChatComposer.spec.md +230 -0
  303. package/src/Chat/ChatComposer.test.tsx +57 -0
  304. package/src/Chat/ChatComposer.tsx +21 -9
  305. package/src/Chat/ChatComposerDrawer.doc.mjs +63 -5
  306. package/src/Chat/ChatComposerDrawer.spec.md +267 -0
  307. package/src/Chat/ChatComposerDrawer.test.tsx +81 -12
  308. package/src/Chat/ChatComposerDrawer.tsx +38 -9
  309. package/src/Chat/ChatComposerInput.doc.mjs +114 -26
  310. package/src/Chat/ChatComposerInput.spec.md +185 -0
  311. package/src/Chat/ChatComposerInput.test.tsx +113 -3
  312. package/src/Chat/ChatComposerInput.tsx +78 -13
  313. package/src/Chat/ChatComposerTokenElement.spec.md +152 -0
  314. package/src/Chat/ChatComposerTokenElement.test.tsx +85 -0
  315. package/src/Chat/ChatDictationButton.doc.mjs +3 -3
  316. package/src/Chat/ChatDictationButton.spec.md +160 -0
  317. package/src/Chat/ChatDictationButton.test.tsx +92 -27
  318. package/src/Chat/ChatDictationButton.tsx +8 -6
  319. package/src/Chat/ChatLayout.doc.mjs +12 -4
  320. package/src/Chat/ChatLayout.spec.md +271 -0
  321. package/src/Chat/ChatLayout.test.tsx +28 -0
  322. package/src/Chat/ChatLayout.tsx +19 -0
  323. package/src/Chat/ChatLayoutScrollButton.spec.md +338 -0
  324. package/src/Chat/ChatLayoutScrollButton.test.tsx +31 -0
  325. package/src/Chat/ChatLayoutScrollButton.tsx +31 -14
  326. package/src/Chat/ChatMessageBubble.doc.mjs +28 -15
  327. package/src/Chat/ChatMessageBubble.spec.md +263 -0
  328. package/src/Chat/ChatMessageBubble.test.tsx +93 -0
  329. package/src/Chat/ChatMessageBubble.tsx +8 -3
  330. package/src/Chat/ChatMessageList.spec.md +222 -0
  331. package/src/Chat/ChatMessageList.test.tsx +64 -2
  332. package/src/Chat/ChatMessageList.tsx +4 -3
  333. package/src/Chat/ChatMessageMetadata.doc.mjs +57 -3
  334. package/src/Chat/ChatMessageMetadata.spec.md +220 -0
  335. package/src/Chat/ChatMessageMetadata.test.tsx +34 -0
  336. package/src/Chat/ChatMessageMetadata.tsx +13 -13
  337. package/src/Chat/ChatSendButton.doc.mjs +32 -0
  338. package/src/Chat/ChatSendButton.spec.md +227 -0
  339. package/src/Chat/ChatSendButton.test.tsx +128 -8
  340. package/src/Chat/ChatSendButton.tsx +6 -4
  341. package/src/Chat/__tests__/ChatLayoutScrollButton.a11y.chromium.spec.ts +514 -0
  342. package/src/Chat/__tests__/ChatLayoutScrollButtonSurface.a11y.chromium.spec.ts +740 -0
  343. package/src/Chat/__tests__/ChatMessageBubble.a11y.chromium.spec.ts +457 -0
  344. package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.test.ts +91 -0
  345. package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.ts +91 -0
  346. package/src/Chat/__tests__/ChatMessageList.a11y.chromium.spec.ts +456 -0
  347. package/src/Chat/__tests__/ChatMessageMetadata.a11y.chromium.spec.ts +413 -0
  348. package/src/Chat/__tests__/ChatSendButton.a11y.chromium.spec.ts +1522 -0
  349. package/src/Chat/index.ts +1 -0
  350. package/src/CheckboxInput/CheckboxInput.doc.mjs +11 -0
  351. package/src/CheckboxInput/CheckboxInput.test.tsx +34 -0
  352. package/src/CheckboxInput/CheckboxInput.tsx +21 -1
  353. package/src/Citation/Citation.doc.mjs +2 -2
  354. package/src/Citation/Citation.test.tsx +17 -0
  355. package/src/Citation/Citation.tsx +4 -2
  356. package/src/ClickableCard/ClickableCard.doc.mjs +2 -2
  357. package/src/ClickableCard/ClickableCard.test.tsx +102 -5
  358. package/src/CodeBlock/highlightRanges.test.ts +143 -1
  359. package/src/CodeBlock/highlightRanges.ts +15 -5
  360. package/src/Collapsible/Collapsible.doc.mjs +11 -0
  361. package/src/Collapsible/Collapsible.test.tsx +21 -0
  362. package/src/Collapsible/Collapsible.tsx +5 -0
  363. package/src/CommandPalette/CommandPaletteInput.tsx +6 -1
  364. package/src/ComplexSelector/ComplexSelector.tsx +6 -1
  365. package/src/DateInput/DateInput.tsx +6 -1
  366. package/src/DateInput/NativeDateField.tsx +24 -8
  367. package/src/DateInput/TouchDateField.tsx +6 -2
  368. package/src/DateRangeInput/DateRangeInput.tsx +6 -1
  369. package/src/DateTimeInput/DateTimeInput.tsx +6 -1
  370. package/src/DateTimeInput/TouchDateTimeField.tsx +6 -1
  371. package/src/DateTimeInput/nativePickerSegmentStyles.ts +24 -8
  372. package/src/Dialog/Dialog.doc.mjs +2 -0
  373. package/src/Dialog/DialogHeader.doc.mjs +22 -0
  374. package/src/Dialog/DialogHeader.test.tsx +167 -3
  375. package/src/Dialog/DialogHeader.tsx +37 -6
  376. package/src/Dialog/modules/DialogHeader.spec.md +101 -42
  377. package/src/DropdownMenu/DropdownMenu.test.tsx +5 -2
  378. package/src/Field/InputClearButton.test.tsx +17 -3
  379. package/src/Field/InputClearButton.tsx +5 -2
  380. package/src/Field/PanelSearchInput.tsx +5 -2
  381. package/src/FieldStatus/__tests__/StatusMessage.a11y.states.ts +1 -1
  382. package/src/FileInput/FileInput.tsx +11 -2
  383. package/src/Icon/Icon.doc.mjs +7 -5
  384. package/src/Icon/Icon.spec.md +81 -40
  385. package/src/Icon/Icon.test.tsx +6 -3
  386. package/src/Icon/Icon.tsx +20 -68
  387. package/src/Icon/IconDefaultSizeContext.ts +23 -0
  388. package/src/Icon/IconSize.stylex.ts +70 -0
  389. package/src/IconButton/IconButton.doc.mjs +3 -3
  390. package/src/IconButton/IconButton.test.tsx +40 -0
  391. package/src/Item/Item.doc.mjs +6 -2
  392. package/src/Item/Item.tsx +9 -3
  393. package/src/Kbd/Kbd.doc.mjs +3 -3
  394. package/src/Kbd/Kbd.test.tsx +57 -1
  395. package/src/Kbd/Kbd.tsx +57 -37
  396. package/src/Layout/LayoutFooter.doc.mjs +17 -0
  397. package/src/Link/Link.doc.mjs +17 -4
  398. package/src/Link/Link.test.tsx +24 -0
  399. package/src/Link/Link.tsx +5 -0
  400. package/src/Link/LinkProvider.doc.mjs +2 -2
  401. package/src/Link/__tests__/Link.navigation.a11y.chromium.spec.ts +261 -0
  402. package/src/Link/useLinkComponent.test.tsx +333 -0
  403. package/src/Link/useLinkComponent.ts +29 -57
  404. package/src/List/List.doc.mjs +6 -0
  405. package/src/List/List.spec.md +200 -0
  406. package/src/List/List.test.tsx +117 -1
  407. package/src/List/List.tsx +22 -2
  408. package/src/List/ListContext.tsx +3 -1
  409. package/src/List/ListItem.doc.mjs +2 -2
  410. package/src/List/ListItem.source-build.test.mjs +41 -0
  411. package/src/List/ListItem.tsx +26 -2
  412. package/src/Markdown/Markdown.doc.mjs +300 -2
  413. package/src/Markdown/Markdown.fr23.bench.ts +174 -0
  414. package/src/Markdown/Markdown.fr23.perf.test.ts +249 -0
  415. package/src/Markdown/Markdown.fr23.sampling.ts +49 -0
  416. package/src/Markdown/Markdown.helpers.perf.test.ts +489 -0
  417. package/src/Markdown/Markdown.public.test.ts +130 -3
  418. package/src/Markdown/Markdown.renderBoundary.test.tsx +72 -0
  419. package/src/Markdown/Markdown.spec.md +210 -45
  420. package/src/Markdown/Markdown.test.tsx +87 -3
  421. package/src/Markdown/Markdown.tsx +414 -135
  422. package/src/Markdown/ast.test.ts +307 -0
  423. package/src/Markdown/ast.ts +337 -0
  424. package/src/Markdown/incremental.test.ts +43 -0
  425. package/src/Markdown/index.ts +37 -1
  426. package/src/Markdown/modules/remark.spec.md +269 -0
  427. package/src/Markdown/modules/softBreaks.spec.md +137 -0
  428. package/src/Markdown/parser/index.ts +64 -0
  429. package/src/Markdown/parser.public.test.ts +103 -0
  430. package/src/Markdown/parser.test.ts +38 -6
  431. package/src/Markdown/parser.ts +1221 -242
  432. package/src/Markdown/plugins/frontmatter.test.tsx +125 -0
  433. package/src/Markdown/plugins/frontmatter.ts +198 -0
  434. package/src/Markdown/plugins/index.ts +54 -0
  435. package/src/Markdown/plugins/protocol.test.tsx +1022 -0
  436. package/src/Markdown/plugins/protocol.ts +1618 -0
  437. package/src/Markdown/plugins/semanticFence.test.tsx +546 -0
  438. package/src/Markdown/plugins/semanticFence.ts +424 -0
  439. package/src/Markdown/plugins/softBreaks.test.tsx +172 -0
  440. package/src/Markdown/plugins/softBreaks.ts +169 -0
  441. package/src/Markdown/plugins/sourceDecoration.test.tsx +799 -0
  442. package/src/Markdown/plugins/sourceDecoration.ts +539 -0
  443. package/src/Markdown/plugins/textTransform.test.ts +467 -0
  444. package/src/Markdown/plugins/textTransform.ts +554 -0
  445. package/src/Markdown/remark.test.tsx +1877 -0
  446. package/src/Markdown/remark.ts +1574 -0
  447. package/src/Markdown/url.ts +36 -0
  448. package/src/Markdown/utils.ts +13 -1
  449. package/src/MetadataList/MetadataList.test.tsx +4 -2
  450. package/src/MetadataList/MetadataList.tsx +3 -3
  451. package/src/MultiSelector/MultiSelector.test.tsx +1 -35
  452. package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +128 -0
  453. package/src/NumberInput/NumberInput.tsx +6 -1
  454. package/src/Outline/Outline.doc.mjs +7 -5
  455. package/src/Outline/Outline.spec.md +1 -1
  456. package/src/Outline/index.ts +1 -0
  457. package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +142 -0
  458. package/src/Outline/parseOutlineFromMarkdown.ts +40 -10
  459. package/src/Outline/useOutlineFromMarkdown.ts +15 -3
  460. package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
  461. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +150 -1
  462. package/src/PowerSearch/PowerSearchEditPopover.tsx +51 -28
  463. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +51 -0
  464. package/src/PowerSearch/PowerSearchValueEditor.tsx +4 -0
  465. package/src/ProgressBar/ProgressBar.test.tsx +29 -11
  466. package/src/ProgressBar/ProgressBar.tsx +59 -72
  467. package/src/RadioList/RadioList.doc.mjs +11 -0
  468. package/src/RadioList/RadioList.test.tsx +32 -0
  469. package/src/RadioList/RadioListItem.tsx +25 -1
  470. package/src/ScrollableArea/ScrollableArea.tsx +1 -0
  471. package/src/ScrollableArea/modules/useScrollableArea.spec.md +50 -22
  472. package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
  473. package/src/SegmentedControl/SegmentedControl.test.tsx +61 -0
  474. package/src/SegmentedControl/SegmentedControl.tsx +2 -1
  475. package/src/SegmentedControl/SegmentedControlItem.tsx +6 -9
  476. package/src/Selector/Selector.doc.mjs +3 -3
  477. package/src/Selector/Selector.spec.md +51 -49
  478. package/src/Selector/Selector.test.tsx +61 -55
  479. package/src/Selector/Selector.tsx +34 -15
  480. package/src/Selector/__tests__/Listbox.a11y.chromium.spec.ts +130 -0
  481. package/src/Selector/__tests__/Listbox.a11y.dom.ts +38 -0
  482. package/src/Selector/__tests__/Listbox.a11y.inventory.test.ts +63 -0
  483. package/src/Selector/__tests__/Listbox.a11y.known-failures.ts +37 -0
  484. package/src/Selector/__tests__/Listbox.a11y.states.ts +232 -0
  485. package/src/Selector/__tests__/Selector.a11y.chromium.spec.ts +45 -0
  486. package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +121 -0
  487. package/src/SideNav/SideNav.doc.mjs +1 -1
  488. package/src/SideNav/SideNav.test.tsx +10 -0
  489. package/src/SideNav/SideNav.tsx +14 -2
  490. package/src/Slider/Slider.doc.mjs +17 -3
  491. package/src/Slider/Slider.test.tsx +221 -0
  492. package/src/Slider/Slider.tsx +40 -9
  493. package/src/Spinner/Spinner.test.tsx +4 -0
  494. package/src/Spinner/Spinner.tsx +31 -18
  495. package/src/Switch/Switch.doc.mjs +11 -0
  496. package/src/Switch/Switch.test.tsx +16 -0
  497. package/src/Switch/Switch.tsx +28 -0
  498. package/src/TabList/Tab.tsx +35 -7
  499. package/src/TabList/TabList.doc.mjs +11 -0
  500. package/src/TabList/TabList.spec.md +204 -0
  501. package/src/TabList/TabList.test.tsx +66 -0
  502. package/src/TabList/__tests__/Tabs.a11y.known-failures.ts +1 -34
  503. package/src/Table/Table.doc.mjs +1 -1
  504. package/src/Table/Table.spec.md +54 -40
  505. package/src/Table/Table.test.tsx +83 -10
  506. package/src/Table/Table.tsx +30 -22
  507. package/src/Table/__tests__/TableScroll.a11y.chromium.spec.ts +137 -0
  508. package/src/TextArea/TextArea.tsx +6 -1
  509. package/src/TextInput/TextInput.test.tsx +20 -1
  510. package/src/TextInput/TextInput.tsx +6 -1
  511. package/src/TimeInput/TimeInput.tsx +6 -1
  512. package/src/Timer/Timer.doc.mjs +183 -0
  513. package/src/Timer/Timer.spec.md +215 -0
  514. package/src/Timer/Timer.test.tsx +302 -0
  515. package/src/Timer/Timer.tsx +258 -0
  516. package/src/Timer/index.ts +11 -0
  517. package/src/ToggleButton/ToggleButton.doc.mjs +3 -3
  518. package/src/ToggleButton/ToggleButton.test.tsx +299 -4
  519. package/src/ToggleButton/ToggleButton.tsx +26 -33
  520. package/src/ToggleButton/ToggleButtonGroup.doc.mjs +3 -3
  521. package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +209 -0
  522. package/src/Token/Token.doc.mjs +2 -2
  523. package/src/Tokenizer/Tokenizer.spec.md +142 -75
  524. package/src/TopNav/TopNavMenu.doc.mjs +2 -2
  525. package/src/TopNav/TopNavMenu.test.tsx +30 -0
  526. package/src/TopNav/TopNavMenu.tsx +7 -2
  527. package/src/TreeList/TreeList.doc.mjs +3 -3
  528. package/src/TreeList/TreeList.spec.md +123 -75
  529. package/src/TreeList/TreeList.test.tsx +29 -0
  530. package/src/TreeList/TreeList.tsx +3 -0
  531. package/src/TreeList/TreeListItem.tsx +15 -1
  532. package/src/TreeList/TreeListTypes.ts +11 -1
  533. package/src/Typeahead/BaseTypeahead.spec.md +4 -3
  534. package/src/Typeahead/BaseTypeahead.tsx +21 -7
  535. package/src/Typeahead/Typeahead.test.tsx +53 -0
  536. package/src/__tests__/PressedState.a11y.chromium.spec.ts +813 -0
  537. package/src/__tests__/pressState.ts +93 -0
  538. package/src/hooks/scrollKeyboardDelegation.test.ts +155 -0
  539. package/src/hooks/scrollKeyboardDelegation.ts +233 -0
  540. package/src/hooks/useClickableContainer.test.tsx +236 -0
  541. package/src/hooks/useClickableContainer.ts +20 -4
  542. package/src/hooks/useScrollableArea.doc.mjs +15 -3
  543. package/src/hooks/useScrollableArea.test.tsx +59 -1
  544. package/src/hooks/useScrollableArea.ts +34 -10
  545. package/src/index.ts +3 -0
  546. package/src/inputFontFloor.test.ts +106 -0
  547. package/src/tailwind-theme.css +0 -6
  548. package/src/theme/Theme.test.tsx +32 -0
  549. package/src/theme/declarationBoundary.test.ts +126 -0
  550. package/src/theme/declarationBoundary.ts +347 -0
  551. package/src/theme/derivedVarRegistry.test.ts +7 -0
  552. package/src/theme/derivedVarRegistry.ts +1 -0
  553. package/src/theme/generateThemeRules.test.ts +526 -1
  554. package/src/theme/generateThemeRules.ts +228 -50
  555. package/src/theme/tokenValueCompat.test.ts +4 -1
  556. package/src/utils/interactionOverlay.stylex.ts +20 -0
  557. package/src/utils/safeUrl.test.ts +88 -0
  558. package/src/utils/safeUrl.ts +85 -0
@@ -9,11 +9,17 @@
9
9
  * Used by both the runtime path (Theme injects <style>) and the build
10
10
  * path (`astryx theme build` pre-compiles to CSS files).
11
11
  *
12
+ * Every consumer-supplied declaration is checked by declarationBoundary.ts
13
+ * before it is emitted, so a value can never end its declaration or rule
14
+ * early. A refused declaration is dropped and reported in the supplied
15
+ * warnings array (build receipts), or through `console.warn` (runtime).
16
+ *
12
17
  * Extracted from defineTheme.ts to reduce cyclomatic complexity and provide
13
18
  * a clear single-responsibility module for CSS generation.
14
19
  *
15
- * @input DefinedTheme (resolved theme object from defineTheme)
16
- * @output CSS rule strings, split by layer (component vs prose)
20
+ * @input DefinedTheme (resolved theme object from defineTheme), optional warnings array
21
+ * @output CSS rule strings, split by layer (component vs prose), and warning text
22
+ * for each dropped declaration
17
23
  * @position packages/core/src/theme/generateThemeRules.ts
18
24
  */
19
25
 
@@ -22,6 +28,7 @@ import { parseStyleKey } from "../utils/parseStyleKey.js";
22
28
  import { getDerivedVars } from "./derivedVarRegistry.js";
23
29
  import { dataTokenDefaults } from "./domainTokens/dataTokens.js";
24
30
  import { cssVar, classPrefix, dataAttrNamespace } from "../naming.js";
31
+ import { checkDeclarationName, checkDeclarationValue } from "./declarationBoundary.js";
25
32
 
26
33
  /**
27
34
  * Theme @scope selectors.
@@ -284,6 +291,77 @@ function expandContainerPadding(component, parsed, resetInheritedSpecificity = f
284
291
  return tokens;
285
292
  }
286
293
 
294
+ // =============================================================================
295
+ // Declaration assembly: a declaration always stays one declaration
296
+ // =============================================================================
297
+
298
+ const warnToConsole = message => {
299
+ console.warn(`[astryx theme] ${message}`);
300
+ };
301
+
302
+ /** Build receipts collect warning text; runtime callers warn by default. */
303
+ function diagnosticSink(warnings) {
304
+ return warnings ? message => warnings.push(message) : warnToConsole;
305
+ }
306
+
307
+ /** Shorten an authored value for a one-line message. */
308
+ function previewValue(value) {
309
+ const oneLine = JSON.stringify(value);
310
+ return oneLine.length > 80 ? `${oneLine.slice(0, 77)}..."` : oneLine;
311
+ }
312
+ function reportDrop(sink, property, value, location, reason) {
313
+ sink(`dropped "${property}" in ${location}: ${reason} (value: ${previewValue(value)})`);
314
+ }
315
+
316
+ /**
317
+ * True when `name: value;` stays exactly one declaration; otherwise reports
318
+ * the drop and returns false. Both checks follow CSS syntax, so valid CSS a
319
+ * browser keeps inside one declaration (a `data:` URI, `Gill\ Sans`, a closed
320
+ * comment, a vendor-prefixed property) is never refused; see
321
+ * declarationBoundary.ts for the rules.
322
+ */
323
+ function acceptDeclaration(property, value, location, sink) {
324
+ const reason = checkDeclarationName(property) ?? checkDeclarationValue(value);
325
+ if (reason === null) {
326
+ return true;
327
+ }
328
+ reportDrop(sink, property, value, location, reason);
329
+ return false;
330
+ }
331
+
332
+ /**
333
+ * Assemble `prop: value;` lines, dropping (and reporting) any entry whose
334
+ * property or value could not stay a single declaration. Theme definitions
335
+ * are code, but apps do assemble them from stored input (brand colors,
336
+ * white-labeling), so the generated stylesheet must never extend beyond the
337
+ * declarations it means to emit.
338
+ */
339
+ function joinDeclarations(entries, location, sink, mapProp = p => p) {
340
+ const lines = [];
341
+ for (const [rawProp, rawValue] of entries) {
342
+ // Legacy unenrolled tokens retain non-string values. Scan the same text
343
+ // interpolation has always emitted, without changing the normalized theme.
344
+ const value = `${rawValue}`;
345
+ const prop = mapProp(rawProp);
346
+ if (acceptDeclaration(prop, value, location, sink)) {
347
+ lines.push(` ${prop}: ${value};`);
348
+ }
349
+ }
350
+ return lines.join('\n');
351
+ }
352
+
353
+ /** The `:scope` token block for portable and theme-local token values. */
354
+ function tokenBlock(source, location, sink) {
355
+ const declarations = [joinDeclarations(Object.entries(source.tokens), `${location}tokens`, sink), joinDeclarations(Object.entries(source.localTokens ?? {}), `${location}localTokens`, sink)].filter(block => block.length > 0).join('\n');
356
+ const hasEntries = Object.keys(source.tokens).length > 0 || Object.keys(source.localTokens ?? {}).length > 0;
357
+ return hasEntries ? ` :scope {\n${declarations}\n }` : null;
358
+ }
359
+
360
+ /** `components.button["variant:secondary"]`-style location for a rule. */
361
+ function componentLocation(prefix, component, key) {
362
+ return `${prefix}components.${component}[${JSON.stringify(key)}]`;
363
+ }
364
+
287
365
  // =============================================================================
288
366
  // Public API
289
367
  // =============================================================================
@@ -303,9 +381,9 @@ function expandContainerPadding(component, parsed, resetInheritedSpecificity = f
303
381
  * lost for every conditional rule, with no type error to catch it.
304
382
  */
305
383
 
306
- export function generateThemeRules(theme) {
384
+ export function generateThemeRules(theme, warnings) {
307
385
  const parts = [];
308
- const tokens = theme.tokens;
386
+ const sink = diagnosticSink(warnings);
309
387
 
310
388
  // Bare prose rules reference semantic variables instead of baking the root
311
389
  // value. That lets adaptation token writes take effect through CSS alone
@@ -313,16 +391,27 @@ export function generateThemeRules(theme) {
313
391
  const val = key => `var(${key})`;
314
392
 
315
393
  // 1. Token block — CSS custom properties on :scope
316
- const tokenEntries = [...Object.entries(tokens), ...Object.entries(theme.localTokens ?? {})];
317
- if (tokenEntries.length > 0) {
318
- const declarations = tokenEntries.map(([prop, value]) => ` ${prop}: ${value};`).join('\n');
319
- parts.push(` :scope {\n${declarations}\n }`);
394
+ const tokenRules = tokenBlock(theme, '', sink);
395
+ if (tokenRules !== null) {
396
+ parts.push(tokenRules);
397
+ }
398
+
399
+ // 1b. Base font — apply the theme's declared body font to the scope root.
400
+ // Components styled with `font-family: inherit` (SideNav items, Buttons)
401
+ // otherwise resolve against the browser default serif, since nothing else
402
+ // sets a page font. `font-family` inherits, so one rule on :scope covers
403
+ // the tree. Only emitted when the theme declares a body font, so a bare
404
+ // theme still contributes no scope rules of its own.
405
+ if (theme.tokens['--font-family-body']) {
406
+ parts.push(` :scope {\n font-family: var(--font-family-body);\n }`);
320
407
  }
321
408
 
322
409
  // 2. Component overrides: stable .astryx-* target classes combined with
323
410
  // reflected data-* selectors for visual props and runtime states.
324
411
  if (theme.components) {
325
- generateComponentRules(theme.components, parts);
412
+ generateComponentRules(theme.components, parts, {
413
+ sink
414
+ });
326
415
  }
327
416
 
328
417
  // 3. Prose HTML element rules (h1-h6, p, small, code, hr)
@@ -386,13 +475,21 @@ function generateHeadingWeightOverrides(components, parts, {
386
475
  parts.push(` ${selector} { font-weight: ${effectiveWeight}; }`);
387
476
  }
388
477
  }
478
+
479
+ /**
480
+ * The `fontWeight` a heading rule authors for `styleKey`, or undefined when
481
+ * it has none. A value that cannot stay one declaration is treated as not
482
+ * authored, so the override falls back to the inherited or token weight
483
+ * instead of interpolating it; the drop itself is reported where that same
484
+ * rule's declarations are emitted, so it is not reported twice here.
485
+ */
389
486
  function getAuthoredHeadingWeight(headingRuleMap, styleKey) {
390
487
  const rule = headingRuleMap[styleKey];
391
488
  if (rule == null || typeof rule !== 'object' || Array.isArray(rule)) {
392
489
  return undefined;
393
490
  }
394
491
  const fontWeight = rule.fontWeight;
395
- return typeof fontWeight === 'string' ? fontWeight : undefined;
492
+ return typeof fontWeight === 'string' && checkDeclarationValue(fontWeight) === null ? fontWeight : undefined;
396
493
  }
397
494
 
398
495
  /** Options shared by root, adaptation, and media-surface component lowering. */
@@ -404,7 +501,9 @@ function getAuthoredHeadingWeight(headingRuleMap, styleKey) {
404
501
  */
405
502
  function generateComponentRules(components, parts, {
406
503
  resetInheritedPaddingSpecificity = false,
407
- surface
504
+ surface,
505
+ sink = warnToConsole,
506
+ location: locationPrefix = ''
408
507
  } = {}) {
409
508
  for (const [component, rules] of Object.entries(components)) {
410
509
  for (const [key, styles] of Object.entries(rules)) {
@@ -414,6 +513,7 @@ function generateComponentRules(components, parts, {
414
513
  }
415
514
  const suffix = parseStyleKey(key);
416
515
  const baseSelector = componentSelector(component, suffix, surface);
516
+ const location = componentLocation(locationPrefix, component, key);
417
517
 
418
518
  // Separate regular properties from pseudo-class overrides
419
519
  const props = [];
@@ -421,7 +521,7 @@ function generateComponentRules(components, parts, {
421
521
  for (const [prop, value] of entries) {
422
522
  if (prop.startsWith(':') && typeof value === 'object') {
423
523
  pseudos.push([prop, value]);
424
- } else {
524
+ } else if (acceptDeclaration(toKebabCase(prop), `${value}`, location, sink)) {
425
525
  props.push([prop, value]);
426
526
  }
427
527
  }
@@ -483,7 +583,7 @@ function generateComponentRules(components, parts, {
483
583
 
484
584
  // Emit base rule
485
585
  if (finalProps.length > 0) {
486
- const declarations = finalProps.map(([prop, value]) => ` ${toKebabCase(prop)}: ${value};`).join('\n');
586
+ const declarations = joinDeclarations(finalProps, location, sink, toKebabCase);
487
587
  parts.push(` ${baseSelector} {\n${declarations}\n }`);
488
588
  }
489
589
 
@@ -491,7 +591,7 @@ function generateComponentRules(components, parts, {
491
591
  for (const [pseudo, pseudoStyles] of pseudos) {
492
592
  const pseudoEntries = Object.entries(pseudoStyles);
493
593
  if (pseudoEntries.length > 0) {
494
- const declarations = pseudoEntries.map(([prop, value]) => ` ${toKebabCase(prop)}: ${value};`).join('\n');
594
+ const declarations = joinDeclarations(pseudoEntries, `${location}[${JSON.stringify(pseudo)}]`, sink, toKebabCase);
495
595
  parts.push(` ${appendPseudoToSelectorList(baseSelector, pseudo)} {\n${declarations}\n }`);
496
596
  }
497
597
  }
@@ -629,8 +729,8 @@ function generateSizeOverrides(components, parts, surface) {
629
729
  * Component rules (tokens, stable .astryx-* targets plus data-* selectors) are
630
730
  * that need to beat StyleX — they stay in astryx-theme (above StyleX layers).
631
731
  */
632
- export function generateThemeRulesSplit(theme) {
633
- const allRules = generateThemeRules(theme);
732
+ export function generateThemeRulesSplit(theme, warnings) {
733
+ const allRules = generateThemeRules(theme, warnings);
634
734
  const prose = [];
635
735
  const component = [];
636
736
  for (const rule of allRules) {
@@ -654,19 +754,21 @@ export function generateThemeRulesSplit(theme) {
654
754
  * to media contexts — only tokens change. Themes can further customize
655
755
  * via onDark.components / onLight.components.
656
756
  */
657
- export function generateOnMediaCSS(theme) {
757
+ export function generateOnMediaCSS(theme, warnings) {
658
758
  const parts = [];
659
759
  const scopeSelector = themeScopeStart(theme.name);
760
+ const sink = diagnosticSink(warnings);
660
761
  for (const surface of ['dark', 'light']) {
661
762
  const onMedia = surface === 'dark' ? theme.__onDark : theme.__onLight;
662
763
  if (!onMedia) {
663
764
  continue;
664
765
  }
766
+ const location = surface === 'dark' ? 'onDark.' : 'onLight.';
665
767
 
666
768
  // Token overrides
667
769
  const tokenEntries = Object.entries(onMedia.tokens);
668
770
  if (tokenEntries.length > 0) {
669
- const declarations = tokenEntries.map(([prop, value]) => ` ${prop}: ${value};`).join('\n');
771
+ const declarations = joinDeclarations(tokenEntries, `${location}tokens`, sink);
670
772
  parts.push(` ${mediaSelector(surface)} {\n${declarations}\n }`);
671
773
  }
672
774
 
@@ -675,7 +777,9 @@ export function generateOnMediaCSS(theme) {
675
777
  if (onMedia.components) {
676
778
  generateComponentRules(onMedia.components, parts, {
677
779
  resetInheritedPaddingSpecificity: true,
678
- surface
780
+ surface,
781
+ sink,
782
+ location
679
783
  });
680
784
  generateColorOverrides(onMedia.components, parts, surface);
681
785
  generateSizeOverrides(onMedia.components, parts, surface);
@@ -697,16 +801,17 @@ export function generateOnMediaCSS(theme) {
697
801
  }
698
802
 
699
803
  /** Generate only the declarations one adaptation rule writes. */
700
- function generateAdaptationRuleRules(rule) {
804
+ function generateAdaptationRuleRules(rule, location, sink) {
701
805
  const parts = [];
702
- const tokenEntries = [...Object.entries(rule.tokens), ...Object.entries(rule.localTokens ?? {})];
703
- if (tokenEntries.length > 0) {
704
- const declarations = tokenEntries.map(([prop, value]) => ` ${prop}: ${value};`).join('\n');
705
- parts.push(` :scope {\n${declarations}\n }`);
806
+ const tokens = tokenBlock(rule, location, sink);
807
+ if (tokens !== null) {
808
+ parts.push(tokens);
706
809
  }
707
810
  if (rule.components) {
708
811
  generateComponentRules(rule.components, parts, {
709
- resetInheritedPaddingSpecificity: true
812
+ resetInheritedPaddingSpecificity: true,
813
+ sink,
814
+ location
710
815
  });
711
816
  generateColorOverrides(rule.components, parts);
712
817
  generateSizeOverrides(rule.components, parts);
@@ -730,7 +835,8 @@ function generateAdaptationMediaBlock(query, parts, scopeSelector) {
730
835
  * rule. Bare prose follows semantic variables, so token writes need no duplicate
731
836
  * prose selectors here.
732
837
  */
733
- export function generateAdaptationCSS(theme) {
838
+ export function generateAdaptationCSS(theme, warnings) {
839
+ const sink = diagnosticSink(warnings);
734
840
  // Built themes can reach this compiler without passing through defineTheme.
735
841
  // Validate retained metadata even when it has no rules (and therefore emits
736
842
  // no CSS): width points remain observable through AppShell and inheritance.
@@ -751,8 +857,8 @@ export function generateAdaptationCSS(theme) {
751
857
  // active whenever the later condition matches, even if the earlier condition
752
858
  // does not. Pairwise merging cannot repair that: multiple mutually exclusive
753
859
  // earlier rules can each overlap one broad later rule.
754
- for (const rule of rules) {
755
- const parts = generateAdaptationRuleRules(rule);
860
+ for (const [index, rule] of rules.entries()) {
861
+ const parts = generateAdaptationRuleRules(rule, `adaptations[${index}].`, sink);
756
862
  if (parts.length === 0) {
757
863
  continue;
758
864
  }
@@ -787,9 +893,9 @@ export function generateAdaptationCSS(theme) {
787
893
  };
788
894
  }
789
895
 
790
- /** Indent a generated rule one level further, for nesting inside `@media`. */
896
+ /** Indent the rule start without rewriting newlines inside authored values. */
791
897
  function indentRule(rule) {
792
- return rule.split('\n').map(line => line.length > 0 ? ` ${line}` : line).join('\n');
898
+ return ` ${rule}`;
793
899
  }
794
900
 
795
901
  /**
@@ -828,11 +934,11 @@ export function generateDataTokenDefaultsCSS() {
828
934
  * The theme-independent `--color-data-*` defaults are not part of this output:
829
935
  * see `generateDataTokenDefaultsCSS`.
830
936
  */
831
- export function generateThemeCSS(theme) {
937
+ export function generateThemeCSS(theme, warnings) {
832
938
  const {
833
939
  component,
834
940
  prose
835
- } = generateThemeRulesSplit(theme);
941
+ } = generateThemeRulesSplit(theme, warnings);
836
942
  const scopeSelector = themeScopeStart(theme.name);
837
943
  const scopeTo = THEME_SCOPE_TO;
838
944
  let proseCss = '';
@@ -851,11 +957,11 @@ export function generateThemeCSS(theme) {
851
957
 
852
958
  // Adaptations follow the root theme in authored order. Media-surface rules
853
959
  // follow adaptations so onDark/onLight keep their specified precedence.
854
- const adaptationCss = generateAdaptationCSS(theme);
960
+ const adaptationCss = generateAdaptationCSS(theme, warnings);
855
961
  if (adaptationCss.component) {
856
962
  componentCss = componentCss ? `${componentCss}\n\n${adaptationCss.component}` : adaptationCss.component;
857
963
  }
858
- const onMediaCss = generateOnMediaCSS(theme);
964
+ const onMediaCss = generateOnMediaCSS(theme, warnings);
859
965
  if (onMediaCss) {
860
966
  componentCss = componentCss ? `${componentCss}\n\n${onMediaCss}` : onMediaCss;
861
967
  }
@@ -4,6 +4,11 @@
4
4
  * @output Exports reusable background-color and background-image state styles
5
5
  * @position Internal styling utility for interactive core surfaces
6
6
  *
7
+ * Every surface that paints a press composes one of these (or carries its own
8
+ * `:active` rule), so a change to how the system answers a press is made here
9
+ * once. `pressedBackgroundColor` is the press without the hover, for controls
10
+ * whose hover is a colour or nothing.
11
+ *
7
12
  * Keep the enabled guard outside the individual states. StyleX assigns an
8
13
  * extra priority bucket (and generated selector specificity) to media-nested
9
14
  * rules. Repeating `:active` inside the hover-capable branch gives hover and
@@ -22,5 +27,8 @@ export declare const interactionOverlayStyles: Readonly<{
22
27
  readonly backgroundImageOnNeutral: Readonly<{
23
28
  readonly backgroundImage: stylex.StyleXClassNameFor<"backgroundImage", string | null>;
24
29
  }>;
30
+ readonly pressedBackgroundColor: Readonly<{
31
+ readonly backgroundColor: stylex.StyleXClassNameFor<"backgroundColor", "light-dark(#05365919, #FFFFFF19)" | null>;
32
+ }>;
25
33
  }>;
26
34
  //# sourceMappingURL=interactionOverlay.stylex.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interactionOverlay.stylex.d.ts","sourceRoot":"","sources":["../../src/utils/interactionOverlay.stylex.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAU3C,eAAO,MAAM,wBAAwB;;;;;;;;;;EA2CnC,CAAC"}
1
+ {"version":3,"file":"interactionOverlay.stylex.d.ts","sourceRoot":"","sources":["../../src/utils/interactionOverlay.stylex.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAU3C,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;EA0DnC,CAAC"}
@@ -10,6 +10,11 @@
10
10
  * @output Exports reusable background-color and background-image state styles
11
11
  * @position Internal styling utility for interactive core surfaces
12
12
  *
13
+ * Every surface that paints a press composes one of these (or carries its own
14
+ * `:active` rule), so a change to how the system answers a press is made here
15
+ * once. `pressedBackgroundColor` is the press without the hover, for controls
16
+ * whose hover is a colour or nothing.
17
+ *
13
18
  * Keep the enabled guard outside the individual states. StyleX assigns an
14
19
  * extra priority bucket (and generated selector specificity) to media-nested
15
20
  * rules. Repeating `:active` inside the hover-capable branch gives hover and
@@ -38,5 +43,9 @@ export const interactionOverlayStyles = {
38
43
  backgroundImageOnNeutral: {
39
44
  kKwaWg: "x14bno8m xzmimnh x1otsd3y xo3fi6e",
40
45
  $$css: true
46
+ },
47
+ pressedBackgroundColor: {
48
+ kWkggS: "x1anq1lc",
49
+ $$css: true
41
50
  }
42
51
  };
@@ -0,0 +1,11 @@
1
+ /** Return a normalized navigation URL, or null for a blocked scheme. */
2
+ export declare function sanitizeUrl(url: string): string | null;
3
+ /** Inspect a navigation string without changing the value used by its sink. */
4
+ export declare function isSafeUrl(url: string): boolean;
5
+ /**
6
+ * Inspect React Router paths, Next.js URL objects, and URL instances without
7
+ * serializing or replacing the object handed to the router. Search/query/hash
8
+ * are route-relative data, not schemes. Absent destinations remain absent.
9
+ */
10
+ export declare function isSafeDestination(destination: unknown): boolean;
11
+ //# sourceMappingURL=safeUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeUrl.d.ts","sourceRoot":"","sources":["../../src/utils/safeUrl.ts"],"names":[],"mappings":"AAcA,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWtD;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,OAAO,GAAG,OAAO,CA8C/D"}
@@ -0,0 +1,78 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file safeUrl.ts
5
+ * @input Navigation strings or supported structured router destinations
6
+ * @output The shared blocked-scheme decision, without rewriting accepted inputs
7
+ * @position Core navigation policy; embedded-resource policy is separate
8
+ */
9
+
10
+ function normalizeUrl(url) {
11
+ // eslint-disable-next-line no-control-regex -- inspect schemes without browser-ignored controls
12
+ return url.replace(/[\x00-\x1f\x7f]/g, '').trim();
13
+ }
14
+
15
+ /** Return a normalized navigation URL, or null for a blocked scheme. */
16
+ export function sanitizeUrl(url) {
17
+ const normalized = normalizeUrl(url);
18
+ const lower = normalized.toLowerCase();
19
+ if (lower.startsWith('javascript:') || lower.startsWith('vbscript:') || lower.startsWith('data:text/html')) {
20
+ return null;
21
+ }
22
+ return normalized;
23
+ }
24
+
25
+ /** Inspect a navigation string without changing the value used by its sink. */
26
+ export function isSafeUrl(url) {
27
+ return sanitizeUrl(url) !== null;
28
+ }
29
+
30
+ /**
31
+ * Inspect React Router paths, Next.js URL objects, and URL instances without
32
+ * serializing or replacing the object handed to the router. Search/query/hash
33
+ * are route-relative data, not schemes. Absent destinations remain absent.
34
+ */
35
+ export function isSafeDestination(destination) {
36
+ if (destination == null) {
37
+ return true;
38
+ }
39
+ if (typeof destination === 'string') {
40
+ return isSafeUrl(destination);
41
+ }
42
+ if (typeof destination !== 'object') {
43
+ return false;
44
+ }
45
+ const {
46
+ pathname,
47
+ href,
48
+ protocol,
49
+ host,
50
+ hostname
51
+ } = destination;
52
+ for (const field of [pathname, href, protocol, host, hostname]) {
53
+ if (field != null && typeof field !== 'string') {
54
+ return false;
55
+ }
56
+ }
57
+ if (typeof pathname === 'string' && !isSafeUrl(pathname)) {
58
+ return false;
59
+ }
60
+ if (typeof href === 'string' && !isSafeUrl(href)) {
61
+ return false;
62
+ }
63
+ if (typeof protocol === 'string' && protocol !== '') {
64
+ // URL-object formatters accept a protocol with or without its colon and
65
+ // can assemble a data media type from the host and pathname fields.
66
+ const normalizedProtocol = normalizeUrl(protocol);
67
+ const prefix = normalizedProtocol.endsWith(':') ? normalizedProtocol : `${normalizedProtocol}:`;
68
+ if (!isSafeUrl(prefix)) {
69
+ return false;
70
+ }
71
+ const body = host || hostname || '';
72
+ const path = typeof pathname === 'string' ? pathname : '';
73
+ if (!isSafeUrl(`${prefix}${body}${path}`)) {
74
+ return false;
75
+ }
76
+ }
77
+ return true;
78
+ }