@astryxdesign/core 0.6.2 → 0.6.3-canary.0899f21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +81 -0
- package/dist/BottomSheet/BottomSheet.d.ts +1 -1
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +3 -1
- package/dist/BottomSheet/BottomSheetPanel.d.ts +7 -5
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +56 -19
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +13 -28
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +10 -5
- package/dist/Chat/ChatComposerDrawer.d.ts +19 -5
- package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
- package/dist/Chat/ChatComposerDrawer.js +48 -23
- package/dist/Chat/ChatComposerInput.d.ts +11 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +63 -16
- package/dist/Chat/ChatDictationButton.d.ts +3 -2
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +6 -4
- package/dist/Chat/ChatLayout.d.ts +19 -0
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +19 -0
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +44 -34
- package/dist/Chat/ChatMessageBubble.d.ts +2 -0
- package/dist/Chat/ChatMessageBubble.d.ts.map +1 -1
- package/dist/Chat/ChatMessageBubble.js +5 -3
- package/dist/Chat/ChatMessageList.d.ts +2 -1
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +4 -3
- package/dist/Chat/ChatMessageMetadata.d.ts +5 -4
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatMessageMetadata.js +12 -9
- package/dist/Chat/ChatSendButton.js +1 -1
- package/dist/Chat/index.d.ts +1 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +12 -2
- package/dist/Citation/Citation.d.ts +1 -1
- package/dist/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +3 -2
- package/dist/CodeBlock/highlightRanges.d.ts.map +1 -1
- package/dist/CodeBlock/highlightRanges.js +14 -3
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +6 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +1 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +1 -1
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +4 -4
- package/dist/DateInput/NativeDateField.d.ts.map +1 -1
- package/dist/DateInput/NativeDateField.js +16 -16
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +2 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +4 -4
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +8 -8
- package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
- package/dist/DateTimeInput/TouchDateTimeField.js +4 -4
- package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts +9 -3
- package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts.map +1 -1
- package/dist/DateTimeInput/nativePickerSegmentStyles.js +3 -3
- package/dist/Dialog/DialogHeader.d.ts +8 -1
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +13 -4
- package/dist/Field/InputClearButton.d.ts +4 -2
- package/dist/Field/InputClearButton.d.ts.map +1 -1
- package/dist/Field/InputClearButton.js +4 -2
- package/dist/Field/PanelSearchInput.d.ts.map +1 -1
- package/dist/Field/PanelSearchInput.js +1 -1
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +7 -7
- package/dist/Icon/Icon.d.ts +6 -31
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +8 -71
- package/dist/Icon/IconDefaultSizeContext.d.ts +4 -0
- package/dist/Icon/IconDefaultSizeContext.d.ts.map +1 -0
- package/dist/Icon/IconDefaultSizeContext.js +18 -0
- package/dist/Icon/IconSize.stylex.d.ts +65 -0
- package/dist/Icon/IconSize.stylex.d.ts.map +1 -0
- package/dist/Icon/IconSize.stylex.js +75 -0
- package/dist/Item/Item.d.ts +1 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +4 -3
- package/dist/Kbd/Kbd.d.ts +5 -3
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +36 -42
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +6 -2
- package/dist/Link/useLinkComponent.d.ts +5 -15
- package/dist/Link/useLinkComponent.d.ts.map +1 -1
- package/dist/Link/useLinkComponent.js +34 -51
- package/dist/List/List.d.ts +19 -1
- package/dist/List/List.d.ts.map +1 -1
- package/dist/List/List.js +9 -2
- package/dist/List/ListContext.d.ts +1 -0
- package/dist/List/ListContext.d.ts.map +1 -1
- package/dist/List/ListContext.js +2 -1
- package/dist/List/ListItem.d.ts +1 -1
- package/dist/List/ListItem.d.ts.map +1 -1
- package/dist/List/ListItem.js +9 -2
- package/dist/Markdown/Markdown.d.ts +8 -2
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.fr23.bench.d.ts +2 -0
- package/dist/Markdown/Markdown.fr23.bench.d.ts.map +1 -0
- package/dist/Markdown/Markdown.fr23.bench.js +150 -0
- package/dist/Markdown/Markdown.fr23.sampling.d.ts +2 -0
- package/dist/Markdown/Markdown.fr23.sampling.d.ts.map +1 -0
- package/dist/Markdown/Markdown.fr23.sampling.js +43 -0
- package/dist/Markdown/Markdown.js +262 -109
- package/dist/Markdown/ast.d.ts +162 -0
- package/dist/Markdown/ast.d.ts.map +1 -0
- package/dist/Markdown/ast.js +74 -0
- package/dist/Markdown/index.d.ts +5 -3
- package/dist/Markdown/index.d.ts.map +1 -1
- package/dist/Markdown/index.js +3 -2
- package/dist/Markdown/parser/index.d.ts +10 -0
- package/dist/Markdown/parser/index.d.ts.map +1 -0
- package/dist/Markdown/parser/index.js +10 -0
- package/dist/Markdown/parser.d.ts +126 -58
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +716 -167
- 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/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +5 -5
- package/dist/Selector/Selector.d.ts +9 -7
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +16 -7
- package/dist/SideNav/SideNav.d.ts +2 -1
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +9 -3
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +28 -12
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +23 -7
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +11 -0
- package/dist/TabList/Tab.d.ts +1 -1
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +20 -7
- package/dist/Table/Table.d.ts +1 -0
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +29 -13
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +1 -1
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +2 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +4 -4
- package/dist/Timer/Timer.d.ts +49 -0
- package/dist/Timer/Timer.d.ts.map +1 -0
- package/dist/Timer/Timer.js +158 -0
- package/dist/Timer/index.d.ts +9 -0
- package/dist/Timer/index.d.ts.map +1 -0
- package/dist/Timer/index.js +10 -0
- package/dist/ToggleButton/ToggleButton.d.ts +9 -6
- package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButton.js +15 -27
- package/dist/TopNav/TopNavMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +3 -2
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +3 -0
- package/dist/TreeList/TreeListItem.d.ts +6 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +12 -2
- package/dist/TreeList/TreeListTypes.d.ts +8 -1
- package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +16 -7
- package/dist/astryx.css +27 -11
- package/dist/hooks/scrollKeyboardDelegation.d.ts +3 -0
- package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -0
- package/dist/hooks/scrollKeyboardDelegation.js +146 -0
- package/dist/hooks/useClickableContainer.d.ts +10 -1
- package/dist/hooks/useClickableContainer.d.ts.map +1 -1
- package/dist/hooks/useClickableContainer.js +15 -4
- package/dist/hooks/useScrollableArea.d.ts +6 -2
- package/dist/hooks/useScrollableArea.d.ts.map +1 -1
- package/dist/hooks/useScrollableArea.js +17 -5
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/theme/declarationBoundary.d.ts +17 -0
- package/dist/theme/declarationBoundary.d.ts.map +1 -0
- package/dist/theme/declarationBoundary.js +343 -0
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +4 -0
- package/dist/theme/generateThemeRules.d.ts +13 -7
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +140 -34
- package/dist/utils/interactionOverlay.stylex.d.ts +8 -0
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +9 -0
- package/dist/utils/safeUrl.d.ts +11 -0
- package/dist/utils/safeUrl.d.ts.map +1 -0
- package/dist/utils/safeUrl.js +78 -0
- package/locales/af-ZA.json +530 -1
- package/locales/ar-SA.json +490 -1
- package/locales/ca-ES.json +514 -1
- package/locales/cs-CZ.json +498 -1
- package/locales/da-DK.json +522 -1
- package/locales/de-DE.json +522 -1
- package/locales/el-GR.json +498 -1
- package/locales/es-ES.json +510 -1
- package/locales/fi-FI.json +498 -1
- package/locales/fr-FR.json +534 -1
- package/locales/he-IL.json +498 -1
- package/locales/hu-HU.json +498 -1
- package/locales/it-IT.json +510 -1
- package/locales/ja-JP.json +490 -1
- package/locales/ko-KR.json +498 -1
- package/locales/nl-NL.json +534 -1
- package/locales/no-NO.json +510 -1
- package/locales/pl-PL.json +506 -1
- package/locales/pt-BR.json +506 -1
- package/locales/pt-PT.json +506 -1
- package/locales/ro-RO.json +506 -1
- package/locales/ru-RU.json +498 -1
- package/locales/sr-SP.json +498 -1
- package/locales/sv-SE.json +502 -1
- package/locales/tr-TR.json +498 -1
- package/locales/uk-UA.json +498 -1
- package/locales/vi-VN.json +502 -1
- package/locales/zh-CN.json +490 -1
- package/locales/zh-TW.json +490 -1
- package/package.json +24 -4
- package/src/BottomSheet/BottomSheet.doc.mjs +8 -1
- package/src/BottomSheet/BottomSheet.spec.md +46 -20
- package/src/BottomSheet/BottomSheet.test.tsx +6 -3
- package/src/BottomSheet/BottomSheet.tsx +3 -1
- package/src/BottomSheet/BottomSheetKeyboard.test.tsx +195 -0
- package/src/BottomSheet/BottomSheetPanel.test.tsx +11 -1
- package/src/BottomSheet/BottomSheetPanel.tsx +49 -16
- package/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts +344 -0
- package/src/Button/Button.doc.mjs +5 -5
- package/src/Button/Button.tsx +15 -13
- package/src/Button/__tests__/Button.a11y.chromium.spec.ts +17 -1
- package/src/Button/__tests__/Button.a11y.known-failures.ts +0 -29
- package/src/Button/__tests__/Button.a11y.renders.tsx +9 -2
- package/src/Button/__tests__/Button.a11y.states.ts +9 -0
- package/src/Chat/ChatComposer.doc.mjs +14 -0
- package/src/Chat/ChatComposer.spec.md +230 -0
- package/src/Chat/ChatComposer.test.tsx +57 -0
- package/src/Chat/ChatComposer.tsx +21 -9
- package/src/Chat/ChatComposerDrawer.doc.mjs +63 -5
- package/src/Chat/ChatComposerDrawer.spec.md +267 -0
- package/src/Chat/ChatComposerDrawer.test.tsx +81 -12
- package/src/Chat/ChatComposerDrawer.tsx +38 -9
- package/src/Chat/ChatComposerInput.doc.mjs +114 -26
- package/src/Chat/ChatComposerInput.spec.md +185 -0
- package/src/Chat/ChatComposerInput.test.tsx +113 -3
- package/src/Chat/ChatComposerInput.tsx +78 -13
- package/src/Chat/ChatComposerTokenElement.spec.md +152 -0
- package/src/Chat/ChatComposerTokenElement.test.tsx +85 -0
- package/src/Chat/ChatDictationButton.doc.mjs +3 -3
- package/src/Chat/ChatDictationButton.spec.md +160 -0
- package/src/Chat/ChatDictationButton.test.tsx +92 -27
- package/src/Chat/ChatDictationButton.tsx +8 -6
- package/src/Chat/ChatLayout.doc.mjs +12 -4
- package/src/Chat/ChatLayout.spec.md +271 -0
- package/src/Chat/ChatLayout.test.tsx +28 -0
- package/src/Chat/ChatLayout.tsx +19 -0
- package/src/Chat/ChatLayoutScrollButton.spec.md +338 -0
- package/src/Chat/ChatLayoutScrollButton.test.tsx +31 -0
- package/src/Chat/ChatLayoutScrollButton.tsx +31 -14
- package/src/Chat/ChatMessageBubble.doc.mjs +28 -15
- package/src/Chat/ChatMessageBubble.spec.md +263 -0
- package/src/Chat/ChatMessageBubble.test.tsx +93 -0
- package/src/Chat/ChatMessageBubble.tsx +8 -3
- package/src/Chat/ChatMessageList.spec.md +222 -0
- package/src/Chat/ChatMessageList.test.tsx +64 -2
- package/src/Chat/ChatMessageList.tsx +4 -3
- package/src/Chat/ChatMessageMetadata.doc.mjs +57 -3
- package/src/Chat/ChatMessageMetadata.spec.md +220 -0
- package/src/Chat/ChatMessageMetadata.test.tsx +34 -0
- package/src/Chat/ChatMessageMetadata.tsx +13 -13
- package/src/Chat/ChatSendButton.test.tsx +1 -4
- package/src/Chat/ChatSendButton.tsx +1 -1
- 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/index.ts +1 -0
- package/src/CheckboxInput/CheckboxInput.doc.mjs +11 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +34 -0
- package/src/CheckboxInput/CheckboxInput.tsx +21 -1
- package/src/Citation/Citation.doc.mjs +2 -2
- package/src/Citation/Citation.test.tsx +17 -0
- package/src/Citation/Citation.tsx +4 -2
- package/src/ClickableCard/ClickableCard.doc.mjs +2 -2
- package/src/ClickableCard/ClickableCard.test.tsx +102 -5
- package/src/CodeBlock/highlightRanges.test.ts +143 -1
- package/src/CodeBlock/highlightRanges.ts +15 -5
- package/src/Collapsible/Collapsible.doc.mjs +11 -0
- package/src/Collapsible/Collapsible.test.tsx +21 -0
- package/src/Collapsible/Collapsible.tsx +5 -0
- package/src/CommandPalette/CommandPaletteInput.tsx +6 -1
- package/src/ComplexSelector/ComplexSelector.tsx +6 -1
- package/src/DateInput/DateInput.tsx +6 -1
- package/src/DateInput/NativeDateField.tsx +24 -8
- package/src/DateInput/TouchDateField.tsx +6 -2
- package/src/DateRangeInput/DateRangeInput.tsx +6 -1
- package/src/DateTimeInput/DateTimeInput.tsx +6 -1
- package/src/DateTimeInput/TouchDateTimeField.tsx +6 -1
- package/src/DateTimeInput/nativePickerSegmentStyles.ts +24 -8
- package/src/Dialog/Dialog.doc.mjs +2 -0
- package/src/Dialog/DialogHeader.doc.mjs +22 -0
- package/src/Dialog/DialogHeader.test.tsx +167 -3
- package/src/Dialog/DialogHeader.tsx +37 -6
- package/src/Dialog/modules/DialogHeader.spec.md +101 -42
- package/src/DropdownMenu/DropdownMenu.test.tsx +5 -2
- package/src/Field/InputClearButton.test.tsx +17 -3
- package/src/Field/InputClearButton.tsx +5 -2
- package/src/Field/PanelSearchInput.tsx +5 -2
- package/src/FieldStatus/__tests__/StatusMessage.a11y.states.ts +1 -1
- package/src/FileInput/FileInput.tsx +11 -2
- package/src/Icon/Icon.doc.mjs +7 -5
- package/src/Icon/Icon.spec.md +81 -40
- package/src/Icon/Icon.test.tsx +6 -3
- package/src/Icon/Icon.tsx +20 -68
- package/src/Icon/IconDefaultSizeContext.ts +23 -0
- package/src/Icon/IconSize.stylex.ts +70 -0
- package/src/IconButton/IconButton.doc.mjs +3 -3
- package/src/IconButton/IconButton.test.tsx +40 -0
- package/src/Item/Item.doc.mjs +6 -2
- package/src/Item/Item.tsx +9 -3
- package/src/Kbd/Kbd.doc.mjs +3 -3
- package/src/Kbd/Kbd.test.tsx +57 -1
- package/src/Kbd/Kbd.tsx +57 -37
- package/src/Layout/LayoutFooter.doc.mjs +17 -0
- package/src/Link/Link.doc.mjs +17 -4
- package/src/Link/Link.test.tsx +24 -0
- package/src/Link/Link.tsx +5 -0
- package/src/Link/LinkProvider.doc.mjs +2 -2
- package/src/Link/__tests__/Link.navigation.a11y.chromium.spec.ts +261 -0
- package/src/Link/useLinkComponent.test.tsx +333 -0
- package/src/Link/useLinkComponent.ts +29 -57
- package/src/List/List.doc.mjs +6 -0
- package/src/List/List.spec.md +200 -0
- package/src/List/List.test.tsx +117 -1
- package/src/List/List.tsx +22 -2
- package/src/List/ListContext.tsx +3 -1
- package/src/List/ListItem.doc.mjs +2 -2
- package/src/List/ListItem.source-build.test.mjs +41 -0
- package/src/List/ListItem.tsx +26 -2
- package/src/Markdown/Markdown.doc.mjs +300 -2
- package/src/Markdown/Markdown.fr23.bench.ts +174 -0
- package/src/Markdown/Markdown.fr23.perf.test.ts +249 -0
- package/src/Markdown/Markdown.fr23.sampling.ts +49 -0
- package/src/Markdown/Markdown.helpers.perf.test.ts +489 -0
- package/src/Markdown/Markdown.public.test.ts +130 -3
- package/src/Markdown/Markdown.renderBoundary.test.tsx +72 -0
- package/src/Markdown/Markdown.spec.md +203 -45
- package/src/Markdown/Markdown.test.tsx +63 -0
- 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 +12 -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 +20 -0
- package/src/Markdown/parser.ts +1180 -235
- 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 +31 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +6 -9
- package/src/Selector/Selector.doc.mjs +2 -2
- package/src/Selector/Selector.spec.md +51 -49
- package/src/Selector/Selector.test.tsx +61 -55
- package/src/Selector/Selector.tsx +34 -15
- package/src/Selector/__tests__/Listbox.a11y.chromium.spec.ts +130 -0
- package/src/Selector/__tests__/Listbox.a11y.dom.ts +38 -0
- package/src/Selector/__tests__/Listbox.a11y.inventory.test.ts +63 -0
- package/src/Selector/__tests__/Listbox.a11y.known-failures.ts +37 -0
- package/src/Selector/__tests__/Listbox.a11y.states.ts +232 -0
- package/src/Selector/__tests__/Selector.a11y.chromium.spec.ts +45 -0
- package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +121 -0
- package/src/SideNav/SideNav.doc.mjs +1 -1
- package/src/SideNav/SideNav.test.tsx +10 -0
- package/src/SideNav/SideNav.tsx +14 -2
- package/src/Slider/Slider.doc.mjs +17 -3
- package/src/Slider/Slider.test.tsx +221 -0
- package/src/Slider/Slider.tsx +40 -9
- package/src/Spinner/Spinner.test.tsx +4 -0
- package/src/Spinner/Spinner.tsx +31 -18
- package/src/Switch/Switch.doc.mjs +11 -0
- package/src/Switch/Switch.test.tsx +16 -0
- package/src/Switch/Switch.tsx +28 -0
- package/src/TabList/Tab.tsx +35 -7
- package/src/TabList/TabList.doc.mjs +11 -0
- package/src/TabList/TabList.spec.md +204 -0
- package/src/TabList/TabList.test.tsx +66 -0
- package/src/TabList/__tests__/Tabs.a11y.known-failures.ts +1 -34
- package/src/Table/Table.doc.mjs +1 -1
- package/src/Table/Table.spec.md +54 -40
- package/src/Table/Table.test.tsx +83 -10
- package/src/Table/Table.tsx +30 -22
- package/src/Table/__tests__/TableScroll.a11y.chromium.spec.ts +137 -0
- package/src/TextArea/TextArea.tsx +6 -1
- package/src/TextInput/TextInput.test.tsx +20 -1
- package/src/TextInput/TextInput.tsx +6 -1
- package/src/TimeInput/TimeInput.tsx +6 -1
- package/src/Timer/Timer.doc.mjs +183 -0
- package/src/Timer/Timer.spec.md +215 -0
- package/src/Timer/Timer.test.tsx +302 -0
- package/src/Timer/Timer.tsx +258 -0
- package/src/Timer/index.ts +11 -0
- package/src/ToggleButton/ToggleButton.doc.mjs +3 -3
- package/src/ToggleButton/ToggleButton.test.tsx +299 -4
- package/src/ToggleButton/ToggleButton.tsx +26 -33
- package/src/ToggleButton/ToggleButtonGroup.doc.mjs +3 -3
- package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +209 -0
- package/src/Token/Token.doc.mjs +2 -2
- package/src/Tokenizer/Tokenizer.spec.md +142 -75
- package/src/TopNav/TopNavMenu.doc.mjs +2 -2
- package/src/TopNav/TopNavMenu.test.tsx +30 -0
- package/src/TopNav/TopNavMenu.tsx +7 -2
- package/src/TreeList/TreeList.doc.mjs +3 -3
- package/src/TreeList/TreeList.spec.md +123 -75
- package/src/TreeList/TreeList.test.tsx +29 -0
- package/src/TreeList/TreeList.tsx +3 -0
- package/src/TreeList/TreeListItem.tsx +15 -1
- package/src/TreeList/TreeListTypes.ts +11 -1
- package/src/Typeahead/BaseTypeahead.spec.md +4 -3
- package/src/Typeahead/BaseTypeahead.tsx +21 -7
- package/src/Typeahead/Typeahead.test.tsx +53 -0
- package/src/__tests__/PressedState.a11y.chromium.spec.ts +813 -0
- package/src/__tests__/pressState.ts +93 -0
- package/src/hooks/scrollKeyboardDelegation.test.ts +155 -0
- package/src/hooks/scrollKeyboardDelegation.ts +233 -0
- package/src/hooks/useClickableContainer.test.tsx +236 -0
- package/src/hooks/useClickableContainer.ts +20 -4
- package/src/hooks/useScrollableArea.doc.mjs +15 -3
- package/src/hooks/useScrollableArea.test.tsx +59 -1
- package/src/hooks/useScrollableArea.ts +34 -10
- package/src/index.ts +3 -0
- package/src/inputFontFloor.test.ts +106 -0
- package/src/tailwind-theme.css +0 -6
- package/src/theme/Theme.test.tsx +32 -0
- package/src/theme/declarationBoundary.test.ts +126 -0
- package/src/theme/declarationBoundary.ts +347 -0
- package/src/theme/derivedVarRegistry.test.ts +7 -0
- package/src/theme/derivedVarRegistry.ts +1 -0
- package/src/theme/generateThemeRules.test.ts +526 -1
- package/src/theme/generateThemeRules.ts +228 -50
- package/src/theme/tokenValueCompat.test.ts +4 -1
- package/src/utils/interactionOverlay.stylex.ts +20 -0
- package/src/utils/safeUrl.test.ts +88 -0
- package/src/utils/safeUrl.ts +85 -0
|
@@ -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');
|
|
@@ -37,9 +37,11 @@ const styles = stylex.create({
|
|
|
37
37
|
justifyContent: 'space-between',
|
|
38
38
|
gap: spacingVars['--spacing-3'],
|
|
39
39
|
},
|
|
40
|
-
// Compensate for the icon button's visual padding on the
|
|
41
|
-
|
|
40
|
+
// Compensate for the medium icon button's visual padding on the end slot.
|
|
41
|
+
endBlockEdgeCompensation: {
|
|
42
42
|
marginBlock: `calc(-1 * ${spacingVars['--spacing-2']})`,
|
|
43
|
+
},
|
|
44
|
+
endInlineEdgeCompensation: {
|
|
43
45
|
marginInlineEnd: `calc(-1 * ${spacingVars['--spacing-2']})`,
|
|
44
46
|
},
|
|
45
47
|
titleWrapper: {
|
|
@@ -98,6 +100,14 @@ export interface DialogHeaderProps extends BaseProps<HTMLDivElement> {
|
|
|
98
100
|
*/
|
|
99
101
|
endContent?: ReactNode;
|
|
100
102
|
|
|
103
|
+
/**
|
|
104
|
+
* Overrides automatic end-slot compensation. When omitted, the slot keeps its
|
|
105
|
+
* existing behavior: rendering the close action applies block and logical
|
|
106
|
+
* inline-end compensation. Use `inline`, `block`, or `all` to select the axes
|
|
107
|
+
* explicitly.
|
|
108
|
+
*/
|
|
109
|
+
endContentEdgeCompensation?: 'inline' | 'block' | 'all';
|
|
110
|
+
|
|
101
111
|
/**
|
|
102
112
|
* Adds a themed border at the bottom edge.
|
|
103
113
|
* When false, spacing collapse is applied automatically for seamless visual flow.
|
|
@@ -134,6 +144,7 @@ export function DialogHeader({
|
|
|
134
144
|
onOpenChange,
|
|
135
145
|
startContent,
|
|
136
146
|
endContent,
|
|
147
|
+
endContentEdgeCompensation,
|
|
137
148
|
hasDivider,
|
|
138
149
|
xstyle,
|
|
139
150
|
className,
|
|
@@ -146,6 +157,16 @@ export function DialogHeader({
|
|
|
146
157
|
const dialogContext = useDialogContext();
|
|
147
158
|
const shouldAutoFocus = dialogContext?.isInline !== true;
|
|
148
159
|
const titleId = dialogContext?.titleId;
|
|
160
|
+
const shouldCompensateEndBlock =
|
|
161
|
+
endContentEdgeCompensation == null
|
|
162
|
+
? onOpenChange != null
|
|
163
|
+
: endContentEdgeCompensation === 'block' ||
|
|
164
|
+
endContentEdgeCompensation === 'all';
|
|
165
|
+
const shouldCompensateEndInline =
|
|
166
|
+
endContentEdgeCompensation == null
|
|
167
|
+
? onOpenChange != null
|
|
168
|
+
: endContentEdgeCompensation === 'inline' ||
|
|
169
|
+
endContentEdgeCompensation === 'all';
|
|
149
170
|
|
|
150
171
|
// Auto-focus the title when mounted for screen reader accessibility.
|
|
151
172
|
// Inline dialogs are documentation/showcase previews, so suppress focus to
|
|
@@ -172,7 +193,13 @@ export function DialogHeader({
|
|
|
172
193
|
stylex.props(styles.container),
|
|
173
194
|
)}>
|
|
174
195
|
{startContent && (
|
|
175
|
-
<div
|
|
196
|
+
<div
|
|
197
|
+
{...mergeProps(
|
|
198
|
+
themeProps('dialog-header-start-content'),
|
|
199
|
+
stylex.props(styles.actions),
|
|
200
|
+
)}>
|
|
201
|
+
{startContent}
|
|
202
|
+
</div>
|
|
176
203
|
)}
|
|
177
204
|
<div
|
|
178
205
|
{...mergeProps(
|
|
@@ -195,9 +222,13 @@ export function DialogHeader({
|
|
|
195
222
|
</div>
|
|
196
223
|
{(endContent || onOpenChange) && (
|
|
197
224
|
<div
|
|
198
|
-
{...
|
|
199
|
-
|
|
200
|
-
|
|
225
|
+
{...mergeProps(
|
|
226
|
+
themeProps('dialog-header-end-content'),
|
|
227
|
+
stylex.props(
|
|
228
|
+
styles.actions,
|
|
229
|
+
shouldCompensateEndBlock && styles.endBlockEdgeCompensation,
|
|
230
|
+
shouldCompensateEndInline && styles.endInlineEdgeCompensation,
|
|
231
|
+
),
|
|
201
232
|
)}>
|
|
202
233
|
{endContent}
|
|
203
234
|
{onOpenChange && (
|
|
@@ -7,17 +7,19 @@ authority: current
|
|
|
7
7
|
archive_reason: null
|
|
8
8
|
superseded_by: null
|
|
9
9
|
approved_by: cixzhang
|
|
10
|
-
approved_at: 2026-09-
|
|
10
|
+
approved_at: 2026-09-23
|
|
11
11
|
owners: [cixzhang, imdreamrunner]
|
|
12
|
-
review_triggers: [theming, layout]
|
|
12
|
+
review_triggers: [theming, layout, public-api]
|
|
13
13
|
verified_by:
|
|
14
14
|
[
|
|
15
15
|
packages/core/src/Dialog/DialogHeader.test.tsx,
|
|
16
16
|
packages/core/src/theme/themingTargets.test.ts,
|
|
17
|
+
packages/cli/foundation/discovery/theming-targets.test.mjs,
|
|
17
18
|
scripts/check-knowledge.mjs,
|
|
18
19
|
]
|
|
19
20
|
parent_component: component:Dialog
|
|
20
|
-
references:
|
|
21
|
+
references:
|
|
22
|
+
[architecture:component-theming-surface, architecture:container-padding]
|
|
21
23
|
---
|
|
22
24
|
|
|
23
25
|
# DialogHeader module contract
|
|
@@ -25,14 +27,15 @@ references: [architecture:component-theming-surface]
|
|
|
25
27
|
## Intent
|
|
26
28
|
|
|
27
29
|
`DialogHeader` presents the title region of a Dialog and its optional close
|
|
28
|
-
control. This record owns the stable header-row, title-block,
|
|
29
|
-
|
|
30
|
+
control. This record owns the stable header-row, start-content, title-block,
|
|
31
|
+
end-content, and close-icon anatomy, their public theming targets, and the fixed
|
|
32
|
+
compensation applied to the existing end-content slot.
|
|
30
33
|
|
|
31
34
|
## Compatibility and migration
|
|
32
35
|
|
|
33
36
|
- Released default preserved: `yes`
|
|
34
|
-
- Compatibility class: additive theme targets
|
|
35
|
-
interaction, accessibility, and
|
|
37
|
+
- Compatibility class: two additive theme targets and one additive prop; omitted
|
|
38
|
+
layout, paint, interaction, accessibility, and theming remain unchanged
|
|
36
39
|
- Migration decision: none
|
|
37
40
|
|
|
38
41
|
Consumer migration instructions belong in consumer docs and release notes.
|
|
@@ -41,10 +44,16 @@ Consumer migration instructions belong in consumer docs and release notes.
|
|
|
41
44
|
|
|
42
45
|
**Owns**
|
|
43
46
|
|
|
44
|
-
- The header row that arranges title content and
|
|
47
|
+
- The header row that arranges title content and controls.
|
|
48
|
+
- The start-content wrapper for optional leading content.
|
|
45
49
|
- The title block that groups the title and optional subtitle.
|
|
50
|
+
- The existing end-content wrapper that groups optional trailing content with
|
|
51
|
+
the close action.
|
|
52
|
+
- The fixed end-slot compensation derived from the medium close action's
|
|
53
|
+
transparent inset.
|
|
46
54
|
- The close icon rendered for the optional close action.
|
|
47
|
-
- The `dialog-header`, `dialog-header-
|
|
55
|
+
- The `dialog-header`, `dialog-header-start-content`,
|
|
56
|
+
`dialog-header-title-block`, `dialog-header-end-content`, and
|
|
48
57
|
`dialog-header-close-icon` targets.
|
|
49
58
|
|
|
50
59
|
**Does not own / non-goals**
|
|
@@ -53,50 +62,70 @@ Consumer migration instructions belong in consumer docs and release notes.
|
|
|
53
62
|
`component:Dialog` and its linked system records.
|
|
54
63
|
- Generic Button or Icon presentation outside this module — owned by those
|
|
55
64
|
components.
|
|
56
|
-
-
|
|
65
|
+
- List-style inherited container-padding compensation, caller-supplied margin
|
|
66
|
+
values, or a general alignment primitive.
|
|
57
67
|
|
|
58
68
|
## Public API and concepts
|
|
59
69
|
|
|
60
|
-
|
|
61
|
-
|
|
70
|
+
This contract preserves the three existing theming surfaces, adds two content-
|
|
71
|
+
slot targets, and adds one slot-targeted compensation override.
|
|
62
72
|
|
|
63
|
-
| Concept
|
|
64
|
-
|
|
|
65
|
-
| Header row target
|
|
66
|
-
|
|
|
67
|
-
|
|
|
73
|
+
| Concept | Closed values or states | Meaning | Default | Owner | Stability |
|
|
74
|
+
| ---------------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------- | ----------------------------------------------------- | ---------------------------- | --------- |
|
|
75
|
+
| Header row target | present | Styles the row that arranges title content and controls | Existing row visuals | `module:Dialog/DialogHeader` | stable |
|
|
76
|
+
| Start-content target | present when start content renders | Styles the wrapper for optional leading content | Existing start-content layout | `module:Dialog/DialogHeader` | stable |
|
|
77
|
+
| Title block target | present | Styles the title/subtitle grouping element | Existing title stack visuals | `module:Dialog/DialogHeader` | stable |
|
|
78
|
+
| End-content target | present when end content or close action renders | Styles the wrapper that groups trailing content with the close action | Existing end-content layout | `module:Dialog/DialogHeader` | stable |
|
|
79
|
+
| Close icon target | present when close action renders | Styles the close glyph itself | Existing medium Icon visuals | `module:Dialog/DialogHeader` | stable |
|
|
80
|
+
| `endContentEdgeCompensation` | `inline`, `block`, `all` | Selects which axes of the existing end-content wrapper receive its fixed compensation | omitted; preserve automatic close-action compensation | `module:Dialog/DialogHeader` | stable |
|
|
81
|
+
|
|
82
|
+
For this slot-targeted prop, `inline` means the slot's logical inline-end edge,
|
|
83
|
+
`block` means both block edges, and `all` combines them.
|
|
68
84
|
|
|
69
85
|
## Behavioral contract
|
|
70
86
|
|
|
71
|
-
| ID
|
|
72
|
-
|
|
|
73
|
-
| FR1
|
|
74
|
-
| FR2
|
|
75
|
-
| FR3
|
|
76
|
-
| FR4
|
|
87
|
+
| ID | Invariant | Basis | Review state |
|
|
88
|
+
| ---- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ | ------------ |
|
|
89
|
+
| FR1 | The header row MUST carry `dialog-header` on the element that applies its row layout and gap. | Current implementation and owner decision | settled |
|
|
90
|
+
| FR2 | The title block MUST carry `dialog-header-title-block` on the element that applies its title/subtitle layout and gap. | Current implementation and owner decision | settled |
|
|
91
|
+
| FR3 | The rendered close Icon MUST carry `dialog-header-close-icon` on the glyph element that applies icon presentation. | Current implementation and owner decision | settled |
|
|
92
|
+
| FR4 | Omitting `onOpenChange` MUST continue to omit the close action and its optional close-icon anatomy. | Released behavior | settled |
|
|
93
|
+
| FR5 | The existing end wrapper MUST continue to group optional `endContent` with the optional close action; this change MUST NOT add another wrapper. | Current implementation | settled |
|
|
94
|
+
| FR6 | When `endContentEdgeCompensation` is omitted, rendering the close action MUST preserve the released fixed negative block and logical inline-end inset, whether or not `endContent` is present. Without the close action, no automatic compensation applies. | Released behavior and owner decision | settled |
|
|
95
|
+
| FR7 | Explicit `inline` MUST apply only logical inline-end compensation; `block` MUST apply only both block edges; `all` MUST apply both. The explicit value overrides the automatic close-action selection. | `module:Dialog/DialogHeader/DEC-2` | settled |
|
|
96
|
+
| FR8 | Compensation MUST use logical inline properties, preserve title, slot, and close-action semantics and hit targets, and expose no caller-controlled margin amount. | `architecture:container-padding`; owner decision | settled |
|
|
97
|
+
| FR9 | The leading content wrapper MUST carry `dialog-header-start-content` whenever optional start content renders. | `module:Dialog/DialogHeader/DEC-3` | settled |
|
|
98
|
+
| FR10 | The existing trailing content wrapper MUST carry `dialog-header-end-content` whenever optional end content or the close action renders. | `module:Dialog/DialogHeader/DEC-3` | settled |
|
|
77
99
|
|
|
78
100
|
### Transformation and precedence order
|
|
79
101
|
|
|
80
|
-
|
|
81
|
-
|
|
102
|
+
1. If `endContentEdgeCompensation` is present, its closed value selects the
|
|
103
|
+
compensated axes.
|
|
104
|
+
2. Otherwise, a rendered close action selects `all`; omission of the close
|
|
105
|
+
action selects no compensation.
|
|
106
|
+
3. The module applies each theme target to its owning element before normal
|
|
107
|
+
theme CSS resolves through the shared theming pipeline.
|
|
82
108
|
|
|
83
109
|
### Performance and resources
|
|
84
110
|
|
|
85
|
-
- The additive
|
|
86
|
-
measurement, or asynchronous resource.
|
|
111
|
+
- The additive closed-value branch and class selection introduce no listener,
|
|
112
|
+
observer, timer, measurement, or asynchronous resource.
|
|
87
113
|
|
|
88
114
|
## Accessibility contract
|
|
89
115
|
|
|
90
|
-
-
|
|
91
|
-
|
|
116
|
+
- Compensation and theme targets MUST NOT change the title's role, focus
|
|
117
|
+
behavior, dialog naming, the close button's accessible name and operation, or
|
|
118
|
+
any slot child's hit target.
|
|
92
119
|
|
|
93
120
|
## Design relationships
|
|
94
121
|
|
|
95
|
-
| Anatomy or state | Design requirement
|
|
96
|
-
|
|
|
97
|
-
| Header row
|
|
98
|
-
|
|
|
99
|
-
|
|
|
122
|
+
| Anatomy or state | Design requirement | Representation authority | Module contract |
|
|
123
|
+
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- | --------------- |
|
|
124
|
+
| Header row | Owns arrangement and spacing among title content and controls. | This module | FR1 |
|
|
125
|
+
| Start content | Owns the leading wrapper for optional start content. | This module | FR9 |
|
|
126
|
+
| Title block | Owns title/subtitle grouping and spacing. | This module | FR2 |
|
|
127
|
+
| End content | Owns the existing trailing wrapper containing optional end content and the close action, including its fixed slot-targeted compensation. | This module | FR4–FR8, FR10 |
|
|
128
|
+
| Close icon | Owns the close glyph's visual box inside the Button-owned action. | This module with Icon rendering | FR3, FR4 |
|
|
100
129
|
|
|
101
130
|
### Theming anatomy
|
|
102
131
|
|
|
@@ -105,7 +134,9 @@ existing anatomy.
|
|
|
105
134
|
```json
|
|
106
135
|
{
|
|
107
136
|
"Header row": {"target": "dialog-header"},
|
|
137
|
+
"Start content": {"target": "dialog-header-start-content"},
|
|
108
138
|
"Title block": {"target": "dialog-header-title-block"},
|
|
139
|
+
"End content": {"target": "dialog-header-end-content"},
|
|
109
140
|
"Close icon": {"target": "dialog-header-close-icon"}
|
|
110
141
|
}
|
|
111
142
|
```
|
|
@@ -113,22 +144,27 @@ existing anatomy.
|
|
|
113
144
|
## Parent and system relationships
|
|
114
145
|
|
|
115
146
|
- `component:Dialog` owns modal behavior and the aggregate Dialog contract.
|
|
116
|
-
- `component:Layout` owns the composed LayoutHeader region outside the
|
|
147
|
+
- `component:Layout` owns the composed LayoutHeader region outside the five
|
|
117
148
|
module-owned inner parts.
|
|
118
|
-
- `component:Button` owns the close action's control behavior
|
|
119
|
-
presentation.
|
|
149
|
+
- `component:Button` owns the close action's control behavior, hit target, and
|
|
150
|
+
outer presentation.
|
|
120
151
|
- `component:Icon` renders the glyph; this module guarantees a distinct target
|
|
121
152
|
for the close icon's DialogHeader-specific visual contract.
|
|
122
153
|
- `architecture:component-theming-surface` owns target qualification, anatomy
|
|
123
154
|
mapping, and the requirement that each target sits on its painter.
|
|
155
|
+
- `architecture:container-padding` defines the retained-inset edge-compensation
|
|
156
|
+
intent and distinguishes this slot-targeted projection from List-style
|
|
157
|
+
inherited-inset self-compensation and full bleed.
|
|
124
158
|
|
|
125
159
|
## Verification map
|
|
126
160
|
|
|
127
|
-
| Contract
|
|
128
|
-
|
|
|
129
|
-
| FR1–FR3 |
|
|
130
|
-
| FR4
|
|
131
|
-
|
|
|
161
|
+
| Contract | Verification | Representative states | Mutation or failure expectation |
|
|
162
|
+
| ------------------- | ------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
|
|
163
|
+
| FR1–FR3, FR9–FR10 | Target tests, target inventory, generated probe theme, and source inspection | title only, title/subtitle, start content, end content, close action | A target is missing, undocumented, duplicated, or moved away from its owning painter. |
|
|
164
|
+
| FR4–FR5 | Existing content and close-button tests | end content only; close only; both | The close action or slot content disappears, reorders, or gains another wrapper. |
|
|
165
|
+
| FR6–FR7 | Focused end-slot class-selection assertions | close only; end content only; both; explicit `inline`, `block`, and `all` | An omitted prop changes released geometry, or an explicit value selects the wrong axes. |
|
|
166
|
+
| FR8 | Source inspection, RTL CI, interaction tests, and focused real-browser geometry | LTR and RTL; custom end control; close action | Physical margins, caller-controlled amounts, or hit-target changes enter the implementation. |
|
|
167
|
+
| Theming anatomy map | `scripts/check-knowledge.mjs` | all five module anatomy entries and targets | Anatomy, docs, runtime targets, and the module map drift. |
|
|
132
168
|
|
|
133
169
|
## Decision log
|
|
134
170
|
|
|
@@ -141,6 +177,29 @@ Each public target represents documented anatomy and is applied to the element
|
|
|
141
177
|
that owns the corresponding visuals. The header row, title block, and close icon
|
|
142
178
|
meet that admission rule and are approved as additive targets.
|
|
143
179
|
|
|
180
|
+
### DEC-2 — End-content compensation is slot-targeted and explicit
|
|
181
|
+
|
|
182
|
+
**Reference:** `module:Dialog/DialogHeader/DEC-2`
|
|
183
|
+
**Decider:** cixzhang, 2026-09-22
|
|
184
|
+
|
|
185
|
+
DialogHeader preserves its released automatic compensation whenever the close
|
|
186
|
+
action renders. `endContentEdgeCompensation` targets the existing end-content
|
|
187
|
+
slot and selects `inline`, `block`, or `all` without exposing a margin amount.
|
|
188
|
+
This is a slot-targeted projection of the retained-inset edge-compensation
|
|
189
|
+
intent; it does not make DialogHeader a List-style inherited-padding consumer.
|
|
190
|
+
|
|
191
|
+
### DEC-3 — Content-slot wrappers are approved target destinations
|
|
192
|
+
|
|
193
|
+
**Reference:** `module:Dialog/DialogHeader/DEC-3`
|
|
194
|
+
**Decider:** cixzhang, 2026-09-23
|
|
195
|
+
|
|
196
|
+
The existing wrappers for `startContent` and `endContent` are approved as stable
|
|
197
|
+
visible anatomy. Their target destinations are
|
|
198
|
+
`dialog-header-start-content` and `dialog-header-end-content`; implementation
|
|
199
|
+
must add no wrapper and must preserve default layout, paint, interaction,
|
|
200
|
+
accessibility, and public props. The end-content name follows the public prop
|
|
201
|
+
even though that slot also contains the optional close action.
|
|
202
|
+
|
|
144
203
|
## Open questions
|
|
145
204
|
|
|
146
205
|
None.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* @file DropdownMenu.test.tsx
|
|
5
5
|
* @input Uses vitest, @testing-library/react, DropdownMenu component
|
|
6
|
-
* @output Unit tests for DropdownMenu
|
|
6
|
+
* @output Unit tests for DropdownMenu behavior and derived bottom-sheet item padding
|
|
7
7
|
* @position Testing; validates DropdownMenu.tsx implementation
|
|
8
8
|
*
|
|
9
9
|
* SYNC: When DropdownMenu.tsx changes, update tests to match new behavior
|
|
@@ -165,7 +165,10 @@ describe('DropdownMenu', () => {
|
|
|
165
165
|
});
|
|
166
166
|
expect(
|
|
167
167
|
screen.getByRole('button', {name: 'Edit project'}).closest('li'),
|
|
168
|
-
).toHaveStyle({
|
|
168
|
+
).toHaveStyle({
|
|
169
|
+
paddingInline: 'var(--_item-inset-inline)',
|
|
170
|
+
'--_item-inset-inline': 'var(--spacing-3)',
|
|
171
|
+
});
|
|
169
172
|
});
|
|
170
173
|
|
|
171
174
|
it('drills into nested data items in bottom-sheet presentation', async () => {
|