@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
@@ -102,12 +102,22 @@ import {useHighlightedOptionScroll} from '../hooks/useHighlightedOptionScroll';
102
102
  import {NativeDateSegment} from './NativeDateSegment';
103
103
  import {NativeTimeSegment} from './NativeTimeSegment';
104
104
  import {TouchDateTimeField} from './TouchDateTimeField';
105
+ import {
106
+ effectivePickerPresentation,
107
+ resolvePickerPresentation,
108
+ type PickerPresentation,
109
+ } from '../utils/inputPresentation';
110
+ import {useDevWarning} from '../hooks/useDevWarning';
105
111
  export type ISODateTimeString = string & {
106
112
  readonly __brand: 'ISODateTimeString';
107
113
  };
108
114
 
115
+ /** @deprecated Use {@link DateTimeInputPresentation} via the `presentation` prop. */
109
116
  export type DateTimeInputNativePicker = 'touch' | 'always' | 'never';
110
117
 
118
+ /** Which surfaces collect the date and time (`spec:AST-043` FR1; no `text-input` — TimeInput-only). */
119
+ export type DateTimeInputPresentation = PickerPresentation;
120
+
111
121
  export type DateTimeInputHourFormat = '12h' | '24h';
112
122
 
113
123
  export type DateTimeInputSize = 'sm' | 'md' | 'lg';
