@astryxdesign/core 0.6.2 → 0.6.3-canary.039a67e

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 (621) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/dist/Avatar/Avatar.d.ts.map +1 -1
  3. package/dist/Avatar/Avatar.js +33 -12
  4. package/dist/BottomSheet/BottomSheet.d.ts +1 -1
  5. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  6. package/dist/BottomSheet/BottomSheet.js +3 -1
  7. package/dist/BottomSheet/BottomSheetPanel.d.ts +7 -5
  8. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  9. package/dist/BottomSheet/BottomSheetPanel.js +56 -19
  10. package/dist/Button/Button.d.ts.map +1 -1
  11. package/dist/Button/Button.js +13 -28
  12. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  13. package/dist/Chat/ChatComposer.js +10 -5
  14. package/dist/Chat/ChatComposerDrawer.d.ts +19 -5
  15. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  16. package/dist/Chat/ChatComposerDrawer.js +48 -23
  17. package/dist/Chat/ChatComposerInput.d.ts +11 -3
  18. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  19. package/dist/Chat/ChatComposerInput.js +63 -16
  20. package/dist/Chat/ChatDictationButton.d.ts +3 -2
  21. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  22. package/dist/Chat/ChatDictationButton.js +6 -4
  23. package/dist/Chat/ChatLayout.d.ts +19 -0
  24. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  25. package/dist/Chat/ChatLayout.js +19 -0
  26. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  27. package/dist/Chat/ChatLayoutScrollButton.js +44 -34
  28. package/dist/Chat/ChatMessageBubble.d.ts +2 -0
  29. package/dist/Chat/ChatMessageBubble.d.ts.map +1 -1
  30. package/dist/Chat/ChatMessageBubble.js +5 -3
  31. package/dist/Chat/ChatMessageList.d.ts +2 -1
  32. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  33. package/dist/Chat/ChatMessageList.js +4 -3
  34. package/dist/Chat/ChatMessageMetadata.d.ts +5 -4
  35. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  36. package/dist/Chat/ChatMessageMetadata.js +12 -9
  37. package/dist/Chat/ChatSendButton.d.ts +2 -1
  38. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  39. package/dist/Chat/ChatSendButton.js +6 -4
  40. package/dist/Chat/ChatSystemMessage.d.ts +3 -3
  41. package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
  42. package/dist/Chat/ChatSystemMessage.js +2 -2
  43. package/dist/Chat/ChatTokenizedText.d.ts +6 -6
  44. package/dist/Chat/ChatTokenizedText.js +10 -6
  45. package/dist/Chat/ChatToolCalls.d.ts +7 -9
  46. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  47. package/dist/Chat/ChatToolCalls.js +43 -26
  48. package/dist/Chat/index.d.ts +1 -1
  49. package/dist/Chat/index.d.ts.map +1 -1
  50. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  51. package/dist/CheckboxInput/CheckboxInput.js +12 -2
  52. package/dist/Citation/Citation.d.ts +1 -1
  53. package/dist/Citation/Citation.d.ts.map +1 -1
  54. package/dist/Citation/Citation.js +3 -2
  55. package/dist/CodeBlock/highlightRanges.d.ts.map +1 -1
  56. package/dist/CodeBlock/highlightRanges.js +14 -3
  57. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  58. package/dist/Collapsible/Collapsible.js +6 -1
  59. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  60. package/dist/CommandPalette/CommandPaletteInput.js +1 -1
  61. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  62. package/dist/ComplexSelector/ComplexSelector.js +1 -1
  63. package/dist/DateInput/DateInput.d.ts +25 -5
  64. package/dist/DateInput/DateInput.d.ts.map +1 -1
  65. package/dist/DateInput/DateInput.js +29 -17
  66. package/dist/DateInput/NativeDateField.d.ts.map +1 -1
  67. package/dist/DateInput/NativeDateField.js +16 -16
  68. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  69. package/dist/DateInput/TouchDateField.js +2 -2
  70. package/dist/DateInput/index.d.ts +1 -1
  71. package/dist/DateInput/index.d.ts.map +1 -1
  72. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  73. package/dist/DateRangeInput/DateRangeInput.js +4 -4
  74. package/dist/DateTimeInput/DateTimeInput.d.ts +32 -15
  75. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  76. package/dist/DateTimeInput/DateTimeInput.js +55 -30
  77. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  78. package/dist/DateTimeInput/TouchDateTimeField.js +4 -4
  79. package/dist/DateTimeInput/index.d.ts +1 -1
  80. package/dist/DateTimeInput/index.d.ts.map +1 -1
  81. package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts +9 -3
  82. package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts.map +1 -1
  83. package/dist/DateTimeInput/nativePickerSegmentStyles.js +3 -3
  84. package/dist/Dialog/DialogHeader.d.ts +8 -1
  85. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  86. package/dist/Dialog/DialogHeader.js +13 -4
  87. package/dist/Field/InputClearButton.d.ts +4 -2
  88. package/dist/Field/InputClearButton.d.ts.map +1 -1
  89. package/dist/Field/InputClearButton.js +4 -2
  90. package/dist/Field/PanelSearchInput.d.ts.map +1 -1
  91. package/dist/Field/PanelSearchInput.js +1 -1
  92. package/dist/FileInput/FileInput.d.ts.map +1 -1
  93. package/dist/FileInput/FileInput.js +7 -7
  94. package/dist/Icon/Icon.d.ts +6 -31
  95. package/dist/Icon/Icon.d.ts.map +1 -1
  96. package/dist/Icon/Icon.js +8 -71
  97. package/dist/Icon/IconDefaultSizeContext.d.ts +4 -0
  98. package/dist/Icon/IconDefaultSizeContext.d.ts.map +1 -0
  99. package/dist/Icon/IconDefaultSizeContext.js +18 -0
  100. package/dist/Icon/IconSize.stylex.d.ts +65 -0
  101. package/dist/Icon/IconSize.stylex.d.ts.map +1 -0
  102. package/dist/Icon/IconSize.stylex.js +75 -0
  103. package/dist/Item/Item.d.ts +1 -1
  104. package/dist/Item/Item.d.ts.map +1 -1
  105. package/dist/Item/Item.js +4 -3
  106. package/dist/Kbd/Kbd.d.ts +5 -3
  107. package/dist/Kbd/Kbd.d.ts.map +1 -1
  108. package/dist/Kbd/Kbd.js +36 -42
  109. package/dist/Link/Link.d.ts.map +1 -1
  110. package/dist/Link/Link.js +6 -2
  111. package/dist/Link/useLinkComponent.d.ts +5 -15
  112. package/dist/Link/useLinkComponent.d.ts.map +1 -1
  113. package/dist/Link/useLinkComponent.js +34 -51
  114. package/dist/List/List.d.ts +19 -1
  115. package/dist/List/List.d.ts.map +1 -1
  116. package/dist/List/List.js +9 -2
  117. package/dist/List/ListContext.d.ts +1 -0
  118. package/dist/List/ListContext.d.ts.map +1 -1
  119. package/dist/List/ListContext.js +2 -1
  120. package/dist/List/ListItem.d.ts +1 -1
  121. package/dist/List/ListItem.d.ts.map +1 -1
  122. package/dist/List/ListItem.js +9 -2
  123. package/dist/Markdown/Markdown.d.ts +8 -2
  124. package/dist/Markdown/Markdown.d.ts.map +1 -1
  125. package/dist/Markdown/Markdown.fr23.bench.d.ts +2 -0
  126. package/dist/Markdown/Markdown.fr23.bench.d.ts.map +1 -0
  127. package/dist/Markdown/Markdown.fr23.bench.js +150 -0
  128. package/dist/Markdown/Markdown.fr23.sampling.d.ts +2 -0
  129. package/dist/Markdown/Markdown.fr23.sampling.d.ts.map +1 -0
  130. package/dist/Markdown/Markdown.fr23.sampling.js +43 -0
  131. package/dist/Markdown/Markdown.js +262 -109
  132. package/dist/Markdown/ast.d.ts +162 -0
  133. package/dist/Markdown/ast.d.ts.map +1 -0
  134. package/dist/Markdown/ast.js +74 -0
  135. package/dist/Markdown/index.d.ts +5 -3
  136. package/dist/Markdown/index.d.ts.map +1 -1
  137. package/dist/Markdown/index.js +3 -2
  138. package/dist/Markdown/parser/index.d.ts +10 -0
  139. package/dist/Markdown/parser/index.d.ts.map +1 -0
  140. package/dist/Markdown/parser/index.js +10 -0
  141. package/dist/Markdown/parser.d.ts +126 -58
  142. package/dist/Markdown/parser.d.ts.map +1 -1
  143. package/dist/Markdown/parser.js +726 -177
  144. package/dist/Markdown/plugins/frontmatter.d.ts +32 -0
  145. package/dist/Markdown/plugins/frontmatter.d.ts.map +1 -0
  146. package/dist/Markdown/plugins/frontmatter.js +132 -0
  147. package/dist/Markdown/plugins/index.d.ts +17 -0
  148. package/dist/Markdown/plugins/index.d.ts.map +1 -0
  149. package/dist/Markdown/plugins/index.js +14 -0
  150. package/dist/Markdown/plugins/protocol.d.ts +191 -0
  151. package/dist/Markdown/plugins/protocol.d.ts.map +1 -0
  152. package/dist/Markdown/plugins/protocol.js +957 -0
  153. package/dist/Markdown/plugins/semanticFence.d.ts +36 -0
  154. package/dist/Markdown/plugins/semanticFence.d.ts.map +1 -0
  155. package/dist/Markdown/plugins/semanticFence.js +213 -0
  156. package/dist/Markdown/plugins/softBreaks.d.ts +3 -0
  157. package/dist/Markdown/plugins/softBreaks.d.ts.map +1 -0
  158. package/dist/Markdown/plugins/softBreaks.js +172 -0
  159. package/dist/Markdown/plugins/sourceDecoration.d.ts +76 -0
  160. package/dist/Markdown/plugins/sourceDecoration.d.ts.map +1 -0
  161. package/dist/Markdown/plugins/sourceDecoration.js +393 -0
  162. package/dist/Markdown/plugins/textTransform.d.ts +30 -0
  163. package/dist/Markdown/plugins/textTransform.d.ts.map +1 -0
  164. package/dist/Markdown/plugins/textTransform.js +374 -0
  165. package/dist/Markdown/remark.d.ts +196 -0
  166. package/dist/Markdown/remark.d.ts.map +1 -0
  167. package/dist/Markdown/remark.js +1062 -0
  168. package/dist/Markdown/url.d.ts +6 -0
  169. package/dist/Markdown/url.d.ts.map +1 -0
  170. package/dist/Markdown/url.js +31 -0
  171. package/dist/Markdown/utils.d.ts +4 -2
  172. package/dist/Markdown/utils.d.ts.map +1 -1
  173. package/dist/Markdown/utils.js +2 -1
  174. package/dist/MetadataList/MetadataList.js +3 -3
  175. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  176. package/dist/NumberInput/NumberInput.js +4 -4
  177. package/dist/Outline/index.d.ts +1 -0
  178. package/dist/Outline/index.d.ts.map +1 -1
  179. package/dist/Outline/parseOutlineFromMarkdown.d.ts +7 -1
  180. package/dist/Outline/parseOutlineFromMarkdown.d.ts.map +1 -1
  181. package/dist/Outline/parseOutlineFromMarkdown.js +14 -8
  182. package/dist/Outline/useOutlineFromMarkdown.d.ts +3 -1
  183. package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
  184. package/dist/Outline/useOutlineFromMarkdown.js +8 -3
  185. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  186. package/dist/PowerSearch/PowerSearchEditPopover.js +46 -30
  187. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  188. package/dist/PowerSearch/PowerSearchValueEditor.js +5 -0
  189. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  190. package/dist/ProgressBar/ProgressBar.js +36 -31
  191. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  192. package/dist/RadioList/RadioListItem.js +13 -1
  193. package/dist/ScrollableArea/ScrollableArea.d.ts +1 -0
  194. package/dist/ScrollableArea/ScrollableArea.d.ts.map +1 -1
  195. package/dist/ScrollableArea/ScrollableArea.js +1 -0
  196. package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
  197. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  198. package/dist/SegmentedControl/SegmentedControl.js +1 -0
  199. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  200. package/dist/SegmentedControl/SegmentedControlItem.js +5 -5
  201. package/dist/Selector/Selector.d.ts +9 -7
  202. package/dist/Selector/Selector.d.ts.map +1 -1
  203. package/dist/Selector/Selector.js +16 -7
  204. package/dist/SideNav/SideNav.d.ts +2 -1
  205. package/dist/SideNav/SideNav.d.ts.map +1 -1
  206. package/dist/SideNav/SideNav.js +9 -3
  207. package/dist/Slider/Slider.d.ts.map +1 -1
  208. package/dist/Slider/Slider.js +28 -12
  209. package/dist/Spinner/Spinner.d.ts.map +1 -1
  210. package/dist/Spinner/Spinner.js +23 -7
  211. package/dist/Switch/Switch.d.ts.map +1 -1
  212. package/dist/Switch/Switch.js +11 -0
  213. package/dist/TabList/Tab.d.ts +1 -1
  214. package/dist/TabList/Tab.d.ts.map +1 -1
  215. package/dist/TabList/Tab.js +20 -7
  216. package/dist/Table/Table.d.ts +1 -0
  217. package/dist/Table/Table.d.ts.map +1 -1
  218. package/dist/Table/Table.js +29 -13
  219. package/dist/TextArea/TextArea.d.ts.map +1 -1
  220. package/dist/TextArea/TextArea.js +1 -1
  221. package/dist/TextInput/TextInput.d.ts.map +1 -1
  222. package/dist/TextInput/TextInput.js +2 -2
  223. package/dist/TimeInput/TimeInput.d.ts +30 -14
  224. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  225. package/dist/TimeInput/TimeInput.js +61 -13
  226. package/dist/TimeInput/TouchTimeField.d.ts +11 -0
  227. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -0
  228. package/dist/TimeInput/TouchTimeField.js +417 -0
  229. package/dist/TimeInput/index.d.ts +1 -1
  230. package/dist/TimeInput/index.d.ts.map +1 -1
  231. package/dist/Timer/Timer.d.ts +49 -0
  232. package/dist/Timer/Timer.d.ts.map +1 -0
  233. package/dist/Timer/Timer.js +158 -0
  234. package/dist/Timer/index.d.ts +9 -0
  235. package/dist/Timer/index.d.ts.map +1 -0
  236. package/dist/Timer/index.js +10 -0
  237. package/dist/ToggleButton/ToggleButton.d.ts +9 -6
  238. package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
  239. package/dist/ToggleButton/ToggleButton.js +15 -27
  240. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  241. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  242. package/dist/TopNav/TopNavMenu.js +3 -2
  243. package/dist/TreeList/TreeList.d.ts.map +1 -1
  244. package/dist/TreeList/TreeList.js +3 -0
  245. package/dist/TreeList/TreeListItem.d.ts +6 -1
  246. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  247. package/dist/TreeList/TreeListItem.js +12 -2
  248. package/dist/TreeList/TreeListTypes.d.ts +8 -1
  249. package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
  250. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  251. package/dist/Typeahead/BaseTypeahead.js +16 -7
  252. package/dist/astryx.css +27 -11
  253. package/dist/hooks/scrollKeyboardDelegation.d.ts +3 -0
  254. package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -0
  255. package/dist/hooks/scrollKeyboardDelegation.js +146 -0
  256. package/dist/hooks/useClickableContainer.d.ts +10 -1
  257. package/dist/hooks/useClickableContainer.d.ts.map +1 -1
  258. package/dist/hooks/useClickableContainer.js +15 -4
  259. package/dist/hooks/useScrollableArea.d.ts +6 -2
  260. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  261. package/dist/hooks/useScrollableArea.js +17 -5
  262. package/dist/index.d.ts +1 -0
  263. package/dist/index.d.ts.map +1 -1
  264. package/dist/index.js +3 -0
  265. package/dist/theme/declarationBoundary.d.ts +17 -0
  266. package/dist/theme/declarationBoundary.d.ts.map +1 -0
  267. package/dist/theme/declarationBoundary.js +343 -0
  268. package/dist/theme/defineTheme.d.ts +3 -0
  269. package/dist/theme/defineTheme.d.ts.map +1 -1
  270. package/dist/theme/defineTheme.js +4 -1
  271. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  272. package/dist/theme/derivedVarRegistry.js +4 -0
  273. package/dist/theme/generateThemeRules.d.ts +15 -7
  274. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  275. package/dist/theme/generateThemeRules.js +143 -35
  276. package/dist/theme/themeAdaptations.d.ts +5 -3
  277. package/dist/theme/themeAdaptations.d.ts.map +1 -1
  278. package/dist/theme/themeAdaptations.js +33 -5
  279. package/dist/utils/inputPresentation.d.ts +55 -0
  280. package/dist/utils/inputPresentation.d.ts.map +1 -0
  281. package/dist/utils/inputPresentation.js +108 -0
  282. package/dist/utils/interactionOverlay.stylex.d.ts +8 -0
  283. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  284. package/dist/utils/interactionOverlay.stylex.js +9 -0
  285. package/dist/utils/safeUrl.d.ts +11 -0
  286. package/dist/utils/safeUrl.d.ts.map +1 -0
  287. package/dist/utils/safeUrl.js +78 -0
  288. package/locales/af-ZA.json +530 -1
  289. package/locales/ar-SA.json +490 -1
  290. package/locales/ca-ES.json +514 -1
  291. package/locales/cs-CZ.json +498 -1
  292. package/locales/da-DK.json +522 -1
  293. package/locales/de-DE.json +522 -1
  294. package/locales/el-GR.json +498 -1
  295. package/locales/es-ES.json +510 -1
  296. package/locales/fi-FI.json +498 -1
  297. package/locales/fr-FR.json +534 -1
  298. package/locales/he-IL.json +498 -1
  299. package/locales/hu-HU.json +498 -1
  300. package/locales/it-IT.json +510 -1
  301. package/locales/ja-JP.json +490 -1
  302. package/locales/ko-KR.json +498 -1
  303. package/locales/nl-NL.json +534 -1
  304. package/locales/no-NO.json +510 -1
  305. package/locales/pl-PL.json +506 -1
  306. package/locales/pt-BR.json +506 -1
  307. package/locales/pt-PT.json +506 -1
  308. package/locales/ro-RO.json +506 -1
  309. package/locales/ru-RU.json +498 -1
  310. package/locales/sr-SP.json +498 -1
  311. package/locales/sv-SE.json +502 -1
  312. package/locales/tr-TR.json +498 -1
  313. package/locales/uk-UA.json +498 -1
  314. package/locales/vi-VN.json +502 -1
  315. package/locales/zh-CN.json +490 -1
  316. package/locales/zh-TW.json +490 -1
  317. package/package.json +24 -4
  318. package/src/Avatar/Avatar.doc.mjs +1 -1
  319. package/src/Avatar/Avatar.test.tsx +30 -0
  320. package/src/Avatar/Avatar.tsx +38 -14
  321. package/src/BottomSheet/BottomSheet.doc.mjs +8 -1
  322. package/src/BottomSheet/BottomSheet.spec.md +46 -20
  323. package/src/BottomSheet/BottomSheet.test.tsx +6 -3
  324. package/src/BottomSheet/BottomSheet.tsx +3 -1
  325. package/src/BottomSheet/BottomSheetKeyboard.test.tsx +195 -0
  326. package/src/BottomSheet/BottomSheetPanel.test.tsx +11 -1
  327. package/src/BottomSheet/BottomSheetPanel.tsx +49 -16
  328. package/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts +344 -0
  329. package/src/Button/Button.doc.mjs +5 -5
  330. package/src/Button/Button.tsx +15 -13
  331. package/src/Button/__tests__/Button.a11y.chromium.spec.ts +17 -1
  332. package/src/Button/__tests__/Button.a11y.known-failures.ts +0 -29
  333. package/src/Button/__tests__/Button.a11y.renders.tsx +9 -2
  334. package/src/Button/__tests__/Button.a11y.states.ts +9 -0
  335. package/src/Chat/ChatComposer.doc.mjs +14 -0
  336. package/src/Chat/ChatComposer.spec.md +230 -0
  337. package/src/Chat/ChatComposer.test.tsx +57 -0
  338. package/src/Chat/ChatComposer.tsx +21 -9
  339. package/src/Chat/ChatComposerDrawer.doc.mjs +63 -5
  340. package/src/Chat/ChatComposerDrawer.spec.md +267 -0
  341. package/src/Chat/ChatComposerDrawer.test.tsx +81 -12
  342. package/src/Chat/ChatComposerDrawer.tsx +38 -9
  343. package/src/Chat/ChatComposerInput.doc.mjs +114 -26
  344. package/src/Chat/ChatComposerInput.spec.md +185 -0
  345. package/src/Chat/ChatComposerInput.test.tsx +113 -3
  346. package/src/Chat/ChatComposerInput.tsx +78 -13
  347. package/src/Chat/ChatComposerTokenElement.spec.md +152 -0
  348. package/src/Chat/ChatComposerTokenElement.test.tsx +85 -0
  349. package/src/Chat/ChatDictationButton.doc.mjs +3 -3
  350. package/src/Chat/ChatDictationButton.spec.md +160 -0
  351. package/src/Chat/ChatDictationButton.test.tsx +92 -27
  352. package/src/Chat/ChatDictationButton.tsx +8 -6
  353. package/src/Chat/ChatLayout.doc.mjs +12 -4
  354. package/src/Chat/ChatLayout.spec.md +271 -0
  355. package/src/Chat/ChatLayout.test.tsx +28 -0
  356. package/src/Chat/ChatLayout.tsx +19 -0
  357. package/src/Chat/ChatLayoutScrollButton.spec.md +338 -0
  358. package/src/Chat/ChatLayoutScrollButton.test.tsx +31 -0
  359. package/src/Chat/ChatLayoutScrollButton.tsx +31 -14
  360. package/src/Chat/ChatMessageBubble.doc.mjs +28 -15
  361. package/src/Chat/ChatMessageBubble.spec.md +263 -0
  362. package/src/Chat/ChatMessageBubble.test.tsx +93 -0
  363. package/src/Chat/ChatMessageBubble.tsx +8 -3
  364. package/src/Chat/ChatMessageList.spec.md +222 -0
  365. package/src/Chat/ChatMessageList.test.tsx +64 -2
  366. package/src/Chat/ChatMessageList.tsx +4 -3
  367. package/src/Chat/ChatMessageMetadata.doc.mjs +57 -3
  368. package/src/Chat/ChatMessageMetadata.spec.md +220 -0
  369. package/src/Chat/ChatMessageMetadata.test.tsx +34 -0
  370. package/src/Chat/ChatMessageMetadata.tsx +13 -13
  371. package/src/Chat/ChatSendButton.doc.mjs +32 -0
  372. package/src/Chat/ChatSendButton.spec.md +227 -0
  373. package/src/Chat/ChatSendButton.test.tsx +128 -8
  374. package/src/Chat/ChatSendButton.tsx +6 -4
  375. package/src/Chat/ChatSystemMessage.doc.mjs +115 -12
  376. package/src/Chat/ChatSystemMessage.spec.md +225 -0
  377. package/src/Chat/ChatSystemMessage.test.tsx +112 -20
  378. package/src/Chat/ChatSystemMessage.tsx +4 -6
  379. package/src/Chat/ChatTokenizedText.doc.mjs +96 -9
  380. package/src/Chat/ChatTokenizedText.spec.md +190 -0
  381. package/src/Chat/ChatTokenizedText.test.tsx +60 -1
  382. package/src/Chat/ChatTokenizedText.tsx +14 -8
  383. package/src/Chat/ChatToolCalls.doc.mjs +4 -1
  384. package/src/Chat/ChatToolCalls.spec.md +194 -0
  385. package/src/Chat/ChatToolCalls.test.tsx +83 -0
  386. package/src/Chat/ChatToolCalls.tsx +46 -21
  387. package/src/Chat/__tests__/ChatLayoutScrollButton.a11y.chromium.spec.ts +514 -0
  388. package/src/Chat/__tests__/ChatLayoutScrollButtonSurface.a11y.chromium.spec.ts +740 -0
  389. package/src/Chat/__tests__/ChatMessageBubble.a11y.chromium.spec.ts +457 -0
  390. package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.test.ts +91 -0
  391. package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.ts +91 -0
  392. package/src/Chat/__tests__/ChatMessageList.a11y.chromium.spec.ts +456 -0
  393. package/src/Chat/__tests__/ChatMessageMetadata.a11y.chromium.spec.ts +413 -0
  394. package/src/Chat/__tests__/ChatSendButton.a11y.chromium.spec.ts +1522 -0
  395. package/src/Chat/__tests__/ChatSystemMessage.a11y.chromium.spec.ts +1004 -0
  396. package/src/Chat/__tests__/ChatTokenizedText.a11y.chromium.spec.ts +573 -0
  397. package/src/Chat/index.ts +1 -0
  398. package/src/CheckboxInput/CheckboxInput.doc.mjs +11 -0
  399. package/src/CheckboxInput/CheckboxInput.test.tsx +34 -0
  400. package/src/CheckboxInput/CheckboxInput.tsx +21 -1
  401. package/src/Citation/Citation.doc.mjs +2 -2
  402. package/src/Citation/Citation.test.tsx +17 -0
  403. package/src/Citation/Citation.tsx +4 -2
  404. package/src/ClickableCard/ClickableCard.doc.mjs +2 -2
  405. package/src/ClickableCard/ClickableCard.test.tsx +102 -5
  406. package/src/CodeBlock/highlightRanges.test.ts +143 -1
  407. package/src/CodeBlock/highlightRanges.ts +15 -5
  408. package/src/Collapsible/Collapsible.doc.mjs +11 -0
  409. package/src/Collapsible/Collapsible.test.tsx +21 -0
  410. package/src/Collapsible/Collapsible.tsx +5 -0
  411. package/src/CommandPalette/CommandPaletteInput.tsx +6 -1
  412. package/src/ComplexSelector/ComplexSelector.tsx +6 -1
  413. package/src/DateInput/DateInput.doc.mjs +38 -9
  414. package/src/DateInput/DateInput.tsx +59 -17
  415. package/src/DateInput/NativeDateField.tsx +24 -8
  416. package/src/DateInput/Presentation.test.tsx +121 -0
  417. package/src/DateInput/TouchDateField.tsx +6 -2
  418. package/src/DateInput/index.ts +1 -0
  419. package/src/DateRangeInput/DateRangeInput.tsx +6 -1
  420. package/src/DateTimeInput/DateTimeInput.doc.mjs +28 -12
  421. package/src/DateTimeInput/DateTimeInput.tsx +93 -37
  422. package/src/DateTimeInput/Presentation.test.tsx +89 -0
  423. package/src/DateTimeInput/TouchDateTimeField.tsx +6 -1
  424. package/src/DateTimeInput/index.ts +1 -0
  425. package/src/DateTimeInput/nativePickerSegmentStyles.ts +24 -8
  426. package/src/Dialog/Dialog.doc.mjs +2 -0
  427. package/src/Dialog/DialogHeader.doc.mjs +22 -0
  428. package/src/Dialog/DialogHeader.test.tsx +167 -3
  429. package/src/Dialog/DialogHeader.tsx +37 -6
  430. package/src/Dialog/modules/DialogHeader.spec.md +101 -42
  431. package/src/DropdownMenu/DropdownMenu.test.tsx +5 -2
  432. package/src/Field/InputClearButton.test.tsx +17 -3
  433. package/src/Field/InputClearButton.tsx +5 -2
  434. package/src/Field/PanelSearchInput.tsx +5 -2
  435. package/src/FieldStatus/__tests__/StatusMessage.a11y.states.ts +1 -1
  436. package/src/FileInput/FileInput.tsx +11 -2
  437. package/src/Icon/Icon.doc.mjs +7 -5
  438. package/src/Icon/Icon.spec.md +81 -40
  439. package/src/Icon/Icon.test.tsx +6 -3
  440. package/src/Icon/Icon.tsx +20 -68
  441. package/src/Icon/IconDefaultSizeContext.ts +23 -0
  442. package/src/Icon/IconSize.stylex.ts +70 -0
  443. package/src/IconButton/IconButton.doc.mjs +3 -3
  444. package/src/IconButton/IconButton.test.tsx +40 -0
  445. package/src/Item/Item.doc.mjs +6 -2
  446. package/src/Item/Item.tsx +9 -3
  447. package/src/Kbd/Kbd.doc.mjs +3 -3
  448. package/src/Kbd/Kbd.test.tsx +57 -1
  449. package/src/Kbd/Kbd.tsx +57 -37
  450. package/src/Layout/LayoutFooter.doc.mjs +17 -0
  451. package/src/Link/Link.doc.mjs +17 -4
  452. package/src/Link/Link.test.tsx +24 -0
  453. package/src/Link/Link.tsx +5 -0
  454. package/src/Link/LinkProvider.doc.mjs +2 -2
  455. package/src/Link/__tests__/Link.navigation.a11y.chromium.spec.ts +261 -0
  456. package/src/Link/useLinkComponent.test.tsx +333 -0
  457. package/src/Link/useLinkComponent.ts +29 -57
  458. package/src/List/List.doc.mjs +6 -0
  459. package/src/List/List.spec.md +200 -0
  460. package/src/List/List.test.tsx +117 -1
  461. package/src/List/List.tsx +22 -2
  462. package/src/List/ListContext.tsx +3 -1
  463. package/src/List/ListItem.doc.mjs +2 -2
  464. package/src/List/ListItem.source-build.test.mjs +41 -0
  465. package/src/List/ListItem.tsx +26 -2
  466. package/src/Markdown/Markdown.doc.mjs +300 -2
  467. package/src/Markdown/Markdown.fr23.bench.ts +174 -0
  468. package/src/Markdown/Markdown.fr23.perf.test.ts +249 -0
  469. package/src/Markdown/Markdown.fr23.sampling.ts +49 -0
  470. package/src/Markdown/Markdown.helpers.perf.test.ts +489 -0
  471. package/src/Markdown/Markdown.public.test.ts +130 -3
  472. package/src/Markdown/Markdown.renderBoundary.test.tsx +72 -0
  473. package/src/Markdown/Markdown.spec.md +210 -45
  474. package/src/Markdown/Markdown.test.tsx +87 -3
  475. package/src/Markdown/Markdown.tsx +414 -135
  476. package/src/Markdown/ast.test.ts +307 -0
  477. package/src/Markdown/ast.ts +337 -0
  478. package/src/Markdown/incremental.test.ts +43 -0
  479. package/src/Markdown/index.ts +37 -1
  480. package/src/Markdown/modules/remark.spec.md +269 -0
  481. package/src/Markdown/modules/softBreaks.spec.md +137 -0
  482. package/src/Markdown/parser/index.ts +64 -0
  483. package/src/Markdown/parser.public.test.ts +103 -0
  484. package/src/Markdown/parser.test.ts +38 -6
  485. package/src/Markdown/parser.ts +1221 -242
  486. package/src/Markdown/plugins/frontmatter.test.tsx +125 -0
  487. package/src/Markdown/plugins/frontmatter.ts +198 -0
  488. package/src/Markdown/plugins/index.ts +54 -0
  489. package/src/Markdown/plugins/protocol.test.tsx +1022 -0
  490. package/src/Markdown/plugins/protocol.ts +1618 -0
  491. package/src/Markdown/plugins/semanticFence.test.tsx +546 -0
  492. package/src/Markdown/plugins/semanticFence.ts +424 -0
  493. package/src/Markdown/plugins/softBreaks.test.tsx +172 -0
  494. package/src/Markdown/plugins/softBreaks.ts +169 -0
  495. package/src/Markdown/plugins/sourceDecoration.test.tsx +799 -0
  496. package/src/Markdown/plugins/sourceDecoration.ts +539 -0
  497. package/src/Markdown/plugins/textTransform.test.ts +467 -0
  498. package/src/Markdown/plugins/textTransform.ts +554 -0
  499. package/src/Markdown/remark.test.tsx +1877 -0
  500. package/src/Markdown/remark.ts +1574 -0
  501. package/src/Markdown/url.ts +36 -0
  502. package/src/Markdown/utils.ts +13 -1
  503. package/src/MetadataList/MetadataList.test.tsx +4 -2
  504. package/src/MetadataList/MetadataList.tsx +3 -3
  505. package/src/MultiSelector/MultiSelector.test.tsx +1 -35
  506. package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +128 -0
  507. package/src/NumberInput/NumberInput.tsx +6 -1
  508. package/src/Outline/Outline.doc.mjs +7 -5
  509. package/src/Outline/Outline.spec.md +1 -1
  510. package/src/Outline/index.ts +1 -0
  511. package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +142 -0
  512. package/src/Outline/parseOutlineFromMarkdown.ts +40 -10
  513. package/src/Outline/useOutlineFromMarkdown.ts +15 -3
  514. package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
  515. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +150 -1
  516. package/src/PowerSearch/PowerSearchEditPopover.tsx +51 -28
  517. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +51 -0
  518. package/src/PowerSearch/PowerSearchValueEditor.tsx +4 -0
  519. package/src/ProgressBar/ProgressBar.test.tsx +29 -11
  520. package/src/ProgressBar/ProgressBar.tsx +59 -72
  521. package/src/RadioList/RadioList.doc.mjs +11 -0
  522. package/src/RadioList/RadioList.test.tsx +32 -0
  523. package/src/RadioList/RadioListItem.tsx +25 -1
  524. package/src/ScrollableArea/ScrollableArea.tsx +1 -0
  525. package/src/ScrollableArea/modules/useScrollableArea.spec.md +50 -22
  526. package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
  527. package/src/SegmentedControl/SegmentedControl.test.tsx +61 -0
  528. package/src/SegmentedControl/SegmentedControl.tsx +2 -1
  529. package/src/SegmentedControl/SegmentedControlItem.tsx +6 -9
  530. package/src/Selector/Selector.doc.mjs +3 -3
  531. package/src/Selector/Selector.spec.md +51 -49
  532. package/src/Selector/Selector.test.tsx +61 -55
  533. package/src/Selector/Selector.tsx +34 -15
  534. package/src/Selector/__tests__/Listbox.a11y.chromium.spec.ts +130 -0
  535. package/src/Selector/__tests__/Listbox.a11y.dom.ts +38 -0
  536. package/src/Selector/__tests__/Listbox.a11y.inventory.test.ts +63 -0
  537. package/src/Selector/__tests__/Listbox.a11y.known-failures.ts +37 -0
  538. package/src/Selector/__tests__/Listbox.a11y.states.ts +232 -0
  539. package/src/Selector/__tests__/Selector.a11y.chromium.spec.ts +45 -0
  540. package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +121 -0
  541. package/src/SideNav/SideNav.doc.mjs +1 -1
  542. package/src/SideNav/SideNav.test.tsx +10 -0
  543. package/src/SideNav/SideNav.tsx +14 -2
  544. package/src/Slider/Slider.doc.mjs +17 -3
  545. package/src/Slider/Slider.test.tsx +221 -0
  546. package/src/Slider/Slider.tsx +40 -9
  547. package/src/Spinner/Spinner.test.tsx +4 -0
  548. package/src/Spinner/Spinner.tsx +31 -18
  549. package/src/Switch/Switch.doc.mjs +11 -0
  550. package/src/Switch/Switch.test.tsx +16 -0
  551. package/src/Switch/Switch.tsx +28 -0
  552. package/src/TabList/Tab.tsx +35 -7
  553. package/src/TabList/TabList.doc.mjs +11 -0
  554. package/src/TabList/TabList.spec.md +204 -0
  555. package/src/TabList/TabList.test.tsx +66 -0
  556. package/src/TabList/__tests__/Tabs.a11y.known-failures.ts +1 -34
  557. package/src/Table/Table.doc.mjs +1 -1
  558. package/src/Table/Table.spec.md +54 -40
  559. package/src/Table/Table.test.tsx +83 -10
  560. package/src/Table/Table.tsx +30 -22
  561. package/src/Table/__tests__/TableScroll.a11y.chromium.spec.ts +137 -0
  562. package/src/TextArea/TextArea.tsx +6 -1
  563. package/src/TextInput/TextInput.test.tsx +20 -1
  564. package/src/TextInput/TextInput.tsx +6 -1
  565. package/src/TimeInput/NativeTimeInput.test.tsx +36 -3
  566. package/src/TimeInput/Presentation.test.tsx +148 -0
  567. package/src/TimeInput/TimeInput.doc.mjs +21 -5
  568. package/src/TimeInput/TimeInput.tsx +102 -11
  569. package/src/TimeInput/TouchTimeField.tsx +572 -0
  570. package/src/TimeInput/index.ts +1 -0
  571. package/src/Timer/Timer.doc.mjs +183 -0
  572. package/src/Timer/Timer.spec.md +215 -0
  573. package/src/Timer/Timer.test.tsx +302 -0
  574. package/src/Timer/Timer.tsx +258 -0
  575. package/src/Timer/index.ts +11 -0
  576. package/src/ToggleButton/ToggleButton.doc.mjs +3 -3
  577. package/src/ToggleButton/ToggleButton.test.tsx +299 -4
  578. package/src/ToggleButton/ToggleButton.tsx +26 -33
  579. package/src/ToggleButton/ToggleButtonGroup.doc.mjs +3 -3
  580. package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +209 -0
  581. package/src/Token/Token.doc.mjs +2 -2
  582. package/src/Tokenizer/Tokenizer.spec.md +142 -75
  583. package/src/TopNav/TopNavMenu.doc.mjs +2 -2
  584. package/src/TopNav/TopNavMenu.test.tsx +30 -0
  585. package/src/TopNav/TopNavMenu.tsx +7 -2
  586. package/src/TreeList/TreeList.doc.mjs +3 -3
  587. package/src/TreeList/TreeList.spec.md +123 -75
  588. package/src/TreeList/TreeList.test.tsx +29 -0
  589. package/src/TreeList/TreeList.tsx +3 -0
  590. package/src/TreeList/TreeListItem.tsx +15 -1
  591. package/src/TreeList/TreeListTypes.ts +11 -1
  592. package/src/Typeahead/BaseTypeahead.spec.md +4 -3
  593. package/src/Typeahead/BaseTypeahead.tsx +21 -7
  594. package/src/Typeahead/Typeahead.test.tsx +53 -0
  595. package/src/__tests__/PressedState.a11y.chromium.spec.ts +813 -0
  596. package/src/__tests__/pressState.ts +93 -0
  597. package/src/hooks/scrollKeyboardDelegation.test.ts +155 -0
  598. package/src/hooks/scrollKeyboardDelegation.ts +233 -0
  599. package/src/hooks/useClickableContainer.test.tsx +236 -0
  600. package/src/hooks/useClickableContainer.ts +20 -4
  601. package/src/hooks/useScrollableArea.doc.mjs +15 -3
  602. package/src/hooks/useScrollableArea.test.tsx +59 -1
  603. package/src/hooks/useScrollableArea.ts +34 -10
  604. package/src/index.ts +3 -0
  605. package/src/inputFontFloor.test.ts +106 -0
  606. package/src/tailwind-theme.css +0 -6
  607. package/src/theme/Theme.test.tsx +32 -0
  608. package/src/theme/declarationBoundary.test.ts +126 -0
  609. package/src/theme/declarationBoundary.ts +347 -0
  610. package/src/theme/defineTheme.ts +4 -0
  611. package/src/theme/derivedVarRegistry.test.ts +7 -0
  612. package/src/theme/derivedVarRegistry.ts +1 -0
  613. package/src/theme/generateThemeRules.test.ts +526 -1
  614. package/src/theme/generateThemeRules.ts +231 -50
  615. package/src/theme/themeAdaptations.test.ts +211 -1
  616. package/src/theme/themeAdaptations.ts +50 -4
  617. package/src/theme/tokenValueCompat.test.ts +4 -1
  618. package/src/utils/inputPresentation.ts +143 -0
  619. package/src/utils/interactionOverlay.stylex.ts +20 -0
  620. package/src/utils/safeUrl.test.ts +88 -0
  621. package/src/utils/safeUrl.ts +85 -0
