@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
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import {describe, it, expect, vi} from 'vitest';
|
|
4
4
|
import {render, screen, fireEvent} from '@testing-library/react';
|
|
5
|
+
import userEvent from '@testing-library/user-event';
|
|
5
6
|
import {ClickableCard} from './ClickableCard';
|
|
6
7
|
|
|
7
8
|
describe('ClickableCard', () => {
|
|
@@ -47,6 +48,47 @@ describe('ClickableCard', () => {
|
|
|
47
48
|
expect(handleClick).toHaveBeenCalledTimes(1);
|
|
48
49
|
});
|
|
49
50
|
|
|
51
|
+
it('calls onClick once when the accessible control itself is clicked', () => {
|
|
52
|
+
const handleClick = vi.fn();
|
|
53
|
+
render(
|
|
54
|
+
<ClickableCard label="Test card" onClick={handleClick}>
|
|
55
|
+
<span>Content</span>
|
|
56
|
+
</ClickableCard>,
|
|
57
|
+
);
|
|
58
|
+
// Pointer activation aimed at the element carrying the role — what
|
|
59
|
+
// speech input, assistive technology, and automation dispatch.
|
|
60
|
+
fireEvent.click(screen.getByRole('button', {name: 'Test card'}));
|
|
61
|
+
expect(handleClick).toHaveBeenCalledTimes(1);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('passes the card surface as currentTarget for surface clicks', () => {
|
|
65
|
+
const seen: EventTarget[] = [];
|
|
66
|
+
render(
|
|
67
|
+
<ClickableCard
|
|
68
|
+
label="Test card"
|
|
69
|
+
onClick={e => seen.push(e.currentTarget)}>
|
|
70
|
+
<span>Content</span>
|
|
71
|
+
</ClickableCard>,
|
|
72
|
+
);
|
|
73
|
+
fireEvent.click(screen.getByText('Content'));
|
|
74
|
+
expect(seen).toHaveLength(1);
|
|
75
|
+
expect(seen[0]).toBe(screen.getByText('Content').parentElement);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('calls onClick exactly once when the surface of an href card is clicked without preventDefault', () => {
|
|
79
|
+
const handleClick = vi.fn();
|
|
80
|
+
render(
|
|
81
|
+
<ClickableCard label="Nav card" href="/settings" onClick={handleClick}>
|
|
82
|
+
<span>Content</span>
|
|
83
|
+
</ClickableCard>,
|
|
84
|
+
);
|
|
85
|
+
// The container hook proxies the surface click to the link with
|
|
86
|
+
// `link.click()`; that synthetic click bubbles back through the card and
|
|
87
|
+
// must not run the consumer callback a second time.
|
|
88
|
+
fireEvent.click(screen.getByText('Content'));
|
|
89
|
+
expect(handleClick).toHaveBeenCalledTimes(1);
|
|
90
|
+
});
|
|
91
|
+
|
|
50
92
|
it('does NOT call onClick when a nested button is clicked', () => {
|
|
51
93
|
const handleCardClick = vi.fn();
|
|
52
94
|
const handleButtonClick = vi.fn();
|
|
@@ -86,25 +128,80 @@ describe('ClickableCard', () => {
|
|
|
86
128
|
expect(link).toHaveAttribute('target', '_blank');
|
|
87
129
|
});
|
|
88
130
|
|
|
89
|
-
it('disabled button is disabled', () => {
|
|
131
|
+
it('disabled button is disabled and the surface runs nothing', () => {
|
|
90
132
|
const handleClick = vi.fn();
|
|
91
133
|
render(
|
|
92
134
|
<ClickableCard label="Disabled" onClick={handleClick} isDisabled>
|
|
93
|
-
Content
|
|
135
|
+
<span>Content</span>
|
|
94
136
|
</ClickableCard>,
|
|
95
137
|
);
|
|
96
138
|
const button = screen.getByRole('button', {name: 'Disabled'});
|
|
97
139
|
expect(button).toBeDisabled();
|
|
140
|
+
fireEvent.click(screen.getByText('Content'));
|
|
141
|
+
fireEvent.click(button);
|
|
142
|
+
expect(handleClick).not.toHaveBeenCalled();
|
|
98
143
|
});
|
|
99
144
|
|
|
100
|
-
it('disabled link has aria-disabled', () => {
|
|
145
|
+
it('disabled link has aria-disabled, leaves the tab order, and the surface runs nothing', () => {
|
|
146
|
+
const handleClick = vi.fn();
|
|
101
147
|
render(
|
|
102
|
-
<ClickableCard
|
|
103
|
-
|
|
148
|
+
<ClickableCard
|
|
149
|
+
label="Disabled link"
|
|
150
|
+
href="/settings"
|
|
151
|
+
onClick={handleClick}
|
|
152
|
+
isDisabled>
|
|
153
|
+
<span>Content</span>
|
|
104
154
|
</ClickableCard>,
|
|
105
155
|
);
|
|
106
156
|
const link = screen.getByRole('link', {name: 'Disabled link'});
|
|
107
157
|
expect(link).toHaveAttribute('aria-disabled', 'true');
|
|
158
|
+
expect(link).toHaveAttribute('tabindex', '-1');
|
|
159
|
+
fireEvent.click(screen.getByText('Content'));
|
|
160
|
+
expect(handleClick).not.toHaveBeenCalled();
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it('runs onClick once from the keyboard via the hidden button', async () => {
|
|
164
|
+
const user = userEvent.setup();
|
|
165
|
+
const handleClick = vi.fn();
|
|
166
|
+
render(
|
|
167
|
+
<ClickableCard label="Test card" onClick={handleClick}>
|
|
168
|
+
<span>Content</span>
|
|
169
|
+
</ClickableCard>,
|
|
170
|
+
);
|
|
171
|
+
await user.tab();
|
|
172
|
+
expect(screen.getByRole('button', {name: 'Test card'})).toHaveFocus();
|
|
173
|
+
await user.keyboard('{Enter}');
|
|
174
|
+
await user.keyboard(' ');
|
|
175
|
+
expect(handleClick).toHaveBeenCalledTimes(2);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it('does NOT call onClick when a nested input is clicked', () => {
|
|
179
|
+
const handleCardClick = vi.fn();
|
|
180
|
+
render(
|
|
181
|
+
<ClickableCard label="Test card" onClick={handleCardClick}>
|
|
182
|
+
<input aria-label="Quantity" readOnly value="1" />
|
|
183
|
+
</ClickableCard>,
|
|
184
|
+
);
|
|
185
|
+
fireEvent.click(screen.getByRole('textbox', {name: 'Quantity'}));
|
|
186
|
+
expect(handleCardClick).not.toHaveBeenCalled();
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it('does NOT call onClick when text inside the card is selected', () => {
|
|
190
|
+
const handleClick = vi.fn();
|
|
191
|
+
render(
|
|
192
|
+
<ClickableCard label="Test card" onClick={handleClick}>
|
|
193
|
+
<span>Selectable body text</span>
|
|
194
|
+
</ClickableCard>,
|
|
195
|
+
);
|
|
196
|
+
const text = screen.getByText('Selectable body text');
|
|
197
|
+
const range = document.createRange();
|
|
198
|
+
range.selectNodeContents(text);
|
|
199
|
+
const selection = document.getSelection()!;
|
|
200
|
+
selection.removeAllRanges();
|
|
201
|
+
selection.addRange(range);
|
|
202
|
+
fireEvent.click(text);
|
|
203
|
+
expect(handleClick).not.toHaveBeenCalled();
|
|
204
|
+
selection.removeAllRanges();
|
|
108
205
|
});
|
|
109
206
|
|
|
110
207
|
describe('elevation', () => {
|
|
@@ -4,14 +4,18 @@ import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
|
|
|
4
4
|
import {applyHighlightRangesChunked} from './highlightRanges';
|
|
5
5
|
import type {TokenLine} from './tokenizer';
|
|
6
6
|
|
|
7
|
-
// Mock CSS Highlight API
|
|
7
|
+
// Mock CSS Highlight API. `escape` is real behavior, not a mock: the code
|
|
8
|
+
// under test escapes generated names with it, so jsdom's implementation is
|
|
9
|
+
// carried over when the CSS global is replaced.
|
|
8
10
|
class MockHighlight extends Set<Range> {}
|
|
9
11
|
const mockHighlightsMap = new Map<string, MockHighlight>();
|
|
12
|
+
const realCssEscape = globalThis.CSS.escape;
|
|
10
13
|
|
|
11
14
|
beforeEach(() => {
|
|
12
15
|
mockHighlightsMap.clear();
|
|
13
16
|
|
|
14
17
|
globalThis.CSS = {
|
|
18
|
+
escape: realCssEscape,
|
|
15
19
|
highlights: {
|
|
16
20
|
get: (name: string) => mockHighlightsMap.get(name),
|
|
17
21
|
set: (name: string, h: MockHighlight) => mockHighlightsMap.set(name, h),
|
|
@@ -44,6 +48,30 @@ function createCodeElement(lines: string[]): HTMLElement {
|
|
|
44
48
|
return code;
|
|
45
49
|
}
|
|
46
50
|
|
|
51
|
+
/**
|
|
52
|
+
* The dynamic stylesheet is module-level state shared by every test in this
|
|
53
|
+
* file, so each test drives unique token types and looks its rules up by the
|
|
54
|
+
* escaped name rather than by position.
|
|
55
|
+
*/
|
|
56
|
+
function dynamicRules(): CSSStyleRule[] {
|
|
57
|
+
const dynamicSheet = document.querySelector<HTMLStyleElement>(
|
|
58
|
+
'style[data-astryx-highlight-dynamic]',
|
|
59
|
+
);
|
|
60
|
+
return Array.from(dynamicSheet?.sheet?.cssRules ?? []) as CSSStyleRule[];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Exactly the two highlight selectors and nothing else: an escaped ident may
|
|
65
|
+
* contain any character, but only behind a backslash, so an unescaped `)`
|
|
66
|
+
* that closed the function early (and the `, body` after it) cannot match.
|
|
67
|
+
*/
|
|
68
|
+
const HIGHLIGHT_ONLY_SELECTOR =
|
|
69
|
+
/^\.astryx-code-block code::highlight\((?:[^()\\]|\\.)+\), \.astryx-codeeditor code::highlight\((?:[^()\\]|\\.)+\)$/;
|
|
70
|
+
|
|
71
|
+
function highlightRule(name: string): string {
|
|
72
|
+
return `.astryx-code-block code::highlight(${name}), .astryx-codeeditor code::highlight(${name})`;
|
|
73
|
+
}
|
|
74
|
+
|
|
47
75
|
describe('applyHighlightRangesChunked', () => {
|
|
48
76
|
it('creates ranges for tokens on each line', () => {
|
|
49
77
|
const codeEl = createCodeElement(['const x = 1;', 'let y = 2;']);
|
|
@@ -67,6 +95,120 @@ describe('applyHighlightRangesChunked', () => {
|
|
|
67
95
|
expect(kwHighlight!.size).toBe(0);
|
|
68
96
|
});
|
|
69
97
|
|
|
98
|
+
it('keeps every parser-accepted tokenizer type coloured under its raw name', () => {
|
|
99
|
+
// The dotted type that crashed the block, plus names a narrow allowlist
|
|
100
|
+
// would wrongly reject even though the CSS parser accepts them all.
|
|
101
|
+
const types = ['keyword.control.sql', '_private', 'キーワード', '9start'];
|
|
102
|
+
const codeEl = createCodeElement(types.map(() => 'line'));
|
|
103
|
+
const tokenLines: TokenLine[] = types.map(type => [
|
|
104
|
+
{type, start: 0, end: 4},
|
|
105
|
+
]);
|
|
106
|
+
|
|
107
|
+
const mockStyle = document.createElement('style');
|
|
108
|
+
mockStyle.setAttribute('data-astryx-highlight-styles', '');
|
|
109
|
+
document.head.appendChild(mockStyle);
|
|
110
|
+
const insertRule = vi.spyOn(CSSStyleSheet.prototype, 'insertRule');
|
|
111
|
+
|
|
112
|
+
const cleanup = applyHighlightRangesChunked(codeEl, tokenLines);
|
|
113
|
+
|
|
114
|
+
// Ranges register under the RAW names: a ::highlight() selector matches
|
|
115
|
+
// by ident value, so the escaped rule below still paints them.
|
|
116
|
+
for (const type of types) {
|
|
117
|
+
expect(mockHighlightsMap.get(`astryx-${type}`)?.size).toBe(1);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// One rule per type, with only the characters that need it escaped.
|
|
121
|
+
expect(insertRule.mock.calls.map(([rule]) => rule)).toEqual([
|
|
122
|
+
`${highlightRule('astryx-keyword\\.control\\.sql')} { color: var(--color-syntax-keyword\\.control\\.sql, currentColor); }`,
|
|
123
|
+
`${highlightRule('astryx-_private')} { color: var(--color-syntax-_private, currentColor); }`,
|
|
124
|
+
`${highlightRule('astryx-キーワード')} { color: var(--color-syntax-キーワード, currentColor); }`,
|
|
125
|
+
`${highlightRule('astryx-9start')} { color: var(--color-syntax-9start, currentColor); }`,
|
|
126
|
+
]);
|
|
127
|
+
|
|
128
|
+
cleanup();
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('escapes the highlight name so a token type cannot leave its ::highlight() selector', () => {
|
|
132
|
+
// Unescaped, this type closes ::highlight() early and the CSS parser
|
|
133
|
+
// accepts what follows as a valid second selector plus a declaration
|
|
134
|
+
// block, with the trailing comment opener swallowing the rest of the
|
|
135
|
+
// generated rule text. The result is a rule that styles <body>.
|
|
136
|
+
const type = 'sel), body { background: red } /*';
|
|
137
|
+
const escapedName =
|
|
138
|
+
'astryx-sel\\)\\,\\ body\\ \\{\\ background\\:\\ red\\ \\}\\ \\/\\*';
|
|
139
|
+
const codeEl = createCodeElement(['line']);
|
|
140
|
+
const tokenLines: TokenLine[] = [[{type, start: 0, end: 4}]];
|
|
141
|
+
|
|
142
|
+
const mockStyle = document.createElement('style');
|
|
143
|
+
mockStyle.setAttribute('data-astryx-highlight-styles', '');
|
|
144
|
+
document.head.appendChild(mockStyle);
|
|
145
|
+
const insertRule = vi.spyOn(CSSStyleSheet.prototype, 'insertRule');
|
|
146
|
+
|
|
147
|
+
const cleanup = applyHighlightRangesChunked(codeEl, tokenLines);
|
|
148
|
+
|
|
149
|
+
expect(mockHighlightsMap.get(`astryx-${type}`)?.size).toBe(1);
|
|
150
|
+
|
|
151
|
+
// The exact rule text handed to the engine: both generated names fully
|
|
152
|
+
// escaped, one colour declaration, nothing of the payload's making.
|
|
153
|
+
expect(insertRule).toHaveBeenCalledTimes(1);
|
|
154
|
+
expect(insertRule).toHaveBeenCalledWith(
|
|
155
|
+
`${highlightRule(escapedName)} { color: var(--color-syntax-sel\\)\\,\\ body\\ \\{\\ background\\:\\ red\\ \\}\\ \\/\\*, currentColor); }`,
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
// And as parsed: the rule for this type keeps the payload inside the
|
|
159
|
+
// ident, and no rule in the sheet has any selector beyond the two
|
|
160
|
+
// highlight selectors.
|
|
161
|
+
const rules = dynamicRules();
|
|
162
|
+
const rule = rules.find(r => r.selectorText.includes('astryx-sel'));
|
|
163
|
+
expect(rule?.selectorText).toBe(highlightRule(escapedName));
|
|
164
|
+
for (const r of rules) {
|
|
165
|
+
expect(r.selectorText).toMatch(HIGHLIGHT_ONLY_SELECTOR);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
cleanup();
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('escapes the custom property so a token type cannot add declarations', () => {
|
|
172
|
+
// Unescaped, this type closes var() early and the CSS parser accepts
|
|
173
|
+
// what follows as two more valid declarations.
|
|
174
|
+
const type = 'p); background: red; --x: var(--y';
|
|
175
|
+
const escapedName =
|
|
176
|
+
'astryx-p\\)\\;\\ background\\:\\ red\\;\\ --x\\:\\ var\\(--y';
|
|
177
|
+
const escapedColor =
|
|
178
|
+
'var(--color-syntax-p\\)\\;\\ background\\:\\ red\\;\\ --x\\:\\ var\\(--y, currentColor)';
|
|
179
|
+
const codeEl = createCodeElement(['line']);
|
|
180
|
+
const tokenLines: TokenLine[] = [[{type, start: 0, end: 4}]];
|
|
181
|
+
|
|
182
|
+
const mockStyle = document.createElement('style');
|
|
183
|
+
mockStyle.setAttribute('data-astryx-highlight-styles', '');
|
|
184
|
+
document.head.appendChild(mockStyle);
|
|
185
|
+
const insertRule = vi.spyOn(CSSStyleSheet.prototype, 'insertRule');
|
|
186
|
+
|
|
187
|
+
const cleanup = applyHighlightRangesChunked(codeEl, tokenLines);
|
|
188
|
+
|
|
189
|
+
expect(mockHighlightsMap.get(`astryx-${type}`)?.size).toBe(1);
|
|
190
|
+
|
|
191
|
+
expect(insertRule).toHaveBeenCalledTimes(1);
|
|
192
|
+
expect(insertRule).toHaveBeenCalledWith(
|
|
193
|
+
`${highlightRule(escapedName)} { color: ${escapedColor}; }`,
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
// As parsed: exactly one declaration, `color`, whose value is the
|
|
197
|
+
// escaped custom property with its fallback.
|
|
198
|
+
const rule = dynamicRules().find(r => r.selectorText.includes('astryx-p'));
|
|
199
|
+
expect(rule).toBeDefined();
|
|
200
|
+
expect(rule!.selectorText).toBe(highlightRule(escapedName));
|
|
201
|
+
const declared = Array.from({length: rule!.style.length}, (_, i) =>
|
|
202
|
+
rule!.style.item(i),
|
|
203
|
+
);
|
|
204
|
+
expect(declared).toEqual(['color']);
|
|
205
|
+
expect(rule!.style.getPropertyValue('color')).toBe(escapedColor);
|
|
206
|
+
expect(rule!.style.getPropertyValue('background')).toBe('');
|
|
207
|
+
expect(rule!.style.getPropertyValue('--x')).toBe('');
|
|
208
|
+
|
|
209
|
+
cleanup();
|
|
210
|
+
});
|
|
211
|
+
|
|
70
212
|
it('handles empty token lines', () => {
|
|
71
213
|
const codeEl = createCodeElement(['', 'const x = 1;']);
|
|
72
214
|
const tokenLines: TokenLine[] = [[], [{type: 'keyword', start: 0, end: 5}]];
|
|
@@ -64,11 +64,21 @@ function ensureDynamicHighlightType(tokenType: string): void {
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
// CSS.escape both generated names before they land in rule text: the
|
|
68
|
+
// registry key stays the raw string (a ::highlight() selector matches by
|
|
69
|
+
// ident VALUE, escapes and all), so dotted, non-ASCII, `_private`, and
|
|
70
|
+
// digit-led token types keep their colours — while nothing a token stream
|
|
71
|
+
// carries can step outside its ident and shape the rule.
|
|
72
|
+
const name = CSS.escape(`astryx-${tokenType}`);
|
|
73
|
+
const colorVar = `var(${CSS.escape(`--color-syntax-${tokenType}`)}, currentColor)`;
|
|
74
|
+
try {
|
|
75
|
+
dynamicStyleSheet.insertRule(
|
|
76
|
+
`.astryx-code-block code::highlight(${name}), .astryx-codeeditor code::highlight(${name}) { color: ${colorVar}; }`,
|
|
77
|
+
);
|
|
78
|
+
} catch {
|
|
79
|
+
// An engine that still refuses the rule costs that type its colour
|
|
80
|
+
// (ranges paint with currentColor) — never the whole code block.
|
|
81
|
+
}
|
|
72
82
|
}
|
|
73
83
|
|
|
74
84
|
// ---------------------------------------------------------------------------
|
|
@@ -82,6 +82,17 @@ export const docs = {
|
|
|
82
82
|
{name: 'CollapsibleGroup'},
|
|
83
83
|
],
|
|
84
84
|
usage: {
|
|
85
|
+
accessibility: [
|
|
86
|
+
{
|
|
87
|
+
name: 'Trigger label',
|
|
88
|
+
category: 'Color contrast',
|
|
89
|
+
criterion: '1.4.3 Contrast (Minimum)',
|
|
90
|
+
requirement: '4.5:1',
|
|
91
|
+
states: ['Rest', 'Pointer down'],
|
|
92
|
+
description:
|
|
93
|
+
'The trigger text must have at least 4.5:1 contrast with the surface behind it. For Pointer down, measure against the pressed overlay the trigger row paints while it is pressed.',
|
|
94
|
+
},
|
|
95
|
+
],
|
|
85
96
|
description: 'Collapsible hides and reveals content behind a trigger button. Use it in settings panels, FAQ pages, or detail views to keep the page scannable while letting users drill into sections they care about. Wrap multiple collapsibles in CollapsibleGroup for accordion behavior. For custom collapsible components, use the `useCollapsible` hook directly (`astryx hook useCollapsible`).',
|
|
86
97
|
bestPractices: [
|
|
87
98
|
{ guidance: true, description: 'Use hasDividers on CollapsibleGroup for FAQ-style lists: built-in row hairlines with themed border tokens, no hand-rolled borders.' },
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
import {describe, it, expect, vi} from 'vitest';
|
|
13
13
|
import {render, screen, within} from '@testing-library/react';
|
|
14
14
|
import userEvent from '@testing-library/user-event';
|
|
15
|
+
import {hasPressedArm} from '../__tests__/pressState';
|
|
15
16
|
import {Collapsible} from './Collapsible';
|
|
16
17
|
import {CollapsibleGroup} from './CollapsibleGroup';
|
|
17
18
|
|
|
@@ -615,3 +616,23 @@ describe('Collapsible', () => {
|
|
|
615
616
|
});
|
|
616
617
|
});
|
|
617
618
|
});
|
|
619
|
+
|
|
620
|
+
describe('pressed state', () => {
|
|
621
|
+
it('paints the pressed overlay on the trigger row while it is pressed', () => {
|
|
622
|
+
render(
|
|
623
|
+
<Collapsible trigger="Details">
|
|
624
|
+
<p>Body</p>
|
|
625
|
+
</Collapsible>,
|
|
626
|
+
);
|
|
627
|
+
expect(hasPressedArm(screen.getByRole('button'))).toBe(true);
|
|
628
|
+
});
|
|
629
|
+
|
|
630
|
+
it('does not press a disabled trigger', () => {
|
|
631
|
+
render(
|
|
632
|
+
<Collapsible trigger="Details" isDisabled>
|
|
633
|
+
<p>Body</p>
|
|
634
|
+
</Collapsible>,
|
|
635
|
+
);
|
|
636
|
+
expect(hasPressedArm(screen.getByRole('button'))).toBe(false);
|
|
637
|
+
});
|
|
638
|
+
});
|
|
@@ -48,6 +48,7 @@ import {mergeProps} from '../utils';
|
|
|
48
48
|
import type {BaseProps} from '../BaseProps';
|
|
49
49
|
import {themeProps} from '../utils/themeProps';
|
|
50
50
|
import {focusOutlineProps} from '../utils/focusOutline.stylex';
|
|
51
|
+
import {interactionOverlayStyles} from '../utils/interactionOverlay.stylex';
|
|
51
52
|
|
|
52
53
|
const styles = stylex.create({
|
|
53
54
|
root: {
|
|
@@ -411,6 +412,10 @@ export function Collapsible({
|
|
|
411
412
|
focusOutlineProps.focusVisible(
|
|
412
413
|
styles.trigger,
|
|
413
414
|
density != null && triggerDensity[density],
|
|
415
|
+
// The system's pressed overlay on the disclosure row. The trigger
|
|
416
|
+
// has no hover surface of its own, so this is the one background
|
|
417
|
+
// it paints, and only while it is pressed.
|
|
418
|
+
!isDisabled && interactionOverlayStyles.pressedBackgroundColor,
|
|
414
419
|
isDisabled && styles.triggerDisabled,
|
|
415
420
|
),
|
|
416
421
|
)}>
|
|
@@ -73,9 +73,14 @@ const styles = stylex.create({
|
|
|
73
73
|
backgroundColor: 'transparent',
|
|
74
74
|
color: colorVars['--color-text-primary'],
|
|
75
75
|
fontFamily: typographyVars['--font-family-body'],
|
|
76
|
+
// The 16px floor is iOS-only: iOS Safari zooms the page when a focused
|
|
77
|
+
// control sits under 16px, and only iOS WebKit implements
|
|
78
|
+
// -webkit-touch-callout to key the coarse-pointer floor to it.
|
|
76
79
|
fontSize: {
|
|
77
80
|
default: typeScaleVars['--text-body-size'],
|
|
78
|
-
'@media (pointer: coarse)':
|
|
81
|
+
'@media (pointer: coarse)': {
|
|
82
|
+
'@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
|
|
83
|
+
},
|
|
79
84
|
},
|
|
80
85
|
lineHeight: typeScaleVars['--text-body-leading'],
|
|
81
86
|
padding: 0,
|
|
@@ -65,9 +65,14 @@ const styles = stylex.create({
|
|
|
65
65
|
paddingBlock: spacingVars['--spacing-2'],
|
|
66
66
|
paddingInline: spacingVars['--spacing-3'],
|
|
67
67
|
fontFamily: typographyVars['--font-family-body'],
|
|
68
|
+
// The 16px floor is iOS-only: iOS Safari zooms the page when a focused
|
|
69
|
+
// control sits under 16px, and only iOS WebKit implements
|
|
70
|
+
// -webkit-touch-callout to key the coarse-pointer floor to it.
|
|
68
71
|
fontSize: {
|
|
69
72
|
default: typeScaleVars['--text-label-size'],
|
|
70
|
-
'@media (pointer: coarse)':
|
|
73
|
+
'@media (pointer: coarse)': {
|
|
74
|
+
'@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-label-size']})`,
|
|
75
|
+
},
|
|
71
76
|
},
|
|
72
77
|
lineHeight: typeScaleVars['--text-label-leading'],
|
|
73
78
|
color: colorVars['--color-text-primary'],
|
|
@@ -99,9 +99,14 @@ const styles = stylex.create({
|
|
|
99
99
|
borderStyle: 'none',
|
|
100
100
|
padding: 0,
|
|
101
101
|
fontFamily: typographyVars['--font-family-body'],
|
|
102
|
+
// The 16px floor is iOS-only: iOS Safari zooms the page when a focused
|
|
103
|
+
// control sits under 16px, and only iOS WebKit implements
|
|
104
|
+
// -webkit-touch-callout to key the coarse-pointer floor to it.
|
|
102
105
|
fontSize: {
|
|
103
106
|
default: typeScaleVars['--text-body-size'],
|
|
104
|
-
'@media (pointer: coarse)':
|
|
107
|
+
'@media (pointer: coarse)': {
|
|
108
|
+
'@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
|
|
109
|
+
},
|
|
105
110
|
},
|
|
106
111
|
lineHeight: typeScaleVars['--text-body-leading'],
|
|
107
112
|
color: colorVars['--color-text-primary'],
|
|
@@ -100,10 +100,14 @@ const styles = stylex.create({
|
|
|
100
100
|
borderStyle: 'none',
|
|
101
101
|
padding: 0,
|
|
102
102
|
fontFamily: typographyVars['--font-family-body'],
|
|
103
|
-
// Below 16px iOS zooms the page when the field takes focus.
|
|
103
|
+
// Below 16px iOS zooms the page when the field takes focus. Only iOS
|
|
104
|
+
// WebKit implements -webkit-touch-callout, so the coarse-pointer floor is
|
|
105
|
+
// keyed to iOS alone.
|
|
104
106
|
fontSize: {
|
|
105
107
|
default: typeScaleVars['--text-body-size'],
|
|
106
|
-
'@media (pointer: coarse)':
|
|
108
|
+
'@media (pointer: coarse)': {
|
|
109
|
+
'@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
|
|
110
|
+
},
|
|
107
111
|
},
|
|
108
112
|
lineHeight: typeScaleVars['--text-body-leading'],
|
|
109
113
|
color: colorVars['--color-text-primary'],
|
|
@@ -112,11 +116,20 @@ const styles = stylex.create({
|
|
|
112
116
|
// A date control's intrinsic height comes from its inner edit fields, not
|
|
113
117
|
// from `line-height`, so it renders ~2px taller than a text input and its
|
|
114
118
|
// value sits off the shared baseline inside the same flex row. One line
|
|
115
|
-
// box is exactly what the text field occupies.
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
119
|
+
// box is exactly what the text field occupies. The calc fallback mirrors
|
|
120
|
+
// the iOS-only floor above; browsers with `1lh` track it for free.
|
|
121
|
+
height: {
|
|
122
|
+
default: stylex.firstThatWorks(
|
|
123
|
+
'1lh',
|
|
124
|
+
`calc(${typeScaleVars['--text-body-size']} * ${typeScaleVars['--text-body-leading']})`,
|
|
125
|
+
),
|
|
126
|
+
'@media (pointer: coarse)': {
|
|
127
|
+
'@supports (-webkit-touch-callout: none)': stylex.firstThatWorks(
|
|
128
|
+
'1lh',
|
|
129
|
+
`calc(max(1rem, ${typeScaleVars['--text-body-size']}) * ${typeScaleVars['--text-body-leading']})`,
|
|
130
|
+
),
|
|
131
|
+
},
|
|
132
|
+
},
|
|
120
133
|
// iOS gives date controls their own button-like chrome, with inner
|
|
121
134
|
// spacing and a centred value that no reset of ours can reach.
|
|
122
135
|
WebkitAppearance: 'none',
|
|
@@ -187,9 +200,12 @@ const styles = stylex.create({
|
|
|
187
200
|
// covers — one line of that leading fills its height exactly, which puts
|
|
188
201
|
// the glyphs on the input's own baseline.
|
|
189
202
|
display: 'block',
|
|
203
|
+
// ...with the input's own iOS floor, so the two baselines stay shared.
|
|
190
204
|
fontSize: {
|
|
191
205
|
default: typeScaleVars['--text-body-size'],
|
|
192
|
-
'@media (pointer: coarse)':
|
|
206
|
+
'@media (pointer: coarse)': {
|
|
207
|
+
'@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
|
|
208
|
+
},
|
|
193
209
|
},
|
|
194
210
|
lineHeight: typeScaleVars['--text-body-leading'],
|
|
195
211
|
// A tap has to reach the control underneath — that is what raises the
|
|
@@ -194,10 +194,14 @@ const styles = stylex.create({
|
|
|
194
194
|
padding: 0,
|
|
195
195
|
fontFamily: typographyVars['--font-family-body'],
|
|
196
196
|
// Below 16px iOS zooms the page on focus. The field is focusable even
|
|
197
|
-
// though it is not typable, so it needs the same floor DateInput has
|
|
197
|
+
// though it is not typable, so it needs the same floor DateInput has —
|
|
198
|
+
// keyed to iOS alone, since only iOS WebKit implements
|
|
199
|
+
// -webkit-touch-callout.
|
|
198
200
|
fontSize: {
|
|
199
201
|
default: typeScaleVars['--text-body-size'],
|
|
200
|
-
'@media (pointer: coarse)':
|
|
202
|
+
'@media (pointer: coarse)': {
|
|
203
|
+
'@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
|
|
204
|
+
},
|
|
201
205
|
},
|
|
202
206
|
lineHeight: typeScaleVars['--text-body-leading'],
|
|
203
207
|
color: colorVars['--color-text-primary'],
|
|
@@ -92,9 +92,14 @@ const styles = stylex.create({
|
|
|
92
92
|
borderStyle: 'none',
|
|
93
93
|
padding: 0,
|
|
94
94
|
fontFamily: typographyVars['--font-family-body'],
|
|
95
|
+
// The 16px floor is iOS-only: iOS Safari zooms the page when a focused
|
|
96
|
+
// control sits under 16px, and only iOS WebKit implements
|
|
97
|
+
// -webkit-touch-callout to key the coarse-pointer floor to it.
|
|
95
98
|
fontSize: {
|
|
96
99
|
default: typeScaleVars['--text-body-size'],
|
|
97
|
-
'@media (pointer: coarse)':
|
|
100
|
+
'@media (pointer: coarse)': {
|
|
101
|
+
'@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
|
|
102
|
+
},
|
|
98
103
|
},
|
|
99
104
|
lineHeight: typeScaleVars['--text-body-leading'],
|
|
100
105
|
color: colorVars['--color-text-primary'],
|
|
@@ -173,9 +173,14 @@ const styles = stylex.create({
|
|
|
173
173
|
borderStyle: 'none',
|
|
174
174
|
padding: 0,
|
|
175
175
|
fontFamily: typographyVars['--font-family-body'],
|
|
176
|
+
// The 16px floor is iOS-only: iOS Safari zooms the page when a focused
|
|
177
|
+
// control sits under 16px, and only iOS WebKit implements
|
|
178
|
+
// -webkit-touch-callout to key the coarse-pointer floor to it.
|
|
176
179
|
fontSize: {
|
|
177
180
|
default: typeScaleVars['--text-body-size'],
|
|
178
|
-
'@media (pointer: coarse)':
|
|
181
|
+
'@media (pointer: coarse)': {
|
|
182
|
+
'@supports (-webkit-touch-callout: none)': `max(1rem, ${typeScaleVars['--text-body-size']})`,
|
|
183
|
+
},
|
|
179
184
|
},
|
|
180
185
|
lineHeight: typeScaleVars['--text-body-leading'],
|
|
181
186
|
color: colorVars['--color-text-primary'],
|
|
@@ -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: [
|