@astryxdesign/core 0.6.2 → 0.6.3-canary.0899f21

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 (549) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/dist/BottomSheet/BottomSheet.d.ts +1 -1
  3. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  4. package/dist/BottomSheet/BottomSheet.js +3 -1
  5. package/dist/BottomSheet/BottomSheetPanel.d.ts +7 -5
  6. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  7. package/dist/BottomSheet/BottomSheetPanel.js +56 -19
  8. package/dist/Button/Button.d.ts.map +1 -1
  9. package/dist/Button/Button.js +13 -28
  10. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  11. package/dist/Chat/ChatComposer.js +10 -5
  12. package/dist/Chat/ChatComposerDrawer.d.ts +19 -5
  13. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  14. package/dist/Chat/ChatComposerDrawer.js +48 -23
  15. package/dist/Chat/ChatComposerInput.d.ts +11 -3
  16. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  17. package/dist/Chat/ChatComposerInput.js +63 -16
  18. package/dist/Chat/ChatDictationButton.d.ts +3 -2
  19. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  20. package/dist/Chat/ChatDictationButton.js +6 -4
  21. package/dist/Chat/ChatLayout.d.ts +19 -0
  22. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  23. package/dist/Chat/ChatLayout.js +19 -0
  24. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  25. package/dist/Chat/ChatLayoutScrollButton.js +44 -34
  26. package/dist/Chat/ChatMessageBubble.d.ts +2 -0
  27. package/dist/Chat/ChatMessageBubble.d.ts.map +1 -1
  28. package/dist/Chat/ChatMessageBubble.js +5 -3
  29. package/dist/Chat/ChatMessageList.d.ts +2 -1
  30. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  31. package/dist/Chat/ChatMessageList.js +4 -3
  32. package/dist/Chat/ChatMessageMetadata.d.ts +5 -4
  33. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  34. package/dist/Chat/ChatMessageMetadata.js +12 -9
  35. package/dist/Chat/ChatSendButton.js +1 -1
  36. package/dist/Chat/index.d.ts +1 -1
  37. package/dist/Chat/index.d.ts.map +1 -1
  38. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  39. package/dist/CheckboxInput/CheckboxInput.js +12 -2
  40. package/dist/Citation/Citation.d.ts +1 -1
  41. package/dist/Citation/Citation.d.ts.map +1 -1
  42. package/dist/Citation/Citation.js +3 -2
  43. package/dist/CodeBlock/highlightRanges.d.ts.map +1 -1
  44. package/dist/CodeBlock/highlightRanges.js +14 -3
  45. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  46. package/dist/Collapsible/Collapsible.js +6 -1
  47. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  48. package/dist/CommandPalette/CommandPaletteInput.js +1 -1
  49. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  50. package/dist/ComplexSelector/ComplexSelector.js +1 -1
  51. package/dist/DateInput/DateInput.d.ts.map +1 -1
  52. package/dist/DateInput/DateInput.js +4 -4
  53. package/dist/DateInput/NativeDateField.d.ts.map +1 -1
  54. package/dist/DateInput/NativeDateField.js +16 -16
  55. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  56. package/dist/DateInput/TouchDateField.js +2 -2
  57. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  58. package/dist/DateRangeInput/DateRangeInput.js +4 -4
  59. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  60. package/dist/DateTimeInput/DateTimeInput.js +8 -8
  61. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  62. package/dist/DateTimeInput/TouchDateTimeField.js +4 -4
  63. package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts +9 -3
  64. package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts.map +1 -1
  65. package/dist/DateTimeInput/nativePickerSegmentStyles.js +3 -3
  66. package/dist/Dialog/DialogHeader.d.ts +8 -1
  67. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  68. package/dist/Dialog/DialogHeader.js +13 -4
  69. package/dist/Field/InputClearButton.d.ts +4 -2
  70. package/dist/Field/InputClearButton.d.ts.map +1 -1
  71. package/dist/Field/InputClearButton.js +4 -2
  72. package/dist/Field/PanelSearchInput.d.ts.map +1 -1
  73. package/dist/Field/PanelSearchInput.js +1 -1
  74. package/dist/FileInput/FileInput.d.ts.map +1 -1
  75. package/dist/FileInput/FileInput.js +7 -7
  76. package/dist/Icon/Icon.d.ts +6 -31
  77. package/dist/Icon/Icon.d.ts.map +1 -1
  78. package/dist/Icon/Icon.js +8 -71
  79. package/dist/Icon/IconDefaultSizeContext.d.ts +4 -0
  80. package/dist/Icon/IconDefaultSizeContext.d.ts.map +1 -0
  81. package/dist/Icon/IconDefaultSizeContext.js +18 -0
  82. package/dist/Icon/IconSize.stylex.d.ts +65 -0
  83. package/dist/Icon/IconSize.stylex.d.ts.map +1 -0
  84. package/dist/Icon/IconSize.stylex.js +75 -0
  85. package/dist/Item/Item.d.ts +1 -1
  86. package/dist/Item/Item.d.ts.map +1 -1
  87. package/dist/Item/Item.js +4 -3
  88. package/dist/Kbd/Kbd.d.ts +5 -3
  89. package/dist/Kbd/Kbd.d.ts.map +1 -1
  90. package/dist/Kbd/Kbd.js +36 -42
  91. package/dist/Link/Link.d.ts.map +1 -1
  92. package/dist/Link/Link.js +6 -2
  93. package/dist/Link/useLinkComponent.d.ts +5 -15
  94. package/dist/Link/useLinkComponent.d.ts.map +1 -1
  95. package/dist/Link/useLinkComponent.js +34 -51
  96. package/dist/List/List.d.ts +19 -1
  97. package/dist/List/List.d.ts.map +1 -1
  98. package/dist/List/List.js +9 -2
  99. package/dist/List/ListContext.d.ts +1 -0
  100. package/dist/List/ListContext.d.ts.map +1 -1
  101. package/dist/List/ListContext.js +2 -1
  102. package/dist/List/ListItem.d.ts +1 -1
  103. package/dist/List/ListItem.d.ts.map +1 -1
  104. package/dist/List/ListItem.js +9 -2
  105. package/dist/Markdown/Markdown.d.ts +8 -2
  106. package/dist/Markdown/Markdown.d.ts.map +1 -1
  107. package/dist/Markdown/Markdown.fr23.bench.d.ts +2 -0
  108. package/dist/Markdown/Markdown.fr23.bench.d.ts.map +1 -0
  109. package/dist/Markdown/Markdown.fr23.bench.js +150 -0
  110. package/dist/Markdown/Markdown.fr23.sampling.d.ts +2 -0
  111. package/dist/Markdown/Markdown.fr23.sampling.d.ts.map +1 -0
  112. package/dist/Markdown/Markdown.fr23.sampling.js +43 -0
  113. package/dist/Markdown/Markdown.js +262 -109
  114. package/dist/Markdown/ast.d.ts +162 -0
  115. package/dist/Markdown/ast.d.ts.map +1 -0
  116. package/dist/Markdown/ast.js +74 -0
  117. package/dist/Markdown/index.d.ts +5 -3
  118. package/dist/Markdown/index.d.ts.map +1 -1
  119. package/dist/Markdown/index.js +3 -2
  120. package/dist/Markdown/parser/index.d.ts +10 -0
  121. package/dist/Markdown/parser/index.d.ts.map +1 -0
  122. package/dist/Markdown/parser/index.js +10 -0
  123. package/dist/Markdown/parser.d.ts +126 -58
  124. package/dist/Markdown/parser.d.ts.map +1 -1
  125. package/dist/Markdown/parser.js +716 -167
  126. package/dist/Markdown/plugins/frontmatter.d.ts +32 -0
  127. package/dist/Markdown/plugins/frontmatter.d.ts.map +1 -0
  128. package/dist/Markdown/plugins/frontmatter.js +132 -0
  129. package/dist/Markdown/plugins/index.d.ts +17 -0
  130. package/dist/Markdown/plugins/index.d.ts.map +1 -0
  131. package/dist/Markdown/plugins/index.js +14 -0
  132. package/dist/Markdown/plugins/protocol.d.ts +191 -0
  133. package/dist/Markdown/plugins/protocol.d.ts.map +1 -0
  134. package/dist/Markdown/plugins/protocol.js +957 -0
  135. package/dist/Markdown/plugins/semanticFence.d.ts +36 -0
  136. package/dist/Markdown/plugins/semanticFence.d.ts.map +1 -0
  137. package/dist/Markdown/plugins/semanticFence.js +213 -0
  138. package/dist/Markdown/plugins/softBreaks.d.ts +3 -0
  139. package/dist/Markdown/plugins/softBreaks.d.ts.map +1 -0
  140. package/dist/Markdown/plugins/softBreaks.js +172 -0
  141. package/dist/Markdown/plugins/sourceDecoration.d.ts +76 -0
  142. package/dist/Markdown/plugins/sourceDecoration.d.ts.map +1 -0
  143. package/dist/Markdown/plugins/sourceDecoration.js +393 -0
  144. package/dist/Markdown/plugins/textTransform.d.ts +30 -0
  145. package/dist/Markdown/plugins/textTransform.d.ts.map +1 -0
  146. package/dist/Markdown/plugins/textTransform.js +374 -0
  147. package/dist/Markdown/remark.d.ts +196 -0
  148. package/dist/Markdown/remark.d.ts.map +1 -0
  149. package/dist/Markdown/remark.js +1062 -0
  150. package/dist/Markdown/url.d.ts +6 -0
  151. package/dist/Markdown/url.d.ts.map +1 -0
  152. package/dist/Markdown/url.js +31 -0
  153. package/dist/Markdown/utils.d.ts +4 -2
  154. package/dist/Markdown/utils.d.ts.map +1 -1
  155. package/dist/Markdown/utils.js +2 -1
  156. package/dist/MetadataList/MetadataList.js +3 -3
  157. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  158. package/dist/NumberInput/NumberInput.js +4 -4
  159. package/dist/Outline/index.d.ts +1 -0
  160. package/dist/Outline/index.d.ts.map +1 -1
  161. package/dist/Outline/parseOutlineFromMarkdown.d.ts +7 -1
  162. package/dist/Outline/parseOutlineFromMarkdown.d.ts.map +1 -1
  163. package/dist/Outline/parseOutlineFromMarkdown.js +14 -8
  164. package/dist/Outline/useOutlineFromMarkdown.d.ts +3 -1
  165. package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
  166. package/dist/Outline/useOutlineFromMarkdown.js +8 -3
  167. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  168. package/dist/PowerSearch/PowerSearchEditPopover.js +46 -30
  169. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  170. package/dist/PowerSearch/PowerSearchValueEditor.js +5 -0
  171. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  172. package/dist/ProgressBar/ProgressBar.js +36 -31
  173. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  174. package/dist/RadioList/RadioListItem.js +13 -1
  175. package/dist/ScrollableArea/ScrollableArea.d.ts +1 -0
  176. package/dist/ScrollableArea/ScrollableArea.d.ts.map +1 -1
  177. package/dist/ScrollableArea/ScrollableArea.js +1 -0
  178. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  179. package/dist/SegmentedControl/SegmentedControlItem.js +5 -5
  180. package/dist/Selector/Selector.d.ts +9 -7
  181. package/dist/Selector/Selector.d.ts.map +1 -1
  182. package/dist/Selector/Selector.js +16 -7
  183. package/dist/SideNav/SideNav.d.ts +2 -1
  184. package/dist/SideNav/SideNav.d.ts.map +1 -1
  185. package/dist/SideNav/SideNav.js +9 -3
  186. package/dist/Slider/Slider.d.ts.map +1 -1
  187. package/dist/Slider/Slider.js +28 -12
  188. package/dist/Spinner/Spinner.d.ts.map +1 -1
  189. package/dist/Spinner/Spinner.js +23 -7
  190. package/dist/Switch/Switch.d.ts.map +1 -1
  191. package/dist/Switch/Switch.js +11 -0
  192. package/dist/TabList/Tab.d.ts +1 -1
  193. package/dist/TabList/Tab.d.ts.map +1 -1
  194. package/dist/TabList/Tab.js +20 -7
  195. package/dist/Table/Table.d.ts +1 -0
  196. package/dist/Table/Table.d.ts.map +1 -1
  197. package/dist/Table/Table.js +29 -13
  198. package/dist/TextArea/TextArea.d.ts.map +1 -1
  199. package/dist/TextArea/TextArea.js +1 -1
  200. package/dist/TextInput/TextInput.d.ts.map +1 -1
  201. package/dist/TextInput/TextInput.js +2 -2
  202. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  203. package/dist/TimeInput/TimeInput.js +4 -4
  204. package/dist/Timer/Timer.d.ts +49 -0
  205. package/dist/Timer/Timer.d.ts.map +1 -0
  206. package/dist/Timer/Timer.js +158 -0
  207. package/dist/Timer/index.d.ts +9 -0
  208. package/dist/Timer/index.d.ts.map +1 -0
  209. package/dist/Timer/index.js +10 -0
  210. package/dist/ToggleButton/ToggleButton.d.ts +9 -6
  211. package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
  212. package/dist/ToggleButton/ToggleButton.js +15 -27
  213. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  214. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  215. package/dist/TopNav/TopNavMenu.js +3 -2
  216. package/dist/TreeList/TreeList.d.ts.map +1 -1
  217. package/dist/TreeList/TreeList.js +3 -0
  218. package/dist/TreeList/TreeListItem.d.ts +6 -1
  219. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  220. package/dist/TreeList/TreeListItem.js +12 -2
  221. package/dist/TreeList/TreeListTypes.d.ts +8 -1
  222. package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
  223. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  224. package/dist/Typeahead/BaseTypeahead.js +16 -7
  225. package/dist/astryx.css +27 -11
  226. package/dist/hooks/scrollKeyboardDelegation.d.ts +3 -0
  227. package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -0
  228. package/dist/hooks/scrollKeyboardDelegation.js +146 -0
  229. package/dist/hooks/useClickableContainer.d.ts +10 -1
  230. package/dist/hooks/useClickableContainer.d.ts.map +1 -1
  231. package/dist/hooks/useClickableContainer.js +15 -4
  232. package/dist/hooks/useScrollableArea.d.ts +6 -2
  233. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  234. package/dist/hooks/useScrollableArea.js +17 -5
  235. package/dist/index.d.ts +1 -0
  236. package/dist/index.d.ts.map +1 -1
  237. package/dist/index.js +3 -0
  238. package/dist/theme/declarationBoundary.d.ts +17 -0
  239. package/dist/theme/declarationBoundary.d.ts.map +1 -0
  240. package/dist/theme/declarationBoundary.js +343 -0
  241. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  242. package/dist/theme/derivedVarRegistry.js +4 -0
  243. package/dist/theme/generateThemeRules.d.ts +13 -7
  244. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  245. package/dist/theme/generateThemeRules.js +140 -34
  246. package/dist/utils/interactionOverlay.stylex.d.ts +8 -0
  247. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  248. package/dist/utils/interactionOverlay.stylex.js +9 -0
  249. package/dist/utils/safeUrl.d.ts +11 -0
  250. package/dist/utils/safeUrl.d.ts.map +1 -0
  251. package/dist/utils/safeUrl.js +78 -0
  252. package/locales/af-ZA.json +530 -1
  253. package/locales/ar-SA.json +490 -1
  254. package/locales/ca-ES.json +514 -1
  255. package/locales/cs-CZ.json +498 -1
  256. package/locales/da-DK.json +522 -1
  257. package/locales/de-DE.json +522 -1
  258. package/locales/el-GR.json +498 -1
  259. package/locales/es-ES.json +510 -1
  260. package/locales/fi-FI.json +498 -1
  261. package/locales/fr-FR.json +534 -1
  262. package/locales/he-IL.json +498 -1
  263. package/locales/hu-HU.json +498 -1
  264. package/locales/it-IT.json +510 -1
  265. package/locales/ja-JP.json +490 -1
  266. package/locales/ko-KR.json +498 -1
  267. package/locales/nl-NL.json +534 -1
  268. package/locales/no-NO.json +510 -1
  269. package/locales/pl-PL.json +506 -1
  270. package/locales/pt-BR.json +506 -1
  271. package/locales/pt-PT.json +506 -1
  272. package/locales/ro-RO.json +506 -1
  273. package/locales/ru-RU.json +498 -1
  274. package/locales/sr-SP.json +498 -1
  275. package/locales/sv-SE.json +502 -1
  276. package/locales/tr-TR.json +498 -1
  277. package/locales/uk-UA.json +498 -1
  278. package/locales/vi-VN.json +502 -1
  279. package/locales/zh-CN.json +490 -1
  280. package/locales/zh-TW.json +490 -1
  281. package/package.json +24 -4
  282. package/src/BottomSheet/BottomSheet.doc.mjs +8 -1
  283. package/src/BottomSheet/BottomSheet.spec.md +46 -20
  284. package/src/BottomSheet/BottomSheet.test.tsx +6 -3
  285. package/src/BottomSheet/BottomSheet.tsx +3 -1
  286. package/src/BottomSheet/BottomSheetKeyboard.test.tsx +195 -0
  287. package/src/BottomSheet/BottomSheetPanel.test.tsx +11 -1
  288. package/src/BottomSheet/BottomSheetPanel.tsx +49 -16
  289. package/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts +344 -0
  290. package/src/Button/Button.doc.mjs +5 -5
  291. package/src/Button/Button.tsx +15 -13
  292. package/src/Button/__tests__/Button.a11y.chromium.spec.ts +17 -1
  293. package/src/Button/__tests__/Button.a11y.known-failures.ts +0 -29
  294. package/src/Button/__tests__/Button.a11y.renders.tsx +9 -2
  295. package/src/Button/__tests__/Button.a11y.states.ts +9 -0
  296. package/src/Chat/ChatComposer.doc.mjs +14 -0
  297. package/src/Chat/ChatComposer.spec.md +230 -0
  298. package/src/Chat/ChatComposer.test.tsx +57 -0
  299. package/src/Chat/ChatComposer.tsx +21 -9
  300. package/src/Chat/ChatComposerDrawer.doc.mjs +63 -5
  301. package/src/Chat/ChatComposerDrawer.spec.md +267 -0
  302. package/src/Chat/ChatComposerDrawer.test.tsx +81 -12
  303. package/src/Chat/ChatComposerDrawer.tsx +38 -9
  304. package/src/Chat/ChatComposerInput.doc.mjs +114 -26
  305. package/src/Chat/ChatComposerInput.spec.md +185 -0
  306. package/src/Chat/ChatComposerInput.test.tsx +113 -3
  307. package/src/Chat/ChatComposerInput.tsx +78 -13
  308. package/src/Chat/ChatComposerTokenElement.spec.md +152 -0
  309. package/src/Chat/ChatComposerTokenElement.test.tsx +85 -0
  310. package/src/Chat/ChatDictationButton.doc.mjs +3 -3
  311. package/src/Chat/ChatDictationButton.spec.md +160 -0
  312. package/src/Chat/ChatDictationButton.test.tsx +92 -27
  313. package/src/Chat/ChatDictationButton.tsx +8 -6
  314. package/src/Chat/ChatLayout.doc.mjs +12 -4
  315. package/src/Chat/ChatLayout.spec.md +271 -0
  316. package/src/Chat/ChatLayout.test.tsx +28 -0
  317. package/src/Chat/ChatLayout.tsx +19 -0
  318. package/src/Chat/ChatLayoutScrollButton.spec.md +338 -0
  319. package/src/Chat/ChatLayoutScrollButton.test.tsx +31 -0
  320. package/src/Chat/ChatLayoutScrollButton.tsx +31 -14
  321. package/src/Chat/ChatMessageBubble.doc.mjs +28 -15
  322. package/src/Chat/ChatMessageBubble.spec.md +263 -0
  323. package/src/Chat/ChatMessageBubble.test.tsx +93 -0
  324. package/src/Chat/ChatMessageBubble.tsx +8 -3
  325. package/src/Chat/ChatMessageList.spec.md +222 -0
  326. package/src/Chat/ChatMessageList.test.tsx +64 -2
  327. package/src/Chat/ChatMessageList.tsx +4 -3
  328. package/src/Chat/ChatMessageMetadata.doc.mjs +57 -3
  329. package/src/Chat/ChatMessageMetadata.spec.md +220 -0
  330. package/src/Chat/ChatMessageMetadata.test.tsx +34 -0
  331. package/src/Chat/ChatMessageMetadata.tsx +13 -13
  332. package/src/Chat/ChatSendButton.test.tsx +1 -4
  333. package/src/Chat/ChatSendButton.tsx +1 -1
  334. package/src/Chat/__tests__/ChatLayoutScrollButton.a11y.chromium.spec.ts +514 -0
  335. package/src/Chat/__tests__/ChatLayoutScrollButtonSurface.a11y.chromium.spec.ts +740 -0
  336. package/src/Chat/__tests__/ChatMessageBubble.a11y.chromium.spec.ts +457 -0
  337. package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.test.ts +91 -0
  338. package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.ts +91 -0
  339. package/src/Chat/__tests__/ChatMessageList.a11y.chromium.spec.ts +456 -0
  340. package/src/Chat/__tests__/ChatMessageMetadata.a11y.chromium.spec.ts +413 -0
  341. package/src/Chat/index.ts +1 -0
  342. package/src/CheckboxInput/CheckboxInput.doc.mjs +11 -0
  343. package/src/CheckboxInput/CheckboxInput.test.tsx +34 -0
  344. package/src/CheckboxInput/CheckboxInput.tsx +21 -1
  345. package/src/Citation/Citation.doc.mjs +2 -2
  346. package/src/Citation/Citation.test.tsx +17 -0
  347. package/src/Citation/Citation.tsx +4 -2
  348. package/src/ClickableCard/ClickableCard.doc.mjs +2 -2
  349. package/src/ClickableCard/ClickableCard.test.tsx +102 -5
  350. package/src/CodeBlock/highlightRanges.test.ts +143 -1
  351. package/src/CodeBlock/highlightRanges.ts +15 -5
  352. package/src/Collapsible/Collapsible.doc.mjs +11 -0
  353. package/src/Collapsible/Collapsible.test.tsx +21 -0
  354. package/src/Collapsible/Collapsible.tsx +5 -0
  355. package/src/CommandPalette/CommandPaletteInput.tsx +6 -1
  356. package/src/ComplexSelector/ComplexSelector.tsx +6 -1
  357. package/src/DateInput/DateInput.tsx +6 -1
  358. package/src/DateInput/NativeDateField.tsx +24 -8
  359. package/src/DateInput/TouchDateField.tsx +6 -2
  360. package/src/DateRangeInput/DateRangeInput.tsx +6 -1
  361. package/src/DateTimeInput/DateTimeInput.tsx +6 -1
  362. package/src/DateTimeInput/TouchDateTimeField.tsx +6 -1
  363. package/src/DateTimeInput/nativePickerSegmentStyles.ts +24 -8
  364. package/src/Dialog/Dialog.doc.mjs +2 -0
  365. package/src/Dialog/DialogHeader.doc.mjs +22 -0
  366. package/src/Dialog/DialogHeader.test.tsx +167 -3
  367. package/src/Dialog/DialogHeader.tsx +37 -6
  368. package/src/Dialog/modules/DialogHeader.spec.md +101 -42
  369. package/src/DropdownMenu/DropdownMenu.test.tsx +5 -2
  370. package/src/Field/InputClearButton.test.tsx +17 -3
  371. package/src/Field/InputClearButton.tsx +5 -2
  372. package/src/Field/PanelSearchInput.tsx +5 -2
  373. package/src/FieldStatus/__tests__/StatusMessage.a11y.states.ts +1 -1
  374. package/src/FileInput/FileInput.tsx +11 -2
  375. package/src/Icon/Icon.doc.mjs +7 -5
  376. package/src/Icon/Icon.spec.md +81 -40
  377. package/src/Icon/Icon.test.tsx +6 -3
  378. package/src/Icon/Icon.tsx +20 -68
  379. package/src/Icon/IconDefaultSizeContext.ts +23 -0
  380. package/src/Icon/IconSize.stylex.ts +70 -0
  381. package/src/IconButton/IconButton.doc.mjs +3 -3
  382. package/src/IconButton/IconButton.test.tsx +40 -0
  383. package/src/Item/Item.doc.mjs +6 -2
  384. package/src/Item/Item.tsx +9 -3
  385. package/src/Kbd/Kbd.doc.mjs +3 -3
  386. package/src/Kbd/Kbd.test.tsx +57 -1
  387. package/src/Kbd/Kbd.tsx +57 -37
  388. package/src/Layout/LayoutFooter.doc.mjs +17 -0
  389. package/src/Link/Link.doc.mjs +17 -4
  390. package/src/Link/Link.test.tsx +24 -0
  391. package/src/Link/Link.tsx +5 -0
  392. package/src/Link/LinkProvider.doc.mjs +2 -2
  393. package/src/Link/__tests__/Link.navigation.a11y.chromium.spec.ts +261 -0
  394. package/src/Link/useLinkComponent.test.tsx +333 -0
  395. package/src/Link/useLinkComponent.ts +29 -57
  396. package/src/List/List.doc.mjs +6 -0
  397. package/src/List/List.spec.md +200 -0
  398. package/src/List/List.test.tsx +117 -1
  399. package/src/List/List.tsx +22 -2
  400. package/src/List/ListContext.tsx +3 -1
  401. package/src/List/ListItem.doc.mjs +2 -2
  402. package/src/List/ListItem.source-build.test.mjs +41 -0
  403. package/src/List/ListItem.tsx +26 -2
  404. package/src/Markdown/Markdown.doc.mjs +300 -2
  405. package/src/Markdown/Markdown.fr23.bench.ts +174 -0
  406. package/src/Markdown/Markdown.fr23.perf.test.ts +249 -0
  407. package/src/Markdown/Markdown.fr23.sampling.ts +49 -0
  408. package/src/Markdown/Markdown.helpers.perf.test.ts +489 -0
  409. package/src/Markdown/Markdown.public.test.ts +130 -3
  410. package/src/Markdown/Markdown.renderBoundary.test.tsx +72 -0
  411. package/src/Markdown/Markdown.spec.md +203 -45
  412. package/src/Markdown/Markdown.test.tsx +63 -0
  413. package/src/Markdown/Markdown.tsx +414 -135
  414. package/src/Markdown/ast.test.ts +307 -0
  415. package/src/Markdown/ast.ts +337 -0
  416. package/src/Markdown/incremental.test.ts +12 -0
  417. package/src/Markdown/index.ts +37 -1
  418. package/src/Markdown/modules/remark.spec.md +269 -0
  419. package/src/Markdown/modules/softBreaks.spec.md +137 -0
  420. package/src/Markdown/parser/index.ts +64 -0
  421. package/src/Markdown/parser.public.test.ts +103 -0
  422. package/src/Markdown/parser.test.ts +20 -0
  423. package/src/Markdown/parser.ts +1180 -235
  424. package/src/Markdown/plugins/frontmatter.test.tsx +125 -0
  425. package/src/Markdown/plugins/frontmatter.ts +198 -0
  426. package/src/Markdown/plugins/index.ts +54 -0
  427. package/src/Markdown/plugins/protocol.test.tsx +1022 -0
  428. package/src/Markdown/plugins/protocol.ts +1618 -0
  429. package/src/Markdown/plugins/semanticFence.test.tsx +546 -0
  430. package/src/Markdown/plugins/semanticFence.ts +424 -0
  431. package/src/Markdown/plugins/softBreaks.test.tsx +172 -0
  432. package/src/Markdown/plugins/softBreaks.ts +169 -0
  433. package/src/Markdown/plugins/sourceDecoration.test.tsx +799 -0
  434. package/src/Markdown/plugins/sourceDecoration.ts +539 -0
  435. package/src/Markdown/plugins/textTransform.test.ts +467 -0
  436. package/src/Markdown/plugins/textTransform.ts +554 -0
  437. package/src/Markdown/remark.test.tsx +1877 -0
  438. package/src/Markdown/remark.ts +1574 -0
  439. package/src/Markdown/url.ts +36 -0
  440. package/src/Markdown/utils.ts +13 -1
  441. package/src/MetadataList/MetadataList.test.tsx +4 -2
  442. package/src/MetadataList/MetadataList.tsx +3 -3
  443. package/src/MultiSelector/MultiSelector.test.tsx +1 -35
  444. package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +128 -0
  445. package/src/NumberInput/NumberInput.tsx +6 -1
  446. package/src/Outline/Outline.doc.mjs +7 -5
  447. package/src/Outline/Outline.spec.md +1 -1
  448. package/src/Outline/index.ts +1 -0
  449. package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +142 -0
  450. package/src/Outline/parseOutlineFromMarkdown.ts +40 -10
  451. package/src/Outline/useOutlineFromMarkdown.ts +15 -3
  452. package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
  453. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +150 -1
  454. package/src/PowerSearch/PowerSearchEditPopover.tsx +51 -28
  455. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +51 -0
  456. package/src/PowerSearch/PowerSearchValueEditor.tsx +4 -0
  457. package/src/ProgressBar/ProgressBar.test.tsx +29 -11
  458. package/src/ProgressBar/ProgressBar.tsx +59 -72
  459. package/src/RadioList/RadioList.doc.mjs +11 -0
  460. package/src/RadioList/RadioList.test.tsx +32 -0
  461. package/src/RadioList/RadioListItem.tsx +25 -1
  462. package/src/ScrollableArea/ScrollableArea.tsx +1 -0
  463. package/src/ScrollableArea/modules/useScrollableArea.spec.md +50 -22
  464. package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
  465. package/src/SegmentedControl/SegmentedControl.test.tsx +31 -0
  466. package/src/SegmentedControl/SegmentedControlItem.tsx +6 -9
  467. package/src/Selector/Selector.doc.mjs +2 -2
  468. package/src/Selector/Selector.spec.md +51 -49
  469. package/src/Selector/Selector.test.tsx +61 -55
  470. package/src/Selector/Selector.tsx +34 -15
  471. package/src/Selector/__tests__/Listbox.a11y.chromium.spec.ts +130 -0
  472. package/src/Selector/__tests__/Listbox.a11y.dom.ts +38 -0
  473. package/src/Selector/__tests__/Listbox.a11y.inventory.test.ts +63 -0
  474. package/src/Selector/__tests__/Listbox.a11y.known-failures.ts +37 -0
  475. package/src/Selector/__tests__/Listbox.a11y.states.ts +232 -0
  476. package/src/Selector/__tests__/Selector.a11y.chromium.spec.ts +45 -0
  477. package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +121 -0
  478. package/src/SideNav/SideNav.doc.mjs +1 -1
  479. package/src/SideNav/SideNav.test.tsx +10 -0
  480. package/src/SideNav/SideNav.tsx +14 -2
  481. package/src/Slider/Slider.doc.mjs +17 -3
  482. package/src/Slider/Slider.test.tsx +221 -0
  483. package/src/Slider/Slider.tsx +40 -9
  484. package/src/Spinner/Spinner.test.tsx +4 -0
  485. package/src/Spinner/Spinner.tsx +31 -18
  486. package/src/Switch/Switch.doc.mjs +11 -0
  487. package/src/Switch/Switch.test.tsx +16 -0
  488. package/src/Switch/Switch.tsx +28 -0
  489. package/src/TabList/Tab.tsx +35 -7
  490. package/src/TabList/TabList.doc.mjs +11 -0
  491. package/src/TabList/TabList.spec.md +204 -0
  492. package/src/TabList/TabList.test.tsx +66 -0
  493. package/src/TabList/__tests__/Tabs.a11y.known-failures.ts +1 -34
  494. package/src/Table/Table.doc.mjs +1 -1
  495. package/src/Table/Table.spec.md +54 -40
  496. package/src/Table/Table.test.tsx +83 -10
  497. package/src/Table/Table.tsx +30 -22
  498. package/src/Table/__tests__/TableScroll.a11y.chromium.spec.ts +137 -0
  499. package/src/TextArea/TextArea.tsx +6 -1
  500. package/src/TextInput/TextInput.test.tsx +20 -1
  501. package/src/TextInput/TextInput.tsx +6 -1
  502. package/src/TimeInput/TimeInput.tsx +6 -1
  503. package/src/Timer/Timer.doc.mjs +183 -0
  504. package/src/Timer/Timer.spec.md +215 -0
  505. package/src/Timer/Timer.test.tsx +302 -0
  506. package/src/Timer/Timer.tsx +258 -0
  507. package/src/Timer/index.ts +11 -0
  508. package/src/ToggleButton/ToggleButton.doc.mjs +3 -3
  509. package/src/ToggleButton/ToggleButton.test.tsx +299 -4
  510. package/src/ToggleButton/ToggleButton.tsx +26 -33
  511. package/src/ToggleButton/ToggleButtonGroup.doc.mjs +3 -3
  512. package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +209 -0
  513. package/src/Token/Token.doc.mjs +2 -2
  514. package/src/Tokenizer/Tokenizer.spec.md +142 -75
  515. package/src/TopNav/TopNavMenu.doc.mjs +2 -2
  516. package/src/TopNav/TopNavMenu.test.tsx +30 -0
  517. package/src/TopNav/TopNavMenu.tsx +7 -2
  518. package/src/TreeList/TreeList.doc.mjs +3 -3
  519. package/src/TreeList/TreeList.spec.md +123 -75
  520. package/src/TreeList/TreeList.test.tsx +29 -0
  521. package/src/TreeList/TreeList.tsx +3 -0
  522. package/src/TreeList/TreeListItem.tsx +15 -1
  523. package/src/TreeList/TreeListTypes.ts +11 -1
  524. package/src/Typeahead/BaseTypeahead.spec.md +4 -3
  525. package/src/Typeahead/BaseTypeahead.tsx +21 -7
  526. package/src/Typeahead/Typeahead.test.tsx +53 -0
  527. package/src/__tests__/PressedState.a11y.chromium.spec.ts +813 -0
  528. package/src/__tests__/pressState.ts +93 -0
  529. package/src/hooks/scrollKeyboardDelegation.test.ts +155 -0
  530. package/src/hooks/scrollKeyboardDelegation.ts +233 -0
  531. package/src/hooks/useClickableContainer.test.tsx +236 -0
  532. package/src/hooks/useClickableContainer.ts +20 -4
  533. package/src/hooks/useScrollableArea.doc.mjs +15 -3
  534. package/src/hooks/useScrollableArea.test.tsx +59 -1
  535. package/src/hooks/useScrollableArea.ts +34 -10
  536. package/src/index.ts +3 -0
  537. package/src/inputFontFloor.test.ts +106 -0
  538. package/src/tailwind-theme.css +0 -6
  539. package/src/theme/Theme.test.tsx +32 -0
  540. package/src/theme/declarationBoundary.test.ts +126 -0
  541. package/src/theme/declarationBoundary.ts +347 -0
  542. package/src/theme/derivedVarRegistry.test.ts +7 -0
  543. package/src/theme/derivedVarRegistry.ts +1 -0
  544. package/src/theme/generateThemeRules.test.ts +526 -1
  545. package/src/theme/generateThemeRules.ts +228 -50
  546. package/src/theme/tokenValueCompat.test.ts +4 -1
  547. package/src/utils/interactionOverlay.stylex.ts +20 -0
  548. package/src/utils/safeUrl.test.ts +88 -0
  549. package/src/utils/safeUrl.ts +85 -0
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  schema_version: 3
3
- template_version: 3
3
+ template_version: 5
4
4
  kind: component
