@astryxdesign/core 0.6.2 → 0.6.3-canary.039a67e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +81 -0
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +33 -12
- package/dist/BottomSheet/BottomSheet.d.ts +1 -1
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +3 -1
- package/dist/BottomSheet/BottomSheetPanel.d.ts +7 -5
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +56 -19
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +13 -28
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +10 -5
- package/dist/Chat/ChatComposerDrawer.d.ts +19 -5
- package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
- package/dist/Chat/ChatComposerDrawer.js +48 -23
- package/dist/Chat/ChatComposerInput.d.ts +11 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +63 -16
- package/dist/Chat/ChatDictationButton.d.ts +3 -2
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +6 -4
- package/dist/Chat/ChatLayout.d.ts +19 -0
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +19 -0
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +44 -34
- package/dist/Chat/ChatMessageBubble.d.ts +2 -0
- package/dist/Chat/ChatMessageBubble.d.ts.map +1 -1
- package/dist/Chat/ChatMessageBubble.js +5 -3
- package/dist/Chat/ChatMessageList.d.ts +2 -1
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +4 -3
- package/dist/Chat/ChatMessageMetadata.d.ts +5 -4
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatMessageMetadata.js +12 -9
- package/dist/Chat/ChatSendButton.d.ts +2 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +6 -4
- package/dist/Chat/ChatSystemMessage.d.ts +3 -3
- package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
- package/dist/Chat/ChatSystemMessage.js +2 -2
- package/dist/Chat/ChatTokenizedText.d.ts +6 -6
- package/dist/Chat/ChatTokenizedText.js +10 -6
- package/dist/Chat/ChatToolCalls.d.ts +7 -9
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +43 -26
- package/dist/Chat/index.d.ts +1 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +12 -2
- package/dist/Citation/Citation.d.ts +1 -1
- package/dist/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +3 -2
- package/dist/CodeBlock/highlightRanges.d.ts.map +1 -1
- package/dist/CodeBlock/highlightRanges.js +14 -3
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +6 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +1 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +1 -1
- package/dist/DateInput/DateInput.d.ts +25 -5
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +29 -17
- package/dist/DateInput/NativeDateField.d.ts.map +1 -1
- package/dist/DateInput/NativeDateField.js +16 -16
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +2 -2
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +4 -4
- package/dist/DateTimeInput/DateTimeInput.d.ts +32 -15
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +55 -30
- package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
- package/dist/DateTimeInput/TouchDateTimeField.js +4 -4
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts +9 -3
- package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts.map +1 -1
- package/dist/DateTimeInput/nativePickerSegmentStyles.js +3 -3
- package/dist/Dialog/DialogHeader.d.ts +8 -1
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +13 -4
- package/dist/Field/InputClearButton.d.ts +4 -2
- package/dist/Field/InputClearButton.d.ts.map +1 -1
- package/dist/Field/InputClearButton.js +4 -2
- package/dist/Field/PanelSearchInput.d.ts.map +1 -1
- package/dist/Field/PanelSearchInput.js +1 -1
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +7 -7
- package/dist/Icon/Icon.d.ts +6 -31
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +8 -71
- package/dist/Icon/IconDefaultSizeContext.d.ts +4 -0
- package/dist/Icon/IconDefaultSizeContext.d.ts.map +1 -0
- package/dist/Icon/IconDefaultSizeContext.js +18 -0
- package/dist/Icon/IconSize.stylex.d.ts +65 -0
- package/dist/Icon/IconSize.stylex.d.ts.map +1 -0
- package/dist/Icon/IconSize.stylex.js +75 -0
- package/dist/Item/Item.d.ts +1 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +4 -3
- package/dist/Kbd/Kbd.d.ts +5 -3
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +36 -42
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +6 -2
- package/dist/Link/useLinkComponent.d.ts +5 -15
- package/dist/Link/useLinkComponent.d.ts.map +1 -1
- package/dist/Link/useLinkComponent.js +34 -51
- package/dist/List/List.d.ts +19 -1
- package/dist/List/List.d.ts.map +1 -1
- package/dist/List/List.js +9 -2
- package/dist/List/ListContext.d.ts +1 -0
- package/dist/List/ListContext.d.ts.map +1 -1
- package/dist/List/ListContext.js +2 -1
- package/dist/List/ListItem.d.ts +1 -1
- package/dist/List/ListItem.d.ts.map +1 -1
- package/dist/List/ListItem.js +9 -2
- package/dist/Markdown/Markdown.d.ts +8 -2
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.fr23.bench.d.ts +2 -0
- package/dist/Markdown/Markdown.fr23.bench.d.ts.map +1 -0
- package/dist/Markdown/Markdown.fr23.bench.js +150 -0
- package/dist/Markdown/Markdown.fr23.sampling.d.ts +2 -0
- package/dist/Markdown/Markdown.fr23.sampling.d.ts.map +1 -0
- package/dist/Markdown/Markdown.fr23.sampling.js +43 -0
- package/dist/Markdown/Markdown.js +262 -109
- package/dist/Markdown/ast.d.ts +162 -0
- package/dist/Markdown/ast.d.ts.map +1 -0
- package/dist/Markdown/ast.js +74 -0
- package/dist/Markdown/index.d.ts +5 -3
- package/dist/Markdown/index.d.ts.map +1 -1
- package/dist/Markdown/index.js +3 -2
- package/dist/Markdown/parser/index.d.ts +10 -0
- package/dist/Markdown/parser/index.d.ts.map +1 -0
- package/dist/Markdown/parser/index.js +10 -0
- package/dist/Markdown/parser.d.ts +126 -58
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +726 -177
- package/dist/Markdown/plugins/frontmatter.d.ts +32 -0
- package/dist/Markdown/plugins/frontmatter.d.ts.map +1 -0
- package/dist/Markdown/plugins/frontmatter.js +132 -0
- package/dist/Markdown/plugins/index.d.ts +17 -0
- package/dist/Markdown/plugins/index.d.ts.map +1 -0
- package/dist/Markdown/plugins/index.js +14 -0
- package/dist/Markdown/plugins/protocol.d.ts +191 -0
- package/dist/Markdown/plugins/protocol.d.ts.map +1 -0
- package/dist/Markdown/plugins/protocol.js +957 -0
- package/dist/Markdown/plugins/semanticFence.d.ts +36 -0
- package/dist/Markdown/plugins/semanticFence.d.ts.map +1 -0
- package/dist/Markdown/plugins/semanticFence.js +213 -0
- package/dist/Markdown/plugins/softBreaks.d.ts +3 -0
- package/dist/Markdown/plugins/softBreaks.d.ts.map +1 -0
- package/dist/Markdown/plugins/softBreaks.js +172 -0
- package/dist/Markdown/plugins/sourceDecoration.d.ts +76 -0
- package/dist/Markdown/plugins/sourceDecoration.d.ts.map +1 -0
- package/dist/Markdown/plugins/sourceDecoration.js +393 -0
- package/dist/Markdown/plugins/textTransform.d.ts +30 -0
- package/dist/Markdown/plugins/textTransform.d.ts.map +1 -0
- package/dist/Markdown/plugins/textTransform.js +374 -0
- package/dist/Markdown/remark.d.ts +196 -0
- package/dist/Markdown/remark.d.ts.map +1 -0
- package/dist/Markdown/remark.js +1062 -0
- package/dist/Markdown/url.d.ts +6 -0
- package/dist/Markdown/url.d.ts.map +1 -0
- package/dist/Markdown/url.js +31 -0
- package/dist/Markdown/utils.d.ts +4 -2
- package/dist/Markdown/utils.d.ts.map +1 -1
- package/dist/Markdown/utils.js +2 -1
- package/dist/MetadataList/MetadataList.js +3 -3
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +4 -4
- package/dist/Outline/index.d.ts +1 -0
- package/dist/Outline/index.d.ts.map +1 -1
- package/dist/Outline/parseOutlineFromMarkdown.d.ts +7 -1
- package/dist/Outline/parseOutlineFromMarkdown.d.ts.map +1 -1
- package/dist/Outline/parseOutlineFromMarkdown.js +14 -8
- package/dist/Outline/useOutlineFromMarkdown.d.ts +3 -1
- package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
- package/dist/Outline/useOutlineFromMarkdown.js +8 -3
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +46 -30
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +5 -0
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +36 -31
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +13 -1
- package/dist/ScrollableArea/ScrollableArea.d.ts +1 -0
- package/dist/ScrollableArea/ScrollableArea.d.ts.map +1 -1
- package/dist/ScrollableArea/ScrollableArea.js +1 -0
- package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +1 -0
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +5 -5
- package/dist/Selector/Selector.d.ts +9 -7
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +16 -7
- package/dist/SideNav/SideNav.d.ts +2 -1
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +9 -3
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +28 -12
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +23 -7
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +11 -0
- package/dist/TabList/Tab.d.ts +1 -1
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +20 -7
- package/dist/Table/Table.d.ts +1 -0
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +29 -13
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +1 -1
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +2 -2
- package/dist/TimeInput/TimeInput.d.ts +30 -14
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +61 -13
- package/dist/TimeInput/TouchTimeField.d.ts +11 -0
- package/dist/TimeInput/TouchTimeField.d.ts.map +1 -0
- package/dist/TimeInput/TouchTimeField.js +417 -0
- package/dist/TimeInput/index.d.ts +1 -1
- package/dist/TimeInput/index.d.ts.map +1 -1
- package/dist/Timer/Timer.d.ts +49 -0
- package/dist/Timer/Timer.d.ts.map +1 -0
- package/dist/Timer/Timer.js +158 -0
- package/dist/Timer/index.d.ts +9 -0
- package/dist/Timer/index.d.ts.map +1 -0
- package/dist/Timer/index.js +10 -0
- package/dist/ToggleButton/ToggleButton.d.ts +9 -6
- package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButton.js +15 -27
- package/dist/TopNav/TopNavMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +3 -2
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +3 -0
- package/dist/TreeList/TreeListItem.d.ts +6 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +12 -2
- package/dist/TreeList/TreeListTypes.d.ts +8 -1
- package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +16 -7
- package/dist/astryx.css +27 -11
- package/dist/hooks/scrollKeyboardDelegation.d.ts +3 -0
- package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -0
- package/dist/hooks/scrollKeyboardDelegation.js +146 -0
- package/dist/hooks/useClickableContainer.d.ts +10 -1
- package/dist/hooks/useClickableContainer.d.ts.map +1 -1
- package/dist/hooks/useClickableContainer.js +15 -4
- package/dist/hooks/useScrollableArea.d.ts +6 -2
- package/dist/hooks/useScrollableArea.d.ts.map +1 -1
- package/dist/hooks/useScrollableArea.js +17 -5
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/theme/declarationBoundary.d.ts +17 -0
- package/dist/theme/declarationBoundary.d.ts.map +1 -0
- package/dist/theme/declarationBoundary.js +343 -0
- package/dist/theme/defineTheme.d.ts +3 -0
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/defineTheme.js +4 -1
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +4 -0
- package/dist/theme/generateThemeRules.d.ts +15 -7
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +143 -35
- package/dist/theme/themeAdaptations.d.ts +5 -3
- package/dist/theme/themeAdaptations.d.ts.map +1 -1
- package/dist/theme/themeAdaptations.js +33 -5
- package/dist/utils/inputPresentation.d.ts +55 -0
- package/dist/utils/inputPresentation.d.ts.map +1 -0
- package/dist/utils/inputPresentation.js +108 -0
- package/dist/utils/interactionOverlay.stylex.d.ts +8 -0
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +9 -0
- package/dist/utils/safeUrl.d.ts +11 -0
- package/dist/utils/safeUrl.d.ts.map +1 -0
- package/dist/utils/safeUrl.js +78 -0
- package/locales/af-ZA.json +530 -1
- package/locales/ar-SA.json +490 -1
- package/locales/ca-ES.json +514 -1
- package/locales/cs-CZ.json +498 -1
- package/locales/da-DK.json +522 -1
- package/locales/de-DE.json +522 -1
- package/locales/el-GR.json +498 -1
- package/locales/es-ES.json +510 -1
- package/locales/fi-FI.json +498 -1
- package/locales/fr-FR.json +534 -1
- package/locales/he-IL.json +498 -1
- package/locales/hu-HU.json +498 -1
- package/locales/it-IT.json +510 -1
- package/locales/ja-JP.json +490 -1
- package/locales/ko-KR.json +498 -1
- package/locales/nl-NL.json +534 -1
- package/locales/no-NO.json +510 -1
- package/locales/pl-PL.json +506 -1
- package/locales/pt-BR.json +506 -1
- package/locales/pt-PT.json +506 -1
- package/locales/ro-RO.json +506 -1
- package/locales/ru-RU.json +498 -1
- package/locales/sr-SP.json +498 -1
- package/locales/sv-SE.json +502 -1
- package/locales/tr-TR.json +498 -1
- package/locales/uk-UA.json +498 -1
- package/locales/vi-VN.json +502 -1
- package/locales/zh-CN.json +490 -1
- package/locales/zh-TW.json +490 -1
- package/package.json +24 -4
- package/src/Avatar/Avatar.doc.mjs +1 -1
- package/src/Avatar/Avatar.test.tsx +30 -0
- package/src/Avatar/Avatar.tsx +38 -14
- package/src/BottomSheet/BottomSheet.doc.mjs +8 -1
- package/src/BottomSheet/BottomSheet.spec.md +46 -20
- package/src/BottomSheet/BottomSheet.test.tsx +6 -3
- package/src/BottomSheet/BottomSheet.tsx +3 -1
- package/src/BottomSheet/BottomSheetKeyboard.test.tsx +195 -0
- package/src/BottomSheet/BottomSheetPanel.test.tsx +11 -1
- package/src/BottomSheet/BottomSheetPanel.tsx +49 -16
- package/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts +344 -0
- package/src/Button/Button.doc.mjs +5 -5
- package/src/Button/Button.tsx +15 -13
- package/src/Button/__tests__/Button.a11y.chromium.spec.ts +17 -1
- package/src/Button/__tests__/Button.a11y.known-failures.ts +0 -29
- package/src/Button/__tests__/Button.a11y.renders.tsx +9 -2
- package/src/Button/__tests__/Button.a11y.states.ts +9 -0
- package/src/Chat/ChatComposer.doc.mjs +14 -0
- package/src/Chat/ChatComposer.spec.md +230 -0
- package/src/Chat/ChatComposer.test.tsx +57 -0
- package/src/Chat/ChatComposer.tsx +21 -9
- package/src/Chat/ChatComposerDrawer.doc.mjs +63 -5
- package/src/Chat/ChatComposerDrawer.spec.md +267 -0
- package/src/Chat/ChatComposerDrawer.test.tsx +81 -12
- package/src/Chat/ChatComposerDrawer.tsx +38 -9
- package/src/Chat/ChatComposerInput.doc.mjs +114 -26
- package/src/Chat/ChatComposerInput.spec.md +185 -0
- package/src/Chat/ChatComposerInput.test.tsx +113 -3
- package/src/Chat/ChatComposerInput.tsx +78 -13
- package/src/Chat/ChatComposerTokenElement.spec.md +152 -0
- package/src/Chat/ChatComposerTokenElement.test.tsx +85 -0
- package/src/Chat/ChatDictationButton.doc.mjs +3 -3
- package/src/Chat/ChatDictationButton.spec.md +160 -0
- package/src/Chat/ChatDictationButton.test.tsx +92 -27
- package/src/Chat/ChatDictationButton.tsx +8 -6
- package/src/Chat/ChatLayout.doc.mjs +12 -4
- package/src/Chat/ChatLayout.spec.md +271 -0
- package/src/Chat/ChatLayout.test.tsx +28 -0
- package/src/Chat/ChatLayout.tsx +19 -0
- package/src/Chat/ChatLayoutScrollButton.spec.md +338 -0
- package/src/Chat/ChatLayoutScrollButton.test.tsx +31 -0
- package/src/Chat/ChatLayoutScrollButton.tsx +31 -14
- package/src/Chat/ChatMessageBubble.doc.mjs +28 -15
- package/src/Chat/ChatMessageBubble.spec.md +263 -0
- package/src/Chat/ChatMessageBubble.test.tsx +93 -0
- package/src/Chat/ChatMessageBubble.tsx +8 -3
- package/src/Chat/ChatMessageList.spec.md +222 -0
- package/src/Chat/ChatMessageList.test.tsx +64 -2
- package/src/Chat/ChatMessageList.tsx +4 -3
- package/src/Chat/ChatMessageMetadata.doc.mjs +57 -3
- package/src/Chat/ChatMessageMetadata.spec.md +220 -0
- package/src/Chat/ChatMessageMetadata.test.tsx +34 -0
- package/src/Chat/ChatMessageMetadata.tsx +13 -13
- package/src/Chat/ChatSendButton.doc.mjs +32 -0
- package/src/Chat/ChatSendButton.spec.md +227 -0
- package/src/Chat/ChatSendButton.test.tsx +128 -8
- package/src/Chat/ChatSendButton.tsx +6 -4
- package/src/Chat/ChatSystemMessage.doc.mjs +115 -12
- package/src/Chat/ChatSystemMessage.spec.md +225 -0
- package/src/Chat/ChatSystemMessage.test.tsx +112 -20
- package/src/Chat/ChatSystemMessage.tsx +4 -6
- package/src/Chat/ChatTokenizedText.doc.mjs +96 -9
- package/src/Chat/ChatTokenizedText.spec.md +190 -0
- package/src/Chat/ChatTokenizedText.test.tsx +60 -1
- package/src/Chat/ChatTokenizedText.tsx +14 -8
- package/src/Chat/ChatToolCalls.doc.mjs +4 -1
- package/src/Chat/ChatToolCalls.spec.md +194 -0
- package/src/Chat/ChatToolCalls.test.tsx +83 -0
- package/src/Chat/ChatToolCalls.tsx +46 -21
- package/src/Chat/__tests__/ChatLayoutScrollButton.a11y.chromium.spec.ts +514 -0
- package/src/Chat/__tests__/ChatLayoutScrollButtonSurface.a11y.chromium.spec.ts +740 -0
- package/src/Chat/__tests__/ChatMessageBubble.a11y.chromium.spec.ts +457 -0
- package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.test.ts +91 -0
- package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.ts +91 -0
- package/src/Chat/__tests__/ChatMessageList.a11y.chromium.spec.ts +456 -0
- package/src/Chat/__tests__/ChatMessageMetadata.a11y.chromium.spec.ts +413 -0
- package/src/Chat/__tests__/ChatSendButton.a11y.chromium.spec.ts +1522 -0
- package/src/Chat/__tests__/ChatSystemMessage.a11y.chromium.spec.ts +1004 -0
- package/src/Chat/__tests__/ChatTokenizedText.a11y.chromium.spec.ts +573 -0
- package/src/Chat/index.ts +1 -0
- package/src/CheckboxInput/CheckboxInput.doc.mjs +11 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +34 -0
- package/src/CheckboxInput/CheckboxInput.tsx +21 -1
- package/src/Citation/Citation.doc.mjs +2 -2
- package/src/Citation/Citation.test.tsx +17 -0
- package/src/Citation/Citation.tsx +4 -2
- package/src/ClickableCard/ClickableCard.doc.mjs +2 -2
- package/src/ClickableCard/ClickableCard.test.tsx +102 -5
- package/src/CodeBlock/highlightRanges.test.ts +143 -1
- package/src/CodeBlock/highlightRanges.ts +15 -5
- package/src/Collapsible/Collapsible.doc.mjs +11 -0
- package/src/Collapsible/Collapsible.test.tsx +21 -0
- package/src/Collapsible/Collapsible.tsx +5 -0
- package/src/CommandPalette/CommandPaletteInput.tsx +6 -1
- package/src/ComplexSelector/ComplexSelector.tsx +6 -1
- package/src/DateInput/DateInput.doc.mjs +38 -9
- package/src/DateInput/DateInput.tsx +59 -17
- package/src/DateInput/NativeDateField.tsx +24 -8
- package/src/DateInput/Presentation.test.tsx +121 -0
- package/src/DateInput/TouchDateField.tsx +6 -2
- package/src/DateInput/index.ts +1 -0
- package/src/DateRangeInput/DateRangeInput.tsx +6 -1
- package/src/DateTimeInput/DateTimeInput.doc.mjs +28 -12
- package/src/DateTimeInput/DateTimeInput.tsx +93 -37
- package/src/DateTimeInput/Presentation.test.tsx +89 -0
- package/src/DateTimeInput/TouchDateTimeField.tsx +6 -1
- package/src/DateTimeInput/index.ts +1 -0
- package/src/DateTimeInput/nativePickerSegmentStyles.ts +24 -8
- package/src/Dialog/Dialog.doc.mjs +2 -0
- package/src/Dialog/DialogHeader.doc.mjs +22 -0
- package/src/Dialog/DialogHeader.test.tsx +167 -3
- package/src/Dialog/DialogHeader.tsx +37 -6
- package/src/Dialog/modules/DialogHeader.spec.md +101 -42
- package/src/DropdownMenu/DropdownMenu.test.tsx +5 -2
- package/src/Field/InputClearButton.test.tsx +17 -3
- package/src/Field/InputClearButton.tsx +5 -2
- package/src/Field/PanelSearchInput.tsx +5 -2
- package/src/FieldStatus/__tests__/StatusMessage.a11y.states.ts +1 -1
- package/src/FileInput/FileInput.tsx +11 -2
- package/src/Icon/Icon.doc.mjs +7 -5
- package/src/Icon/Icon.spec.md +81 -40
- package/src/Icon/Icon.test.tsx +6 -3
- package/src/Icon/Icon.tsx +20 -68
- package/src/Icon/IconDefaultSizeContext.ts +23 -0
- package/src/Icon/IconSize.stylex.ts +70 -0
- package/src/IconButton/IconButton.doc.mjs +3 -3
- package/src/IconButton/IconButton.test.tsx +40 -0
- package/src/Item/Item.doc.mjs +6 -2
- package/src/Item/Item.tsx +9 -3
- package/src/Kbd/Kbd.doc.mjs +3 -3
- package/src/Kbd/Kbd.test.tsx +57 -1
- package/src/Kbd/Kbd.tsx +57 -37
- package/src/Layout/LayoutFooter.doc.mjs +17 -0
- package/src/Link/Link.doc.mjs +17 -4
- package/src/Link/Link.test.tsx +24 -0
- package/src/Link/Link.tsx +5 -0
- package/src/Link/LinkProvider.doc.mjs +2 -2
- package/src/Link/__tests__/Link.navigation.a11y.chromium.spec.ts +261 -0
- package/src/Link/useLinkComponent.test.tsx +333 -0
- package/src/Link/useLinkComponent.ts +29 -57
- package/src/List/List.doc.mjs +6 -0
- package/src/List/List.spec.md +200 -0
- package/src/List/List.test.tsx +117 -1
- package/src/List/List.tsx +22 -2
- package/src/List/ListContext.tsx +3 -1
- package/src/List/ListItem.doc.mjs +2 -2
- package/src/List/ListItem.source-build.test.mjs +41 -0
- package/src/List/ListItem.tsx +26 -2
- package/src/Markdown/Markdown.doc.mjs +300 -2
- package/src/Markdown/Markdown.fr23.bench.ts +174 -0
- package/src/Markdown/Markdown.fr23.perf.test.ts +249 -0
- package/src/Markdown/Markdown.fr23.sampling.ts +49 -0
- package/src/Markdown/Markdown.helpers.perf.test.ts +489 -0
- package/src/Markdown/Markdown.public.test.ts +130 -3
- package/src/Markdown/Markdown.renderBoundary.test.tsx +72 -0
- package/src/Markdown/Markdown.spec.md +210 -45
- package/src/Markdown/Markdown.test.tsx +87 -3
- package/src/Markdown/Markdown.tsx +414 -135
- package/src/Markdown/ast.test.ts +307 -0
- package/src/Markdown/ast.ts +337 -0
- package/src/Markdown/incremental.test.ts +43 -0
- package/src/Markdown/index.ts +37 -1
- package/src/Markdown/modules/remark.spec.md +269 -0
- package/src/Markdown/modules/softBreaks.spec.md +137 -0
- package/src/Markdown/parser/index.ts +64 -0
- package/src/Markdown/parser.public.test.ts +103 -0
- package/src/Markdown/parser.test.ts +38 -6
- package/src/Markdown/parser.ts +1221 -242
- package/src/Markdown/plugins/frontmatter.test.tsx +125 -0
- package/src/Markdown/plugins/frontmatter.ts +198 -0
- package/src/Markdown/plugins/index.ts +54 -0
- package/src/Markdown/plugins/protocol.test.tsx +1022 -0
- package/src/Markdown/plugins/protocol.ts +1618 -0
- package/src/Markdown/plugins/semanticFence.test.tsx +546 -0
- package/src/Markdown/plugins/semanticFence.ts +424 -0
- package/src/Markdown/plugins/softBreaks.test.tsx +172 -0
- package/src/Markdown/plugins/softBreaks.ts +169 -0
- package/src/Markdown/plugins/sourceDecoration.test.tsx +799 -0
- package/src/Markdown/plugins/sourceDecoration.ts +539 -0
- package/src/Markdown/plugins/textTransform.test.ts +467 -0
- package/src/Markdown/plugins/textTransform.ts +554 -0
- package/src/Markdown/remark.test.tsx +1877 -0
- package/src/Markdown/remark.ts +1574 -0
- package/src/Markdown/url.ts +36 -0
- package/src/Markdown/utils.ts +13 -1
- package/src/MetadataList/MetadataList.test.tsx +4 -2
- package/src/MetadataList/MetadataList.tsx +3 -3
- package/src/MultiSelector/MultiSelector.test.tsx +1 -35
- package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +128 -0
- package/src/NumberInput/NumberInput.tsx +6 -1
- package/src/Outline/Outline.doc.mjs +7 -5
- package/src/Outline/Outline.spec.md +1 -1
- package/src/Outline/index.ts +1 -0
- package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +142 -0
- package/src/Outline/parseOutlineFromMarkdown.ts +40 -10
- package/src/Outline/useOutlineFromMarkdown.ts +15 -3
- package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +150 -1
- package/src/PowerSearch/PowerSearchEditPopover.tsx +51 -28
- package/src/PowerSearch/PowerSearchValueEditor.test.tsx +51 -0
- package/src/PowerSearch/PowerSearchValueEditor.tsx +4 -0
- package/src/ProgressBar/ProgressBar.test.tsx +29 -11
- package/src/ProgressBar/ProgressBar.tsx +59 -72
- package/src/RadioList/RadioList.doc.mjs +11 -0
- package/src/RadioList/RadioList.test.tsx +32 -0
- package/src/RadioList/RadioListItem.tsx +25 -1
- package/src/ScrollableArea/ScrollableArea.tsx +1 -0
- package/src/ScrollableArea/modules/useScrollableArea.spec.md +50 -22
- package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
- package/src/SegmentedControl/SegmentedControl.test.tsx +61 -0
- package/src/SegmentedControl/SegmentedControl.tsx +2 -1
- package/src/SegmentedControl/SegmentedControlItem.tsx +6 -9
- package/src/Selector/Selector.doc.mjs +3 -3
- package/src/Selector/Selector.spec.md +51 -49
- package/src/Selector/Selector.test.tsx +61 -55
- package/src/Selector/Selector.tsx +34 -15
- package/src/Selector/__tests__/Listbox.a11y.chromium.spec.ts +130 -0
- package/src/Selector/__tests__/Listbox.a11y.dom.ts +38 -0
- package/src/Selector/__tests__/Listbox.a11y.inventory.test.ts +63 -0
- package/src/Selector/__tests__/Listbox.a11y.known-failures.ts +37 -0
- package/src/Selector/__tests__/Listbox.a11y.states.ts +232 -0
- package/src/Selector/__tests__/Selector.a11y.chromium.spec.ts +45 -0
- package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +121 -0
- package/src/SideNav/SideNav.doc.mjs +1 -1
- package/src/SideNav/SideNav.test.tsx +10 -0
- package/src/SideNav/SideNav.tsx +14 -2
- package/src/Slider/Slider.doc.mjs +17 -3
- package/src/Slider/Slider.test.tsx +221 -0
- package/src/Slider/Slider.tsx +40 -9
- package/src/Spinner/Spinner.test.tsx +4 -0
- package/src/Spinner/Spinner.tsx +31 -18
- package/src/Switch/Switch.doc.mjs +11 -0
- package/src/Switch/Switch.test.tsx +16 -0
- package/src/Switch/Switch.tsx +28 -0
- package/src/TabList/Tab.tsx +35 -7
- package/src/TabList/TabList.doc.mjs +11 -0
- package/src/TabList/TabList.spec.md +204 -0
- package/src/TabList/TabList.test.tsx +66 -0
- package/src/TabList/__tests__/Tabs.a11y.known-failures.ts +1 -34
- package/src/Table/Table.doc.mjs +1 -1
- package/src/Table/Table.spec.md +54 -40
- package/src/Table/Table.test.tsx +83 -10
- package/src/Table/Table.tsx +30 -22
- package/src/Table/__tests__/TableScroll.a11y.chromium.spec.ts +137 -0
- package/src/TextArea/TextArea.tsx +6 -1
- package/src/TextInput/TextInput.test.tsx +20 -1
- package/src/TextInput/TextInput.tsx +6 -1
- package/src/TimeInput/NativeTimeInput.test.tsx +36 -3
- package/src/TimeInput/Presentation.test.tsx +148 -0
- package/src/TimeInput/TimeInput.doc.mjs +21 -5
- package/src/TimeInput/TimeInput.tsx +102 -11
- package/src/TimeInput/TouchTimeField.tsx +572 -0
- package/src/TimeInput/index.ts +1 -0
- package/src/Timer/Timer.doc.mjs +183 -0
- package/src/Timer/Timer.spec.md +215 -0
- package/src/Timer/Timer.test.tsx +302 -0
- package/src/Timer/Timer.tsx +258 -0
- package/src/Timer/index.ts +11 -0
- package/src/ToggleButton/ToggleButton.doc.mjs +3 -3
- package/src/ToggleButton/ToggleButton.test.tsx +299 -4
- package/src/ToggleButton/ToggleButton.tsx +26 -33
- package/src/ToggleButton/ToggleButtonGroup.doc.mjs +3 -3
- package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +209 -0
- package/src/Token/Token.doc.mjs +2 -2
- package/src/Tokenizer/Tokenizer.spec.md +142 -75
- package/src/TopNav/TopNavMenu.doc.mjs +2 -2
- package/src/TopNav/TopNavMenu.test.tsx +30 -0
- package/src/TopNav/TopNavMenu.tsx +7 -2
- package/src/TreeList/TreeList.doc.mjs +3 -3
- package/src/TreeList/TreeList.spec.md +123 -75
- package/src/TreeList/TreeList.test.tsx +29 -0
- package/src/TreeList/TreeList.tsx +3 -0
- package/src/TreeList/TreeListItem.tsx +15 -1
- package/src/TreeList/TreeListTypes.ts +11 -1
- package/src/Typeahead/BaseTypeahead.spec.md +4 -3
- package/src/Typeahead/BaseTypeahead.tsx +21 -7
- package/src/Typeahead/Typeahead.test.tsx +53 -0
- package/src/__tests__/PressedState.a11y.chromium.spec.ts +813 -0
- package/src/__tests__/pressState.ts +93 -0
- package/src/hooks/scrollKeyboardDelegation.test.ts +155 -0
- package/src/hooks/scrollKeyboardDelegation.ts +233 -0
- package/src/hooks/useClickableContainer.test.tsx +236 -0
- package/src/hooks/useClickableContainer.ts +20 -4
- package/src/hooks/useScrollableArea.doc.mjs +15 -3
- package/src/hooks/useScrollableArea.test.tsx +59 -1
- package/src/hooks/useScrollableArea.ts +34 -10
- package/src/index.ts +3 -0
- package/src/inputFontFloor.test.ts +106 -0
- package/src/tailwind-theme.css +0 -6
- package/src/theme/Theme.test.tsx +32 -0
- package/src/theme/declarationBoundary.test.ts +126 -0
- package/src/theme/declarationBoundary.ts +347 -0
- package/src/theme/defineTheme.ts +4 -0
- package/src/theme/derivedVarRegistry.test.ts +7 -0
- package/src/theme/derivedVarRegistry.ts +1 -0
- package/src/theme/generateThemeRules.test.ts +526 -1
- package/src/theme/generateThemeRules.ts +231 -50
- package/src/theme/themeAdaptations.test.ts +211 -1
- package/src/theme/themeAdaptations.ts +50 -4
- package/src/theme/tokenValueCompat.test.ts +4 -1
- package/src/utils/inputPresentation.ts +143 -0
- package/src/utils/interactionOverlay.stylex.ts +20 -0
- package/src/utils/safeUrl.test.ts +88 -0
- package/src/utils/safeUrl.ts +85 -0
|
@@ -9,8 +9,10 @@
|
|
|
9
9
|
* Adaptations are deliberately closed and ordered. Width points are fixed names,
|
|
10
10
|
* sparse rules and reserved token routing are rejected during normalization,
|
|
11
11
|
* condition fields are ANDed, and rule order is the precedence model: every
|
|
12
|
-
* matching rule writes after the root theme and later matching writes win.
|
|
13
|
-
*
|
|
12
|
+
* matching rule writes after the root theme and later matching writes win.
|
|
13
|
+
* Invariant type-scale component defaults already declared at root are omitted;
|
|
14
|
+
* authored rule leaves and generated token writes retain their cascade order.
|
|
15
|
+
* Token cycles are judged after each reachable ordered cascade is complete.
|
|
14
16
|
*
|
|
15
17
|
* SYNC: When modified, update:
|
|
16
18
|
* - /packages/core/src/theme/defineTheme.ts (`DefineThemeInput.adaptations`)
|
|
@@ -888,6 +890,42 @@ export function resolveThemeGenerativeAxes(
|
|
|
888
890
|
};
|
|
889
891
|
}
|
|
890
892
|
|
|
893
|
+
/**
|
|
894
|
+
* Type-scale component generation is invariant var() wiring, not scale values.
|
|
895
|
+
* Keep root declarations (including authored pins) in the root cascade instead
|
|
896
|
+
* of resetting them in a rule that only changes tokens. Fill missing root paths
|
|
897
|
+
* for rule-only scales, and retain every authored rule leaf, even when it equals
|
|
898
|
+
* the root: that write may intentionally undo an earlier matching rule.
|
|
899
|
+
*
|
|
900
|
+
* SYNC: expandTypeScale.ts (generateTypeScaleComponents)
|
|
901
|
+
*/
|
|
902
|
+
function omitRootTypeScaleDefaults(
|
|
903
|
+
resolved: ComponentStyleMap | undefined,
|
|
904
|
+
root: ComponentStyleMap | undefined,
|
|
905
|
+
authored: ComponentStyleMap | undefined,
|
|
906
|
+
): ComponentStyleMap | undefined {
|
|
907
|
+
if (!resolved || !root) {
|
|
908
|
+
return resolved;
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
const components: ComponentStyleMap = {};
|
|
912
|
+
for (const [component, rules] of Object.entries(resolved)) {
|
|
913
|
+
for (const [key, styles] of Object.entries(rules)) {
|
|
914
|
+
const writes = Object.fromEntries(
|
|
915
|
+
Object.entries(styles).filter(
|
|
916
|
+
([property]) =>
|
|
917
|
+
root[component]?.[key]?.[property] === undefined ||
|
|
918
|
+
Object.hasOwn(authored?.[component]?.[key] ?? {}, property),
|
|
919
|
+
),
|
|
920
|
+
);
|
|
921
|
+
if (Object.keys(writes).length > 0) {
|
|
922
|
+
(components[component] ??= {})[key] = writes;
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
return Object.keys(components).length > 0 ? components : undefined;
|
|
927
|
+
}
|
|
928
|
+
|
|
891
929
|
/** Lower ordered normalized rules to concrete CSS writes. */
|
|
892
930
|
export function resolveThemeAdaptationRules(
|
|
893
931
|
themeName: string,
|
|
@@ -895,14 +933,16 @@ export function resolveThemeAdaptationRules(
|
|
|
895
933
|
axes: ThemeGenerativeAxes,
|
|
896
934
|
rootTokens: Record<string, string>,
|
|
897
935
|
rootLocalTokens: Record<string, string> | undefined,
|
|
936
|
+
rootComponents?: ComponentStyleMap,
|
|
898
937
|
): ResolvedThemeAdaptationRule[] | undefined {
|
|
899
938
|
if (adaptations.rules.length === 0) {
|
|
900
939
|
return undefined;
|
|
901
940
|
}
|
|
902
941
|
|
|
903
942
|
const resolvedRules = adaptations.rules.map((rule, index) => {
|
|
943
|
+
const input = valueToThemeInput(themeName, index, rule.value, axes);
|
|
904
944
|
const resolved = resolveThemeValues(
|
|
905
|
-
|
|
945
|
+
input,
|
|
906
946
|
undefined,
|
|
907
947
|
// Authored adaptation values are a new surface with no legacy
|
|
908
948
|
// acceptance to preserve, so a malformed token is rejected here rather
|
|
@@ -951,7 +991,13 @@ export function resolveThemeAdaptationRules(
|
|
|
951
991
|
),
|
|
952
992
|
tokens: resolved.tokens,
|
|
953
993
|
localTokens,
|
|
954
|
-
components:
|
|
994
|
+
components: input.typography?.scale
|
|
995
|
+
? omitRootTypeScaleDefaults(
|
|
996
|
+
resolved.components,
|
|
997
|
+
rootComponents,
|
|
998
|
+
rule.value.components,
|
|
999
|
+
)
|
|
1000
|
+
: resolved.components,
|
|
955
1001
|
};
|
|
956
1002
|
});
|
|
957
1003
|
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
import {describe, expect, it} from 'vitest';
|
|
25
|
-
import {defineTheme} from './defineTheme';
|
|
25
|
+
import {defineTheme, generateThemeCSS} from './defineTheme';
|
|
26
26
|
import {resolveTokenValue} from './resolveThemeValues';
|
|
27
27
|
|
|
28
28
|
/** Exactly what the pre-extraction implementation did with each shape. */
|
|
@@ -43,6 +43,9 @@ describe('root token values keep their historical acceptance', () => {
|
|
|
43
43
|
});
|
|
44
44
|
|
|
45
45
|
expect(theme.tokens['--color-background-body']).toBe(expected);
|
|
46
|
+
expect(generateThemeCSS(theme).component).toContain(
|
|
47
|
+
`--color-background-body: ${String(expected)};`,
|
|
48
|
+
);
|
|
46
49
|
});
|
|
47
50
|
|
|
48
51
|
it('still resolves the documented shapes', () => {
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file inputPresentation.ts
|
|
5
|
+
* @input A presentation policy, the deprecated nativePicker value, and pointer type
|
|
6
|
+
* @output The resolved picker surface for DateInput, DateTimeInput, and TimeInput
|
|
7
|
+
* @position Shared presentation vocabulary owned by spec:AST-043
|
|
8
|
+
*
|
|
9
|
+
* SYNC: When modified, update these files to stay in sync:
|
|
10
|
+
* - /docs/specs/AST-043-input-presentation/spec.md (FR1–FR3 tables)
|
|
11
|
+
* - /packages/core/src/DateInput/DateInput.tsx
|
|
12
|
+
* - /packages/core/src/DateTimeInput/DateTimeInput.tsx
|
|
13
|
+
* - /packages/core/src/TimeInput/TimeInput.tsx
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/** Picker-surface policy for date/time inputs (`spec:AST-043` FR1). */
|
|
17
|
+
export type InputPresentation =
|
|
18
|
+
| 'text-input'
|
|
19
|
+
| 'popover'
|
|
20
|
+
| 'bottom-sheet'
|
|
21
|
+
| 'native'
|
|
22
|
+
| 'adaptive-bottom-sheet'
|
|
23
|
+
| 'adaptive-native';
|
|
24
|
+
|
|
25
|
+
/** `presentation` for components without a text-only surface: all except `TimeInput` exclude `text-input` (AST-043). */
|
|
26
|
+
export type PickerPresentation = Exclude<InputPresentation, 'text-input'>;
|
|
27
|
+
|
|
28
|
+
/** The surface a resolved `InputPresentation` actually renders. */
|
|
29
|
+
export type InputPresentationSurface =
|
|
30
|
+
'text-input' | 'desktop' | 'sheet' | 'native';
|
|
31
|
+
|
|
32
|
+
/** The surface a resolved `PickerPresentation` renders: one where a picker opens. */
|
|
33
|
+
export type PickerPresentationSurface = Exclude<
|
|
34
|
+
InputPresentationSurface,
|
|
35
|
+
'text-input'
|
|
36
|
+
>;
|
|
37
|
+
|
|
38
|
+
/** Deprecated picker policy (`spec:AST-043` FR3). */
|
|
39
|
+
export type LegacyNativePicker = 'touch' | 'always' | 'never';
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Typed as the narrower policy because the default opens a picker for every
|
|
43
|
+
* component; it is still a valid `InputPresentation`.
|
|
44
|
+
*/
|
|
45
|
+
export const DEFAULT_INPUT_PRESENTATION: PickerPresentation = 'adaptive-native';
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Map a deprecated `nativePicker` value to its `presentation` equivalent for
|
|
49
|
+
* a component whose every surface opens a picker (`DateInput`,
|
|
50
|
+
* `DateTimeInput`). Their released `never` was Astryx's own pickers on every
|
|
51
|
+
* pointer, so no value maps to `text-input` — which is what lets the return
|
|
52
|
+
* type exclude it.
|
|
53
|
+
*/
|
|
54
|
+
export function pickerPresentationFromNativePicker(
|
|
55
|
+
nativePicker: LegacyNativePicker,
|
|
56
|
+
): PickerPresentation {
|
|
57
|
+
switch (nativePicker) {
|
|
58
|
+
case 'touch':
|
|
59
|
+
return 'adaptive-native';
|
|
60
|
+
case 'always':
|
|
61
|
+
return 'native';
|
|
62
|
+
case 'never':
|
|
63
|
+
return 'adaptive-bottom-sheet';
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Map a deprecated `nativePicker` value to its `presentation` equivalent.
|
|
69
|
+
* `TimeInput` differs: its released `never` is the typed field on every
|
|
70
|
+
* pointer, so it maps to `text-input`, not a sheet policy.
|
|
71
|
+
*/
|
|
72
|
+
export function presentationFromNativePicker(
|
|
73
|
+
nativePicker: LegacyNativePicker,
|
|
74
|
+
component: 'date' | 'time',
|
|
75
|
+
): InputPresentation {
|
|
76
|
+
if (component === 'time' && nativePicker === 'never') {
|
|
77
|
+
return 'text-input';
|
|
78
|
+
}
|
|
79
|
+
return pickerPresentationFromNativePicker(nativePicker);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* The effective picker-only policy: explicit `presentation` wins over the
|
|
84
|
+
* deprecated prop. The narrow twin of {@link effectiveInputPresentation} for
|
|
85
|
+
* `DateInput` and `DateTimeInput`, whose `presentation` cannot be
|
|
86
|
+
* `text-input`.
|
|
87
|
+
*/
|
|
88
|
+
export function effectivePickerPresentation(
|
|
89
|
+
presentation: PickerPresentation | undefined,
|
|
90
|
+
nativePicker: LegacyNativePicker | undefined,
|
|
91
|
+
): PickerPresentation {
|
|
92
|
+
if (presentation !== undefined) {
|
|
93
|
+
return presentation;
|
|
94
|
+
}
|
|
95
|
+
if (nativePicker !== undefined) {
|
|
96
|
+
return pickerPresentationFromNativePicker(nativePicker);
|
|
97
|
+
}
|
|
98
|
+
return DEFAULT_INPUT_PRESENTATION;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** The effective policy: explicit `presentation` wins over the deprecated prop. */
|
|
102
|
+
export function effectiveInputPresentation(
|
|
103
|
+
presentation: InputPresentation | undefined,
|
|
104
|
+
nativePicker: LegacyNativePicker | undefined,
|
|
105
|
+
component: 'date' | 'time',
|
|
106
|
+
): InputPresentation {
|
|
107
|
+
if (presentation !== undefined) {
|
|
108
|
+
return presentation;
|
|
109
|
+
}
|
|
110
|
+
if (nativePicker !== undefined) {
|
|
111
|
+
return presentationFromNativePicker(nativePicker, component);
|
|
112
|
+
}
|
|
113
|
+
return DEFAULT_INPUT_PRESENTATION;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Resolve a picker-only policy to the surface rendered for the current pointer. */
|
|
117
|
+
export function resolvePickerPresentation(
|
|
118
|
+
presentation: PickerPresentation,
|
|
119
|
+
isCoarsePointer: boolean,
|
|
120
|
+
): PickerPresentationSurface {
|
|
121
|
+
switch (presentation) {
|
|
122
|
+
case 'popover':
|
|
123
|
+
return 'desktop';
|
|
124
|
+
case 'bottom-sheet':
|
|
125
|
+
return 'sheet';
|
|
126
|
+
case 'native':
|
|
127
|
+
return 'native';
|
|
128
|
+
case 'adaptive-bottom-sheet':
|
|
129
|
+
return isCoarsePointer ? 'sheet' : 'desktop';
|
|
130
|
+
case 'adaptive-native':
|
|
131
|
+
return isCoarsePointer ? 'native' : 'desktop';
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** Resolve a policy to the surface rendered for the current pointer. */
|
|
136
|
+
export function resolveInputPresentation(
|
|
137
|
+
presentation: InputPresentation,
|
|
138
|
+
isCoarsePointer: boolean,
|
|
139
|
+
): InputPresentationSurface {
|
|
140
|
+
return presentation === 'text-input'
|
|
141
|
+
? 'text-input'
|
|
142
|
+
: resolvePickerPresentation(presentation, isCoarsePointer);
|
|
143
|
+
}
|
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
* @output Exports reusable background-color and background-image state styles
|
|
11
11
|
* @position Internal styling utility for interactive core surfaces
|
|
12
12
|
*
|
|
13
|
+
* Every surface that paints a press composes one of these (or carries its own
|
|
14
|
+
* `:active` rule), so a change to how the system answers a press is made here
|
|
15
|
+
* once. `pressedBackgroundColor` is the press without the hover, for controls
|
|
16
|
+
* whose hover is a colour or nothing.
|
|
17
|
+
*
|
|
13
18
|
* Keep the enabled guard outside the individual states. StyleX assigns an
|
|
14
19
|
* extra priority bucket (and generated selector specificity) to media-nested
|
|
15
20
|
* rules. Repeating `:active` inside the hover-capable branch gives hover and
|
|
@@ -71,4 +76,19 @@ export const interactionOverlayStyles = stylex.create({
|
|
|
71
76
|
},
|
|
72
77
|
},
|
|
73
78
|
},
|
|
79
|
+
/**
|
|
80
|
+
* The pressed arm alone, for a control whose hover answer is its own — a
|
|
81
|
+
* text link changes colour, a disclosure row has none — so a press paints
|
|
82
|
+
* the system's pressed overlay without adding a hover surface the control
|
|
83
|
+
* never had. Same enabled guard as the paired states above.
|
|
84
|
+
*/
|
|
85
|
+
pressedBackgroundColor: {
|
|
86
|
+
backgroundColor: {
|
|
87
|
+
default: null,
|
|
88
|
+
[ENABLED]: {
|
|
89
|
+
default: null,
|
|
90
|
+
':active': colorVars['--color-overlay-pressed'],
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
},
|
|
74
94
|
});
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import {describe, expect, it} from 'vitest';
|
|
4
|
+
import {isSafeDestination, isSafeUrl, sanitizeUrl} from './safeUrl';
|
|
5
|
+
|
|
6
|
+
// Expectations come from the navigation contract, not another policy helper.
|
|
7
|
+
const accepted = [
|
|
8
|
+
'https://example.com/a?b=c#d',
|
|
9
|
+
'http://example.com',
|
|
10
|
+
'//example.com/protocol-relative',
|
|
11
|
+
'/relative/path',
|
|
12
|
+
'relative/path',
|
|
13
|
+
'#fragment',
|
|
14
|
+
'mailto:a@example.com',
|
|
15
|
+
'tel:+1234567890',
|
|
16
|
+
'custom:open/document',
|
|
17
|
+
'data:image/png;base64,iVBORw0KGgo=',
|
|
18
|
+
'data:text/plain,download',
|
|
19
|
+
];
|
|
20
|
+
const rejected = [
|
|
21
|
+
'javascript:alert(1)',
|
|
22
|
+
'JaVaScRiPt:alert(1)',
|
|
23
|
+
' javascript:alert(1)',
|
|
24
|
+
'vbscript:MsgBox(1)',
|
|
25
|
+
'data:text/html,<script>alert(1)</script>',
|
|
26
|
+
'DATA:TEXT/HTML;base64,PHNjcmlwdD4=',
|
|
27
|
+
'java\tscript:alert(1)',
|
|
28
|
+
'java\nscript:alert(1)',
|
|
29
|
+
'\x00javascript:alert(1)',
|
|
30
|
+
'java\x7fscript:alert(1)',
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
describe('navigation strings', () => {
|
|
34
|
+
it.each(accepted)('accepts %s', url => {
|
|
35
|
+
expect(isSafeUrl(url)).toBe(true);
|
|
36
|
+
expect(isSafeDestination(url)).toBe(true);
|
|
37
|
+
expect(sanitizeUrl(url)).toBe(url);
|
|
38
|
+
});
|
|
39
|
+
it.each(rejected)('rejects %s', url => {
|
|
40
|
+
expect(isSafeUrl(url)).toBe(false);
|
|
41
|
+
expect(isSafeDestination(url)).toBe(false);
|
|
42
|
+
expect(sanitizeUrl(url)).toBeNull();
|
|
43
|
+
});
|
|
44
|
+
it('normalizes accepted strings only when requested', () => {
|
|
45
|
+
expect(sanitizeUrl(' /docs\n')).toBe('/docs');
|
|
46
|
+
expect(sanitizeUrl('/do\x00cs')).toBe('/docs');
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
describe('structured destinations', () => {
|
|
51
|
+
it.each([
|
|
52
|
+
{pathname: '/docs', search: '?q=1', hash: '#a'},
|
|
53
|
+
{href: 'https://example.com'},
|
|
54
|
+
{protocol: 'https:', hostname: 'example.com', pathname: '/docs'},
|
|
55
|
+
{protocol: 'custom', pathname: 'document'},
|
|
56
|
+
{protocol: 'mailto:', pathname: 'a@example.com'},
|
|
57
|
+
{protocol: 'data:', pathname: 'image/png;base64,aA=='},
|
|
58
|
+
{search: '?page=2'},
|
|
59
|
+
{hash: '#section'},
|
|
60
|
+
{},
|
|
61
|
+
new URL('https://example.com/docs'),
|
|
62
|
+
undefined,
|
|
63
|
+
null,
|
|
64
|
+
])('accepts supported destination %j', destination => {
|
|
65
|
+
expect(isSafeDestination(destination)).toBe(true);
|
|
66
|
+
});
|
|
67
|
+
it.each([
|
|
68
|
+
{pathname: 'javascript:alert(1)'},
|
|
69
|
+
{pathname: 'java\x00script:alert(1)'},
|
|
70
|
+
{href: 'vbscript:MsgBox(1)'},
|
|
71
|
+
{pathname: '/ok', href: 'javascript:1'},
|
|
72
|
+
{protocol: 'javascript:', pathname: 'alert(1)'},
|
|
73
|
+
{protocol: 'javascript', pathname: 'alert(1)'},
|
|
74
|
+
{protocol: ' JaVa\tsCrIpT ', pathname: 'alert(1)'},
|
|
75
|
+
{protocol: 'vbscript', pathname: 'MsgBox(1)'},
|
|
76
|
+
{protocol: 'data:', pathname: 'text/html,<b>x</b>'},
|
|
77
|
+
{protocol: 'data', pathname: 'TEXT/HTML;base64,PGI+eDwvYj4='},
|
|
78
|
+
{protocol: 'data:', host: 'text/', pathname: 'html,<b>x</b>'},
|
|
79
|
+
{protocol: 'data:', hostname: 'text/html,<b>x</b>'},
|
|
80
|
+
{href: '/safe', protocol: 'javascript:'},
|
|
81
|
+
new URL('javascript:alert(1)'),
|
|
82
|
+
{pathname: 42},
|
|
83
|
+
{protocol: {toString: (): string => 'javascript:'}},
|
|
84
|
+
3,
|
|
85
|
+
])('rejects blocked or unsupported destination %j', destination => {
|
|
86
|
+
expect(isSafeDestination(destination)).toBe(false);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file safeUrl.ts
|
|
5
|
+
* @input Navigation strings or supported structured router destinations
|
|
6
|
+
* @output The shared blocked-scheme decision, without rewriting accepted inputs
|
|
7
|
+
* @position Core navigation policy; embedded-resource policy is separate
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
function normalizeUrl(url: string): string {
|
|
11
|
+
// eslint-disable-next-line no-control-regex -- inspect schemes without browser-ignored controls
|
|
12
|
+
return url.replace(/[\x00-\x1f\x7f]/g, '').trim();
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Return a normalized navigation URL, or null for a blocked scheme. */
|
|
16
|
+
export function sanitizeUrl(url: string): string | null {
|
|
17
|
+
const normalized = normalizeUrl(url);
|
|
18
|
+
const lower = normalized.toLowerCase();
|
|
19
|
+
if (
|
|
20
|
+
lower.startsWith('javascript:') ||
|
|
21
|
+
lower.startsWith('vbscript:') ||
|
|
22
|
+
lower.startsWith('data:text/html')
|
|
23
|
+
) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return normalized;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Inspect a navigation string without changing the value used by its sink. */
|
|
30
|
+
export function isSafeUrl(url: string): boolean {
|
|
31
|
+
return sanitizeUrl(url) !== null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Inspect React Router paths, Next.js URL objects, and URL instances without
|
|
36
|
+
* serializing or replacing the object handed to the router. Search/query/hash
|
|
37
|
+
* are route-relative data, not schemes. Absent destinations remain absent.
|
|
38
|
+
*/
|
|
39
|
+
export function isSafeDestination(destination: unknown): boolean {
|
|
40
|
+
if (destination == null) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
if (typeof destination === 'string') {
|
|
44
|
+
return isSafeUrl(destination);
|
|
45
|
+
}
|
|
46
|
+
if (typeof destination !== 'object') {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const {pathname, href, protocol, host, hostname} = destination as {
|
|
51
|
+
pathname?: unknown;
|
|
52
|
+
href?: unknown;
|
|
53
|
+
protocol?: unknown;
|
|
54
|
+
host?: unknown;
|
|
55
|
+
hostname?: unknown;
|
|
56
|
+
};
|
|
57
|
+
for (const field of [pathname, href, protocol, host, hostname]) {
|
|
58
|
+
if (field != null && typeof field !== 'string') {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (typeof pathname === 'string' && !isSafeUrl(pathname)) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
if (typeof href === 'string' && !isSafeUrl(href)) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
if (typeof protocol === 'string' && protocol !== '') {
|
|
69
|
+
// URL-object formatters accept a protocol with or without its colon and
|
|
70
|
+
// can assemble a data media type from the host and pathname fields.
|
|
71
|
+
const normalizedProtocol = normalizeUrl(protocol);
|
|
72
|
+
const prefix = normalizedProtocol.endsWith(':')
|
|
73
|
+
? normalizedProtocol
|
|
74
|
+
: `${normalizedProtocol}:`;
|
|
75
|
+
if (!isSafeUrl(prefix)) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
const body = (host || hostname || '') as string;
|
|
79
|
+
const path = typeof pathname === 'string' ? pathname : '';
|
|
80
|
+
if (!isSafeUrl(`${prefix}${body}${path}`)) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
}
|