@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
|
@@ -102,12 +102,22 @@ import {useHighlightedOptionScroll} from '../hooks/useHighlightedOptionScroll';
|
|
|
102
102
|
import {NativeDateSegment} from './NativeDateSegment';
|
|
103
103
|
import {NativeTimeSegment} from './NativeTimeSegment';
|
|
104
104
|
import {TouchDateTimeField} from './TouchDateTimeField';
|
|
105
|
+
import {
|
|
106
|
+
effectivePickerPresentation,
|
|
107
|
+
resolvePickerPresentation,
|
|
108
|
+
type PickerPresentation,
|
|
109
|
+
} from '../utils/inputPresentation';
|
|
110
|
+
import {useDevWarning} from '../hooks/useDevWarning';
|
|
105
111
|
export type ISODateTimeString = string & {
|
|
106
112
|
readonly __brand: 'ISODateTimeString';
|
|
107
113
|
};
|
|
108
114
|
|
|
115
|
+
/** @deprecated Use {@link DateTimeInputPresentation} via the `presentation` prop. */
|
|
109
116
|
export type DateTimeInputNativePicker = 'touch' | 'always' | 'never';
|
|
110
117
|
|
|
118
|
+
/** Which surfaces collect the date and time (`spec:AST-043` FR1; no `text-input` — TimeInput-only). */
|
|
119
|
+
export type DateTimeInputPresentation = PickerPresentation;
|
|
120
|
+
|
|
111
121
|
export type DateTimeInputHourFormat = '12h' | '24h';
|
|
112
122
|
|
|
113
123
|
export type DateTimeInputSize = 'sm' | 'md' | 'lg';
|
|
@@ -173,9 +183,14 @@ const styles = stylex.create({
|
|
|
173
183
|
borderStyle: 'none',
|
|
174
184
|
padding: 0,
|
|
175
185
|
fontFamily: typographyVars['--font-family-body'],
|
|
186
|
+
// The 16px floor is iOS-only: iOS Safari zooms the page when a focused
|
|
187
|
+
// control sits under 16px, and only iOS WebKit implements
|
|
188
|
+
// -webkit-touch-callout to key the coarse-pointer floor to it.
|
|
176
189
|
fontSize: {
|
|
177
190
|
default: typeScaleVars['--text-body-size'],
|
|
178
|
-
'@media (pointer: coarse)':
|
|
191
|
+
'@media (pointer: coarse)': {
|
|
192
|
+
'@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
|
|
193
|
+
},
|
|
179
194
|
},
|
|
180
195
|
lineHeight: typeScaleVars['--text-body-leading'],
|
|
181
196
|
color: colorVars['--color-text-primary'],
|
|
@@ -496,17 +511,32 @@ export interface DateTimeInputProps extends Omit<
|
|
|
496
511
|
* user's locale.
|
|
497
512
|
*
|
|
498
513
|
* @default 'touch'
|
|
499
|
-
* @
|
|
500
|
-
*
|
|
501
|
-
*
|
|
502
|
-
*
|
|
503
|
-
* value={dateTime}
|
|
504
|
-
* onChange={setDateTime}
|
|
505
|
-
* nativePicker="never"
|
|
506
|
-
* />
|
|
507
|
-
* ```
|
|
514
|
+
* @deprecated Use `presentation` (`spec:AST-043` FR3):
|
|
515
|
+
* `'touch'` → `'adaptive-native'`, `'always'` → `'native'`,
|
|
516
|
+
* `'never'` → `'adaptive-bottom-sheet'`. Still works exactly as released;
|
|
517
|
+
* `presentation` wins when both are set.
|
|
508
518
|
*/
|
|
509
519
|
nativePicker?: DateTimeInputNativePicker;
|
|
520
|
+
|
|
521
|
+
/**
|
|
522
|
+
* Which surfaces collect the date and time (`spec:AST-043` FR1). Every
|
|
523
|
+
* value opens pickers; the typed-fields-only `'text-input'` belongs to
|
|
524
|
+
* `TimeInput`.
|
|
525
|
+
*
|
|
526
|
+
* - `'popover'`: Astryx's typed fields + popovers on every pointer
|
|
527
|
+
* - `'bottom-sheet'`: Astryx's bottom-sheet date/time wheels on every pointer
|
|
528
|
+
* - `'native'`: browser/OS date and time pickers on every pointer, with no
|
|
529
|
+
* Astryx fallback (FR2)
|
|
530
|
+
* - `'adaptive-bottom-sheet'`: popovers on a fine pointer, bottom sheet on
|
|
531
|
+
* a coarse pointer
|
|
532
|
+
* - `'adaptive-native'` (default): popovers on a fine pointer, browser/OS
|
|
533
|
+
* pickers on a coarse pointer, keeping the released per-segment Astryx
|
|
534
|
+
* fallbacks (seconds, non-default `timeIncrement`, `timeOptionInterval`)
|
|
535
|
+
* where a native control cannot express the value (FR2)
|
|
536
|
+
*
|
|
537
|
+
* @default 'adaptive-native'
|
|
538
|
+
*/
|
|
539
|
+
presentation?: DateTimeInputPresentation;
|
|
510
540
|
}
|
|
511
541
|
|
|
512
542
|
function splitDateTime(dt: ISODateTimeString | undefined): {
|
|
@@ -588,27 +618,30 @@ function PointerDateTimeField({
|
|
|
588
618
|
labelTooltip,
|
|
589
619
|
numberOfMonths = 1,
|
|
590
620
|
weekStartsOn,
|
|
591
|
-
nativePicker = 'touch',
|
|
592
621
|
width,
|
|
593
622
|
xstyle,
|
|
594
623
|
className,
|
|
595
624
|
style,
|
|
596
625
|
ref,
|
|
626
|
+
nativeMode = 'off',
|
|
597
627
|
...rest
|
|
598
|
-
}: DateTimeInputProps
|
|
628
|
+
}: DateTimeInputProps & {
|
|
629
|
+
nativeMode?: 'off' | 'adaptive' | 'forced' | 'legacy';
|
|
630
|
+
}) {
|
|
599
631
|
const t = useTranslator();
|
|
600
632
|
const locale = useLocale();
|
|
601
|
-
const
|
|
602
|
-
|
|
603
|
-
|
|
633
|
+
const usesNativePicker = nativeMode !== 'off';
|
|
634
|
+
// `forced` (`presentation="native"`, FR2): no Astryx fallback. `adaptive`
|
|
635
|
+
// (`adaptive-native` coarse) and `legacy` (deprecated `always`):
|
|
604
636
|
// iOS's native time picker has no seconds wheel, treats step as validation
|
|
605
|
-
// rather than picker cadence, and cannot express our preset-time list
|
|
606
|
-
// the Astryx time field
|
|
637
|
+
// rather than picker cadence, and cannot express our preset-time list, so
|
|
638
|
+
// those keep the Astryx time field — exactly as released.
|
|
607
639
|
const usesNativeTimePicker =
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
640
|
+
nativeMode === 'forced' ||
|
|
641
|
+
((nativeMode === 'adaptive' || nativeMode === 'legacy') &&
|
|
642
|
+
!hasSeconds &&
|
|
643
|
+
timeIncrement === 1 &&
|
|
644
|
+
timeOptionInterval === undefined);
|
|
612
645
|
const isEffectivelyRequired = useResolvedRequired({isRequired, isOptional});
|
|
613
646
|
// Speaks arrow-key stepping results through the persistent live regions:
|
|
614
647
|
// stepping programmatically rewrites a plain textbox's value, which screen
|
|
@@ -1915,25 +1948,48 @@ function PointerDateTimeField({
|
|
|
1915
1948
|
PointerDateTimeField.displayName = 'PointerDateTimeField';
|
|
1916
1949
|
|
|
1917
1950
|
/**
|
|
1918
|
-
* A combined date and time picker whose `
|
|
1919
|
-
* surfaces. Native modes use OS-owned date and time controls
|
|
1920
|
-
* chrome
|
|
1921
|
-
*
|
|
1922
|
-
* sheet.
|
|
1951
|
+
* A combined date and time picker whose `presentation` prop chooses both
|
|
1952
|
+
* surfaces (`spec:AST-043`). Native modes use OS-owned date and time controls
|
|
1953
|
+
* in Astryx field chrome; the deprecated `nativePicker` maps to the same
|
|
1954
|
+
* surfaces (FR3).
|
|
1923
1955
|
*/
|
|
1924
|
-
export function DateTimeInput({
|
|
1925
|
-
nativePicker = 'touch',
|
|
1926
|
-
...props
|
|
1927
|
-
}: DateTimeInputProps) {
|
|
1956
|
+
export function DateTimeInput(props: DateTimeInputProps) {
|
|
1928
1957
|
const isTouch = useMediaQuery(TOUCH_POINTER_QUERY);
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1958
|
+
useDevWarning(
|
|
1959
|
+
'DateTimeInput',
|
|
1960
|
+
'`nativePicker` is deprecated; use `presentation` instead (`touch` → `adaptive-native`, `always` → `native`, `never` → `adaptive-bottom-sheet`). `presentation` wins when both are set.',
|
|
1961
|
+
props.nativePicker !== undefined,
|
|
1962
|
+
);
|
|
1963
|
+
const effective = effectivePickerPresentation(
|
|
1964
|
+
props.presentation,
|
|
1965
|
+
props.nativePicker,
|
|
1936
1966
|
);
|
|
1967
|
+
const {
|
|
1968
|
+
presentation: _presentation,
|
|
1969
|
+
nativePicker: _nativePicker,
|
|
1970
|
+
...rest
|
|
1971
|
+
} = props;
|
|
1972
|
+
if (effective === 'native') {
|
|
1973
|
+
return (
|
|
1974
|
+
<PointerDateTimeField
|
|
1975
|
+
{...rest}
|
|
1976
|
+
nativeMode={
|
|
1977
|
+
props.presentation === undefined && props.nativePicker === 'always'
|
|
1978
|
+
? 'legacy'
|
|
1979
|
+
: 'forced'
|
|
1980
|
+
}
|
|
1981
|
+
/>
|
|
1982
|
+
);
|
|
1983
|
+
}
|
|
1984
|
+
switch (resolvePickerPresentation(effective, isTouch)) {
|
|
1985
|
+
case 'native':
|
|
1986
|
+
// Only `adaptive-native` on a coarse pointer resolves here (FR2).
|
|
1987
|
+
return <PointerDateTimeField {...rest} nativeMode="adaptive" />;
|
|
1988
|
+
case 'sheet':
|
|
1989
|
+
return <TouchDateTimeField {...rest} />;
|
|
1990
|
+
case 'desktop':
|
|
1991
|
+
return <PointerDateTimeField {...rest} />;
|
|
1992
|
+
}
|
|
1937
1993
|
}
|
|
1938
1994
|
|
|
1939
1995
|
DateTimeInput.displayName = 'DateTimeInput';
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Presentation.test.tsx
|
|
5
|
+
* @input Uses vitest, Testing Library, and DateTimeInput
|
|
6
|
+
* @output Tests for the `presentation` prop (`spec:AST-043` FR1–FR4)
|
|
7
|
+
* @position Testing; covers surface resolution and precedence
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import {afterEach, describe, expect, it, vi} from 'vitest';
|
|
11
|
+
import {render} from '@testing-library/react';
|
|
12
|
+
import {DateTimeInput} from './DateTimeInput';
|
|
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
|
+
afterEach(() => {
|
|
42
|
+
vi.unstubAllGlobals();
|
|
43
|
+
vi.restoreAllMocks();
|
|
44
|
+
resetDateSegmentProbe();
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe('DateTimeInput presentation', () => {
|
|
48
|
+
it('native forces native date and time segments on a fine pointer', () => {
|
|
49
|
+
stubPointer(false);
|
|
50
|
+
render(
|
|
51
|
+
<DateTimeInput label="Event" presentation="native" onChange={() => {}} />,
|
|
52
|
+
);
|
|
53
|
+
expect(document.querySelector('input[type="date"]')).not.toBeNull();
|
|
54
|
+
expect(document.querySelector('input[type="time"]')).not.toBeNull();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('bottom-sheet forces the sheet field on a fine pointer', () => {
|
|
58
|
+
stubPointer(false);
|
|
59
|
+
render(
|
|
60
|
+
<DateTimeInput
|
|
61
|
+
label="Event"
|
|
62
|
+
presentation="bottom-sheet"
|
|
63
|
+
onChange={() => {}}
|
|
64
|
+
/>,
|
|
65
|
+
);
|
|
66
|
+
for (const input of document.querySelectorAll('input[readonly]')) {
|
|
67
|
+
expect(input).toBeInTheDocument();
|
|
68
|
+
}
|
|
69
|
+
expect(document.querySelector('input[type="date"]')).toBeNull();
|
|
70
|
+
expect(document.querySelectorAll('input[readonly]').length).toBe(2);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('presentation wins over nativePicker (FR4)', () => {
|
|
74
|
+
stubPointer(false);
|
|
75
|
+
render(
|
|
76
|
+
<DateTimeInput
|
|
77
|
+
label="Event"
|
|
78
|
+
presentation="bottom-sheet"
|
|
79
|
+
nativePicker="always"
|
|
80
|
+
onChange={() => {}}
|
|
81
|
+
/>,
|
|
82
|
+
);
|
|
83
|
+
// A sheet on a fine pointer can only come from `presentation`: the
|
|
84
|
+
// deprecated `always` alone would have rendered both native controls.
|
|
85
|
+
expect(document.querySelector('input[type="date"]')).toBeNull();
|
|
86
|
+
expect(document.querySelector('input[type="time"]')).toBeNull();
|
|
87
|
+
expect(document.querySelectorAll('input[readonly]').length).toBe(2);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
@@ -182,9 +182,14 @@ const styles = stylex.create({
|
|
|
182
182
|
borderStyle: 'none',
|
|
183
183
|
padding: 0,
|
|
184
184
|
fontFamily: typographyVars['--font-family-body'],
|
|
185
|
+
// The 16px floor is iOS-only: iOS Safari zooms the page when a focused
|
|
186
|
+
// control sits under 16px, and only iOS WebKit implements
|
|
187
|
+
// -webkit-touch-callout to key the coarse-pointer floor to it.
|
|
185
188
|
fontSize: {
|
|
186
189
|
default: typeScaleVars['--text-body-size'],
|
|
187
|
-
'@media (pointer: coarse)':
|
|
190
|
+
'@media (pointer: coarse)': {
|
|
191
|
+
'@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
|
|
192
|
+
},
|
|
188
193
|
},
|
|
189
194
|
lineHeight: typeScaleVars['--text-body-leading'],
|
|
190
195
|
color: colorVars['--color-text-primary'],
|
|
@@ -42,21 +42,34 @@ export const nativePickerSegmentStyles = stylex.create({
|
|
|
42
42
|
borderStyle: 'none',
|
|
43
43
|
padding: 0,
|
|
44
44
|
fontFamily: typographyVars['--font-family-body'],
|
|
45
|
-
// Below 16px iOS zooms the page when the field takes focus.
|
|
45
|
+
// Below 16px iOS zooms the page when the field takes focus. Only iOS
|
|
46
|
+
// WebKit implements -webkit-touch-callout, so the coarse-pointer floor is
|
|
47
|
+
// keyed to iOS alone.
|
|
46
48
|
fontSize: {
|
|
47
49
|
default: typeScaleVars['--text-body-size'],
|
|
48
|
-
'@media (pointer: coarse)':
|
|
50
|
+
'@media (pointer: coarse)': {
|
|
51
|
+
'@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
|
|
52
|
+
},
|
|
49
53
|
},
|
|
50
54
|
lineHeight: typeScaleVars['--text-body-leading'],
|
|
51
55
|
color: colorVars['--color-text-primary'],
|
|
52
56
|
backgroundColor: 'transparent',
|
|
53
57
|
outline: 'none',
|
|
54
58
|
// Native date/time controls size from their internal edit fields. Pin the
|
|
55
|
-
// box to one text line so both segments stay aligned.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
59
|
+
// box to one text line so both segments stay aligned. The calc fallback
|
|
60
|
+
// mirrors the iOS-only floor above; browsers with `1lh` track it for free.
|
|
61
|
+
height: {
|
|
62
|
+
default: stylex.firstThatWorks(
|
|
63
|
+
'1lh',
|
|
64
|
+
`calc(${typeScaleVars['--text-body-size']} * ${typeScaleVars['--text-body-leading']})`,
|
|
65
|
+
),
|
|
66
|
+
'@media (pointer: coarse)': {
|
|
67
|
+
'@supports (-webkit-touch-callout: none)': stylex.firstThatWorks(
|
|
68
|
+
'1lh',
|
|
69
|
+
`calc(max(1rem, ${typeScaleVars['--text-body-size']}) * ${typeScaleVars['--text-body-leading']})`,
|
|
70
|
+
),
|
|
71
|
+
},
|
|
72
|
+
},
|
|
60
73
|
WebkitAppearance: 'none',
|
|
61
74
|
appearance: 'none',
|
|
62
75
|
// DateTimeInput renders its own calendar/clock affordances.
|
|
@@ -101,9 +114,12 @@ export const nativePickerSegmentStyles = stylex.create({
|
|
|
101
114
|
insetInlineEnd: 0,
|
|
102
115
|
insetBlock: 0,
|
|
103
116
|
display: 'block',
|
|
117
|
+
// The same iOS-only floor as the input it covers, shared baselines.
|
|
104
118
|
fontSize: {
|
|
105
119
|
default: typeScaleVars['--text-body-size'],
|
|
106
|
-
'@media (pointer: coarse)':
|
|
120
|
+
'@media (pointer: coarse)': {
|
|
121
|
+
'@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
|
|
122
|
+
},
|
|
107
123
|
},
|
|
108
124
|
lineHeight: typeScaleVars['--text-body-leading'],
|
|
109
125
|
pointerEvents: 'none',
|
|
@@ -31,7 +31,9 @@ export const docs = {
|
|
|
31
31
|
targets: [
|
|
32
32
|
{className: 'astryx-dialog', visualProps: ['variant']},
|
|
33
33
|
{className: 'astryx-dialog-header'},
|
|
34
|
+
{className: 'astryx-dialog-header-start-content'},
|
|
34
35
|
{className: 'astryx-dialog-header-title-block'},
|
|
36
|
+
{className: 'astryx-dialog-header-end-content'},
|
|
35
37
|
{className: 'astryx-dialog-header-close-icon'},
|
|
36
38
|
],
|
|
37
39
|
vars: [
|
|
@@ -12,7 +12,9 @@ export const docs = {
|
|
|
12
12
|
description: 'Use DialogHeader to give a dialog a labelled title area and optional close control.',
|
|
13
13
|
anatomy: [
|
|
14
14
|
{name: 'Header row', required: true, description: 'Arranges the title block, optional start/end content, and close control.'},
|
|
15
|
+
{name: 'Start content', required: false, description: 'Wraps optional leading content.'},
|
|
15
16
|
{name: 'Title block', required: true, description: 'Groups the title and optional subtitle.'},
|
|
17
|
+
{name: 'End content', required: false, description: 'Groups optional trailing content with the optional close control.'},
|
|
16
18
|
{name: 'Close icon', required: false, description: 'Visual close glyph inside the close button.'},
|
|
17
19
|
],
|
|
18
20
|
},
|
|
@@ -66,6 +68,11 @@ export const docs = {
|
|
|
66
68
|
},
|
|
67
69
|
],
|
|
68
70
|
},
|
|
71
|
+
{
|
|
72
|
+
name: 'endContentEdgeCompensation',
|
|
73
|
+
type: "'inline' | 'block' | 'all'",
|
|
74
|
+
description: 'Selects compensation axes for the end-content slot. Omit to preserve automatic close-action compensation.',
|
|
75
|
+
},
|
|
69
76
|
{
|
|
70
77
|
name: 'hasDivider',
|
|
71
78
|
type: 'boolean',
|
|
@@ -83,7 +90,9 @@ export const docs = {
|
|
|
83
90
|
theming: {
|
|
84
91
|
targets: [
|
|
85
92
|
{className: 'astryx-dialog-header'},
|
|
93
|
+
{className: 'astryx-dialog-header-start-content'},
|
|
86
94
|
{className: 'astryx-dialog-header-title-block'},
|
|
95
|
+
{className: 'astryx-dialog-header-end-content'},
|
|
87
96
|
{className: 'astryx-dialog-header-close-icon'},
|
|
88
97
|
],
|
|
89
98
|
},
|
|
@@ -136,7 +145,9 @@ export const docsZh = {
|
|
|
136
145
|
description: '使用 DialogHeader 为对话框提供带标签的标题区和可选的关闭控件。',
|
|
137
146
|
anatomy: [
|
|
138
147
|
{name: 'Header row', required: true, description: '排列标题区、可选的首尾内容和关闭控件。'},
|
|
148
|
+
{name: 'Start content', required: false, description: '包装可选的首部内容。'},
|
|
139
149
|
{name: 'Title block', required: true, description: '组合标题和可选副标题。'},
|
|
150
|
+
{name: 'End content', required: false, description: '组合可选尾部内容和可选关闭控件。'},
|
|
140
151
|
{name: 'Close icon', required: false, description: '关闭按钮内的关闭图标。'},
|
|
141
152
|
],
|
|
142
153
|
},
|
|
@@ -166,6 +177,11 @@ export const docsZh = {
|
|
|
166
177
|
type: 'ReactNode',
|
|
167
178
|
description: '标题之后、关闭按钮之前的内容。',
|
|
168
179
|
},
|
|
180
|
+
{
|
|
181
|
+
name: 'endContentEdgeCompensation',
|
|
182
|
+
type: "'inline' | 'block' | 'all'",
|
|
183
|
+
description: '选择尾部内容插槽的补偿轴;省略时保留关闭操作的自动补偿。',
|
|
184
|
+
},
|
|
169
185
|
{
|
|
170
186
|
name: 'hasDivider',
|
|
171
187
|
type: 'boolean',
|
|
@@ -176,7 +192,9 @@ export const docsZh = {
|
|
|
176
192
|
theming: {
|
|
177
193
|
targets: [
|
|
178
194
|
{className: 'astryx-dialog-header'},
|
|
195
|
+
{className: 'astryx-dialog-header-start-content'},
|
|
179
196
|
{className: 'astryx-dialog-header-title-block'},
|
|
197
|
+
{className: 'astryx-dialog-header-end-content'},
|
|
180
198
|
{className: 'astryx-dialog-header-close-icon'},
|
|
181
199
|
],
|
|
182
200
|
},
|
|
@@ -191,7 +209,9 @@ export const docsDense = {
|
|
|
191
209
|
description: 'labelled dialog title area + optional close control',
|
|
192
210
|
anatomy: [
|
|
193
211
|
{name: 'Header row', required: true, description: 'arranges title block, optional start/end content, close control'},
|
|
212
|
+
{name: 'Start content', required: false, description: 'wraps optional leading content'},
|
|
194
213
|
{name: 'Title block', required: true, description: 'groups title + optional subtitle'},
|
|
214
|
+
{name: 'End content', required: false, description: 'groups optional trailing content + optional close control'},
|
|
195
215
|
{name: 'Close icon', required: false, description: 'close glyph inside close button'},
|
|
196
216
|
],
|
|
197
217
|
},
|
|
@@ -201,6 +221,8 @@ export const docsDense = {
|
|
|
201
221
|
onOpenChange: 'close button callback (omit=no button)',
|
|
202
222
|
startContent: 'content before title (e.g. back button)',
|
|
203
223
|
endContent: 'content after title, before close button',
|
|
224
|
+
endContentEdgeCompensation:
|
|
225
|
+
'end-content slot axes: inline | block | all; omit=automatic close-action compensation',
|
|
204
226
|
hasDivider: 'bottom border',
|
|
205
227
|
},
|
|
206
228
|
};
|
|
@@ -22,6 +22,17 @@ function generateThemeTestCSS(theme: Parameters<typeof generateThemeCSS>[0]) {
|
|
|
22
22
|
return [prose, component].filter(Boolean).join('\n\n');
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
function getEndSlot(): HTMLElement {
|
|
26
|
+
const child =
|
|
27
|
+
screen.queryByRole('button', {name: 'Action'}) ??
|
|
28
|
+
screen.getByRole('button', {name: /close/i});
|
|
29
|
+
const slot = child.parentElement;
|
|
30
|
+
if (slot == null) {
|
|
31
|
+
throw new Error('Expected DialogHeader end slot');
|
|
32
|
+
}
|
|
33
|
+
return slot;
|
|
34
|
+
}
|
|
35
|
+
|
|
25
36
|
describe('DialogHeader', () => {
|
|
26
37
|
it('renders the title', () => {
|
|
27
38
|
render(<DialogHeader title="My Dialog Title" />);
|
|
@@ -60,35 +71,184 @@ describe('DialogHeader', () => {
|
|
|
60
71
|
|
|
61
72
|
it('renders close button when onOpenChange is provided', () => {
|
|
62
73
|
render(<DialogHeader title="Title" onOpenChange={() => {}} />);
|
|
63
|
-
|
|
74
|
+
const closeButton = screen.getByRole('button', {name: /close/i});
|
|
75
|
+
|
|
76
|
+
expect(closeButton).toBeInTheDocument();
|
|
77
|
+
expect(closeButton.parentElement).toHaveClass(
|
|
78
|
+
'astryx-dialog-header-end-content',
|
|
79
|
+
);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('preserves automatic end-slot compensation when the close action renders', () => {
|
|
83
|
+
const {rerender} = render(
|
|
84
|
+
<DialogHeader title="Title" onOpenChange={() => {}} />,
|
|
85
|
+
);
|
|
86
|
+
const automaticClassName = getEndSlot().className;
|
|
87
|
+
|
|
88
|
+
rerender(
|
|
89
|
+
<DialogHeader
|
|
90
|
+
title="Title"
|
|
91
|
+
endContent={<button type="button">Action</button>}
|
|
92
|
+
onOpenChange={() => {}}
|
|
93
|
+
/>,
|
|
94
|
+
);
|
|
95
|
+
expect(getEndSlot().className).toBe(automaticClassName);
|
|
96
|
+
|
|
97
|
+
rerender(
|
|
98
|
+
<DialogHeader
|
|
99
|
+
title="Title"
|
|
100
|
+
endContent={<button type="button">Action</button>}
|
|
101
|
+
/>,
|
|
102
|
+
);
|
|
103
|
+
expect(getEndSlot().className).not.toBe(automaticClassName);
|
|
64
104
|
});
|
|
65
105
|
|
|
66
|
-
it('
|
|
106
|
+
it('lets endContentEdgeCompensation select inline, block, or all', () => {
|
|
107
|
+
const {rerender} = render(
|
|
108
|
+
<DialogHeader
|
|
109
|
+
title="Title"
|
|
110
|
+
endContent={<button type="button">Action</button>}
|
|
111
|
+
/>,
|
|
112
|
+
);
|
|
113
|
+
const noCompensationClassName = getEndSlot().className;
|
|
114
|
+
|
|
115
|
+
rerender(
|
|
116
|
+
<DialogHeader
|
|
117
|
+
title="Title"
|
|
118
|
+
endContent={<button type="button">Action</button>}
|
|
119
|
+
endContentEdgeCompensation="inline"
|
|
120
|
+
/>,
|
|
121
|
+
);
|
|
122
|
+
const inlineClassName = getEndSlot().className;
|
|
123
|
+
|
|
124
|
+
rerender(
|
|
125
|
+
<DialogHeader
|
|
126
|
+
title="Title"
|
|
127
|
+
endContent={<button type="button">Action</button>}
|
|
128
|
+
endContentEdgeCompensation="block"
|
|
129
|
+
/>,
|
|
130
|
+
);
|
|
131
|
+
const blockClassName = getEndSlot().className;
|
|
132
|
+
|
|
133
|
+
rerender(
|
|
134
|
+
<DialogHeader
|
|
135
|
+
title="Title"
|
|
136
|
+
endContent={<button type="button">Action</button>}
|
|
137
|
+
endContentEdgeCompensation="all"
|
|
138
|
+
/>,
|
|
139
|
+
);
|
|
140
|
+
const allClassName = getEndSlot().className;
|
|
141
|
+
|
|
142
|
+
expect(inlineClassName).not.toBe(noCompensationClassName);
|
|
143
|
+
expect(blockClassName).not.toBe(noCompensationClassName);
|
|
144
|
+
expect(inlineClassName).not.toBe(blockClassName);
|
|
145
|
+
expect(allClassName).not.toBe(inlineClassName);
|
|
146
|
+
expect(allClassName).not.toBe(blockClassName);
|
|
147
|
+
|
|
148
|
+
rerender(
|
|
149
|
+
<DialogHeader
|
|
150
|
+
title="Title"
|
|
151
|
+
endContent={<button type="button">Action</button>}
|
|
152
|
+
onOpenChange={() => {}}
|
|
153
|
+
/>,
|
|
154
|
+
);
|
|
155
|
+
expect(getEndSlot().className).toBe(allClassName);
|
|
156
|
+
|
|
157
|
+
rerender(
|
|
158
|
+
<DialogHeader
|
|
159
|
+
title="Title"
|
|
160
|
+
endContent={<button type="button">Action</button>}
|
|
161
|
+
endContentEdgeCompensation="inline"
|
|
162
|
+
onOpenChange={() => {}}
|
|
163
|
+
/>,
|
|
164
|
+
);
|
|
165
|
+
expect(getEndSlot().className).toBe(inlineClassName);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('exposes theme targets for the header row, title block, both content slots, and close icon', () => {
|
|
67
169
|
const {container} = render(
|
|
68
170
|
<DialogHeader
|
|
69
171
|
title="Title"
|
|
70
172
|
subtitle="Subtitle"
|
|
173
|
+
startContent={<button type="button">Back</button>}
|
|
174
|
+
endContent={<button type="button">Custom Action</button>}
|
|
71
175
|
onOpenChange={() => {}}
|
|
72
176
|
/>,
|
|
73
177
|
);
|
|
74
178
|
|
|
75
179
|
expect(container.querySelector('.astryx-dialog-header')).not.toBeNull();
|
|
180
|
+
expect(
|
|
181
|
+
screen.getByRole('button', {name: 'Back'}).parentElement,
|
|
182
|
+
).toHaveClass('astryx-dialog-header-start-content');
|
|
76
183
|
expect(screen.getByRole('heading', {level: 2}).parentElement).toHaveClass(
|
|
77
184
|
'astryx-dialog-header-title-block',
|
|
78
185
|
);
|
|
79
186
|
|
|
187
|
+
const endContent = screen.getByRole('button', {
|
|
188
|
+
name: 'Custom Action',
|
|
189
|
+
}).parentElement;
|
|
190
|
+
expect(endContent).toHaveClass('astryx-dialog-header-end-content');
|
|
191
|
+
expect(screen.getByRole('button', {name: /close/i}).parentElement).toBe(
|
|
192
|
+
endContent,
|
|
193
|
+
);
|
|
194
|
+
|
|
80
195
|
const closeIcon = screen
|
|
81
196
|
.getByRole('button', {name: /close/i})
|
|
82
197
|
.querySelector('.astryx-dialog-header-close-icon');
|
|
83
198
|
expect(closeIcon).toHaveClass('astryx-icon');
|
|
84
199
|
});
|
|
85
200
|
|
|
86
|
-
it('
|
|
201
|
+
it('exposes the start-content target when startContent renders', () => {
|
|
202
|
+
const {container} = render(
|
|
203
|
+
<DialogHeader
|
|
204
|
+
title="Title"
|
|
205
|
+
startContent={<button type="button">Back</button>}
|
|
206
|
+
/>,
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
expect(
|
|
210
|
+
screen.getByRole('button', {name: 'Back'}).parentElement,
|
|
211
|
+
).toHaveClass('astryx-dialog-header-start-content');
|
|
212
|
+
expect(
|
|
213
|
+
container.querySelectorAll('.astryx-dialog-header-start-content'),
|
|
214
|
+
).toHaveLength(1);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it('exposes the end-content target when endContent renders without a close button', () => {
|
|
218
|
+
const {container} = render(
|
|
219
|
+
<DialogHeader
|
|
220
|
+
title="Title"
|
|
221
|
+
endContent={<button type="button">Custom Action</button>}
|
|
222
|
+
/>,
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
expect(
|
|
226
|
+
screen.getByRole('button', {name: 'Custom Action'}).parentElement,
|
|
227
|
+
).toHaveClass('astryx-dialog-header-end-content');
|
|
228
|
+
expect(
|
|
229
|
+
container.querySelectorAll('.astryx-dialog-header-end-content'),
|
|
230
|
+
).toHaveLength(1);
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
it('omits the content-slot targets when their content does not render', () => {
|
|
234
|
+
const {container} = render(<DialogHeader title="Title" />);
|
|
235
|
+
|
|
236
|
+
expect(
|
|
237
|
+
container.querySelector('.astryx-dialog-header-start-content'),
|
|
238
|
+
).toBeNull();
|
|
239
|
+
expect(
|
|
240
|
+
container.querySelector('.astryx-dialog-header-end-content'),
|
|
241
|
+
).toBeNull();
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
it('lets themes set the internal gaps and close-icon size', () => {
|
|
87
245
|
const theme = defineTheme({
|
|
88
246
|
name: 'dialog-header-targets-test',
|
|
89
247
|
components: {
|
|
90
248
|
'dialog-header': {base: {gap: '8px'}},
|
|
249
|
+
'dialog-header-start-content': {base: {gap: '5px'}},
|
|
91
250
|
'dialog-header-title-block': {base: {gap: '4px'}},
|
|
251
|
+
'dialog-header-end-content': {base: {gap: '6px'}},
|
|
92
252
|
'dialog-header-close-icon': {
|
|
93
253
|
base: {width: '16px', height: '16px', fontSize: '16px'},
|
|
94
254
|
},
|
|
@@ -98,8 +258,12 @@ describe('DialogHeader', () => {
|
|
|
98
258
|
|
|
99
259
|
expect(css).toContain('.astryx-dialog-header {');
|
|
100
260
|
expect(css).toContain('gap: 8px');
|
|
261
|
+
expect(css).toContain('.astryx-dialog-header-start-content {');
|
|
262
|
+
expect(css).toContain('gap: 5px');
|
|
101
263
|
expect(css).toContain('.astryx-dialog-header-title-block {');
|
|
102
264
|
expect(css).toContain('gap: 4px');
|
|
265
|
+
expect(css).toContain('.astryx-dialog-header-end-content {');
|
|
266
|
+
expect(css).toContain('gap: 6px');
|
|
103
267
|
expect(css).toContain('.astryx-dialog-header-close-icon {');
|
|
104
268
|
expect(css).toContain('width: 16px');
|
|
105
269
|
expect(css).toContain('height: 16px');
|