5
5
  id: component:TreeList
6
- authority: draft
6
+ authority: current
7
7
  archive_reason: null
8
8
  superseded_by: null
9
- approved_by: null
10
- approved_at: null
9
+ approved_by: cixzhang
10
+ approved_at: 2026-09-20
11
11
  owners: [cixzhang]
12
- review_triggers: [behavior, theming, accessibility]
12
+ review_triggers: [public-api, behavior, theming, accessibility]
13
13
  verified_by:
14
14
  [
15
15
  packages/core/src/TreeList/TreeList.test.tsx,
@@ -26,27 +26,44 @@ architecture:
26
26
  architecture:public-component-api,
27
27
  ]
28
28
  contributing: []
29
- system_specs: [spec:AST-005/DEC-1]
29
+ system_specs: [spec:AST-002/DEC-1, spec:AST-005/DEC-1]
30
30
  ---
31
31
 
32
32
  # TreeList component contract
33
33
 
34
+ ## Contract at a glance
35
+
36
+ | Area | Contract |
37
+ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
38
+ | Public contract | Each `TreeListItemData` may carry the standard `className`, `style`, and `xstyle` styling inputs for its Item row. |
39
+ | Behavior | All supplied styling inputs compose on the same Item row box—the element that paints the row, owns its hover state, and contains its visible content. They do not target the outer semantic `<li>`. |
40
+ | End-user impact | A builder can reveal or style content for one row without causing every row in the tree to react. |
41
+ | Builder impact | The three standard styling mechanisms remain interchangeable parts of one row-styling seam. A builder may use one or combine them; no existing callsite must opt in. |
42
+ | Compatibility/readiness | The contract is additive and preserves default output. Its authority is current; implementation support may arrive separately, but the durable API is incomplete until all three mechanisms are supported on the same row. |
43
+ | Review checks | Reject an implementation that omits one mechanism from the durable API, sends the mechanisms to different elements, drops a supplied value, targets the semantic `<li>`, or moves the promised row target without an explicit compatibility decision. |
44
+ | Governing rules | [Public component API INV5–INV6](../../../../docs/architecture/public-component-api.md) and [AST-002 FR1, FR4, FR7–FR10, FR12, and DEC-1](../../../../docs/specs/AST-002/spec.md) govern admission, predictability, and composition of the component-local styling seam. |
45
+
46
+ This table is a review projection; the body below is authoritative.
47
+
34
48
  ## Intent
