@astryxdesign/core 0.1.3 → 0.1.4-canary.01e5b29
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 +51 -0
- package/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +20 -18
- package/dist/AlertDialog/useImperativeAlertDialog.js +3 -3
- package/dist/AppShell/AppShell.d.ts +1 -1
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +55 -53
- package/dist/AspectRatio/AspectRatio.js +5 -5
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +27 -25
- package/dist/Avatar/AvatarStatusDot.js +5 -5
- package/dist/AvatarGroup/AvatarGroup.js +5 -5
- package/dist/AvatarGroup/AvatarGroupOverflow.js +5 -5
- package/dist/Badge/Badge.js +3 -3
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +32 -25
- package/dist/Blockquote/Blockquote.js +7 -7
- package/dist/Breadcrumbs/BreadcrumbItem.js +17 -17
- package/dist/Breadcrumbs/Breadcrumbs.js +7 -7
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +47 -26
- package/dist/ButtonGroup/ButtonGroup.js +7 -7
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +108 -64
- package/dist/Calendar/dayCellUtils.d.ts +67 -5
- package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
- package/dist/Calendar/dayCellUtils.js +139 -18
- package/dist/Calendar/styles.d.ts +2 -2
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +2 -2
- package/dist/Card/Card.d.ts +4 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +18 -10
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +20 -19
- package/dist/Center/Center.js +3 -3
- package/dist/Chat/ChatComposer.js +23 -23
- package/dist/Chat/ChatComposerDrawer.js +14 -14
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +27 -15
- package/dist/Chat/ChatDictationButton.d.ts +1 -1
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +13 -11
- package/dist/Chat/ChatLayout.js +17 -17
- package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +12 -10
- package/dist/Chat/ChatMessage.js +12 -12
- package/dist/Chat/ChatMessageBubble.js +7 -7
- package/dist/Chat/ChatMessageList.js +14 -14
- package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatMessageMetadata.js +14 -12
- package/dist/Chat/ChatPastedTextToken.js +13 -13
- package/dist/Chat/ChatSendButton.js +3 -3
- package/dist/Chat/ChatSystemMessage.d.ts +1 -1
- package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
- package/dist/Chat/ChatSystemMessage.js +17 -17
- package/dist/Chat/ChatTokenizedText.d.ts +1 -1
- package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
- package/dist/Chat/ChatTokenizedText.js +24 -15
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +81 -74
- package/dist/Chat/index.d.ts +1 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +15 -15
- package/dist/CheckboxInput/CheckboxInput.d.ts +6 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +32 -24
- package/dist/CheckboxList/CheckboxList.js +9 -9
- package/dist/CheckboxList/CheckboxListItem.d.ts +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +8 -6
- package/dist/Citation/Citation.js +10 -10
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +32 -9
- package/dist/Code/Code.d.ts +15 -1
- package/dist/Code/Code.d.ts.map +1 -1
- package/dist/Code/Code.js +35 -5
- package/dist/Code/index.d.ts +1 -1
- package/dist/Code/index.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.d.ts +10 -1
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +88 -52
- package/dist/CodeBlock/index.d.ts +1 -1
- package/dist/CodeBlock/index.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.d.ts +9 -3
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +110 -22
- package/dist/Collapsible/CollapsibleGroup.d.ts +39 -7
- package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroup.js +73 -12
- package/dist/Collapsible/CollapsibleGroupContext.d.ts +31 -0
- package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroupContext.js +33 -3
- package/dist/Collapsible/index.d.ts +1 -0
- package/dist/Collapsible/index.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.d.ts +4 -1
- package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.js +20 -6
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +36 -34
- package/dist/CommandPalette/CommandPaletteEmpty.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteEmpty.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteEmpty.js +27 -7
- package/dist/CommandPalette/CommandPaletteFooter.js +16 -16
- package/dist/CommandPalette/CommandPaletteGroup.js +5 -5
- package/dist/CommandPalette/CommandPaletteInput.js +13 -13
- package/dist/CommandPalette/CommandPaletteItem.js +3 -3
- package/dist/CommandPalette/CommandPaletteList.js +3 -3
- package/dist/ContextMenu/ContextMenu.d.ts +9 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +16 -11
- package/dist/DateInput/DateInput.js +18 -18
- package/dist/DateRangeInput/DateRangeInput.js +23 -23
- package/dist/DateTimeInput/DateTimeInput.d.ts +5 -7
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +30 -26
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +9 -9
- package/dist/Dialog/DialogHeader.js +16 -16
- package/dist/Dialog/useImperativeDialog.js +3 -3
- package/dist/Divider/Divider.d.ts +0 -22
- package/dist/Divider/Divider.d.ts.map +1 -1
- package/dist/Divider/Divider.js +7 -7
- package/dist/DropdownMenu/DropdownMenu.js +10 -10
- package/dist/DropdownMenu/DropdownMenuItem.d.ts +2 -17
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
- package/dist/DropdownMenu/renderDropdownItems.js +10 -10
- package/dist/EmptyState/EmptyState.js +9 -9
- package/dist/Field/Field.js +17 -17
- package/dist/Field/FieldLabel.js +15 -15
- package/dist/Field/InputClearButton.js +5 -5
- package/dist/FieldStatus/FieldStatus.js +3 -3
- package/dist/FileInput/FileInput.js +29 -29
- package/dist/FormLayout/FormLayout.js +5 -5
- package/dist/Grid/Grid.d.ts +4 -3
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/Grid.js +29 -12
- package/dist/Grid/GridSpan.js +3 -3
- package/dist/HStack/HStack.js +3 -3
- package/dist/Heading/Heading.js +10 -10
- package/dist/HoverCard/HoverCard.js +9 -9
- package/dist/HoverCard/useHoverCard.js +3 -3
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +16 -12
- package/dist/Icon/defaultIcons.js +116 -116
- package/dist/IconButton/IconButton.js +3 -3
- package/dist/InputGroup/InputGroup.js +11 -11
- package/dist/InputGroup/InputGroupText.js +3 -3
- package/dist/Item/Item.js +18 -18
- package/dist/Kbd/Kbd.js +5 -5
- package/dist/Layer/LayerProvider.js +7 -7
- package/dist/Layer/useLayer.js +5 -5
- package/dist/Layout/Layout.js +21 -21
- package/dist/Layout/LayoutContent.js +3 -3
- package/dist/Layout/LayoutFooter.js +5 -5
- package/dist/Layout/LayoutHeader.js +5 -5
- package/dist/Layout/LayoutPanel.js +3 -3
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +55 -31
- package/dist/Lightbox/useLightbox.js +3 -3
- package/dist/Link/Link.js +15 -15
- package/dist/Link/LinkProvider.js +3 -3
- package/dist/Link/useLinkify.js +3 -3
- package/dist/List/List.js +11 -11
- package/dist/List/ListItem.js +11 -11
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +102 -102
- package/dist/Markdown/parser.d.ts +7 -0
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +300 -6
- package/dist/MetadataList/MetadataList.js +10 -10
- package/dist/MetadataList/MetadataListItem.js +15 -15
- package/dist/MobileNav/MobileNav.js +15 -15
- package/dist/MobileNav/MobileNavToggle.js +5 -5
- package/dist/MoreMenu/MoreMenu.js +3 -3
- package/dist/MultiSelector/MultiSelector.d.ts +7 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +64 -55
- package/dist/NavIcon/NavIcon.js +3 -3
- package/dist/NavMenu/NavHeadingMenu.js +5 -5
- package/dist/NavMenu/NavHeadingMenuItem.js +8 -8
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +48 -32
- package/dist/Outline/Outline.js +15 -15
- package/dist/OverflowList/OverflowList.js +8 -8
- package/dist/Overlay/Overlay.js +3 -3
- package/dist/Overlay/OverlayScrim.js +5 -5
- package/dist/Overlay/useOverlay.js +3 -3
- package/dist/Pagination/Pagination.d.ts +1 -1
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +125 -72
- package/dist/Popover/Popover.js +16 -16
- package/dist/Popover/usePopover.js +7 -7
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +110 -92
- package/dist/PowerSearch/PowerSearchEditPopover.js +84 -84
- package/dist/PowerSearch/PowerSearchFilterEditor.js +3 -3
- package/dist/PowerSearch/PowerSearchToken.js +5 -5
- package/dist/PowerSearch/PowerSearchValueEditor.js +54 -54
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +25 -18
- package/dist/RadioList/RadioList.d.ts +7 -1
- package/dist/RadioList/RadioList.d.ts.map +1 -1
- package/dist/RadioList/RadioList.js +10 -8
- package/dist/RadioList/RadioListItem.d.ts +1 -1
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +30 -22
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +28 -10
- package/dist/Section/Section.js +5 -5
- package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +32 -10
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +18 -12
- package/dist/SelectableCard/SelectableCard.js +5 -5
- package/dist/Selector/Selector.d.ts +6 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +54 -45
- package/dist/Selector/SelectorOption.js +3 -3
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +38 -34
- package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +8 -6
- package/dist/SideNav/SideNavHeading.js +87 -87
- package/dist/SideNav/SideNavItem.js +42 -42
- package/dist/SideNav/SideNavSection.d.ts +1 -1
- package/dist/SideNav/SideNavSection.d.ts.map +1 -1
- package/dist/SideNav/SideNavSection.js +18 -16
- package/dist/Skeleton/Skeleton.js +3 -3
- package/dist/Slider/Slider.d.ts +6 -0
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +31 -22
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +10 -10
- package/dist/StatusDot/StatusDot.js +5 -5
- package/dist/Switch/Switch.d.ts +13 -4
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +41 -30
- package/dist/TabList/Tab.js +18 -18
- package/dist/TabList/TabList.js +5 -5
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +57 -30
- package/dist/TabList/tab.markers.stylex.d.ts +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +51 -39
- package/dist/Table/Table.js +7 -7
- package/dist/Table/TableBody.d.ts +1 -1
- package/dist/Table/TableBody.d.ts.map +1 -1
- package/dist/Table/TableBody.js +9 -5
- package/dist/Table/TableCell.d.ts.map +1 -1
- package/dist/Table/TableCell.js +76 -7
- package/dist/Table/TableFooter.d.ts +1 -1
- package/dist/Table/TableFooter.d.ts.map +1 -1
- package/dist/Table/TableFooter.js +9 -5
- package/dist/Table/TableHeader.d.ts +1 -1
- package/dist/Table/TableHeader.d.ts.map +1 -1
- package/dist/Table/TableHeader.js +9 -5
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/TableRow.js +5 -5
- 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/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +14 -11
- package/dist/Table/plugins/filtering/useTableFiltering.js +71 -71
- package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/paginateData.js +5 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
- package/dist/Table/plugins/rowExpansion/index.d.ts +3 -0
- package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -0
- package/dist/Table/plugins/rowExpansion/index.js +3 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +90 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +398 -0
- package/dist/Table/plugins/selection/useTableSelection.js +18 -18
- package/dist/Table/plugins/selection/useTableSelectionState.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelectionState.js +11 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +17 -17
- package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortableState.js +8 -4
- package/dist/Table/tableContextMenu.d.ts +5 -1
- package/dist/Table/tableContextMenu.d.ts.map +1 -1
- package/dist/Table/tableContextMenu.js +19 -12
- package/dist/Text/Text.d.ts +1 -1
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +14 -13
- package/dist/Text/text.stylex.d.ts +35 -0
- package/dist/Text/text.stylex.d.ts.map +1 -1
- package/dist/Text/text.stylex.js +52 -1
- package/dist/TextArea/TextArea.js +14 -14
- package/dist/TextInput/TextInput.js +15 -15
- package/dist/Thumbnail/Thumbnail.d.ts +3 -2
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +30 -29
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +26 -21
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +37 -26
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +25 -17
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +23 -11
- package/dist/Toast/useToast.js +4 -4
- package/dist/ToggleButton/ToggleButton.js +12 -12
- package/dist/ToggleButton/ToggleButtonGroup.js +5 -5
- package/dist/Token/Token.js +21 -21
- package/dist/Tokenizer/Tokenizer.d.ts +6 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +38 -29
- package/dist/Toolbar/Toolbar.js +18 -18
- package/dist/Tooltip/Tooltip.js +11 -11
- package/dist/Tooltip/useTooltip.js +3 -3
- package/dist/TopNav/TopNav.js +32 -32
- package/dist/TopNav/TopNavHeading.js +67 -67
- package/dist/TopNav/TopNavItem.js +5 -5
- package/dist/TopNav/TopNavMegaMenu.js +30 -30
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +25 -14
- package/dist/TopNav/TopNavMegaMenuItem.js +16 -16
- package/dist/TopNav/TopNavMenu.js +32 -32
- package/dist/TreeList/TreeList.js +8 -8
- package/dist/TreeList/TreeListBranches.js +11 -11
- package/dist/TreeList/TreeListItem.js +30 -30
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +23 -20
- package/dist/Typeahead/Typeahead.js +12 -12
- package/dist/Typeahead/TypeaheadItem.js +10 -10
- package/dist/VStack/VStack.js +3 -3
- package/dist/astryx.css +23 -0
- package/dist/astryx.umd.js +60 -58
- package/dist/astryx.umd.js.map +4 -4
- package/dist/docs-types.d.ts +13 -1
- package/dist/docs-types.d.ts.map +1 -1
- package/dist/hooks/focusableSelector.d.ts +1 -1
- package/dist/hooks/focusableSelector.d.ts.map +1 -1
- package/dist/hooks/focusableSelector.js +1 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useFocusTrap.d.ts +3 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +38 -1
- package/dist/hooks/useHotkeys.d.ts +51 -0
- package/dist/hooks/useHotkeys.d.ts.map +1 -0
- package/dist/hooks/useHotkeys.js +160 -0
- package/dist/hooks/useInteractiveRole.d.ts +6 -2
- package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
- package/dist/hooks/useInteractiveRole.js +6 -2
- package/dist/hooks/useKeyboardHint.js +9 -9
- package/dist/hooks/useStreamingText.d.ts +3 -1
- package/dist/hooks/useStreamingText.d.ts.map +1 -1
- package/dist/hooks/useStreamingText.js +14 -5
- package/dist/theme/MediaTheme.js +3 -3
- package/dist/theme/Theme.js +7 -7
- package/dist/theme/defineTheme.d.ts +1 -1
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/expandColorScale.d.ts.map +1 -1
- package/dist/theme/expandColorScale.js +10 -3
- package/dist/theme/hct.d.ts +0 -15
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +9 -9
- package/dist/theme/syntax/SyntaxTheme.js +5 -5
- package/dist/theme/tokens.d.ts +10 -2
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +220 -4
- package/dist/utils/color.d.ts +42 -0
- package/dist/utils/color.d.ts.map +1 -0
- package/dist/utils/color.js +150 -0
- package/dist/utils/composeEventHandlers.d.ts +30 -0
- package/dist/utils/composeEventHandlers.d.ts.map +1 -0
- package/dist/utils/composeEventHandlers.js +40 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -1
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +8 -5
- package/package.json +3 -3
- package/src/AlertDialog/AlertDialog.tsx +2 -0
- package/src/AppShell/AppShell.tsx +2 -0
- package/src/AspectRatio/AspectRatio.doc.mjs +1 -1
- package/src/Avatar/Avatar.doc.mjs +13 -2
- package/src/Avatar/Avatar.test.tsx +32 -1
- package/src/Avatar/Avatar.tsx +12 -20
- package/src/Banner/Banner.doc.mjs +8 -0
- package/src/Banner/Banner.test.tsx +38 -0
- package/src/Banner/Banner.tsx +8 -1
- package/src/Button/Button.tsx +39 -6
- package/src/ButtonGroup/ButtonGroup.doc.mjs +1 -1
- package/src/Calendar/Calendar.doc.mjs +1 -1
- package/src/Calendar/Calendar.test.tsx +201 -17
- package/src/Calendar/Calendar.tsx +79 -26
- package/src/Calendar/dayCellUtils.test.ts +306 -1
- package/src/Calendar/dayCellUtils.ts +206 -13
- package/src/Calendar/styles.ts +12 -2
- package/src/Card/Card.doc.mjs +1 -1
- package/src/Card/Card.tsx +16 -6
- package/src/Carousel/Carousel.doc.mjs +12 -12
- package/src/Carousel/Carousel.test.tsx +13 -0
- package/src/Carousel/Carousel.tsx +1 -0
- package/src/Chat/Chat.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.test.tsx +24 -0
- package/src/Chat/ChatComposerInput.tsx +17 -1
- package/src/Chat/ChatDictationButton.test.tsx +43 -0
- package/src/Chat/ChatDictationButton.tsx +4 -4
- package/src/Chat/ChatLayoutScrollButton.test.tsx +33 -0
- package/src/Chat/ChatLayoutScrollButton.tsx +3 -1
- package/src/Chat/ChatMessageMetadata.test.tsx +32 -0
- package/src/Chat/ChatMessageMetadata.tsx +4 -6
- package/src/Chat/ChatSystemMessage.test.tsx +26 -11
- package/src/Chat/ChatSystemMessage.tsx +7 -7
- package/src/Chat/ChatTokenizedText.test.tsx +29 -16
- package/src/Chat/ChatTokenizedText.tsx +15 -8
- package/src/Chat/ChatToolCalls.test.tsx +55 -0
- package/src/Chat/ChatToolCalls.tsx +10 -12
- package/src/Chat/index.ts +1 -4
- package/src/Chat/useChatNewMessages.test.tsx +4 -4
- package/src/CheckboxInput/CheckboxInput.doc.mjs +12 -4
- package/src/CheckboxInput/CheckboxInput.test.tsx +103 -0
- package/src/CheckboxInput/CheckboxInput.tsx +13 -0
- package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
- package/src/CheckboxList/CheckboxList.test.tsx +19 -0
- package/src/CheckboxList/CheckboxListItem.tsx +11 -2
- package/src/Citation/Citation.doc.mjs +5 -0
- package/src/ClickableCard/ClickableCard.tsx +45 -2
- package/src/Code/Code.test.tsx +54 -0
- package/src/Code/Code.tsx +48 -4
- package/src/Code/index.ts +1 -1
- package/src/CodeBlock/CodeBlock.doc.mjs +7 -2
- package/src/CodeBlock/CodeBlock.test.tsx +122 -3
- package/src/CodeBlock/CodeBlock.tsx +62 -4
- package/src/CodeBlock/index.ts +1 -1
- package/src/Collapsible/Collapsible.doc.mjs +8 -4
- package/src/Collapsible/Collapsible.test.tsx +405 -0
- package/src/Collapsible/Collapsible.tsx +86 -10
- package/src/Collapsible/CollapsibleGroup.doc.mjs +27 -3
- package/src/Collapsible/CollapsibleGroup.test.tsx +318 -0
- package/src/Collapsible/CollapsibleGroup.tsx +107 -9
- package/src/Collapsible/CollapsibleGroupContext.tsx +42 -2
- package/src/Collapsible/index.ts +4 -0
- package/src/Collapsible/useCollapsible.ts +20 -6
- package/src/CommandPalette/CommandPalette.tsx +5 -3
- package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +5 -0
- package/src/CommandPalette/CommandPaletteEmpty.tsx +15 -1
- package/src/CommandPalette/CommandPaletteGroup.doc.mjs +10 -0
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +6 -0
- package/src/CommandPalette/CommandPaletteItem.doc.mjs +6 -0
- package/src/CommandPalette/CommandPaletteList.doc.mjs +9 -0
- package/src/ContextMenu/ContextMenu.doc.mjs +15 -0
- package/src/ContextMenu/ContextMenu.test.tsx +15 -0
- package/src/ContextMenu/ContextMenu.tsx +19 -1
- package/src/ContextMenu/ContextMenuItem.doc.mjs +6 -0
- package/src/DateInput/DateInput.doc.mjs +6 -1
- package/src/DateInput/DateInput.test.tsx +11 -20
- package/src/DateRangeInput/DateRangeInput.doc.mjs +1 -1
- package/src/DateRangeInput/DateRangeInput.test.tsx +31 -44
- package/src/DateRangeInput/DateRangeInput.tsx +2 -2
- package/src/DateTimeInput/DateTimeInput.doc.mjs +4 -3
- package/src/DateTimeInput/DateTimeInput.test.tsx +118 -16
- package/src/DateTimeInput/DateTimeInput.tsx +9 -8
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/DialogHeader.doc.mjs +45 -0
- package/src/Divider/Divider.tsx +1 -23
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenu.test.tsx +5 -3
- package/src/DropdownMenu/DropdownMenuItem.tsx +5 -17
- package/src/EmptyState/EmptyState.doc.mjs +1 -1
- package/src/Field/Field.doc.mjs +1 -1
- package/src/Field/FieldLabel.test.tsx +2 -2
- package/src/FieldStatus/FieldStatus.test.tsx +282 -0
- package/src/FileInput/FileInput.doc.mjs +1 -1
- package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -3
- package/src/Grid/Grid.doc.mjs +3 -3
- package/src/Grid/Grid.test.tsx +43 -18
- package/src/Grid/Grid.tsx +26 -9
- package/src/Icon/Icon.test.tsx +41 -29
- package/src/Icon/Icon.tsx +6 -2
- package/src/InputGroup/InputGroup.tsx +2 -2
- package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +185 -0
- package/src/Item/Item.tsx +1 -1
- package/src/Layout/Layout.test.tsx +285 -0
- package/src/Layout/LayoutContent.doc.mjs +12 -0
- package/src/Layout/LayoutPanel.doc.mjs +40 -0
- package/src/Layout/LayoutSlots.test.tsx +364 -0
- package/src/Layout/__tests__/edgeCompensation.test.tsx +72 -0
- package/src/Lightbox/Lightbox.doc.mjs +5 -0
- package/src/Lightbox/Lightbox.test.tsx +123 -2
- package/src/Lightbox/Lightbox.tsx +29 -1
- package/src/Markdown/Markdown.test.tsx +23 -0
- package/src/Markdown/Markdown.tsx +9 -7
- package/src/Markdown/incremental.test.ts +36 -0
- package/src/Markdown/parser.perf.test.ts +34 -12
- package/src/Markdown/parser.test.ts +210 -0
- package/src/Markdown/parser.ts +301 -6
- package/src/MobileNav/MobileNav.doc.mjs +20 -0
- package/src/MultiSelector/MultiSelector.doc.mjs +14 -1
- package/src/MultiSelector/MultiSelector.test.tsx +33 -0
- package/src/MultiSelector/MultiSelector.tsx +20 -0
- package/src/NavMenu/NavMenu.doc.mjs +15 -0
- package/src/NumberInput/NumberInput.test.tsx +48 -3
- package/src/NumberInput/NumberInput.tsx +32 -15
- package/src/Outline/parseOutlineFromMarkdown.test.ts +80 -0
- package/src/OverflowList/OverflowList.test.tsx +416 -0
- package/src/Overlay/Overlay.doc.mjs +6 -0
- package/src/Overlay/Overlay.test.tsx +356 -0
- package/src/Pagination/Pagination.test.tsx +162 -0
- package/src/Pagination/Pagination.tsx +80 -26
- package/src/Popover/Popover.test.tsx +65 -0
- package/src/PowerSearch/PowerSearch.doc.mjs +4 -4
- package/src/PowerSearch/PowerSearch.test.tsx +109 -1
- package/src/PowerSearch/PowerSearch.tsx +37 -16
- package/src/ProgressBar/ProgressBar.test.tsx +30 -0
- package/src/ProgressBar/ProgressBar.tsx +12 -5
- package/src/RadioList/RadioList.doc.mjs +7 -1
- package/src/RadioList/RadioList.test.tsx +65 -0
- package/src/RadioList/RadioList.tsx +10 -1
- package/src/RadioList/RadioListItem.tsx +13 -4
- package/src/Resizable/ResizeHandle.test.tsx +218 -0
- package/src/Resizable/ResizeHandle.tsx +22 -4
- package/src/Section/Section.test.tsx +4 -10
- package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
- package/src/SegmentedControl/SegmentedControl.test.tsx +192 -0
- package/src/SegmentedControl/SegmentedControl.tsx +27 -5
- package/src/SegmentedControl/SegmentedControlItem.tsx +9 -4
- package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
- package/src/Selector/Selector.doc.mjs +12 -1
- package/src/Selector/Selector.test.tsx +30 -0
- package/src/Selector/Selector.tsx +18 -0
- package/src/SideNav/SideNav.doc.mjs +7 -1
- package/src/SideNav/SideNav.test.tsx +66 -0
- package/src/SideNav/SideNav.tsx +6 -2
- package/src/SideNav/SideNavCollapseButton.tsx +4 -3
- package/src/SideNav/SideNavSection.tsx +6 -4
- package/src/SizeContext/SizeContext.test.tsx +226 -0
- package/src/Slider/Slider.doc.mjs +14 -2
- package/src/Slider/Slider.test.tsx +30 -0
- package/src/Slider/Slider.tsx +20 -0
- package/src/Spinner/Spinner.tsx +1 -0
- package/src/Switch/Switch.doc.mjs +21 -9
- package/src/Switch/Switch.test.tsx +137 -0
- package/src/Switch/Switch.tsx +32 -7
- package/src/TabList/TabList.doc.mjs +3 -3
- package/src/TabList/TabList.test.tsx +185 -1
- package/src/TabList/TabMenu.tsx +45 -9
- package/src/Table/BaseTable.tsx +16 -3
- package/src/Table/Table.test.tsx +87 -0
- package/src/Table/TableBody.tsx +15 -2
- package/src/Table/TableCell.tsx +87 -8
- package/src/Table/TableFooter.tsx +15 -2
- package/src/Table/TableHeader.tsx +15 -2
- package/src/Table/index.ts +5 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +13 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +3 -1
- package/src/Table/plugins/pagination/paginateData.ts +5 -1
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +13 -0
- package/src/Table/plugins/rowExpansion/index.ts +7 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +155 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +590 -0
- package/src/Table/plugins/selection/useTableSelectionState.test.tsx +23 -0
- package/src/Table/plugins/selection/useTableSelectionState.tsx +11 -6
- package/src/Table/plugins/sortable/useTableSortableState.test.tsx +35 -1
- package/src/Table/plugins/sortable/useTableSortableState.tsx +8 -4
- package/src/Table/tableContextMenu.test.tsx +27 -3
- package/src/Table/tableContextMenu.tsx +20 -2
- package/src/Table/useTablePagination.doc.mjs +4 -1
- package/src/Table/useTableRowExpansion.doc.mjs +80 -0
- package/src/Table/useTableSortable.doc.mjs +4 -1
- package/src/Text/Text.doc.mjs +2 -2
- package/src/Text/Text.test.tsx +11 -0
- package/src/Text/Text.tsx +4 -2
- package/src/Text/text.stylex.ts +41 -0
- package/src/TextArea/TextArea.doc.mjs +1 -1
- package/src/TextArea/TextArea.test.tsx +3 -3
- package/src/TextInput/TextInput.doc.mjs +1 -1
- package/src/TextInput/TextInput.test.tsx +3 -3
- package/src/Thumbnail/Thumbnail.test.tsx +36 -2
- package/src/Thumbnail/Thumbnail.tsx +4 -2
- package/src/TimeInput/TimeInput.doc.mjs +11 -6
- package/src/TimeInput/TimeInput.test.tsx +37 -0
- package/src/TimeInput/TimeInput.tsx +11 -1
- package/src/Timestamp/Timestamp.doc.mjs +1 -1
- package/src/Timestamp/Timestamp.test.tsx +52 -0
- package/src/Timestamp/Timestamp.tsx +30 -16
- package/src/Toast/Toast.tsx +11 -3
- package/src/Toast/ToastViewport.test.tsx +64 -0
- package/src/Toast/ToastViewport.tsx +12 -0
- package/src/ToggleButton/ToggleButton.doc.mjs +1 -0
- package/src/Tokenizer/Tokenizer.doc.mjs +16 -4
- package/src/Tokenizer/Tokenizer.test.tsx +33 -0
- package/src/Tokenizer/Tokenizer.tsx +19 -0
- package/src/Toolbar/Toolbar.test.tsx +1 -1
- package/src/TopNav/TopNav.doc.mjs +1 -1
- package/src/TopNav/TopNav.test.tsx +18 -0
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +9 -2
- package/src/TreeList/TreeList.doc.mjs +2 -2
- package/src/Typeahead/BaseTypeahead.doc.mjs +19 -0
- package/src/Typeahead/BaseTypeahead.tsx +5 -2
- package/src/Typeahead/Typeahead.doc.mjs +7 -2
- package/src/Typeahead/Typeahead.test.tsx +45 -1
- package/src/__tests__/TestIcon.tsx +26 -0
- package/src/__tests__/fastRoleQueries.ts +66 -0
- package/src/docPropReferences.test.ts +178 -0
- package/src/docs-types.ts +14 -0
- package/src/hooks/focusableSelector.ts +1 -1
- package/src/hooks/index.ts +3 -0
- package/src/hooks/useFocusTrap.doc.mjs +4 -2
- package/src/hooks/useFocusTrap.test.tsx +149 -1
- package/src/hooks/useFocusTrap.ts +50 -1
- package/src/hooks/useHotkeys.doc.mjs +52 -0
- package/src/hooks/useHotkeys.test.ts +245 -0
- package/src/hooks/useHotkeys.ts +203 -0
- package/src/hooks/useInteractiveRole.ts +12 -4
- package/src/hooks/useKeyboardHint.doc.mjs +6 -6
- package/src/hooks/useStreamingText.test.ts +54 -19
- package/src/hooks/useStreamingText.ts +16 -5
- package/src/theme/SyntaxTheme.doc.mjs +4 -4
- package/src/theme/defineTheme.ts +4 -13
- package/src/theme/derivedVarRegistry.test.ts +2 -2
- package/src/theme/expandColorScale.test.ts +29 -0
- package/src/theme/expandColorScale.ts +11 -6
- package/src/theme/hct.ts +9 -17
- package/src/theme/tokens.test.ts +182 -9
- package/src/theme/tokens.ts +239 -4
- package/src/theme/useTheme.test.tsx +20 -0
- package/src/utils/color.test.ts +133 -0
- package/src/utils/color.ts +148 -0
- package/src/utils/composeEventHandlers.test.ts +71 -0
- package/src/utils/composeEventHandlers.ts +44 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/mergeProps.test.ts +166 -0
- package/src/utils/sharedResizeObserver.test.ts +2 -2
- package/src/utils/timeParser.test.ts +13 -0
- package/src/utils/timeParser.ts +8 -5
|
@@ -20,15 +20,15 @@ export const docs = {
|
|
|
20
20
|
],
|
|
21
21
|
anatomy: [
|
|
22
22
|
{name: 'Scroll container', required: true, description: 'The horizontal overflow area that holds all items.'},
|
|
23
|
-
{name: 'Items', required: true, description: 'The children rendered in a row.
|
|
23
|
+
{name: 'Items', required: true, description: 'The children rendered in a row inside the scroll container. With hasSnap, each item snaps to the start edge.'},
|
|
24
24
|
{name: 'Fade edges', required: false, description: 'Gradient fades on the left and right edges that indicate more content is available. Enabled by default, disable with hasEdgeFade={false}.'},
|
|
25
|
-
{name: 'Navigation buttons', required: false, description: 'Prev/next buttons that appear
|
|
25
|
+
{name: 'Navigation buttons', required: false, description: 'Prev/next buttons that appear when the content can scroll in that direction. Enabled by default, disable with hasButtons={false}.'},
|
|
26
26
|
],
|
|
27
27
|
},
|
|
28
28
|
props: [
|
|
29
29
|
{name: 'children', type: 'ReactNode', description: 'Carousel items rendered in a horizontal scroll container.', required: true},
|
|
30
30
|
{name: 'gap', type: "0 | 0.5 | 1 | 1.5 | 2 | 3 | 4", description: 'Gap between items using the spacing token scale.', default: '1'},
|
|
31
|
-
{name: 'hasButtons', type: 'boolean', description: 'Show prev/next navigation buttons
|
|
31
|
+
{name: 'hasButtons', type: 'boolean', description: 'Show prev/next navigation buttons when content is scrollable.', default: 'true'},
|
|
32
32
|
{name: 'hasEdgeFade', type: 'boolean', description: 'Show a gradient edge-fade mask when content overflows, signalling that more items exist off-screen.', default: 'true'},
|
|
33
33
|
{name: 'hasSnap', type: 'boolean', description: 'Enable scroll-snap so each child snaps to the start edge.', default: 'false'},
|
|
34
34
|
{name: 'padding', type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10', description: 'Inline padding inside the scroll container, with matching scroll-padding so snap points align to the content edge.'},
|
|
@@ -59,20 +59,20 @@ export const docs = {
|
|
|
59
59
|
export const docsZh = {
|
|
60
60
|
usage: {
|
|
61
61
|
description:
|
|
62
|
-
'Carousel
|
|
62
|
+
'Carousel 在项目超出可用宽度时将一行项目水平滚动。适用于卡片网格、图片画廊、产品列表,或任何希望无需占据整页即可浏览的项目集合。',
|
|
63
63
|
bestPractices: [
|
|
64
|
-
{guidance: true, description: '
|
|
65
|
-
{guidance: true, description: '
|
|
66
|
-
{guidance: true, description: '
|
|
67
|
-
{guidance: false, description: '
|
|
68
|
-
{guidance: false, description: '
|
|
69
|
-
{guidance: false, description: '
|
|
64
|
+
{guidance: true, description: '当每个项目应精确对齐到起始边缘时启用滚动吸附,例如画廊或产品列表。'},
|
|
65
|
+
{guidance: true, description: '始终提供描述轮播内容的 aria-label,例如"精选产品"或"团队成员"。'},
|
|
66
|
+
{guidance: true, description: '使用一致的间距和项目宽度,让轮播看起来是有意为之,而不是内容意外溢出。'},
|
|
67
|
+
{guidance: false, description: '将每位用户都必须看到的内容放入轮播。并非所有人都会水平滚动,关键内容应放在首屏。'},
|
|
68
|
+
{guidance: false, description: '自动轮播项目。让用户按自己的节奏滚动。'},
|
|
69
|
+
{guidance: false, description: '嵌套轮播。轮播中嵌套轮播会造成困惑并破坏键盘导航。'},
|
|
70
70
|
],
|
|
71
71
|
},
|
|
72
72
|
propDescriptions: {
|
|
73
73
|
children: '在水平滚动容器中渲染的轮播项目。',
|
|
74
74
|
gap: '使用间距令牌比例的项目间距。',
|
|
75
|
-
hasButtons: '
|
|
75
|
+
hasButtons: '内容可滚动时显示上一个/下一个导航按钮。',
|
|
76
76
|
hasEdgeFade: '内容溢出时显示渐变边缘遮罩,提示屏幕外还有更多项目。',
|
|
77
77
|
hasSnap: '启用滚动吸附,使每个子元素吸附到起始边缘。',
|
|
78
78
|
padding: '滚动容器内的内联内边距,并设置匹配的 scroll-padding,使吸附点与内容边缘对齐。',
|
|
@@ -98,7 +98,7 @@ export const docsDense = {
|
|
|
98
98
|
propDescriptions: {
|
|
99
99
|
children: 'carousel items in horizontal scroll',
|
|
100
100
|
gap: 'item spacing via spacing token scale',
|
|
101
|
-
hasButtons: 'prev/next buttons
|
|
101
|
+
hasButtons: 'prev/next buttons when content is scrollable',
|
|
102
102
|
hasEdgeFade: 'gradient edge-fade mask on overflow',
|
|
103
103
|
hasSnap: 'scroll-snap; children snap to start edge',
|
|
104
104
|
padding: 'inline padding; scroll-padding keeps snap points on content edge',
|
|
@@ -38,6 +38,19 @@ describe('Carousel', () => {
|
|
|
38
38
|
expect(region).toHaveAttribute('aria-roledescription', 'carousel');
|
|
39
39
|
});
|
|
40
40
|
|
|
41
|
+
it('makes the scroll container keyboard-focusable', () => {
|
|
42
|
+
render(
|
|
43
|
+
<Carousel aria-label="Photos">
|
|
44
|
+
<div>Item</div>
|
|
45
|
+
</Carousel>,
|
|
46
|
+
);
|
|
47
|
+
// The inner scroll container overflows, so it must be reachable by
|
|
48
|
+
// keyboard (axe: scrollable-region-focusable).
|
|
49
|
+
const region = screen.getByRole('region', {name: 'Photos'});
|
|
50
|
+
const scroller = region.firstElementChild;
|
|
51
|
+
expect(scroller).toHaveAttribute('tabindex', '0');
|
|
52
|
+
});
|
|
53
|
+
|
|
41
54
|
it('applies data-testid', () => {
|
|
42
55
|
render(
|
|
43
56
|
<Carousel data-testid="my-carousel">
|
package/src/Chat/Chat.doc.mjs
CHANGED
|
@@ -17,7 +17,7 @@ export const docs = {
|
|
|
17
17
|
{className: 'astryx-chat-composer', visualProps: ['density']},
|
|
18
18
|
{className: 'astryx-chat-composer-input'},
|
|
19
19
|
{className: 'astryx-chat-composer-drawer', visualProps: ['collapsed']},
|
|
20
|
-
{className: 'astryx-chat-message', visualProps: ['sender']},
|
|
20
|
+
{className: 'astryx-chat-message', visualProps: ['sender', 'density']},
|
|
21
21
|
{
|
|
22
22
|
className: 'astryx-chat-message-bubble',
|
|
23
23
|
visualProps: ['sender', 'variant', 'density'],
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import {describe, it, expect, vi, afterEach} from 'vitest';
|
|
4
4
|
import {render, screen, fireEvent} from '@testing-library/react';
|
|
5
|
+
import {ChatComposer} from './ChatComposer';
|
|
5
6
|
import {ChatComposerInput} from './ChatComposerInput';
|
|
6
7
|
import type {
|
|
7
8
|
ChatComposerTrigger,
|
|
@@ -129,6 +130,29 @@ describe('ChatComposerInput', () => {
|
|
|
129
130
|
fireEvent.keyDown(textbox, {key: 'Enter'});
|
|
130
131
|
expect(onSubmit).not.toHaveBeenCalled();
|
|
131
132
|
});
|
|
133
|
+
|
|
134
|
+
it('keeps parent submit flow when child onChange observes input changes', () => {
|
|
135
|
+
const onSubmit = vi.fn();
|
|
136
|
+
const onInputChange = vi.fn();
|
|
137
|
+
render(
|
|
138
|
+
<ChatComposer
|
|
139
|
+
onSubmit={onSubmit}
|
|
140
|
+
input={<ChatComposerInput onChange={onInputChange} />}
|
|
141
|
+
/>,
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
const textbox = screen.getByRole('textbox');
|
|
145
|
+
textbox.textContent = 'hello world';
|
|
146
|
+
fireEvent.input(textbox);
|
|
147
|
+
|
|
148
|
+
expect(onInputChange).toHaveBeenLastCalledWith('hello world');
|
|
149
|
+
|
|
150
|
+
fireEvent.keyDown(textbox, {key: 'Enter'});
|
|
151
|
+
|
|
152
|
+
expect(onSubmit).toHaveBeenCalledWith('hello world');
|
|
153
|
+
expect(onInputChange).toHaveBeenLastCalledWith('');
|
|
154
|
+
expect(textbox.textContent).toBe('');
|
|
155
|
+
});
|
|
132
156
|
});
|
|
133
157
|
|
|
134
158
|
// Controlled-value sync used to overwrite `textContent` on every
|
|
@@ -283,12 +283,13 @@ function serialize(node: Node): string {
|
|
|
283
283
|
|
|
284
284
|
export function ChatComposerInput(props: ChatComposerInputProps) {
|
|
285
285
|
const composerCtx = useChatComposerContext();
|
|
286
|
+
const hasControlledValueProp = props.value !== undefined;
|
|
286
287
|
|
|
287
288
|
const {
|
|
288
289
|
ref,
|
|
289
290
|
handleRef,
|
|
290
291
|
value: controlledValue = composerCtx?.value,
|
|
291
|
-
onChange
|
|
292
|
+
onChange: onChangeProp,
|
|
292
293
|
placeholder = composerCtx?.placeholder ?? 'Type a message\u2026',
|
|
293
294
|
maxRows = 8,
|
|
294
295
|
triggers,
|
|
@@ -306,6 +307,21 @@ export function ChatComposerInput(props: ChatComposerInputProps) {
|
|
|
306
307
|
...rest
|
|
307
308
|
} = props;
|
|
308
309
|
|
|
310
|
+
const composerOnChange = composerCtx?.onChange;
|
|
311
|
+
const onChange = useCallback(
|
|
312
|
+
(nextValue: string) => {
|
|
313
|
+
if (hasControlledValueProp) {
|
|
314
|
+
onChangeProp?.(nextValue);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
composerOnChange?.(nextValue);
|
|
318
|
+
if (onChangeProp !== composerOnChange) {
|
|
319
|
+
onChangeProp?.(nextValue);
|
|
320
|
+
}
|
|
321
|
+
},
|
|
322
|
+
[composerOnChange, hasControlledValueProp, onChangeProp],
|
|
323
|
+
);
|
|
324
|
+
|
|
309
325
|
const editableRef = useRef<HTMLDivElement>(null);
|
|
310
326
|
const selfRef = useRef<ChatComposerInputHandle>(null);
|
|
311
327
|
const [isEmpty, setIsEmpty] = useState(true);
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import {describe, it, expect} from 'vitest';
|
|
4
|
+
import {render, screen} from '@testing-library/react';
|
|
5
|
+
import {ChatDictationButton} from './ChatDictationButton';
|
|
6
|
+
import type {UseSpeechRecognitionReturn} from './useSpeechRecognition';
|
|
7
|
+
|
|
8
|
+
const dictation: UseSpeechRecognitionReturn = {
|
|
9
|
+
isSupported: true,
|
|
10
|
+
isListening: false,
|
|
11
|
+
isSpeaking: false,
|
|
12
|
+
volume: 0,
|
|
13
|
+
bands: [0, 0, 0, 0, 0],
|
|
14
|
+
rawBands: [0, 0, 0, 0, 0],
|
|
15
|
+
interimTranscript: '',
|
|
16
|
+
start: () => {},
|
|
17
|
+
stop: () => {},
|
|
18
|
+
abort: () => {},
|
|
19
|
+
toggle: () => {},
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
describe('ChatDictationButton', () => {
|
|
23
|
+
it('renders a dictation button', () => {
|
|
24
|
+
render(
|
|
25
|
+
<ChatDictationButton dictation={dictation} data-testid="dictation" />,
|
|
26
|
+
);
|
|
27
|
+
expect(screen.getByTestId('dictation')).toBeTruthy();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('forwards rest props (data-*, aria-*, id) to the root element', () => {
|
|
31
|
+
render(
|
|
32
|
+
<ChatDictationButton
|
|
33
|
+
dictation={dictation}
|
|
34
|
+
data-testid="dictation"
|
|
35
|
+
data-custom="x"
|
|
36
|
+
id="dictate-1"
|
|
37
|
+
/>,
|
|
38
|
+
);
|
|
39
|
+
const root = screen.getByTestId('dictation');
|
|
40
|
+
expect(root).toHaveAttribute('data-custom', 'x');
|
|
41
|
+
expect(root).toHaveAttribute('id', 'dictate-1');
|
|
42
|
+
});
|
|
43
|
+
});
|
|
@@ -105,6 +105,7 @@ export function ChatDictationButton({
|
|
|
105
105
|
xstyle,
|
|
106
106
|
className,
|
|
107
107
|
style,
|
|
108
|
+
...rest
|
|
108
109
|
}: ChatDictationButtonProps) {
|
|
109
110
|
if (isHiddenWhenUnsupported && !dictation.isSupported) {
|
|
110
111
|
return null;
|
|
@@ -130,7 +131,8 @@ export function ChatDictationButton({
|
|
|
130
131
|
return (
|
|
131
132
|
<span
|
|
132
133
|
ref={ref}
|
|
133
|
-
{...mergeProps(stylex.props(styles.wrapper, xstyle), className, style)}
|
|
134
|
+
{...mergeProps(stylex.props(styles.wrapper, xstyle), className, style)}
|
|
135
|
+
{...rest}>
|
|
134
136
|
{isListening && (
|
|
135
137
|
<span
|
|
136
138
|
aria-hidden
|
|
@@ -161,9 +163,7 @@ export function ChatDictationButton({
|
|
|
161
163
|
aria-label={accessibleLabel}
|
|
162
164
|
variant="ghost"
|
|
163
165
|
size={size}
|
|
164
|
-
icon={
|
|
165
|
-
isListening ? undefined : <Icon icon="microphone" size={size} />
|
|
166
|
-
}
|
|
166
|
+
icon={isListening ? undefined : <Icon icon="microphone" size={size} />}
|
|
167
167
|
isIconOnly
|
|
168
168
|
onClick={dictation.toggle}
|
|
169
169
|
/>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import {describe, it, expect} from 'vitest';
|
|
4
|
+
import {render, screen} from '@testing-library/react';
|
|
5
|
+
import {ChatLayoutScrollButton} from './ChatLayoutScrollButton';
|
|
6
|
+
|
|
7
|
+
describe('ChatLayoutScrollButton', () => {
|
|
8
|
+
it('renders a scroll button', () => {
|
|
9
|
+
render(
|
|
10
|
+
<ChatLayoutScrollButton
|
|
11
|
+
isVisible
|
|
12
|
+
onClick={() => {}}
|
|
13
|
+
data-testid="scroll"
|
|
14
|
+
/>,
|
|
15
|
+
);
|
|
16
|
+
expect(screen.getByTestId('scroll')).toBeTruthy();
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it('forwards rest props (data-*, aria-*, id) to the root element', () => {
|
|
20
|
+
render(
|
|
21
|
+
<ChatLayoutScrollButton
|
|
22
|
+
isVisible
|
|
23
|
+
onClick={() => {}}
|
|
24
|
+
data-testid="scroll"
|
|
25
|
+
data-custom="x"
|
|
26
|
+
id="scroll-1"
|
|
27
|
+
/>,
|
|
28
|
+
);
|
|
29
|
+
const root = screen.getByTestId('scroll');
|
|
30
|
+
expect(root).toHaveAttribute('data-custom', 'x');
|
|
31
|
+
expect(root).toHaveAttribute('id', 'scroll-1');
|
|
32
|
+
});
|
|
33
|
+
});
|
|
@@ -118,11 +118,13 @@ export function ChatLayoutScrollButton({
|
|
|
118
118
|
xstyle,
|
|
119
119
|
className,
|
|
120
120
|
style,
|
|
121
|
+
...rest
|
|
121
122
|
}: ChatLayoutScrollButtonProps) {
|
|
122
123
|
return (
|
|
123
124
|
<div
|
|
124
125
|
ref={ref}
|
|
125
|
-
{...mergeProps(stylex.props(styles.wrapper, xstyle), className, style)}
|
|
126
|
+
{...mergeProps(stylex.props(styles.wrapper, xstyle), className, style)}
|
|
127
|
+
{...rest}>
|
|
126
128
|
<div
|
|
127
129
|
{...stylex.props(
|
|
128
130
|
styles.container,
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import {describe, it, expect} from 'vitest';
|
|
4
|
+
import {render, screen} from '@testing-library/react';
|
|
5
|
+
import {ChatMessageMetadata} from './ChatMessageMetadata';
|
|
6
|
+
|
|
7
|
+
describe('ChatMessageMetadata', () => {
|
|
8
|
+
it('renders metadata content', () => {
|
|
9
|
+
render(
|
|
10
|
+
<ChatMessageMetadata
|
|
11
|
+
timestamp="12:00"
|
|
12
|
+
status="read"
|
|
13
|
+
data-testid="meta"
|
|
14
|
+
/>,
|
|
15
|
+
);
|
|
16
|
+
expect(screen.getByTestId('meta')).toBeTruthy();
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it('forwards rest props (data-*, aria-*, id) to the root element', () => {
|
|
20
|
+
render(
|
|
21
|
+
<ChatMessageMetadata
|
|
22
|
+
timestamp="12:00"
|
|
23
|
+
data-testid="meta"
|
|
24
|
+
data-custom="x"
|
|
25
|
+
id="meta-1"
|
|
26
|
+
/>,
|
|
27
|
+
);
|
|
28
|
+
const root = screen.getByTestId('meta');
|
|
29
|
+
expect(root).toHaveAttribute('data-custom', 'x');
|
|
30
|
+
expect(root).toHaveAttribute('id', 'meta-1');
|
|
31
|
+
});
|
|
32
|
+
});
|
|
@@ -28,11 +28,7 @@ import type {BaseProps} from '../BaseProps';
|
|
|
28
28
|
import {themeProps} from '../utils/themeProps';
|
|
29
29
|
|
|
30
30
|
export type ChatMessageStatus =
|
|
31
|
-
| '
|
|
32
|
-
| 'sent'
|
|
33
|
-
| 'delivered'
|
|
34
|
-
| 'read'
|
|
35
|
-
| 'error';
|
|
31
|
+
'sending' | 'sent' | 'delivered' | 'read' | 'error';
|
|
36
32
|
|
|
37
33
|
const STATUS_CONFIG: Record<
|
|
38
34
|
ChatMessageStatus,
|
|
@@ -118,6 +114,7 @@ export function ChatMessageMetadata({
|
|
|
118
114
|
xstyle,
|
|
119
115
|
className,
|
|
120
116
|
style,
|
|
117
|
+
...rest
|
|
121
118
|
}: ChatMessageMetadataProps) {
|
|
122
119
|
const msgContext = useChatMessageContext();
|
|
123
120
|
const sender = msgContext?.sender ?? 'assistant';
|
|
@@ -142,7 +139,8 @@ export function ChatMessageMetadata({
|
|
|
142
139
|
),
|
|
143
140
|
className,
|
|
144
141
|
style,
|
|
145
|
-
)}
|
|
142
|
+
)}
|
|
143
|
+
{...rest}>
|
|
146
144
|
{timestamp != null && <span>{timestamp}</span>}
|
|
147
145
|
{timestamp != null && (footer != null || statusConfig != null) && (
|
|
148
146
|
<span>·</span>
|
|
@@ -11,26 +11,20 @@ describe('ChatSystemMessage', () => {
|
|
|
11
11
|
});
|
|
12
12
|
|
|
13
13
|
it('has role="status"', () => {
|
|
14
|
-
render(
|
|
15
|
-
<ChatSystemMessage data-testid="sys">Notice</ChatSystemMessage>,
|
|
16
|
-
);
|
|
14
|
+
render(<ChatSystemMessage data-testid="sys">Notice</ChatSystemMessage>);
|
|
17
15
|
const el = screen.getByTestId('sys');
|
|
18
16
|
expect(el.getAttribute('role')).toBe('status');
|
|
19
17
|
});
|
|
20
18
|
|
|
21
19
|
it('renders default variant without divider lines', () => {
|
|
22
|
-
const {container} = render(
|
|
23
|
-
<ChatSystemMessage>Hello</ChatSystemMessage>,
|
|
24
|
-
);
|
|
20
|
+
const {container} = render(<ChatSystemMessage>Hello</ChatSystemMessage>);
|
|
25
21
|
// Divider lines have aria-hidden, so check there are none
|
|
26
22
|
const hiddenElements = container.querySelectorAll('[aria-hidden]');
|
|
27
23
|
expect(hiddenElements.length).toBe(0);
|
|
28
24
|
});
|
|
29
25
|
|
|
30
26
|
it('renders divider variant with Divider', () => {
|
|
31
|
-
render(
|
|
32
|
-
<ChatSystemMessage variant="divider">Today</ChatSystemMessage>,
|
|
33
|
-
);
|
|
27
|
+
render(<ChatSystemMessage variant="divider">Today</ChatSystemMessage>);
|
|
34
28
|
expect(screen.getByText('Today')).toBeTruthy();
|
|
35
29
|
});
|
|
36
30
|
|
|
@@ -54,9 +48,30 @@ describe('ChatSystemMessage', () => {
|
|
|
54
48
|
});
|
|
55
49
|
|
|
56
50
|
it('applies data-testid', () => {
|
|
51
|
+
render(<ChatSystemMessage data-testid="my-sys">Hello</ChatSystemMessage>);
|
|
52
|
+
expect(screen.getByTestId('my-sys')).toBeTruthy();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('forwards rest props (data-*, id) while keeping its own role', () => {
|
|
57
56
|
render(
|
|
58
|
-
<ChatSystemMessage data-testid="
|
|
57
|
+
<ChatSystemMessage data-testid="sys" data-custom="x" id="sys-1">
|
|
58
|
+
Hello
|
|
59
|
+
</ChatSystemMessage>,
|
|
59
60
|
);
|
|
60
|
-
|
|
61
|
+
const el = screen.getByTestId('sys');
|
|
62
|
+
expect(el).toHaveAttribute('data-custom', 'x');
|
|
63
|
+
expect(el).toHaveAttribute('id', 'sys-1');
|
|
64
|
+
expect(el.getAttribute('role')).toBe('status');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('forwards rest props in the divider variant', () => {
|
|
68
|
+
render(
|
|
69
|
+
<ChatSystemMessage variant="divider" data-testid="sys" data-custom="x">
|
|
70
|
+
Today
|
|
71
|
+
</ChatSystemMessage>,
|
|
72
|
+
);
|
|
73
|
+
const el = screen.getByTestId('sys');
|
|
74
|
+
expect(el).toHaveAttribute('data-custom', 'x');
|
|
75
|
+
expect(el.getAttribute('role')).toBe('status');
|
|
61
76
|
});
|
|
62
77
|
});
|
|
@@ -120,21 +120,21 @@ export function ChatSystemMessage({
|
|
|
120
120
|
xstyle,
|
|
121
121
|
className,
|
|
122
122
|
style: styleProp,
|
|
123
|
-
'data-testid': testId,
|
|
124
123
|
ref,
|
|
124
|
+
...rest
|
|
125
125
|
}: ChatSystemMessageProps) {
|
|
126
126
|
if (variant === 'divider') {
|
|
127
127
|
return (
|
|
128
128
|
<div
|
|
129
129
|
ref={ref}
|
|
130
|
-
role="status"
|
|
131
|
-
data-testid={testId}
|
|
132
130
|
{...mergeProps(
|
|
133
131
|
themeProps('chat-system-message', {variant}),
|
|
134
132
|
stylex.props(styles.dividerWrap, xstyle),
|
|
135
133
|
className,
|
|
136
134
|
styleProp,
|
|
137
|
-
)}
|
|
135
|
+
)}
|
|
136
|
+
{...rest}
|
|
137
|
+
role="status">
|
|
138
138
|
<Divider label={children} />
|
|
139
139
|
</div>
|
|
140
140
|
);
|
|
@@ -143,14 +143,14 @@ export function ChatSystemMessage({
|
|
|
143
143
|
return (
|
|
144
144
|
<div
|
|
145
145
|
ref={ref}
|
|
146
|
-
role="status"
|
|
147
|
-
data-testid={testId}
|
|
148
146
|
{...mergeProps(
|
|
149
147
|
themeProps('chat-system-message', {variant}),
|
|
150
148
|
stylex.props(styles.root, xstyle),
|
|
151
149
|
className,
|
|
152
150
|
styleProp,
|
|
153
|
-
)}
|
|
151
|
+
)}
|
|
152
|
+
{...rest}
|
|
153
|
+
role="status">
|
|
154
154
|
<span {...stylex.props(styles.content)}>
|
|
155
155
|
{icon != null && <span {...stylex.props(styles.icon)}>{icon}</span>}
|
|
156
156
|
{children}
|
|
@@ -6,18 +6,12 @@ import {ChatTokenizedText} from './ChatTokenizedText';
|
|
|
6
6
|
|
|
7
7
|
describe('ChatTokenizedText', () => {
|
|
8
8
|
it('renders plain text when no tokens provided', () => {
|
|
9
|
-
render(
|
|
10
|
-
<ChatTokenizedText>Hello world</ChatTokenizedText>,
|
|
11
|
-
);
|
|
9
|
+
render(<ChatTokenizedText>Hello world</ChatTokenizedText>);
|
|
12
10
|
expect(screen.getByText('Hello world')).toBeInTheDocument();
|
|
13
11
|
});
|
|
14
12
|
|
|
15
13
|
it('renders plain text when tokens array is empty', () => {
|
|
16
|
-
render(
|
|
17
|
-
<ChatTokenizedText tokens={[]}>
|
|
18
|
-
Hello world
|
|
19
|
-
</ChatTokenizedText>,
|
|
20
|
-
);
|
|
14
|
+
render(<ChatTokenizedText tokens={[]}>Hello world</ChatTokenizedText>);
|
|
21
15
|
expect(screen.getByText('Hello world')).toBeInTheDocument();
|
|
22
16
|
});
|
|
23
17
|
|
|
@@ -48,8 +42,7 @@ describe('ChatTokenizedText', () => {
|
|
|
48
42
|
|
|
49
43
|
it('handles repeated occurrences of the same token', () => {
|
|
50
44
|
render(
|
|
51
|
-
<ChatTokenizedText
|
|
52
|
-
tokens={[{value: '@cindy', label: '@Cindy Zhang'}]}>
|
|
45
|
+
<ChatTokenizedText tokens={[{value: '@cindy', label: '@Cindy Zhang'}]}>
|
|
53
46
|
@cindy and @cindy again
|
|
54
47
|
</ChatTokenizedText>,
|
|
55
48
|
);
|
|
@@ -58,8 +51,7 @@ describe('ChatTokenizedText', () => {
|
|
|
58
51
|
|
|
59
52
|
it('renders text with no matching tokens as plain text', () => {
|
|
60
53
|
render(
|
|
61
|
-
<ChatTokenizedText
|
|
62
|
-
tokens={[{value: '@cindy', label: '@Cindy Zhang'}]}>
|
|
54
|
+
<ChatTokenizedText tokens={[{value: '@cindy', label: '@Cindy Zhang'}]}>
|
|
63
55
|
Hello world
|
|
64
56
|
</ChatTokenizedText>,
|
|
65
57
|
);
|
|
@@ -68,8 +60,7 @@ describe('ChatTokenizedText', () => {
|
|
|
68
60
|
|
|
69
61
|
it('handles tokens with special regex characters in pattern', () => {
|
|
70
62
|
render(
|
|
71
|
-
<ChatTokenizedText
|
|
72
|
-
tokens={[{value: '/search', label: '/search'}]}>
|
|
63
|
+
<ChatTokenizedText tokens={[{value: '/search', label: '/search'}]}>
|
|
73
64
|
Run /search now
|
|
74
65
|
</ChatTokenizedText>,
|
|
75
66
|
);
|
|
@@ -79,8 +70,7 @@ describe('ChatTokenizedText', () => {
|
|
|
79
70
|
|
|
80
71
|
it('preserves surrounding text', () => {
|
|
81
72
|
const {container} = render(
|
|
82
|
-
<ChatTokenizedText
|
|
83
|
-
tokens={[{value: '@cindy', label: '@Cindy Zhang'}]}>
|
|
73
|
+
<ChatTokenizedText tokens={[{value: '@cindy', label: '@Cindy Zhang'}]}>
|
|
84
74
|
Before @cindy after
|
|
85
75
|
</ChatTokenizedText>,
|
|
86
76
|
);
|
|
@@ -88,4 +78,27 @@ describe('ChatTokenizedText', () => {
|
|
|
88
78
|
expect(container.textContent).toContain('after');
|
|
89
79
|
expect(container.textContent).toContain('@Cindy Zhang');
|
|
90
80
|
});
|
|
81
|
+
|
|
82
|
+
it('forwards rest props (data-*, id) to the root element', () => {
|
|
83
|
+
render(
|
|
84
|
+
<ChatTokenizedText data-testid="tokenized" data-custom="x" id="tok-1">
|
|
85
|
+
Plain text
|
|
86
|
+
</ChatTokenizedText>,
|
|
87
|
+
);
|
|
88
|
+
const root = screen.getByTestId('tokenized');
|
|
89
|
+
expect(root).toHaveAttribute('data-custom', 'x');
|
|
90
|
+
expect(root).toHaveAttribute('id', 'tok-1');
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('forwards rest props when rendering tokens', () => {
|
|
94
|
+
render(
|
|
95
|
+
<ChatTokenizedText
|
|
96
|
+
tokens={[{value: '@cindy', label: '@Cindy Zhang'}]}
|
|
97
|
+
data-testid="tokenized"
|
|
98
|
+
data-custom="x">
|
|
99
|
+
Hi @cindy
|
|
100
|
+
</ChatTokenizedText>,
|
|
101
|
+
);
|
|
102
|
+
expect(screen.getByTestId('tokenized')).toHaveAttribute('data-custom', 'x');
|
|
103
|
+
});
|
|
91
104
|
});
|
|
@@ -91,6 +91,10 @@ export function ChatTokenizedText({
|
|
|
91
91
|
ref,
|
|
92
92
|
children,
|
|
93
93
|
tokens,
|
|
94
|
+
xstyle,
|
|
95
|
+
className,
|
|
96
|
+
style,
|
|
97
|
+
...rest
|
|
94
98
|
}: ChatTokenizedTextProps) {
|
|
95
99
|
if (!children || !tokens || tokens.length === 0) {
|
|
96
100
|
return (
|
|
@@ -98,8 +102,11 @@ export function ChatTokenizedText({
|
|
|
98
102
|
ref={ref}
|
|
99
103
|
{...mergeProps(
|
|
100
104
|
themeProps('chat-tokenized-text'),
|
|
101
|
-
stylex.props(styles.root),
|
|
102
|
-
|
|
105
|
+
stylex.props(styles.root, xstyle),
|
|
106
|
+
className,
|
|
107
|
+
style,
|
|
108
|
+
)}
|
|
109
|
+
{...rest}>
|
|
103
110
|
{children ?? ''}
|
|
104
111
|
</span>
|
|
105
112
|
);
|
|
@@ -111,8 +118,11 @@ export function ChatTokenizedText({
|
|
|
111
118
|
ref={ref}
|
|
112
119
|
{...mergeProps(
|
|
113
120
|
themeProps('chat-tokenized-text'),
|
|
114
|
-
stylex.props(styles.root),
|
|
115
|
-
|
|
121
|
+
stylex.props(styles.root, xstyle),
|
|
122
|
+
className,
|
|
123
|
+
style,
|
|
124
|
+
)}
|
|
125
|
+
{...rest}>
|
|
116
126
|
{parts}
|
|
117
127
|
</span>
|
|
118
128
|
);
|
|
@@ -124,10 +134,7 @@ ChatTokenizedText.displayName = 'ChatTokenizedText';
|
|
|
124
134
|
// Render
|
|
125
135
|
// =============================================================================
|
|
126
136
|
|
|
127
|
-
function renderTokens(
|
|
128
|
-
text: string,
|
|
129
|
-
tokens: ChatComposerToken[],
|
|
130
|
-
): ReactNode[] {
|
|
137
|
+
function renderTokens(text: string, tokens: ChatComposerToken[]): ReactNode[] {
|
|
131
138
|
const pattern = tokens.map(t => escapeRegExp(t.value)).join('|');
|
|
132
139
|
const regex = new RegExp(`(${pattern})`, 'g');
|
|
133
140
|
|
|
@@ -97,4 +97,59 @@ describe('ChatToolCalls', () => {
|
|
|
97
97
|
);
|
|
98
98
|
expect(screen.getByText('git status')).toBeInTheDocument();
|
|
99
99
|
});
|
|
100
|
+
|
|
101
|
+
it('exposes no aria-expanded on a call row without resultDetail', () => {
|
|
102
|
+
const {container} = render(
|
|
103
|
+
<ChatToolCalls calls={[{name: 'bash', status: 'complete'}]} />,
|
|
104
|
+
);
|
|
105
|
+
expect(container.querySelector('[aria-expanded]')).toBeNull();
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('wires disclosure semantics on an expandable call row', () => {
|
|
109
|
+
render(
|
|
110
|
+
<ChatToolCalls
|
|
111
|
+
calls={[
|
|
112
|
+
{
|
|
113
|
+
name: 'readFile',
|
|
114
|
+
status: 'complete',
|
|
115
|
+
resultDetail: <div>file contents here</div>,
|
|
116
|
+
},
|
|
117
|
+
]}
|
|
118
|
+
/>,
|
|
119
|
+
);
|
|
120
|
+
const row = screen.getByRole('button');
|
|
121
|
+
expect(row).toHaveAttribute('aria-expanded', 'false');
|
|
122
|
+
// Detail panel is conditionally mounted, so no aria-controls while closed.
|
|
123
|
+
expect(row).not.toHaveAttribute('aria-controls');
|
|
124
|
+
expect(screen.queryByText('file contents here')).not.toBeInTheDocument();
|
|
125
|
+
|
|
126
|
+
fireEvent.click(row);
|
|
127
|
+
|
|
128
|
+
expect(row).toHaveAttribute('aria-expanded', 'true');
|
|
129
|
+
const detailId = row.getAttribute('aria-controls');
|
|
130
|
+
expect(detailId).toBeTruthy();
|
|
131
|
+
const panel = document.getElementById(detailId as string);
|
|
132
|
+
expect(panel).not.toBeNull();
|
|
133
|
+
expect(panel).toHaveTextContent('file contents here');
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it('points the group header aria-controls at the content region', () => {
|
|
137
|
+
render(
|
|
138
|
+
<ChatToolCalls
|
|
139
|
+
defaultIsExpanded={true}
|
|
140
|
+
calls={[
|
|
141
|
+
{name: 'searchCode', status: 'complete'},
|
|
142
|
+
{name: 'readFile', status: 'complete'},
|
|
143
|
+
]}
|
|
144
|
+
/>,
|
|
145
|
+
);
|
|
146
|
+
const header = screen.getByRole('button');
|
|
147
|
+
expect(header).toHaveAttribute('aria-expanded', 'true');
|
|
148
|
+
const regionId = header.getAttribute('aria-controls');
|
|
149
|
+
expect(regionId).toBeTruthy();
|
|
150
|
+
const region = document.getElementById(regionId as string);
|
|
151
|
+
expect(region).not.toBeNull();
|
|
152
|
+
expect(region).toHaveTextContent('searchCode');
|
|
153
|
+
expect(region).toHaveTextContent('readFile');
|
|
154
|
+
});
|
|
100
155
|
});
|