@astryxdesign/core 0.6.2 → 0.6.3-canary.039a67e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +81 -0
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +33 -12
- package/dist/BottomSheet/BottomSheet.d.ts +1 -1
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +3 -1
- package/dist/BottomSheet/BottomSheetPanel.d.ts +7 -5
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +56 -19
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +13 -28
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +10 -5
- package/dist/Chat/ChatComposerDrawer.d.ts +19 -5
- package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
- package/dist/Chat/ChatComposerDrawer.js +48 -23
- package/dist/Chat/ChatComposerInput.d.ts +11 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +63 -16
- package/dist/Chat/ChatDictationButton.d.ts +3 -2
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +6 -4
- package/dist/Chat/ChatLayout.d.ts +19 -0
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +19 -0
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +44 -34
- package/dist/Chat/ChatMessageBubble.d.ts +2 -0
- package/dist/Chat/ChatMessageBubble.d.ts.map +1 -1
- package/dist/Chat/ChatMessageBubble.js +5 -3
- package/dist/Chat/ChatMessageList.d.ts +2 -1
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +4 -3
- package/dist/Chat/ChatMessageMetadata.d.ts +5 -4
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatMessageMetadata.js +12 -9
- package/dist/Chat/ChatSendButton.d.ts +2 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +6 -4
- package/dist/Chat/ChatSystemMessage.d.ts +3 -3
- package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
- package/dist/Chat/ChatSystemMessage.js +2 -2
- package/dist/Chat/ChatTokenizedText.d.ts +6 -6
- package/dist/Chat/ChatTokenizedText.js +10 -6
- package/dist/Chat/ChatToolCalls.d.ts +7 -9
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +43 -26
- package/dist/Chat/index.d.ts +1 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +12 -2
- package/dist/Citation/Citation.d.ts +1 -1
- package/dist/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +3 -2
- package/dist/CodeBlock/highlightRanges.d.ts.map +1 -1
- package/dist/CodeBlock/highlightRanges.js +14 -3
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +6 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +1 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +1 -1
- package/dist/DateInput/DateInput.d.ts +25 -5
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +29 -17
- package/dist/DateInput/NativeDateField.d.ts.map +1 -1
- package/dist/DateInput/NativeDateField.js +16 -16
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +2 -2
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +4 -4
- package/dist/DateTimeInput/DateTimeInput.d.ts +32 -15
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +55 -30
- package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
- package/dist/DateTimeInput/TouchDateTimeField.js +4 -4
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts +9 -3
- package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts.map +1 -1
- package/dist/DateTimeInput/nativePickerSegmentStyles.js +3 -3
- package/dist/Dialog/DialogHeader.d.ts +8 -1
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +13 -4
- package/dist/Field/InputClearButton.d.ts +4 -2
- package/dist/Field/InputClearButton.d.ts.map +1 -1
- package/dist/Field/InputClearButton.js +4 -2
- package/dist/Field/PanelSearchInput.d.ts.map +1 -1
- package/dist/Field/PanelSearchInput.js +1 -1
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +7 -7
- package/dist/Icon/Icon.d.ts +6 -31
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +8 -71
- package/dist/Icon/IconDefaultSizeContext.d.ts +4 -0
- package/dist/Icon/IconDefaultSizeContext.d.ts.map +1 -0
- package/dist/Icon/IconDefaultSizeContext.js +18 -0
- package/dist/Icon/IconSize.stylex.d.ts +65 -0
- package/dist/Icon/IconSize.stylex.d.ts.map +1 -0
- package/dist/Icon/IconSize.stylex.js +75 -0
- package/dist/Item/Item.d.ts +1 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +4 -3
- package/dist/Kbd/Kbd.d.ts +5 -3
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +36 -42
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +6 -2
- package/dist/Link/useLinkComponent.d.ts +5 -15
- package/dist/Link/useLinkComponent.d.ts.map +1 -1
- package/dist/Link/useLinkComponent.js +34 -51
- package/dist/List/List.d.ts +19 -1
- package/dist/List/List.d.ts.map +1 -1
- package/dist/List/List.js +9 -2
- package/dist/List/ListContext.d.ts +1 -0
- package/dist/List/ListContext.d.ts.map +1 -1
- package/dist/List/ListContext.js +2 -1
- package/dist/List/ListItem.d.ts +1 -1
- package/dist/List/ListItem.d.ts.map +1 -1
- package/dist/List/ListItem.js +9 -2
- package/dist/Markdown/Markdown.d.ts +8 -2
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.fr23.bench.d.ts +2 -0
- package/dist/Markdown/Markdown.fr23.bench.d.ts.map +1 -0
- package/dist/Markdown/Markdown.fr23.bench.js +150 -0
- package/dist/Markdown/Markdown.fr23.sampling.d.ts +2 -0
- package/dist/Markdown/Markdown.fr23.sampling.d.ts.map +1 -0
- package/dist/Markdown/Markdown.fr23.sampling.js +43 -0
- package/dist/Markdown/Markdown.js +262 -109
- package/dist/Markdown/ast.d.ts +162 -0
- package/dist/Markdown/ast.d.ts.map +1 -0
- package/dist/Markdown/ast.js +74 -0
- package/dist/Markdown/index.d.ts +5 -3
- package/dist/Markdown/index.d.ts.map +1 -1
- package/dist/Markdown/index.js +3 -2
- package/dist/Markdown/parser/index.d.ts +10 -0
- package/dist/Markdown/parser/index.d.ts.map +1 -0
- package/dist/Markdown/parser/index.js +10 -0
- package/dist/Markdown/parser.d.ts +126 -58
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +726 -177
- package/dist/Markdown/plugins/frontmatter.d.ts +32 -0
- package/dist/Markdown/plugins/frontmatter.d.ts.map +1 -0
- package/dist/Markdown/plugins/frontmatter.js +132 -0
- package/dist/Markdown/plugins/index.d.ts +17 -0
- package/dist/Markdown/plugins/index.d.ts.map +1 -0
- package/dist/Markdown/plugins/index.js +14 -0
- package/dist/Markdown/plugins/protocol.d.ts +191 -0
- package/dist/Markdown/plugins/protocol.d.ts.map +1 -0
- package/dist/Markdown/plugins/protocol.js +957 -0
- package/dist/Markdown/plugins/semanticFence.d.ts +36 -0
- package/dist/Markdown/plugins/semanticFence.d.ts.map +1 -0
- package/dist/Markdown/plugins/semanticFence.js +213 -0
- package/dist/Markdown/plugins/softBreaks.d.ts +3 -0
- package/dist/Markdown/plugins/softBreaks.d.ts.map +1 -0
- package/dist/Markdown/plugins/softBreaks.js +172 -0
- package/dist/Markdown/plugins/sourceDecoration.d.ts +76 -0
- package/dist/Markdown/plugins/sourceDecoration.d.ts.map +1 -0
- package/dist/Markdown/plugins/sourceDecoration.js +393 -0
- package/dist/Markdown/plugins/textTransform.d.ts +30 -0
- package/dist/Markdown/plugins/textTransform.d.ts.map +1 -0
- package/dist/Markdown/plugins/textTransform.js +374 -0
- package/dist/Markdown/remark.d.ts +196 -0
- package/dist/Markdown/remark.d.ts.map +1 -0
- package/dist/Markdown/remark.js +1062 -0
- package/dist/Markdown/url.d.ts +6 -0
- package/dist/Markdown/url.d.ts.map +1 -0
- package/dist/Markdown/url.js +31 -0
- package/dist/Markdown/utils.d.ts +4 -2
- package/dist/Markdown/utils.d.ts.map +1 -1
- package/dist/Markdown/utils.js +2 -1
- package/dist/MetadataList/MetadataList.js +3 -3
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +4 -4
- package/dist/Outline/index.d.ts +1 -0
- package/dist/Outline/index.d.ts.map +1 -1
- package/dist/Outline/parseOutlineFromMarkdown.d.ts +7 -1
- package/dist/Outline/parseOutlineFromMarkdown.d.ts.map +1 -1
- package/dist/Outline/parseOutlineFromMarkdown.js +14 -8
- package/dist/Outline/useOutlineFromMarkdown.d.ts +3 -1
- package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
- package/dist/Outline/useOutlineFromMarkdown.js +8 -3
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +46 -30
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +5 -0
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +36 -31
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +13 -1
- package/dist/ScrollableArea/ScrollableArea.d.ts +1 -0
- package/dist/ScrollableArea/ScrollableArea.d.ts.map +1 -1
- package/dist/ScrollableArea/ScrollableArea.js +1 -0
- package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +1 -0
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +5 -5
- package/dist/Selector/Selector.d.ts +9 -7
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +16 -7
- package/dist/SideNav/SideNav.d.ts +2 -1
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +9 -3
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +28 -12
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +23 -7
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +11 -0
- package/dist/TabList/Tab.d.ts +1 -1
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +20 -7
- package/dist/Table/Table.d.ts +1 -0
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +29 -13
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +1 -1
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +2 -2
- package/dist/TimeInput/TimeInput.d.ts +30 -14
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +61 -13
- package/dist/TimeInput/TouchTimeField.d.ts +11 -0
- package/dist/TimeInput/TouchTimeField.d.ts.map +1 -0
- package/dist/TimeInput/TouchTimeField.js +417 -0
- package/dist/TimeInput/index.d.ts +1 -1
- package/dist/TimeInput/index.d.ts.map +1 -1
- package/dist/Timer/Timer.d.ts +49 -0
- package/dist/Timer/Timer.d.ts.map +1 -0
- package/dist/Timer/Timer.js +158 -0
- package/dist/Timer/index.d.ts +9 -0
- package/dist/Timer/index.d.ts.map +1 -0
- package/dist/Timer/index.js +10 -0
- package/dist/ToggleButton/ToggleButton.d.ts +9 -6
- package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButton.js +15 -27
- package/dist/TopNav/TopNavMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +3 -2
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +3 -0
- package/dist/TreeList/TreeListItem.d.ts +6 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +12 -2
- package/dist/TreeList/TreeListTypes.d.ts +8 -1
- package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +16 -7
- package/dist/astryx.css +27 -11
- package/dist/hooks/scrollKeyboardDelegation.d.ts +3 -0
- package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -0
- package/dist/hooks/scrollKeyboardDelegation.js +146 -0
- package/dist/hooks/useClickableContainer.d.ts +10 -1
- package/dist/hooks/useClickableContainer.d.ts.map +1 -1
- package/dist/hooks/useClickableContainer.js +15 -4
- package/dist/hooks/useScrollableArea.d.ts +6 -2
- package/dist/hooks/useScrollableArea.d.ts.map +1 -1
- package/dist/hooks/useScrollableArea.js +17 -5
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/theme/declarationBoundary.d.ts +17 -0
- package/dist/theme/declarationBoundary.d.ts.map +1 -0
- package/dist/theme/declarationBoundary.js +343 -0
- package/dist/theme/defineTheme.d.ts +3 -0
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/defineTheme.js +4 -1
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +4 -0
- package/dist/theme/generateThemeRules.d.ts +15 -7
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +143 -35
- package/dist/theme/themeAdaptations.d.ts +5 -3
- package/dist/theme/themeAdaptations.d.ts.map +1 -1
- package/dist/theme/themeAdaptations.js +33 -5
- package/dist/utils/inputPresentation.d.ts +55 -0
- package/dist/utils/inputPresentation.d.ts.map +1 -0
- package/dist/utils/inputPresentation.js +108 -0
- package/dist/utils/interactionOverlay.stylex.d.ts +8 -0
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +9 -0
- package/dist/utils/safeUrl.d.ts +11 -0
- package/dist/utils/safeUrl.d.ts.map +1 -0
- package/dist/utils/safeUrl.js +78 -0
- package/locales/af-ZA.json +530 -1
- package/locales/ar-SA.json +490 -1
- package/locales/ca-ES.json +514 -1
- package/locales/cs-CZ.json +498 -1
- package/locales/da-DK.json +522 -1
- package/locales/de-DE.json +522 -1
- package/locales/el-GR.json +498 -1
- package/locales/es-ES.json +510 -1
- package/locales/fi-FI.json +498 -1
- package/locales/fr-FR.json +534 -1
- package/locales/he-IL.json +498 -1
- package/locales/hu-HU.json +498 -1
- package/locales/it-IT.json +510 -1
- package/locales/ja-JP.json +490 -1
- package/locales/ko-KR.json +498 -1
- package/locales/nl-NL.json +534 -1
- package/locales/no-NO.json +510 -1
- package/locales/pl-PL.json +506 -1
- package/locales/pt-BR.json +506 -1
- package/locales/pt-PT.json +506 -1
- package/locales/ro-RO.json +506 -1
- package/locales/ru-RU.json +498 -1
- package/locales/sr-SP.json +498 -1
- package/locales/sv-SE.json +502 -1
- package/locales/tr-TR.json +498 -1
- package/locales/uk-UA.json +498 -1
- package/locales/vi-VN.json +502 -1
- package/locales/zh-CN.json +490 -1
- package/locales/zh-TW.json +490 -1
- package/package.json +24 -4
- package/src/Avatar/Avatar.doc.mjs +1 -1
- package/src/Avatar/Avatar.test.tsx +30 -0
- package/src/Avatar/Avatar.tsx +38 -14
- package/src/BottomSheet/BottomSheet.doc.mjs +8 -1
- package/src/BottomSheet/BottomSheet.spec.md +46 -20
- package/src/BottomSheet/BottomSheet.test.tsx +6 -3
- package/src/BottomSheet/BottomSheet.tsx +3 -1
- package/src/BottomSheet/BottomSheetKeyboard.test.tsx +195 -0
- package/src/BottomSheet/BottomSheetPanel.test.tsx +11 -1
- package/src/BottomSheet/BottomSheetPanel.tsx +49 -16
- package/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts +344 -0
- package/src/Button/Button.doc.mjs +5 -5
- package/src/Button/Button.tsx +15 -13
- package/src/Button/__tests__/Button.a11y.chromium.spec.ts +17 -1
- package/src/Button/__tests__/Button.a11y.known-failures.ts +0 -29
- package/src/Button/__tests__/Button.a11y.renders.tsx +9 -2
- package/src/Button/__tests__/Button.a11y.states.ts +9 -0
- package/src/Chat/ChatComposer.doc.mjs +14 -0
- package/src/Chat/ChatComposer.spec.md +230 -0
- package/src/Chat/ChatComposer.test.tsx +57 -0
- package/src/Chat/ChatComposer.tsx +21 -9
- package/src/Chat/ChatComposerDrawer.doc.mjs +63 -5
- package/src/Chat/ChatComposerDrawer.spec.md +267 -0
- package/src/Chat/ChatComposerDrawer.test.tsx +81 -12
- package/src/Chat/ChatComposerDrawer.tsx +38 -9
- package/src/Chat/ChatComposerInput.doc.mjs +114 -26
- package/src/Chat/ChatComposerInput.spec.md +185 -0
- package/src/Chat/ChatComposerInput.test.tsx +113 -3
- package/src/Chat/ChatComposerInput.tsx +78 -13
- package/src/Chat/ChatComposerTokenElement.spec.md +152 -0
- package/src/Chat/ChatComposerTokenElement.test.tsx +85 -0
- package/src/Chat/ChatDictationButton.doc.mjs +3 -3
- package/src/Chat/ChatDictationButton.spec.md +160 -0
- package/src/Chat/ChatDictationButton.test.tsx +92 -27
- package/src/Chat/ChatDictationButton.tsx +8 -6
- package/src/Chat/ChatLayout.doc.mjs +12 -4
- package/src/Chat/ChatLayout.spec.md +271 -0
- package/src/Chat/ChatLayout.test.tsx +28 -0
- package/src/Chat/ChatLayout.tsx +19 -0
- package/src/Chat/ChatLayoutScrollButton.spec.md +338 -0
- package/src/Chat/ChatLayoutScrollButton.test.tsx +31 -0
- package/src/Chat/ChatLayoutScrollButton.tsx +31 -14
- package/src/Chat/ChatMessageBubble.doc.mjs +28 -15
- package/src/Chat/ChatMessageBubble.spec.md +263 -0
- package/src/Chat/ChatMessageBubble.test.tsx +93 -0
- package/src/Chat/ChatMessageBubble.tsx +8 -3
- package/src/Chat/ChatMessageList.spec.md +222 -0
- package/src/Chat/ChatMessageList.test.tsx +64 -2
- package/src/Chat/ChatMessageList.tsx +4 -3
- package/src/Chat/ChatMessageMetadata.doc.mjs +57 -3
- package/src/Chat/ChatMessageMetadata.spec.md +220 -0
- package/src/Chat/ChatMessageMetadata.test.tsx +34 -0
- package/src/Chat/ChatMessageMetadata.tsx +13 -13
- package/src/Chat/ChatSendButton.doc.mjs +32 -0
- package/src/Chat/ChatSendButton.spec.md +227 -0
- package/src/Chat/ChatSendButton.test.tsx +128 -8
- package/src/Chat/ChatSendButton.tsx +6 -4
- package/src/Chat/ChatSystemMessage.doc.mjs +115 -12
- package/src/Chat/ChatSystemMessage.spec.md +225 -0
- package/src/Chat/ChatSystemMessage.test.tsx +112 -20
- package/src/Chat/ChatSystemMessage.tsx +4 -6
- package/src/Chat/ChatTokenizedText.doc.mjs +96 -9
- package/src/Chat/ChatTokenizedText.spec.md +190 -0
- package/src/Chat/ChatTokenizedText.test.tsx +60 -1
- package/src/Chat/ChatTokenizedText.tsx +14 -8
- package/src/Chat/ChatToolCalls.doc.mjs +4 -1
- package/src/Chat/ChatToolCalls.spec.md +194 -0
- package/src/Chat/ChatToolCalls.test.tsx +83 -0
- package/src/Chat/ChatToolCalls.tsx +46 -21
- package/src/Chat/__tests__/ChatLayoutScrollButton.a11y.chromium.spec.ts +514 -0
- package/src/Chat/__tests__/ChatLayoutScrollButtonSurface.a11y.chromium.spec.ts +740 -0
- package/src/Chat/__tests__/ChatMessageBubble.a11y.chromium.spec.ts +457 -0
- package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.test.ts +91 -0
- package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.ts +91 -0
- package/src/Chat/__tests__/ChatMessageList.a11y.chromium.spec.ts +456 -0
- package/src/Chat/__tests__/ChatMessageMetadata.a11y.chromium.spec.ts +413 -0
- package/src/Chat/__tests__/ChatSendButton.a11y.chromium.spec.ts +1522 -0
- package/src/Chat/__tests__/ChatSystemMessage.a11y.chromium.spec.ts +1004 -0
- package/src/Chat/__tests__/ChatTokenizedText.a11y.chromium.spec.ts +573 -0
- package/src/Chat/index.ts +1 -0
- package/src/CheckboxInput/CheckboxInput.doc.mjs +11 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +34 -0
- package/src/CheckboxInput/CheckboxInput.tsx +21 -1
- package/src/Citation/Citation.doc.mjs +2 -2
- package/src/Citation/Citation.test.tsx +17 -0
- package/src/Citation/Citation.tsx +4 -2
- package/src/ClickableCard/ClickableCard.doc.mjs +2 -2
- package/src/ClickableCard/ClickableCard.test.tsx +102 -5
- package/src/CodeBlock/highlightRanges.test.ts +143 -1
- package/src/CodeBlock/highlightRanges.ts +15 -5
- package/src/Collapsible/Collapsible.doc.mjs +11 -0
- package/src/Collapsible/Collapsible.test.tsx +21 -0
- package/src/Collapsible/Collapsible.tsx +5 -0
- package/src/CommandPalette/CommandPaletteInput.tsx +6 -1
- package/src/ComplexSelector/ComplexSelector.tsx +6 -1
- package/src/DateInput/DateInput.doc.mjs +38 -9
- package/src/DateInput/DateInput.tsx +59 -17
- package/src/DateInput/NativeDateField.tsx +24 -8
- package/src/DateInput/Presentation.test.tsx +121 -0
- package/src/DateInput/TouchDateField.tsx +6 -2
- package/src/DateInput/index.ts +1 -0
- package/src/DateRangeInput/DateRangeInput.tsx +6 -1
- package/src/DateTimeInput/DateTimeInput.doc.mjs +28 -12
- package/src/DateTimeInput/DateTimeInput.tsx +93 -37
- package/src/DateTimeInput/Presentation.test.tsx +89 -0
- package/src/DateTimeInput/TouchDateTimeField.tsx +6 -1
- package/src/DateTimeInput/index.ts +1 -0
- package/src/DateTimeInput/nativePickerSegmentStyles.ts +24 -8
- package/src/Dialog/Dialog.doc.mjs +2 -0
- package/src/Dialog/DialogHeader.doc.mjs +22 -0
- package/src/Dialog/DialogHeader.test.tsx +167 -3
- package/src/Dialog/DialogHeader.tsx +37 -6
- package/src/Dialog/modules/DialogHeader.spec.md +101 -42
- package/src/DropdownMenu/DropdownMenu.test.tsx +5 -2
- package/src/Field/InputClearButton.test.tsx +17 -3
- package/src/Field/InputClearButton.tsx +5 -2
- package/src/Field/PanelSearchInput.tsx +5 -2
- package/src/FieldStatus/__tests__/StatusMessage.a11y.states.ts +1 -1
- package/src/FileInput/FileInput.tsx +11 -2
- package/src/Icon/Icon.doc.mjs +7 -5
- package/src/Icon/Icon.spec.md +81 -40
- package/src/Icon/Icon.test.tsx +6 -3
- package/src/Icon/Icon.tsx +20 -68
- package/src/Icon/IconDefaultSizeContext.ts +23 -0
- package/src/Icon/IconSize.stylex.ts +70 -0
- package/src/IconButton/IconButton.doc.mjs +3 -3
- package/src/IconButton/IconButton.test.tsx +40 -0
- package/src/Item/Item.doc.mjs +6 -2
- package/src/Item/Item.tsx +9 -3
- package/src/Kbd/Kbd.doc.mjs +3 -3
- package/src/Kbd/Kbd.test.tsx +57 -1
- package/src/Kbd/Kbd.tsx +57 -37
- package/src/Layout/LayoutFooter.doc.mjs +17 -0
- package/src/Link/Link.doc.mjs +17 -4
- package/src/Link/Link.test.tsx +24 -0
- package/src/Link/Link.tsx +5 -0
- package/src/Link/LinkProvider.doc.mjs +2 -2
- package/src/Link/__tests__/Link.navigation.a11y.chromium.spec.ts +261 -0
- package/src/Link/useLinkComponent.test.tsx +333 -0
- package/src/Link/useLinkComponent.ts +29 -57
- package/src/List/List.doc.mjs +6 -0
- package/src/List/List.spec.md +200 -0
- package/src/List/List.test.tsx +117 -1
- package/src/List/List.tsx +22 -2
- package/src/List/ListContext.tsx +3 -1
- package/src/List/ListItem.doc.mjs +2 -2
- package/src/List/ListItem.source-build.test.mjs +41 -0
- package/src/List/ListItem.tsx +26 -2
- package/src/Markdown/Markdown.doc.mjs +300 -2
- package/src/Markdown/Markdown.fr23.bench.ts +174 -0
- package/src/Markdown/Markdown.fr23.perf.test.ts +249 -0
- package/src/Markdown/Markdown.fr23.sampling.ts +49 -0
- package/src/Markdown/Markdown.helpers.perf.test.ts +489 -0
- package/src/Markdown/Markdown.public.test.ts +130 -3
- package/src/Markdown/Markdown.renderBoundary.test.tsx +72 -0
- package/src/Markdown/Markdown.spec.md +210 -45
- package/src/Markdown/Markdown.test.tsx +87 -3
- package/src/Markdown/Markdown.tsx +414 -135
- package/src/Markdown/ast.test.ts +307 -0
- package/src/Markdown/ast.ts +337 -0
- package/src/Markdown/incremental.test.ts +43 -0
- package/src/Markdown/index.ts +37 -1
- package/src/Markdown/modules/remark.spec.md +269 -0
- package/src/Markdown/modules/softBreaks.spec.md +137 -0
- package/src/Markdown/parser/index.ts +64 -0
- package/src/Markdown/parser.public.test.ts +103 -0
- package/src/Markdown/parser.test.ts +38 -6
- package/src/Markdown/parser.ts +1221 -242
- package/src/Markdown/plugins/frontmatter.test.tsx +125 -0
- package/src/Markdown/plugins/frontmatter.ts +198 -0
- package/src/Markdown/plugins/index.ts +54 -0
- package/src/Markdown/plugins/protocol.test.tsx +1022 -0
- package/src/Markdown/plugins/protocol.ts +1618 -0
- package/src/Markdown/plugins/semanticFence.test.tsx +546 -0
- package/src/Markdown/plugins/semanticFence.ts +424 -0
- package/src/Markdown/plugins/softBreaks.test.tsx +172 -0
- package/src/Markdown/plugins/softBreaks.ts +169 -0
- package/src/Markdown/plugins/sourceDecoration.test.tsx +799 -0
- package/src/Markdown/plugins/sourceDecoration.ts +539 -0
- package/src/Markdown/plugins/textTransform.test.ts +467 -0
- package/src/Markdown/plugins/textTransform.ts +554 -0
- package/src/Markdown/remark.test.tsx +1877 -0
- package/src/Markdown/remark.ts +1574 -0
- package/src/Markdown/url.ts +36 -0
- package/src/Markdown/utils.ts +13 -1
- package/src/MetadataList/MetadataList.test.tsx +4 -2
- package/src/MetadataList/MetadataList.tsx +3 -3
- package/src/MultiSelector/MultiSelector.test.tsx +1 -35
- package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +128 -0
- package/src/NumberInput/NumberInput.tsx +6 -1
- package/src/Outline/Outline.doc.mjs +7 -5
- package/src/Outline/Outline.spec.md +1 -1
- package/src/Outline/index.ts +1 -0
- package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +142 -0
- package/src/Outline/parseOutlineFromMarkdown.ts +40 -10
- package/src/Outline/useOutlineFromMarkdown.ts +15 -3
- package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +150 -1
- package/src/PowerSearch/PowerSearchEditPopover.tsx +51 -28
- package/src/PowerSearch/PowerSearchValueEditor.test.tsx +51 -0
- package/src/PowerSearch/PowerSearchValueEditor.tsx +4 -0
- package/src/ProgressBar/ProgressBar.test.tsx +29 -11
- package/src/ProgressBar/ProgressBar.tsx +59 -72
- package/src/RadioList/RadioList.doc.mjs +11 -0
- package/src/RadioList/RadioList.test.tsx +32 -0
- package/src/RadioList/RadioListItem.tsx +25 -1
- package/src/ScrollableArea/ScrollableArea.tsx +1 -0
- package/src/ScrollableArea/modules/useScrollableArea.spec.md +50 -22
- package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
- package/src/SegmentedControl/SegmentedControl.test.tsx +61 -0
- package/src/SegmentedControl/SegmentedControl.tsx +2 -1
- package/src/SegmentedControl/SegmentedControlItem.tsx +6 -9
- package/src/Selector/Selector.doc.mjs +3 -3
- package/src/Selector/Selector.spec.md +51 -49
- package/src/Selector/Selector.test.tsx +61 -55
- package/src/Selector/Selector.tsx +34 -15
- package/src/Selector/__tests__/Listbox.a11y.chromium.spec.ts +130 -0
- package/src/Selector/__tests__/Listbox.a11y.dom.ts +38 -0
- package/src/Selector/__tests__/Listbox.a11y.inventory.test.ts +63 -0
- package/src/Selector/__tests__/Listbox.a11y.known-failures.ts +37 -0
- package/src/Selector/__tests__/Listbox.a11y.states.ts +232 -0
- package/src/Selector/__tests__/Selector.a11y.chromium.spec.ts +45 -0
- package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +121 -0
- package/src/SideNav/SideNav.doc.mjs +1 -1
- package/src/SideNav/SideNav.test.tsx +10 -0
- package/src/SideNav/SideNav.tsx +14 -2
- package/src/Slider/Slider.doc.mjs +17 -3
- package/src/Slider/Slider.test.tsx +221 -0
- package/src/Slider/Slider.tsx +40 -9
- package/src/Spinner/Spinner.test.tsx +4 -0
- package/src/Spinner/Spinner.tsx +31 -18
- package/src/Switch/Switch.doc.mjs +11 -0
- package/src/Switch/Switch.test.tsx +16 -0
- package/src/Switch/Switch.tsx +28 -0
- package/src/TabList/Tab.tsx +35 -7
- package/src/TabList/TabList.doc.mjs +11 -0
- package/src/TabList/TabList.spec.md +204 -0
- package/src/TabList/TabList.test.tsx +66 -0
- package/src/TabList/__tests__/Tabs.a11y.known-failures.ts +1 -34
- package/src/Table/Table.doc.mjs +1 -1
- package/src/Table/Table.spec.md +54 -40
- package/src/Table/Table.test.tsx +83 -10
- package/src/Table/Table.tsx +30 -22
- package/src/Table/__tests__/TableScroll.a11y.chromium.spec.ts +137 -0
- package/src/TextArea/TextArea.tsx +6 -1
- package/src/TextInput/TextInput.test.tsx +20 -1
- package/src/TextInput/TextInput.tsx +6 -1
- package/src/TimeInput/NativeTimeInput.test.tsx +36 -3
- package/src/TimeInput/Presentation.test.tsx +148 -0
- package/src/TimeInput/TimeInput.doc.mjs +21 -5
- package/src/TimeInput/TimeInput.tsx +102 -11
- package/src/TimeInput/TouchTimeField.tsx +572 -0
- package/src/TimeInput/index.ts +1 -0
- package/src/Timer/Timer.doc.mjs +183 -0
- package/src/Timer/Timer.spec.md +215 -0
- package/src/Timer/Timer.test.tsx +302 -0
- package/src/Timer/Timer.tsx +258 -0
- package/src/Timer/index.ts +11 -0
- package/src/ToggleButton/ToggleButton.doc.mjs +3 -3
- package/src/ToggleButton/ToggleButton.test.tsx +299 -4
- package/src/ToggleButton/ToggleButton.tsx +26 -33
- package/src/ToggleButton/ToggleButtonGroup.doc.mjs +3 -3
- package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +209 -0
- package/src/Token/Token.doc.mjs +2 -2
- package/src/Tokenizer/Tokenizer.spec.md +142 -75
- package/src/TopNav/TopNavMenu.doc.mjs +2 -2
- package/src/TopNav/TopNavMenu.test.tsx +30 -0
- package/src/TopNav/TopNavMenu.tsx +7 -2
- package/src/TreeList/TreeList.doc.mjs +3 -3
- package/src/TreeList/TreeList.spec.md +123 -75
- package/src/TreeList/TreeList.test.tsx +29 -0
- package/src/TreeList/TreeList.tsx +3 -0
- package/src/TreeList/TreeListItem.tsx +15 -1
- package/src/TreeList/TreeListTypes.ts +11 -1
- package/src/Typeahead/BaseTypeahead.spec.md +4 -3
- package/src/Typeahead/BaseTypeahead.tsx +21 -7
- package/src/Typeahead/Typeahead.test.tsx +53 -0
- package/src/__tests__/PressedState.a11y.chromium.spec.ts +813 -0
- package/src/__tests__/pressState.ts +93 -0
- package/src/hooks/scrollKeyboardDelegation.test.ts +155 -0
- package/src/hooks/scrollKeyboardDelegation.ts +233 -0
- package/src/hooks/useClickableContainer.test.tsx +236 -0
- package/src/hooks/useClickableContainer.ts +20 -4
- package/src/hooks/useScrollableArea.doc.mjs +15 -3
- package/src/hooks/useScrollableArea.test.tsx +59 -1
- package/src/hooks/useScrollableArea.ts +34 -10
- package/src/index.ts +3 -0
- package/src/inputFontFloor.test.ts +106 -0
- package/src/tailwind-theme.css +0 -6
- package/src/theme/Theme.test.tsx +32 -0
- package/src/theme/declarationBoundary.test.ts +126 -0
- package/src/theme/declarationBoundary.ts +347 -0
- package/src/theme/defineTheme.ts +4 -0
- package/src/theme/derivedVarRegistry.test.ts +7 -0
- package/src/theme/derivedVarRegistry.ts +1 -0
- package/src/theme/generateThemeRules.test.ts +526 -1
- package/src/theme/generateThemeRules.ts +231 -50
- package/src/theme/themeAdaptations.test.ts +211 -1
- package/src/theme/themeAdaptations.ts +50 -4
- package/src/theme/tokenValueCompat.test.ts +4 -1
- package/src/utils/inputPresentation.ts +143 -0
- package/src/utils/interactionOverlay.stylex.ts +20 -0
- package/src/utils/safeUrl.test.ts +88 -0
- package/src/utils/safeUrl.ts +85 -0
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'],
|
|
@@ -99,14 +99,47 @@ describe('TimeInput nativePicker', () => {
|
|
|
99
99
|
it.each([
|
|
100
100
|
['seconds', {hasSeconds: true}],
|
|
101
101
|
['custom increment', {increment: 15}],
|
|
102
|
-
] as const)(
|
|
103
|
-
|
|
102
|
+
] as const)(
|
|
103
|
+
'retains the typed field for %s under adaptive-native (default)',
|
|
104
|
+
(_name, props) => {
|
|
105
|
+
stubPointer(true);
|
|
106
|
+
render(<TimeInput label="Start time" onChange={() => {}} {...props} />);
|
|
107
|
+
|
|
108
|
+
expect(
|
|
109
|
+
screen.getByRole('textbox', {name: 'Start time'}),
|
|
110
|
+
).toBeInTheDocument();
|
|
111
|
+
expect(document.querySelector('input[type="time"]')).toBeNull();
|
|
112
|
+
},
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
it.each([
|
|
116
|
+
['seconds', {hasSeconds: true}],
|
|
117
|
+
['custom increment', {increment: 15}],
|
|
118
|
+
] as const)(
|
|
119
|
+
'forces the native field for %s under presentation="native" (FR2)',
|
|
120
|
+
(_name, props) => {
|
|
121
|
+
stubPointer(false);
|
|
122
|
+
render(
|
|
123
|
+
<TimeInput
|
|
124
|
+
label="Start time"
|
|
125
|
+
presentation="native"
|
|
126
|
+
onChange={() => {}}
|
|
127
|
+
{...props}
|
|
128
|
+
/>,
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
expect(getNativeTimeInput()).toBeInTheDocument();
|
|
132
|
+
},
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
it('deprecated nativePicker="always" keeps released fallbacks (FR2 legacy)', () => {
|
|
136
|
+
stubPointer(false);
|
|
104
137
|
render(
|
|
105
138
|
<TimeInput
|
|
106
139
|
label="Start time"
|
|
107
140
|
nativePicker="always"
|
|
141
|
+
hasSeconds
|
|
108
142
|
onChange={() => {}}
|
|
109
|
-
{...props}
|
|
110
143
|
/>,
|
|
111
144
|
);
|
|
112
145
|
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Presentation.test.tsx
|
|
5
|
+
* @input Uses vitest, Testing Library, and TimeInput
|
|
6
|
+
* @output Tests for the `presentation` prop (`spec:AST-043` FR1–FR4)
|
|
7
|
+
* @position Testing; covers surface resolution, fallback split, and precedence
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import {afterEach, beforeAll, describe, expect, it, vi} from 'vitest';
|
|
11
|
+
import {fireEvent, render, screen} from '@testing-library/react';
|
|
12
|
+
import {TimeInput} from './TimeInput';
|
|
13
|
+
import {resetDateSegmentProbe} from '../DateInput/nativeDateSegments';
|
|
14
|
+
|
|
15
|
+
const HOVER_CAPABLE = /\(\s*hover\s*:\s*hover\s*\)/;
|
|
16
|
+
|
|
17
|
+
class MockResizeObserver {
|
|
18
|
+
observe() {}
|
|
19
|
+
unobserve() {}
|
|
20
|
+
disconnect() {}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function stubPointer(isCoarse: boolean): void {
|
|
24
|
+
vi.stubGlobal('matchMedia', (query: string) => ({
|
|
25
|
+
matches: /pointer:\s*coarse/.test(query)
|
|
26
|
+
? isCoarse
|
|
27
|
+
: /pointer:\s*fine/.test(query)
|
|
28
|
+
? !isCoarse
|
|
29
|
+
: HOVER_CAPABLE.test(query),
|
|
30
|
+
media: query,
|
|
31
|
+
onchange: null,
|
|
32
|
+
addListener: () => {},
|
|
33
|
+
removeListener: () => {},
|
|
34
|
+
addEventListener: () => {},
|
|
35
|
+
removeEventListener: () => {},
|
|
36
|
+
dispatchEvent: () => false,
|
|
37
|
+
}));
|
|
38
|
+
vi.stubGlobal('ResizeObserver', MockResizeObserver);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
beforeAll(() => {
|
|
42
|
+
window.scrollTo = vi.fn();
|
|
43
|
+
Element.prototype.scrollTo = vi.fn();
|
|
44
|
+
Element.prototype.scrollIntoView = vi.fn();
|
|
45
|
+
HTMLDialogElement.prototype.showModal = vi.fn(function (
|
|
46
|
+
this: HTMLDialogElement,
|
|
47
|
+
) {
|
|
48
|
+
this.open = true;
|
|
49
|
+
});
|
|
50
|
+
HTMLDialogElement.prototype.show = vi.fn(function (this: HTMLDialogElement) {
|
|
51
|
+
this.open = true;
|
|
52
|
+
});
|
|
53
|
+
HTMLDialogElement.prototype.close = vi.fn(function (this: HTMLDialogElement) {
|
|
54
|
+
this.open = false;
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
afterEach(() => {
|
|
59
|
+
vi.unstubAllGlobals();
|
|
60
|
+
vi.restoreAllMocks();
|
|
61
|
+
resetDateSegmentProbe();
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
describe('TimeInput presentation', () => {
|
|
65
|
+
it('text-input renders the typed field on both pointers', () => {
|
|
66
|
+
for (const isCoarse of [false, true]) {
|
|
67
|
+
stubPointer(isCoarse);
|
|
68
|
+
const {unmount} = render(
|
|
69
|
+
<TimeInput
|
|
70
|
+
label="Start"
|
|
71
|
+
presentation="text-input"
|
|
72
|
+
onChange={() => {}}
|
|
73
|
+
/>,
|
|
74
|
+
);
|
|
75
|
+
const input = screen.getByRole('textbox', {name: 'Start'});
|
|
76
|
+
expect(input).toHaveAttribute('type', 'text');
|
|
77
|
+
expect(input).not.toHaveAttribute('readonly');
|
|
78
|
+
expect(document.querySelector('input[type="time"]')).toBeNull();
|
|
79
|
+
unmount();
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('bottom-sheet renders the sheet field even on a fine pointer', () => {
|
|
84
|
+
stubPointer(false);
|
|
85
|
+
render(
|
|
86
|
+
<TimeInput
|
|
87
|
+
label="Start"
|
|
88
|
+
presentation="bottom-sheet"
|
|
89
|
+
onChange={() => {}}
|
|
90
|
+
/>,
|
|
91
|
+
);
|
|
92
|
+
const input = screen.getByRole('combobox', {name: 'Start'});
|
|
93
|
+
expect(input).toHaveAttribute('readonly');
|
|
94
|
+
fireEvent.click(input);
|
|
95
|
+
expect(screen.getByRole('listbox', {name: 'Hour'})).toBeInTheDocument();
|
|
96
|
+
expect(screen.getByRole('listbox', {name: 'Minute'})).toBeInTheDocument();
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('adaptive-bottom-sheet: typed on fine, sheet on coarse', () => {
|
|
100
|
+
stubPointer(false);
|
|
101
|
+
const {unmount} = render(
|
|
102
|
+
<TimeInput
|
|
103
|
+
label="Start"
|
|
104
|
+
presentation="adaptive-bottom-sheet"
|
|
105
|
+
onChange={() => {}}
|
|
106
|
+
/>,
|
|
107
|
+
);
|
|
108
|
+
expect(screen.getByRole('textbox', {name: 'Start'})).not.toHaveAttribute(
|
|
109
|
+
'readonly',
|
|
110
|
+
);
|
|
111
|
+
unmount();
|
|
112
|
+
|
|
113
|
+
stubPointer(true);
|
|
114
|
+
render(
|
|
115
|
+
<TimeInput
|
|
116
|
+
label="Start"
|
|
117
|
+
presentation="adaptive-bottom-sheet"
|
|
118
|
+
onChange={() => {}}
|
|
119
|
+
/>,
|
|
120
|
+
);
|
|
121
|
+
expect(screen.getByRole('combobox', {name: 'Start'})).toHaveAttribute(
|
|
122
|
+
'readonly',
|
|
123
|
+
);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('deprecated nativePicker="never" maps to text-input, not a sheet (FR3)', () => {
|
|
127
|
+
stubPointer(true);
|
|
128
|
+
render(
|
|
129
|
+
<TimeInput label="Start" nativePicker="never" onChange={() => {}} />,
|
|
130
|
+
);
|
|
131
|
+
const input = screen.getByRole('textbox', {name: 'Start'});
|
|
132
|
+
expect(input).not.toHaveAttribute('readonly');
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it('presentation wins over nativePicker (FR4)', () => {
|
|
136
|
+
stubPointer(false);
|
|
137
|
+
render(
|
|
138
|
+
<TimeInput
|
|
139
|
+
label="Start"
|
|
140
|
+
presentation="text-input"
|
|
141
|
+
nativePicker="always"
|
|
142
|
+
onChange={() => {}}
|
|
143
|
+
/>,
|
|
144
|
+
);
|
|
145
|
+
expect(screen.getByRole('textbox', {name: 'Start'})).toBeInTheDocument();
|
|
146
|
+
expect(document.querySelector('input[type="time"]')).toBeNull();
|
|
147
|
+
});
|
|
148
|
+
});
|
|
@@ -80,7 +80,7 @@ export const docs = {
|
|
|
80
80
|
name: 'Time control',
|
|
81
81
|
required: true,
|
|
82
82
|
description:
|
|
83
|
-
'A real input type=time in native modes, or Astryx\'s editable text field for fine pointers,
|
|
83
|
+
'A real input type=time in native modes, or Astryx\'s editable text field for fine pointers, presentation="text-input", seconds, and custom increments.',
|
|
84
84
|
},
|
|
85
85
|
{
|
|
86
86
|
name: 'Clear button',
|
|
@@ -210,11 +210,18 @@ export const docs = {
|
|
|
210
210
|
'Number of minutes to add or subtract when the user presses the up or down arrow key.',
|
|
211
211
|
default: '1',
|
|
212
212
|
},
|
|
213
|
+
{
|
|
214
|
+
name: 'presentation',
|
|
215
|
+
type: "'text-input' | 'popover' | 'bottom-sheet' | 'native' | 'adaptive-bottom-sheet' | 'adaptive-native'",
|
|
216
|
+
description:
|
|
217
|
+
"Which surface selects the time. 'adaptive-native' (the default) uses Astryx's typed field on a fine pointer and the browser/OS input type=time on a coarse pointer — except hasSeconds or increment other than 1, which retain the typed field because iOS has no seconds wheel and treats step as validation rather than picker cadence; 'native' always uses the browser/OS control with no Astryx fallback; 'adaptive-bottom-sheet' uses the typed field on a fine pointer and Astryx's bottom-sheet time wheels on a coarse pointer; 'bottom-sheet' forces the wheels on every pointer; 'text-input' (like 'popover', which has no distinct TimeInput surface) keeps only the typed field. Native mode forwards min/max and enforces them on commit. hourFormat formats the closed value; the open OS picker follows the device locale.",
|
|
218
|
+
default: "'adaptive-native'",
|
|
219
|
+
},
|
|
213
220
|
{
|
|
214
221
|
name: 'nativePicker',
|
|
215
222
|
type: "'touch' | 'always' | 'never'",
|
|
216
223
|
description:
|
|
217
|
-
"
|
|
224
|
+
"Deprecated: use presentation ('touch' = 'adaptive-native', 'always' = 'native', 'never' = 'text-input'). Still works exactly as released; presentation wins when both are set.",
|
|
218
225
|
default: "'touch'",
|
|
219
226
|
},
|
|
220
227
|
{
|
|
@@ -377,11 +384,18 @@ export const docsZh = {
|
|
|
377
384
|
description: '用户按上或下方向键时增加或减少的分钟数。',
|
|
378
385
|
default: '1',
|
|
379
386
|
},
|
|
387
|
+
{
|
|
388
|
+
name: 'presentation',
|
|
389
|
+
type: "'text-input' | 'popover' | 'bottom-sheet' | 'native' | 'adaptive-bottom-sheet' | 'adaptive-native'",
|
|
390
|
+
description:
|
|
391
|
+
"选择时间所用的界面。'adaptive-native'(默认)在精细指针上使用 Astryx 文本字段、在粗指针上使用浏览器/操作系统 input type=time——但 hasSeconds 或 increment 不为 1 时保留文本字段;'native' 始终使用浏览器/操作系统控件且不回退;'adaptive-bottom-sheet' 在精细指针上用文本字段、在粗指针上用 Astryx 底部滚轮选择器;'bottom-sheet' 在任何指针上强制使用滚轮;'text-input'(与无独立界面的 'popover' 相同)只保留文本字段。原生模式会传递 min/max 并在提交时强制校验。hourFormat 控制关闭状态的显示;打开的系统选择器遵循设备区域设置。",
|
|
392
|
+
default: "'adaptive-native'",
|
|
393
|
+
},
|
|
380
394
|
{
|
|
381
395
|
name: 'nativePicker',
|
|
382
396
|
type: "'touch' | 'always' | 'never'",
|
|
383
397
|
description:
|
|
384
|
-
"
|
|
398
|
+
"已弃用:请使用 presentation('touch'='adaptive-native'、'always'='native'、'never'='text-input')。仍按已发布行为工作;同时设置时以 presentation 为准。",
|
|
385
399
|
default: "'touch'",
|
|
386
400
|
},
|
|
387
401
|
{
|
|
@@ -487,7 +501,7 @@ export const docsZh = {
|
|
|
487
501
|
name: 'Time control',
|
|
488
502
|
required: true,
|
|
489
503
|
description:
|
|
490
|
-
'原生模式下使用真正的 input type=time;精细指针、
|
|
504
|
+
'原生模式下使用真正的 input type=time;精细指针、presentation="text-input"、秒或自定义步进场景使用 Astryx 可编辑文本字段。',
|
|
491
505
|
},
|
|
492
506
|
{
|
|
493
507
|
name: 'Clear button',
|
|
@@ -583,8 +597,10 @@ export const docsDense = {
|
|
|
583
597
|
hourFormat:
|
|
584
598
|
"Display format. '12h' shows AM/PM; '24h' uses 24-hour notation.",
|
|
585
599
|
increment: 'Minutes to add/subtract on arrow up/down.',
|
|
600
|
+
presentation:
|
|
601
|
+
"picker surface: 'adaptive-native' (default) = typed field fine / browser/OS coarse (hasSeconds or increment!=1 retains typed); 'native' = browser/OS always, no fallback; 'adaptive-bottom-sheet' = typed fine / Astryx wheel sheet coarse; 'bottom-sheet' = sheet always; 'text-input'/'popover' = typed field only.",
|
|
586
602
|
nativePicker:
|
|
587
|
-
"
|
|
603
|
+
"deprecated, use presentation: 'touch'='adaptive-native', 'always'='native', 'never'='text-input'. still works as released; presentation wins if both set.",
|
|
588
604
|
placeholder: 'Placeholder when empty. Focused+empty shows format hint.',
|
|
589
605
|
size: 'Input element height.',
|
|
590
606
|
status: 'Colored border+icon. Message rendered below input.',
|