35
49
 
36
- TreeList presents hierarchical data as expandable tree rows. This draft records
37
- its current consumer anatomy, target ownership, delegated Icon glyph, and
38
- unreached stable parts without changing runtime behavior, styling, targets, or
39
- public API.
50
+ TreeList presents hierarchical data as expandable tree rows. It owns the stable
51
+ row boundary needed for one item's caller-supplied presentation or relational
52
+ styling to differ from its peers without exposing the semantic list container or
53
+ requiring product code to reconstruct TreeList behavior.
40
54
 
41
55
  ## Compatibility and migration
42
56
 
43
57
  - Released default preserved: `yes`
44
- - Compatibility class: additive documentation only; runtime, DOM, styling,
45
- targets, aliases, and public API remain unchanged
58
+ - Compatibility class: additive optional public API; no default rendering, DOM,
59
+ styling, or interaction changes when the inputs are absent
46
60
  - Controlled/uncontrolled behavior: unchanged
47
- - Migration decision: none
61
+ - Migration decision: none; existing callsites remain valid
48
62
 
49
- Consumer migration instructions belong in consumer docs and release notes.
63
+ The durable contract includes `className`, `style`, and `xstyle` even while
64
+ implementation work is staged. Current implementation availability does not narrow
65
+ the accepted API direction. Consumer syntax and release timing belong in
66
+ `TreeList.doc.mjs` and release notes.
50
67
 