@@ -6,14 +6,22 @@
6
6
  * Shared logic for generating CSS rules from a resolved theme definition,
7
7
  * including one component-leaf lowering path for root, adaptation, and
8
8
  * media-surface values plus condition-correct Heading weight precedence guards.
9
+ * Built adaptation metadata resolves against the same root component defaults
10
+ * as defineTheme, so scale-only rules do not reset authored component styles.
9
11
  * Used by both the runtime path (Theme injects <style>) and the build
10
12
  * path (`astryx theme build` pre-compiles to CSS files).
11
13
  *
14
+ * Every consumer-supplied declaration is checked by declarationBoundary.ts
15
+ * before it is emitted, so a value can never end its declaration or rule
16
+ * early. A refused declaration is dropped and reported in the supplied
17
+ * warnings array (build receipts), or through `console.warn` (runtime).
18
+ *
12
19
  * Extracted from defineTheme.ts to reduce cyclomatic complexity and provide
13
20
  * a clear single-responsibility module for CSS generation.
14
21
  *
15
- * @input DefinedTheme (resolved theme object from defineTheme)
16
- * @output CSS rule strings, split by layer (component vs prose)
22
+ * @input DefinedTheme (resolved theme object from defineTheme), optional warnings array
23
+ * @output CSS rule strings, split by layer (component vs prose), and warning text
24
+ * for each dropped declaration
17
25
  * @position packages/core/src/theme/generateThemeRules.ts
