@astryxdesign/core 0.6.2 → 0.6.3-canary.039a67e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +81 -0
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +33 -12
- 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.d.ts +2 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +6 -4
- package/dist/Chat/ChatSystemMessage.d.ts +3 -3
- package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
- package/dist/Chat/ChatSystemMessage.js +2 -2
- package/dist/Chat/ChatTokenizedText.d.ts +6 -6
- package/dist/Chat/ChatTokenizedText.js +10 -6
- package/dist/Chat/ChatToolCalls.d.ts +7 -9
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +43 -26
- 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 +25 -5
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +29 -17
- 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/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +4 -4
- package/dist/DateTimeInput/DateTimeInput.d.ts +32 -15
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +55 -30
- package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
- package/dist/DateTimeInput/TouchDateTimeField.js +4 -4
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- 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 +726 -177
- 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/SegmentedControl.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.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 +30 -14
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +61 -13
- package/dist/TimeInput/TouchTimeField.d.ts +11 -0
- package/dist/TimeInput/TouchTimeField.d.ts.map +1 -0
- package/dist/TimeInput/TouchTimeField.js +417 -0
- package/dist/TimeInput/index.d.ts +1 -1
- package/dist/TimeInput/index.d.ts.map +1 -1
- 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/defineTheme.d.ts +3 -0
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/defineTheme.js +4 -1
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +4 -0
- package/dist/theme/generateThemeRules.d.ts +15 -7
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +143 -35
- package/dist/theme/themeAdaptations.d.ts +5 -3
- package/dist/theme/themeAdaptations.d.ts.map +1 -1
- package/dist/theme/themeAdaptations.js +33 -5
- package/dist/utils/inputPresentation.d.ts +55 -0
- package/dist/utils/inputPresentation.d.ts.map +1 -0
- package/dist/utils/inputPresentation.js +108 -0
- 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/Avatar/Avatar.doc.mjs +1 -1
- package/src/Avatar/Avatar.test.tsx +30 -0
- package/src/Avatar/Avatar.tsx +38 -14
- 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.doc.mjs +32 -0
- package/src/Chat/ChatSendButton.spec.md +227 -0
- package/src/Chat/ChatSendButton.test.tsx +128 -8
- package/src/Chat/ChatSendButton.tsx +6 -4
- package/src/Chat/ChatSystemMessage.doc.mjs +115 -12
- package/src/Chat/ChatSystemMessage.spec.md +225 -0
- package/src/Chat/ChatSystemMessage.test.tsx +112 -20
- package/src/Chat/ChatSystemMessage.tsx +4 -6
- package/src/Chat/ChatTokenizedText.doc.mjs +96 -9
- package/src/Chat/ChatTokenizedText.spec.md +190 -0
- package/src/Chat/ChatTokenizedText.test.tsx +60 -1
- package/src/Chat/ChatTokenizedText.tsx +14 -8
- package/src/Chat/ChatToolCalls.doc.mjs +4 -1
- package/src/Chat/ChatToolCalls.spec.md +194 -0
- package/src/Chat/ChatToolCalls.test.tsx +83 -0
- package/src/Chat/ChatToolCalls.tsx +46 -21
- 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/__tests__/ChatSendButton.a11y.chromium.spec.ts +1522 -0
- package/src/Chat/__tests__/ChatSystemMessage.a11y.chromium.spec.ts +1004 -0
- package/src/Chat/__tests__/ChatTokenizedText.a11y.chromium.spec.ts +573 -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.doc.mjs +38 -9
- package/src/DateInput/DateInput.tsx +59 -17
- package/src/DateInput/NativeDateField.tsx +24 -8
- package/src/DateInput/Presentation.test.tsx +121 -0
- package/src/DateInput/TouchDateField.tsx +6 -2
- package/src/DateInput/index.ts +1 -0
- package/src/DateRangeInput/DateRangeInput.tsx +6 -1
- package/src/DateTimeInput/DateTimeInput.doc.mjs +28 -12
- package/src/DateTimeInput/DateTimeInput.tsx +93 -37
- package/src/DateTimeInput/Presentation.test.tsx +89 -0
- package/src/DateTimeInput/TouchDateTimeField.tsx +6 -1
- package/src/DateTimeInput/index.ts +1 -0
- 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 +210 -45
- package/src/Markdown/Markdown.test.tsx +87 -3
- 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 +43 -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 +38 -6
- package/src/Markdown/parser.ts +1221 -242
- 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 +61 -0
- package/src/SegmentedControl/SegmentedControl.tsx +2 -1
- package/src/SegmentedControl/SegmentedControlItem.tsx +6 -9
- package/src/Selector/Selector.doc.mjs +3 -3
- 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/NativeTimeInput.test.tsx +36 -3
- package/src/TimeInput/Presentation.test.tsx +148 -0
- package/src/TimeInput/TimeInput.doc.mjs +21 -5
- package/src/TimeInput/TimeInput.tsx +102 -11
- package/src/TimeInput/TouchTimeField.tsx +572 -0
- package/src/TimeInput/index.ts +1 -0
- 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/defineTheme.ts +4 -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 +231 -50
- package/src/theme/themeAdaptations.test.ts +211 -1
- package/src/theme/themeAdaptations.ts +50 -4
- package/src/theme/tokenValueCompat.test.ts +4 -1
- package/src/utils/inputPresentation.ts +143 -0
- package/src/utils/interactionOverlay.stylex.ts +20 -0
- package/src/utils/safeUrl.test.ts +88 -0
- package/src/utils/safeUrl.ts +85 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Listbox.a11y.states.ts
|
|
5
|
+
* @input Uses public Selector option types and the shared Listbox facts
|
|
6
|
+
* @output A bounded, explicit inventory of existing listbox/group/option states
|
|
7
|
+
* @position Test-only migration ledger shared by component tests and browser stories.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type {ListboxStateFacts} from '@astryxdesign/a11y-spec';
|
|
11
|
+
import type {SelectorOptionType} from '../types';
|
|
12
|
+
|
|
13
|
+
export interface ListboxScenario {
|
|
14
|
+
readonly id: string;
|
|
15
|
+
readonly component: 'Selector' | 'MultiSelector';
|
|
16
|
+
readonly options: SelectorOptionType[];
|
|
17
|
+
readonly values: string[];
|
|
18
|
+
readonly expectedOptions: ReadonlyArray<{
|
|
19
|
+
value: string;
|
|
20
|
+
name: string;
|
|
21
|
+
disabled: boolean;
|
|
22
|
+
selected?: boolean;
|
|
23
|
+
group?: string;
|
|
24
|
+
}>;
|
|
25
|
+
readonly groups: ReadonlyArray<string>;
|
|
26
|
+
readonly hasSearch?: boolean;
|
|
27
|
+
readonly query?: string;
|
|
28
|
+
readonly presentation?: 'popover' | 'bottom-sheet';
|
|
29
|
+
readonly customContent?: boolean;
|
|
30
|
+
readonly hiddenLabel?: boolean;
|
|
31
|
+
readonly direction?: 'ltr' | 'rtl';
|
|
32
|
+
readonly isLoading?: boolean;
|
|
33
|
+
readonly hasSelectAll?: boolean;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const flatOptions: SelectorOptionType[] = [
|
|
37
|
+
{value: 'apple', label: 'Apple'},
|
|
38
|
+
{value: 'banana', label: 'Banana'},
|
|
39
|
+
{value: 'cherry', label: 'Cherry', disabled: true},
|
|
40
|
+
];
|
|
41
|
+
const flatExpected = [
|
|
42
|
+
{value: 'apple', name: 'Apple', disabled: false},
|
|
43
|
+
{value: 'banana', name: 'Banana', disabled: false},
|
|
44
|
+
{value: 'cherry', name: 'Cherry', disabled: true},
|
|
45
|
+
];
|
|
46
|
+
const groupedOptions: SelectorOptionType[] = [
|
|
47
|
+
{
|
|
48
|
+
type: 'section',
|
|
49
|
+
title: 'Citrus',
|
|
50
|
+
options: [
|
|
51
|
+
{value: 'orange', label: 'Orange'},
|
|
52
|
+
{value: 'lemon', label: 'Lemon'},
|
|
53
|
+
],
|
|
54
|
+
},
|
|
55
|
+
{type: 'divider'},
|
|
56
|
+
{
|
|
57
|
+
type: 'section',
|
|
58
|
+
title: 'Berries',
|
|
59
|
+
options: [{value: 'blueberry', label: 'Blueberry', disabled: true}],
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
const groupedExpected = [
|
|
63
|
+
{value: 'orange', name: 'Orange', disabled: false, group: 'Citrus'},
|
|
64
|
+
{value: 'lemon', name: 'Lemon', disabled: false, group: 'Citrus'},
|
|
65
|
+
{value: 'blueberry', name: 'Blueberry', disabled: true, group: 'Berries'},
|
|
66
|
+
];
|
|
67
|
+
|
|
68
|
+
function scenarios(component: ListboxScenario['component']): ListboxScenario[] {
|
|
69
|
+
const prefix = component === 'Selector' ? 'single' : 'multiple';
|
|
70
|
+
const base = {
|
|
71
|
+
component,
|
|
72
|
+
options: flatOptions,
|
|
73
|
+
expectedOptions: flatExpected,
|
|
74
|
+
groups: [],
|
|
75
|
+
};
|
|
76
|
+
return [
|
|
77
|
+
{...base, id: `${prefix}-unset`, values: []},
|
|
78
|
+
{
|
|
79
|
+
...base,
|
|
80
|
+
id: `${prefix}-selected`,
|
|
81
|
+
values: component === 'Selector' ? ['apple'] : ['apple', 'banana'],
|
|
82
|
+
},
|
|
83
|
+
{...base, id: `${prefix}-disabled-selected`, values: ['cherry']},
|
|
84
|
+
{
|
|
85
|
+
...base,
|
|
86
|
+
id: `${prefix}-grouped`,
|
|
87
|
+
options: groupedOptions,
|
|
88
|
+
values: ['orange'],
|
|
89
|
+
expectedOptions: groupedExpected,
|
|
90
|
+
groups: ['Citrus', 'Berries'],
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
...base,
|
|
94
|
+
id: `${prefix}-filtered`,
|
|
95
|
+
options: groupedOptions,
|
|
96
|
+
values: ['orange'],
|
|
97
|
+
expectedOptions: [
|
|
98
|
+
{value: 'lemon', name: 'Lemon', disabled: false, group: 'Citrus'},
|
|
99
|
+
],
|
|
100
|
+
groups: ['Citrus'],
|
|
101
|
+
hasSearch: true,
|
|
102
|
+
query: 'lem',
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
...base,
|
|
106
|
+
id: `${prefix}-custom-rtl`,
|
|
107
|
+
values: ['banana'],
|
|
108
|
+
customContent: true,
|
|
109
|
+
hiddenLabel: true,
|
|
110
|
+
direction: 'rtl',
|
|
111
|
+
expectedOptions: [
|
|
112
|
+
{value: 'apple', name: 'Apple details', disabled: false},
|
|
113
|
+
{value: 'banana', name: 'Banana details', disabled: false},
|
|
114
|
+
{value: 'cherry', name: 'Cherry details', disabled: true},
|
|
115
|
+
],
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
...base,
|
|
119
|
+
id: `${prefix}-sheet`,
|
|
120
|
+
values: ['apple'],
|
|
121
|
+
presentation: 'bottom-sheet',
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
...base,
|
|
125
|
+
id: `${prefix}-sheet-search`,
|
|
126
|
+
values: ['banana'],
|
|
127
|
+
presentation: 'bottom-sheet',
|
|
128
|
+
hasSearch: true,
|
|
129
|
+
},
|
|
130
|
+
{...base, id: `${prefix}-loading`, values: ['apple'], isLoading: true},
|
|
131
|
+
];
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export const LISTBOX_SCENARIOS: ReadonlyArray<ListboxScenario> = [
|
|
135
|
+
...scenarios('Selector'),
|
|
136
|
+
...scenarios('MultiSelector'),
|
|
137
|
+
...(['none', 'partial', 'all'] as const).map(state => ({
|
|
138
|
+
id: `multiple-select-all-${state}`,
|
|
139
|
+
component: 'MultiSelector' as const,
|
|
140
|
+
options: flatOptions,
|
|
141
|
+
values:
|
|
142
|
+
state === 'none'
|
|
143
|
+
? []
|
|
144
|
+
: state === 'partial'
|
|
145
|
+
? ['apple']
|
|
146
|
+
: ['apple', 'banana'],
|
|
147
|
+
groups: [],
|
|
148
|
+
hasSelectAll: true,
|
|
149
|
+
expectedOptions: [
|
|
150
|
+
{
|
|
151
|
+
value: 'select-all',
|
|
152
|
+
name:
|
|
153
|
+
state === 'partial' ? 'Select all, partially selected' : 'Select all',
|
|
154
|
+
disabled: false,
|
|
155
|
+
selected: state === 'all',
|
|
156
|
+
},
|
|
157
|
+
...flatExpected,
|
|
158
|
+
],
|
|
159
|
+
})),
|
|
160
|
+
];
|
|
161
|
+
|
|
162
|
+
export interface ListboxBindingPart {
|
|
163
|
+
readonly role: 'listbox' | 'group' | 'option';
|
|
164
|
+
readonly name?: string;
|
|
165
|
+
readonly state: string;
|
|
166
|
+
readonly facts: ListboxStateFacts;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export function listboxParts(
|
|
170
|
+
scenario: ListboxScenario,
|
|
171
|
+
): ReadonlyArray<ListboxBindingPart> {
|
|
172
|
+
const multiple = scenario.component === 'MultiSelector';
|
|
173
|
+
return [
|
|
174
|
+
{
|
|
175
|
+
role: 'listbox',
|
|
176
|
+
state: `${scenario.id}:listbox`,
|
|
177
|
+
facts: {
|
|
178
|
+
part: 'listbox',
|
|
179
|
+
multiple,
|
|
180
|
+
optionRelations: scenario.expectedOptions.map(
|
|
181
|
+
option => `option:${option.value}`,
|
|
182
|
+
),
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
...scenario.groups.map(name => ({
|
|
186
|
+
role: 'group' as const,
|
|
187
|
+
name,
|
|
188
|
+
state: `${scenario.id}:group:${name}`,
|
|
189
|
+
facts: {part: 'group' as const, multiple},
|
|
190
|
+
})),
|
|
191
|
+
...scenario.expectedOptions.map(option => ({
|
|
192
|
+
role: 'option' as const,
|
|
193
|
+
name: option.name,
|
|
194
|
+
state: `${scenario.id}:option:${option.value}`,
|
|
195
|
+
facts: {
|
|
196
|
+
part: 'option' as const,
|
|
197
|
+
multiple,
|
|
198
|
+
selected: option.selected ?? scenario.values.includes(option.value),
|
|
199
|
+
disabled: option.disabled,
|
|
200
|
+
ownerGroup: option.group == null ? undefined : `group:${option.group}`,
|
|
201
|
+
},
|
|
202
|
+
})),
|
|
203
|
+
];
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export const LISTBOX_EXCLUSIONS = [
|
|
207
|
+
{
|
|
208
|
+
owner: 'Selector/MultiSelector trigger and search input',
|
|
209
|
+
reason:
|
|
210
|
+
'Combobox, field validation, required/read-only/disabled trigger state, and opening/closing are separate contracts. This slice observes active popup parts.',
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
owner: 'Selector/MultiSelector existing interaction suites',
|
|
214
|
+
reason:
|
|
215
|
+
'Keyboard selection, selection-follows-focus, disabled-option discovery, Home/End, typeahead, and callback policy are not newly adopted here.',
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
owner: 'Selector/MultiSelector empty-state and live-region owners',
|
|
219
|
+
reason:
|
|
220
|
+
'Zero-result representation and announcement timing require their own authority/evidence. No required option is invented for an empty listbox.',
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
owner: 'Typeahead, Tokenizer, PowerSearch, ComplexSelector, CommandPalette',
|
|
224
|
+
reason:
|
|
225
|
+
'Later bounded adopters; this first migration is limited to Selector and MultiSelector.',
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
owner: 'Component-specific suites',
|
|
229
|
+
reason:
|
|
230
|
+
'Public ID forwarding, callback payloads, forms, value formatting, sorting, required/error status, and styling stay local. Selector has no independent uncontrolled selected-value owner; an omitted value is the unset state.',
|
|
231
|
+
},
|
|
232
|
+
] as const;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Selector.a11y.chromium.spec.ts
|
|
5
|
+
* @input Uses the checked-in no-search bottom-sheet Storybook story and Chromium
|
|
6
|
+
* @output Chromium accessibility-tree regression coverage for the sheet listbox name
|
|
7
|
+
* @position Browser-only accessibility regression test for Selector
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import {expect, test} from '@playwright/test';
|
|
11
|
+
import {
|
|
12
|
+
DEFAULT_STORYBOOK_DIR,
|
|
13
|
+
serveStorybook,
|
|
14
|
+
type StaticServer,
|
|
15
|
+
} from '@astryxdesign/a11y-spec/storybook';
|
|
16
|
+
|
|
17
|
+
let storybook: StaticServer;
|
|
18
|
+
|
|
19
|
+
test.beforeAll(async () => {
|
|
20
|
+
storybook = await serveStorybook(
|
|
21
|
+
process.env.ASTRYX_STORYBOOK_DIR ?? DEFAULT_STORYBOOK_DIR,
|
|
22
|
+
);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test.afterAll(async () => {
|
|
26
|
+
await storybook?.close();
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('names the no-search bottom-sheet listbox from the Selector label', async ({
|
|
30
|
+
page,
|
|
31
|
+
}) => {
|
|
32
|
+
await page.goto(
|
|
33
|
+
`${storybook.origin}/iframe.html?id=core-selector--bottom-sheet-presentation&viewMode=story`,
|
|
34
|
+
{waitUntil: 'load'},
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
await page.getByRole('combobox', {name: 'Team'}).click();
|
|
38
|
+
|
|
39
|
+
const listbox = page.getByRole('listbox');
|
|
40
|
+
await expect(listbox).toBeVisible();
|
|
41
|
+
// Playwright resolves this matcher from Chromium's accessibility tree, not
|
|
42
|
+
// the DOM attribute alone. The sheet is a modal layer, so a reference to the
|
|
43
|
+
// trigger outside it produces no name; this is the regression proof.
|
|
44
|
+
await expect(listbox).toHaveAccessibleName('Team');
|
|
45
|
+
});
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Selector.listbox.a11y.test.tsx
|
|
5
|
+
* @input Uses Selector, its explicit part/state inventory, and the Listbox contract
|
|
6
|
+
* @output DOM evidence for real single-select listbox, group, and option parts
|
|
7
|
+
* @position Component-facing binding; keyboard, callbacks, forms, and styles stay local.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import {cleanup, render, screen, within} from '@testing-library/react';
|
|
11
|
+
import userEvent from '@testing-library/user-event';
|
|
12
|
+
import {describe, expect, it} from 'vitest';
|
|
13
|
+
import {
|
|
14
|
+
expectAccessibilitySpec,
|
|
15
|
+
LISTBOX_PATTERN,
|
|
16
|
+
} from '@astryxdesign/a11y-spec';
|
|
17
|
+
import {Selector} from '../Selector';
|
|
18
|
+
import {LISTBOX_SCENARIOS, listboxParts} from './Listbox.a11y.states';
|
|
19
|
+
import {installListboxDialogStubs} from './Listbox.a11y.dom';
|
|
20
|
+
|
|
21
|
+
installListboxDialogStubs();
|
|
22
|
+
|
|
23
|
+
const scenarios = LISTBOX_SCENARIOS.filter(
|
|
24
|
+
scenario => scenario.component === 'Selector',
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
describe('Selector Listbox semantic binding', () => {
|
|
28
|
+
it.each(scenarios)('$id', async scenario => {
|
|
29
|
+
for (const part of listboxParts(scenario)) {
|
|
30
|
+
await expectAccessibilitySpec({
|
|
31
|
+
spec: LISTBOX_PATTERN,
|
|
32
|
+
binding: `Selector.${part.role}`,
|
|
33
|
+
state: part.state,
|
|
34
|
+
facts: part.facts,
|
|
35
|
+
render: async () => {
|
|
36
|
+
render(
|
|
37
|
+
<div dir={scenario.direction ?? 'ltr'}>
|
|
38
|
+
<Selector
|
|
39
|
+
label="Fruit"
|
|
40
|
+
options={scenario.options}
|
|
41
|
+
value={scenario.values[0]}
|
|
42
|
+
onChange={() => {}}
|
|
43
|
+
hasSearch={scenario.hasSearch}
|
|
44
|
+
presentation={scenario.presentation}
|
|
45
|
+
isLoading={scenario.isLoading}
|
|
46
|
+
isLabelHidden={scenario.hiddenLabel}
|
|
47
|
+
renderOption={
|
|
48
|
+
scenario.customContent
|
|
49
|
+
? option => <span>{option.label} details</span>
|
|
50
|
+
: undefined
|
|
51
|
+
}
|
|
52
|
+
isDefaultOpen
|
|
53
|
+
/>
|
|
54
|
+
</div>,
|
|
55
|
+
);
|
|
56
|
+
await screen.findByRole('listbox', {hidden: true});
|
|
57
|
+
if (scenario.query != null) {
|
|
58
|
+
await userEvent
|
|
59
|
+
.setup()
|
|
60
|
+
.type(
|
|
61
|
+
screen.getByRole('combobox', {hidden: true}),
|
|
62
|
+
scenario.query,
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
subject: () =>
|
|
67
|
+
part.role === 'listbox'
|
|
68
|
+
? screen.getByRole('listbox', {hidden: true})
|
|
69
|
+
: part.role === 'group'
|
|
70
|
+
? within(
|
|
71
|
+
screen.getByRole('listbox', {hidden: true}),
|
|
72
|
+
).getAllByRole('group', {hidden: true})[
|
|
73
|
+
scenario.groups.indexOf(part.name ?? '')
|
|
74
|
+
]
|
|
75
|
+
: within(screen.getByRole('listbox', {hidden: true})).getByRole(
|
|
76
|
+
'option',
|
|
77
|
+
{name: part.name, hidden: true},
|
|
78
|
+
),
|
|
79
|
+
related: () => {
|
|
80
|
+
const listbox = screen.getByRole('listbox', {hidden: true});
|
|
81
|
+
expect(
|
|
82
|
+
within(listbox).getAllByRole('option', {hidden: true}),
|
|
83
|
+
).toHaveLength(scenario.expectedOptions.length);
|
|
84
|
+
return {
|
|
85
|
+
listbox,
|
|
86
|
+
...Object.fromEntries(
|
|
87
|
+
scenario.expectedOptions.map(option => [
|
|
88
|
+
`option:${option.value}`,
|
|
89
|
+
within(listbox).getByRole('option', {
|
|
90
|
+
name: option.name,
|
|
91
|
+
hidden: true,
|
|
92
|
+
}),
|
|
93
|
+
]),
|
|
94
|
+
),
|
|
95
|
+
...Object.fromEntries(
|
|
96
|
+
scenario.groups.map((name, index) => [
|
|
97
|
+
`group:${name}`,
|
|
98
|
+
within(listbox).getAllByRole('group', {hidden: true})[index],
|
|
99
|
+
]),
|
|
100
|
+
),
|
|
101
|
+
};
|
|
102
|
+
},
|
|
103
|
+
cleanup,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('keeps the bounded state matrix explicit', () => {
|
|
109
|
+
expect(scenarios.map(scenario => scenario.id)).toEqual([
|
|
110
|
+
'single-unset',
|
|
111
|
+
'single-selected',
|
|
112
|
+
'single-disabled-selected',
|
|
113
|
+
'single-grouped',
|
|
114
|
+
'single-filtered',
|
|
115
|
+
'single-custom-rtl',
|
|
116
|
+
'single-sheet',
|
|
117
|
+
'single-sheet-search',
|
|
118
|
+
'single-loading',
|
|
119
|
+
]);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
@@ -25,7 +25,7 @@ export const docs = {
|
|
|
25
25
|
{className: 'astryx-side-nav-section'},
|
|
26
26
|
],
|
|
27
27
|
},
|
|
28
|
-
description: 'Container with five zones: header, topContent, children (scrollable), footer, and footerIcons. Supports collapsible
|
|
28
|
+
description: 'Container with five zones: header, topContent, children (scrollable), footer, and footerIcons. Supports collapsible and resizable modes.',
|
|
29
29
|
props: [
|
|
30
30
|
{
|
|
31
31
|
name: 'header',
|
|
@@ -989,6 +989,16 @@ describe('SideNav resizable', () => {
|
|
|
989
989
|
).toBeInTheDocument();
|
|
990
990
|
});
|
|
991
991
|
|
|
992
|
+
it('clips the overlay drag handle within the resizable nav bounds', () => {
|
|
993
|
+
render(<SideNav resizable>Content</SideNav>);
|
|
994
|
+
const nav = screen.getByRole('navigation');
|
|
995
|
+
const container = nav.parentElement;
|
|
996
|
+
const handle = screen.getByTestId('astryx-sidenav-resize-handle');
|
|
997
|
+
|
|
998
|
+
expect(container).toContainElement(handle);
|
|
999
|
+
expect(getComputedStyle(container!).overflow).toBe('clip');
|
|
1000
|
+
});
|
|
1001
|
+
|
|
992
1002
|
it('does not render drag handle without resizable', () => {
|
|
993
1003
|
render(<SideNav>Content</SideNav>);
|
|
994
1004
|
expect(
|
package/src/SideNav/SideNav.tsx
CHANGED
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
* Sidebar navigation container with five zones: header + topContent (sticky together),
|
|
12
12
|
* children (scrollable), footer, and footerIcons (sticky bottom).
|
|
13
13
|
*
|
|
14
|
-
* Supports optional resize via drag handle at the inline-end edge.
|
|
14
|
+
* Supports optional resize via a drag handle at the inline-end edge. The
|
|
15
|
+
* resizable wrapper clips handle overflow while keeping its focus ring inside.
|
|
15
16
|
*
|
|
16
17
|
* SYNC: When modified, update these files to stay in sync:
|
|
17
18
|
* - /packages/core/src/SideNav/SideNav.doc.mjs
|
|
@@ -25,7 +26,7 @@ import {useCallback, useImperativeHandle, useRef, type ReactNode} from 'react';
|
|
|
25
26
|
import type {BaseProps} from '../BaseProps';
|
|
26
27
|
import * as stylex from '@stylexjs/stylex';
|
|
27
28
|
import type {StyleXStyles} from '@stylexjs/stylex';
|
|
28
|
-
import {spacingVars} from '../theme/tokens.stylex';
|
|
29
|
+
import {focusVars, spacingVars} from '../theme/tokens.stylex';
|
|
29
30
|
import {mergeProps} from '../utils';
|
|
30
31
|
import {
|
|
31
32
|
SideNavCollapseContext,
|
|
@@ -241,6 +242,16 @@ const styles = stylex.create({
|
|
|
241
242
|
display: 'flex',
|
|
242
243
|
flexShrink: 0,
|
|
243
244
|
height: '100%',
|
|
245
|
+
overflow: 'clip',
|
|
246
|
+
},
|
|
247
|
+
resizableHandle: {
|
|
248
|
+
// Keep the shared ring inside the clipping boundary. The wrapper cannot
|
|
249
|
+
// use overflow-clip-margin: that paint allowance also contributes the
|
|
250
|
+
// overlay's half-pixel spill to AppShell's scrollable overflow.
|
|
251
|
+
outlineOffset: {
|
|
252
|
+
default: '0',
|
|
253
|
+
':focus-visible': `calc(0px - ${focusVars['--focus-outline-width']})`,
|
|
254
|
+
},
|
|
244
255
|
},
|
|
245
256
|
// Topbar mode — horizontal layout for mobile top bar
|
|
246
257
|
topbar: {
|
|
@@ -658,6 +669,7 @@ export function SideNav({
|
|
|
658
669
|
position="overlay"
|
|
659
670
|
pillPlacement="end"
|
|
660
671
|
isAlwaysVisible={false}
|
|
672
|
+
xstyle={styles.resizableHandle}
|
|
661
673
|
resizable={resizableHook.props}
|
|
662
674
|
label={t('@astryx.sideNav.resizeSidebar')}
|
|
663
675
|
/>
|
|
@@ -160,7 +160,8 @@ export const docs = {
|
|
|
160
160
|
{
|
|
161
161
|
name: 'marks',
|
|
162
162
|
type: 'Array<{ value: number; label?: string }>',
|
|
163
|
-
description:
|
|
163
|
+
description:
|
|
164
|
+
'Tick marks at specified positions with optional labels. Unfilled marks use the track color; marks inside the filled region (at or behind the thumb, or between the thumbs in range mode) use the fill color.',
|
|
164
165
|
},
|
|
165
166
|
{
|
|
166
167
|
name: 'minStepsBetweenThumbs',
|
|
@@ -255,6 +256,17 @@ export const docs = {
|
|
|
255
256
|
],
|
|
256
257
|
},
|
|
257
258
|
usage: {
|
|
259
|
+
accessibility: [
|
|
260
|
+
{
|
|
261
|
+
name: 'Thumb',
|
|
262
|
+
category: 'Color contrast',
|
|
263
|
+
criterion: '1.4.11 Non-text Contrast',
|
|
264
|
+
requirement: '3:1',
|
|
265
|
+
states: ['Rest', 'Hover', 'Pointer down'],
|
|
266
|
+
description:
|
|
267
|
+
'The thumb must have at least 3:1 contrast with the track and the surface behind it. Pointer down is the whole drag: measure the thumb with the pressed overlay applied.',
|
|
268
|
+
},
|
|
269
|
+
],
|
|
258
270
|
anatomy,
|
|
259
271
|
description:
|
|
260
272
|
'A draggable control for selecting a numeric value or range within defined bounds. Supports single value and range selection, tick marks, custom value formatting, and vertical orientation. Use it when users need to explore a continuous range, such as volume, price, or percentage.',
|
|
@@ -354,7 +366,8 @@ export const docsZh = {
|
|
|
354
366
|
{
|
|
355
367
|
name: 'marks',
|
|
356
368
|
type: 'Array<{ value: number; label?: string }>',
|
|
357
|
-
description:
|
|
369
|
+
description:
|
|
370
|
+
'在指定位置的刻度标记,带可选标签。未填充区域的标记使用轨道颜色;填充区域内的标记使用强调色。',
|
|
358
371
|
},
|
|
359
372
|
{
|
|
360
373
|
name: 'minStepsBetweenThumbs',
|
|
@@ -520,7 +533,8 @@ export const docsDense = {
|
|
|
520
533
|
orientation: 'Slider orientation.',
|
|
521
534
|
formatValue: 'Custom value formatting fn for display + aria-valuetext.',
|
|
522
535
|
valueDisplay: 'How current value is displayed.',
|
|
523
|
-
marks:
|
|
536
|
+
marks:
|
|
537
|
+
'Tick marks at specified positions w/ optional labels. Unfilled marks use the track color; filled marks use the accent color.',
|
|
524
538
|
minStepsBetweenThumbs:
|
|
525
539
|
'Min steps between thumbs in range mode; prevents overlap.',
|
|
526
540
|
isDisabled: 'Whether slider is disabled.',
|