51
68
  ## Ownership boundary
52
69
 
@@ -56,28 +73,37 @@ Consumer migration instructions belong in consumer docs and release notes.
56
73
  targets.
57
74
  - The stable Item description rendered below an Item label.
58
75
  - Hierarchical placement, indentation, expansion, selection, and tree semantics.
76
+ - One stable per-item styling seam on the Item row box.
59
77
 
60
78
  **Does not own / non-goals**
61
79
 
80
+ - The caller's style values, selector vocabulary, or authored class names.
81
+ - A styling seam on the semantic `<li>`, child group, or caller-provided slot
82
+ content.
62
83
  - The Chevron glyph artwork and Icon target — owned by `component:Icon`.
63
84
  - Header, Start content, and End content supplied through consumer slots — owned
64
85
  by the product callsite.
65
- - New targets for Item description or caller-provided slots — unresolved by this
66
- factual backfill.
86
+ - New targets for Item description or caller-provided slots.
67
87
 
68
88
  ## Public concepts
69
89
 
70
- No new public concept is introduced. Consumer data, props, slots, and usage
71
- remain documented in `TreeList.doc.mjs`.
90
+ | Concept | Closed values or states | Meaning | Availability by variant/orientation/state | Default | Owner | Stability | Invalid-value behavior |
91
+ | ---------------- | ------------------------------------- | ---------------------------------------------------------------------------------------------- | ----------------------------------------- | ------- | -------------------- | --------- | --------------------------------------------------------------- |
92
+ | Item row styling | `className`, `style`, and/or `xstyle` | Applies caller-supplied classes, inline styles, or StyleX styles to one item's stable row box. | Every rendered item row | Absent | `component:TreeList` | Stable | TypeScript rejects unsupported values; supplied inputs compose. |
93
+
94
+ The three mechanisms are one styling concept, not three separate feature tiers.
95
+ Supporting one does not justify omitting another from the durable contract.
72
96
 