@@ -173,9 +183,14 @@ const styles = stylex.create({
173
183
  borderStyle: 'none',
174
184
  padding: 0,
175
185
  fontFamily: typographyVars['--font-family-body'],
186
+ // The 16px floor is iOS-only: iOS Safari zooms the page when a focused
187
+ // control sits under 16px, and only iOS WebKit implements
188
+ // -webkit-touch-callout to key the coarse-pointer floor to it.
176
189
  fontSize: {
177
190
  default: typeScaleVars['--text-body-size'],
178
- '@media (pointer: coarse)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
191
+ '@media (pointer: coarse)': {
192
+ '@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
193
+ },
179
194
  },
180
195
  lineHeight: typeScaleVars['--text-body-leading'],
181
196
  color: colorVars['--color-text-primary'],
@@ -496,17 +511,32 @@ export interface DateTimeInputProps extends Omit<
496
511
  * user's locale.
497
512
  *
498
513
  * @default 'touch'
499
- * @example
500
- * ```
501
- * <DateTimeInput
502
- * label="Event time"
503
- * value={dateTime}
504
- * onChange={setDateTime}
505
- * nativePicker="never"
506
- * />
507
- * ```
514
+ * @deprecated Use `presentation` (`spec:AST-043` FR3):
515
+ * `'touch'` → `'adaptive-native'`, `'always'` → `'native'`,
516
+ * `'never'` → `'adaptive-bottom-sheet'`. Still works exactly as released;
517
+ * `presentation` wins when both are set.
508
518
  */
509
519
  nativePicker?: DateTimeInputNativePicker;
520
+
521
+ /**
522
+ * Which surfaces collect the date and time (`spec:AST-043` FR1). Every
523
+ * value opens pickers; the typed-fields-only `'text-input'` belongs to
524
+ * `TimeInput`.
525
+ *
526
+ * - `'popover'`: Astryx's typed fields + popovers on every pointer
527
+ * - `'bottom-sheet'`: Astryx's bottom-sheet date/time wheels on every pointer
528
+ * - `'native'`: browser/OS date and time pickers on every pointer, with no
529
+ * Astryx fallback (FR2)
530
+ * - `'adaptive-bottom-sheet'`: popovers on a fine pointer, bottom sheet on
531
+ * a coarse pointer
532
+ * - `'adaptive-native'` (default): popovers on a fine pointer, browser/OS
533
+ * pickers on a coarse pointer, keeping the released per-segment Astryx
534
+ * fallbacks (seconds, non-default `timeIncrement`, `timeOptionInterval`)
535
+ * where a native control cannot express the value (FR2)
536
+ *
537
+ * @default 'adaptive-native'
538
+ */
539
+ presentation?: DateTimeInputPresentation;
510
540
  }
511
541
 
512
542
  function splitDateTime(dt: ISODateTimeString | undefined): {
@@ -588,27 +618,30 @@ function PointerDateTimeField({
588
618
  labelTooltip,
589
619
  numberOfMonths = 1,
590
620
  weekStartsOn,
591
- nativePicker = 'touch',
592
621
  width,
593
622
  xstyle,
594
623
  className,
595
624
  style,
596
625
  ref,
626
+ nativeMode = 'off',
597
627
  ...rest
598
- }: DateTimeInputProps) {
628
+ }: DateTimeInputProps & {
629
+ nativeMode?: 'off' | 'adaptive' | 'forced' | 'legacy';
630
+ }) {
599
631
  const t = useTranslator();
600
632
  const locale = useLocale();
601
- const isTouch = useMediaQuery(TOUCH_POINTER_QUERY);
602
- const usesNativePicker =
603
- nativePicker === 'always' || (nativePicker === 'touch' && isTouch);
633
+ const usesNativePicker = nativeMode !== 'off';
634
+ // `forced` (`presentation="native"`, FR2): no Astryx fallback. `adaptive`
635
+ // (`adaptive-native` coarse) and `legacy` (deprecated `always`):
604
636
  // iOS's native time picker has no seconds wheel, treats step as validation
605
- // rather than picker cadence, and cannot express our preset-time list. Keep
606
- // the Astryx time field for those explicit contracts instead of losing them.
637
+ // rather than picker cadence, and cannot express our preset-time list, so
638
+ // those keep the Astryx time field — exactly as released.
607
639
  const usesNativeTimePicker =
608
- usesNativePicker &&
609
- !hasSeconds &&
610
- timeIncrement === 1 &&
611
- timeOptionInterval === undefined;
640
+ nativeMode === 'forced' ||
641
+ ((nativeMode === 'adaptive' || nativeMode === 'legacy') &&
642
+ !hasSeconds &&
643
+ timeIncrement === 1 &&
644
+ timeOptionInterval === undefined);
612
645
  const isEffectivelyRequired = useResolvedRequired({isRequired, isOptional});
613
646
  // Speaks arrow-key stepping results through the persistent live regions:
614
647
  // stepping programmatically rewrites a plain textbox's value, which screen
@@ -1915,25 +1948,48 @@ function PointerDateTimeField({
1915
1948
  PointerDateTimeField.displayName = 'PointerDateTimeField';
1916
1949
 
1917
1950
  /**
1918
- * A combined date and time picker whose `nativePicker` prop chooses both
1919
- * surfaces. Native modes use OS-owned date and time controls in Astryx field
1920
- * chrome. With `nativePicker="never"`, fine pointers keep the typed fields and
1921
- * popovers while coarse pointers get Astryx's coordinated Date/Time bottom
1922
- * sheet.
1951
+ * A combined date and time picker whose `presentation` prop chooses both
1952
+ * surfaces (`spec:AST-043`). Native modes use OS-owned date and time controls
1953
+ * in Astryx field chrome; the deprecated `nativePicker` maps to the same
1954
+ * surfaces (FR3).
1923
1955
  */
1924
- export function DateTimeInput({
1925
- nativePicker = 'touch',
1926
- ...props
1927
- }: DateTimeInputProps) {
1956
+ export function DateTimeInput(props: DateTimeInputProps) {
1928
1957
  const isTouch = useMediaQuery(TOUCH_POINTER_QUERY);
1929
- const usesNativePicker =
1930
- nativePicker === 'always' || (nativePicker === 'touch' && isTouch);
1931
-
1932
- return usesNativePicker || !isTouch ? (
1933
- <PointerDateTimeField {...props} nativePicker={nativePicker} />
1934
- ) : (
1935
- <TouchDateTimeField {...props} />
1958
+ useDevWarning(
1959
+ 'DateTimeInput',
1960
+ '`nativePicker` is deprecated; use `presentation` instead (`touch` → `adaptive-native`, `always` → `native`, `never` → `adaptive-bottom-sheet`). `presentation` wins when both are set.',
1961
+ props.nativePicker !== undefined,
1962
+ );
1963
+ const effective = effectivePickerPresentation(
1964
+ props.presentation,
1965
+ props.nativePicker,
1936
1966
  );
1967
+ const {
1968
+ presentation: _presentation,
1969
+ nativePicker: _nativePicker,
1970
+ ...rest
1971
+ } = props;
1972
+ if (effective === 'native') {
1973
+ return (
1974
+ <PointerDateTimeField
1975
+ {...rest}
1976
+ nativeMode={
1977
+ props.presentation === undefined && props.nativePicker === 'always'
1978
+ ? 'legacy'
1979
+ : 'forced'
1980
+ }
1981
+ />
1982
+ );
1983
+ }
1984
+ switch (resolvePickerPresentation(effective, isTouch)) {
1985
+ case 'native':
1986
+ // Only `adaptive-native` on a coarse pointer resolves here (FR2).
1987
+ return <PointerDateTimeField {...rest} nativeMode="adaptive" />;
1988
+ case 'sheet':
1989
+ return <TouchDateTimeField {...rest} />;
1990
+ case 'desktop':
1991
+ return <PointerDateTimeField {...rest} />;
1992
+ }
1937
1993
  }
1938
1994
 
1939
1995
  DateTimeInput.displayName = 'DateTimeInput';
@@ -0,0 +1,89 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Presentation.test.tsx
5
+ * @input Uses vitest, Testing Library, and DateTimeInput
6
+ * @output Tests for the `presentation` prop (`spec:AST-043` FR1–FR4)
7
+ * @position Testing; covers surface resolution and precedence
8
+ */
9
+
10
+ import {afterEach, describe, expect, it, vi} from 'vitest';
11
+ import {render} from '@testing-library/react';
12
+ import {DateTimeInput} from './DateTimeInput';
13
+ import {resetDateSegmentProbe} from '../DateInput/nativeDateSegments';
14
+
15
+ const HOVER_CAPABLE = /\(\s*hover\s*:\s*hover\s*\)/;
16
+
17
+ class MockResizeObserver {
18
+ observe() {}
19
+ unobserve() {}
20
+ disconnect() {}
21
+ }
22
+
23
+ function stubPointer(isCoarse: boolean): void {
24
+ vi.stubGlobal('matchMedia', (query: string) => ({
25
+ matches: /pointer:\s*coarse/.test(query)
26
+ ? isCoarse
27
+ : /pointer:\s*fine/.test(query)
28
+ ? !isCoarse
29
+ : HOVER_CAPABLE.test(query),
30
+ media: query,
31
+ onchange: null,
32
+ addListener: () => {},
33
+ removeListener: () => {},
34
+ addEventListener: () => {},
35
+ removeEventListener: () => {},
36
+ dispatchEvent: () => false,
37
+ }));
38
+ vi.stubGlobal('ResizeObserver', MockResizeObserver);
39
+ }
40
+
41
+ afterEach(() => {
42
+ vi.unstubAllGlobals();
43
+ vi.restoreAllMocks();
44
+ resetDateSegmentProbe();
45
+ });
46
+
47
+ describe('DateTimeInput presentation', () => {
48
+ it('native forces native date and time segments on a fine pointer', () => {
49
+ stubPointer(false);
50
+ render(
51
+ <DateTimeInput label="Event" presentation="native" onChange={() => {}} />,
52
+ );
53
+ expect(document.querySelector('input[type="date"]')).not.toBeNull();
54
+ expect(document.querySelector('input[type="time"]')).not.toBeNull();
55
+ });
56
+
57
+ it('bottom-sheet forces the sheet field on a fine pointer', () => {
58
+ stubPointer(false);
59
+ render(
60
+ <DateTimeInput
61
+ label="Event"
62
+ presentation="bottom-sheet"
63
+ onChange={() => {}}
64
+ />,
65
+ );
66
+ for (const input of document.querySelectorAll('input[readonly]')) {
67
+ expect(input).toBeInTheDocument();
68
+ }
69
+ expect(document.querySelector('input[type="date"]')).toBeNull();
70
+ expect(document.querySelectorAll('input[readonly]').length).toBe(2);
71
+ });
72
+
73
+ it('presentation wins over nativePicker (FR4)', () => {
74
+ stubPointer(false);
75
+ render(
76
+ <DateTimeInput
77
+ label="Event"
78
+ presentation="bottom-sheet"
79
+ nativePicker="always"
80
+ onChange={() => {}}
81
+ />,
82
+ );
83
+ // A sheet on a fine pointer can only come from `presentation`: the
84
+ // deprecated `always` alone would have rendered both native controls.
85
+ expect(document.querySelector('input[type="date"]')).toBeNull();
86
+ expect(document.querySelector('input[type="time"]')).toBeNull();
87
+ expect(document.querySelectorAll('input[readonly]').length).toBe(2);
88
+ });
89
+ });
@@ -182,9 +182,14 @@ const styles = stylex.create({
182
182
  borderStyle: 'none',
183
183
  padding: 0,
184
184
  fontFamily: typographyVars['--font-family-body'],
185
+ // The 16px floor is iOS-only: iOS Safari zooms the page when a focused
186
+ // control sits under 16px, and only iOS WebKit implements
187
+ // -webkit-touch-callout to key the coarse-pointer floor to it.
185
188
  fontSize: {
186
189
  default: typeScaleVars['--text-body-size'],
187
- '@media (pointer: coarse)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
190
+ '@media (pointer: coarse)': {
191
+ '@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
192
+ },
188
193
  },
189
194
  lineHeight: typeScaleVars['--text-body-leading'],
190
195
  color: colorVars['--color-text-primary'],
@@ -15,6 +15,7 @@ export type {
15
15
  DateTimeInputSize,
16
16
  DateTimeInputHourFormat,
17
17
  DateTimeInputNativePicker,
18
+ DateTimeInputPresentation,
18
19
  DateTimeInputTimeIncrement,
19
20
  DateTimeInputTimeOptionInterval,
20
21
  DateTimeInputStatus,
@@ -42,21 +42,34 @@ export const nativePickerSegmentStyles = stylex.create({
42
42
  borderStyle: 'none',
43
43
  padding: 0,
44
44
  fontFamily: typographyVars['--font-family-body'],
45
- // Below 16px iOS zooms the page when the field takes focus.
45
+ // Below 16px iOS zooms the page when the field takes focus. Only iOS
46
+ // WebKit implements -webkit-touch-callout, so the coarse-pointer floor is
47
+ // keyed to iOS alone.
46
48
  fontSize: {
47
49
  default: typeScaleVars['--text-body-size'],
48
- '@media (pointer: coarse)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
50
+ '@media (pointer: coarse)': {
51
+ '@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
52
+ },
49
53
  },
50
54
  lineHeight: typeScaleVars['--text-body-leading'],
51
55
  color: colorVars['--color-text-primary'],
52
56
  backgroundColor: 'transparent',
53
57
  outline: 'none',
54
58
  // Native date/time controls size from their internal edit fields. Pin the
55
- // box to one text line so both segments stay aligned.
56
- height: stylex.firstThatWorks(
57
- '1lh',
58
- `calc(max(1rem, ${typeScaleVars['--text-body-size']}) * ${typeScaleVars['--text-body-leading']})`,
59
- ),
59
+ // box to one text line so both segments stay aligned. The calc fallback
60
+ // mirrors the iOS-only floor above; browsers with `1lh` track it for free.
61
+ height: {
62
+ default: stylex.firstThatWorks(
63
+ '1lh',
64
+ `calc(${typeScaleVars['--text-body-size']} * ${typeScaleVars['--text-body-leading']})`,
65
+ ),
66
+ '@media (pointer: coarse)': {
67
+ '@supports (-webkit-touch-callout: none)': stylex.firstThatWorks(
68
+ '1lh',
69
+ `calc(max(1rem, ${typeScaleVars['--text-body-size']}) * ${typeScaleVars['--text-body-leading']})`,
70
+ ),
71
+ },
72
+ },
60
73
  WebkitAppearance: 'none',
61
74
  appearance: 'none',
62
75
  // DateTimeInput renders its own calendar/clock affordances.
@@ -101,9 +114,12 @@ export const nativePickerSegmentStyles = stylex.create({
101
114
  insetInlineEnd: 0,
102
115
  insetBlock: 0,
103
116
  display: 'block',
117
+ // The same iOS-only floor as the input it covers, shared baselines.
104
118
  fontSize: {
105
119
  default: typeScaleVars['--text-body-size'],
106
- '@media (pointer: coarse)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
120
+ '@media (pointer: coarse)': {
121
+ '@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
122
+ },
107
123
  },
108
124
  lineHeight: typeScaleVars['--text-body-leading'],
109
125
  pointerEvents: 'none',
@@ -31,7 +31,9 @@ export const docs = {
31
31
  targets: [
32
32
  {className: 'astryx-dialog', visualProps: ['variant']},
33
33
  {className: 'astryx-dialog-header'},
34
+ {className: 'astryx-dialog-header-start-content'},
34
35
  {className: 'astryx-dialog-header-title-block'},
36
+ {className: 'astryx-dialog-header-end-content'},
35
37
  {className: 'astryx-dialog-header-close-icon'},
36
38
  ],
37
39
  vars: [
@@ -12,7 +12,9 @@ export const docs = {
12
12
  description: 'Use DialogHeader to give a dialog a labelled title area and optional close control.',
13
13
  anatomy: [
14
14
  {name: 'Header row', required: true, description: 'Arranges the title block, optional start/end content, and close control.'},
15
+ {name: 'Start content', required: false, description: 'Wraps optional leading content.'},
15
16
  {name: 'Title block', required: true, description: 'Groups the title and optional subtitle.'},
17
+ {name: 'End content', required: false, description: 'Groups optional trailing content with the optional close control.'},
16
18
  {name: 'Close icon', required: false, description: 'Visual close glyph inside the close button.'},
17
19
  ],
18
20
  },
@@ -66,6 +68,11 @@ export const docs = {
66
68
  },
67
69
  ],
68
70
  },
71
+ {
72
+ name: 'endContentEdgeCompensation',
73
+ type: "'inline' | 'block' | 'all'",
74
+ description: 'Selects compensation axes for the end-content slot. Omit to preserve automatic close-action compensation.',
75
+ },
69
76
  {
70
77
  name: 'hasDivider',
71
78
  type: 'boolean',
@@ -83,7 +90,9 @@ export const docs = {
83
90
  theming: {
84
91
  targets: [
85
92
  {className: 'astryx-dialog-header'},
93
+ {className: 'astryx-dialog-header-start-content'},
86
94
  {className: 'astryx-dialog-header-title-block'},
95
+ {className: 'astryx-dialog-header-end-content'},
87
96
  {className: 'astryx-dialog-header-close-icon'},
88
97
  ],
89
98
  },
@@ -136,7 +145,9 @@ export const docsZh = {
136
145
  description: '使用 DialogHeader 为对话框提供带标签的标题区和可选的关闭控件。',
137
146
  anatomy: [
138
147
  {name: 'Header row', required: true, description: '排列标题区、可选的首尾内容和关闭控件。'},
148
+ {name: 'Start content', required: false, description: '包装可选的首部内容。'},
139
149
  {name: 'Title block', required: true, description: '组合标题和可选副标题。'},
150
+ {name: 'End content', required: false, description: '组合可选尾部内容和可选关闭控件。'},
140
151
  {name: 'Close icon', required: false, description: '关闭按钮内的关闭图标。'},
141
152
  ],
142
153
  },
@@ -166,6 +177,11 @@ export const docsZh = {
166
177
  type: 'ReactNode',
167
178
  description: '标题之后、关闭按钮之前的内容。',
168
179
  },
180
+ {
181
+ name: 'endContentEdgeCompensation',
182
+ type: "'inline' | 'block' | 'all'",
183
+ description: '选择尾部内容插槽的补偿轴;省略时保留关闭操作的自动补偿。',
184
+ },
169
185
  {
170
186
  name: 'hasDivider',
171
187
  type: 'boolean',
@@ -176,7 +192,9 @@ export const docsZh = {
176
192
  theming: {
177
193
  targets: [
178
194
  {className: 'astryx-dialog-header'},
195
+ {className: 'astryx-dialog-header-start-content'},
179
196
  {className: 'astryx-dialog-header-title-block'},
197
+ {className: 'astryx-dialog-header-end-content'},
180
198
  {className: 'astryx-dialog-header-close-icon'},
181
199
  ],
182
200
  },
@@ -191,7 +209,9 @@ export const docsDense = {
191
209
  description: 'labelled dialog title area + optional close control',
192
210
  anatomy: [
193
211
  {name: 'Header row', required: true, description: 'arranges title block, optional start/end content, close control'},
212
+ {name: 'Start content', required: false, description: 'wraps optional leading content'},
194
213
  {name: 'Title block', required: true, description: 'groups title + optional subtitle'},
214
+ {name: 'End content', required: false, description: 'groups optional trailing content + optional close control'},
195
215
  {name: 'Close icon', required: false, description: 'close glyph inside close button'},
196
216
  ],
197
217
  },
@@ -201,6 +221,8 @@ export const docsDense = {
201
221
  onOpenChange: 'close button callback (omit=no button)',
202
222
  startContent: 'content before title (e.g. back button)',
203
223
  endContent: 'content after title, before close button',
224
+ endContentEdgeCompensation:
225
+ 'end-content slot axes: inline | block | all; omit=automatic close-action compensation',
204
226
  hasDivider: 'bottom border',
205
227
  },
206
228
  };
@@ -22,6 +22,17 @@ function generateThemeTestCSS(theme: Parameters<typeof generateThemeCSS>[0]) {
22
22
  return [prose, component].filter(Boolean).join('\n\n');
23
23
  }
24
24
 
25
+ function getEndSlot(): HTMLElement {
26
+ const child =
27
+ screen.queryByRole('button', {name: 'Action'}) ??
28
+ screen.getByRole('button', {name: /close/i});
29
+ const slot = child.parentElement;
30
+ if (slot == null) {
31
+ throw new Error('Expected DialogHeader end slot');
32
+ }
33
+ return slot;
34
+ }
35
+
25
36
  describe('DialogHeader', () => {
26
37
  it('renders the title', () => {
27
38
  render(<DialogHeader title="My Dialog Title" />);
@@ -60,35 +71,184 @@ describe('DialogHeader', () => {
60
71
 
61
72
  it('renders close button when onOpenChange is provided', () => {
62
73
  render(<DialogHeader title="Title" onOpenChange={() => {}} />);
63
- expect(screen.getByRole('button', {name: /close/i})).toBeInTheDocument();
74
+ const closeButton = screen.getByRole('button', {name: /close/i});
75
+
76
+ expect(closeButton).toBeInTheDocument();
77
+ expect(closeButton.parentElement).toHaveClass(
78
+ 'astryx-dialog-header-end-content',
79
+ );
80
+ });
81
+
82
+ it('preserves automatic end-slot compensation when the close action renders', () => {
83
+ const {rerender} = render(
84
+ <DialogHeader title="Title" onOpenChange={() => {}} />,
85
+ );
86
+ const automaticClassName = getEndSlot().className;
87
+
88
+ rerender(
89
+ <DialogHeader
90
+ title="Title"
91
+ endContent={<button type="button">Action</button>}
92
+ onOpenChange={() => {}}
93
+ />,
94
+ );
95
+ expect(getEndSlot().className).toBe(automaticClassName);
96
+
97
+ rerender(
98
+ <DialogHeader
99
+ title="Title"
100
+ endContent={<button type="button">Action</button>}
101
+ />,
102
+ );
103
+ expect(getEndSlot().className).not.toBe(automaticClassName);
64
104
  });
65
105
 
66
- it('exposes theme targets for the header row, title block, and close icon', () => {
106
+ it('lets endContentEdgeCompensation select inline, block, or all', () => {
107
+ const {rerender} = render(
108
+ <DialogHeader
109
+ title="Title"
110
+ endContent={<button type="button">Action</button>}
111
+ />,
112
+ );
113
+ const noCompensationClassName = getEndSlot().className;
114
+
115
+ rerender(
116
+ <DialogHeader
117
+ title="Title"
118
+ endContent={<button type="button">Action</button>}
119
+ endContentEdgeCompensation="inline"
120
+ />,
121
+ );
122
+ const inlineClassName = getEndSlot().className;
123
+
124
+ rerender(
125
+ <DialogHeader
126
+ title="Title"
127
+ endContent={<button type="button">Action</button>}
128
+ endContentEdgeCompensation="block"
129
+ />,
130
+ );
131
+ const blockClassName = getEndSlot().className;
132
+
133
+ rerender(
134
+ <DialogHeader
135
+ title="Title"
136
+ endContent={<button type="button">Action</button>}
137
+ endContentEdgeCompensation="all"
138
+ />,
139
+ );
140
+ const allClassName = getEndSlot().className;
141
+
142
+ expect(inlineClassName).not.toBe(noCompensationClassName);
143
+ expect(blockClassName).not.toBe(noCompensationClassName);
144
+ expect(inlineClassName).not.toBe(blockClassName);
145
+ expect(allClassName).not.toBe(inlineClassName);
146
+ expect(allClassName).not.toBe(blockClassName);
147
+
148
+ rerender(
149
+ <DialogHeader
150
+ title="Title"
151
+ endContent={<button type="button">Action</button>}
152
+ onOpenChange={() => {}}
153
+ />,
154
+ );
155
+ expect(getEndSlot().className).toBe(allClassName);
156
+
157
+ rerender(
158
+ <DialogHeader
159
+ title="Title"
160
+ endContent={<button type="button">Action</button>}
161
+ endContentEdgeCompensation="inline"
162
+ onOpenChange={() => {}}
163
+ />,
164
+ );
165
+ expect(getEndSlot().className).toBe(inlineClassName);
166
+ });
167
+
168
+ it('exposes theme targets for the header row, title block, both content slots, and close icon', () => {
67
169
  const {container} = render(
68
170
  <DialogHeader
69
171
  title="Title"
70
172
  subtitle="Subtitle"
173
+ startContent={<button type="button">Back</button>}
174
+ endContent={<button type="button">Custom Action</button>}
71
175
  onOpenChange={() => {}}
72
176
  />,
73
177
  );
74
178
 
75
179
  expect(container.querySelector('.astryx-dialog-header')).not.toBeNull();
180
+ expect(
181
+ screen.getByRole('button', {name: 'Back'}).parentElement,
182
+ ).toHaveClass('astryx-dialog-header-start-content');
76
183
  expect(screen.getByRole('heading', {level: 2}).parentElement).toHaveClass(
77
184
  'astryx-dialog-header-title-block',
78
185
  );
79
186
 
187
+ const endContent = screen.getByRole('button', {
188
+ name: 'Custom Action',
189
+ }).parentElement;
190
+ expect(endContent).toHaveClass('astryx-dialog-header-end-content');
191
+ expect(screen.getByRole('button', {name: /close/i}).parentElement).toBe(
192
+ endContent,
193
+ );
194
+
80
195
  const closeIcon = screen
81
196
  .getByRole('button', {name: /close/i})
82
197
  .querySelector('.astryx-dialog-header-close-icon');
83
198
  expect(closeIcon).toHaveClass('astryx-icon');
84
199
  });
85
200
 
86
- it('lets themes set the two internal gaps and close-icon size', () => {
201
+ it('exposes the start-content target when startContent renders', () => {
202
+ const {container} = render(
203
+ <DialogHeader
204
+ title="Title"
205
+ startContent={<button type="button">Back</button>}
206
+ />,
207
+ );
208
+
209
+ expect(
210
+ screen.getByRole('button', {name: 'Back'}).parentElement,
211
+ ).toHaveClass('astryx-dialog-header-start-content');
212
+ expect(
213
+ container.querySelectorAll('.astryx-dialog-header-start-content'),
214
+ ).toHaveLength(1);
215
+ });
216
+
217
+ it('exposes the end-content target when endContent renders without a close button', () => {
218
+ const {container} = render(
219
+ <DialogHeader
220
+ title="Title"
221
+ endContent={<button type="button">Custom Action</button>}
222
+ />,
223
+ );
224
+
225
+ expect(
226
+ screen.getByRole('button', {name: 'Custom Action'}).parentElement,
227
+ ).toHaveClass('astryx-dialog-header-end-content');
228
+ expect(
229
+ container.querySelectorAll('.astryx-dialog-header-end-content'),
230
+ ).toHaveLength(1);
231
+ });
232
+
233
+ it('omits the content-slot targets when their content does not render', () => {
234
+ const {container} = render(<DialogHeader title="Title" />);
235
+
236
+ expect(
237
+ container.querySelector('.astryx-dialog-header-start-content'),
238
+ ).toBeNull();
239
+ expect(
240
+ container.querySelector('.astryx-dialog-header-end-content'),
241
+ ).toBeNull();
242
+ });
243
+
244
+ it('lets themes set the internal gaps and close-icon size', () => {
87
245
  const theme = defineTheme({
88
246
  name: 'dialog-header-targets-test',
89
247
  components: {
90
248
  'dialog-header': {base: {gap: '8px'}},
249
+ 'dialog-header-start-content': {base: {gap: '5px'}},
91
250
  'dialog-header-title-block': {base: {gap: '4px'}},
251
+ 'dialog-header-end-content': {base: {gap: '6px'}},
92
252
  'dialog-header-close-icon': {
93
253
  base: {width: '16px', height: '16px', fontSize: '16px'},
94
254
  },
@@ -98,8 +258,12 @@ describe('DialogHeader', () => {
98
258
 
99
259
  expect(css).toContain('.astryx-dialog-header {');
100
260
  expect(css).toContain('gap: 8px');
261
+ expect(css).toContain('.astryx-dialog-header-start-content {');
262
+ expect(css).toContain('gap: 5px');
101
263
  expect(css).toContain('.astryx-dialog-header-title-block {');
102
264
  expect(css).toContain('gap: 4px');
265
+ expect(css).toContain('.astryx-dialog-header-end-content {');
266
+ expect(css).toContain('gap: 6px');
103
267
  expect(css).toContain('.astryx-dialog-header-close-icon {');
104
268
  expect(css).toContain('width: 16px');
105
269
  expect(css).toContain('height: 16px');