@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.
- package/CHANGELOG.md +81 -0
- package/dist/BottomSheet/BottomSheet.d.ts +1 -1
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +3 -1
- package/dist/BottomSheet/BottomSheetPanel.d.ts +7 -5
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +56 -19
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +13 -28
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +10 -5
- package/dist/Chat/ChatComposerDrawer.d.ts +19 -5
- package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
- package/dist/Chat/ChatComposerDrawer.js +48 -23
- package/dist/Chat/ChatComposerInput.d.ts +11 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +63 -16
- package/dist/Chat/ChatDictationButton.d.ts +3 -2
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +6 -4
- package/dist/Chat/ChatLayout.d.ts +19 -0
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +19 -0
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +44 -34
- package/dist/Chat/ChatMessageBubble.d.ts +2 -0
- package/dist/Chat/ChatMessageBubble.d.ts.map +1 -1
- package/dist/Chat/ChatMessageBubble.js +5 -3
- package/dist/Chat/ChatMessageList.d.ts +2 -1
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +4 -3
- package/dist/Chat/ChatMessageMetadata.d.ts +5 -4
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatMessageMetadata.js +12 -9
- package/dist/Chat/ChatSendButton.js +1 -1
- package/dist/Chat/index.d.ts +1 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +12 -2
- package/dist/Citation/Citation.d.ts +1 -1
- package/dist/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +3 -2
- package/dist/CodeBlock/highlightRanges.d.ts.map +1 -1
- package/dist/CodeBlock/highlightRanges.js +14 -3
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +6 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +1 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +1 -1
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +4 -4
- package/dist/DateInput/NativeDateField.d.ts.map +1 -1
- package/dist/DateInput/NativeDateField.js +16 -16
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +2 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +4 -4
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +8 -8
- package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
- package/dist/DateTimeInput/TouchDateTimeField.js +4 -4
- package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts +9 -3
- package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts.map +1 -1
- package/dist/DateTimeInput/nativePickerSegmentStyles.js +3 -3
- package/dist/Dialog/DialogHeader.d.ts +8 -1
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +13 -4
- package/dist/Field/InputClearButton.d.ts +4 -2
- package/dist/Field/InputClearButton.d.ts.map +1 -1
- package/dist/Field/InputClearButton.js +4 -2
- package/dist/Field/PanelSearchInput.d.ts.map +1 -1
- package/dist/Field/PanelSearchInput.js +1 -1
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +7 -7
- package/dist/Icon/Icon.d.ts +6 -31
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +8 -71
- package/dist/Icon/IconDefaultSizeContext.d.ts +4 -0
- package/dist/Icon/IconDefaultSizeContext.d.ts.map +1 -0
- package/dist/Icon/IconDefaultSizeContext.js +18 -0
- package/dist/Icon/IconSize.stylex.d.ts +65 -0
- package/dist/Icon/IconSize.stylex.d.ts.map +1 -0
- package/dist/Icon/IconSize.stylex.js +75 -0
- package/dist/Item/Item.d.ts +1 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +4 -3
- package/dist/Kbd/Kbd.d.ts +5 -3
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +36 -42
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +6 -2
- package/dist/Link/useLinkComponent.d.ts +5 -15
- package/dist/Link/useLinkComponent.d.ts.map +1 -1
- package/dist/Link/useLinkComponent.js +34 -51
- package/dist/List/List.d.ts +19 -1
- package/dist/List/List.d.ts.map +1 -1
- package/dist/List/List.js +9 -2
- package/dist/List/ListContext.d.ts +1 -0
- package/dist/List/ListContext.d.ts.map +1 -1
- package/dist/List/ListContext.js +2 -1
- package/dist/List/ListItem.d.ts +1 -1
- package/dist/List/ListItem.d.ts.map +1 -1
- package/dist/List/ListItem.js +9 -2
- package/dist/Markdown/Markdown.d.ts +8 -2
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.fr23.bench.d.ts +2 -0
- package/dist/Markdown/Markdown.fr23.bench.d.ts.map +1 -0
- package/dist/Markdown/Markdown.fr23.bench.js +150 -0
- package/dist/Markdown/Markdown.fr23.sampling.d.ts +2 -0
- package/dist/Markdown/Markdown.fr23.sampling.d.ts.map +1 -0
- package/dist/Markdown/Markdown.fr23.sampling.js +43 -0
- package/dist/Markdown/Markdown.js +262 -109
- package/dist/Markdown/ast.d.ts +162 -0
- package/dist/Markdown/ast.d.ts.map +1 -0
- package/dist/Markdown/ast.js +74 -0
- package/dist/Markdown/index.d.ts +5 -3
- package/dist/Markdown/index.d.ts.map +1 -1
- package/dist/Markdown/index.js +3 -2
- package/dist/Markdown/parser/index.d.ts +10 -0
- package/dist/Markdown/parser/index.d.ts.map +1 -0
- package/dist/Markdown/parser/index.js +10 -0
- package/dist/Markdown/parser.d.ts +126 -58
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +716 -167
- package/dist/Markdown/plugins/frontmatter.d.ts +32 -0
- package/dist/Markdown/plugins/frontmatter.d.ts.map +1 -0
- package/dist/Markdown/plugins/frontmatter.js +132 -0
- package/dist/Markdown/plugins/index.d.ts +17 -0
- package/dist/Markdown/plugins/index.d.ts.map +1 -0
- package/dist/Markdown/plugins/index.js +14 -0
- package/dist/Markdown/plugins/protocol.d.ts +191 -0
- package/dist/Markdown/plugins/protocol.d.ts.map +1 -0
- package/dist/Markdown/plugins/protocol.js +957 -0
- package/dist/Markdown/plugins/semanticFence.d.ts +36 -0
- package/dist/Markdown/plugins/semanticFence.d.ts.map +1 -0
- package/dist/Markdown/plugins/semanticFence.js +213 -0
- package/dist/Markdown/plugins/softBreaks.d.ts +3 -0
- package/dist/Markdown/plugins/softBreaks.d.ts.map +1 -0
- package/dist/Markdown/plugins/softBreaks.js +172 -0
- package/dist/Markdown/plugins/sourceDecoration.d.ts +76 -0
- package/dist/Markdown/plugins/sourceDecoration.d.ts.map +1 -0
- package/dist/Markdown/plugins/sourceDecoration.js +393 -0
- package/dist/Markdown/plugins/textTransform.d.ts +30 -0
- package/dist/Markdown/plugins/textTransform.d.ts.map +1 -0
- package/dist/Markdown/plugins/textTransform.js +374 -0
- package/dist/Markdown/remark.d.ts +196 -0
- package/dist/Markdown/remark.d.ts.map +1 -0
- package/dist/Markdown/remark.js +1062 -0
- package/dist/Markdown/url.d.ts +6 -0
- package/dist/Markdown/url.d.ts.map +1 -0
- package/dist/Markdown/url.js +31 -0
- package/dist/Markdown/utils.d.ts +4 -2
- package/dist/Markdown/utils.d.ts.map +1 -1
- package/dist/Markdown/utils.js +2 -1
- package/dist/MetadataList/MetadataList.js +3 -3
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +4 -4
- package/dist/Outline/index.d.ts +1 -0
- package/dist/Outline/index.d.ts.map +1 -1
- package/dist/Outline/parseOutlineFromMarkdown.d.ts +7 -1
- package/dist/Outline/parseOutlineFromMarkdown.d.ts.map +1 -1
- package/dist/Outline/parseOutlineFromMarkdown.js +14 -8
- package/dist/Outline/useOutlineFromMarkdown.d.ts +3 -1
- package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
- package/dist/Outline/useOutlineFromMarkdown.js +8 -3
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +46 -30
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +5 -0
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +36 -31
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +13 -1
- package/dist/ScrollableArea/ScrollableArea.d.ts +1 -0
- package/dist/ScrollableArea/ScrollableArea.d.ts.map +1 -1
- package/dist/ScrollableArea/ScrollableArea.js +1 -0
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +5 -5
- package/dist/Selector/Selector.d.ts +9 -7
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +16 -7
- package/dist/SideNav/SideNav.d.ts +2 -1
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +9 -3
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +28 -12
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +23 -7
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +11 -0
- package/dist/TabList/Tab.d.ts +1 -1
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +20 -7
- package/dist/Table/Table.d.ts +1 -0
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +29 -13
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +1 -1
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +2 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +4 -4
- package/dist/Timer/Timer.d.ts +49 -0
- package/dist/Timer/Timer.d.ts.map +1 -0
- package/dist/Timer/Timer.js +158 -0
- package/dist/Timer/index.d.ts +9 -0
- package/dist/Timer/index.d.ts.map +1 -0
- package/dist/Timer/index.js +10 -0
- package/dist/ToggleButton/ToggleButton.d.ts +9 -6
- package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButton.js +15 -27
- package/dist/TopNav/TopNavMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +3 -2
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +3 -0
- package/dist/TreeList/TreeListItem.d.ts +6 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +12 -2
- package/dist/TreeList/TreeListTypes.d.ts +8 -1
- package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +16 -7
- package/dist/astryx.css +27 -11
- package/dist/hooks/scrollKeyboardDelegation.d.ts +3 -0
- package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -0
- package/dist/hooks/scrollKeyboardDelegation.js +146 -0
- package/dist/hooks/useClickableContainer.d.ts +10 -1
- package/dist/hooks/useClickableContainer.d.ts.map +1 -1
- package/dist/hooks/useClickableContainer.js +15 -4
- package/dist/hooks/useScrollableArea.d.ts +6 -2
- package/dist/hooks/useScrollableArea.d.ts.map +1 -1
- package/dist/hooks/useScrollableArea.js +17 -5
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/theme/declarationBoundary.d.ts +17 -0
- package/dist/theme/declarationBoundary.d.ts.map +1 -0
- package/dist/theme/declarationBoundary.js +343 -0
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +4 -0
- package/dist/theme/generateThemeRules.d.ts +13 -7
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +140 -34
- package/dist/utils/interactionOverlay.stylex.d.ts +8 -0
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +9 -0
- package/dist/utils/safeUrl.d.ts +11 -0
- package/dist/utils/safeUrl.d.ts.map +1 -0
- package/dist/utils/safeUrl.js +78 -0
- package/locales/af-ZA.json +530 -1
- package/locales/ar-SA.json +490 -1
- package/locales/ca-ES.json +514 -1
- package/locales/cs-CZ.json +498 -1
- package/locales/da-DK.json +522 -1
- package/locales/de-DE.json +522 -1
- package/locales/el-GR.json +498 -1
- package/locales/es-ES.json +510 -1
- package/locales/fi-FI.json +498 -1
- package/locales/fr-FR.json +534 -1
- package/locales/he-IL.json +498 -1
- package/locales/hu-HU.json +498 -1
- package/locales/it-IT.json +510 -1
- package/locales/ja-JP.json +490 -1
- package/locales/ko-KR.json +498 -1
- package/locales/nl-NL.json +534 -1
- package/locales/no-NO.json +510 -1
- package/locales/pl-PL.json +506 -1
- package/locales/pt-BR.json +506 -1
- package/locales/pt-PT.json +506 -1
- package/locales/ro-RO.json +506 -1
- package/locales/ru-RU.json +498 -1
- package/locales/sr-SP.json +498 -1
- package/locales/sv-SE.json +502 -1
- package/locales/tr-TR.json +498 -1
- package/locales/uk-UA.json +498 -1
- package/locales/vi-VN.json +502 -1
- package/locales/zh-CN.json +490 -1
- package/locales/zh-TW.json +490 -1
- package/package.json +24 -4
- package/src/BottomSheet/BottomSheet.doc.mjs +8 -1
- package/src/BottomSheet/BottomSheet.spec.md +46 -20
- package/src/BottomSheet/BottomSheet.test.tsx +6 -3
- package/src/BottomSheet/BottomSheet.tsx +3 -1
- package/src/BottomSheet/BottomSheetKeyboard.test.tsx +195 -0
- package/src/BottomSheet/BottomSheetPanel.test.tsx +11 -1
- package/src/BottomSheet/BottomSheetPanel.tsx +49 -16
- package/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts +344 -0
- package/src/Button/Button.doc.mjs +5 -5
- package/src/Button/Button.tsx +15 -13
- package/src/Button/__tests__/Button.a11y.chromium.spec.ts +17 -1
- package/src/Button/__tests__/Button.a11y.known-failures.ts +0 -29
- package/src/Button/__tests__/Button.a11y.renders.tsx +9 -2
- package/src/Button/__tests__/Button.a11y.states.ts +9 -0
- package/src/Chat/ChatComposer.doc.mjs +14 -0
- package/src/Chat/ChatComposer.spec.md +230 -0
- package/src/Chat/ChatComposer.test.tsx +57 -0
- package/src/Chat/ChatComposer.tsx +21 -9
- package/src/Chat/ChatComposerDrawer.doc.mjs +63 -5
- package/src/Chat/ChatComposerDrawer.spec.md +267 -0
- package/src/Chat/ChatComposerDrawer.test.tsx +81 -12
- package/src/Chat/ChatComposerDrawer.tsx +38 -9
- package/src/Chat/ChatComposerInput.doc.mjs +114 -26
- package/src/Chat/ChatComposerInput.spec.md +185 -0
- package/src/Chat/ChatComposerInput.test.tsx +113 -3
- package/src/Chat/ChatComposerInput.tsx +78 -13
- package/src/Chat/ChatComposerTokenElement.spec.md +152 -0
- package/src/Chat/ChatComposerTokenElement.test.tsx +85 -0
- package/src/Chat/ChatDictationButton.doc.mjs +3 -3
- package/src/Chat/ChatDictationButton.spec.md +160 -0
- package/src/Chat/ChatDictationButton.test.tsx +92 -27
- package/src/Chat/ChatDictationButton.tsx +8 -6
- package/src/Chat/ChatLayout.doc.mjs +12 -4
- package/src/Chat/ChatLayout.spec.md +271 -0
- package/src/Chat/ChatLayout.test.tsx +28 -0
- package/src/Chat/ChatLayout.tsx +19 -0
- package/src/Chat/ChatLayoutScrollButton.spec.md +338 -0
- package/src/Chat/ChatLayoutScrollButton.test.tsx +31 -0
- package/src/Chat/ChatLayoutScrollButton.tsx +31 -14
- package/src/Chat/ChatMessageBubble.doc.mjs +28 -15
- package/src/Chat/ChatMessageBubble.spec.md +263 -0
- package/src/Chat/ChatMessageBubble.test.tsx +93 -0
- package/src/Chat/ChatMessageBubble.tsx +8 -3
- package/src/Chat/ChatMessageList.spec.md +222 -0
- package/src/Chat/ChatMessageList.test.tsx +64 -2
- package/src/Chat/ChatMessageList.tsx +4 -3
- package/src/Chat/ChatMessageMetadata.doc.mjs +57 -3
- package/src/Chat/ChatMessageMetadata.spec.md +220 -0
- package/src/Chat/ChatMessageMetadata.test.tsx +34 -0
- package/src/Chat/ChatMessageMetadata.tsx +13 -13
- package/src/Chat/ChatSendButton.test.tsx +1 -4
- package/src/Chat/ChatSendButton.tsx +1 -1
- package/src/Chat/__tests__/ChatLayoutScrollButton.a11y.chromium.spec.ts +514 -0
- package/src/Chat/__tests__/ChatLayoutScrollButtonSurface.a11y.chromium.spec.ts +740 -0
- package/src/Chat/__tests__/ChatMessageBubble.a11y.chromium.spec.ts +457 -0
- package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.test.ts +91 -0
- package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.ts +91 -0
- package/src/Chat/__tests__/ChatMessageList.a11y.chromium.spec.ts +456 -0
- package/src/Chat/__tests__/ChatMessageMetadata.a11y.chromium.spec.ts +413 -0
- package/src/Chat/index.ts +1 -0
- package/src/CheckboxInput/CheckboxInput.doc.mjs +11 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +34 -0
- package/src/CheckboxInput/CheckboxInput.tsx +21 -1
- package/src/Citation/Citation.doc.mjs +2 -2
- package/src/Citation/Citation.test.tsx +17 -0
- package/src/Citation/Citation.tsx +4 -2
- package/src/ClickableCard/ClickableCard.doc.mjs +2 -2
- package/src/ClickableCard/ClickableCard.test.tsx +102 -5
- package/src/CodeBlock/highlightRanges.test.ts +143 -1
- package/src/CodeBlock/highlightRanges.ts +15 -5
- package/src/Collapsible/Collapsible.doc.mjs +11 -0
- package/src/Collapsible/Collapsible.test.tsx +21 -0
- package/src/Collapsible/Collapsible.tsx +5 -0
- package/src/CommandPalette/CommandPaletteInput.tsx +6 -1
- package/src/ComplexSelector/ComplexSelector.tsx +6 -1
- package/src/DateInput/DateInput.tsx +6 -1
- package/src/DateInput/NativeDateField.tsx +24 -8
- package/src/DateInput/TouchDateField.tsx +6 -2
- package/src/DateRangeInput/DateRangeInput.tsx +6 -1
- package/src/DateTimeInput/DateTimeInput.tsx +6 -1
- package/src/DateTimeInput/TouchDateTimeField.tsx +6 -1
- package/src/DateTimeInput/nativePickerSegmentStyles.ts +24 -8
- package/src/Dialog/Dialog.doc.mjs +2 -0
- package/src/Dialog/DialogHeader.doc.mjs +22 -0
- package/src/Dialog/DialogHeader.test.tsx +167 -3
- package/src/Dialog/DialogHeader.tsx +37 -6
- package/src/Dialog/modules/DialogHeader.spec.md +101 -42
- package/src/DropdownMenu/DropdownMenu.test.tsx +5 -2
- package/src/Field/InputClearButton.test.tsx +17 -3
- package/src/Field/InputClearButton.tsx +5 -2
- package/src/Field/PanelSearchInput.tsx +5 -2
- package/src/FieldStatus/__tests__/StatusMessage.a11y.states.ts +1 -1
- package/src/FileInput/FileInput.tsx +11 -2
- package/src/Icon/Icon.doc.mjs +7 -5
- package/src/Icon/Icon.spec.md +81 -40
- package/src/Icon/Icon.test.tsx +6 -3
- package/src/Icon/Icon.tsx +20 -68
- package/src/Icon/IconDefaultSizeContext.ts +23 -0
- package/src/Icon/IconSize.stylex.ts +70 -0
- package/src/IconButton/IconButton.doc.mjs +3 -3
- package/src/IconButton/IconButton.test.tsx +40 -0
- package/src/Item/Item.doc.mjs +6 -2
- package/src/Item/Item.tsx +9 -3
- package/src/Kbd/Kbd.doc.mjs +3 -3
- package/src/Kbd/Kbd.test.tsx +57 -1
- package/src/Kbd/Kbd.tsx +57 -37
- package/src/Layout/LayoutFooter.doc.mjs +17 -0
- package/src/Link/Link.doc.mjs +17 -4
- package/src/Link/Link.test.tsx +24 -0
- package/src/Link/Link.tsx +5 -0
- package/src/Link/LinkProvider.doc.mjs +2 -2
- package/src/Link/__tests__/Link.navigation.a11y.chromium.spec.ts +261 -0
- package/src/Link/useLinkComponent.test.tsx +333 -0
- package/src/Link/useLinkComponent.ts +29 -57
- package/src/List/List.doc.mjs +6 -0
- package/src/List/List.spec.md +200 -0
- package/src/List/List.test.tsx +117 -1
- package/src/List/List.tsx +22 -2
- package/src/List/ListContext.tsx +3 -1
- package/src/List/ListItem.doc.mjs +2 -2
- package/src/List/ListItem.source-build.test.mjs +41 -0
- package/src/List/ListItem.tsx +26 -2
- package/src/Markdown/Markdown.doc.mjs +300 -2
- package/src/Markdown/Markdown.fr23.bench.ts +174 -0
- package/src/Markdown/Markdown.fr23.perf.test.ts +249 -0
- package/src/Markdown/Markdown.fr23.sampling.ts +49 -0
- package/src/Markdown/Markdown.helpers.perf.test.ts +489 -0
- package/src/Markdown/Markdown.public.test.ts +130 -3
- package/src/Markdown/Markdown.renderBoundary.test.tsx +72 -0
- package/src/Markdown/Markdown.spec.md +203 -45
- package/src/Markdown/Markdown.test.tsx +63 -0
- package/src/Markdown/Markdown.tsx +414 -135
- package/src/Markdown/ast.test.ts +307 -0
- package/src/Markdown/ast.ts +337 -0
- package/src/Markdown/incremental.test.ts +12 -0
- package/src/Markdown/index.ts +37 -1
- package/src/Markdown/modules/remark.spec.md +269 -0
- package/src/Markdown/modules/softBreaks.spec.md +137 -0
- package/src/Markdown/parser/index.ts +64 -0
- package/src/Markdown/parser.public.test.ts +103 -0
- package/src/Markdown/parser.test.ts +20 -0
- package/src/Markdown/parser.ts +1180 -235
- package/src/Markdown/plugins/frontmatter.test.tsx +125 -0
- package/src/Markdown/plugins/frontmatter.ts +198 -0
- package/src/Markdown/plugins/index.ts +54 -0
- package/src/Markdown/plugins/protocol.test.tsx +1022 -0
- package/src/Markdown/plugins/protocol.ts +1618 -0
- package/src/Markdown/plugins/semanticFence.test.tsx +546 -0
- package/src/Markdown/plugins/semanticFence.ts +424 -0
- package/src/Markdown/plugins/softBreaks.test.tsx +172 -0
- package/src/Markdown/plugins/softBreaks.ts +169 -0
- package/src/Markdown/plugins/sourceDecoration.test.tsx +799 -0
- package/src/Markdown/plugins/sourceDecoration.ts +539 -0
- package/src/Markdown/plugins/textTransform.test.ts +467 -0
- package/src/Markdown/plugins/textTransform.ts +554 -0
- package/src/Markdown/remark.test.tsx +1877 -0
- package/src/Markdown/remark.ts +1574 -0
- package/src/Markdown/url.ts +36 -0
- package/src/Markdown/utils.ts +13 -1
- package/src/MetadataList/MetadataList.test.tsx +4 -2
- package/src/MetadataList/MetadataList.tsx +3 -3
- package/src/MultiSelector/MultiSelector.test.tsx +1 -35
- package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +128 -0
- package/src/NumberInput/NumberInput.tsx +6 -1
- package/src/Outline/Outline.doc.mjs +7 -5
- package/src/Outline/Outline.spec.md +1 -1
- package/src/Outline/index.ts +1 -0
- package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +142 -0
- package/src/Outline/parseOutlineFromMarkdown.ts +40 -10
- package/src/Outline/useOutlineFromMarkdown.ts +15 -3
- package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +150 -1
- package/src/PowerSearch/PowerSearchEditPopover.tsx +51 -28
- package/src/PowerSearch/PowerSearchValueEditor.test.tsx +51 -0
- package/src/PowerSearch/PowerSearchValueEditor.tsx +4 -0
- package/src/ProgressBar/ProgressBar.test.tsx +29 -11
- package/src/ProgressBar/ProgressBar.tsx +59 -72
- package/src/RadioList/RadioList.doc.mjs +11 -0
- package/src/RadioList/RadioList.test.tsx +32 -0
- package/src/RadioList/RadioListItem.tsx +25 -1
- package/src/ScrollableArea/ScrollableArea.tsx +1 -0
- package/src/ScrollableArea/modules/useScrollableArea.spec.md +50 -22
- package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
- package/src/SegmentedControl/SegmentedControl.test.tsx +31 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +6 -9
- package/src/Selector/Selector.doc.mjs +2 -2
- package/src/Selector/Selector.spec.md +51 -49
- package/src/Selector/Selector.test.tsx +61 -55
- package/src/Selector/Selector.tsx +34 -15
- package/src/Selector/__tests__/Listbox.a11y.chromium.spec.ts +130 -0
- package/src/Selector/__tests__/Listbox.a11y.dom.ts +38 -0
- package/src/Selector/__tests__/Listbox.a11y.inventory.test.ts +63 -0
- package/src/Selector/__tests__/Listbox.a11y.known-failures.ts +37 -0
- package/src/Selector/__tests__/Listbox.a11y.states.ts +232 -0
- package/src/Selector/__tests__/Selector.a11y.chromium.spec.ts +45 -0
- package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +121 -0
- package/src/SideNav/SideNav.doc.mjs +1 -1
- package/src/SideNav/SideNav.test.tsx +10 -0
- package/src/SideNav/SideNav.tsx +14 -2
- package/src/Slider/Slider.doc.mjs +17 -3
- package/src/Slider/Slider.test.tsx +221 -0
- package/src/Slider/Slider.tsx +40 -9
- package/src/Spinner/Spinner.test.tsx +4 -0
- package/src/Spinner/Spinner.tsx +31 -18
- package/src/Switch/Switch.doc.mjs +11 -0
- package/src/Switch/Switch.test.tsx +16 -0
- package/src/Switch/Switch.tsx +28 -0
- package/src/TabList/Tab.tsx +35 -7
- package/src/TabList/TabList.doc.mjs +11 -0
- package/src/TabList/TabList.spec.md +204 -0
- package/src/TabList/TabList.test.tsx +66 -0
- package/src/TabList/__tests__/Tabs.a11y.known-failures.ts +1 -34
- package/src/Table/Table.doc.mjs +1 -1
- package/src/Table/Table.spec.md +54 -40
- package/src/Table/Table.test.tsx +83 -10
- package/src/Table/Table.tsx +30 -22
- package/src/Table/__tests__/TableScroll.a11y.chromium.spec.ts +137 -0
- package/src/TextArea/TextArea.tsx +6 -1
- package/src/TextInput/TextInput.test.tsx +20 -1
- package/src/TextInput/TextInput.tsx +6 -1
- package/src/TimeInput/TimeInput.tsx +6 -1
- package/src/Timer/Timer.doc.mjs +183 -0
- package/src/Timer/Timer.spec.md +215 -0
- package/src/Timer/Timer.test.tsx +302 -0
- package/src/Timer/Timer.tsx +258 -0
- package/src/Timer/index.ts +11 -0
- package/src/ToggleButton/ToggleButton.doc.mjs +3 -3
- package/src/ToggleButton/ToggleButton.test.tsx +299 -4
- package/src/ToggleButton/ToggleButton.tsx +26 -33
- package/src/ToggleButton/ToggleButtonGroup.doc.mjs +3 -3
- package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +209 -0
- package/src/Token/Token.doc.mjs +2 -2
- package/src/Tokenizer/Tokenizer.spec.md +142 -75
- package/src/TopNav/TopNavMenu.doc.mjs +2 -2
- package/src/TopNav/TopNavMenu.test.tsx +30 -0
- package/src/TopNav/TopNavMenu.tsx +7 -2
- package/src/TreeList/TreeList.doc.mjs +3 -3
- package/src/TreeList/TreeList.spec.md +123 -75
- package/src/TreeList/TreeList.test.tsx +29 -0
- package/src/TreeList/TreeList.tsx +3 -0
- package/src/TreeList/TreeListItem.tsx +15 -1
- package/src/TreeList/TreeListTypes.ts +11 -1
- package/src/Typeahead/BaseTypeahead.spec.md +4 -3
- package/src/Typeahead/BaseTypeahead.tsx +21 -7
- package/src/Typeahead/Typeahead.test.tsx +53 -0
- package/src/__tests__/PressedState.a11y.chromium.spec.ts +813 -0
- package/src/__tests__/pressState.ts +93 -0
- package/src/hooks/scrollKeyboardDelegation.test.ts +155 -0
- package/src/hooks/scrollKeyboardDelegation.ts +233 -0
- package/src/hooks/useClickableContainer.test.tsx +236 -0
- package/src/hooks/useClickableContainer.ts +20 -4
- package/src/hooks/useScrollableArea.doc.mjs +15 -3
- package/src/hooks/useScrollableArea.test.tsx +59 -1
- package/src/hooks/useScrollableArea.ts +34 -10
- package/src/index.ts +3 -0
- package/src/inputFontFloor.test.ts +106 -0
- package/src/tailwind-theme.css +0 -6
- package/src/theme/Theme.test.tsx +32 -0
- package/src/theme/declarationBoundary.test.ts +126 -0
- package/src/theme/declarationBoundary.ts +347 -0
- package/src/theme/derivedVarRegistry.test.ts +7 -0
- package/src/theme/derivedVarRegistry.ts +1 -0
- package/src/theme/generateThemeRules.test.ts +526 -1
- package/src/theme/generateThemeRules.ts +228 -50
- package/src/theme/tokenValueCompat.test.ts +4 -1
- package/src/utils/interactionOverlay.stylex.ts +20 -0
- package/src/utils/safeUrl.test.ts +88 -0
- package/src/utils/safeUrl.ts +85 -0
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
schema_version: 3
|
|
3
|
-
template_version:
|
|
3
|
+
template_version: 5
|
|
4
4
|
kind: component
|
|
5
5
|
id: component:TreeList
|
|
6
|
-
authority:
|
|
6
|
+
authority: current
|
|
7
7
|
archive_reason: null
|
|
8
8
|
superseded_by: null
|
|
9
|
-
approved_by:
|
|
10
|
-
approved_at:
|
|
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.
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
|
45
|
-
|
|
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
|
-
|
|
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
|
|
66
|
-
factual backfill.
|
|
86
|
+
- New targets for Item description or caller-provided slots.
|
|
67
87
|
|
|
68
88
|
## Public concepts
|
|
69
89
|
|
|
70
|
-
|
|
71
|
-
|
|
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 |
|
|
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.
|
|
78
|
-
| FR2 | Tree list, Item, Chevron, Item label, and Guide carry the five current `tree-list*` targets documented below.
|
|
79
|
-
| FR3 | Chevron glyph delegates to Icon's `icon` target. Header, Start content, and End content are consumer-owned and have no TreeList target.
|
|
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.
|
|
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
|
|
95
|
-
| ------------------------ |
|
|
96
|
-
| Empty tree | Tree list remains; no Item instances render.
|
|
97
|
-
| Flat items | Each Item contains an Item label.
|
|
98
|
-
|
|
|
99
|
-
|
|
|
100
|
-
| `
|
|
101
|
-
|
|
|
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
|
-
-
|
|
106
|
-
|
|
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
|
-
-
|
|
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
|
-
|
|
115
|
-
|
|
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
|
|
120
|
-
| ---------------- |
|
|
121
|
-
| Tree list | Groups the hierarchical tree and owns its density and guide variant.
|
|
122
|
-
| Header | Visibly names the tree with caller-provided content.
|
|
123
|
-
| Item | Paints one row and reflects density, selection, and
|
|
124
|
-
| Chevron | Provides the expand and collapse control for an Item with children.
|
|
125
|
-
| Chevron glyph | Presents the current directional symbol inside Chevron.
|
|
126
|
-
| Item label | Presents the primary content that identifies an Item.
|
|
127
|
-
| Item description | Presents stable secondary text below Item label.
|
|
128
|
-
| Start content | Presents caller-provided content before Item label.
|
|
129
|
-
| End content | Presents caller-provided content after Item label.
|
|
130
|
-
| Guide | Paints a connector between related hierarchy levels.
|
|
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
|
|
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": "
|
|
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
|
|
176
|
-
description's `none` disposition records
|
|
177
|
-
authorize a
|
|
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
|
|
196
|
-
| ------------------- |
|
|
197
|
-
| FR1 | `TreeList.test.tsx` rendering, hierarchy, slot, and accessibility suites plus source inspection
|
|
198
|
-
| FR2 | `TreeList.test.tsx` and `themingTargets.test.ts`
|
|
199
|
-
| FR3 | Source inspection plus Icon public target metadata
|
|
200
|
-
| FR4 | `TreeList.test.tsx` description rendering test and source inspection
|
|
201
|
-
|
|
|
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
|
|
204
|
-
|
|
205
|
-
|
|
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
|
-
|
|
210
|
-
|
|
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
|
-
|
|
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,
|
|
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).
|
|
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
|
-
|
|
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)':
|
|
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
|
|
537
|
-
// searches that resolve
|
|
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
|
-
//
|
|
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
|
-
|
|
1010
|
+
prevSearchSourceRef.current.cancel?.();
|
|
997
1011
|
};
|
|
998
|
-
}, [
|
|
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', () => {
|