73
97
  ## Behavioral and layout contract
74
98
 
75
- | ID | Candidate invariant | Basis | Draft review state |
76
- | --- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------- | ------------------------------------------------------------------------- |
77
- | FR1 | The current render contains one Tree list, one Item and Item label per rendered node, optional Header, Chevron, Item description, Start content, End content, and Guide parts, and delegated Chevron glyphs. | Current source, docs, and tests | Verified current behavior; no new behavior decided |
78
- | FR2 | Tree list, Item, Chevron, Item label, and Guide carry the five current `tree-list*` targets documented below. | Current source and target docs | Verified current inventory; focused placement coverage is partial |
79
- | FR3 | Chevron glyph delegates to Icon's `icon` target. Header, Start content, and End content are consumer-owned and have no TreeList target. | Current source and component docs | Verified current ownership; no target change |
80
- | FR4 | Item description is a stable library-rendered part below Item label and currently has no public target. It does not inherit through `tree-list-item-label`; both spans are siblings inside the row content. | Current source and target docs | Verified current reachability; long-term theming intent remains unsettled |
99
+ | ID | Invariant | Basis | Contract state |
100
+ | --- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------- |
101
+ | FR1 | The current render contains one Tree list, one Item and Item label per rendered node, optional Header, Chevron, Item description, Start content, End content, and Guide parts, and delegated Chevron glyphs. | Current source, docs, and tests | Current behavior |
102
+ | FR2 | Tree list, Item, Chevron, Item label, and Guide carry the five current `tree-list*` targets documented below. | Current source and target docs | Current behavior |
103
+ | FR3 | Chevron glyph delegates to Icon's `icon` target. Header, Start content, and End content are consumer-owned and have no TreeList target. | Current source and component docs | Current ownership |
104
+ | FR4 | Item description is a stable library-rendered part below Item label and currently has no public target. It does not inherit through `tree-list-item-label`; both spans are siblings inside the row content. | Current source and target docs | Current reachability gap; no new target is accepted |
105
+ | FR5 | `TreeListItemData` MUST admit `className`, `style`, and `xstyle` as one per-item styling seam. Every supplied value MUST compose on the same Item row box; an implementation MUST NOT treat current support for only one mechanism as authority to exclude the other two. | Owner decision; `architecture:public-component-api` INV5–INV6; `spec:AST-002/DEC-1` | Settled intent; implementation may be staged |
106
+ | FR6 | The Item row box is the logical element that paints the row, owns its hover state, and contains Start content, Item label and description, and End content. The styling seam MUST NOT move to the semantic `<li>` or another element without a compatibility decision. | Owner decision and the caller-owned per-row interaction boundary | Settled intent |
81
107
 
82
108
  ### Allowed variation
83
109
 
@@ -88,49 +114,57 @@ remain documented in `TreeList.doc.mjs`.
88
114
  TreeList target.
