@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/src/Table/Table.test.tsx
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import {describe, it, expect, vi} from 'vitest';
|
|
13
|
-
import {render, screen} from '@testing-library/react';
|
|
13
|
+
import {act, render, screen} from '@testing-library/react';
|
|
14
14
|
import * as stylex from '@stylexjs/stylex';
|
|
15
15
|
import {BaseTable} from './BaseTable';
|
|
16
16
|
import {Table} from './Table';
|
|
@@ -837,22 +837,95 @@ describe('Table', () => {
|
|
|
837
837
|
expect(screen.getAllByRole('row')).toHaveLength(4);
|
|
838
838
|
});
|
|
839
839
|
|
|
840
|
-
it('wraps table in
|
|
840
|
+
it('wraps the table in an observed scroll content box', () => {
|
|
841
841
|
render(<Table data={users} columns={columns} />);
|
|
842
842
|
const table = screen.getByRole('table');
|
|
843
|
-
const
|
|
843
|
+
const content = table.parentElement;
|
|
844
|
+
const wrapper = content?.parentElement;
|
|
845
|
+
expect(content).toHaveAttribute('data-scroll-content');
|
|
844
846
|
expect(wrapper).toBeTruthy();
|
|
845
847
|
expect(wrapper!.className).toContain('astryx-table-scroll-wrapper');
|
|
846
848
|
});
|
|
847
849
|
|
|
848
|
-
it('
|
|
850
|
+
it('keeps a fitting scroll container out of the keyboard order', () => {
|
|
849
851
|
render(<Table data={users} columns={columns} />);
|
|
850
|
-
const
|
|
851
|
-
|
|
852
|
-
expect(wrapper).
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
852
|
+
const wrapper = screen.getByRole('group', {name: 'Table'});
|
|
853
|
+
expect(wrapper).not.toHaveAttribute('tabindex');
|
|
854
|
+
expect(wrapper.style.overscrollBehaviorX).toBe('auto');
|
|
855
|
+
});
|
|
856
|
+
|
|
857
|
+
it('preserves scroll-wrapper HTML attributes from plugins', () => {
|
|
858
|
+
const plugin: TablePlugin<User> = {
|
|
859
|
+
transformScrollWrapper: props => ({
|
|
860
|
+
...props,
|
|
861
|
+
htmlProps: {
|
|
862
|
+
...props.htmlProps,
|
|
863
|
+
role: 'region',
|
|
864
|
+
'aria-label': 'Orders',
|
|
865
|
+
tabIndex: 2,
|
|
866
|
+
},
|
|
867
|
+
}),
|
|
868
|
+
};
|
|
869
|
+
render(<Table data={users} columns={columns} plugins={{custom: plugin}} />);
|
|
870
|
+
const wrapper = screen.getByRole('region', {name: 'Orders'});
|
|
871
|
+
expect(wrapper).toHaveAttribute('tabindex', '2');
|
|
872
|
+
});
|
|
873
|
+
|
|
874
|
+
it('contains overscroll only while the table scrolls', () => {
|
|
875
|
+
const frames: FrameRequestCallback[] = [];
|
|
876
|
+
vi.stubGlobal(
|
|
877
|
+
'requestAnimationFrame',
|
|
878
|
+
vi.fn((callback: FrameRequestCallback) => {
|
|
879
|
+
frames.push(callback);
|
|
880
|
+
return frames.length;
|
|
881
|
+
}),
|
|
882
|
+
);
|
|
883
|
+
vi.stubGlobal('cancelAnimationFrame', vi.fn());
|
|
884
|
+
|
|
885
|
+
try {
|
|
886
|
+
render(<Table data={users} columns={columns} />);
|
|
887
|
+
const wrapper = screen.getByRole('group', {name: 'Table'});
|
|
888
|
+
Object.assign(wrapper.style, {overflowX: 'auto'});
|
|
889
|
+
for (const [key, value] of Object.entries({
|
|
890
|
+
clientWidth: 100,
|
|
891
|
+
clientHeight: 100,
|
|
892
|
+
scrollWidth: 180,
|
|
893
|
+
scrollHeight: 100,
|
|
894
|
+
scrollLeft: 0,
|
|
895
|
+
scrollTop: 0,
|
|
896
|
+
})) {
|
|
897
|
+
Object.defineProperty(wrapper, key, {
|
|
898
|
+
configurable: true,
|
|
899
|
+
value,
|
|
900
|
+
writable: true,
|
|
901
|
+
});
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
act(() => {
|
|
905
|
+
wrapper.dispatchEvent(new Event('scroll'));
|
|
906
|
+
frames.splice(0).forEach(callback => callback(performance.now()));
|
|
907
|
+
});
|
|
908
|
+
|
|
909
|
+
expect(wrapper).toHaveAttribute('tabindex', '0');
|
|
910
|
+
expect(wrapper).toHaveAttribute('data-scrollable-inline', 'true');
|
|
911
|
+
expect(wrapper.style.overscrollBehaviorX).toBe('contain');
|
|
912
|
+
|
|
913
|
+
Object.defineProperty(wrapper, 'scrollWidth', {
|
|
914
|
+
configurable: true,
|
|
915
|
+
value: 100,
|
|
916
|
+
writable: true,
|
|
917
|
+
});
|
|
918
|
+
act(() => {
|
|
919
|
+
wrapper.dispatchEvent(new Event('scroll'));
|
|
920
|
+
frames.splice(0).forEach(callback => callback(performance.now()));
|
|
921
|
+
});
|
|
922
|
+
|
|
923
|
+
expect(wrapper).not.toHaveAttribute('tabindex');
|
|
924
|
+
expect(wrapper).not.toHaveAttribute('data-scrollable-inline');
|
|
925
|
+
expect(wrapper.style.overscrollBehaviorX).toBe('auto');
|
|
926
|
+
} finally {
|
|
927
|
+
vi.unstubAllGlobals();
|
|
928
|
+
}
|
|
856
929
|
});
|
|
857
930
|
|
|
858
931
|
it('uses table-layout: auto in children mode', () => {
|
package/src/Table/Table.tsx
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* SYNC: When modified, update these files to stay in sync:
|
|
12
12
|
* - /packages/core/src/Table/Table.doc.mjs (props table, features, usage examples)
|
|
13
13
|
* - /packages/core/src/Table/Table.test.tsx (tests for new/changed behavior)
|
|
14
|
+
* - /packages/core/src/Table/__tests__/TableScroll.a11y.chromium.spec.ts (browser scroll behavior)
|
|
14
15
|
* - /packages/core/src/Table/index.ts (exports if types change)
|
|
15
16
|
* - /apps/storybook/stories/Table.stories.tsx (storybook stories)
|
|
16
17
|
* - /packages/cli/assets/templates/blocks/components/Table/ (showcase blocks)
|
|
@@ -22,6 +23,7 @@ import {colorVars} from '../theme/tokens.stylex';
|
|
|
22
23
|
import {BaseTable} from './BaseTable';
|
|
23
24
|
import {TableContext} from './TableContext';
|
|
24
25
|
import {useBaseTablePlugins} from './useBaseTablePlugins';
|
|
26
|
+
import {useScrollableArea} from '../hooks/useScrollableArea';
|
|
25
27
|
import {mergeProps} from '../utils';
|
|
26
28
|
import {themeProps} from '../utils/themeProps';
|
|
27
29
|
import type {
|
|
@@ -149,30 +151,36 @@ function TableScrollWrapper({
|
|
|
149
151
|
afterTable?: React.ReactNode;
|
|
150
152
|
}) {
|
|
151
153
|
const t = useTranslator();
|
|
154
|
+
const label = t('@astryx.table.label');
|
|
155
|
+
const {getViewportProps, getContentProps, state} = useScrollableArea({
|
|
156
|
+
axis: 'inline',
|
|
157
|
+
keyboardAccess: {owner: 'content'},
|
|
158
|
+
overscroll: 'contain',
|
|
159
|
+
});
|
|
152
160
|
const {ref, ...restHtmlProps} = htmlProps ?? {};
|
|
161
|
+
const viewportProps = getViewportProps<HTMLDivElement>({
|
|
162
|
+
role: 'group',
|
|
163
|
+
'aria-label': label,
|
|
164
|
+
...(state.inline.isScrollable ? {tabIndex: 0} : {}),
|
|
165
|
+
...restHtmlProps,
|
|
166
|
+
ref,
|
|
167
|
+
...mergeProps(
|
|
168
|
+
themeProps('table-scroll-wrapper'),
|
|
169
|
+
stylex.props(
|
|
170
|
+
scrollWrapperStyles.base,
|
|
171
|
+
scrollWrapperStyles.containerBleed,
|
|
172
|
+
...(pluginStyles ?? []),
|
|
173
|
+
),
|
|
174
|
+
),
|
|
175
|
+
});
|
|
176
|
+
|
|
153
177
|
return (
|
|
154
|
-
<div
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
// htmlProps.
|
|
161
|
-
tabIndex={0}
|
|
162
|
-
role="group"
|
|
163
|
-
aria-label={t('@astryx.table.label')}
|
|
164
|
-
{...restHtmlProps}
|
|
165
|
-
{...mergeProps(
|
|
166
|
-
themeProps('table-scroll-wrapper'),
|
|
167
|
-
stylex.props(
|
|
168
|
-
scrollWrapperStyles.base,
|
|
169
|
-
scrollWrapperStyles.containerBleed,
|
|
170
|
-
...(pluginStyles ?? []),
|
|
171
|
-
),
|
|
172
|
-
)}>
|
|
173
|
-
{beforeTable}
|
|
174
|
-
{children}
|
|
175
|
-
{afterTable}
|
|
178
|
+
<div {...viewportProps}>
|
|
179
|
+
<div {...getContentProps<HTMLDivElement>()}>
|
|
180
|
+
{beforeTable}
|
|
181
|
+
{children}
|
|
182
|
+
{afterTable}
|
|
183
|
+
</div>
|
|
176
184
|
</div>
|
|
177
185
|
);
|
|
178
186
|
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file TableScroll.a11y.chromium.spec.ts
|
|
5
|
+
* @input Built responsive Table story and real Chromium wheel input
|
|
6
|
+
* @output Browser evidence for conditional inline containment and scroll chaining
|
|
7
|
+
* @position Table integration proof for the shared useScrollableArea behavior
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import {expect, test, type Locator, type Page} 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
|
+
test.beforeAll(async () => {
|
|
19
|
+
storybook = await serveStorybook(
|
|
20
|
+
process.env.ASTRYX_STORYBOOK_DIR ?? DEFAULT_STORYBOOK_DIR,
|
|
21
|
+
);
|
|
22
|
+
});
|
|
23
|
+
test.afterAll(async () => {
|
|
24
|
+
await storybook?.close();
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
async function mount(page: Page) {
|
|
28
|
+
await page.goto(
|
|
29
|
+
`${storybook.origin}/iframe.html?id=core-table--responsive-scroll&viewMode=story`,
|
|
30
|
+
);
|
|
31
|
+
const wrappers = page.locator('.astryx-table-scroll-wrapper');
|
|
32
|
+
await expect(wrappers).toHaveCount(3);
|
|
33
|
+
return wrappers;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function putInsideOuterScroller(
|
|
37
|
+
page: Page,
|
|
38
|
+
viewport: Locator,
|
|
39
|
+
viewportWidth: number,
|
|
40
|
+
contentWidth: number,
|
|
41
|
+
tableWidth: number,
|
|
42
|
+
) {
|
|
43
|
+
await viewport.evaluate(
|
|
44
|
+
(node, sizes) => {
|
|
45
|
+
const outer = document.createElement('div');
|
|
46
|
+
outer.dataset.tableScrollOuter = '';
|
|
47
|
+
outer.style.inlineSize = `${sizes.viewportWidth}px`;
|
|
48
|
+
outer.style.overflowX = 'auto';
|
|
49
|
+
const content = document.createElement('div');
|
|
50
|
+
content.style.inlineSize = `${sizes.contentWidth}px`;
|
|
51
|
+
node.parentElement?.insertBefore(outer, node);
|
|
52
|
+
outer.append(content);
|
|
53
|
+
content.append(node);
|
|
54
|
+
(node as HTMLElement).style.inlineSize = `${sizes.tableWidth}px`;
|
|
55
|
+
},
|
|
56
|
+
{viewportWidth, contentWidth, tableWidth},
|
|
57
|
+
);
|
|
58
|
+
return page.locator('[data-table-scroll-outer]');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function wheelInline(page: Page, target: Locator) {
|
|
62
|
+
const box = await target.boundingBox();
|
|
63
|
+
if (box == null) {
|
|
64
|
+
throw new Error('Table scroll viewport has no rendered bounds');
|
|
65
|
+
}
|
|
66
|
+
await page.mouse.move(box.x + Math.min(box.width / 2, 100), box.y + 20);
|
|
67
|
+
await page.mouse.wheel(200, 0);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
test('an overflowing table contains horizontal wheel input at its edge', async ({
|
|
71
|
+
page,
|
|
72
|
+
}) => {
|
|
73
|
+
const wrappers = await mount(page);
|
|
74
|
+
const tableViewport = wrappers.nth(0);
|
|
75
|
+
await tableViewport.locator('table').evaluate(table => {
|
|
76
|
+
const viewport = table.closest<HTMLElement>('.astryx-table-scroll-wrapper');
|
|
77
|
+
if (viewport != null) {
|
|
78
|
+
table.style.minWidth = `${viewport.clientWidth + 400}px`;
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
await expect(tableViewport).toHaveAttribute('data-scrollable-inline', 'true');
|
|
82
|
+
await expect(tableViewport).toHaveAttribute('tabindex', '0');
|
|
83
|
+
await expect
|
|
84
|
+
.poll(async () =>
|
|
85
|
+
tableViewport.evaluate(
|
|
86
|
+
element => getComputedStyle(element).overscrollBehaviorX,
|
|
87
|
+
),
|
|
88
|
+
)
|
|
89
|
+
.toBe('contain');
|
|
90
|
+
|
|
91
|
+
const outer = await putInsideOuterScroller(
|
|
92
|
+
page,
|
|
93
|
+
tableViewport,
|
|
94
|
+
320,
|
|
95
|
+
800,
|
|
96
|
+
320,
|
|
97
|
+
);
|
|
98
|
+
await tableViewport.evaluate(element => {
|
|
99
|
+
element.scrollLeft = element.scrollWidth - element.clientWidth;
|
|
100
|
+
});
|
|
101
|
+
await wheelInline(page, tableViewport);
|
|
102
|
+
await expect
|
|
103
|
+
.poll(async () => outer.evaluate(element => element.scrollLeft))
|
|
104
|
+
.toBe(0);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
test('a fitting table passes horizontal wheel input to its outer scroller', async ({
|
|
108
|
+
page,
|
|
109
|
+
}) => {
|
|
110
|
+
const wrappers = await mount(page);
|
|
111
|
+
const tableViewport = wrappers.nth(2);
|
|
112
|
+
const outer = await putInsideOuterScroller(
|
|
113
|
+
page,
|
|
114
|
+
tableViewport,
|
|
115
|
+
320,
|
|
116
|
+
800,
|
|
117
|
+
800,
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
await expect(tableViewport).not.toHaveAttribute(
|
|
121
|
+
'data-scrollable-inline',
|
|
122
|
+
'true',
|
|
123
|
+
);
|
|
124
|
+
await expect(tableViewport).not.toHaveAttribute('tabindex');
|
|
125
|
+
await expect
|
|
126
|
+
.poll(async () =>
|
|
127
|
+
tableViewport.evaluate(
|
|
128
|
+
element => getComputedStyle(element).overscrollBehaviorX,
|
|
129
|
+
),
|
|
130
|
+
)
|
|
131
|
+
.toBe('auto');
|
|
132
|
+
|
|
133
|
+
await wheelInline(page, tableViewport);
|
|
134
|
+
await expect
|
|
135
|
+
.poll(async () => outer.evaluate(element => element.scrollLeft))
|
|
136
|
+
.toBeGreaterThan(0);
|
|
137
|
+
});
|
|
@@ -95,9 +95,14 @@ const styles = stylex.create({
|
|
|
95
95
|
paddingBlock: spacingVars['--spacing-1'],
|
|
96
96
|
paddingInline: 'var(--_textarea-inline-padding)',
|
|
97
97
|
fontFamily: typographyVars['--font-family-body'],
|
|
98
|
+
// The 16px floor is iOS-only: iOS Safari zooms the page when a focused
|
|
99
|
+
// control sits under 16px, and only iOS WebKit implements
|
|
100
|
+
// -webkit-touch-callout to key the coarse-pointer floor to it.
|
|
98
101
|
fontSize: {
|
|
99
102
|
default: typeScaleVars['--text-body-size'],
|
|
100
|
-
'@media (pointer: coarse)':
|
|
103
|
+
'@media (pointer: coarse)': {
|
|
104
|
+
'@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
|
|
105
|
+
},
|
|
101
106
|
},
|
|
102
107
|
lineHeight: typeScaleVars['--text-body-leading'],
|
|
103
108
|
color: colorVars['--color-text-primary'],
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @file TextInput.test.tsx
|
|
5
|
-
* @input Uses vitest, @testing-library/react, TextInput component
|
|
5
|
+
* @input Uses vitest, @testing-library/react, TextInput component, and the
|
|
6
|
+
* shared declaredValue StyleX read-back helper
|
|
6
7
|
* @output Unit tests for TextInput component behavior
|
|
7
8
|
* @position Testing; validates TextInput.tsx implementation
|
|
8
9
|
*
|
|
@@ -13,6 +14,7 @@ import {describe, it, expect, vi, beforeEach} from 'vitest';
|
|
|
13
14
|
import {render, screen, fireEvent, waitFor} from '@testing-library/react';
|
|
14
15
|
import userEvent from '@testing-library/user-event';
|
|
15
16
|
import {TestIcon} from '../__tests__/TestIcon';
|
|
17
|
+
import {declaredValue} from '../__tests__/stylexDeclarations';
|
|
16
18
|
import {InputGroup} from '../InputGroup';
|
|
17
19
|
import {TextInput} from './TextInput';
|
|
18
20
|
|
|
@@ -1113,3 +1115,20 @@ describe('TextInput clear button focus behavior', () => {
|
|
|
1113
1115
|
rafSpy.mockRestore();
|
|
1114
1116
|
});
|
|
1115
1117
|
});
|
|
1118
|
+
|
|
1119
|
+
describe('TextInput text size', () => {
|
|
1120
|
+
it('renders the theme body size outside the iOS zoom gate', () => {
|
|
1121
|
+
// The 16px floor rides `@supports (-webkit-touch-callout: none)` inside
|
|
1122
|
+
// `@media (pointer: coarse)` — iOS Safari is the browser that zooms on
|
|
1123
|
+
// focus under 16px, so the floor targets it alone instead of every
|
|
1124
|
+
// coarse pointer. jsdom's CSSOM drops at-rule-wrapped declarations it
|
|
1125
|
+
// cannot parse, so the gate itself is pinned against the sources in
|
|
1126
|
+
// inputFontFloor.test.ts; what this asserts is the visible result off
|
|
1127
|
+
// the gate: the plain token size, not a floor.
|
|
1128
|
+
render(<TextInput label="Name" value="" onChange={() => {}} />);
|
|
1129
|
+
expect(declaredValue(screen.getByLabelText('Name'), 'font-size')).toBe(
|
|
1130
|
+
'var(--text-body-size)',
|
|
1131
|
+
);
|
|
1132
|
+
});
|
|
1133
|
+
});
|
|
1134
|
+
|
|
@@ -58,9 +58,14 @@ const styles = stylex.create({
|
|
|
58
58
|
borderStyle: 'none',
|
|
59
59
|
padding: 0,
|
|
60
60
|
fontFamily: typographyVars['--font-family-body'],
|
|
61
|
+
// The 16px floor is iOS-only: iOS Safari zooms the page when a focused
|
|
62
|
+
// control sits under 16px, and only iOS WebKit implements
|
|
63
|
+
// -webkit-touch-callout to key the coarse-pointer floor to it.
|
|
61
64
|
fontSize: {
|
|
62
65
|
default: typeScaleVars['--text-body-size'],
|
|
63
|
-
'@media (pointer: coarse)':
|
|
66
|
+
'@media (pointer: coarse)': {
|
|
67
|
+
'@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
|
|
68
|
+
},
|
|
64
69
|
},
|
|
65
70
|
lineHeight: typeScaleVars['--text-body-leading'],
|
|
66
71
|
color: colorVars['--color-text-primary'],
|
|
@@ -95,9 +95,14 @@ const styles = stylex.create({
|
|
|
95
95
|
borderStyle: 'none',
|
|
96
96
|
padding: 0,
|
|
97
97
|
fontFamily: typographyVars['--font-family-body'],
|
|
98
|
+
// The 16px floor is iOS-only: iOS Safari zooms the page when a focused
|
|
99
|
+
// control sits under 16px, and only iOS WebKit implements
|
|
100
|
+
// -webkit-touch-callout to key the coarse-pointer floor to it.
|
|
98
101
|
fontSize: {
|
|
99
102
|
default: typeScaleVars['--text-body-size'],
|
|
100
|
-
'@media (pointer: coarse)':
|
|
103
|
+
'@media (pointer: coarse)': {
|
|
104
|
+
'@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
|
|
105
|
+
},
|
|
101
106
|
},
|
|
102
107
|
lineHeight: typeScaleVars['--text-body-leading'],
|
|
103
108
|
color: colorVars['--color-text-primary'],
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/** @type {import('@astryxdesign/cli/authoring').ComponentAnatomyElement[]} */
|
|
4
|
+
const anatomy = [
|
|
5
|
+
{
|
|
6
|
+
name: 'Elapsed time',
|
|
7
|
+
required: true,
|
|
8
|
+
description:
|
|
9
|
+
'Semantic time element containing a standardized elapsed duration.',
|
|
10
|
+
},
|
|
11
|
+
];
|
|
12
|
+
|
|
13
|
+
/** @type {import('@astryxdesign/cli/authoring').ComponentDoc} */
|
|
14
|
+
export const docs = {
|
|
15
|
+
name: 'Timer',
|
|
16
|
+
displayName: 'Timer',
|
|
17
|
+
category: 'Content',
|
|
18
|
+
keywords: [
|
|
19
|
+
'timer',
|
|
20
|
+
'elapsed',
|
|
21
|
+
'duration',
|
|
22
|
+
'seconds',
|
|
23
|
+
'minutes',
|
|
24
|
+
'hours',
|
|
25
|
+
'stopwatch',
|
|
26
|
+
'waiting',
|
|
27
|
+
'loading',
|
|
28
|
+
'processing',
|
|
29
|
+
],
|
|
30
|
+
props: [
|
|
31
|
+
{
|
|
32
|
+
name: 'startTime',
|
|
33
|
+
type: 'number',
|
|
34
|
+
description:
|
|
35
|
+
"Unix time in milliseconds when the measured operation began. Omit it to start from this Timer's mount.",
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'format',
|
|
39
|
+
type: "'elapsed' | 'clock'",
|
|
40
|
+
description:
|
|
41
|
+
'Standard duration representation. Elapsed uses compact units and drops seconds after one hour; clock uses m:ss or h:mm:ss.',
|
|
42
|
+
default: "'elapsed'",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'type',
|
|
46
|
+
type: "'body' | 'large' | 'label' | 'supporting' | 'code' | 'display-1' | 'display-2' | 'display-3' | 'inherit'",
|
|
47
|
+
description:
|
|
48
|
+
'Semantic text type. Uses the same typography behavior as Timestamp.',
|
|
49
|
+
default: "'supporting'",
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: 'size',
|
|
53
|
+
type: "'4xs' | '3xs' | '2xs' | 'xsm' | 'sm' | 'base' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl'",
|
|
54
|
+
description: 'Explicit font size override. Overrides the size from type.',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: 'color',
|
|
58
|
+
type: "'primary' | 'secondary' | 'disabled' | 'placeholder' | 'accent' | 'inherit'",
|
|
59
|
+
description: 'Text color.',
|
|
60
|
+
default: "'secondary'",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'weight',
|
|
64
|
+
type: "'normal' | 'medium' | 'semibold' | 'bold'",
|
|
65
|
+
description: 'Font weight override.',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: 'xstyle',
|
|
69
|
+
type: 'StyleXStyles',
|
|
70
|
+
description:
|
|
71
|
+
'StyleX styles for the Text wrapper. Must be a stylex.create() value.',
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: 'className',
|
|
75
|
+
type: 'string',
|
|
76
|
+
description:
|
|
77
|
+
'CSS class name for the Text wrapper. Prefer xstyle for styling.',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: 'style',
|
|
81
|
+
type: 'CSSProperties',
|
|
82
|
+
description:
|
|
83
|
+
'Inline styles for the Text wrapper. Prefer xstyle for styling.',
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
examples: [
|
|
87
|
+
{
|
|
88
|
+
label: 'Elapsed duration',
|
|
89
|
+
code: '<Timer />',
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
label: 'Stopwatch clock',
|
|
93
|
+
code: '<Timer format="clock" />',
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
label: 'Operation that started before mount',
|
|
97
|
+
code: '<Timer startTime={operationStartedAt} />',
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
label: 'Match surrounding text',
|
|
101
|
+
code: `<Text>
|
|
102
|
+
Processing for <Timer type="inherit" color="inherit" />
|
|
103
|
+
</Text>`,
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
label: 'Prominent elapsed time',
|
|
107
|
+
code: '<Timer type="body" size="lg" color="primary" weight="semibold" />',
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
theming: {
|
|
111
|
+
targets: [{className: 'astryx-timer'}],
|
|
112
|
+
},
|
|
113
|
+
usage: {
|
|
114
|
+
anatomy,
|
|
115
|
+
description:
|
|
116
|
+
'Displays a standardized elapsed duration for active work without scheduling a React render on every tick. Elapsed format updates by second below one hour and by minute after one hour; clock format remains second-precise.',
|
|
117
|
+
bestPractices: [
|
|
118
|
+
{
|
|
119
|
+
guidance: true,
|
|
120
|
+
description:
|
|
121
|
+
'Use elapsed for compact duration text that may span seconds, minutes, or hours.',
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
guidance: true,
|
|
125
|
+
description:
|
|
126
|
+
'Use clock for stopwatch-like surfaces where seconds remain meaningful after an hour.',
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
guidance: true,
|
|
130
|
+
description:
|
|
131
|
+
'Pass startTime when the operation began before Timer mounted so the display reflects the complete wait.',
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
guidance: false,
|
|
135
|
+
description:
|
|
136
|
+
'Do not use Timer for dates, time zones, or relative calendar language; use Timestamp instead.',
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
guidance: false,
|
|
140
|
+
description:
|
|
141
|
+
'Do not add aria-live unless hearing an announcement every tick is appropriate for the specific task.',
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
/** @type {import('@astryxdesign/cli/authoring').ComponentTranslationDoc} */
|
|
148
|
+
export const docsDense = {
|
|
149
|
+
description:
|
|
150
|
+
'Standardized elapsed or stopwatch duration with clock-derived, non-rendering DOM updates.',
|
|
151
|
+
propDescriptions: {
|
|
152
|
+
startTime:
|
|
153
|
+
"operation start as Unix milliseconds; omit to count from Timer's mount",
|
|
154
|
+
format: 'elapsed compact units or clock stopwatch notation',
|
|
155
|
+
type: 'semantic text type; defaults to supporting like Timestamp',
|
|
156
|
+
size: 'explicit font size override',
|
|
157
|
+
color: 'text color; defaults to secondary like Timestamp',
|
|
158
|
+
weight: 'font weight override',
|
|
159
|
+
xstyle: 'StyleX styles for the Text wrapper',
|
|
160
|
+
className: 'CSS class for the Text wrapper',
|
|
161
|
+
style: 'inline styles for the Text wrapper',
|
|
162
|
+
},
|
|
163
|
+
usage: {
|
|
164
|
+
anatomy,
|
|
165
|
+
description:
|
|
166
|
+
'Use for active-operation elapsed time when periodic React renders would add avoidable work.',
|
|
167
|
+
bestPractices: [
|
|
168
|
+
{
|
|
169
|
+
guidance: true,
|
|
170
|
+
description:
|
|
171
|
+
'Use elapsed for compact durations and clock for stopwatch UI.',
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
guidance: true,
|
|
175
|
+
description: 'Pass startTime for work that began before mount.',
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
guidance: false,
|
|
179
|
+
description: 'Use Timestamp for dates and relative calendar language.',
|
|
180
|
+
},
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
};
|