@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
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Tests for the declaration boundary scanner.
|
|
5
|
+
*
|
|
6
|
+
* Every "keeps" case is valid CSS a browser reads as one declaration; every
|
|
7
|
+
* "rejects" case would end the declaration or rule early, swallow what follows
|
|
8
|
+
* it, or be discarded by the browser as a bad token.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import {describe, it, expect} from 'vitest';
|
|
12
|
+
import {
|
|
13
|
+
checkDeclarationName,
|
|
14
|
+
checkDeclarationValue,
|
|
15
|
+
} from './declarationBoundary';
|
|
16
|
+
|
|
17
|
+
describe('checkDeclarationValue keeps valid CSS inside one declaration', () => {
|
|
18
|
+
it.each([
|
|
19
|
+
['plain color', '#FF00FF'],
|
|
20
|
+
['color function', 'color-mix(in oklch, #FF00FF 80%, white)'],
|
|
21
|
+
['gradient', 'linear-gradient(135deg, #FF00FF 0%, #00FFFF 100%)'],
|
|
22
|
+
['calc', 'calc(100% - 24px)'],
|
|
23
|
+
['light-dark', 'light-dark(#fff, #111)'],
|
|
24
|
+
['font stack', "'Inter Var', ui-sans-serif, system-ui"],
|
|
25
|
+
['important flag', 'red !important'],
|
|
26
|
+
[
|
|
27
|
+
'data URI, semicolon inside url()',
|
|
28
|
+
'url(data:image/png;base64,iVBORw0KGgo=)',
|
|
29
|
+
],
|
|
30
|
+
['uppercase URL()', 'URL(data:image/svg+xml;base64,PHN2Zz4=)'],
|
|
31
|
+
['uppercase URL with an inert brace', 'URL(data:text/plain,a{b)'],
|
|
32
|
+
['mixed-case Url() with spaces', 'Url( data:image/png;base64,iVBORw0= )'],
|
|
33
|
+
['quoted url with semicolon', 'url("data:image/svg+xml;utf8,<svg/>")'],
|
|
34
|
+
['quoted url with a quoted brace', "url('x.png?a={1;2}')"],
|
|
35
|
+
['url nested in image-set', 'image-set(url(a;b.png) 1x, url(c;d.png) 2x)'],
|
|
36
|
+
['escaped space in identifier', 'Gill\\ Sans, serif'],
|
|
37
|
+
['escaped semicolon in identifier', 'a\\;b'],
|
|
38
|
+
['hex escape', '\\31 23'],
|
|
39
|
+
['escaped quote inside a string', '"a\\" ; b"'],
|
|
40
|
+
['semicolon inside a double-quoted string', '"a;b"'],
|
|
41
|
+
['semicolon inside a single-quoted string', "'a;b'"],
|
|
42
|
+
['braces inside a string', '"} body { color: red }"'],
|
|
43
|
+
['closed comment', '/* brand */ red'],
|
|
44
|
+
['closed comment with a semicolon inside', 'red /* ; } */'],
|
|
45
|
+
['comment-like text inside a string', '"/* not a comment"'],
|
|
46
|
+
['balanced brackets in a grid line name', '[full-start] 1fr [full-end]'],
|
|
47
|
+
['semicolon nested in parentheses', 'var(--x, a;b)'],
|
|
48
|
+
['brace nested in parentheses', 'var(--x, {a})'],
|
|
49
|
+
['backslash before a newline is a delim', 'a\\\nb'],
|
|
50
|
+
['whitespace including tab and newline', 'a\t\nb'],
|
|
51
|
+
['CRLF string continuation', '"a\\\r\nb"'],
|
|
52
|
+
['CRLF after a hex escape in a string', '"\\61\r\nb"'],
|
|
53
|
+
['escaped url identifier', 'u\\72l(data:image/png;base64,a)'],
|
|
54
|
+
['null is preprocessed by CSS', 'red\u0000'],
|
|
55
|
+
['control character inside a string', '"a\u0001b"'],
|
|
56
|
+
['control character inside a closed comment', 'red /* \u0001 ; } */'],
|
|
57
|
+
['empty value', ''],
|
|
58
|
+
])('keeps %s', (_label, value) => {
|
|
59
|
+
expect(checkDeclarationValue(value)).toBeNull();
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
describe('checkDeclarationValue rejects true declaration and rule breaks', () => {
|
|
64
|
+
it.each([
|
|
65
|
+
['top-level semicolon', 'red; background: url(x)', ';'],
|
|
66
|
+
['top-level closing brace', 'red } body { color: blue', '}'],
|
|
67
|
+
['top-level opening brace', 'red { color: blue }', '{'],
|
|
68
|
+
['escaped quote is not a string opener', '\\"; background: red; "', ';'],
|
|
69
|
+
['unbalanced closing paren', 'red) ; body { color: blue', ')'],
|
|
70
|
+
['unbalanced closing bracket', 'red] ; x', ']'],
|
|
71
|
+
['mismatched closer', 'calc(1] ; x)', ']'],
|
|
72
|
+
['unclosed paren', 'calc(100% - 24px', '('],
|
|
73
|
+
['unclosed bracket', '[full-start', '['],
|
|
74
|
+
['unclosed string', '"open', 'string'],
|
|
75
|
+
['unclosed comment', 'red /* comment', 'comment'],
|
|
76
|
+
['unclosed url', 'url(x.png', 'url('],
|
|
77
|
+
['trailing backslash', 'red\\', 'backslash'],
|
|
78
|
+
['newline inside a string (bad string)', '"a\nb"', 'bad string'],
|
|
79
|
+
['whitespace inside an unquoted url (bad url)', 'url(a b)', 'bad url'],
|
|
80
|
+
['uppercase bad url', 'URL(a b)', 'bad url'],
|
|
81
|
+
['quote inside an unquoted url (bad url)', 'url(a"b)', 'bad url'],
|
|
82
|
+
['paren inside an unquoted url (bad url)', 'url(a(b)', 'bad url'],
|
|
83
|
+
[
|
|
84
|
+
'stray backslash inside an unquoted url (bad url)',
|
|
85
|
+
'url(a\\\nb)',
|
|
86
|
+
'bad url',
|
|
87
|
+
],
|
|
88
|
+
['control character inside an unquoted url', 'url(a\u0001b)', 'bad url'],
|
|
89
|
+
])('rejects %s', (_label, value, fragment) => {
|
|
90
|
+
const reason = checkDeclarationValue(value);
|
|
91
|
+
expect(reason).not.toBeNull();
|
|
92
|
+
expect(reason).toContain(fragment);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
describe('checkDeclarationName', () => {
|
|
97
|
+
it.each([
|
|
98
|
+
'color',
|
|
99
|
+
'background-image',
|
|
100
|
+
'-webkit-line-clamp',
|
|
101
|
+
'-moz-osx-font-smoothing',
|
|
102
|
+
'--brand-accent',
|
|
103
|
+
'--_internal',
|
|
104
|
+
'--',
|
|
105
|
+
'--1',
|
|
106
|
+
'_private',
|
|
107
|
+
'caf\u00e9',
|
|
108
|
+
'a\\:b',
|
|
109
|
+
])('keeps %s', name => {
|
|
110
|
+
expect(checkDeclarationName(name)).toBeNull();
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it.each([
|
|
114
|
+
'',
|
|
115
|
+
'1px',
|
|
116
|
+
'-1',
|
|
117
|
+
'color: red',
|
|
118
|
+
'--x:red} body{color:blue',
|
|
119
|
+
'color;',
|
|
120
|
+
'a b',
|
|
121
|
+
'a\\',
|
|
122
|
+
'background{',
|
|
123
|
+
])('rejects %j', name => {
|
|
124
|
+
expect(checkDeclarationName(name)).not.toBeNull();
|
|
125
|
+
});
|
|
126
|
+
});
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Declaration boundary scanner
|
|
5
|
+
*
|
|
6
|
+
* Decides whether a consumer-supplied property name and value can be emitted
|
|
7
|
+
* as exactly one CSS declaration, `name: value;`, without the value ending
|
|
8
|
+
* the declaration early or swallowing what follows it. Theme definitions are
|
|
9
|
+
* code, but apps assemble them from stored input (brand colors,
|
|
10
|
+
* white-labeling), so the generated stylesheet must never extend beyond the
|
|
11
|
+
* declarations it means to emit.
|
|
12
|
+
*
|
|
13
|
+
* The scanner follows the CSS Syntax Module Level 3 tokenizer for everything
|
|
14
|
+
* that decides where a declaration ends: strings with backslash escapes and
|
|
15
|
+
* line continuations, comments, `url()` with an unquoted body, escaped code
|
|
16
|
+
* points outside strings, and `()`, `[]`, `{}` block nesting. Inside any of
|
|
17
|
+
* those a `;` or a brace is inert, exactly as a browser reads it, so a `data:`
|
|
18
|
+
* URI, `Gill\ Sans`, or a closed comment passes through byte-identically.
|
|
19
|
+
* Only what a browser would read as the end of the declaration or rule is
|
|
20
|
+
* rejected: an unnested `;`, `{` or `}`, an unbalanced closer, and anything
|
|
21
|
+
* left open at the end of the value (a string, comment, block, or url whose
|
|
22
|
+
* closer would then be the generator's own `;` or `}`). A `bad-string` or
|
|
23
|
+
* `bad-url` token is rejected as well: the browser would discard the
|
|
24
|
+
* declaration anyway, and a diagnostic beats a silent no-op.
|
|
25
|
+
*
|
|
26
|
+
* @input A property name or a declaration value as authored in a theme
|
|
27
|
+
* @output `null` when it can be emitted, otherwise the reason it cannot
|
|
28
|
+
* @position packages/core/src/theme/declarationBoundary.ts
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
/** Newline per CSS Syntax §4.2 (after preprocessing, CR and FF are newlines). */
|
|
32
|
+
function isNewline(ch: string): boolean {
|
|
33
|
+
return ch === '\n' || ch === '\r' || ch === '\f';
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function isWhitespace(ch: string): boolean {
|
|
37
|
+
return ch === ' ' || ch === '\t' || isNewline(ch);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function isHexDigit(ch: string): boolean {
|
|
41
|
+
return /^[0-9a-fA-F]$/.test(ch);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Name-start code point: letter, underscore, or any non-ASCII code point. */
|
|
45
|
+
function isNameStart(ch: string): boolean {
|
|
46
|
+
return /^[A-Za-z_]$/.test(ch) || ch.charCodeAt(0) >= 0x80;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function isNameChar(ch: string): boolean {
|
|
50
|
+
return isNameStart(ch) || /^[0-9-]$/.test(ch);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** CSS Syntax §3.3 preprocessing, for scanning only; emitted bytes stay intact. */
|
|
54
|
+
function preprocess(input: string): string {
|
|
55
|
+
return input.replace(/\r\n?|\f/g, '\n').replace(/\0/g, '\uFFFD');
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Non-printable code points make an unquoted url() a bad-url token. */
|
|
59
|
+
// eslint-disable-next-line no-control-regex -- these code points are the subject
|
|
60
|
+
const NON_PRINTABLE = /[\x01-\x08\x0b\x0e-\x1f\x7f]/;
|
|
61
|
+
|
|
62
|
+
/** "Check if two code points are a valid escape" (§4.3.8). */
|
|
63
|
+
function isValidEscape(input: string, pos: number): boolean {
|
|
64
|
+
return (
|
|
65
|
+
input[pos] === '\\' && pos + 1 < input.length && !isNewline(input[pos + 1])
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** "Check if three code points would start an ident sequence" (§4.3.9). */
|
|
70
|
+
function startsIdent(input: string, pos: number): boolean {
|
|
71
|
+
const ch = input[pos];
|
|
72
|
+
if (ch === '-') {
|
|
73
|
+
const next = input[pos + 1];
|
|
74
|
+
return (
|
|
75
|
+
next !== undefined &&
|
|
76
|
+
(next === '-' || isNameStart(next) || isValidEscape(input, pos + 1))
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
if (ch === '\\') {
|
|
80
|
+
return isValidEscape(input, pos);
|
|
81
|
+
}
|
|
82
|
+
return ch !== undefined && isNameStart(ch);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* "Consume an escaped code point" (§4.3.7), positioned after the backslash.
|
|
87
|
+
* Returns the position after the escape. A hex escape takes up to six hex
|
|
88
|
+
* digits plus one optional whitespace; anything else takes one code point.
|
|
89
|
+
*/
|
|
90
|
+
function consumeEscape(input: string, pos: number): number {
|
|
91
|
+
if (isHexDigit(input[pos])) {
|
|
92
|
+
let end = pos;
|
|
93
|
+
while (end < input.length && end - pos < 6 && isHexDigit(input[end])) {
|
|
94
|
+
end++;
|
|
95
|
+
}
|
|
96
|
+
if (end < input.length && isWhitespace(input[end])) {
|
|
97
|
+
end++;
|
|
98
|
+
}
|
|
99
|
+
return end;
|
|
100
|
+
}
|
|
101
|
+
// A surrogate pair is one code point.
|
|
102
|
+
const code = input.codePointAt(pos) ?? 0;
|
|
103
|
+
return pos + (code > 0xffff ? 2 : 1);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* "Consume an ident sequence" (§4.3.11) starting at `pos`. Returns the
|
|
108
|
+
* position after it and the decoded name (escapes resolved, for the
|
|
109
|
+
* case-insensitive `url` check; hex escapes decode to their code point).
|
|
110
|
+
*/
|
|
111
|
+
function consumeIdent(input: string, pos: number): {end: number; name: string} {
|
|
112
|
+
let name = '';
|
|
113
|
+
let i = pos;
|
|
114
|
+
while (i < input.length) {
|
|
115
|
+
const ch = input[i];
|
|
116
|
+
if (isNameChar(ch)) {
|
|
117
|
+
name += ch;
|
|
118
|
+
i++;
|
|
119
|
+
} else if (isValidEscape(input, i)) {
|
|
120
|
+
const end = consumeEscape(input, i + 1);
|
|
121
|
+
if (isHexDigit(input[i + 1])) {
|
|
122
|
+
const hex = input.slice(i + 1, end).trim();
|
|
123
|
+
const code = parseInt(hex, 16);
|
|
124
|
+
name +=
|
|
125
|
+
code === 0 || code > 0x10ffff || (code >= 0xd800 && code <= 0xdfff)
|
|
126
|
+
? '\uFFFD'
|
|
127
|
+
: String.fromCodePoint(code);
|
|
128
|
+
} else {
|
|
129
|
+
name += input.slice(i + 1, end);
|
|
130
|
+
}
|
|
131
|
+
i = end;
|
|
132
|
+
} else {
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return {end: i, name};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* "Consume a string token" (§4.3.5), positioned at the opening quote.
|
|
141
|
+
* Returns the position after the closing quote, or a rejection reason.
|
|
142
|
+
*/
|
|
143
|
+
function consumeString(
|
|
144
|
+
input: string,
|
|
145
|
+
pos: number,
|
|
146
|
+
): {end: number} | {reason: string} {
|
|
147
|
+
const quote = input[pos];
|
|
148
|
+
let i = pos + 1;
|
|
149
|
+
while (i < input.length) {
|
|
150
|
+
const ch = input[i];
|
|
151
|
+
if (ch === quote) {
|
|
152
|
+
return {end: i + 1};
|
|
153
|
+
}
|
|
154
|
+
if (isNewline(ch)) {
|
|
155
|
+
// A raw newline ends the string as a bad-string token; the browser
|
|
156
|
+
// discards the declaration, so a diagnostic is more useful than
|
|
157
|
+
// reasoning about where that leaves the next `;`.
|
|
158
|
+
return {reason: 'a newline inside a quoted string makes a bad string'};
|
|
159
|
+
}
|
|
160
|
+
if (ch === '\\') {
|
|
161
|
+
if (i + 1 >= input.length) {
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
// Escaped newline is a line continuation; any other escape consumes
|
|
165
|
+
// the escaped code point (so `\"` never closes the string).
|
|
166
|
+
i = isNewline(input[i + 1]) ? i + 2 : consumeEscape(input, i + 1);
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
i++;
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
reason: `an unclosed ${quote} string would swallow the rest of the rule`,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* "Consume a url token" (§4.3.6), positioned after `url(` and any leading
|
|
178
|
+
* whitespace, with a non-quote next code point. Returns the position after
|
|
179
|
+
* the closing `)`, or a rejection reason (bad-url or unclosed).
|
|
180
|
+
*/
|
|
181
|
+
function consumeUrl(
|
|
182
|
+
input: string,
|
|
183
|
+
pos: number,
|
|
184
|
+
): {end: number} | {reason: string} {
|
|
185
|
+
let i = pos;
|
|
186
|
+
while (i < input.length) {
|
|
187
|
+
const ch = input[i];
|
|
188
|
+
if (ch === ')') {
|
|
189
|
+
return {end: i + 1};
|
|
190
|
+
}
|
|
191
|
+
if (isWhitespace(ch)) {
|
|
192
|
+
while (i < input.length && isWhitespace(input[i])) {
|
|
193
|
+
i++;
|
|
194
|
+
}
|
|
195
|
+
if (i >= input.length) {
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
if (input[i] === ')') {
|
|
199
|
+
return {end: i + 1};
|
|
200
|
+
}
|
|
201
|
+
return {reason: 'whitespace inside an unquoted url() makes a bad url'};
|
|
202
|
+
}
|
|
203
|
+
if (NON_PRINTABLE.test(ch)) {
|
|
204
|
+
return {reason: 'a non-printable character inside url() makes a bad url'};
|
|
205
|
+
}
|
|
206
|
+
if (ch === '"' || ch === "'" || ch === '(') {
|
|
207
|
+
return {
|
|
208
|
+
reason: `"${ch}" inside an unquoted url() makes a bad url; quote the URL instead`,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
if (ch === '\\') {
|
|
212
|
+
if (!isValidEscape(input, i)) {
|
|
213
|
+
return {reason: 'a stray backslash inside url() makes a bad url'};
|
|
214
|
+
}
|
|
215
|
+
i = consumeEscape(input, i + 1);
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
i++;
|
|
219
|
+
}
|
|
220
|
+
return {reason: 'an unclosed url( would swallow the rest of the rule'};
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const CLOSER: Record<string, string> = {'(': ')', '[': ']', '{': '}'};
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Why `value` cannot be emitted as the value of one declaration, or `null`
|
|
227
|
+
* when it can. Valid CSS a browser keeps inside one declaration always
|
|
228
|
+
* returns `null`; see the file header for the exact rules.
|
|
229
|
+
*/
|
|
230
|
+
export function checkDeclarationValue(input: string): string | null {
|
|
231
|
+
const value = preprocess(input);
|
|
232
|
+
const open: string[] = [];
|
|
233
|
+
let i = 0;
|
|
234
|
+
while (i < value.length) {
|
|
235
|
+
const ch = value[i];
|
|
236
|
+
|
|
237
|
+
if (ch === '/' && value[i + 1] === '*') {
|
|
238
|
+
const close = value.indexOf('*/', i + 2);
|
|
239
|
+
if (close === -1) {
|
|
240
|
+
return 'an unclosed /* comment would swallow the rest of the rule';
|
|
241
|
+
}
|
|
242
|
+
i = close + 2;
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if (ch === '"' || ch === "'") {
|
|
247
|
+
const result = consumeString(value, i);
|
|
248
|
+
if ('reason' in result) {
|
|
249
|
+
return result.reason;
|
|
250
|
+
}
|
|
251
|
+
i = result.end;
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
if (startsIdent(value, i)) {
|
|
256
|
+
const ident = consumeIdent(value, i);
|
|
257
|
+
i = ident.end;
|
|
258
|
+
if (value[i] === '(' && ident.name.toLowerCase() === 'url') {
|
|
259
|
+
let j = i + 1;
|
|
260
|
+
while (j < value.length && isWhitespace(value[j])) {
|
|
261
|
+
j++;
|
|
262
|
+
}
|
|
263
|
+
if (value[j] === '"' || value[j] === "'") {
|
|
264
|
+
// `url("...")` is an ordinary function token; the string and the
|
|
265
|
+
// closing paren are handled by the loop.
|
|
266
|
+
open.push(')');
|
|
267
|
+
i = i + 1;
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
const result = consumeUrl(value, j);
|
|
271
|
+
if ('reason' in result) {
|
|
272
|
+
return result.reason;
|
|
273
|
+
}
|
|
274
|
+
i = result.end;
|
|
275
|
+
}
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
if (ch === '\\') {
|
|
280
|
+
if (i + 1 >= value.length) {
|
|
281
|
+
// `\` followed by the generator's own `;` would escape it.
|
|
282
|
+
return 'a trailing backslash would escape the declaration terminator';
|
|
283
|
+
}
|
|
284
|
+
// `\` + newline is not an escape: the backslash is a delim and the
|
|
285
|
+
// newline is whitespace. Anything else escapes the next code point.
|
|
286
|
+
i = isNewline(value[i + 1]) ? i + 1 : consumeEscape(value, i + 1);
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
if (ch === '(' || ch === '[' || ch === '{') {
|
|
291
|
+
if (ch === '{' && open.length === 0) {
|
|
292
|
+
return 'an unquoted "{" would open a nested block';
|
|
293
|
+
}
|
|
294
|
+
open.push(CLOSER[ch]);
|
|
295
|
+
i++;
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
if (ch === ')' || ch === ']' || ch === '}') {
|
|
300
|
+
if (open.length === 0) {
|
|
301
|
+
return ch === '}'
|
|
302
|
+
? 'an unquoted "}" would close the rule'
|
|
303
|
+
: `an unbalanced "${ch}" has nothing to close`;
|
|
304
|
+
}
|
|
305
|
+
const expected = open.pop();
|
|
306
|
+
if (expected !== ch) {
|
|
307
|
+
return `"${ch}" does not close the open "${expected === ')' ? '(' : expected === ']' ? '[' : '{'}"`;
|
|
308
|
+
}
|
|
309
|
+
i++;
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if (ch === ';' && open.length === 0) {
|
|
314
|
+
return 'an unquoted ";" would end the declaration';
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
i++;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
if (open.length > 0) {
|
|
321
|
+
const closer = open[open.length - 1];
|
|
322
|
+
const opener = closer === ')' ? '(' : closer === ']' ? '[' : '{';
|
|
323
|
+
return `an unclosed "${opener}" would swallow the rest of the rule`;
|
|
324
|
+
}
|
|
325
|
+
return null;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Why `name` cannot be emitted as a declaration's property name, or `null`
|
|
330
|
+
* when it can. A property name is one CSS ident sequence: a standard
|
|
331
|
+
* property (`color`), a vendor-prefixed one (`-webkit-line-clamp`), or a
|
|
332
|
+
* custom property (`--brand-accent`, `--_internal`). Escapes are allowed
|
|
333
|
+
* because an ident allows them. Whether the name means anything to the
|
|
334
|
+
* browser is not this check's concern; only that it cannot end the
|
|
335
|
+
* declaration or leak a second one.
|
|
336
|
+
*/
|
|
337
|
+
export function checkDeclarationName(input: string): string | null {
|
|
338
|
+
const name = preprocess(input);
|
|
339
|
+
if (name.length === 0 || !startsIdent(name, 0)) {
|
|
340
|
+
return 'a property name must be a CSS identifier';
|
|
341
|
+
}
|
|
342
|
+
const {end} = consumeIdent(name, 0);
|
|
343
|
+
if (end !== name.length) {
|
|
344
|
+
return `a property name must be one CSS identifier; "${name[end]}" cannot appear in one`;
|
|
345
|
+
}
|
|
346
|
+
return null;
|
|
347
|
+
}
|
|
@@ -223,6 +223,7 @@ const DIR_TO_REGISTRY_KEY: Record<string, string> = {
|
|
|
223
223
|
DropdownMenu: 'dropdown-menu',
|
|
224
224
|
Field: 'field',
|
|
225
225
|
HoverCard: 'hover-card',
|
|
226
|
+
Item: 'item',
|
|
226
227
|
NumberInput: 'number-input',
|
|
227
228
|
Popover: 'popover',
|
|
228
229
|
ProgressBar: 'progress-bar-mark',
|
|
@@ -321,6 +322,12 @@ const VARS_WITHOUT_DERIVED_MAPPING = new Set([
|
|
|
321
322
|
'--spinner-color',
|
|
322
323
|
'--spinner-track-color',
|
|
323
324
|
'--spinner-arc-fraction',
|
|
325
|
+
// Set by a PARENT component (e.g. the destructive dropdown/context menu
|
|
326
|
+
// item) to recolor the two text lines it renders. A single standard `color`
|
|
327
|
+
// property cannot map onto both lines, and the root color is not what they
|
|
328
|
+
// control — a theme reaches them by setting the vars directly.
|
|
329
|
+
'--_item-label-color',
|
|
330
|
+
'--_item-description-color',
|
|
324
331
|
]);
|
|
325
332
|
|
|
326
333
|
// ---------------------------------------------------------------------------
|
|
@@ -68,6 +68,7 @@ export const derivedVarRegistry: Record<string, DerivedVarEntry[]> = {
|
|
|
68
68
|
],
|
|
69
69
|
field: [{property: 'borderRadius', vars: ['--_field-radius']}],
|
|
70
70
|
'hover-card': [{property: 'borderRadius', vars: ['--_hovercard-radius']}],
|
|
71
|
+
item: [{property: 'paddingInline', vars: ['--_item-inset-inline']}],
|
|
71
72
|
'number-input': [
|
|
72
73
|
{property: 'padding', expand: 'container'},
|
|
73
74
|
{property: 'borderRadius', vars: ['--_field-radius']},
|