89
115
  - **AV3 — Delegated glyph.** Icon may change the Chevron glyph's internal element
90
116
  shape while preserving its own public contract.
117
+ - **AV4 — Row implementation.** The row's HTML tag and internal descendants may
118
+ change while the same logical row remains the target of all three styling
119
+ inputs and keeps the observable boundary in FR6.
91
120
 
92
121
  ### Representative states
93
122
 
94
- | State | Required invariant | Allowed variation |
95
- | ------------------------ | ----------------------------------------------------- | --------------------------------------------- |
96
- | Empty tree | Tree list remains; no Item instances render. | Optional Header content. |
97
- | Flat items | Each Item contains an Item label. | Description and consumer slots may be absent. |
98
- | Expandable item | Item may contain Chevron and delegated Chevron glyph. | Expanded or collapsed state. |
99
- | Nested `lineGuides` tree | Guide instances show parent-child relationships. | Count and position follow hierarchy. |
100
- | `noGuides` tree | Guide instances are absent; indentation remains. | All other anatomy remains unchanged. |
101
- | Described item | Item description renders below Item label. | Caller-provided description text. |
123
+ | State | Required invariant | Allowed variation |
124
+ | ------------------------ | ------------------------------------------------------------------------------------------- | --------------------------------------------- |
125
+ | Empty tree | Tree list remains; no Item instances render. | Optional Header content. |
126
+ | Flat items | Each Item contains an Item label. | Description and consumer slots may be absent. |
127
+ | Styled item | The supplied `className`, `style`, and `xstyle` values compose on only that item's row box. | Any subset of the three inputs may be absent. |
128
+ | Expandable item | Item may contain Chevron and delegated Chevron glyph. | Expanded or collapsed state. |
129
+ | Nested `lineGuides` tree | Guide instances show parent-child relationships. | Count and position follow hierarchy. |
130
+ | `noGuides` tree | Guide instances are absent; indentation remains. | All other anatomy remains unchanged. |
131
+ | Described item | Item description renders below Item label. | Caller-provided description text. |
102
132
 
103
133
  ### Transformation and precedence order
104
134
 
105
- - No new hierarchy, focus, expansion, layout, or styling precedence rule is
106
- introduced.
135
+ - **ORD1 — Item row styling.** Apply the Item target and component-owned row
136
+ styles, then consumer `xstyle`, then `className`, then inline `style`, using the
137
+ shared merge behavior. All three inputs combine; none replaces or suppresses
138
+ another input as a whole.
107
139
 
108
140
  ### Performance and resources
109
141
 
110
- - No new performance or resource rule is introduced.
142
+ - The per-item styling seam adds no measurement, listener, observer, or global
143
+ resource requirement.
111
144
 
112
145
  ## Accessibility contract
113
146
 
114
- This draft does not change or extend TreeList's current tree, treeitem, group,
115
- roving-focus, expansion, selection, disabled, or activation behavior.
147
+ The styling seam does not change TreeList's tree, treeitem, group, roving-focus,
148
+ expansion, selection, disabled, or activation behavior. Styling inputs MUST NOT
149
+ replace component-owned semantic or interaction props.
116
150
 
117
151
  ## Design relationships
118
152
 
119
- | Anatomy or state | Design requirement | Representation authority | Hierarchy role | Component contract |
120
- | ---------------- | -------------------------------------------------------------------- | ------------------------------ | ----------------- | ------------------ |
121
- | Tree list | Groups the hierarchical tree and owns its density and guide variant. | Current source and public docs | Supporting | FR1, FR2 |
122
- | Header | Visibly names the tree with caller-provided content. | Caller-supplied content | Prominent | FR1, FR3 |
123
- | Item | Paints one row and reflects density, selection, and disabled state. | Current source and public docs | Prominent | FR1, FR2 |
124
- | Chevron | Provides the expand and collapse control for an Item with children. | Current source and public docs | Supporting | FR1, FR2 |
125
- | Chevron glyph | Presents the current directional symbol inside Chevron. | `component:Icon` | Supporting | FR1, FR3 |
126
- | Item label | Presents the primary content that identifies an Item. | Current source and public docs | Prominent | FR1, FR2 |
127
- | Item description | Presents stable secondary text below Item label. | Current source and public docs | Supporting | FR1, FR4 |
128
- | Start content | Presents caller-provided content before Item label. | Caller-supplied content | Context-dependent | FR1, FR3 |
129
- | End content | Presents caller-provided content after Item label. | Caller-supplied content | Context-dependent | FR1, FR3 |
130
- | Guide | Paints a connector between related hierarchy levels. | Current source and public docs | Supporting | FR1, FR2 |
153
+ | Anatomy or state | Design requirement | Representation authority | Hierarchy role | Component contract |
154
+ | ---------------- | -------------------------------------------------------------------------------- | ------------------------------- | ----------------- | ------------------ |
155
+ | Tree list | Groups the hierarchical tree and owns its density and guide variant. | Current source and public docs | Supporting | FR1, FR2 |
156
+ | Header | Visibly names the tree with caller-provided content. | Caller-supplied content | Prominent | FR1, FR3 |
157
+ | Item | Paints one row and reflects density, selection, disabled state, and row styling. | Current source and owner choice | Prominent | FR1, FR2, FR5, FR6 |
158
+ | Chevron | Provides the expand and collapse control for an Item with children. | Current source and public docs | Supporting | FR1, FR2 |
159
+ | Chevron glyph | Presents the current directional symbol inside Chevron. | `component:Icon` | Supporting | FR1, FR3 |
160
+ | Item label | Presents the primary content that identifies an Item. | Current source and public docs | Prominent | FR1, FR2 |
161
+ | Item description | Presents stable secondary text below Item label. | Current source and public docs | Supporting | FR1, FR4 |
162
+ | Start content | Presents caller-provided content before Item label. | Caller-supplied content | Context-dependent | FR1, FR3 |
163
+ | End content | Presents caller-provided content after Item label. | Caller-supplied content | Context-dependent | FR1, FR3 |
164
+ | Guide | Paints a connector between related hierarchy levels. | Current source and public docs | Supporting | FR1, FR2 |
131
165
 
132
166
  Item description is stable TreeList-rendered anatomy, not consumer-owned slot
133
- structure. Its current lack of a target is observed reachability, not a decision
167
+ structure. Its current lack of a target is a reachability gap, not a decision
134
168
  that it must remain unthemeable. Header, Start content, and End content remain
135
169
  caller-owned even though TreeList positions their slot wrappers.
136
170
 
@@ -154,7 +188,7 @@ caller-owned even though TreeList positions their slot wrappers.
154
188
  "Item label": {"target": "tree-list-item-label"},
155
189
  "Item description": {
156
190
  "none": {
157
- "reason": "unsettled: No current public target reaches the stable Item description; future exposure still needs an owner decision"
191
+ "reason": "reachability-gap: No current public target reaches the stable Item description"
158
192
  }
159
193
  },
