@astryxdesign/core 0.6.2 → 0.6.3-canary.0788c49
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.d.ts +2 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +6 -4
- 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 +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.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.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/__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/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 +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/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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@astryxdesign/core",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.3-canary.0788c49",
|
|
4
4
|
"displayName": "Astryx Core",
|
|
5
5
|
"description": "The component library. Accessible, themeable React components with built-in spacing, dark mode, and StyleX styling.",
|
|
6
6
|
"author": "Meta Open Source",
|
|
@@ -539,6 +539,11 @@
|
|
|
539
539
|
"types": "./dist/TimeInput/index.d.ts",
|
|
540
540
|
"default": "./dist/TimeInput/index.js"
|
|
541
541
|
},
|
|
542
|
+
"./Timer": {
|
|
543
|
+
"source": "./src/Timer/index.ts",
|
|
544
|
+
"types": "./dist/Timer/index.d.ts",
|
|
545
|
+
"default": "./dist/Timer/index.js"
|
|
546
|
+
},
|
|
542
547
|
"./Timestamp": {
|
|
543
548
|
"source": "./src/Timestamp/index.ts",
|
|
544
549
|
"types": "./dist/Timestamp/index.d.ts",
|
|
@@ -619,6 +624,16 @@
|
|
|
619
624
|
"types": "./dist/utils/index.d.ts",
|
|
620
625
|
"default": "./dist/utils/index.js"
|
|
621
626
|
},
|
|
627
|
+
"./Markdown/plugins": {
|
|
628
|
+
"source": "./src/Markdown/plugins/index.ts",
|
|
629
|
+
"types": "./dist/Markdown/plugins/index.d.ts",
|
|
630
|
+
"default": "./dist/Markdown/plugins/index.js"
|
|
631
|
+
},
|
|
632
|
+
"./Markdown/parser": {
|
|
633
|
+
"source": "./src/Markdown/parser/index.ts",
|
|
634
|
+
"types": "./dist/Markdown/parser/index.d.ts",
|
|
635
|
+
"default": "./dist/Markdown/parser/index.js"
|
|
636
|
+
},
|
|
622
637
|
"./Calendar/utils": {
|
|
623
638
|
"source": "./src/Calendar/utils.ts",
|
|
624
639
|
"types": "./dist/Calendar/utils.d.ts",
|
|
@@ -653,6 +668,11 @@
|
|
|
653
668
|
"source": "./src/Typeahead/utils.ts",
|
|
654
669
|
"types": "./dist/Typeahead/utils.d.ts",
|
|
655
670
|
"default": "./dist/Typeahead/utils.js"
|
|
671
|
+
},
|
|
672
|
+
"./Markdown/remark": {
|
|
673
|
+
"source": "./src/Markdown/remark.ts",
|
|
674
|
+
"types": "./dist/Markdown/remark.d.ts",
|
|
675
|
+
"default": "./dist/Markdown/remark.js"
|
|
656
676
|
}
|
|
657
677
|
},
|
|
658
678
|
"files": [
|
|
@@ -672,6 +692,8 @@
|
|
|
672
692
|
"react-dom": ">=19.0.0"
|
|
673
693
|
},
|
|
674
694
|
"devDependencies": {
|
|
695
|
+
"@astryxdesign/a11y-spec": "0.6.3-canary.0788c49",
|
|
696
|
+
"@astryxdesign/cli": "0.6.3-canary.0788c49",
|
|
675
697
|
"@babel/cli": "^7.29.7",
|
|
676
698
|
"@babel/core": "^7.29.7",
|
|
677
699
|
"@babel/preset-react": "^7.29.7",
|
|
@@ -681,9 +703,7 @@
|
|
|
681
703
|
"@testing-library/dom": "^10.0.0",
|
|
682
704
|
"@testing-library/jest-dom": "^6.6.0",
|
|
683
705
|
"@testing-library/react": "^16.3.2",
|
|
684
|
-
"@types/babel__core": "^7.20.5"
|
|
685
|
-
"@astryxdesign/a11y-spec": "0.0.0",
|
|
686
|
-
"@astryxdesign/cli": "0.6.2"
|
|
706
|
+
"@types/babel__core": "^7.20.5"
|
|
687
707
|
},
|
|
688
708
|
"dependencies": {
|
|
689
709
|
"intl-messageformat": "^11.2.9"
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* @file BottomSheet.doc.mjs
|
|
5
|
+
* @input BottomSheet props, sheet anatomy, and focus-time keyboard scrolling behavior
|
|
6
|
+
* @output Consumer documentation and examples for BottomSheet
|
|
7
|
+
* @position CLI and rendered component documentation
|
|
8
|
+
*/
|
|
9
|
+
|
|
3
10
|
/** @type {import('@astryxdesign/cli/authoring').ComponentAnatomyElement[]} */
|
|
4
11
|
const anatomy = [
|
|
5
12
|
{
|
|
@@ -130,7 +137,7 @@ export const docs = {
|
|
|
130
137
|
name: 'children',
|
|
131
138
|
type: 'ReactNode',
|
|
132
139
|
description:
|
|
133
|
-
"Sheet content,
|
|
140
|
+
"Sheet content in a scrollable area. The named body is keyboard reachable while overflowing. Forward Tab entry may move directly to the first native link or button; input controls, composite widgets, and nested scroll areas retain the body stop. Shift+Tab from a delegated first child skips the body. Fitting content adds no body stop. The internal observed content box preserves block flow and percentage heights. If it includes a text-entry control that can bring up the mobile keyboard, use height='tall' and keep the sheet fully expanded while editing.",
|
|
134
141
|
required: true,
|
|
135
142
|
},
|
|
136
143
|
{
|
|
@@ -14,6 +14,9 @@ verified_by:
|
|
|
14
14
|
[
|
|
15
15
|
packages/core/src/BottomSheet/BottomSheet.test.tsx,
|
|
16
16
|
packages/core/src/BottomSheet/BottomSheetPanel.test.tsx,
|
|
17
|
+
packages/core/src/BottomSheet/BottomSheetKeyboard.test.tsx,
|
|
18
|
+
packages/core/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts,
|
|
19
|
+
apps/storybook/stories/BottomSheet.stories.tsx,
|
|
17
20
|
scripts/check-knowledge.mjs,
|
|
18
21
|
]
|
|
19
22
|
modules: []
|
|
@@ -22,7 +25,7 @@ design_specs: []
|
|
|
22
25
|
architecture:
|
|
23
26
|
[architecture:component-theming-surface, architecture:layer-runtime]
|
|
24
27
|
contributing: []
|
|
25
|
-
system_specs: []
|
|
28
|
+
system_specs: [spec:AST-025]
|
|
26
29
|
---
|
|
27
30
|
|
|
28
31
|
# BottomSheet component contract
|
|
@@ -30,14 +33,15 @@ system_specs: []
|
|
|
30
33
|
## Intent
|
|
31
34
|
|
|
32
35
|
BottomSheet presents caller-provided content in a panel that rises from the
|
|
33
|
-
bottom edge. This draft records current consumer anatomy
|
|
34
|
-
|
|
36
|
+
bottom edge. This draft records current consumer anatomy, keyboard-reachable
|
|
37
|
+
scrolling, and theming reachability without changing public API.
|
|
35
38
|
|
|
36
39
|
## Compatibility and migration
|
|
37
40
|
|
|
38
41
|
- Released default preserved: `yes`
|
|
39
|
-
- Compatibility class: additive
|
|
40
|
-
targets, and
|
|
42
|
+
- Compatibility class: additive internal content box and shared scroll behavior;
|
|
43
|
+
public props, defaults, targets, and caller child ordering inside the content box
|
|
44
|
+
remain unchanged
|
|
41
45
|
- Controlled/uncontrolled behavior: unchanged
|
|
42
46
|
- Migration decision: none
|
|
43
47
|
|
|
@@ -48,7 +52,8 @@ Consumer migration instructions belong in consumer docs and release notes.
|
|
|
48
52
|
**Owns**
|
|
49
53
|
|
|
50
54
|
- The visual Sheet panel and its current `bottom-sheet` target.
|
|
51
|
-
- The scrolling Content area
|
|
55
|
+
- The scrolling Content area, its shared viewport/content-box integration, and
|
|
56
|
+
automatic keyboard-path selection.
|
|
52
57
|
- Standalone sheet presentation, including its optional native-dialog Scrim.
|
|
53
58
|
|
|
54
59
|
**Does not own / non-goals**
|
|
@@ -67,10 +72,11 @@ in `BottomSheet.doc.mjs`.
|
|
|
67
72
|
|
|
68
73
|
## Behavioral and layout contract
|
|
69
74
|
|
|
70
|
-
| ID | Candidate invariant
|
|
71
|
-
| --- |
|
|
72
|
-
| FR1 | The current presented sheet contains one Sheet panel, one scrolling Content area, and one decorative Handle; a Scrim is present only in scrim-backed presentation.
|
|
73
|
-
| FR2 | The Sheet panel carries `bottom-sheet`; Content area, Handle, and Scrim carry no BottomSheet public target.
|
|
75
|
+
| ID | Candidate invariant | Basis | Draft review state |
|
|
76
|
+
| --- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- | -------------------------------------------------- |
|
|
77
|
+
| FR1 | The current presented sheet contains one Sheet panel, one scrolling Content area, and one decorative Handle; a Scrim is present only in scrim-backed presentation. | Current source, docs, and tests | Verified current behavior; no new behavior decided |
|
|
78
|
+
| FR2 | The Sheet panel carries `bottom-sheet`; Content area, Handle, and Scrim carry no BottomSheet public target. | Current source, docs, and tests | Verified current behavior; no target change |
|
|
79
|
+
| FR3 | Content renders in one real observed content box. Effective overflow, containment, and keyboard access come from `useScrollableArea`; the named overflowing body delegates forward Tab entry to a safe first sequential native link/button. | `spec:AST-025`; issue #5207; tests | Focus-time prototype for owner review |
|
|
74
80
|
|
|
75
81
|
### Allowed variation
|
|
76
82
|
|
|
@@ -96,8 +102,14 @@ in `BottomSheet.doc.mjs`.
|
|
|
96
102
|
|
|
97
103
|
## Accessibility contract
|
|
98
104
|
|
|
99
|
-
|
|
100
|
-
|
|
105
|
+
- **AR1 — Keyboard scroll path.** The named body is a tab stop while effectively
|
|
106
|
+
overflowing. On forward Tab entry, the shared hook may delegate to the first
|
|
107
|
+
sequential native link/button outside navigation-key-owning surfaces. It keeps
|
|
108
|
+
the body stop for excluded content and skips the body on reverse traversal
|
|
109
|
+
from the delegated first child.
|
|
110
|
+
- **AR2 — Focus continuity.** Content, overflow, or eligibility changes MUST NOT
|
|
111
|
+
move focus. Pointer/programmatic body focus never delegates. A focused body
|
|
112
|
+
losing overflow remains programmatically focusable.
|
|
101
113
|
|
|
102
114
|
## Design relationships
|
|
103
115
|
|
|
@@ -143,18 +155,20 @@ a decision that they must remain unthemeable.
|
|
|
143
155
|
mapping, and factual `none` dispositions.
|
|
144
156
|
- `architecture:layer-runtime` owns the current native-dialog host distinction
|
|
145
157
|
and records that sheets retain local scrim and swipe behavior.
|
|
158
|
+
- `spec:AST-025` owns effective scroll measurement, overflow and containment,
|
|
159
|
+
automatic keyboard-owner selection, and focus continuity.
|
|
146
160
|
- `family:overlay-dismissal` owns shared Escape and platform-close ordering and
|
|
147
161
|
records BottomSheet's current local-only adoption gap. This anatomy backfill
|
|
148
162
|
does not migrate that runtime behavior.
|
|
149
163
|
|
|
150
164
|
## Verification map
|
|
151
165
|
|
|
152
|
-
| Contract | Verification
|
|
153
|
-
| ------------------- |
|
|
154
|
-
| FR1 | `BottomSheet.test.tsx` render, content, Handle, and scrim behavior suites
|
|
155
|
-
| FR2 | Panel target assertion, source inspection, and theming target inventories
|
|
156
|
-
| Layout evidence
|
|
157
|
-
| Theming anatomy map | `scripts/check-knowledge.mjs`
|
|
166
|
+
| Contract | Verification | Representative states | Mutation or failure expectation | Audit section |
|
|
167
|
+
| ------------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------- | --------------------------------- |
|
|
168
|
+
| FR1 | `BottomSheet.test.tsx` render, content, Handle, and scrim behavior suites | Modal, non-modal, and switcher presentations | Removing a documented part fails existing content, structure, or dismissal assertions. | `audit:BottomSheet/anatomy` |
|
|
169
|
+
| FR2 | Panel target assertion, source inspection, and theming target inventories | Sheet panel, Content area, Handle, and Scrim | Removing the panel target or documenting an unshipped child target fails evidence or inventory. | `audit:BottomSheet/theming` |
|
|
170
|
+
| FR3, AR1–AR2 | `BottomSheetKeyboard.test.tsx`; `BottomSheetKeyboard.a11y.browser.spec.ts`; open Storybook stories | fitting/overflow, plain text, usable/unusable/dynamic descendants, focus | Missing/duplicate keyboard access, stale ownership, focus movement, or broken content-box layout fails. | `audit:BottomSheet/accessibility` | | Layout evidence | `BottomSheetPanel.test.tsx` | Floating Handle and scrolling Content area | Reordering or merging the stable parts fails existing panel structure and style assertions. | `audit:BottomSheet/anatomy` |
|
|
171
|
+
| Theming anatomy map | `scripts/check-knowledge.mjs` | Canonical anatomy and current target inventory | Missing, extra, prefixed, stale, or multiply assigned mappings fail repository validation. | `audit:BottomSheet/theming` |
|
|
158
172
|
|
|
159
173
|
Existing tests directly assert the Sheet panel target, Content area placement,
|
|
160
174
|
Handle structure, and scrim behavior. Source and public target metadata confirm
|
|
@@ -162,8 +176,20 @@ that the other three parts have no public target.
|
|
|
162
176
|
|
|
163
177
|
## Decision log
|
|
164
178
|
|
|
165
|
-
|
|
166
|
-
|
|
179
|
+
### DEC-1 — BottomSheet adopts automatic shared keyboard ownership
|
|
180
|
+
|
|
181
|
+
**Reference:** `component:BottomSheet/DEC-1`
|
|
182
|
+
**Decider:** cixzhang, 2026-09-13
|
|
183
|
+
|
|
184
|
+
BottomSheet supplies its existing label to
|
|
185
|
+
`keyboardAccess.owner="contentOrViewport"`. The shared hook keeps the overflowing
|
|
186
|
+
body named and tabbable, delegating forward keyboard entry to a safe first native
|
|
187
|
+
link/button. Pointer/programmatic focus and excluded content keep the body path. BottomSheet retains `stickyContainment="always"` because the
|
|
188
|
+
body deliberately remains the sheet-local Sticky boundary.
|
|
189
|
+
|
|
190
|
+
A real flow-root content box supplies the hook's observation seam while preserving
|
|
191
|
+
representative margin, float, percentage-height, flex/grid-child, and hug-height
|
|
192
|
+
behavior.
|
|
167
193
|
|
|
168
194
|
## Open questions
|
|
169
195
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* @file BottomSheet.test.tsx
|
|
5
5
|
* @input Uses vitest, @testing-library/react, BottomSheet component
|
|
6
|
-
* @output Unit tests for BottomSheet
|
|
6
|
+
* @output Unit tests for BottomSheet behavior and observed content anatomy
|
|
7
7
|
* @position Core testing; validates BottomSheet.tsx implementation
|
|
8
8
|
*
|
|
9
9
|
* SYNC: When BottomSheet.tsx changes, update tests to match new behavior
|
|
@@ -290,7 +290,7 @@ describe('BottomSheet', () => {
|
|
|
290
290
|
expect(onClick).toHaveBeenCalledTimes(1);
|
|
291
291
|
});
|
|
292
292
|
|
|
293
|
-
it('keeps consumer content
|
|
293
|
+
it('keeps consumer content first and last inside the observed content box', () => {
|
|
294
294
|
render(
|
|
295
295
|
<BottomSheet isOpen onOpenChange={() => {}} label="Filters">
|
|
296
296
|
<div data-testid="consumer-content">Sheet content</div>
|
|
@@ -300,7 +300,10 @@ describe('BottomSheet', () => {
|
|
|
300
300
|
const consumer = screen.getByTestId('consumer-content');
|
|
301
301
|
|
|
302
302
|
expect(body.children).toHaveLength(1);
|
|
303
|
-
|
|
303
|
+
const content = body.lastElementChild;
|
|
304
|
+
expect(content).toHaveAttribute('data-scroll-content');
|
|
305
|
+
expect(content?.lastElementChild).toBe(consumer);
|
|
306
|
+
expect(consumer.matches(':first-child')).toBe(true);
|
|
304
307
|
expect(consumer.matches(':last-child')).toBe(true);
|
|
305
308
|
});
|
|
306
309
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file BottomSheet.tsx
|
|
7
|
-
* @input Uses React, StyleX, core hooks/utils, BottomSheetPanel, BottomSheetSwitcherContext
|
|
7
|
+
* @input Uses React, StyleX, core hooks/utils, named BottomSheetPanel, BottomSheetSwitcherContext
|
|
8
8
|
* @output Exports BottomSheet component and BottomSheetProps
|
|
9
9
|
* @position Public BottomSheet router plus private standalone/switcher hosts
|
|
10
10
|
*
|
|
@@ -379,6 +379,7 @@ function StandaloneBottomSheet({
|
|
|
379
379
|
ref={ref}
|
|
380
380
|
state={panelState}
|
|
381
381
|
height={height}
|
|
382
|
+
label={label}
|
|
382
383
|
snapPoints={snapPoints}
|
|
383
384
|
isSwipeDismissAllowed={purpose === 'info'}
|
|
384
385
|
isPageScrollLocked={shouldPresent && hasScrim}
|
|
@@ -537,6 +538,7 @@ function SwitcherBottomSheetItem({
|
|
|
537
538
|
ref={ref}
|
|
538
539
|
state={panelState}
|
|
539
540
|
height={height}
|
|
541
|
+
label={label}
|
|
540
542
|
snapPoints={snapPoints}
|
|
541
543
|
isSwipeDismissAllowed={purpose === 'info'}
|
|
542
544
|
isPageScrollLocked={hasScrim}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file BottomSheetKeyboard.test.tsx
|
|
5
|
+
* @input BottomSheetPanel, real shared scroll behavior, and explicit DOM geometry
|
|
6
|
+
* @output Regression coverage for viewport access, entry-time eligibility, and focus continuity
|
|
7
|
+
* @position BottomSheet integration tests; browser stories verify native key scrolling
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import {act, fireEvent, render, screen, waitFor} from '@testing-library/react';
|
|
11
|
+
import {useState, type ReactNode} from 'react';
|
|
12
|
+
import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest';
|
|
13
|
+
import {BottomSheetPanel} from './BottomSheetPanel';
|
|
14
|
+
|
|
15
|
+
function Fixture({children}: {children: ReactNode}) {
|
|
16
|
+
return (
|
|
17
|
+
<BottomSheetPanel
|
|
18
|
+
label="Reading details"
|
|
19
|
+
state={{kind: 'open', entering: false}}
|
|
20
|
+
height="capped"
|
|
21
|
+
onDismiss={() => {}}
|
|
22
|
+
onScrimOpacity={() => {}}>
|
|
23
|
+
{children}
|
|
24
|
+
</BottomSheetPanel>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function body() {
|
|
29
|
+
return screen.getByRole('group', {name: 'Reading details'});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async function measure(scrollHeight: number, scrollWidth = 300) {
|
|
33
|
+
const viewport = body();
|
|
34
|
+
// jsdom does not resolve the shared hook's dynamic StyleX CSS variable.
|
|
35
|
+
viewport.style.overflowY = 'auto';
|
|
36
|
+
viewport.style.overflowX = 'auto';
|
|
37
|
+
for (const [key, value] of Object.entries({
|
|
38
|
+
clientHeight: 100,
|
|
39
|
+
clientWidth: 300,
|
|
40
|
+
scrollHeight,
|
|
41
|
+
scrollWidth,
|
|
42
|
+
})) {
|
|
43
|
+
Object.defineProperty(viewport, key, {configurable: true, value});
|
|
44
|
+
}
|
|
45
|
+
fireEvent(window, new Event('resize'));
|
|
46
|
+
await waitFor(() => {
|
|
47
|
+
expect(viewport.dataset.scrollableBlock === 'true').toBe(
|
|
48
|
+
scrollHeight > 101,
|
|
49
|
+
);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
beforeEach(() => {
|
|
54
|
+
// jsdom has no layout. Visibility-specific cases still use real computed
|
|
55
|
+
// style/hidden/inert checks; native layout is covered in Storybook.
|
|
56
|
+
vi.spyOn(HTMLElement.prototype, 'getClientRects').mockReturnValue([
|
|
57
|
+
new DOMRect(0, 0, 20, 20),
|
|
58
|
+
] as unknown as DOMRectList);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
afterEach(() => {
|
|
62
|
+
vi.restoreAllMocks();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
describe('BottomSheet keyboard scrolling', () => {
|
|
66
|
+
it('adds a named body tab stop only while text-only content overflows', async () => {
|
|
67
|
+
render(<Fixture>Reading details body</Fixture>);
|
|
68
|
+
await measure(100);
|
|
69
|
+
expect(body()).not.toHaveAttribute('tabindex');
|
|
70
|
+
await measure(300);
|
|
71
|
+
expect(body()).toHaveAttribute('tabindex', '0');
|
|
72
|
+
expect(body()).toHaveStyle({overscrollBehaviorY: 'contain'});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('preserves current body focus when overflow disappears', async () => {
|
|
76
|
+
render(<Fixture>Reading details body</Fixture>);
|
|
77
|
+
await measure(300);
|
|
78
|
+
act(() => body().focus());
|
|
79
|
+
await measure(100);
|
|
80
|
+
expect(body()).toHaveFocus();
|
|
81
|
+
expect(body()).toHaveAttribute('tabindex', '-1');
|
|
82
|
+
expect(body()).toHaveStyle({overscrollBehaviorY: 'auto'});
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('retains keyboard access to content that overflows only horizontally', async () => {
|
|
86
|
+
render(<Fixture>Wide reading content</Fixture>);
|
|
87
|
+
await measure(100, 600);
|
|
88
|
+
await waitFor(() =>
|
|
89
|
+
expect(body()).toHaveAttribute('data-scrollable-inline', 'true'),
|
|
90
|
+
);
|
|
91
|
+
expect(body()).toHaveAttribute('tabindex', '0');
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('keeps the named viewport available alongside focusable content', async () => {
|
|
95
|
+
render(
|
|
96
|
+
<Fixture>
|
|
97
|
+
<button type="button">Continue reading</button>
|
|
98
|
+
</Fixture>,
|
|
99
|
+
);
|
|
100
|
+
await measure(300);
|
|
101
|
+
expect(body()).toHaveAttribute('tabindex', '0');
|
|
102
|
+
act(() => screen.getByRole('button').focus());
|
|
103
|
+
expect(screen.getByRole('button')).toHaveFocus();
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it.each([
|
|
107
|
+
<button type="button" key="disabled" disabled>
|
|
108
|
+
Unavailable
|
|
109
|
+
</button>,
|
|
110
|
+
<button type="button" key="hidden" hidden>
|
|
111
|
+
Hidden
|
|
112
|
+
</button>,
|
|
113
|
+
<button type="button" key="negative" tabIndex={-2}>
|
|
114
|
+
Programmatic only
|
|
115
|
+
</button>,
|
|
116
|
+
<button type="button" key="visibility" style={{visibility: 'hidden'}}>
|
|
117
|
+
Hidden by CSS
|
|
118
|
+
</button>,
|
|
119
|
+
<div key="inert" inert>
|
|
120
|
+
<button type="button">Inert</button>
|
|
121
|
+
</div>,
|
|
122
|
+
<fieldset key="fieldset" disabled>
|
|
123
|
+
<button type="button">Disabled by fieldset</button>
|
|
124
|
+
</fieldset>,
|
|
125
|
+
])(
|
|
126
|
+
'ignores a descendant that cannot supply sequential keyboard access (%#)',
|
|
127
|
+
async child => {
|
|
128
|
+
render(<Fixture>{child}</Fixture>);
|
|
129
|
+
await measure(300);
|
|
130
|
+
expect(body()).toHaveAttribute('tabindex', '0');
|
|
131
|
+
},
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
it('does not move focus when a nested child changes', async () => {
|
|
135
|
+
let setHasControl: (value: boolean) => void = () => {};
|
|
136
|
+
function AsyncContent() {
|
|
137
|
+
const [hasControl, update] = useState(false);
|
|
138
|
+
setHasControl = update;
|
|
139
|
+
return hasControl ? (
|
|
140
|
+
<button type="button">Loaded action</button>
|
|
141
|
+
) : (
|
|
142
|
+
<p>Loading text</p>
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
render(
|
|
146
|
+
<Fixture>
|
|
147
|
+
<AsyncContent />
|
|
148
|
+
</Fixture>,
|
|
149
|
+
);
|
|
150
|
+
await measure(300);
|
|
151
|
+
act(() => body().focus());
|
|
152
|
+
act(() => setHasControl(true));
|
|
153
|
+
expect(body()).toHaveAttribute('tabindex', '0');
|
|
154
|
+
expect(body()).toHaveFocus();
|
|
155
|
+
act(() => setHasControl(false));
|
|
156
|
+
await waitFor(() => expect(body()).toHaveAttribute('tabindex', '0'));
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it('retains the viewport when an existing descendant becomes disabled', async () => {
|
|
160
|
+
render(
|
|
161
|
+
<Fixture>
|
|
162
|
+
<button type="button">Continue reading</button>
|
|
163
|
+
</Fixture>,
|
|
164
|
+
);
|
|
165
|
+
await measure(300);
|
|
166
|
+
screen.getByRole('button').setAttribute('disabled', '');
|
|
167
|
+
await waitFor(() => expect(body()).toHaveAttribute('tabindex', '0'));
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it.each(['content', 'ancestor'])(
|
|
171
|
+
'retains the viewport when %s data attributes change child visibility',
|
|
172
|
+
async target => {
|
|
173
|
+
const {container} = render(
|
|
174
|
+
<Fixture>
|
|
175
|
+
<style>
|
|
176
|
+
{'[data-actions="hidden"] button { visibility: hidden; }'}
|
|
177
|
+
</style>
|
|
178
|
+
<div data-testid="conditional-content">
|
|
179
|
+
<button type="button">Conditional action</button>
|
|
180
|
+
</div>
|
|
181
|
+
</Fixture>,
|
|
182
|
+
);
|
|
183
|
+
await measure(300);
|
|
184
|
+
expect(body()).toHaveAttribute('tabindex', '0');
|
|
185
|
+
const owner =
|
|
186
|
+
target === 'content'
|
|
187
|
+
? screen.getByTestId('conditional-content')
|
|
188
|
+
: container;
|
|
189
|
+
owner.setAttribute('data-actions', 'hidden');
|
|
190
|
+
await waitFor(() => expect(body()).toHaveAttribute('tabindex', '0'));
|
|
191
|
+
owner.removeAttribute('data-actions');
|
|
192
|
+
expect(body()).toHaveAttribute('tabindex', '0');
|
|
193
|
+
},
|
|
194
|
+
);
|
|
195
|
+
});
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* @file BottomSheetPanel.test.tsx
|
|
5
5
|
* @input Uses vitest, Testing Library, BottomSheetPanel
|
|
6
|
-
* @output Tests the shared sheet surface motion
|
|
6
|
+
* @output Tests the shared sheet surface motion and keyboard scroll contracts
|
|
7
7
|
* @position Internal presentation tests shared by standalone and switcher modes
|
|
8
8
|
*/
|
|
9
9
|
|
|
@@ -50,6 +50,7 @@ function renderPanel(
|
|
|
50
50
|
) {
|
|
51
51
|
return render(
|
|
52
52
|
<BottomSheetPanel
|
|
53
|
+
label="Sheet details"
|
|
53
54
|
state={state}
|
|
54
55
|
height="hug"
|
|
55
56
|
style={panelTransitionStyle}
|
|
@@ -92,6 +93,7 @@ describe('BottomSheetPanel', () => {
|
|
|
92
93
|
const onMotionComplete = vi.fn();
|
|
93
94
|
const {rerender} = render(
|
|
94
95
|
<BottomSheetPanel
|
|
96
|
+
label="Sheet details"
|
|
95
97
|
state={{kind: 'retained', motion: 'covered', alignmentOffset: 0}}
|
|
96
98
|
height="hug"
|
|
97
99
|
style={panelTransitionStyle}
|
|
@@ -104,6 +106,7 @@ describe('BottomSheetPanel', () => {
|
|
|
104
106
|
|
|
105
107
|
rerender(
|
|
106
108
|
<BottomSheetPanel
|
|
109
|
+
label="Sheet details"
|
|
107
110
|
state={{kind: 'open', entering: true}}
|
|
108
111
|
height="hug"
|
|
109
112
|
style={panelTransitionStyle}
|
|
@@ -139,6 +142,7 @@ describe('BottomSheetPanel', () => {
|
|
|
139
142
|
|
|
140
143
|
rerender(
|
|
141
144
|
<BottomSheetPanel
|
|
145
|
+
label="Sheet details"
|
|
142
146
|
state={{kind: 'exiting'}}
|
|
143
147
|
height="hug"
|
|
144
148
|
style={panelTransitionStyle}
|
|
@@ -166,6 +170,7 @@ describe('BottomSheetPanel', () => {
|
|
|
166
170
|
const onMotionComplete = vi.fn();
|
|
167
171
|
render(
|
|
168
172
|
<BottomSheetPanel
|
|
173
|
+
label="Sheet details"
|
|
169
174
|
state={{kind: 'open', entering: true}}
|
|
170
175
|
height="hug"
|
|
171
176
|
onDismiss={() => {}}
|
|
@@ -184,6 +189,7 @@ describe('BottomSheetPanel', () => {
|
|
|
184
189
|
const onMotionComplete = vi.fn();
|
|
185
190
|
render(
|
|
186
191
|
<BottomSheetPanel
|
|
192
|
+
label="Sheet details"
|
|
187
193
|
state={{kind: 'open', entering: true}}
|
|
188
194
|
height="hug"
|
|
189
195
|
style={{
|
|
@@ -211,6 +217,7 @@ describe('BottomSheetPanel', () => {
|
|
|
211
217
|
const panelRef = vi.fn();
|
|
212
218
|
const {rerender, unmount} = render(
|
|
213
219
|
<BottomSheetPanel
|
|
220
|
+
label="Sheet details"
|
|
214
221
|
ref={panelRef}
|
|
215
222
|
state={{kind: 'open', entering: false}}
|
|
216
223
|
height="hug"
|
|
@@ -223,6 +230,7 @@ describe('BottomSheetPanel', () => {
|
|
|
223
230
|
expect(panelRef).toHaveBeenCalledTimes(1);
|
|
224
231
|
rerender(
|
|
225
232
|
<BottomSheetPanel
|
|
233
|
+
label="Sheet details"
|
|
226
234
|
ref={panelRef}
|
|
227
235
|
state={{kind: 'open', entering: false}}
|
|
228
236
|
height="hug"
|
|
@@ -361,6 +369,7 @@ describe('BottomSheetPanel', () => {
|
|
|
361
369
|
|
|
362
370
|
const {container: closing} = render(
|
|
363
371
|
<BottomSheetPanel
|
|
372
|
+
label="Sheet details"
|
|
364
373
|
state={{kind: 'exiting'}}
|
|
365
374
|
height="hug"
|
|
366
375
|
onDismiss={() => {}}
|
|
@@ -379,6 +388,7 @@ describe('BottomSheetPanel', () => {
|
|
|
379
388
|
|
|
380
389
|
const {container: resting} = render(
|
|
381
390
|
<BottomSheetPanel
|
|
391
|
+
label="Sheet details"
|
|
382
392
|
state={{kind: 'open', entering: false}}
|
|
383
393
|
height="hug"
|
|
384
394
|
onDismiss={() => {}}
|