18
26
  */
19
27
 
@@ -22,6 +30,7 @@ import { parseStyleKey } from "../utils/parseStyleKey.js";
22
30
  import { getDerivedVars } from "./derivedVarRegistry.js";
23
31
  import { dataTokenDefaults } from "./domainTokens/dataTokens.js";
24
32
  import { cssVar, classPrefix, dataAttrNamespace } from "../naming.js";
33
+ import { checkDeclarationName, checkDeclarationValue } from "./declarationBoundary.js";
25
34
 
26
35
  /**
27
36
  * Theme @scope selectors.
@@ -284,6 +293,77 @@ function expandContainerPadding(component, parsed, resetInheritedSpecificity = f
284
293
  return tokens;
285
294
  }
286
295
 
296
+ // =============================================================================
297
+ // Declaration assembly: a declaration always stays one declaration
298
+ // =============================================================================
299
+
300
+ const warnToConsole = message => {
301
+ console.warn(`[astryx theme] ${message}`);
302
+ };
303
+
304
+ /** Build receipts collect warning text; runtime callers warn by default. */
305
+ function diagnosticSink(warnings) {
306
+ return warnings ? message => warnings.push(message) : warnToConsole;
307
+ }
308
+
309
+ /** Shorten an authored value for a one-line message. */
310
+ function previewValue(value) {
311
+ const oneLine = JSON.stringify(value);
312
+ return oneLine.length > 80 ? `${oneLine.slice(0, 77)}..."` : oneLine;
313
+ }
314
+ function reportDrop(sink, property, value, location, reason) {
315
+ sink(`dropped "${property}" in ${location}: ${reason} (value: ${previewValue(value)})`);
316
+ }
317
+
318
+ /**
319
+ * True when `name: value;` stays exactly one declaration; otherwise reports
320
+ * the drop and returns false. Both checks follow CSS syntax, so valid CSS a
321
+ * browser keeps inside one declaration (a `data:` URI, `Gill\ Sans`, a closed
322
+ * comment, a vendor-prefixed property) is never refused; see
323
+ * declarationBoundary.ts for the rules.
324
+ */
325
+ function acceptDeclaration(property, value, location, sink) {
326
+ const reason = checkDeclarationName(property) ?? checkDeclarationValue(value);
327
+ if (reason === null) {
328
+ return true;
329
+ }
330
+ reportDrop(sink, property, value, location, reason);
331
+ return false;
332
+ }
333
+
334
+ /**
335
+ * Assemble `prop: value;` lines, dropping (and reporting) any entry whose
336
+ * property or value could not stay a single declaration. Theme definitions
337
+ * are code, but apps do assemble them from stored input (brand colors,
338
+ * white-labeling), so the generated stylesheet must never extend beyond the
339
+ * declarations it means to emit.
340
+ */
341
+ function joinDeclarations(entries, location, sink, mapProp = p => p) {
342
+ const lines = [];
343
+ for (const [rawProp, rawValue] of entries) {
344
+ // Legacy unenrolled tokens retain non-string values. Scan the same text
345
+ // interpolation has always emitted, without changing the normalized theme.
346
+ const value = `${rawValue}`;
347
+ const prop = mapProp(rawProp);
348
+ if (acceptDeclaration(prop, value, location, sink)) {
349
+ lines.push(` ${prop}: ${value};`);
350
+ }
351
+ }
352
+ return lines.join('\n');
353
+ }
354
+
355
+ /** The `:scope` token block for portable and theme-local token values. */
356
+ function tokenBlock(source, location, sink) {
357
+ 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');
358
+ const hasEntries = Object.keys(source.tokens).length > 0 || Object.keys(source.localTokens ?? {}).length > 0;
359
+ return hasEntries ? ` :scope {\n${declarations}\n }` : null;
360
+ }
361
+
362
+ /** `components.button["variant:secondary"]`-style location for a rule. */
363
+ function componentLocation(prefix, component, key) {
364
+ return `${prefix}components.${component}[${JSON.stringify(key)}]`;
365
+ }
366
+
287
367
  // =============================================================================