160
194
  "Start content": {
@@ -172,16 +206,17 @@ caller-owned even though TreeList positions their slot wrappers.
172
206
  ```
173
207
 
174
208
  The five local targets are current public seams. The Chevron glyph retains Icon
175
- ownership. Consumer-slot `none` dispositions are ownership boundaries; Item
176
- description's `none` disposition records a current audit gap and does not
177
- authorize a new target.
209
+ ownership. Consumer-slot `none` dispositions are ownership boundaries. Item
210
+ description's `none` disposition records current reachability only and does not
211
+ authorize or prohibit a future target.
178
212
 
179
213
  ## Family and system relationships
180
214
 
215
+ - `architecture:public-component-api` owns the shared `className`, `style`, and
216
+ `xstyle` composition order and preservation rules; this record admits that seam
217
+ for each TreeList Item row and fixes its target.
181
218
  - `architecture:component-theming-surface` owns anatomy qualification, target
182
219
  mapping, delegation, and factual `none` dispositions.
183
- - `architecture:public-component-api` owns the stable data, props, and slot
184
- surface; this documentation adds no API.
185
220
  - `architecture:interaction-modality` owns shared keyboard and pointer modality;
186
221
  TreeList continues to own its existing tree focus and activation behavior.
187
222
  - `family:navigation-destinations` owns the shared accept/block result for a
@@ -192,33 +227,46 @@ authorize a new target.
192
227
 
193
228
  ## Verification map
194
229
 
195
- | Contract | Verification | Representative states | Mutation or failure expectation | Audit section |
196
- | ------------------- | ----------------------------------------------------------------------------------------------- | -------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ |
197
- | FR1 | `TreeList.test.tsx` rendering, hierarchy, slot, and accessibility suites plus source inspection | Flat, nested, described, headed, and slotted items | Removing asserted Tree list, Header, Item, Chevron, Item label, Item description, Start content, End content, or Guide behavior fails existing role, content, hierarchy, or state assertions; Chevron glyph presence remains source-inspected only. | `audit:TreeList/anatomy` |
198
- | FR2 | `TreeList.test.tsx` and `themingTargets.test.ts` | Five local targets and their documented states | Removing or moving any current local target fails focused class assertions or the global inventory. | `audit:TreeList/theming` |
199
- | FR3 | Source inspection plus Icon public target metadata | Expandable rows and caller-provided slots | Existing focused tests do not assert the composed Icon instance; changing glyph or slot ownership requires this map and the relevant owner metadata to change. | `audit:TreeList/theming` |
200
- | FR4 | `TreeList.test.tsx` description rendering test and source inspection | Item with description | Removing description fails content coverage; adding a target requires an explicit map update. | `audit:TreeList/anatomy` |
201
- | Theming anatomy map | `scripts/check-knowledge.mjs` | Canonical anatomy and five current local targets | Missing, extra, prefixed, stale, or alias-backed mappings fail repository validation. | `audit:TreeList/theming` |
230
+ | Contract | Verification | Representative states | Mutation or failure expectation | Audit section |
231
+ | ------------------- | ------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ |
232
+ | FR1 | `TreeList.test.tsx` rendering, hierarchy, slot, and accessibility suites plus source inspection | Flat, nested, described, headed, and slotted items | Removing asserted Tree list, Header, Item, Chevron, Item label, Item description, Start content, End content, or Guide behavior fails existing role, content, hierarchy, or state assertions; Chevron glyph presence remains source-inspected only. | `audit:TreeList/anatomy` |
233
+ | FR2 | `TreeList.test.tsx` and `themingTargets.test.ts` | Five local targets and their documented states | Removing or moving any current local target fails focused class assertions or the global inventory. | `audit:TreeList/theming` |
234
+ | FR3 | Source inspection plus Icon public target metadata | Expandable rows and caller-provided slots | Existing focused tests do not assert the composed Icon instance; changing glyph or slot ownership requires this map and the relevant owner metadata to change. | `audit:TreeList/theming` |
235
+ | FR4 | `TreeList.test.tsx` description rendering test and source inspection | Item with description | Removing description fails content coverage; adding a target requires an explicit map update. | `audit:TreeList/anatomy` |
236
+ | FR5, FR6, ORD1 | Focused `TreeList.test.tsx` row-identity and styling-composition coverage, required with implementation | One input at a time; all three together; sibling rows | Dropping any mechanism, applying mechanisms to different elements, targeting the `<li>`, changing the merge order, or styling a sibling row fails. | `audit:TreeList/api` |
237
+ | Theming anatomy map | `scripts/check-knowledge.mjs` | Canonical anatomy and five current local targets | Missing, extra, duplicated, prefixed, or stale mappings fail repository validation. | `audit:TreeList/theming` |
202
238
 
203
- Focused target-placement assertions cover all five local targets: Tree list,
204
- Item, Chevron, Item label, and Guide. Existing tests do not assert the Icon
205
- instance that renders Chevron glyph.
239
+ Focused target-placement assertions cover all five local targets. Runtime support
240
+ and mutation-sensitive coverage for the item styling seam may land separately,
241
+ but every implementation is judged against the complete three-mechanism contract.
206
242
 
207
243
  ## Decision log
208
244
 
209
- None. This draft records current facts and introduces no component-local design,
210
- API, behavior, or theming decision.
245
+ ### DEC-1 — Each Item row supports the complete standard styling seam
246
+
247
+ **Reference:** `component:TreeList/DEC-1`
248
+ **Decider:** cixzhang, 2026-09-20
249
+
250
+ A caller may attach `className`, `style`, and `xstyle` to one TreeList item. All
251
+ three compose on the Item row box so per-row presentation and relational styling
252
+ can remain scoped to that row. `className` is intentionally supported, including
253
+ for a StyleX marker class; the standard `style` and `xstyle` mechanisms remain
254
+ part of the same durable seam even if implementation work arrives in stages.
255
+
256
+ Rejected: exposing only `className` because it is sufficient for the motivating
257
+ marker use case. That would make a temporary implementation slice define a
258
+ permanent exception to Astryx's standard styling contract.
259
+
260
+ Rejected: applying the seam to the outer semantic `<li>`. That element owns tree
261
+ semantics and child grouping, while the row box is the stable visual and hover
262
+ boundary callers need to address.
211
263
 
212
264
  ## Open questions
213
265
 
214
- - **OQ1 — Should Item description gain a stable public theming target?**
215
- (`human-api`) Its current lack of reachability is an audit gap, not settled
216
- intent.
217
- - **OQ2 — Should a focused test pin the delegated Chevron glyph's Icon
218
- instance?** (`checkable`) Its presence is currently source-inspected rather
219
- than asserted.
266
+ None.
220
267
 
221
268
  ## Content boundary
222
269
 
223
270
  This file does not duplicate consumer prop tables/examples, shared modality
224
- rules, current audit results, or implementation steps. It links to their owners.
271
+ rules, current audit results, implementation steps, or family/system rules. It
272
+ links to their owners.
@@ -12,6 +12,7 @@
12
12
  import {describe, it, expect, vi} from 'vitest';
13
13
  import {render, screen, fireEvent} from '@testing-library/react';
14
14
  import userEvent from '@testing-library/user-event';
15
+ import * as stylex from '@stylexjs/stylex';
15
16
  import {TreeList} from './TreeList';
16
17
  import type {TreeListItemData} from './TreeListTypes';
17
18
  import {defineTheme} from '../theme/defineTheme';
@@ -45,6 +46,10 @@ function collectCssText(): string {
45
46
  .join('\n');
46
47
  return out;
47
48
  }
49
+ const rowStyles = stylex.create({
50
+ custom: {opacity: 0.75},
51
+ });
52
+
48
53
  const simpleItems: TreeListItemData[] = [
49
54
  {id: 'a', label: 'Item A'},
50
55
  {id: 'b', label: 'Item B'},
@@ -458,6 +463,30 @@ describe('TreeList', () => {
458
463
  expect(screen.getByTestId('badge')).toBeInTheDocument();
459
464
  });
460
465
 
466
+ it('forwards xstyle, className, and style to an item row', () => {
467
+ const items: TreeListItemData[] = [
468
+ {
469
+ id: 'a',
470
+ label: 'Styled row',
471
+ xstyle: rowStyles.custom,
472
+ className: 'consumer-row',
473
+ style: {visibility: 'visible'},
474
+ },
475
+ ];
476
+ render(<TreeList items={items} />);
477
+
478
+ const row = screen
479
+ .getByText('Styled row')
480
+ .closest('li')!
481
+ .querySelector('.astryx-tree-list-item')!;
482
+ expect(row).toHaveClass('consumer-row');
483
+ expect(row.className).toContain(
484
+ stylex.props(rowStyles.custom).className!.split(' ')[0],
485
+ );
486
+ expect(row).toHaveStyle({visibility: 'visible'});
487
+ expect(row.getAttribute('style')).toContain('--_tree-indent');
488
+ });
489
+
461
490
  // ===========================================================================
462
491
  // Density
463
492
  // ===========================================================================
@@ -325,6 +325,9 @@ export function TreeList({
325
325
  description={item.description}
326
326
  startContent={item.startContent}
327
327
  endContent={item.endContent}
328
+ xstyle={item.xstyle}
329
+ className={item.className}
330
+ style={item.style}
328
331
  hasChildren={hasChildren}
329
332
  hasExpandableItems={hasExpandableItems}
330
333
  onClick={item.onClick}
@@ -292,6 +292,10 @@ export interface TreeListItemInternalProps {
292
292
  target?: string;
293
293
  isDisabled?: boolean;
294
294
  isSelected?: boolean;
295
+ /** Consumer styles for the row element. See `TreeListItemData`. */
296
+ xstyle?: stylex.StyleXStyles;
297
+ className?: string;
298
+ style?: React.CSSProperties;
295
299
  hasChildren: boolean;
296
300
  /**
297
301
  * Whether the tree contains at least one expandable item anywhere (i.e. a
@@ -339,6 +343,9 @@ export function TreeListItem({
339
343
  description,
340
344
  startContent,
341
345
  endContent,
346
+ xstyle,
347
+ className,
348
+ style,
342
349
  onClick,
343
350
  href,
344
351
  target,
@@ -589,15 +596,22 @@ export function TreeListItem({
589
596
  interactionOverlayStyles.backgroundImage,
590
597
  isDisabled && styles.disabled,
591
598
  isSelected && styles.selected,
599
+ xstyle,
592
600
  )
593
601
  : stylex.props(
594
602
  styles.contentWrapper,
595
603
  densityStyles[density],
596
604
  isDisabled && styles.disabled,
597
605
  isSelected && styles.selected,
606
+ xstyle,
598
607
  ),
608
+ // Consumer row props are merged last so useContainerReveal can
609
+ // publish both its classes and inline custom properties. Seed the
610
+ // private indent first, then preserve the standard inline-style
611
+ // precedence promised by the TreeList contract.
612
+ className,
613
+ {...indentStyle, ...style},
599
614
  )}
600
- style={indentStyle}
601
615
  onClick={handleClick}>
602
616
  {innerContent}
603
617
  </div>
@@ -11,7 +11,8 @@
11
11
  * - /packages/core/src/TreeList/index.ts
12
12
  */
13
13
 
14
- import type {ReactNode} from 'react';
14
+ import type {CSSProperties, ReactNode} from 'react';
15
+ import type {StyleXStyles} from '@stylexjs/stylex';
15
16
  import type {TreeListVariantMap} from './index';
16
17
 
17
18
  /** Spacing density for tree list items. */
@@ -62,4 +63,13 @@ export interface TreeListItemData {
62
63
 
63
64
  /** Whether the item is initially expanded. Only meaningful for items with children. */
64
65
  isExpanded?: boolean;
66
+
67
+ /** StyleX styles applied to the item's row element. */
68
+ xstyle?: StyleXStyles;
69
+
70
+ /** Class applied to the item's row element. */
71
+ className?: string;
72
+
73
+ /** Inline styles applied to the item's row element. */
74
+ style?: CSSProperties;
65
75
  }
@@ -98,7 +98,7 @@ Draft requirements identify their observational or current-authority basis.
98
98
  | --- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | ---------------------------------------------- |
99
99
  | FR1 | The input is controlled by internal query state while `value` is caller-controlled; selecting a result calls `onChange(item)`, clears query/results, closes the popup, and returns focus to the input. | Current source and tests | verified shipped behavior |
100
100
  | FR2 | Search starts only at the grapheme-count threshold, uses the configured debounce, and never presents an empty result for a query that was not searched. | Public API, current i18n character utility, tests | verified audit remediation |
101
- | FR3 | A newer query, selection, clear, or unmount invalidates stale asynchronous work. Escape hides the current popup but does not invalidate pending work, so a late response currently reopens it (retained violation). | Current source, focused retained-red probe, and tests | verified shipped behavior |
101
+ | FR3 | A newer query, selection, clear, source replacement, or unmount invalidates stale asynchronous work. Escape hides the current popup but does not invalidate pending work, so a late response currently reopens it (retained violation). | Current source, focused retained-red probe, and tests | verified shipped behavior |
102
102
  | FR4 | The popup is a named listbox whose result rows are options. A completed empty search renders one disabled option so the listbox retains a valid owned child. | APG combobox pattern, axe, tests | verified audit remediation |
103
103
  | FR5 | Arrow keys wrap the highlight; Home/End move to the first/last option; Enter selects; Escape and Tab hide the current popup; IME-owned key events do not activate combobox commands. Escape dismissal is not durable while source work remains pending (FR3). | Current source and tests | verified shipped behavior; Escape gap retained |
104
104
  | FR6 | Pending asynchronous source work sets `aria-busy` and renders one named Spinner unless the composed wrapper owns the busy indicator lane. | Current source, input-family FR7, tests | verified shipped behavior |
@@ -139,8 +139,9 @@ Draft requirements identify their observational or current-authority basis.
139
139
 
140
140
  ### Performance and resources
141
141
 
142
- - **PR1 — Search lifetime.** One generation counter rejects stale responses;
143
- debounce timers and optional source cancellation are cleared on replacement and
142
+ - **PR1 — Search lifetime.** One generation counter rejects stale responses,
143
+ including responses from a source that has since been replaced; debounce
144
+ timers and optional source cancellation are cleared on replacement and
144
145
  unmount.
145
146
 
146
147
  ## Accessibility contract
@@ -262,9 +262,14 @@ const styles = stylex.create({
262
262
  borderStyle: 'none',
263
263
  padding: 0,
264
264
  fontFamily: typographyVars['--font-family-body'],
265
+ // The 16px floor is iOS-only: iOS Safari zooms the page when a focused
266
+ // control sits under 16px, and only iOS WebKit implements
267
+ // -webkit-touch-callout to key the coarse-pointer floor to it.
265
268
  fontSize: {
266
269
  default: typeScaleVars['--text-body-size'],
267
- '@media (pointer: coarse)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
270
+ '@media (pointer: coarse)': {
271
+ '@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
272
+ },
268
273
  },
269
274
  lineHeight: typeScaleVars['--text-body-leading'],
270
275
  color: colorVars['--color-text-primary'],
@@ -533,9 +538,9 @@ export const BaseTypeahead = function BaseTypeahead<T extends SearchableItem>({
533
538
  // Debounce ref
534
539
  const searchTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
535
540
 
536
- // Monotonic counter incremented on selection and query-clear. Async
537
- // searches that resolve after a selection compare their captured
538
- // generation to the current value and discard stale results.
541
+ // Monotonic counter incremented on selection, query-clear, and source
542
+ // replacement. Async searches that resolve afterwards compare their
543
+ // captured generation to the current value and discard stale results.
539
544
  const searchGenRef = useRef(0);
540
545
  // The generation at which results were last populated. handleFocus
541
546
  // compares this to searchGenRef — if they differ, the cached results
@@ -543,6 +548,15 @@ export const BaseTypeahead = function BaseTypeahead<T extends SearchableItem>({
543
548
  // be re-shown.
544
549
  const resultsGenRef = useRef(0);
545
550
 
551
+ // Results still arriving from a replaced source must not land in the new
552
+ // one's menu.
553
+ const prevSearchSourceRef = useRef(searchSource);
554
+ if (prevSearchSourceRef.current !== searchSource) {
555
+ prevSearchSourceRef.current.cancel?.();
556
+ prevSearchSourceRef.current = searchSource;
557
+ searchGenRef.current++;
558
+ }
559
+
546
560
  // Layer for dropdown
547
561
  const handleLayerShow = useCallback(() => {
548
562
  onOpenChange?.(true);
@@ -987,15 +1001,15 @@ export const BaseTypeahead = function BaseTypeahead<T extends SearchableItem>({
987
1001
  const selectedKey =
988
1002
  value == null ? null : getKey(value.id, () => results.indexOf(value));
989
1003
 
990
- // Cleanup timeout and cancel in-flight searches on unmount
1004
+ // Unmount: clear the pending debounce and cancel in-flight work.
991
1005
  useEffect(() => {
992
1006
  return () => {
993
1007
  if (searchTimeoutRef.current) {
994
1008
  clearTimeout(searchTimeoutRef.current);
995
1009
  }
996
- searchSource.cancel?.();
1010
+ prevSearchSourceRef.current.cancel?.();
997
1011
  };
998
- }, [searchSource]);
1012
+ }, []);
999
1013
 
1000
1014
  return (
1001
1015
  <>
@@ -574,6 +574,59 @@ describe('Typeahead', () => {
574
574
  expect(screen.getByText('Apple')).toBeInTheDocument();
575
575
  expect(screen.queryByText('Avocado')).not.toBeInTheDocument();
576
576
  });
577
+
578
+ it('discards a response from a source that was replaced while it was in flight', async () => {
579
+ let resolveOld: ((items: SearchableItem[]) => void) | null = null;
580
+ const oldSource: SearchSource = {
581
+ search: async () =>
582
+ new Promise<SearchableItem[]>(resolve => {
583
+ resolveOld = resolve;
584
+ }),
585
+ bootstrap: () => [],
586
+ };
587
+ const newSource: SearchSource = {
588
+ search: () => [{id: 'banana', label: 'Banana'}],
589
+ bootstrap: () => [],
590
+ };
591
+
592
+ const {rerender} = render(
593
+ <Typeahead
594
+ label="Fruit"
595
+ searchSource={oldSource}
596
+ value={null}
597
+ onChange={() => {}}
598
+ debounceMs={0}
599
+ />,
600
+ );
601
+
602
+ const input = screen.getByRole('combobox');
603
+ fireEvent.change(input, {target: {value: 'a'}});
604
+ await waitFor(() => expect(resolveOld).not.toBeNull());
605
+
606
+ // The source is swapped while the old search is still pending and no
607
+ // new query is typed. The stale response must not populate a menu that
608
+ // now reads from a different source.
609
+ rerender(
610
+ <Typeahead
611
+ label="Fruit"
612
+ searchSource={newSource}
613
+ value={null}
614
+ onChange={() => {}}
615
+ debounceMs={0}
616
+ />,
617
+ );
618
+
619
+ await act(async () => {
620
+ resolveOld!([{id: 'apple', label: 'Apple'}]);
621
+ });
622
+ expect(screen.queryByText('Apple')).not.toBeInTheDocument();
623
+
624
+ // Work started against the new source still lands normally.
625
+ fireEvent.change(input, {target: {value: 'ba'}});
626
+ await waitFor(() =>
627
+ expect(screen.getByText('Banana')).toBeInTheDocument(),
628
+ );
629
+ });
577
630
  });
578
631
 
579
632
  it('renders with label', () => {