@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
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: 3
|
|
3
|
+
template_version: 6
|
|
4
|
+
kind: component
|
|
5
|
+
id: component:ChatSendButton
|
|
6
|
+
authority: draft
|
|
7
|
+
archive_reason: null
|
|
8
|
+
superseded_by: null
|
|
9
|
+
approved_by: null
|
|
10
|
+
approved_at: null
|
|
11
|
+
owners: [cixzhang]
|
|
12
|
+
review_triggers: [public-api, behavior, theming, accessibility, testing]
|
|
13
|
+
verified_by:
|
|
14
|
+
[
|
|
15
|
+
packages/core/src/Chat/ChatSendButton.test.tsx,
|
|
16
|
+
packages/core/src/Chat/__tests__/ChatSendButton.a11y.chromium.spec.ts,
|
|
17
|
+
packages/core/src/theme/themingTargets.test.ts,
|
|
18
|
+
apps/storybook/stories/ChatComposer.stories.tsx,
|
|
19
|
+
apps/storybook/stories/ChatSendButtonAudit.stories.tsx,
|
|
20
|
+
apps/storybook/rtl-audit/verified-not-applicable.json,
|
|
21
|
+
]
|
|
22
|
+
modules: []
|
|
23
|
+
families: []
|
|
24
|
+
design_specs: []
|
|
25
|
+
architecture:
|
|
26
|
+
[
|
|
27
|
+
architecture:public-component-api,
|
|
28
|
+
architecture:icon-resolution-and-component-slots,
|
|
29
|
+
architecture:component-theming-surface,
|
|
30
|
+
architecture:interaction-modality,
|
|
31
|
+
architecture:component-test-sufficiency,
|
|
32
|
+
architecture:knowledge-contracts,
|
|
33
|
+
]
|
|
34
|
+
contributing: []
|
|
35
|
+
system_specs: [spec:AST-002, spec:AST-020, spec:AST-029, spec:AST-032]
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
# ChatSendButton component contract
|
|
39
|
+
|
|
40
|
+
## Contract at a glance
|
|
41
|
+
|
|
42
|
+
| Area | Contract |
|
|
43
|
+
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
44
|
+
| Public contract | The exported control selects send or stop presentation from props over ChatComposer context, accepts `sm` or `md`, supports icon overrides, and extends the rendered Button with supported Button DOM, event, styling, and ref inputs. |
|
|
45
|
+
| Behavior | Send is disabled from explicit or composer readiness, stop remains enabled, state-specific actions run before a composed generic click handler, and current send artwork resolves from an explicit override before the shared fallback. |
|
|
46
|
+
| End-user impact | People receive a translated, state-appropriate send or stop action whose availability follows composer readiness. |
|
|
47
|
+
| Builder impact | Builders can use the context defaults or supply every state and action explicitly for standalone composition. |
|
|
48
|
+
| Compatibility/readiness | This draft records current or remediated observable behavior. It adds no public prop, default, target, or compatibility promise. Consumers that used `onClick` to replace sending migrate that logic to `onSend`; implementation of the AST-032 component-slot requirement remains pending. |
|
|
49
|
+
| Review checks | Reject lost send/stop routing, consumer events that replace the state action, a disabled stop action, unlabelled icon-only output, dropped root inputs, or send fallback drift from the observed explicit-then-shared order. |
|
|
50
|
+
| Governing rules | `spec:AST-032/FR2-FR3` (current requirement, implementation pending with its owner); `architecture:public-component-api/INV5-INV8`; `architecture:interaction-modality`; `architecture:component-test-sufficiency`; `spec:AST-020`; `spec:AST-029`. |
|
|
51
|
+
|
|
52
|
+
This table is a review projection. The draft body below records checkable current
|
|
53
|
+
or remediated behavior and does not create product policy.
|
|
54
|
+
|
|
55
|
+
## Intent
|
|
56
|
+
|
|
57
|
+
ChatSendButton is the compact action control used by ChatComposer. It translates
|
|
58
|
+
composer readiness and streaming state into a shared Button while keeping action,
|
|
59
|
+
icon, styling, and ref seams available for standalone composition.
|
|
60
|
+
|
|
61
|
+
## Compatibility and migration
|
|
62
|
+
|
|
63
|
+
- Released default preserved: no public default changes are made by this audit.
|
|
64
|
+
- Compatibility class: patch-compatible event-composition repair plus observational documentation and evidence coverage.
|
|
65
|
+
- Controlled/uncontrolled behavior: not applicable; explicit props take precedence over context-derived values.
|
|
66
|
+
- Migration decision: consumers that previously used `onClick` to replace sending should move that logic to `onSend`, because the repaired component now runs the state action and then the accepted generic click.
|
|
67
|
+
|
|
68
|
+
Consumer migration instructions belong in consumer docs and release notes.
|
|
69
|
+
|
|
70
|
+
## Ownership boundary
|
|
71
|
+
|
|
72
|
+
**Owns**
|
|
73
|
+
|
|
74
|
+
- Selection of the send or stop state.
|
|
75
|
+
- State-specific translated accessible names and Button variants.
|
|
76
|
+
- Composer-context fallback for readiness and actions.
|
|
77
|
+
- Send and stop icon selection at the component seam.
|
|
78
|
+
- Composition of the state action with an accepted generic click handler.
|
|
79
|
+
- The `chat-send-button` theme target and circular root treatment.
|
|
80
|
+
|
|
81
|
+
**Does not own / non-goals**
|
|
82
|
+
|
|
83
|
+
- ChatComposer value editing, submission lifecycle, streaming lifecycle, or placement.
|
|
84
|
+
- Shared Button activation, focus, disabled semantics, hit area, or base styling.
|
|
85
|
+
- Shared icon artwork or theme icon registration.
|
|
86
|
+
- A public policy for whether `isStopShown` may appear without a stop action.
|
|
87
|
+
|
|
88
|
+
## Public concepts
|
|
89
|
+
|
|
90
|
+
Consumer syntax remains in `ChatSendButton.doc.mjs`. This inventory closes the
|
|
91
|
+
observable semantic surface without duplicating the prop table.
|
|
92
|
+
|
|
93
|
+
| Concept | Closed values or states | Meaning | Availability by variant/orientation/state | Default | Owner | Stability | Invalid-value behavior |
|
|
94
|
+
| ------------ | -------------------------------------------------------------- | -------------------------------------------------------------------------------------- | ----------------------------------------- | ----------------------------------------------------------- | ----------------------------------- | -------------------------- | ------------------------------------------------------------------------------------------- |
|
|
95
|
+
| Action state | send; stop | Selects the name, Button variant, icon role, disabled rule, and state action. | Every render. | Composer `isStopShown`, otherwise send. | `component:ChatSendButton` | Observed released surface | Values outside the boolean prop type are unsupported. |
|
|
96
|
+
| Availability | enabled; disabled | Prevents send activation when content is not ready. Stop intentionally ignores it. | Disabled applies only to send. | Explicit `isDisabled`, otherwise inverse composer canSend. | component and ChatComposer context | Observed released surface | Values outside the boolean prop type are unsupported. |
|
|
97
|
+
| Action | state callback; composer fallback; composed generic click | Runs the state action and then an accepted consumer click handler. | Enabled send and stop activation. | `onSend` or submit current value; `onStop` or context stop. | component, context, and caller | Remediated observable path | With no state callback or matching context action, only a supplied generic click can run. |
|
|
98
|
+
| Send icon | explicit content; shared fallback | Selects artwork for the send state. | Send state. | `sendIcon`, then shared `arrowUp`. | component and caller | Observed released surface | Unsupported React content follows the shared Button rendering boundary. |
|
|
99
|
+
| Stop icon | explicit content; shared fallback | Selects artwork for the stop state. | Stop state. | `stopIcon`, then shared `stop`. | component and caller | Observed released surface | Unsupported React content follows the shared Button rendering boundary. |
|
|
100
|
+
| Size | `sm`; `md` | Selects the delegated Button size while preserving circular treatment. | Both states. | `md`. | `component:ChatSendButton` | Observed released surface | Values outside the public union are rejected by TypeScript. |
|
|
101
|
+
| Root surface | ref; supported Button DOM/data/ARIA/events; style/class/xstyle | Extends and styles the rendered Button without replacing component-owned action logic. | Every render. | Omitted. | `architecture:public-component-api` | Remediated observable path | Unsupported BaseProps omissions remain unsupported; owned semantics win accidental clashes. |
|
|
102
|
+
|
|
103
|
+
## Behavioral and layout contract
|
|
104
|
+
|
|
105
|
+
| ID | Candidate invariant | Basis | Draft review state |
|
|
106
|
+
| --- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
|
|
107
|
+
| FR1 | The send state MUST render a primary icon-only Button named by the send translation, and it MUST be disabled when explicit or context-derived readiness is false. | Current implementation, docs, tests, `spec:AST-020`, and shared Button behavior | Verified current behavior |
|
|
108
|
+
| FR2 | The stop state MUST render a secondary icon-only Button named by the stop translation, remain enabled regardless of send readiness, and invoke explicit or context stop behavior. | Current implementation, docs, and tests | Verified current behavior; the missing-handler public boundary is owned by `component:ChatComposer/OQ4` |
|
|
109
|
+
| FR3 | Send icon resolution currently prefers `sendIcon` and otherwise resolves shared `arrowUp`. `spec:AST-032/FR2-FR3` separately owns a current requirement to add a component-icon slot; its implementation remains pending with that owner. | Current implementation, docs, tests, and current owner requirement in `spec:AST-032` | Verified shipped two-stage behavior; the required AST-032 stage is not described as shipped |
|
|
110
|
+
| FR4 | Stop icon resolution currently prefers `stopIcon` and otherwise resolves the shared `stop` icon. | Current implementation, docs, and tests | Verified shipped behavior; this draft does not invent a stop component slot |
|
|
111
|
+
| FR5 | Explicit state, disabled, callback, icon, and size props MUST win over their context or component fallback. A generic accepted click handler MUST compose after the selected state action rather than replace it. | Current implementation after audit repair plus `architecture:public-component-api/INV5-INV7` and API contributor guide | Settled objective repair with red-before-green focused tests |
|
|
112
|
+
| FR6 | Supported Button DOM, data, ARIA, className, style, xstyle, and ref inputs MUST reach or compose on the rendered Button while component-owned label, state, and activation behavior remain intact. | Current implementation plus `architecture:public-component-api/INV5-INV8` | Verify through source, type checks, and focused tests |
|
|
113
|
+
| FR7 | The component MUST paint through the shared Button on the co-located `chat-send-button` target and preserve its circular component treatment. | Current implementation, Chat consumer docs, and `architecture:component-theming-surface` | Verified current target and composition |
|
|
114
|
+
|
|
115
|
+
### Allowed variation
|
|
116
|
+
|
|
117
|
+
- **AV1 — Context or standalone composition.** A builder may rely on ChatComposer
|
|
118
|
+
context or provide all state, action, and disabled values explicitly.
|
|
119
|
+
- **AV2 — Artwork.** Explicit send and stop content and shared fallback artwork may
|
|
120
|
+
vary within the observed icon-resolution behavior.
|
|
121
|
+
- **AV3 — Consumer styling.** Supported styling inputs may extend the Button while
|
|
122
|
+
component-owned state and activation behavior remain.
|
|
123
|
+
|
|
124
|
+
### Representative states
|
|
125
|
+
|
|
126
|
+
| State | Required invariant | Allowed variation |
|
|
127
|
+
| ---------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------- |
|
|
128
|
+
| Send, disabled | Primary translated send action is unavailable and does not run callbacks. | Icon source, size, theme, and consumer styling. |
|
|
129
|
+
| Send, enabled | Primary translated send action runs explicit or context submission. | Icon source, size, theme, and consumer styling. |
|
|
130
|
+
| Stop | Secondary translated stop action remains enabled and runs explicit or context stop. | Icon source, size, theme, and consumer styling. |
|
|
131
|
+
| Explicit override | Explicit state, callback, icon, disabled value, and size win their fallback seams. | Context may still supply unspecified values. |
|
|
132
|
+
| Composed generic click | State action and accepted generic click both run without one replacing the other. | Either handler may be absent. |
|
|
133
|
+
|
|
134
|
+
### Transformation and precedence order
|
|
135
|
+
|
|
136
|
+
- **ORD1 — Resolve state.** Explicit `isStopShown` wins, then composer context,
|
|
137
|
+
then the send state.
|
|
138
|
+
- **ORD2 — Resolve action.** Explicit state callback wins its composer fallback.
|
|
139
|
+
The selected state action runs before the accepted generic click handler because
|
|
140
|
+
this component does not promise consumer cancellation of its state action.
|
|
141
|
+
- **ORD3 — Resolve availability.** Stop remains enabled. Send uses explicit
|
|
142
|
+
`isDisabled`, then inverse composer readiness, then disabled outside context.
|
|
143
|
+
- **ORD4 — Resolve artwork.** In send, explicit `sendIcon` wins, then shared
|
|
144
|
+
`arrowUp`; in stop, explicit `stopIcon` wins, then shared `stop`.
|
|
145
|
+
- **ORD5 — Compose root.** Apply component-owned Button semantics and the
|
|
146
|
+
`chat-send-button` target while preserving supported consumer root inputs.
|
|
147
|
+
|
|
148
|
+
### Performance and resources
|
|
149
|
+
|
|
150
|
+
- **PR1 — Render-only projection.** The component adds no Effect, observer,
|
|
151
|
+
listener, timer, state mirror, or owned async lifecycle.
|
|
152
|
+
|
|
153
|
+
## Accessibility contract
|
|
154
|
+
|
|
155
|
+
- **AR1 — Native action semantics.** The delegated Button MUST own native button
|
|
156
|
+
activation, keyboard behavior, focus indication, and disabled semantics.
|
|
157
|
+
- **AR2 — State-appropriate name.** The icon-only control MUST expose the current
|
|
158
|
+
translated send or stop label independently of icon artwork.
|
|
159
|
+
- **AR3 — Disabled send behavior.** A disabled send action MUST not invoke either
|
|
160
|
+
the state action or a consumer click handler.
|
|
161
|
+
- **AR4 — Modality parity.** Pointer and keyboard activation MUST traverse the same
|
|
162
|
+
state-action and composed-event path.
|
|
163
|
+
|
|
164
|
+
## Design relationships
|
|
165
|
+
|
|
166
|
+
| Anatomy or state | Design requirement | Representation authority | Hierarchy role | Component contract |
|
|
167
|
+
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | ------------------------ | ------------------ |
|
|
168
|
+
| Action button | Circular compact Button carrying the current send or stop action. | Current source and consumer docs; exact tuning stays in code | Primary/secondary action | FR1, FR2, FR7 |
|
|
169
|
+
| Send artwork | Upward send glyph unless explicit content wins; AST-032 currently requires a component slot whose implementation is pending. | Current source and docs; current requirement in `spec:AST-032/FR2-FR3` | Action cue | FR3 |
|
|
170
|
+
| Stop artwork | Shared stop glyph unless explicit content wins. | Current source and consumer docs | Action cue | FR4 |
|
|
171
|
+
|
|
172
|
+
This observational draft does not select new dimensions, variants, icon artwork,
|
|
173
|
+
color roles, or visual prominence.
|
|
174
|
+
|
|
175
|
+
The Chat family consumer doc catalogs `chat-send-button`. Button owns the
|
|
176
|
+
underlying painting and interaction-state styling; the component target is
|
|
177
|
+
co-located on that painting element.
|
|
178
|
+
|
|
179
|
+
## Family and system relationships
|
|
180
|
+
|
|
181
|
+
- ChatComposer owns value, readiness, submission, stop lifecycle, and placement.
|
|
182
|
+
- Button owns shared activation, focus, disabled semantics, hit area, and paint.
|
|
183
|
+
- `architecture:public-component-api` owns BaseProps reachability, style/ref
|
|
184
|
+
composition, and deliberate event composition.
|
|
185
|
+
- `architecture:icon-resolution-and-component-slots` owns the shared slot model;
|
|
186
|
+
`spec:AST-032/FR2-FR3` currently requires that stage in send resolution, and
|
|
187
|
+
its implementation remains pending with the owner. This draft does not describe
|
|
188
|
+
the unshipped stage as current behavior.
|
|
189
|
+
- `architecture:component-theming-surface` owns the qualification and placement
|
|
190
|
+
of the co-located `chat-send-button` target.
|
|
191
|
+
- `architecture:interaction-modality` and `spec:AST-020` own pointer, keyboard,
|
|
192
|
+
focus, and accessibility parity inherited through Button.
|
|
193
|
+
- `architecture:component-test-sufficiency` owns public-seam regression coverage.
|
|
194
|
+
- `spec:AST-029` owns this Night Watch observational backfill and prevents it from
|
|
195
|
+
settling new product meaning.
|
|
196
|
+
|
|
197
|
+
## Verification map
|
|
198
|
+
|
|
199
|
+
| Contract | Verification | Representative states | Mutation or failure expectation | Audit section |
|
|
200
|
+
| ------------------------- | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------ |
|
|
201
|
+
| FR1, FR2, AR1-AR4 | `ChatSendButton.test.tsx`, `ChatSendButton.a11y.chromium.spec.ts`, and `ChatComposer.test.tsx` | Enabled/disabled send, stop with and without handler, context stop, keyboard/pointer, light/dark interaction states | Label, disabled, native activation, state routing, or interaction paint drift fails focused or exact-head browser evidence. | `audit:ChatSendButton/accessibility` |
|
|
202
|
+
| FR3 | `ChatSendButton.test.tsx`; current AST-032 owner requirement and its pending implementation | Explicit and shared-fallback send icon | Losing the observed two-stage precedence fails focused tests; the AST-032 owner verifies the required component-slot stage. | `audit:ChatSendButton/theming` |
|
|
203
|
+
| FR4 | `ChatSendButton.test.tsx` | Explicit and fallback stop icon | Losing explicit precedence or registry resolution fails focused assertions. | `audit:ChatSendButton/behavior` |
|
|
204
|
+
| FR5, FR6 | Red-before-green callback composition, ordering, size, root passthrough, disabled-click, and keyboard tests; types and lint | Send, stop, `sm`/`md`, ref/class/data/ARIA, Enter/Space | Consumer events replacing state actions, cancellation reordering, lost root inputs, or modality drift fails focused tests. | `audit:ChatSendButton/api` |
|
|
205
|
+
| FR7 | `themingTargets.test.ts`, exact-head browser receipts, and source inspection | Send and stop themes | Target removal, movement off paint, or undocumented target drift fails tests or browser evidence. | `audit:ChatSendButton/theming` |
|
|
206
|
+
| RTL relation | RTL shared-fixture route plus refreshed verified-N/A source receipts for ChatSendButton and ChatComposer | Send and stop | Directional artwork, physical positioning, or transform invalidates the checked-in receipts. | `audit:ChatSendButton/i18n-rtl` |
|
|
207
|
+
| Browser matrix | `ChatSendButton.a11y.chromium.spec.ts` exact-head 10-sensor receipts | Light/dark send and stop rest/hover/focus/press, disabled rest/hover, `sm`/`md`, 320px coarse pointer, D7 contrast pairs | A stale build, decoy selector, missing state, changed disabled paint, absent interaction pixels, failed contrast, or geometry miss fails closed. | `audit:ChatSendButton/visual` |
|
|
208
|
+
| Documentation and surface | Consumer docs, export checks, Storybook, and `check:knowledge` | Props, public subpath, states, draft contract | Missing or stale docs, exports, relationships, or required draft structure fails validation. | `audit:ChatSendButton/docs` |
|
|
209
|
+
|
|
210
|
+
## Decision log
|
|
211
|
+
|
|
212
|
+
None. This draft records current facts, one objective event-composition repair,
|
|
213
|
+
and one current AST-032 requirement whose implementation remains pending with its
|
|
214
|
+
owner. It introduces no component-local public API, default, compatibility,
|
|
215
|
+
ownership, or subjective visual decision.
|
|
216
|
+
|
|
217
|
+
## Open questions
|
|
218
|
+
|
|
219
|
+
- **Cross-reference: stop without handler.** `component:ChatComposer/OQ4` owns
|
|
220
|
+
the unresolved policy for a visible stop action without an explicit or context
|
|
221
|
+
`onStop`. This component draft records and tests the current enabled no-op
|
|
222
|
+
branch without duplicating that question.
|
|
223
|
+
|
|
224
|
+
## Content boundary
|
|
225
|
+
|
|
226
|
+
This file does not duplicate consumer examples, audit scores, screenshots,
|
|
227
|
+
eligibility data, or shared Button and icon-system rules. It links to their owners.
|
|
@@ -4,12 +4,14 @@
|
|
|
4
4
|
* @file ChatSendButton.test.tsx
|
|
5
5
|
* @input Uses vitest, @testing-library/react, the global icon registry
|
|
6
6
|
* @output Unit tests for ChatSendButton
|
|
7
|
-
* @position Colocated unit test; covers
|
|
8
|
-
*
|
|
7
|
+
* @position Colocated unit test; covers labels and icons, disabled rules,
|
|
8
|
+
* composed consumer clicks, state-action routing, and ChatComposer defaults
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
+
import {createRef} from 'react';
|
|
11
12
|
import {describe, it, expect, vi, afterEach} from 'vitest';
|
|
12
13
|
import {render, screen, fireEvent} from '@testing-library/react';
|
|
14
|
+
import userEvent from '@testing-library/user-event';
|
|
13
15
|
import {ChatSendButton} from './ChatSendButton';
|
|
14
16
|
import {ChatComposer} from './ChatComposer';
|
|
15
17
|
import {Button} from '../Button';
|
|
@@ -38,6 +40,55 @@ describe('ChatSendButton', () => {
|
|
|
38
40
|
expect(screen.getByRole('button', {name: 'Send'})).toBeEnabled();
|
|
39
41
|
});
|
|
40
42
|
|
|
43
|
+
it('forwards ref, className, data, and ARIA inputs to the Button root', () => {
|
|
44
|
+
const ref = createRef<HTMLButtonElement>();
|
|
45
|
+
render(
|
|
46
|
+
<>
|
|
47
|
+
<ChatSendButton
|
|
48
|
+
ref={ref}
|
|
49
|
+
isDisabled={false}
|
|
50
|
+
onSend={() => {}}
|
|
51
|
+
className="consumer-class"
|
|
52
|
+
data-audit-root="forwarded"
|
|
53
|
+
aria-describedby="send-help"
|
|
54
|
+
/>
|
|
55
|
+
<span id="send-help">Sends the current message</span>
|
|
56
|
+
</>,
|
|
57
|
+
);
|
|
58
|
+
const button = screen.getByRole('button', {name: 'Send'});
|
|
59
|
+
expect(ref.current).toBe(button);
|
|
60
|
+
expect(button).toHaveClass('consumer-class');
|
|
61
|
+
expect(button).toHaveAttribute('data-audit-root', 'forwarded');
|
|
62
|
+
expect(button).toHaveAccessibleDescription('Sends the current message');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('reflects both supported Button sizes', () => {
|
|
66
|
+
render(
|
|
67
|
+
<>
|
|
68
|
+
<ChatSendButton
|
|
69
|
+
data-testid="send-small"
|
|
70
|
+
isDisabled={false}
|
|
71
|
+
onSend={() => {}}
|
|
72
|
+
size="sm"
|
|
73
|
+
/>
|
|
74
|
+
<ChatSendButton
|
|
75
|
+
data-testid="send-medium"
|
|
76
|
+
isDisabled={false}
|
|
77
|
+
onSend={() => {}}
|
|
78
|
+
size="md"
|
|
79
|
+
/>
|
|
80
|
+
</>,
|
|
81
|
+
);
|
|
82
|
+
expect(screen.getByTestId('send-small')).toHaveAttribute(
|
|
83
|
+
'data-size',
|
|
84
|
+
'sm',
|
|
85
|
+
);
|
|
86
|
+
expect(screen.getByTestId('send-medium')).toHaveAttribute(
|
|
87
|
+
'data-size',
|
|
88
|
+
'md',
|
|
89
|
+
);
|
|
90
|
+
});
|
|
91
|
+
|
|
41
92
|
it('calls onSend when clicked', () => {
|
|
42
93
|
const onSend = vi.fn();
|
|
43
94
|
render(<ChatSendButton isDisabled={false} onSend={onSend} />);
|
|
@@ -45,13 +96,53 @@ describe('ChatSendButton', () => {
|
|
|
45
96
|
expect(onSend).toHaveBeenCalledTimes(1);
|
|
46
97
|
});
|
|
47
98
|
|
|
48
|
-
it('
|
|
99
|
+
it('composes the consumer onClick with onSend', () => {
|
|
100
|
+
const onClick = vi.fn();
|
|
101
|
+
const onSend = vi.fn();
|
|
102
|
+
render(
|
|
103
|
+
<ChatSendButton isDisabled={false} onClick={onClick} onSend={onSend} />,
|
|
104
|
+
);
|
|
105
|
+
fireEvent.click(screen.getByRole('button', {name: 'Send'}));
|
|
106
|
+
expect(onClick).toHaveBeenCalledTimes(1);
|
|
107
|
+
expect(onSend).toHaveBeenCalledTimes(1);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('runs onSend exactly once before a consumer click prevents default', () => {
|
|
111
|
+
const order: string[] = [];
|
|
112
|
+
const onSend = vi.fn(() => order.push('send'));
|
|
113
|
+
const onClick = vi.fn(event => {
|
|
114
|
+
order.push('click');
|
|
115
|
+
event.preventDefault();
|
|
116
|
+
});
|
|
117
|
+
render(
|
|
118
|
+
<ChatSendButton isDisabled={false} onClick={onClick} onSend={onSend} />,
|
|
119
|
+
);
|
|
120
|
+
fireEvent.click(screen.getByRole('button', {name: 'Send'}));
|
|
121
|
+
expect(order).toEqual(['send', 'click']);
|
|
122
|
+
expect(onSend).toHaveBeenCalledTimes(1);
|
|
123
|
+
expect(onClick).toHaveBeenCalledTimes(1);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('supports native Enter and Space activation', async () => {
|
|
127
|
+
const user = userEvent.setup();
|
|
128
|
+
const onSend = vi.fn();
|
|
129
|
+
render(<ChatSendButton isDisabled={false} onSend={onSend} />);
|
|
130
|
+
const button = screen.getByRole('button', {name: 'Send'});
|
|
131
|
+
button.focus();
|
|
132
|
+
await user.keyboard('{Enter}');
|
|
133
|
+
await user.keyboard(' ');
|
|
134
|
+
expect(onSend).toHaveBeenCalledTimes(2);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it('swallows both state and consumer clicks while disabled', () => {
|
|
49
138
|
// isDisabled already defaults true here (no composer context), so this
|
|
50
139
|
// pins the click routing through a disabled Button, not the prop.
|
|
51
140
|
const onSend = vi.fn();
|
|
52
|
-
|
|
141
|
+
const onClick = vi.fn();
|
|
142
|
+
render(<ChatSendButton onClick={onClick} onSend={onSend} />);
|
|
53
143
|
fireEvent.click(screen.getByRole('button', {name: 'Send'}));
|
|
54
144
|
expect(onSend).not.toHaveBeenCalled();
|
|
145
|
+
expect(onClick).not.toHaveBeenCalled();
|
|
55
146
|
});
|
|
56
147
|
|
|
57
148
|
it('styles the send state as a primary button', () => {
|
|
@@ -133,6 +224,38 @@ describe('ChatSendButton', () => {
|
|
|
133
224
|
expect(onSend).not.toHaveBeenCalled();
|
|
134
225
|
});
|
|
135
226
|
|
|
227
|
+
it('composes the consumer onClick with onStop', () => {
|
|
228
|
+
const onClick = vi.fn();
|
|
229
|
+
const onStop = vi.fn();
|
|
230
|
+
render(<ChatSendButton isStopShown onClick={onClick} onStop={onStop} />);
|
|
231
|
+
fireEvent.click(screen.getByRole('button', {name: 'Stop'}));
|
|
232
|
+
expect(onClick).toHaveBeenCalledTimes(1);
|
|
233
|
+
expect(onStop).toHaveBeenCalledTimes(1);
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
it('runs onStop exactly once before a consumer click prevents default', () => {
|
|
237
|
+
const order: string[] = [];
|
|
238
|
+
const onStop = vi.fn(() => order.push('stop'));
|
|
239
|
+
const onClick = vi.fn(event => {
|
|
240
|
+
order.push('click');
|
|
241
|
+
event.preventDefault();
|
|
242
|
+
});
|
|
243
|
+
render(<ChatSendButton isStopShown onClick={onClick} onStop={onStop} />);
|
|
244
|
+
fireEvent.click(screen.getByRole('button', {name: 'Stop'}));
|
|
245
|
+
expect(order).toEqual(['stop', 'click']);
|
|
246
|
+
expect(onStop).toHaveBeenCalledTimes(1);
|
|
247
|
+
expect(onClick).toHaveBeenCalledTimes(1);
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
it('remains an enabled no-op without onStop while generic onClick still runs', () => {
|
|
251
|
+
const onClick = vi.fn();
|
|
252
|
+
render(<ChatSendButton isStopShown onClick={onClick} />);
|
|
253
|
+
const stop = screen.getByRole('button', {name: 'Stop'});
|
|
254
|
+
expect(stop).toBeEnabled();
|
|
255
|
+
fireEvent.click(stop);
|
|
256
|
+
expect(onClick).toHaveBeenCalledTimes(1);
|
|
257
|
+
});
|
|
258
|
+
|
|
136
259
|
it('resolves its default icon from the registry stop entry', () => {
|
|
137
260
|
registerIcons({
|
|
138
261
|
stop: (
|
|
@@ -180,10 +303,7 @@ describe('ChatSendButton', () => {
|
|
|
180
303
|
expect(send).toBeEnabled();
|
|
181
304
|
|
|
182
305
|
fireEvent.click(send);
|
|
183
|
-
|
|
184
|
-
// button's behavior. The submitted value comes from the composer's own
|
|
185
|
-
// state, not from here, so asserting it would pin ChatComposer instead.
|
|
186
|
-
expect(onSubmit).toHaveBeenCalledTimes(1);
|
|
306
|
+
expect(onSubmit).toHaveBeenCalledWith('hello');
|
|
187
307
|
});
|
|
188
308
|
});
|
|
189
309
|
});
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
*
|
|
11
11
|
* Reads composer state from ChatComposerContext by default so it "just
|
|
12
12
|
* works" inside ChatComposer. All context-derived values can be
|
|
13
|
-
* overridden via props for standalone usage.
|
|
13
|
+
* overridden via props for standalone usage. Accepted `onClick` handlers
|
|
14
|
+
* compose after the selected send or stop action.
|
|
14
15
|
*
|
|
15
16
|
* States:
|
|
16
17
|
* - **Send** — accent/primary, arrowUp icon, disabled when nothing to send.
|
|
@@ -24,7 +25,7 @@ import {useIcon} from '../Icon';
|
|
|
24
25
|
import {useChatComposerContext} from './ChatContext';
|
|
25
26
|
|
|
26
27
|
import type {BaseProps} from '../BaseProps';
|
|
27
|
-
import {mergeProps} from '../utils';
|
|
28
|
+
import {composeEventHandlers, mergeProps} from '../utils';
|
|
28
29
|
import {themeProps} from '../utils/themeProps';
|
|
29
30
|
import {useTranslator} from '../i18n';
|
|
30
31
|
|
|
@@ -85,6 +86,7 @@ export function ChatSendButton(props: ChatSendButtonProps): ReactNode {
|
|
|
85
86
|
isDisabled = !(context?.canSend ?? false),
|
|
86
87
|
onSend,
|
|
87
88
|
onStop = context?.onStop,
|
|
89
|
+
onClick,
|
|
88
90
|
sendIcon,
|
|
89
91
|
stopIcon,
|
|
90
92
|
size = 'md',
|
|
@@ -95,7 +97,7 @@ export function ChatSendButton(props: ChatSendButtonProps): ReactNode {
|
|
|
95
97
|
...rest
|
|
96
98
|
} = props;
|
|
97
99
|
|
|
98
|
-
const handleSend = onSend ?? (() => context?.onSubmit(
|
|
100
|
+
const handleSend = onSend ?? (() => context?.onSubmit(context.value));
|
|
99
101
|
const defaultStopIcon = useIcon('stop');
|
|
100
102
|
const defaultSendIcon = useIcon('arrowUp');
|
|
101
103
|
|
|
@@ -116,7 +118,7 @@ export function ChatSendButton(props: ChatSendButtonProps): ReactNode {
|
|
|
116
118
|
}
|
|
117
119
|
isIconOnly
|
|
118
120
|
isDisabled={!isStopShown && isDisabled}
|
|
119
|
-
onClick={isStopShown ? onStop : handleSend}
|
|
121
|
+
onClick={composeEventHandlers(isStopShown ? onStop : handleSend, onClick)}
|
|
120
122
|
{...rest}
|
|
121
123
|
{...mergeProps(themeProps('chat-send-button'), {className}, style)}
|
|
122
124
|
xstyle={[styles.root, xstyle]}
|
|
@@ -6,24 +6,28 @@ export const docs = {
|
|
|
6
6
|
name: 'ChatSystemMessage',
|
|
7
7
|
subComponentOf: 'Chat',
|
|
8
8
|
displayName: 'Chat System Message',
|
|
9
|
-
description:
|
|
9
|
+
description:
|
|
10
|
+
'Centered system message for non-sender content like date separators, membership changes, and status notices. It is not a chat bubble; it has no avatar, no alignment, and no sender context. Use the divider variant for temporal breaks and default for inline status updates.',
|
|
10
11
|
props: [
|
|
11
12
|
{
|
|
12
13
|
name: 'children',
|
|
13
14
|
type: 'ReactNode',
|
|
14
|
-
description:
|
|
15
|
+
description:
|
|
16
|
+
'System message content: factual text or React content such as a date, join/leave notice, or status change. Long default content wraps within the available width.',
|
|
15
17
|
required: true,
|
|
16
18
|
},
|
|
17
19
|
{
|
|
18
20
|
name: 'variant',
|
|
19
21
|
type: "'default' | 'divider'",
|
|
20
|
-
description:
|
|
22
|
+
description:
|
|
23
|
+
"Visual variant. 'default' renders centered text. 'divider' adds horizontal lines on each side via Divider: use for date separators and section breaks.",
|
|
21
24
|
default: "'default'",
|
|
22
25
|
},
|
|
23
26
|
{
|
|
24
27
|
name: 'icon',
|
|
25
28
|
type: 'ReactNode',
|
|
26
|
-
description:
|
|
29
|
+
description:
|
|
30
|
+
'Optional caller-provided icon content. Rendered before the message in the default variant; the divider variant currently does not render it. Wrap in Icon for consistent sizing.',
|
|
27
31
|
slotElements: [
|
|
28
32
|
{
|
|
29
33
|
__element: 'Icon',
|
|
@@ -34,27 +38,126 @@ export const docs = {
|
|
|
34
38
|
},
|
|
35
39
|
],
|
|
36
40
|
},
|
|
41
|
+
{
|
|
42
|
+
name: 'xstyle',
|
|
43
|
+
type: 'StyleXStyles',
|
|
44
|
+
description:
|
|
45
|
+
'StyleX styles for layout customization. Must be a stylex.create() value: not an inline style object like style={{}}.',
|
|
46
|
+
},
|
|
37
47
|
],
|
|
48
|
+
theming: {
|
|
49
|
+
targets: [
|
|
50
|
+
{className: 'astryx-chat-system-message', visualProps: ['variant']},
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
usage: {
|
|
54
|
+
description:
|
|
55
|
+
'Use ChatSystemMessage for concise, non-sender content inside a chat transcript. Choose the default variant for factual status notices and the divider variant for date or section breaks. Long default content wraps within the available width. The component exposes status semantics and the divider branch includes a labelled separator.',
|
|
56
|
+
bestPractices: [
|
|
57
|
+
{
|
|
58
|
+
guidance: true,
|
|
59
|
+
description:
|
|
60
|
+
'Keep the visible message concise and self-contained so it remains understandable without an icon.',
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
guidance: true,
|
|
64
|
+
description:
|
|
65
|
+
'Use the divider variant for temporal or section boundaries and the default variant for factual status notices.',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
guidance: false,
|
|
69
|
+
description:
|
|
70
|
+
'Use ChatSystemMessage for sender-authored content; use ChatMessage and ChatMessageBubble instead.',
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
guidance: false,
|
|
74
|
+
description:
|
|
75
|
+
'Use caller-provided icon artwork as the only source of meaning; the visible message must carry the same information.',
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
anatomy: [
|
|
79
|
+
{
|
|
80
|
+
name: 'System message',
|
|
81
|
+
required: true,
|
|
82
|
+
description:
|
|
83
|
+
'The noninteractive status row that carries the chat-system-message theme target.',
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: 'Content',
|
|
87
|
+
required: true,
|
|
88
|
+
description: 'The concise caller-provided message or divider label.',
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: 'Icon content',
|
|
92
|
+
required: false,
|
|
93
|
+
description:
|
|
94
|
+
'Rendered before the message in the default variant; the divider variant currently does not render it.',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: 'Divider',
|
|
98
|
+
required: false,
|
|
99
|
+
description:
|
|
100
|
+
'A labelled horizontal Divider rendered by the divider variant.',
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
},
|
|
38
104
|
};
|
|
39
105
|
|
|
40
106
|
export const docsZh = {
|
|
41
107
|
name: 'ChatSystemMessage',
|
|
42
108
|
displayName: 'Chat System Message',
|
|
43
|
-
description:
|
|
109
|
+
description:
|
|
110
|
+
'居中的系统消息,用于日期分隔、成员变更和状态通知等非发送者内容。没有头像、对齐或气泡。使用 divider 变体做时间分隔,default 做内联状态更新。',
|
|
44
111
|
propDescriptions: {
|
|
45
|
-
children:
|
|
46
|
-
|
|
47
|
-
|
|
112
|
+
children:
|
|
113
|
+
'事实性系统消息内容,如日期、加入/离开通知或状态变更;较长的 default 内容会在可用宽度内换行。',
|
|
114
|
+
variant:
|
|
115
|
+
"视觉变体。'default' 渲染居中文本。'divider' 通过 Divider 在两侧添加水平线,用于日期分隔和段落分隔。",
|
|
116
|
+
icon: '可选的调用方图标内容。default 变体会在消息前渲染;divider 变体当前不会渲染。使用 Icon 包裹以获得一致的尺寸。',
|
|
117
|
+
xstyle: '用于布局自定义的 StyleX 样式。',
|
|
118
|
+
},
|
|
119
|
+
theming: {
|
|
120
|
+
targets: [
|
|
121
|
+
{className: 'astryx-chat-system-message', visualProps: ['variant']},
|
|
122
|
+
],
|
|
48
123
|
},
|
|
49
124
|
};
|
|
50
125
|
|
|
51
126
|
export const docsDense = {
|
|
52
127
|
name: 'ChatSystemMessage',
|
|
53
128
|
displayName: 'Chat System Message',
|
|
54
|
-
description:
|
|
129
|
+
description:
|
|
130
|
+
'centered non-sender msg; divider variant for date breaks, default for status notices; accepts optional icon content',
|
|
131
|
+
usage: {
|
|
132
|
+
description:
|
|
133
|
+
'Use for concise non-sender content in chat. Default is a factual status row; divider is a labelled date/section break.',
|
|
134
|
+
bestPractices: [
|
|
135
|
+
{
|
|
136
|
+
guidance: true,
|
|
137
|
+
description: 'Keep visible content concise and self-contained.',
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
guidance: true,
|
|
141
|
+
description:
|
|
142
|
+
'Use divider for temporal/section boundaries and default for factual notices.',
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
guidance: false,
|
|
146
|
+
description:
|
|
147
|
+
'Use for sender-authored content; use ChatMessage and ChatMessageBubble.',
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
guidance: false,
|
|
151
|
+
description: 'Rely on icon artwork as the only source of meaning.',
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
},
|
|
55
155
|
propDescriptions: {
|
|
56
|
-
children:
|
|
57
|
-
|
|
58
|
-
|
|
156
|
+
children:
|
|
157
|
+
'factual React content: date, join/leave, status change; long default content wraps',
|
|
158
|
+
variant:
|
|
159
|
+
'default=centered text, divider=horizontal lines via Divider for date/section breaks',
|
|
160
|
+
icon: 'optional caller icon; rendered before default message; divider currently does not render it',
|
|
161
|
+
xstyle: 'additional StyleX layout styles',
|
|
59
162
|
},
|
|
60
163
|
};
|