@astryxdesign/core 0.1.8 → 0.1.9-canary.02ef052
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 +100 -0
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +6 -2
- package/dist/AppShell/AppShellMobileContext.d.ts +8 -0
- package/dist/AppShell/AppShellMobileContext.d.ts.map +1 -1
- package/dist/Avatar/Avatar.d.ts +58 -3
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +240 -53
- package/dist/Avatar/AvatarStatusDot.d.ts +35 -5
- package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
- package/dist/Avatar/AvatarStatusDot.js +144 -19
- package/dist/AvatarGroup/AvatarGroup.d.ts +7 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +58 -6
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +1 -0
- package/dist/Banner/Banner.d.ts +9 -1
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +33 -4
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +31 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +215 -6
- package/dist/Breadcrumbs/index.d.ts +6 -0
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +10 -1
- package/dist/Button/Button.d.ts +8 -2
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +33 -4
- package/dist/ButtonGroup/ButtonGroup.d.ts +9 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +30 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +80 -11
- package/dist/Calendar/dayCellUtils.d.ts +4 -4
- package/dist/Calendar/dayCellUtils.js +3 -3
- package/dist/Calendar/styles.d.ts +30 -31
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +30 -31
- package/dist/Card/Card.d.ts +8 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +28 -2
- package/dist/Carousel/Carousel.d.ts +4 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +46 -16
- package/dist/Chat/ChatComposer.d.ts +8 -0
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +46 -7
- package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
- package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
- package/dist/Chat/ChatComposerDrawer.js +11 -1
- package/dist/Chat/ChatComposerInput.d.ts +20 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +36 -4
- package/dist/Chat/ChatContext.d.ts +33 -0
- package/dist/Chat/ChatContext.d.ts.map +1 -1
- package/dist/Chat/ChatContext.js +16 -2
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +4 -2
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +4 -4
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +4 -4
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +7 -1
- package/dist/Chat/ChatToolCalls.d.ts +5 -1
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +27 -11
- package/dist/Chat/index.d.ts +2 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/index.js +1 -1
- package/dist/Chat/useChatStreamScroll.d.ts +2 -1
- package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
- package/dist/Chat/useChatStreamScroll.js +22 -8
- package/dist/Chat/useSpeechRecognition.d.ts +0 -1
- package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
- package/dist/Chat/useSpeechRecognition.js +1 -1
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +2 -2
- package/dist/CheckboxInput/CheckboxInput.js +5 -5
- package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +11 -1
- package/dist/Citation/Citation.d.ts +22 -1
- package/dist/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +20 -6
- package/dist/ClickableCard/ClickableCard.d.ts +9 -2
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +5 -2
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +22 -9
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +3 -1
- package/dist/CommandPalette/CommandPalette.d.ts +2 -2
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +45 -4
- package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
- package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +6 -1
- package/dist/CommandPalette/CommandPaletteItem.js +1 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +14 -5
- package/dist/ContextMenu/index.d.ts +1 -0
- package/dist/ContextMenu/index.d.ts.map +1 -1
- package/dist/ContextMenu/index.js +3 -1
- package/dist/DateInput/DateInput.d.ts +56 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +59 -21
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.d.ts +10 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +23 -20
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +33 -19
- package/dist/Dialog/Dialog.d.ts +3 -0
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +57 -6
- package/dist/Dialog/DialogContext.d.ts +7 -0
- package/dist/Dialog/DialogContext.d.ts.map +1 -1
- package/dist/Dialog/DialogContext.js +2 -2
- package/dist/Dialog/DialogHeader.d.ts +5 -2
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +6 -1
- package/dist/Divider/Divider.js +1 -1
- package/dist/DropdownMenu/DropdownMenu.d.ts +6 -0
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +22 -5
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +5 -3
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +5 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +4 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +104 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +427 -0
- package/dist/DropdownMenu/index.d.ts +10 -0
- package/dist/DropdownMenu/index.d.ts.map +1 -1
- package/dist/DropdownMenu/index.js +13 -0
- package/dist/DropdownMenu/menuItemHover.d.ts +23 -0
- package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -0
- package/dist/DropdownMenu/menuItemHover.js +33 -0
- package/dist/DropdownMenu/menuItemRoles.d.ts +8 -0
- package/dist/DropdownMenu/menuItemRoles.d.ts.map +1 -1
- package/dist/DropdownMenu/menuItemRoles.js +10 -1
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +21 -6
- package/dist/Field/Field.d.ts +3 -1
- package/dist/Field/Field.d.ts.map +1 -1
- package/dist/Field/Field.js +6 -4
- package/dist/Field/FieldLabel.d.ts +1 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +43 -16
- package/dist/Field/inputStyles.stylex.d.ts +1 -0
- package/dist/Field/inputStyles.stylex.d.ts.map +1 -1
- package/dist/Field/inputStyles.stylex.js +1 -0
- package/dist/FieldStatus/FieldStatus.d.ts +18 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +60 -6
- package/dist/FileInput/FileInput.d.ts +10 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +54 -35
- package/dist/HoverCard/HoverCard.d.ts +9 -1
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +2 -0
- package/dist/HoverCard/useHoverCard.d.ts +8 -0
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +17 -6
- package/dist/Icon/Icon.d.ts +22 -3
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +19 -3
- package/dist/Item/Item.d.ts +6 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +22 -1
- package/dist/Layer/useLayer.d.ts +6 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +2 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +19 -13
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +7 -0
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +6 -1
- package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
- package/dist/MobileNav/MobileNavToggle.js +4 -0
- package/dist/MultiSelector/MultiSelector.d.ts +9 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +104 -50
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +16 -0
- package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
- package/dist/NumberInput/NumberInput.d.ts +10 -2
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +22 -17
- package/dist/Outline/Outline.d.ts +0 -1
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +0 -1
- package/dist/OverflowList/OverflowList.d.ts +20 -3
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +29 -4
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +11 -3
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +3 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +3 -9
- package/dist/PowerSearch/PowerSearch.d.ts +9 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +2 -0
- package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/RadioList/RadioList.d.ts +2 -2
- package/dist/RadioList/RadioListItem.js +4 -4
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +2 -1
- package/dist/SelectableCard/SelectableCard.d.ts +9 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +16 -13
- package/dist/Selector/Selector.d.ts +8 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +65 -19
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +16 -0
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +5 -5
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +13 -10
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +21 -8
- package/dist/SideNav/SideNavItem.d.ts +1 -1
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +12 -10
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +106 -36
- package/dist/Stack/stack.stylex.d.ts +9 -9
- package/dist/Switch/Switch.d.ts +8 -1
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +160 -91
- package/dist/TabList/Tab.js +2 -2
- package/dist/TabList/TabMenu.js +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +33 -6
- package/dist/Table/TableCell.js +3 -3
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/index.d.ts +2 -0
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +15 -11
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +36 -26
- package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
- package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/index.js +3 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +7 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +105 -12
- package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
- package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
- package/dist/Table/types.d.ts +32 -0
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -3
- package/dist/TextArea/TextArea.d.ts +10 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +18 -19
- package/dist/TextInput/TextInput.d.ts +10 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +20 -17
- package/dist/Thumbnail/Thumbnail.d.ts +26 -5
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +97 -54
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
- package/dist/TimeInput/TimeInput.d.ts +10 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +32 -21
- package/dist/Timestamp/Timestamp.d.ts +3 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +8 -6
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +2 -5
- package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
- package/dist/Token/Token.d.ts +30 -3
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +17 -2
- package/dist/Token/index.d.ts +1 -1
- package/dist/Token/index.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.d.ts +10 -3
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +20 -6
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +17 -1
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +18 -8
- package/dist/TopNav/TopNavMegaMenu.js +10 -4
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
- package/dist/TopNav/TopNavMenu.d.ts +2 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +68 -6
- package/dist/TreeList/TreeList.d.ts +12 -3
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +3 -0
- package/dist/TreeList/TreeListBranches.d.ts +5 -0
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +18 -10
- package/dist/TreeList/TreeListItem.d.ts +8 -2
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +59 -21
- package/dist/TreeList/TreeListTypes.d.ts +25 -1
- package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
- package/dist/TreeList/index.d.ts +2 -2
- package/dist/TreeList/index.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +20 -11
- package/dist/Typeahead/Typeahead.d.ts +9 -2
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +3 -1
- package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
- package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
- package/dist/Typeahead/TypeaheadItem.js +20 -10
- package/dist/astryx.css +61 -39
- package/dist/astryx.umd.js +53 -53
- package/dist/astryx.umd.js.map +4 -4
- package/dist/authoring/doc.d.ts.map +1 -1
- package/dist/docs-types.d.ts +8 -0
- package/dist/docs-types.d.ts.map +1 -1
- package/dist/hooks/computeOverflow.d.ts +47 -0
- package/dist/hooks/computeOverflow.d.ts.map +1 -0
- package/dist/hooks/computeOverflow.js +213 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -1
- package/dist/hooks/isRtlElement.d.ts +18 -0
- package/dist/hooks/isRtlElement.d.ts.map +1 -0
- package/dist/hooks/isRtlElement.js +27 -0
- package/dist/hooks/useDevWarning.d.ts +18 -0
- package/dist/hooks/useDevWarning.d.ts.map +1 -0
- package/dist/hooks/useDevWarning.js +49 -0
- package/dist/hooks/useGridFocus.d.ts +6 -1
- package/dist/hooks/useGridFocus.d.ts.map +1 -1
- package/dist/hooks/useGridFocus.js +12 -9
- package/dist/hooks/useInputStatusIcon.d.ts +38 -0
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -0
- package/dist/hooks/useInputStatusIcon.js +158 -0
- package/dist/hooks/useListFocus.d.ts +39 -1
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useListFocus.js +54 -9
- package/dist/hooks/useOverflow.d.ts +19 -0
- package/dist/hooks/useOverflow.d.ts.map +1 -1
- package/dist/hooks/useOverflow.js +36 -25
- package/dist/i18n/InternationalizationContext.d.ts +1 -0
- package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
- package/dist/i18n/InternationalizationContext.js +3 -0
- package/dist/i18n/InternationalizationProvider.d.ts +8 -1
- package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
- package/dist/i18n/InternationalizationProvider.js +5 -1
- package/dist/i18n/getLocaleDirection.d.ts +18 -0
- package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
- package/dist/i18n/getLocaleDirection.js +29 -0
- package/dist/i18n/index.d.ts +6 -0
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +7 -1
- package/dist/i18n/resolve.d.ts.map +1 -1
- package/dist/i18n/resolve.js +7 -18
- package/dist/i18n/useDirection.d.ts +2 -0
- package/dist/i18n/useDirection.d.ts.map +1 -0
- package/dist/i18n/useDirection.js +27 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +2 -7
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +13 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +51 -0
- package/dist/theme/hct.d.ts +0 -1
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
- package/dist/utils/devWarning.d.ts +42 -0
- package/dist/utils/devWarning.d.ts.map +1 -0
- package/dist/utils/devWarning.js +88 -0
- package/dist/utils/index.d.ts +4 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -2
- package/dist/utils/plainDate.d.ts +30 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +65 -3
- package/dist/utils/rtlStyles.d.ts +24 -0
- package/dist/utils/rtlStyles.d.ts.map +1 -0
- package/dist/utils/rtlStyles.js +27 -0
- package/dist/utils/types.d.ts +13 -0
- package/dist/utils/types.d.ts.map +1 -1
- package/locales/en.json +104 -0
- package/locales/fr-FR.json +14 -0
- package/locales/pseudo.json +78 -0
- package/package.json +6 -1
- package/src/AppShell/AppShell.tsx +6 -0
- package/src/AppShell/AppShellMobileContext.tsx +8 -0
- package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
- package/src/Avatar/Avatar.doc.mjs +64 -5
- package/src/Avatar/Avatar.test.tsx +374 -1
- package/src/Avatar/Avatar.tsx +367 -69
- package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
- package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
- package/src/Avatar/AvatarStatusDot.tsx +180 -21
- package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
- package/src/AvatarGroup/AvatarGroup.test.tsx +141 -1
- package/src/AvatarGroup/AvatarGroup.tsx +58 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
- package/src/Banner/Banner.doc.mjs +9 -0
- package/src/Banner/Banner.test.tsx +30 -0
- package/src/Banner/Banner.tsx +53 -9
- package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
- package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
- package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +335 -2
- package/src/Breadcrumbs/index.ts +31 -0
- package/src/Button/Button.doc.mjs +9 -4
- package/src/Button/Button.test.tsx +49 -0
- package/src/Button/Button.tsx +27 -3
- package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
- package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
- package/src/ButtonGroup/ButtonGroup.tsx +32 -0
- package/src/Calendar/Calendar.doc.mjs +12 -1
- package/src/Calendar/Calendar.test.tsx +362 -19
- package/src/Calendar/Calendar.tsx +111 -32
- package/src/Calendar/dayCellUtils.test.ts +23 -18
- package/src/Calendar/dayCellUtils.ts +3 -3
- package/src/Calendar/styles.ts +33 -39
- package/src/Card/Card.doc.mjs +9 -0
- package/src/Card/Card.test.tsx +21 -3
- package/src/Card/Card.tsx +35 -2
- package/src/Carousel/Carousel.doc.mjs +1 -0
- package/src/Carousel/Carousel.test.tsx +53 -0
- package/src/Carousel/Carousel.tsx +59 -10
- package/src/Chat/ChatComposer.doc.mjs +12 -3
- package/src/Chat/ChatComposer.test.tsx +115 -0
- package/src/Chat/ChatComposer.tsx +73 -9
- package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
- package/src/Chat/ChatComposerDrawer.tsx +11 -1
- package/src/Chat/ChatComposerInput.doc.mjs +7 -0
- package/src/Chat/ChatComposerInput.test.tsx +103 -0
- package/src/Chat/ChatComposerInput.tsx +51 -5
- package/src/Chat/ChatContext.tsx +37 -10
- package/src/Chat/ChatDictationButton.tsx +11 -2
- package/src/Chat/ChatLayout.tsx +7 -5
- package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
- package/src/Chat/ChatMessageMetadata.tsx +1 -2
- package/src/Chat/ChatSendButton.tsx +11 -1
- package/src/Chat/ChatToolCalls.test.tsx +64 -0
- package/src/Chat/ChatToolCalls.tsx +33 -5
- package/src/Chat/index.ts +5 -1
- package/src/Chat/useChatStreamScroll.test.tsx +49 -0
- package/src/Chat/useChatStreamScroll.ts +27 -10
- package/src/Chat/useSpeechRecognition.ts +1 -1
- package/src/Chat/useTriggerMenu.tsx +4 -2
- package/src/CheckboxInput/CheckboxInput.doc.mjs +6 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
- package/src/CheckboxInput/CheckboxInput.tsx +5 -5
- package/src/CheckboxList/CheckboxList.doc.mjs +6 -0
- package/src/CheckboxList/CheckboxList.test.tsx +81 -3
- package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
- package/src/CheckboxList/CheckboxListItem.tsx +41 -5
- package/src/Citation/Citation.doc.mjs +4 -3
- package/src/Citation/Citation.test.tsx +97 -0
- package/src/Citation/Citation.tsx +43 -11
- package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
- package/src/ClickableCard/ClickableCard.test.tsx +34 -0
- package/src/ClickableCard/ClickableCard.tsx +13 -3
- package/src/CodeBlock/CodeBlock.test.tsx +56 -0
- package/src/CodeBlock/CodeBlock.tsx +45 -10
- package/src/Collapsible/Collapsible.doc.mjs +1 -0
- package/src/Collapsible/Collapsible.test.tsx +7 -0
- package/src/Collapsible/Collapsible.tsx +16 -6
- package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
- package/src/CommandPalette/CommandPalette.test.tsx +95 -1
- package/src/CommandPalette/CommandPalette.tsx +44 -3
- package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
- package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
- package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
- package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
- package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
- package/src/ContextMenu/ContextMenu.test.tsx +235 -0
- package/src/ContextMenu/ContextMenu.tsx +13 -11
- package/src/ContextMenu/index.ts +5 -0
- package/src/DateInput/DateInput.doc.mjs +41 -0
- package/src/DateInput/DateInput.test.tsx +338 -0
- package/src/DateInput/DateInput.tsx +119 -32
- package/src/DateInput/index.ts +1 -0
- package/src/DateRangeInput/DateRangeInput.doc.mjs +16 -0
- package/src/DateRangeInput/DateRangeInput.test.tsx +140 -0
- package/src/DateRangeInput/DateRangeInput.tsx +42 -30
- package/src/DateTimeInput/DateTimeInput.doc.mjs +22 -1
- package/src/DateTimeInput/DateTimeInput.test.tsx +147 -0
- package/src/DateTimeInput/DateTimeInput.tsx +58 -41
- package/src/Dialog/Dialog.doc.mjs +2 -2
- package/src/Dialog/Dialog.test.tsx +77 -4
- package/src/Dialog/Dialog.tsx +89 -5
- package/src/Dialog/DialogContext.ts +9 -2
- package/src/Dialog/DialogHeader.doc.mjs +2 -2
- package/src/Dialog/DialogHeader.tsx +9 -2
- package/src/Divider/Divider.tsx +2 -2
- package/src/DropdownMenu/DropdownMenu.test.tsx +229 -0
- package/src/DropdownMenu/DropdownMenu.tsx +31 -12
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +9 -4
- package/src/DropdownMenu/DropdownMenuItem.tsx +9 -3
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +8 -2
- package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +88 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +635 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +553 -0
- package/src/DropdownMenu/index.ts +16 -0
- package/src/DropdownMenu/menuItemHover.ts +39 -0
- package/src/DropdownMenu/menuItemRoles.ts +9 -0
- package/src/DropdownMenu/renderDropdownItems.tsx +29 -15
- package/src/Field/Field.test.tsx +57 -12
- package/src/Field/Field.tsx +20 -14
- package/src/Field/FieldLabel.tsx +9 -1
- package/src/Field/inputStyles.stylex.ts +2 -0
- package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
- package/src/FieldStatus/FieldStatus.test.tsx +150 -40
- package/src/FieldStatus/FieldStatus.tsx +69 -5
- package/src/FileInput/FileInput.doc.mjs +23 -2
- package/src/FileInput/FileInput.test.tsx +135 -12
- package/src/FileInput/FileInput.tsx +65 -51
- package/src/HoverCard/HoverCard.doc.mjs +13 -0
- package/src/HoverCard/HoverCard.test.tsx +21 -2
- package/src/HoverCard/HoverCard.tsx +11 -0
- package/src/HoverCard/useHoverCard.doc.mjs +2 -0
- package/src/HoverCard/useHoverCard.tsx +39 -5
- package/src/Icon/Icon.doc.mjs +16 -2
- package/src/Icon/Icon.test.tsx +89 -0
- package/src/Icon/Icon.tsx +58 -5
- package/src/IconButton/IconButton.doc.mjs +8 -0
- package/src/IconButton/IconButton.test.tsx +15 -18
- package/src/Item/Item.test.tsx +40 -18
- package/src/Item/Item.tsx +38 -2
- package/src/Layer/useLayer.tsx +8 -0
- package/src/Lightbox/Lightbox.tsx +15 -7
- package/src/List/List.test.tsx +9 -8
- package/src/Markdown/Markdown.test.tsx +21 -0
- package/src/Markdown/Markdown.tsx +4 -0
- package/src/MobileNav/MobileNav.tsx +12 -1
- package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
- package/src/MobileNav/MobileNavToggle.tsx +9 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +24 -2
- package/src/MultiSelector/MultiSelector.test.tsx +498 -3
- package/src/MultiSelector/MultiSelector.tsx +149 -65
- package/src/MultiSelector/hooks.ts +17 -0
- package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
- package/src/NumberInput/NumberInput.doc.mjs +21 -0
- package/src/NumberInput/NumberInput.test.tsx +82 -7
- package/src/NumberInput/NumberInput.tsx +36 -28
- package/src/Outline/Outline.tsx +0 -1
- package/src/OverflowList/OverflowList.doc.mjs +39 -6
- package/src/OverflowList/OverflowList.test.tsx +111 -0
- package/src/OverflowList/OverflowList.tsx +48 -8
- package/src/Pagination/Pagination.tsx +11 -3
- package/src/Popover/Popover.tsx +7 -4
- package/src/Popover/usePopover.tsx +9 -13
- package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
- package/src/PowerSearch/PowerSearch.test.tsx +43 -0
- package/src/PowerSearch/PowerSearch.tsx +10 -1
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
- package/src/PowerSearch/usePowerSearchSource.ts +1 -2
- package/src/RadioList/RadioList.doc.mjs +6 -0
- package/src/RadioList/RadioList.tsx +2 -2
- package/src/RadioList/RadioListItem.tsx +4 -4
- package/src/SegmentedControl/SegmentedControlItem.tsx +2 -0
- package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
- package/src/SelectableCard/SelectableCard.test.tsx +46 -4
- package/src/SelectableCard/SelectableCard.tsx +29 -16
- package/src/Selector/Selector.doc.mjs +15 -0
- package/src/Selector/Selector.test.tsx +417 -0
- package/src/Selector/Selector.tsx +86 -21
- package/src/Selector/hooks.ts +17 -0
- package/src/SideNav/SideNav.test.tsx +119 -3
- package/src/SideNav/SideNav.tsx +1 -8
- package/src/SideNav/SideNavCollapseButton.tsx +15 -8
- package/src/SideNav/SideNavHeading.tsx +24 -8
- package/src/SideNav/SideNavItem.tsx +10 -4
- package/src/Slider/Slider.doc.mjs +6 -0
- package/src/Slider/Slider.test.tsx +314 -13
- package/src/Slider/Slider.tsx +117 -28
- package/src/Switch/Switch.doc.mjs +142 -42
- package/src/Switch/Switch.test.tsx +54 -1
- package/src/Switch/Switch.tsx +90 -33
- package/src/TabList/Tab.tsx +2 -2
- package/src/TabList/TabMenu.tsx +2 -2
- package/src/Table/BaseTable.tsx +37 -7
- package/src/Table/Table.doc.mjs +11 -0
- package/src/Table/Table.test.tsx +85 -0
- package/src/Table/TableCell.tsx +3 -3
- package/src/Table/TableHeaderCell.tsx +3 -3
- package/src/Table/index.ts +5 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +15 -8
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +24 -17
- package/src/Table/plugins/rowStatus/index.ts +7 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
- package/src/Table/plugins/selection/useTableSelection.test.tsx +77 -3
- package/src/Table/plugins/selection/useTableSelection.tsx +22 -1
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
- package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
- package/src/Table/plugins/tree/useTableTreeData.tsx +139 -8
- package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
- package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
- package/src/Table/types.ts +33 -0
- package/src/Table/useBaseTablePlugins.ts +10 -6
- package/src/Table/useTableRowStatus.doc.mjs +30 -0
- package/src/Table/useTableSelection.doc.mjs +65 -14
- package/src/Table/useTableTreeData.doc.mjs +29 -0
- package/src/Table/useTableTreeState.doc.mjs +2 -2
- package/src/TextArea/TextArea.doc.mjs +21 -0
- package/src/TextArea/TextArea.test.tsx +32 -1
- package/src/TextArea/TextArea.tsx +27 -26
- package/src/TextInput/TextInput.doc.mjs +21 -0
- package/src/TextInput/TextInput.test.tsx +150 -0
- package/src/TextInput/TextInput.tsx +28 -25
- package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
- package/src/Thumbnail/Thumbnail.test.tsx +98 -7
- package/src/Thumbnail/Thumbnail.tsx +142 -42
- package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
- package/src/TimeInput/TimeInput.doc.mjs +21 -0
- package/src/TimeInput/TimeInput.test.tsx +99 -1
- package/src/TimeInput/TimeInput.tsx +43 -31
- package/src/Timestamp/Timestamp.doc.mjs +4 -4
- package/src/Timestamp/Timestamp.test.tsx +32 -0
- package/src/Timestamp/Timestamp.tsx +28 -8
- package/src/Toast/useToast.tsx +7 -8
- package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
- package/src/Token/Token.test.tsx +21 -15
- package/src/Token/Token.tsx +31 -14
- package/src/Token/index.ts +1 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +38 -2
- package/src/Tokenizer/Tokenizer.test.tsx +206 -2
- package/src/Tokenizer/Tokenizer.tsx +30 -6
- package/src/Tooltip/Tooltip.test.tsx +46 -0
- package/src/Tooltip/useTooltip.tsx +20 -0
- package/src/TopNav/TopNav.test.tsx +125 -1
- package/src/TopNav/TopNavHeading.tsx +24 -8
- package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
- package/src/TopNav/TopNavMegaMenu.tsx +10 -4
- package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
- package/src/TopNav/TopNavMenu.test.tsx +118 -4
- package/src/TopNav/TopNavMenu.tsx +83 -5
- package/src/TreeList/TreeList.doc.mjs +28 -0
- package/src/TreeList/TreeList.test.tsx +272 -0
- package/src/TreeList/TreeList.tsx +23 -2
- package/src/TreeList/TreeListBranches.tsx +24 -8
- package/src/TreeList/TreeListItem.tsx +84 -22
- package/src/TreeList/TreeListTypes.ts +27 -1
- package/src/TreeList/index.ts +2 -2
- package/src/Typeahead/BaseTypeahead.tsx +30 -15
- package/src/Typeahead/Typeahead.doc.mjs +13 -0
- package/src/Typeahead/Typeahead.test.tsx +50 -0
- package/src/Typeahead/Typeahead.tsx +11 -1
- package/src/Typeahead/TypeaheadItem.tsx +2 -1
- package/src/__tests__/inputWidthContract.test.tsx +62 -0
- package/src/authoring/doc.ts +1 -3
- package/src/doc-mjs.d.ts +19 -0
- package/src/docs-types.ts +5 -0
- package/src/hooks/computeOverflow.test.ts +422 -0
- package/src/hooks/computeOverflow.ts +290 -0
- package/src/hooks/index.ts +8 -0
- package/src/hooks/isRtlElement.ts +27 -0
- package/src/hooks/useDevWarning.test.tsx +45 -0
- package/src/hooks/useDevWarning.ts +54 -0
- package/src/hooks/useGridFocus.doc.mjs +3 -3
- package/src/hooks/useGridFocus.test.tsx +41 -0
- package/src/hooks/useGridFocus.ts +21 -10
- package/src/hooks/useInputStatusIcon.test.tsx +162 -0
- package/src/hooks/useInputStatusIcon.tsx +224 -0
- package/src/hooks/useListFocus.doc.mjs +25 -3
- package/src/hooks/useListFocus.test.tsx +153 -1
- package/src/hooks/useListFocus.ts +102 -9
- package/src/hooks/useOverflow.test.ts +96 -4
- package/src/hooks/useOverflow.ts +74 -33
- package/src/i18n/InternationalizationContext.ts +4 -0
- package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
- package/src/i18n/InternationalizationProvider.tsx +12 -2
- package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
- package/src/i18n/__tests__/useDirection.test.tsx +66 -0
- package/src/i18n/getLocaleDirection.ts +29 -0
- package/src/i18n/index.ts +6 -0
- package/src/i18n/resolve.ts +9 -21
- package/src/i18n/useDirection.ts +29 -0
- package/src/reset.css +0 -26
- package/src/reset.test.ts +60 -0
- package/src/theme/Theme.tsx +11 -14
- package/src/theme/derivedVarRegistry.test.ts +1 -0
- package/src/theme/derivedVarRegistry.ts +6 -0
- package/src/theme/generateThemeRules.test.ts +107 -0
- package/src/theme/generateThemeRules.ts +56 -0
- package/src/theme/hct.ts +1 -1
- package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
- package/src/utils/devWarning.test.ts +56 -0
- package/src/utils/devWarning.ts +102 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/plainDate.test.ts +46 -6
- package/src/utils/plainDate.ts +69 -3
- package/src/utils/rtlStyles.ts +27 -0
- package/src/utils/types.ts +14 -0
|
@@ -155,6 +155,109 @@ describe('ChatComposerInput', () => {
|
|
|
155
155
|
});
|
|
156
156
|
});
|
|
157
157
|
|
|
158
|
+
describe('composer focus control', () => {
|
|
159
|
+
it('registers a focus control so a body click focuses the input', () => {
|
|
160
|
+
render(
|
|
161
|
+
<ChatComposer onSubmit={() => {}} input={<ChatComposerInput />} />,
|
|
162
|
+
);
|
|
163
|
+
const editable = screen.getByRole('textbox');
|
|
164
|
+
// Walk to the composer body: editable → input root → inputArea → body.
|
|
165
|
+
const inputRoot = editable.parentElement!;
|
|
166
|
+
const inputArea = inputRoot.parentElement!;
|
|
167
|
+
const body = inputArea.parentElement!;
|
|
168
|
+
// Click empty space in the body → shell drives the registered control.
|
|
169
|
+
fireEvent.click(body);
|
|
170
|
+
expect(document.activeElement).toBe(editable);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
describe('Enter submit behavior', () => {
|
|
175
|
+
it('does not submit on Enter while IME composition is in progress', () => {
|
|
176
|
+
const onSubmit = vi.fn();
|
|
177
|
+
render(<ChatComposerInput onSubmit={onSubmit} />);
|
|
178
|
+
const textbox = screen.getByRole('textbox');
|
|
179
|
+
textbox.textContent = 'こんにちは';
|
|
180
|
+
fireEvent.input(textbox);
|
|
181
|
+
// isComposing is surfaced on the native event during IME composition.
|
|
182
|
+
fireEvent.keyDown(textbox, {key: 'Enter', isComposing: true});
|
|
183
|
+
expect(onSubmit).not.toHaveBeenCalled();
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
it('does not submit on Enter for the legacy keyCode 229 composing signal', () => {
|
|
187
|
+
const onSubmit = vi.fn();
|
|
188
|
+
render(<ChatComposerInput onSubmit={onSubmit} />);
|
|
189
|
+
const textbox = screen.getByRole('textbox');
|
|
190
|
+
textbox.textContent = 'ㅎ';
|
|
191
|
+
fireEvent.input(textbox);
|
|
192
|
+
fireEvent.keyDown(textbox, {key: 'Enter', keyCode: 229});
|
|
193
|
+
expect(onSubmit).not.toHaveBeenCalled();
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
it('lets onKeyDown suppress the default submit via preventDefault (touch-newline recipe)', () => {
|
|
197
|
+
// The documented "insert a newline instead of sending" pattern: a
|
|
198
|
+
// consumer preventDefaults Enter (e.g. on a coarse pointer).
|
|
199
|
+
const onSubmit = vi.fn();
|
|
200
|
+
const onKeyDown = vi.fn(e => {
|
|
201
|
+
if (e.key === 'Enter' && !e.shiftKey) {
|
|
202
|
+
e.preventDefault();
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
render(<ChatComposerInput onSubmit={onSubmit} onKeyDown={onKeyDown} />);
|
|
206
|
+
const textbox = screen.getByRole('textbox');
|
|
207
|
+
textbox.textContent = 'hello';
|
|
208
|
+
fireEvent.input(textbox);
|
|
209
|
+
fireEvent.keyDown(textbox, {key: 'Enter'});
|
|
210
|
+
expect(onKeyDown).toHaveBeenCalled();
|
|
211
|
+
expect(onSubmit).not.toHaveBeenCalled();
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
it('lets onKeyDown add behavior (Cmd/Ctrl+Enter submit) without preventDefault', () => {
|
|
215
|
+
// Adding a submit shortcut is just handling the event yourself; the
|
|
216
|
+
// built-in Enter handling still runs for the plain-Enter case.
|
|
217
|
+
const onSubmit = vi.fn();
|
|
218
|
+
const handle = vi.fn();
|
|
219
|
+
const onKeyDown = vi.fn(e => {
|
|
220
|
+
if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {
|
|
221
|
+
handle();
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
render(<ChatComposerInput onSubmit={onSubmit} onKeyDown={onKeyDown} />);
|
|
225
|
+
const textbox = screen.getByRole('textbox');
|
|
226
|
+
textbox.textContent = 'hello';
|
|
227
|
+
fireEvent.input(textbox);
|
|
228
|
+
fireEvent.keyDown(textbox, {key: 'Enter', metaKey: true});
|
|
229
|
+
expect(handle).toHaveBeenCalled();
|
|
230
|
+
// Consumer did not preventDefault, so the built-in submit also fires.
|
|
231
|
+
expect(onSubmit).toHaveBeenCalledWith('hello');
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
it('calls onKeyDown before submit and lets preventDefault take over', () => {
|
|
235
|
+
const onSubmit = vi.fn();
|
|
236
|
+
const onKeyDown = vi.fn(e => {
|
|
237
|
+
e.preventDefault();
|
|
238
|
+
});
|
|
239
|
+
render(<ChatComposerInput onSubmit={onSubmit} onKeyDown={onKeyDown} />);
|
|
240
|
+
const textbox = screen.getByRole('textbox');
|
|
241
|
+
textbox.textContent = 'hello';
|
|
242
|
+
fireEvent.input(textbox);
|
|
243
|
+
fireEvent.keyDown(textbox, {key: 'Enter'});
|
|
244
|
+
expect(onKeyDown).toHaveBeenCalled();
|
|
245
|
+
expect(onSubmit).not.toHaveBeenCalled();
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
it('calls onKeyDown but still submits when the consumer does not preventDefault', () => {
|
|
249
|
+
const onSubmit = vi.fn();
|
|
250
|
+
const onKeyDown = vi.fn();
|
|
251
|
+
render(<ChatComposerInput onSubmit={onSubmit} onKeyDown={onKeyDown} />);
|
|
252
|
+
const textbox = screen.getByRole('textbox');
|
|
253
|
+
textbox.textContent = 'hello';
|
|
254
|
+
fireEvent.input(textbox);
|
|
255
|
+
fireEvent.keyDown(textbox, {key: 'Enter'});
|
|
256
|
+
expect(onKeyDown).toHaveBeenCalled();
|
|
257
|
+
expect(onSubmit).toHaveBeenCalledWith('hello');
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
|
|
158
261
|
// Controlled-value sync used to overwrite `textContent` on every
|
|
159
262
|
// distinct render, which (a) collapsed the caret to offset 0
|
|
160
263
|
// (visible after a slash-command pick like
|
|
@@ -11,8 +11,10 @@
|
|
|
11
11
|
*
|
|
12
12
|
* ContentEditable-based rich input for the chat composer.
|
|
13
13
|
* Supports trigger menus (@ mentions, / commands) via SearchSource,
|
|
14
|
-
* inline token rendering, serialization, Enter
|
|
15
|
-
*
|
|
14
|
+
* inline token rendering, serialization, Enter-to-submit with
|
|
15
|
+
* IME-composition guarding and an onKeyDown seam for platform-specific
|
|
16
|
+
* key handling, message history, paste/drop file handling, and
|
|
17
|
+
* mobile-safe touch typography.
|
|
16
18
|
*
|
|
17
19
|
*
|
|
18
20
|
* SYNC: When modified, update:
|
|
@@ -188,6 +190,21 @@ export interface ChatComposerInputProps extends Omit<
|
|
|
188
190
|
onFiles?: (files: File[]) => void;
|
|
189
191
|
/** Submit handler (Enter without Shift) */
|
|
190
192
|
onSubmit?: (value: string) => void;
|
|
193
|
+
/**
|
|
194
|
+
* Key-down handler invoked before the built-in Enter/history behavior
|
|
195
|
+
* (but after an open trigger menu consumes the event).
|
|
196
|
+
*
|
|
197
|
+
* This is the seam for platform- or app-specific key handling:
|
|
198
|
+
* - Call `event.preventDefault()` to suppress the default submit (e.g.
|
|
199
|
+
* let Enter insert a newline on a touch keyboard).
|
|
200
|
+
* - Add behavior by acting on the event yourself (e.g. submit on
|
|
201
|
+
* Cmd/Ctrl+Enter) without calling `preventDefault()`, so the default
|
|
202
|
+
* handling still runs for other keys.
|
|
203
|
+
*
|
|
204
|
+
* IME composition is always respected regardless of this handler: Enter
|
|
205
|
+
* never submits while a composition is in progress.
|
|
206
|
+
*/
|
|
207
|
+
onKeyDown?: (event: KeyboardEvent<HTMLDivElement>) => void;
|
|
191
208
|
}
|
|
192
209
|
|
|
193
210
|
// =============================================================================
|
|
@@ -221,8 +238,8 @@ const styles = stylex.create({
|
|
|
221
238
|
placeholder: {
|
|
222
239
|
position: 'absolute',
|
|
223
240
|
top: 0,
|
|
224
|
-
|
|
225
|
-
|
|
241
|
+
insetInlineStart: 0,
|
|
242
|
+
insetInlineEnd: 0,
|
|
226
243
|
pointerEvents: 'none',
|
|
227
244
|
color: colorVars['--color-text-secondary'],
|
|
228
245
|
fontSize: {
|
|
@@ -299,6 +316,7 @@ export function ChatComposerInput(props: ChatComposerInputProps) {
|
|
|
299
316
|
pasteAsToken: pasteAsTokenProp,
|
|
300
317
|
onFiles,
|
|
301
318
|
onSubmit = composerCtx?.onSubmit,
|
|
319
|
+
onKeyDown: onKeyDownProp,
|
|
302
320
|
xstyle,
|
|
303
321
|
className,
|
|
304
322
|
style,
|
|
@@ -366,6 +384,20 @@ export function ChatComposerInput(props: ChatComposerInputProps) {
|
|
|
366
384
|
selfRef.current = handle;
|
|
367
385
|
useImperativeHandle(handleRef, () => handle);
|
|
368
386
|
|
|
387
|
+
// Register a focus control with the composer shell so body-click-to-focus
|
|
388
|
+
// works without the shell sniffing the input's DOM shape. Cleared on
|
|
389
|
+
// unmount so the shell falls back cleanly if the input goes away.
|
|
390
|
+
const inputControlRef = composerCtx?.inputControlRef;
|
|
391
|
+
useEffect(() => {
|
|
392
|
+
if (!inputControlRef) {
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
inputControlRef.current = {focus: () => editableRef.current?.focus()};
|
|
396
|
+
return () => {
|
|
397
|
+
inputControlRef.current = null;
|
|
398
|
+
};
|
|
399
|
+
}, [inputControlRef]);
|
|
400
|
+
|
|
369
401
|
useEffect(() => {
|
|
370
402
|
if (controlledValue === undefined || !editableRef.current) {
|
|
371
403
|
return;
|
|
@@ -477,6 +509,13 @@ export function ChatComposerInput(props: ChatComposerInputProps) {
|
|
|
477
509
|
return;
|
|
478
510
|
}
|
|
479
511
|
|
|
512
|
+
// Consumer passthrough — runs before built-in Enter/history handling.
|
|
513
|
+
// A consumer can preventDefault() to fully own the keystroke.
|
|
514
|
+
onKeyDownProp?.(e);
|
|
515
|
+
if (e.defaultPrevented) {
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
|
|
480
519
|
// Handle Backspace near tokens — prevent browser from creating
|
|
481
520
|
// stray <br> elements or moving the cursor unexpectedly.
|
|
482
521
|
if (e.key === 'Backspace') {
|
|
@@ -519,6 +558,13 @@ export function ChatComposerInput(props: ChatComposerInputProps) {
|
|
|
519
558
|
}
|
|
520
559
|
|
|
521
560
|
if (e.key === 'Enter' && !e.shiftKey) {
|
|
561
|
+
// Never submit mid-composition — an IME uses Enter to commit a
|
|
562
|
+
// candidate (e.g. Japanese/Chinese/Korean input), and browsers may
|
|
563
|
+
// also surface the legacy keyCode 229 for composing keystrokes.
|
|
564
|
+
if (e.nativeEvent.isComposing || e.nativeEvent.keyCode === 229) {
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
567
|
+
|
|
522
568
|
e.preventDefault();
|
|
523
569
|
if (!editableRef.current) {
|
|
524
570
|
return;
|
|
@@ -583,7 +629,7 @@ export function ChatComposerInput(props: ChatComposerInputProps) {
|
|
|
583
629
|
}
|
|
584
630
|
}
|
|
585
631
|
},
|
|
586
|
-
[hasHistory, onSubmit, onChange, emitChange, triggerMenu],
|
|
632
|
+
[hasHistory, onSubmit, onChange, emitChange, triggerMenu, onKeyDownProp],
|
|
587
633
|
);
|
|
588
634
|
|
|
589
635
|
const handlePaste = useCallback(
|
package/src/Chat/ChatContext.tsx
CHANGED
|
@@ -5,11 +5,14 @@
|
|
|
5
5
|
/**
|
|
6
6
|
* @file ChatContext.tsx
|
|
7
7
|
* @input Uses React createContext
|
|
8
|
-
* @output Exports
|
|
9
|
-
*
|
|
8
|
+
* @output Exports Chat message/list/composer/layout contexts. The composer
|
|
9
|
+
* context (value + input-control registration) is public composition API,
|
|
10
|
+
* re-exported from Chat/index.ts for custom inputs.
|
|
11
|
+
* @position Shared contexts; consumed by ChatMessage, ChatComposer,
|
|
12
|
+
* ChatComposerInput, ChatSendButton, and custom inputs.
|
|
10
13
|
*/
|
|
11
14
|
|
|
12
|
-
import {createContext, use} from 'react';
|
|
15
|
+
import {createContext, use, type RefObject} from 'react';
|
|
13
16
|
|
|
14
17
|
export type ChatMessageSender = 'user' | 'assistant' | 'system';
|
|
15
18
|
export type ChatDensity = 'compact' | 'balanced' | 'spacious';
|
|
@@ -19,8 +22,9 @@ export interface ChatMessageContextValue {
|
|
|
19
22
|
density: ChatDensity;
|
|
20
23
|
}
|
|
21
24
|
|
|
22
|
-
export const ChatMessageContext =
|
|
23
|
-
|
|
25
|
+
export const ChatMessageContext = createContext<ChatMessageContextValue | null>(
|
|
26
|
+
null,
|
|
27
|
+
);
|
|
24
28
|
ChatMessageContext.displayName = 'ChatMessageContext';
|
|
25
29
|
|
|
26
30
|
export function useChatMessageContext(): ChatMessageContextValue | null {
|
|
@@ -31,9 +35,7 @@ export interface ChatListContextValue {
|
|
|
31
35
|
density: ChatDensity;
|
|
32
36
|
}
|
|
33
37
|
|
|
34
|
-
export const ChatListContext = createContext<ChatListContextValue | null>(
|
|
35
|
-
null,
|
|
36
|
-
);
|
|
38
|
+
export const ChatListContext = createContext<ChatListContextValue | null>(null);
|
|
37
39
|
ChatListContext.displayName = 'ChatListContext';
|
|
38
40
|
|
|
39
41
|
export function useChatListContext(): ChatListContextValue | null {
|
|
@@ -44,6 +46,21 @@ export function useChatListContext(): ChatListContextValue | null {
|
|
|
44
46
|
// Composer context — shared state between ChatComposer and ChatComposerInput
|
|
45
47
|
// =============================================================================
|
|
46
48
|
|
|
49
|
+
/**
|
|
50
|
+
* Imperative surface the composer shell can invoke on its input slot.
|
|
51
|
+
*
|
|
52
|
+
* The input is one slot inside the composer body — it does not span the whole
|
|
53
|
+
* body — so shell-level interactions like "click empty space to focus the
|
|
54
|
+
* input" must flow shell → input. A custom input registers this control (via
|
|
55
|
+
* `ChatComposerContextValue.inputControlRef`) so the shell can drive it
|
|
56
|
+
* without knowing its DOM shape. Optional methods can be added over time;
|
|
57
|
+
* inputs implement only what they support.
|
|
58
|
+
*/
|
|
59
|
+
export interface ChatComposerInputControl {
|
|
60
|
+
/** Move keyboard focus into the input. */
|
|
61
|
+
focus: () => void;
|
|
62
|
+
}
|
|
63
|
+
|
|
47
64
|
export interface ChatComposerContextValue {
|
|
48
65
|
value: string;
|
|
49
66
|
onChange: (value: string) => void;
|
|
@@ -53,6 +70,15 @@ export interface ChatComposerContextValue {
|
|
|
53
70
|
isStopShown: boolean;
|
|
54
71
|
canSend: boolean;
|
|
55
72
|
onStop?: () => void;
|
|
73
|
+
/**
|
|
74
|
+
* Mutable handle the input slot populates with its {@link
|
|
75
|
+
* ChatComposerInputControl}. The shell reads `.current` to drive the input
|
|
76
|
+
* (e.g. focus on body click). A custom input assigns
|
|
77
|
+
* `inputControlRef.current = { focus }` on mount and clears it on unmount.
|
|
78
|
+
* When unset, the shell falls back to focusing a `contenteditable`/`textarea`
|
|
79
|
+
* it finds in the body.
|
|
80
|
+
*/
|
|
81
|
+
inputControlRef?: RefObject<ChatComposerInputControl | null>;
|
|
56
82
|
}
|
|
57
83
|
|
|
58
84
|
export const ChatComposerContext =
|
|
@@ -74,8 +100,9 @@ export interface ChatLayoutContextValue {
|
|
|
74
100
|
contentRef: (el: HTMLElement | null) => void;
|
|
75
101
|
}
|
|
76
102
|
|
|
77
|
-
export const ChatLayoutContext =
|
|
78
|
-
|
|
103
|
+
export const ChatLayoutContext = createContext<ChatLayoutContextValue | null>(
|
|
104
|
+
null,
|
|
105
|
+
);
|
|
79
106
|
ChatLayoutContext.displayName = 'ChatLayoutContext';
|
|
80
107
|
|
|
81
108
|
export function useChatLayoutContext(): ChatLayoutContextValue | null {
|
|
@@ -26,6 +26,7 @@ import {Button} from '../Button';
|
|
|
26
26
|
import {Icon} from '../Icon';
|
|
27
27
|
import {mergeProps} from '../utils';
|
|
28
28
|
import type {BaseProps} from '../BaseProps';
|
|
29
|
+
import {useTranslator} from '../i18n';
|
|
29
30
|
|
|
30
31
|
// =============================================================================
|
|
31
32
|
// Types
|
|
@@ -66,7 +67,10 @@ const styles = stylex.create({
|
|
|
66
67
|
borderRadius: radiusVars['--radius-full'],
|
|
67
68
|
transformOrigin: 'center',
|
|
68
69
|
transitionProperty: 'transform, background-color',
|
|
69
|
-
transitionDuration:
|
|
70
|
+
transitionDuration: {
|
|
71
|
+
default: '0.06s',
|
|
72
|
+
'@media (prefers-reduced-motion: reduce)': '0s',
|
|
73
|
+
},
|
|
70
74
|
transitionTimingFunction: 'ease-out',
|
|
71
75
|
},
|
|
72
76
|
});
|
|
@@ -107,13 +111,18 @@ export function ChatDictationButton({
|
|
|
107
111
|
style,
|
|
108
112
|
...rest
|
|
109
113
|
}: ChatDictationButtonProps) {
|
|
114
|
+
const t = useTranslator();
|
|
115
|
+
|
|
110
116
|
if (isHiddenWhenUnsupported && !dictation.isSupported) {
|
|
111
117
|
return null;
|
|
112
118
|
}
|
|
113
119
|
|
|
114
120
|
const {isListening, bands, volume: rawVolume} = dictation;
|
|
115
121
|
const accessibleLabel =
|
|
116
|
-
label ??
|
|
122
|
+
label ??
|
|
123
|
+
(isListening
|
|
124
|
+
? t('@astryx.chatDictationButton.stopDictation')
|
|
125
|
+
: t('@astryx.chatDictationButton.startDictation'));
|
|
117
126
|
|
|
118
127
|
// Boost each band for visibility — quiet speech (0-10%) maps to full visual range
|
|
119
128
|
const boostedBands = bands.map(b => Math.min(Math.pow(b / 0.2, 0.5), 1));
|
package/src/Chat/ChatLayout.tsx
CHANGED
|
@@ -134,8 +134,8 @@ const styles = stylex.create({
|
|
|
134
134
|
// --- Dock container ---
|
|
135
135
|
dockContainer: {
|
|
136
136
|
bottom: 0,
|
|
137
|
-
|
|
138
|
-
|
|
137
|
+
insetInlineStart: 0,
|
|
138
|
+
insetInlineEnd: 0,
|
|
139
139
|
zIndex: 0,
|
|
140
140
|
isolation: 'isolate',
|
|
141
141
|
pointerEvents: 'none',
|
|
@@ -150,8 +150,8 @@ const styles = stylex.create({
|
|
|
150
150
|
blurLayer: {
|
|
151
151
|
position: 'absolute',
|
|
152
152
|
bottom: 0,
|
|
153
|
-
|
|
154
|
-
|
|
153
|
+
insetInlineStart: 0,
|
|
154
|
+
insetInlineEnd: 0,
|
|
155
155
|
pointerEvents: 'none',
|
|
156
156
|
backdropFilter: 'blur(12px)',
|
|
157
157
|
WebkitBackdropFilter: 'blur(12px)',
|
|
@@ -276,7 +276,9 @@ export function ChatLayout({
|
|
|
276
276
|
const defaultScrollButton = (
|
|
277
277
|
<ChatLayoutScrollButton
|
|
278
278
|
isVisible={scroll.isScrolledUp || newMsgs.hasNewMessages}
|
|
279
|
-
label={
|
|
279
|
+
label={
|
|
280
|
+
newMsgs.hasNewMessages ? t('@astryx.chatLayout.newMessages') : undefined
|
|
281
|
+
}
|
|
280
282
|
onClick={() => {
|
|
281
283
|
newMsgs.dismiss();
|
|
282
284
|
scroll.scrollToBottom();
|
|
@@ -69,7 +69,10 @@ const styles = stylex.create({
|
|
|
69
69
|
height: '32px',
|
|
70
70
|
transitionProperty: 'opacity, transform, max-width',
|
|
71
71
|
transitionTimingFunction: easeVars['--ease-standard'],
|
|
72
|
-
transitionDuration:
|
|
72
|
+
transitionDuration: {
|
|
73
|
+
default: durationVars['--duration-fast-max'],
|
|
74
|
+
'@media (prefers-reduced-motion: reduce)': '0s',
|
|
75
|
+
},
|
|
73
76
|
},
|
|
74
77
|
hidden: {
|
|
75
78
|
opacity: 0,
|
|
@@ -135,7 +138,9 @@ export function ChatLayoutScrollButton({
|
|
|
135
138
|
)}>
|
|
136
139
|
<Button
|
|
137
140
|
label={label ?? t('@astryx.chatLayoutScrollButton.scrollToBottom')}
|
|
138
|
-
aria-label={
|
|
141
|
+
aria-label={
|
|
142
|
+
label ?? t('@astryx.chatLayoutScrollButton.scrollToBottom')
|
|
143
|
+
}
|
|
139
144
|
icon={<Icon icon="chevronDown" size="md" />}
|
|
140
145
|
variant="ghost"
|
|
141
146
|
size="md"
|
|
@@ -122,8 +122,7 @@ export function ChatMessageMetadata({
|
|
|
122
122
|
const sender = msgContext?.sender ?? 'assistant';
|
|
123
123
|
|
|
124
124
|
const statusConfig = status != null ? STATUS_CONFIG[status] : null;
|
|
125
|
-
const statusLabel =
|
|
126
|
-
statusConfig != null ? t(statusConfig.i18nKey) : '';
|
|
125
|
+
const statusLabel = statusConfig != null ? t(statusConfig.i18nKey) : '';
|
|
127
126
|
|
|
128
127
|
const hasContent =
|
|
129
128
|
timestamp != null || footer != null || statusConfig != null;
|
|
@@ -88,7 +88,10 @@ export function ChatSendButton(props: ChatSendButtonProps): ReactNode {
|
|
|
88
88
|
stopIcon,
|
|
89
89
|
size = 'md',
|
|
90
90
|
xstyle,
|
|
91
|
+
className,
|
|
92
|
+
style,
|
|
91
93
|
ref,
|
|
94
|
+
...rest
|
|
92
95
|
} = props;
|
|
93
96
|
|
|
94
97
|
const handleSend = onSend ?? (() => context?.onSubmit(''));
|
|
@@ -96,7 +99,11 @@ export function ChatSendButton(props: ChatSendButtonProps): ReactNode {
|
|
|
96
99
|
return (
|
|
97
100
|
<Button
|
|
98
101
|
ref={ref}
|
|
99
|
-
label={
|
|
102
|
+
label={
|
|
103
|
+
isStopShown
|
|
104
|
+
? t('@astryx.chatSendButton.stop')
|
|
105
|
+
: t('@astryx.chatSendButton.send')
|
|
106
|
+
}
|
|
100
107
|
variant={isStopShown ? 'secondary' : 'primary'}
|
|
101
108
|
size={size}
|
|
102
109
|
icon={
|
|
@@ -107,7 +114,10 @@ export function ChatSendButton(props: ChatSendButtonProps): ReactNode {
|
|
|
107
114
|
isIconOnly
|
|
108
115
|
isDisabled={!isStopShown && isDisabled}
|
|
109
116
|
onClick={isStopShown ? onStop : handleSend}
|
|
117
|
+
{...rest}
|
|
110
118
|
{...themeProps('chat-send-button')}
|
|
119
|
+
className={className}
|
|
120
|
+
style={style}
|
|
111
121
|
xstyle={[styles.root, xstyle]}
|
|
112
122
|
/>
|
|
113
123
|
);
|
|
@@ -133,6 +133,70 @@ describe('ChatToolCalls', () => {
|
|
|
133
133
|
expect(panel).toHaveTextContent('file contents here');
|
|
134
134
|
});
|
|
135
135
|
|
|
136
|
+
it('exposes the error message as text without requiring hover', () => {
|
|
137
|
+
render(
|
|
138
|
+
<ChatToolCalls
|
|
139
|
+
calls={[
|
|
140
|
+
{
|
|
141
|
+
name: 'bash',
|
|
142
|
+
status: 'error',
|
|
143
|
+
errorMessage: 'Command exited with code 1',
|
|
144
|
+
},
|
|
145
|
+
]}
|
|
146
|
+
/>,
|
|
147
|
+
);
|
|
148
|
+
// The message must exist as real (screen-reader-visible) text content,
|
|
149
|
+
// not only inside a hover-only title attribute.
|
|
150
|
+
expect(screen.getByText(/Command exited with code 1/)).toBeInTheDocument();
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('includes the error message in the accessible name of an expandable error row', () => {
|
|
154
|
+
render(
|
|
155
|
+
<ChatToolCalls
|
|
156
|
+
calls={[
|
|
157
|
+
{
|
|
158
|
+
name: 'bash',
|
|
159
|
+
status: 'error',
|
|
160
|
+
errorMessage: 'Command exited with code 1',
|
|
161
|
+
resultDetail: <div>stderr output</div>,
|
|
162
|
+
},
|
|
163
|
+
]}
|
|
164
|
+
/>,
|
|
165
|
+
);
|
|
166
|
+
expect(
|
|
167
|
+
screen.getByRole('button', {name: /Command exited with code 1/}),
|
|
168
|
+
).toBeInTheDocument();
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('keeps the hover tooltip on the error status icon', () => {
|
|
172
|
+
const {container} = render(
|
|
173
|
+
<ChatToolCalls
|
|
174
|
+
calls={[
|
|
175
|
+
{
|
|
176
|
+
name: 'bash',
|
|
177
|
+
status: 'error',
|
|
178
|
+
errorMessage: 'Command exited with code 1',
|
|
179
|
+
},
|
|
180
|
+
]}
|
|
181
|
+
/>,
|
|
182
|
+
);
|
|
183
|
+
expect(
|
|
184
|
+
container.querySelector('[title="Command exited with code 1"]'),
|
|
185
|
+
).not.toBeNull();
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('renders no error text for non-error calls', () => {
|
|
189
|
+
render(
|
|
190
|
+
<ChatToolCalls
|
|
191
|
+
calls={[
|
|
192
|
+
{name: 'bash', status: 'complete', errorMessage: 'stale message'},
|
|
193
|
+
]}
|
|
194
|
+
/>,
|
|
195
|
+
);
|
|
196
|
+
expect(screen.queryByText(/stale message/)).not.toBeInTheDocument();
|
|
197
|
+
expect(screen.queryByText(/Error:/)).not.toBeInTheDocument();
|
|
198
|
+
});
|
|
199
|
+
|
|
136
200
|
it('points the group header aria-controls at the content region', () => {
|
|
137
201
|
render(
|
|
138
202
|
<ChatToolCalls
|
|
@@ -35,7 +35,9 @@ import {getKey, mergeProps} from '../utils';
|
|
|
35
35
|
import {Badge} from '../Badge';
|
|
36
36
|
import {Icon, type IconName} from '../Icon';
|
|
37
37
|
import {Spinner} from '../Spinner';
|
|
38
|
+
import {VisuallyHidden} from '../VisuallyHidden';
|
|
38
39
|
import {themeProps} from '../utils/themeProps';
|
|
40
|
+
import {useTranslator} from '../i18n';
|
|
39
41
|
|
|
40
42
|
// =============================================================================
|
|
41
43
|
// Types
|
|
@@ -60,7 +62,11 @@ export interface ChatToolCallItem {
|
|
|
60
62
|
deletions?: number;
|
|
61
63
|
/** Additional info rendered after the label. Free-form ReactNode. */
|
|
62
64
|
stats?: ReactNode;
|
|
63
|
-
/**
|
|
65
|
+
/**
|
|
66
|
+
* Error message when status is 'error'. Rendered as visually hidden text in
|
|
67
|
+
* the row (so screen readers and keyboard users perceive it) and echoed in a
|
|
68
|
+
* hover tooltip on the status icon.
|
|
69
|
+
*/
|
|
64
70
|
errorMessage?: string;
|
|
65
71
|
/** Unique key for React list rendering. Derived from stable metadata if omitted. */
|
|
66
72
|
key?: string;
|
|
@@ -128,7 +134,10 @@ const styles = stylex.create({
|
|
|
128
134
|
width: '14px',
|
|
129
135
|
height: '14px',
|
|
130
136
|
color: colorVars['--color-text-disabled'],
|
|
131
|
-
transition:
|
|
137
|
+
transition: {
|
|
138
|
+
default: `transform ${durationVars['--duration-fast']} ${easeVars['--ease-standard']}`,
|
|
139
|
+
'@media (prefers-reduced-motion: reduce)': 'none',
|
|
140
|
+
},
|
|
132
141
|
},
|
|
133
142
|
chevronExpanded: {
|
|
134
143
|
transform: 'rotate(180deg)',
|
|
@@ -136,7 +145,10 @@ const styles = stylex.create({
|
|
|
136
145
|
groupContent: {
|
|
137
146
|
display: 'grid',
|
|
138
147
|
gridTemplateRows: '0fr',
|
|
139
|
-
transition:
|
|
148
|
+
transition: {
|
|
149
|
+
default: `grid-template-rows ${durationVars['--duration-medium']} ${easeVars['--ease-standard']}`,
|
|
150
|
+
'@media (prefers-reduced-motion: reduce)': 'none',
|
|
151
|
+
},
|
|
140
152
|
},
|
|
141
153
|
groupContentExpanded: {
|
|
142
154
|
gridTemplateRows: '1fr',
|
|
@@ -261,7 +273,10 @@ const styles = stylex.create({
|
|
|
261
273
|
width: '14px',
|
|
262
274
|
height: '14px',
|
|
263
275
|
color: colorVars['--color-text-disabled'],
|
|
264
|
-
transition:
|
|
276
|
+
transition: {
|
|
277
|
+
default: `transform ${durationVars['--duration-fast']} ${easeVars['--ease-standard']}`,
|
|
278
|
+
'@media (prefers-reduced-motion: reduce)': 'none',
|
|
279
|
+
},
|
|
265
280
|
marginInlineStart: 'auto',
|
|
266
281
|
},
|
|
267
282
|
callDetailContent: {
|
|
@@ -349,6 +364,7 @@ function getToolCallKey(call: ChatToolCallItem): string {
|
|
|
349
364
|
// =============================================================================
|
|
350
365
|
|
|
351
366
|
function CallRow({call}: {call: ChatToolCallItem}) {
|
|
367
|
+
const t = useTranslator();
|
|
352
368
|
const status = call.status ?? 'complete';
|
|
353
369
|
const hasDetail = call.resultDetail != null;
|
|
354
370
|
const [isDetailOpen, setIsDetailOpen] = useState(false);
|
|
@@ -395,6 +411,17 @@ function CallRow({call}: {call: ChatToolCallItem}) {
|
|
|
395
411
|
</span>
|
|
396
412
|
</>
|
|
397
413
|
)}
|
|
414
|
+
{status === 'error' && call.errorMessage != null && (
|
|
415
|
+
// The title attribute above is hover-only; expose the error detail
|
|
416
|
+
// as real text so it reaches screen readers, keyboard, and touch
|
|
417
|
+
// users. Rendering it inside the row also folds it into the
|
|
418
|
+
// accessible name of expandable (role="button") rows.
|
|
419
|
+
<VisuallyHidden>
|
|
420
|
+
{t('@astryx.chatToolCalls.error', {
|
|
421
|
+
message: call.errorMessage ?? '',
|
|
422
|
+
})}
|
|
423
|
+
</VisuallyHidden>
|
|
424
|
+
)}
|
|
398
425
|
</span>
|
|
399
426
|
<span {...stylex.props(styles.callName)}>{call.name}</span>
|
|
400
427
|
{call.node != null && (
|
|
@@ -477,6 +504,7 @@ function CallRow({call}: {call: ChatToolCallItem}) {
|
|
|
477
504
|
* ```
|
|
478
505
|
*/
|
|
479
506
|
export function ChatToolCalls(props: ChatToolCallsProps) {
|
|
507
|
+
const t = useTranslator();
|
|
480
508
|
const {
|
|
481
509
|
calls,
|
|
482
510
|
label: _customLabel,
|
|
@@ -559,7 +587,7 @@ export function ChatToolCalls(props: ChatToolCallsProps) {
|
|
|
559
587
|
<Icon icon="wrench" size="sm" color="inherit" />
|
|
560
588
|
</span>
|
|
561
589
|
<span {...stylex.props(styles.groupLabel)}>
|
|
562
|
-
{calls.length}
|
|
590
|
+
{t('@astryx.chatToolCalls.groupLabel', {count: calls.length})}
|
|
563
591
|
</span>
|
|
564
592
|
</>
|
|
565
593
|
) : (
|
package/src/Chat/index.ts
CHANGED
|
@@ -81,7 +81,11 @@ export type {
|
|
|
81
81
|
TokenPortal,
|
|
82
82
|
} from './useChatComposerTokens';
|
|
83
83
|
export type {ChatMessageSender, ChatDensity} from './ChatContext';
|
|
84
|
-
export {useChatLayoutContext} from './ChatContext';
|
|
84
|
+
export {useChatLayoutContext, useChatComposerContext} from './ChatContext';
|
|
85
|
+
export type {
|
|
86
|
+
ChatComposerContextValue,
|
|
87
|
+
ChatComposerInputControl,
|
|
88
|
+
} from './ChatContext';
|
|
85
89
|
|
|
86
90
|
export {ChatToolCalls} from './ChatToolCalls';
|
|
87
91
|
export type {
|