288
368
  // Public API
289
369
  // =============================================================================
@@ -303,9 +383,9 @@ function expandContainerPadding(component, parsed, resetInheritedSpecificity = f
303
383
  * lost for every conditional rule, with no type error to catch it.
304
384
  */
305
385
 
306
- export function generateThemeRules(theme) {
386
+ export function generateThemeRules(theme, warnings) {
307
387
  const parts = [];
308
- const tokens = theme.tokens;
388
+ const sink = diagnosticSink(warnings);
309
389
 
310
390
  // Bare prose rules reference semantic variables instead of baking the root
311
391
  // value. That lets adaptation token writes take effect through CSS alone
@@ -313,16 +393,27 @@ export function generateThemeRules(theme) {
313
393
  const val = key => `var(${key})`;
314
394
 
315
395
  // 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 }`);
396
+ const tokenRules = tokenBlock(theme, '', sink);
397
+ if (tokenRules !== null) {
398
+ parts.push(tokenRules);
399
+ }
400
+
401
+ // 1b. Base font — apply the theme's declared body font to the scope root.
402
+ // Components styled with `font-family: inherit` (SideNav items, Buttons)
403
+ // otherwise resolve against the browser default serif, since nothing else
404
+ // sets a page font. `font-family` inherits, so one rule on :scope covers
405
+ // the tree. Only emitted when the theme declares a body font, so a bare
406
+ // theme still contributes no scope rules of its own.
407
+ if (theme.tokens['--font-family-body']) {
408
+ parts.push(` :scope {\n font-family: var(--font-family-body);\n }`);
320
409
  }
321
410
 
322
411
  // 2. Component overrides: stable .astryx-* target classes combined with
323
412
  // reflected data-* selectors for visual props and runtime states.
324
413
  if (theme.components) {
325
- generateComponentRules(theme.components, parts);
414
+ generateComponentRules(theme.components, parts, {
415
+ sink
416
+ });
326
417
  }
327
418
 
328
419
  // 3. Prose HTML element rules (h1-h6, p, small, code, hr)
@@ -386,13 +477,21 @@ function generateHeadingWeightOverrides(components, parts, {
386
477
  parts.push(` ${selector} { font-weight: ${effectiveWeight}; }`);
387
478
  }
388
479
  }
480
+
481
+ /**
482
+ * The `fontWeight` a heading rule authors for `styleKey`, or undefined when
483
+ * it has none. A value that cannot stay one declaration is treated as not
484
+ * authored, so the override falls back to the inherited or token weight
485
+ * instead of interpolating it; the drop itself is reported where that same
486
+ * rule's declarations are emitted, so it is not reported twice here.
487
+ */
389
488
  function getAuthoredHeadingWeight(headingRuleMap, styleKey) {
390
489
  const rule = headingRuleMap[styleKey];
391
490
  if (rule == null || typeof rule !== 'object' || Array.isArray(rule)) {
392
491
  return undefined;
393
492
  }
394
493
  const fontWeight = rule.fontWeight;
395
- return typeof fontWeight === 'string' ? fontWeight : undefined;
494
+ return typeof fontWeight === 'string' && checkDeclarationValue(fontWeight) === null ? fontWeight : undefined;
396
495
  }
397
496
 
398
497
  /** Options shared by root, adaptation, and media-surface component lowering. */
@@ -404,7 +503,9 @@ function getAuthoredHeadingWeight(headingRuleMap, styleKey) {
404
503
  */
405
504
  function generateComponentRules(components, parts, {
406
505
  resetInheritedPaddingSpecificity = false,
407
- surface
506
+ surface,
507
+ sink = warnToConsole,
508
+ location: locationPrefix = ''
408
509
  } = {}) {
409
510
  for (const [component, rules] of Object.entries(components)) {
410
511
  for (const [key, styles] of Object.entries(rules)) {
@@ -414,6 +515,7 @@ function generateComponentRules(components, parts, {
414
515
  }
415
516
  const suffix = parseStyleKey(key);
416
517
  const baseSelector = componentSelector(component, suffix, surface);
518
+ const location = componentLocation(locationPrefix, component, key);
417
519
 
418
520
  // Separate regular properties from pseudo-class overrides
419
521
  const props = [];
@@ -421,7 +523,7 @@ function generateComponentRules(components, parts, {
421
523
  for (const [prop, value] of entries) {
422
524
  if (prop.startsWith(':') && typeof value === 'object') {
423
525
  pseudos.push([prop, value]);
424
- } else {
526
+ } else if (acceptDeclaration(toKebabCase(prop), `${value}`, location, sink)) {
425
527
  props.push([prop, value]);
426
528
  }
427
529
  }
@@ -483,7 +585,7 @@ function generateComponentRules(components, parts, {
483
585
 
484
586
  // Emit base rule
485
587
  if (finalProps.length > 0) {
486
- const declarations = finalProps.map(([prop, value]) => ` ${toKebabCase(prop)}: ${value};`).join('\n');
588
+ const declarations = joinDeclarations(finalProps, location, sink, toKebabCase);
487
589
  parts.push(` ${baseSelector} {\n${declarations}\n }`);
488
590
  }
489
591
 
@@ -491,7 +593,7 @@ function generateComponentRules(components, parts, {
491
593
  for (const [pseudo, pseudoStyles] of pseudos) {
492
594
  const pseudoEntries = Object.entries(pseudoStyles);
493
595
  if (pseudoEntries.length > 0) {
494
- const declarations = pseudoEntries.map(([prop, value]) => ` ${toKebabCase(prop)}: ${value};`).join('\n');
596
+ const declarations = joinDeclarations(pseudoEntries, `${location}[${JSON.stringify(pseudo)}]`, sink, toKebabCase);
495
597
  parts.push(` ${appendPseudoToSelectorList(baseSelector, pseudo)} {\n${declarations}\n }`);
496
598
  }
497
599
  }
@@ -629,8 +731,8 @@ function generateSizeOverrides(components, parts, surface) {
629
731
  * Component rules (tokens, stable .astryx-* targets plus data-* selectors) are
630
732
  * that need to beat StyleX — they stay in astryx-theme (above StyleX layers).
631
733
  */
632
- export function generateThemeRulesSplit(theme) {
633
- const allRules = generateThemeRules(theme);
734
+ export function generateThemeRulesSplit(theme, warnings) {
735
+ const allRules = generateThemeRules(theme, warnings);
634
736
  const prose = [];
635
737
  const component = [];
636
738
  for (const rule of allRules) {
@@ -654,19 +756,21 @@ export function generateThemeRulesSplit(theme) {
654
756
  * to media contexts — only tokens change. Themes can further customize
655
757
  * via onDark.components / onLight.components.
656
758
  */
657
- export function generateOnMediaCSS(theme) {
759
+ export function generateOnMediaCSS(theme, warnings) {
658
760
  const parts = [];
659
761
  const scopeSelector = themeScopeStart(theme.name);
762
+ const sink = diagnosticSink(warnings);
660
763
  for (const surface of ['dark', 'light']) {
661
764
  const onMedia = surface === 'dark' ? theme.__onDark : theme.__onLight;
662
765
  if (!onMedia) {
663
766
  continue;
664
767
  }
768
+ const location = surface === 'dark' ? 'onDark.' : 'onLight.';
665
769
 
666
770
  // Token overrides
667
771
  const tokenEntries = Object.entries(onMedia.tokens);
668
772
  if (tokenEntries.length > 0) {
669
- const declarations = tokenEntries.map(([prop, value]) => ` ${prop}: ${value};`).join('\n');
773
+ const declarations = joinDeclarations(tokenEntries, `${location}tokens`, sink);
670
774
  parts.push(` ${mediaSelector(surface)} {\n${declarations}\n }`);
671
775
  }
672
776
 
@@ -675,7 +779,9 @@ export function generateOnMediaCSS(theme) {
675
779
  if (onMedia.components) {
676
780
  generateComponentRules(onMedia.components, parts, {
677
781
  resetInheritedPaddingSpecificity: true,
678
- surface
782
+ surface,
783
+ sink,
784
+ location
679
785
  });
680
786
  generateColorOverrides(onMedia.components, parts, surface);
681
787
  generateSizeOverrides(onMedia.components, parts, surface);
@@ -697,16 +803,17 @@ export function generateOnMediaCSS(theme) {
697
803
  }
698
804
 
699
805
  /** Generate only the declarations one adaptation rule writes. */
700
- function generateAdaptationRuleRules(rule) {
806
+ function generateAdaptationRuleRules(rule, location, sink) {
701
807
  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 }`);
808
+ const tokens = tokenBlock(rule, location, sink);
809
+ if (tokens !== null) {
810
+ parts.push(tokens);
706
811
  }
707
812
  if (rule.components) {
708
813
  generateComponentRules(rule.components, parts, {
709
- resetInheritedPaddingSpecificity: true
814
+ resetInheritedPaddingSpecificity: true,
815
+ sink,
816
+ location
710
817
  });
711
818
  generateColorOverrides(rule.components, parts);
712
819
  generateSizeOverrides(rule.components, parts);
@@ -730,12 +837,13 @@ function generateAdaptationMediaBlock(query, parts, scopeSelector) {
730
837
  * rule. Bare prose follows semantic variables, so token writes need no duplicate
731
838
  * prose selectors here.
732
839
  */
733
- export function generateAdaptationCSS(theme) {
840
+ export function generateAdaptationCSS(theme, warnings) {
841
+ const sink = diagnosticSink(warnings);
734
842
  // Built themes can reach this compiler without passing through defineTheme.
735
843
  // Validate retained metadata even when it has no rules (and therefore emits
736
844
  // no CSS): width points remain observable through AppShell and inheritance.
737
845
  const normalizedAdaptations = theme.__adaptations === undefined ? undefined : normalizeThemeAdaptations(theme.name, theme.__adaptations, undefined);
738
- const rules = theme.__adaptationRules ?? (normalizedAdaptations ? resolveThemeAdaptationRules(theme.name, normalizedAdaptations, theme.__axes ?? {}, theme.tokens, theme.localTokens) : undefined);
846
+ const rules = theme.__adaptationRules ?? (normalizedAdaptations ? resolveThemeAdaptationRules(theme.name, normalizedAdaptations, theme.__axes ?? {}, theme.tokens, theme.localTokens, theme.components) : undefined);
739
847
  if (!rules || rules.length === 0) {
740
848
  return {
741
849
  prose: '',
@@ -751,8 +859,8 @@ export function generateAdaptationCSS(theme) {
751
859
  // active whenever the later condition matches, even if the earlier condition
752
860
  // does not. Pairwise merging cannot repair that: multiple mutually exclusive
753
861
  // earlier rules can each overlap one broad later rule.
754
- for (const rule of rules) {
755
- const parts = generateAdaptationRuleRules(rule);
862
+ for (const [index, rule] of rules.entries()) {
863
+ const parts = generateAdaptationRuleRules(rule, `adaptations[${index}].`, sink);
756
864
  if (parts.length === 0) {
757
865
  continue;
758
866
  }
@@ -787,9 +895,9 @@ export function generateAdaptationCSS(theme) {
787
895
  };
788
896
  }
789
897
 
790
- /** Indent a generated rule one level further, for nesting inside `@media`. */
898
+ /** Indent the rule start without rewriting newlines inside authored values. */
791
899
  function indentRule(rule) {
792
- return rule.split('\n').map(line => line.length > 0 ? ` ${line}` : line).join('\n');
900
+ return ` ${rule}`;
793
901
  }
794
902
 
795
903
  /**
@@ -828,11 +936,11 @@ export function generateDataTokenDefaultsCSS() {
828
936
  * The theme-independent `--color-data-*` defaults are not part of this output:
829
937
  * see `generateDataTokenDefaultsCSS`.
830
938
  */
831
- export function generateThemeCSS(theme) {
939
+ export function generateThemeCSS(theme, warnings) {
832
940
  const {
833
941
  component,
834
942
  prose
835
- } = generateThemeRulesSplit(theme);
943
+ } = generateThemeRulesSplit(theme, warnings);
836
944
  const scopeSelector = themeScopeStart(theme.name);
837
945
  const scopeTo = THEME_SCOPE_TO;
838
946
  let proseCss = '';
@@ -851,11 +959,11 @@ export function generateThemeCSS(theme) {
851
959
 
852
960
  // Adaptations follow the root theme in authored order. Media-surface rules
853
961
  // follow adaptations so onDark/onLight keep their specified precedence.
854
- const adaptationCss = generateAdaptationCSS(theme);
962
+ const adaptationCss = generateAdaptationCSS(theme, warnings);
855
963
  if (adaptationCss.component) {
856
964
  componentCss = componentCss ? `${componentCss}\n\n${adaptationCss.component}` : adaptationCss.component;
857
965
  }
858
- const onMediaCss = generateOnMediaCSS(theme);
966
+ const onMediaCss = generateOnMediaCSS(theme, warnings);
859
967
  if (onMediaCss) {
860
968
  componentCss = componentCss ? `${componentCss}\n\n${onMediaCss}` : onMediaCss;
861
969
  }
@@ -7,8 +7,10 @@
7
7
  * Adaptations are deliberately closed and ordered. Width points are fixed names,
8
8
  * sparse rules and reserved token routing are rejected during normalization,
9
9
  * condition fields are ANDed, and rule order is the precedence model: every
10
- * matching rule writes after the root theme and later matching writes win. Token
11
- * cycles are judged only after each reachable ordered cascade is complete.
10
+ * matching rule writes after the root theme and later matching writes win.
11
+ * Invariant type-scale component defaults already declared at root are omitted;
12
+ * authored rule leaves and generated token writes retain their cascade order.
13
+ * Token cycles are judged after each reachable ordered cascade is complete.
12
14
  *
13
15
  * SYNC: When modified, update:
14
16
  * - /packages/core/src/theme/defineTheme.ts (`DefineThemeInput.adaptations`)
@@ -123,5 +125,5 @@ export declare function normalizeThemeAdaptations(themeName: string, inherited:
123
125
  */
124
126
  export declare function resolveThemeGenerativeAxes(inherited: ThemeGenerativeAxes | undefined, own: ThemeGenerativeAxes): ThemeGenerativeAxes;
125
127
  /** Lower ordered normalized rules to concrete CSS writes. */
126
- export declare function resolveThemeAdaptationRules(themeName: string, adaptations: NormalizedThemeAdaptations, axes: ThemeGenerativeAxes, rootTokens: Record<string, string>, rootLocalTokens: Record<string, string> | undefined): ResolvedThemeAdaptationRule[] | undefined;
128
+ export declare function resolveThemeAdaptationRules(themeName: string, adaptations: NormalizedThemeAdaptations, axes: ThemeGenerativeAxes, rootTokens: Record<string, string>, rootLocalTokens: Record<string, string> | undefined, rootComponents?: ComponentStyleMap): ResolvedThemeAdaptationRule[] | undefined;
127
129
  //# sourceMappingURL=themeAdaptations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"themeAdaptations.d.ts","sourceRoot":"","sources":["../../src/theme/themeAdaptations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"themeAdaptations.d.ts","sourceRoot":"","sources":["../../src/theme/themeAdaptations.ts"],"names":[],"mappings":"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"}
@@ -9,8 +9,10 @@
9
9
  * Adaptations are deliberately closed and ordered. Width points are fixed names,
10
10
  * sparse rules and reserved token routing are rejected during normalization,
11
11
  * condition fields are ANDed, and rule order is the precedence model: every
12
- * matching rule writes after the root theme and later matching writes win. Token
13
- * cycles are judged only after each reachable ordered cascade is complete.
12
+ * matching rule writes after the root theme and later matching writes win.
13
+ * Invariant type-scale component defaults already declared at root are omitted;
14
+ * authored rule leaves and generated token writes retain their cascade order.
15
+ * Token cycles are judged after each reachable ordered cascade is complete.
14
16
  *
15
17
  * SYNC: When modified, update:
16
18
  * - /packages/core/src/theme/defineTheme.ts (`DefineThemeInput.adaptations`)
@@ -572,13 +574,39 @@ export function resolveThemeGenerativeAxes(inherited, own) {
572
574
  };
573
575
  }
574
576
 
577
+ /**
578
+ * Type-scale component generation is invariant var() wiring, not scale values.
579
+ * Keep root declarations (including authored pins) in the root cascade instead
580
+ * of resetting them in a rule that only changes tokens. Fill missing root paths
581
+ * for rule-only scales, and retain every authored rule leaf, even when it equals
582
+ * the root: that write may intentionally undo an earlier matching rule.
583
+ *
584
+ * SYNC: expandTypeScale.ts (generateTypeScaleComponents)
585
+ */
586
+ function omitRootTypeScaleDefaults(resolved, root, authored) {
587
+ if (!resolved || !root) {
588
+ return resolved;
589
+ }
590
+ const components = {};
591
+ for (const [component, rules] of Object.entries(resolved)) {
592
+ for (const [key, styles] of Object.entries(rules)) {
593
+ const writes = Object.fromEntries(Object.entries(styles).filter(([property]) => root[component]?.[key]?.[property] === undefined || Object.hasOwn(authored?.[component]?.[key] ?? {}, property)));
594
+ if (Object.keys(writes).length > 0) {
595
+ (components[component] ??= {})[key] = writes;
596
+ }
597
+ }
598
+ }
599
+ return Object.keys(components).length > 0 ? components : undefined;
600
+ }
601
+
575
602
  /** Lower ordered normalized rules to concrete CSS writes. */
576
- export function resolveThemeAdaptationRules(themeName, adaptations, axes, rootTokens, rootLocalTokens) {
603
+ export function resolveThemeAdaptationRules(themeName, adaptations, axes, rootTokens, rootLocalTokens, rootComponents) {
577
604
  if (adaptations.rules.length === 0) {
578
605
  return undefined;
579
606
  }
580
607
  const resolvedRules = adaptations.rules.map((rule, index) => {
581
- const resolved = resolveThemeValues(valueToThemeInput(themeName, index, rule.value, axes), undefined,
608
+ const input = valueToThemeInput(themeName, index, rule.value, axes);
609
+ const resolved = resolveThemeValues(input, undefined,
582
610
  // Authored adaptation values are a new surface with no legacy
583
611
  // acceptance to preserve, so a malformed token is rejected here rather
584
612
  // than emitted. The root path stays lenient for compatibility.
@@ -603,7 +631,7 @@ export function resolveThemeAdaptationRules(themeName, adaptations, axes, rootTo
603
631
  query: mediaQueryForCondition(themeName, index, rule.when, adaptations.widthBreakpoints),
604
632
  tokens: resolved.tokens,
605
633
  localTokens,
606
- components: resolved.components
634
+ components: input.typography?.scale ? omitRootTypeScaleDefaults(resolved.components, rootComponents, rule.value.components) : resolved.components
607
635
  };
608
636
  });
609
637
  assertNoReachableTokenCycles(themeName, adaptations.widthBreakpoints, rootTokens, rootLocalTokens, resolvedRules);
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @file inputPresentation.ts
3
+ * @input A presentation policy, the deprecated nativePicker value, and pointer type
4
+ * @output The resolved picker surface for DateInput, DateTimeInput, and TimeInput
5
+ * @position Shared presentation vocabulary owned by spec:AST-043
6
+ *
7
+ * SYNC: When modified, update these files to stay in sync:
8
+ * - /docs/specs/AST-043-input-presentation/spec.md (FR1–FR3 tables)
9
+ * - /packages/core/src/DateInput/DateInput.tsx
10
+ * - /packages/core/src/DateTimeInput/DateTimeInput.tsx
11
+ * - /packages/core/src/TimeInput/TimeInput.tsx
12
+ */
13
+ /** Picker-surface policy for date/time inputs (`spec:AST-043` FR1). */
14
+ export type InputPresentation = 'text-input' | 'popover' | 'bottom-sheet' | 'native' | 'adaptive-bottom-sheet' | 'adaptive-native';
15
+ /** `presentation` for components without a text-only surface: all except `TimeInput` exclude `text-input` (AST-043). */
16
+ export type PickerPresentation = Exclude<InputPresentation, 'text-input'>;
17
+ /** The surface a resolved `InputPresentation` actually renders. */
18
+ export type InputPresentationSurface = 'text-input' | 'desktop' | 'sheet' | 'native';
19
+ /** The surface a resolved `PickerPresentation` renders: one where a picker opens. */
20
+ export type PickerPresentationSurface = Exclude<InputPresentationSurface, 'text-input'>;
21
+ /** Deprecated picker policy (`spec:AST-043` FR3). */
22
+ export type LegacyNativePicker = 'touch' | 'always' | 'never';
23
+ /**
24
+ * Typed as the narrower policy because the default opens a picker for every
25
+ * component; it is still a valid `InputPresentation`.
26
+ */
27
+ export declare const DEFAULT_INPUT_PRESENTATION: PickerPresentation;
28
+ /**
29
+ * Map a deprecated `nativePicker` value to its `presentation` equivalent for
30
+ * a component whose every surface opens a picker (`DateInput`,
31
+ * `DateTimeInput`). Their released `never` was Astryx's own pickers on every
32
+ * pointer, so no value maps to `text-input` — which is what lets the return
33
+ * type exclude it.
34
+ */
35
+ export declare function pickerPresentationFromNativePicker(nativePicker: LegacyNativePicker): PickerPresentation;
36
+ /**
37
+ * Map a deprecated `nativePicker` value to its `presentation` equivalent.
38
+ * `TimeInput` differs: its released `never` is the typed field on every
39
+ * pointer, so it maps to `text-input`, not a sheet policy.
40
+ */
41
+ export declare function presentationFromNativePicker(nativePicker: LegacyNativePicker, component: 'date' | 'time'): InputPresentation;
42
+ /**
43
+ * The effective picker-only policy: explicit `presentation` wins over the
44
+ * deprecated prop. The narrow twin of {@link effectiveInputPresentation} for
45
+ * `DateInput` and `DateTimeInput`, whose `presentation` cannot be
46
+ * `text-input`.
47
+ */
48
+ export declare function effectivePickerPresentation(presentation: PickerPresentation | undefined, nativePicker: LegacyNativePicker | undefined): PickerPresentation;
49
+ /** The effective policy: explicit `presentation` wins over the deprecated prop. */
50
+ export declare function effectiveInputPresentation(presentation: InputPresentation | undefined, nativePicker: LegacyNativePicker | undefined, component: 'date' | 'time'): InputPresentation;
51
+ /** Resolve a picker-only policy to the surface rendered for the current pointer. */
52
+ export declare function resolvePickerPresentation(presentation: PickerPresentation, isCoarsePointer: boolean): PickerPresentationSurface;
53
+ /** Resolve a policy to the surface rendered for the current pointer. */
54
+ export declare function resolveInputPresentation(presentation: InputPresentation, isCoarsePointer: boolean): InputPresentationSurface;
55
+ //# sourceMappingURL=inputPresentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputPresentation.d.ts","sourceRoot":"","sources":["../../src/utils/inputPresentation.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,uEAAuE;AACvE,MAAM,MAAM,iBAAiB,GACzB,YAAY,GACZ,SAAS,GACT,cAAc,GACd,QAAQ,GACR,uBAAuB,GACvB,iBAAiB,CAAC;AAEtB,wHAAwH;AACxH,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;AAE1E,mEAAmE;AACnE,MAAM,MAAM,wBAAwB,GAClC,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhD,qFAAqF;AACrF,MAAM,MAAM,yBAAyB,GAAG,OAAO,CAC7C,wBAAwB,EACxB,YAAY,CACb,CAAC;AAEF,qDAAqD;AACrD,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE9D;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,kBAAsC,CAAC;AAEhF;;;;;;GAMG;AACH,wBAAgB,kCAAkC,CAChD,YAAY,EAAE,kBAAkB,GAC/B,kBAAkB,CASpB;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,YAAY,EAAE,kBAAkB,EAChC,SAAS,EAAE,MAAM,GAAG,MAAM,GACzB,iBAAiB,CAKnB;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,kBAAkB,GAAG,SAAS,EAC5C,YAAY,EAAE,kBAAkB,GAAG,SAAS,GAC3C,kBAAkB,CAQpB;AAED,mFAAmF;AACnF,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,iBAAiB,GAAG,SAAS,EAC3C,YAAY,EAAE,kBAAkB,GAAG,SAAS,EAC5C,SAAS,EAAE,MAAM,GAAG,MAAM,GACzB,iBAAiB,CAQnB;AAED,oFAAoF;AACpF,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,kBAAkB,EAChC,eAAe,EAAE,OAAO,GACvB,yBAAyB,CAa3B;AAED,wEAAwE;AACxE,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,iBAAiB,EAC/B,eAAe,EAAE,OAAO,GACvB,wBAAwB,CAI1B"}
@@ -0,0 +1,108 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file inputPresentation.ts
5
+ * @input A presentation policy, the deprecated nativePicker value, and pointer type
6
+ * @output The resolved picker surface for DateInput, DateTimeInput, and TimeInput
7
+ * @position Shared presentation vocabulary owned by spec:AST-043
8
+ *
9
+ * SYNC: When modified, update these files to stay in sync:
10
+ * - /docs/specs/AST-043-input-presentation/spec.md (FR1–FR3 tables)
11
+ * - /packages/core/src/DateInput/DateInput.tsx
12
+ * - /packages/core/src/DateTimeInput/DateTimeInput.tsx
13
+ * - /packages/core/src/TimeInput/TimeInput.tsx
14
+ */
15
+
16
+ /** Picker-surface policy for date/time inputs (`spec:AST-043` FR1). */
17
+
18
+ /** `presentation` for components without a text-only surface: all except `TimeInput` exclude `text-input` (AST-043). */
19
+
20
+ /** The surface a resolved `InputPresentation` actually renders. */
21
+
22
+ /** The surface a resolved `PickerPresentation` renders: one where a picker opens. */
23
+
24
+ /** Deprecated picker policy (`spec:AST-043` FR3). */
25
+
26
+ /**
27
+ * Typed as the narrower policy because the default opens a picker for every
28
+ * component; it is still a valid `InputPresentation`.
29
+ */
30
+ export const DEFAULT_INPUT_PRESENTATION = 'adaptive-native';
31
+
32
+ /**
33
+ * Map a deprecated `nativePicker` value to its `presentation` equivalent for
34
+ * a component whose every surface opens a picker (`DateInput`,
35
+ * `DateTimeInput`). Their released `never` was Astryx's own pickers on every
36
+ * pointer, so no value maps to `text-input` — which is what lets the return
37
+ * type exclude it.
38
+ */
39
+ export function pickerPresentationFromNativePicker(nativePicker) {
40
+ switch (nativePicker) {
41
+ case 'touch':
42
+ return 'adaptive-native';
43
+ case 'always':
44
+ return 'native';
45
+ case 'never':
46
+ return 'adaptive-bottom-sheet';
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Map a deprecated `nativePicker` value to its `presentation` equivalent.
52
+ * `TimeInput` differs: its released `never` is the typed field on every
53
+ * pointer, so it maps to `text-input`, not a sheet policy.
54
+ */
55
+ export function presentationFromNativePicker(nativePicker, component) {
56
+ if (component === 'time' && nativePicker === 'never') {
57
+ return 'text-input';
58
+ }
59
+ return pickerPresentationFromNativePicker(nativePicker);
60
+ }
61
+
62
+ /**
63
+ * The effective picker-only policy: explicit `presentation` wins over the
64
+ * deprecated prop. The narrow twin of {@link effectiveInputPresentation} for
65
+ * `DateInput` and `DateTimeInput`, whose `presentation` cannot be
66
+ * `text-input`.
67
+ */
68
+ export function effectivePickerPresentation(presentation, nativePicker) {
69
+ if (presentation !== undefined) {
70
+ return presentation;
71
+ }
72
+ if (nativePicker !== undefined) {
73
+ return pickerPresentationFromNativePicker(nativePicker);
74
+ }
75
+ return DEFAULT_INPUT_PRESENTATION;
76
+ }
77
+
78
+ /** The effective policy: explicit `presentation` wins over the deprecated prop. */
79
+ export function effectiveInputPresentation(presentation, nativePicker, component) {
80
+ if (presentation !== undefined) {
81
+ return presentation;
82
+ }
83
+ if (nativePicker !== undefined) {
84
+ return presentationFromNativePicker(nativePicker, component);
85
+ }
86
+ return DEFAULT_INPUT_PRESENTATION;
87
+ }
88
+
89
+ /** Resolve a picker-only policy to the surface rendered for the current pointer. */
90
+ export function resolvePickerPresentation(presentation, isCoarsePointer) {
91
+ switch (presentation) {
92
+ case 'popover':
93
+ return 'desktop';
94
+ case 'bottom-sheet':
95
+ return 'sheet';
96
+ case 'native':
97
+ return 'native';
98
+ case 'adaptive-bottom-sheet':
99
+ return isCoarsePointer ? 'sheet' : 'desktop';
100
+ case 'adaptive-native':
101
+ return isCoarsePointer ? 'native' : 'desktop';
102
+ }
103
+ }
104
+
105
+ /** Resolve a policy to the surface rendered for the current pointer. */
106
+ export function resolveInputPresentation(presentation, isCoarsePointer) {
107
+ return presentation === 'text-input' ? 'text-input' : resolvePickerPresentation(presentation, isCoarsePointer);
108
+ }
@@ -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"}