@astryxdesign/core 0.1.4-canary.ff77e1c → 0.1.4
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/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +18 -20
- 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 +53 -55
- package/dist/AspectRatio/AspectRatio.d.ts +10 -48
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +12 -33
- package/dist/AspectRatio/index.d.ts +1 -1
- package/dist/AspectRatio/index.d.ts.map +1 -1
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +25 -27
- 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 +25 -32
- 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.js +19 -19
- package/dist/ButtonGroup/ButtonGroup.js +7 -7
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +48 -68
- package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
- 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 +2 -4
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +10 -18
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +21 -24
- package/dist/Carousel/carousel.markers.stylex.d.ts +7 -0
- package/dist/Carousel/carousel.markers.stylex.d.ts.map +1 -0
- package/dist/Carousel/carousel.markers.stylex.js +12 -0
- 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 +1 -1
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +15 -27
- package/dist/Chat/ChatDictationButton.d.ts +1 -1
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +11 -13
- 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 +10 -12
- 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 +12 -14
- 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 +15 -24
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +74 -81
- package/dist/Chat/index.d.ts +1 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +15 -15
- package/dist/CheckboxInput/CheckboxInput.d.ts +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +23 -25
- 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 +6 -8
- package/dist/Citation/Citation.js +10 -10
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +9 -32
- package/dist/Code/Code.js +3 -3
- package/dist/CodeBlock/CodeBlock.d.ts +1 -10
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +52 -88
- package/dist/Collapsible/Collapsible.d.ts +3 -9
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +22 -110
- package/dist/Collapsible/CollapsibleGroup.d.ts +7 -39
- package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroup.js +12 -73
- package/dist/Collapsible/CollapsibleGroupContext.d.ts +0 -31
- package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroupContext.js +3 -33
- package/dist/Collapsible/index.d.ts +0 -1
- package/dist/Collapsible/index.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.d.ts +1 -4
- package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.js +6 -20
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +34 -36
- package/dist/CommandPalette/CommandPaletteEmpty.js +3 -3
- 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 +2 -7
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +43 -76
- package/dist/DateInput/DateInput.js +18 -18
- package/dist/DateRangeInput/DateRangeInput.js +21 -21
- package/dist/DateTimeInput/DateTimeInput.d.ts +2 -5
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +26 -30
- 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.js +7 -7
- package/dist/DropdownMenu/DropdownMenu.js +10 -10
- package/dist/DropdownMenu/DropdownMenuItem.d.ts +17 -2
- 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 +3 -4
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/Grid.js +12 -29
- 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.d.ts +1 -5
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +3 -3
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +12 -16
- 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.d.ts +2 -29
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +31 -44
- 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 +31 -55
- 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/MetadataList/MetadataList.js +10 -10
- package/dist/MetadataList/MetadataListItem.js +15 -15
- package/dist/MobileNav/MobileNav.d.ts +1 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +23 -26
- package/dist/MobileNav/MobileNavToggle.js +5 -5
- package/dist/MoreMenu/MoreMenu.js +3 -3
- package/dist/MultiSelector/MultiSelector.js +56 -56
- 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 +32 -48
- 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 +72 -125
- 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 +92 -110
- 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 +18 -25
- package/dist/RadioList/RadioList.js +7 -7
- package/dist/RadioList/RadioListItem.d.ts +1 -1
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +21 -24
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +10 -28
- 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 +10 -32
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +12 -18
- package/dist/SelectableCard/SelectableCard.js +5 -5
- package/dist/Selector/Selector.js +46 -46
- package/dist/Selector/SelectorOption.js +3 -3
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +34 -38
- package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +6 -8
- 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 +16 -18
- package/dist/Skeleton/Skeleton.js +3 -3
- package/dist/Slider/Slider.js +23 -23
- package/dist/Spinner/Spinner.js +9 -9
- package/dist/StatusDot/StatusDot.js +5 -5
- package/dist/Switch/Switch.d.ts +4 -8
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +29 -34
- 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 +30 -57
- package/dist/TabList/tab.markers.stylex.d.ts +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +39 -50
- 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 +5 -9
- package/dist/Table/TableCell.js +3 -3
- package/dist/Table/TableFooter.d.ts +1 -1
- package/dist/Table/TableFooter.d.ts.map +1 -1
- package/dist/Table/TableFooter.js +5 -9
- package/dist/Table/TableHeader.d.ts +1 -1
- package/dist/Table/TableHeader.d.ts.map +1 -1
- package/dist/Table/TableHeader.js +5 -9
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/TableRow.js +5 -5
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +11 -14
- 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 +1 -5
- package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +22 -22
- 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 +1 -11
- 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 +4 -8
- package/dist/Table/tableContextMenu.js +9 -9
- package/dist/Text/Text.js +10 -10
- package/dist/TextArea/TextArea.js +14 -14
- package/dist/TextInput/TextInput.js +15 -15
- package/dist/Thumbnail/Thumbnail.d.ts +2 -3
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +29 -30
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +21 -26
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +26 -37
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +17 -25
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +11 -23
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +4 -44
- 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.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +34 -36
- package/dist/Toolbar/Toolbar.js +18 -18
- package/dist/Tooltip/Tooltip.js +11 -11
- package/dist/Tooltip/useTooltip.d.ts +1 -5
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- 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 +14 -25
- 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 +20 -23
- 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 +0 -7
- package/dist/astryx.umd.js +59 -59
- package/dist/astryx.umd.js.map +4 -4
- package/dist/docs-types.d.ts +2 -8
- 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 +0 -2
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +0 -1
- package/dist/hooks/useFocusTrap.d.ts +0 -3
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +1 -38
- package/dist/hooks/useInteractiveRole.d.ts +2 -6
- package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
- package/dist/hooks/useInteractiveRole.js +2 -6
- package/dist/hooks/useKeyboardHint.js +9 -9
- package/dist/hooks/useStreamingText.d.ts +1 -3
- package/dist/hooks/useStreamingText.d.ts.map +1 -1
- package/dist/hooks/useStreamingText.js +5 -14
- 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 +3 -10
- package/dist/theme/hct.d.ts +15 -0
- 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 +2 -10
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +4 -220
- package/dist/theme/useTheme.d.ts +2 -3
- package/dist/theme/useTheme.d.ts.map +1 -1
- package/dist/theme/useTheme.js +6 -73
- package/dist/utils/index.d.ts +0 -3
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -3
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +5 -8
- package/package.json +3 -3
- package/src/AlertDialog/AlertDialog.doc.mjs +0 -4
- package/src/AlertDialog/AlertDialog.tsx +0 -2
- package/src/AppShell/AppShell.tsx +0 -2
- package/src/AspectRatio/AspectRatio.doc.mjs +1 -28
- package/src/AspectRatio/AspectRatio.test.tsx +1 -142
- package/src/AspectRatio/AspectRatio.tsx +10 -70
- package/src/AspectRatio/index.ts +1 -5
- package/src/Avatar/Avatar.doc.mjs +0 -11
- package/src/Avatar/Avatar.test.tsx +1 -32
- package/src/Avatar/Avatar.tsx +20 -12
- package/src/AvatarGroup/AvatarGroup.doc.mjs +0 -1
- package/src/Banner/Banner.doc.mjs +0 -8
- package/src/Banner/Banner.test.tsx +0 -38
- package/src/Banner/Banner.tsx +1 -8
- package/src/Calendar/Calendar.doc.mjs +1 -1
- package/src/Calendar/Calendar.test.tsx +17 -122
- package/src/Calendar/Calendar.tsx +5 -26
- package/src/Calendar/dayCellUtils.ts +1 -3
- package/src/Calendar/styles.ts +2 -12
- package/src/Card/Card.doc.mjs +1 -1
- package/src/Card/Card.tsx +6 -16
- package/src/Carousel/Carousel.doc.mjs +12 -12
- package/src/Carousel/Carousel.test.tsx +0 -13
- package/src/Carousel/Carousel.tsx +2 -4
- package/src/Carousel/carousel.markers.stylex.ts +10 -0
- package/src/Chat/Chat.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.test.tsx +1 -27
- package/src/Chat/ChatComposerInput.tsx +15 -20
- package/src/Chat/ChatDictationButton.tsx +4 -4
- package/src/Chat/ChatLayoutScrollButton.tsx +1 -3
- package/src/Chat/ChatMessageMetadata.tsx +6 -4
- package/src/Chat/ChatSystemMessage.test.tsx +11 -26
- package/src/Chat/ChatSystemMessage.tsx +7 -7
- package/src/Chat/ChatTokenizedText.test.tsx +16 -29
- package/src/Chat/ChatTokenizedText.tsx +8 -15
- package/src/Chat/ChatToolCalls.test.tsx +0 -55
- package/src/Chat/ChatToolCalls.tsx +12 -10
- package/src/Chat/index.ts +4 -1
- package/src/Chat/useTriggerMenu.tsx +4 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -3
- package/src/CheckboxInput/CheckboxInput.test.tsx +4 -71
- package/src/CheckboxInput/CheckboxInput.tsx +0 -2
- package/src/CheckboxList/CheckboxList.test.tsx +0 -19
- package/src/CheckboxList/CheckboxListItem.tsx +2 -11
- package/src/Citation/Citation.doc.mjs +0 -5
- package/src/ClickableCard/ClickableCard.tsx +2 -45
- package/src/CodeBlock/CodeBlock.doc.mjs +2 -7
- package/src/CodeBlock/CodeBlock.test.tsx +3 -122
- package/src/CodeBlock/CodeBlock.tsx +4 -62
- package/src/Collapsible/Collapsible.doc.mjs +4 -8
- package/src/Collapsible/Collapsible.tsx +10 -86
- package/src/Collapsible/CollapsibleGroup.doc.mjs +3 -27
- package/src/Collapsible/CollapsibleGroup.test.tsx +0 -318
- package/src/Collapsible/CollapsibleGroup.tsx +9 -107
- package/src/Collapsible/CollapsibleGroupContext.tsx +2 -42
- package/src/Collapsible/index.ts +0 -4
- package/src/Collapsible/useCollapsible.ts +6 -20
- package/src/CommandPalette/CommandPalette.doc.mjs +0 -5
- package/src/CommandPalette/CommandPalette.tsx +3 -5
- package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +0 -5
- package/src/CommandPalette/CommandPaletteGroup.doc.mjs +0 -10
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +0 -6
- package/src/CommandPalette/CommandPaletteItem.doc.mjs +0 -6
- package/src/CommandPalette/CommandPaletteList.doc.mjs +0 -9
- package/src/ContextMenu/ContextMenu.doc.mjs +0 -15
- package/src/ContextMenu/ContextMenu.test.tsx +0 -87
- package/src/ContextMenu/ContextMenu.tsx +28 -87
- package/src/ContextMenu/ContextMenuItem.doc.mjs +0 -6
- package/src/DateInput/DateInput.test.tsx +20 -11
- package/src/DateRangeInput/DateRangeInput.test.tsx +44 -31
- package/src/DateTimeInput/DateTimeInput.doc.mjs +2 -3
- package/src/DateTimeInput/DateTimeInput.test.tsx +16 -118
- package/src/DateTimeInput/DateTimeInput.tsx +2 -8
- package/src/DateTimeInput/index.ts +0 -1
- package/src/Dialog/Dialog.doc.mjs +0 -4
- package/src/Dialog/DialogHeader.doc.mjs +0 -45
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenu.test.tsx +2 -22
- package/src/DropdownMenu/DropdownMenuItem.tsx +17 -5
- package/src/EmptyState/EmptyState.doc.mjs +1 -1
- package/src/Field/Field.test.tsx +4 -1
- package/src/Field/FieldLabel.test.tsx +2 -2
- package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +3 -0
- package/src/Grid/Grid.test.tsx +18 -43
- package/src/Grid/Grid.tsx +9 -26
- package/src/HoverCard/HoverCard.doc.mjs +6 -6
- package/src/HoverCard/useHoverCard.doc.mjs +5 -5
- package/src/HoverCard/useHoverCard.tsx +2 -9
- package/src/Icon/Icon.test.tsx +29 -41
- package/src/Icon/Icon.tsx +2 -6
- package/src/InputGroup/InputGroup.doc.mjs +0 -1
- package/src/InputGroup/InputGroup.tsx +2 -2
- package/src/Item/Item.tsx +1 -1
- package/src/Layer/useLayer.doc.mjs +2 -2
- package/src/Layer/useLayer.test.tsx +2 -221
- package/src/Layer/useLayer.tsx +30 -69
- package/src/Layout/LayoutContent.doc.mjs +0 -12
- package/src/Layout/LayoutPanel.doc.mjs +0 -40
- package/src/Lightbox/Lightbox.doc.mjs +0 -5
- package/src/Lightbox/Lightbox.test.tsx +2 -123
- package/src/Lightbox/Lightbox.tsx +1 -29
- package/src/Markdown/Markdown.tsx +7 -9
- package/src/Markdown/parser.perf.test.ts +12 -34
- package/src/MobileNav/MobileNav.test.tsx +0 -56
- package/src/MobileNav/MobileNav.tsx +8 -13
- package/src/NavMenu/NavMenu.doc.mjs +0 -15
- package/src/NumberInput/NumberInput.test.tsx +3 -48
- package/src/NumberInput/NumberInput.tsx +15 -32
- package/src/Outline/Outline.doc.mjs +0 -2
- package/src/Overlay/Overlay.doc.mjs +0 -6
- package/src/Pagination/Pagination.test.tsx +0 -162
- package/src/Pagination/Pagination.tsx +26 -80
- package/src/Popover/Popover.doc.mjs +6 -6
- package/src/Popover/Popover.test.tsx +0 -65
- package/src/Popover/usePopover.doc.mjs +1 -1
- package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
- package/src/PowerSearch/PowerSearch.test.tsx +1 -109
- package/src/PowerSearch/PowerSearch.tsx +16 -37
- package/src/ProgressBar/ProgressBar.doc.mjs +0 -2
- package/src/ProgressBar/ProgressBar.test.tsx +0 -30
- package/src/ProgressBar/ProgressBar.tsx +5 -12
- package/src/RadioList/RadioList.test.tsx +0 -19
- package/src/RadioList/RadioListItem.tsx +4 -9
- package/src/Resizable/ResizeHandle.tsx +4 -22
- package/src/SegmentedControl/SegmentedControl.doc.mjs +1 -1
- package/src/SegmentedControl/SegmentedControl.test.tsx +0 -192
- package/src/SegmentedControl/SegmentedControl.tsx +5 -27
- package/src/SegmentedControl/SegmentedControlItem.tsx +4 -9
- package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
- package/src/Selector/Selector.test.tsx +1 -27
- package/src/SideNav/SideNav.doc.mjs +1 -7
- package/src/SideNav/SideNav.test.tsx +0 -66
- package/src/SideNav/SideNav.tsx +2 -6
- package/src/SideNav/SideNavCollapseButton.tsx +3 -4
- package/src/SideNav/SideNavSection.tsx +4 -6
- package/src/Switch/Switch.doc.mjs +7 -7
- package/src/Switch/Switch.test.tsx +3 -102
- package/src/Switch/Switch.tsx +7 -20
- package/src/TabList/TabList.test.tsx +1 -185
- package/src/TabList/TabMenu.tsx +9 -45
- package/src/Table/BaseTable.tsx +2 -13
- package/src/Table/Table.doc.mjs +0 -5
- package/src/Table/Table.test.tsx +0 -87
- package/src/Table/TableBody.tsx +2 -15
- package/src/Table/TableFooter.tsx +2 -15
- package/src/Table/TableHeader.tsx +2 -15
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +0 -13
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +1 -3
- package/src/Table/plugins/pagination/paginateData.ts +1 -5
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +0 -13
- package/src/Table/plugins/selection/useTableSelectionState.test.tsx +0 -23
- package/src/Table/plugins/selection/useTableSelectionState.tsx +6 -11
- package/src/Table/plugins/sortable/useTableSortableState.test.tsx +1 -35
- package/src/Table/plugins/sortable/useTableSortableState.tsx +4 -8
- package/src/TextArea/TextArea.test.tsx +3 -3
- package/src/TextInput/TextInput.test.tsx +3 -3
- package/src/Thumbnail/Thumbnail.test.tsx +2 -36
- package/src/Thumbnail/Thumbnail.tsx +2 -4
- package/src/TimeInput/TimeInput.test.tsx +0 -37
- package/src/TimeInput/TimeInput.tsx +1 -11
- package/src/Timestamp/Timestamp.doc.mjs +1 -1
- package/src/Timestamp/Timestamp.test.tsx +0 -52
- package/src/Timestamp/Timestamp.tsx +16 -30
- package/src/Toast/Toast.tsx +3 -11
- package/src/Toast/ToastViewport.test.tsx +0 -64
- package/src/Toast/ToastViewport.tsx +0 -12
- package/src/Toast/useToast.tsx +0 -41
- package/src/ToggleButton/ToggleButton.doc.mjs +0 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
- package/src/Tokenizer/Tokenizer.test.tsx +0 -54
- package/src/Tokenizer/Tokenizer.tsx +4 -5
- package/src/Tooltip/Tooltip.doc.mjs +6 -6
- package/src/Tooltip/useTooltip.doc.mjs +5 -5
- package/src/Tooltip/useTooltip.tsx +2 -12
- package/src/TopNav/TopNav.doc.mjs +1 -1
- package/src/TopNav/TopNav.test.tsx +7 -23
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +2 -9
- package/src/TreeList/TreeList.doc.mjs +2 -2
- package/src/Typeahead/BaseTypeahead.doc.mjs +0 -19
- package/src/Typeahead/BaseTypeahead.tsx +2 -5
- package/src/Typeahead/Typeahead.doc.mjs +1 -1
- package/src/Typeahead/Typeahead.test.tsx +1 -45
- package/src/docs-types.ts +1 -9
- package/src/hooks/focusableSelector.ts +1 -1
- package/src/hooks/index.ts +0 -3
- package/src/hooks/useFocusTrap.doc.mjs +2 -4
- package/src/hooks/useFocusTrap.test.tsx +1 -149
- package/src/hooks/useFocusTrap.ts +1 -50
- package/src/hooks/useInteractiveRole.ts +4 -12
- package/src/hooks/useStreamingText.test.ts +19 -54
- package/src/hooks/useStreamingText.ts +5 -16
- package/src/hooks/useTreeFocus.test.tsx +3 -1
- package/src/reset.css +0 -29
- package/src/theme/SyntaxTheme.doc.mjs +4 -4
- package/src/theme/defineTheme.ts +13 -4
- package/src/theme/derivedVarRegistry.test.ts +2 -2
- package/src/theme/expandColorScale.test.ts +0 -29
- package/src/theme/expandColorScale.ts +6 -11
- package/src/theme/hct.ts +17 -9
- package/src/theme/tokens.test.ts +9 -182
- package/src/theme/tokens.ts +4 -239
- package/src/theme/useTheme.test.tsx +2 -126
- package/src/theme/useTheme.ts +6 -87
- package/src/utils/index.ts +0 -4
- package/src/utils/sharedResizeObserver.test.ts +2 -2
- package/src/utils/timeParser.test.ts +0 -13
- package/src/utils/timeParser.ts +5 -8
- package/dist/hooks/useHotkeys.d.ts +0 -51
- package/dist/hooks/useHotkeys.d.ts.map +0 -1
- package/dist/hooks/useHotkeys.js +0 -160
- package/dist/utils/color.d.ts +0 -42
- package/dist/utils/color.d.ts.map +0 -1
- package/dist/utils/color.js +0 -150
- package/dist/utils/composeEventHandlers.d.ts +0 -30
- package/dist/utils/composeEventHandlers.d.ts.map +0 -1
- package/dist/utils/composeEventHandlers.js +0 -40
- package/src/Chat/ChatDictationButton.test.tsx +0 -43
- package/src/Chat/ChatLayoutScrollButton.test.tsx +0 -33
- package/src/Chat/ChatMessageMetadata.test.tsx +0 -32
- package/src/Collapsible/Collapsible.test.tsx +0 -405
- package/src/FieldStatus/FieldStatus.test.tsx +0 -282
- package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +0 -185
- package/src/Layout/Layout.test.tsx +0 -285
- package/src/Layout/LayoutSlots.test.tsx +0 -364
- package/src/Outline/parseOutlineFromMarkdown.test.ts +0 -80
- package/src/OverflowList/OverflowList.test.tsx +0 -416
- package/src/Overlay/Overlay.test.tsx +0 -356
- package/src/Resizable/ResizeHandle.test.tsx +0 -218
- package/src/SizeContext/SizeContext.test.tsx +0 -226
- package/src/Toast/useToast.test.tsx +0 -258
- package/src/__tests__/TestIcon.tsx +0 -26
- package/src/__tests__/fastRoleQueries.ts +0 -66
- package/src/docPropReferences.test.ts +0 -178
- package/src/hooks/useHotkeys.doc.mjs +0 -52
- package/src/hooks/useHotkeys.test.ts +0 -245
- package/src/hooks/useHotkeys.ts +0 -203
- package/src/theme/themingTargets.test.ts +0 -353
- package/src/utils/color.test.ts +0 -133
- package/src/utils/color.ts +0 -148
- package/src/utils/composeEventHandlers.test.ts +0 -71
- package/src/utils/composeEventHandlers.ts +0 -44
- package/src/utils/mergeProps.test.ts +0 -166
|
@@ -12,11 +12,8 @@
|
|
|
12
12
|
import {describe, it, expect, vi} from 'vitest';
|
|
13
13
|
import {act, render, screen, within} from '@testing-library/react';
|
|
14
14
|
import userEvent from '@testing-library/user-event';
|
|
15
|
-
import {getButton} from '../__tests__/fastRoleQueries';
|
|
16
|
-
import * as stylex from '@stylexjs/stylex';
|
|
17
15
|
import {Calendar} from './Calendar';
|
|
18
16
|
import type {CalendarHandle} from './Calendar';
|
|
19
|
-
import {calendarStyles} from './styles';
|
|
20
17
|
|
|
21
18
|
/**
|
|
22
19
|
* Helper to find a day button by its day number.
|
|
@@ -27,7 +24,7 @@ import {calendarStyles} from './styles';
|
|
|
27
24
|
function getDayButton(day: number, month = 'January', year = 2026) {
|
|
28
25
|
// Match the full date pattern with the day number
|
|
29
26
|
const pattern = new RegExp(`${month}\\s+${day},\\s+${year}`);
|
|
30
|
-
return
|
|
27
|
+
return screen.getByRole('button', {name: pattern});
|
|
31
28
|
}
|
|
32
29
|
|
|
33
30
|
describe('Calendar', () => {
|
|
@@ -74,24 +71,6 @@ describe('Calendar', () => {
|
|
|
74
71
|
expect(screen.getByText(expectedLabel)).toBeInTheDocument();
|
|
75
72
|
});
|
|
76
73
|
|
|
77
|
-
it("marks today's cell with aria-current='date'", () => {
|
|
78
|
-
render(<Calendar />);
|
|
79
|
-
|
|
80
|
-
const now = new Date();
|
|
81
|
-
const iso = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;
|
|
82
|
-
|
|
83
|
-
const todayCell = document.querySelector(`button[data-date="${iso}"]`);
|
|
84
|
-
expect(todayCell).not.toBeNull();
|
|
85
|
-
expect(todayCell).toHaveAttribute('aria-current', 'date');
|
|
86
|
-
|
|
87
|
-
// Only today's cell is marked current.
|
|
88
|
-
const others = Array.from(
|
|
89
|
-
document.querySelectorAll('button[data-date]'),
|
|
90
|
-
).filter(el => el.getAttribute('data-date') !== iso);
|
|
91
|
-
expect(others.length).toBeGreaterThan(0);
|
|
92
|
-
others.forEach(el => expect(el).not.toHaveAttribute('aria-current'));
|
|
93
|
-
});
|
|
94
|
-
|
|
95
74
|
it('displays day names', () => {
|
|
96
75
|
render(<Calendar />);
|
|
97
76
|
|
|
@@ -118,11 +97,7 @@ describe('Calendar', () => {
|
|
|
118
97
|
render(<Calendar value="2026-01-15" focusDate="2026-01-01" />);
|
|
119
98
|
|
|
120
99
|
const day15 = getDayButton(15);
|
|
121
|
-
|
|
122
|
-
// (a plain button role does not permit aria-selected).
|
|
123
|
-
const gridcell15 = day15.closest('[role="gridcell"]');
|
|
124
|
-
expect(gridcell15).toHaveAttribute('aria-selected', 'true');
|
|
125
|
-
expect(day15).not.toHaveAttribute('aria-selected');
|
|
100
|
+
expect(day15).toHaveAttribute('aria-selected', 'true');
|
|
126
101
|
});
|
|
127
102
|
|
|
128
103
|
it('calls onChange when date is selected', async () => {
|
|
@@ -148,7 +123,7 @@ describe('Calendar', () => {
|
|
|
148
123
|
// Verify we start on February
|
|
149
124
|
expect(screen.getByText('February 2026')).toBeInTheDocument();
|
|
150
125
|
|
|
151
|
-
const prevButton =
|
|
126
|
+
const prevButton = screen.getByRole('button', {name: 'Previous month'});
|
|
152
127
|
await user.click(prevButton);
|
|
153
128
|
|
|
154
129
|
expect(screen.getByText('January 2026')).toBeInTheDocument();
|
|
@@ -162,7 +137,7 @@ describe('Calendar', () => {
|
|
|
162
137
|
// Verify we start on January
|
|
163
138
|
expect(screen.getByText('January 2026')).toBeInTheDocument();
|
|
164
139
|
|
|
165
|
-
const nextButton =
|
|
140
|
+
const nextButton = screen.getByRole('button', {name: 'Next month'});
|
|
166
141
|
await user.click(nextButton);
|
|
167
142
|
|
|
168
143
|
expect(screen.getByText('February 2026')).toBeInTheDocument();
|
|
@@ -176,7 +151,7 @@ describe('Calendar', () => {
|
|
|
176
151
|
<Calendar focusDate="2026-01-01" onFocusDateChange={handleFocusChange} />,
|
|
177
152
|
);
|
|
178
153
|
|
|
179
|
-
const nextButton =
|
|
154
|
+
const nextButton = screen.getByRole('button', {name: 'Next month'});
|
|
180
155
|
await user.click(nextButton);
|
|
181
156
|
|
|
182
157
|
expect(handleFocusChange).toHaveBeenCalledWith('2026-02-01');
|
|
@@ -234,39 +209,12 @@ describe('Calendar', () => {
|
|
|
234
209
|
|
|
235
210
|
render(<Calendar numberOfMonths={2} focusDate="2026-01-01" />);
|
|
236
211
|
|
|
237
|
-
const nextButton =
|
|
212
|
+
const nextButton = screen.getByRole('button', {name: 'Next month'});
|
|
238
213
|
await user.click(nextButton);
|
|
239
214
|
|
|
240
215
|
expect(screen.getByText(/February 2026.*March 2026/)).toBeInTheDocument();
|
|
241
216
|
});
|
|
242
217
|
|
|
243
|
-
it('clamps out-of-range numberOfMonths to a single month', () => {
|
|
244
|
-
// 1000 would otherwise try to render 1000 month grids and lock the page up.
|
|
245
|
-
render(
|
|
246
|
-
<Calendar
|
|
247
|
-
numberOfMonths={1000 as unknown as 1 | 2}
|
|
248
|
-
focusDate="2026-01-01"
|
|
249
|
-
/>,
|
|
250
|
-
);
|
|
251
|
-
|
|
252
|
-
// Only the focused month renders — no second month, no range separator.
|
|
253
|
-
expect(screen.getByText('January 2026')).toBeInTheDocument();
|
|
254
|
-
expect(screen.queryByText(/February 2026/)).not.toBeInTheDocument();
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
it('clamps numberOfMonths={0} to a single month', () => {
|
|
258
|
-
render(
|
|
259
|
-
<Calendar
|
|
260
|
-
numberOfMonths={0 as unknown as 1 | 2}
|
|
261
|
-
focusDate="2026-01-01"
|
|
262
|
-
/>,
|
|
263
|
-
);
|
|
264
|
-
|
|
265
|
-
// 0 previously rendered no months at all; now falls back to one.
|
|
266
|
-
expect(screen.getByText('January 2026')).toBeInTheDocument();
|
|
267
|
-
expect(screen.getAllByRole('gridcell').length).toBeGreaterThan(0);
|
|
268
|
-
});
|
|
269
|
-
|
|
270
218
|
// ─── Display Options ─────────────────────────────────────────
|
|
271
219
|
|
|
272
220
|
it('shows week numbers when hasWeekNumbers is true', () => {
|
|
@@ -362,22 +310,9 @@ describe('Calendar', () => {
|
|
|
362
310
|
const day12 = getDayButton(12);
|
|
363
311
|
const day15 = getDayButton(15);
|
|
364
312
|
|
|
365
|
-
|
|
366
|
-
expect(
|
|
367
|
-
|
|
368
|
-
'true',
|
|
369
|
-
);
|
|
370
|
-
expect(day12.closest('[role="gridcell"]')).toHaveAttribute(
|
|
371
|
-
'aria-selected',
|
|
372
|
-
'true',
|
|
373
|
-
);
|
|
374
|
-
expect(day15.closest('[role="gridcell"]')).toHaveAttribute(
|
|
375
|
-
'aria-selected',
|
|
376
|
-
'true',
|
|
377
|
-
);
|
|
378
|
-
expect(day10).not.toHaveAttribute('aria-selected');
|
|
379
|
-
expect(day12).not.toHaveAttribute('aria-selected');
|
|
380
|
-
expect(day15).not.toHaveAttribute('aria-selected');
|
|
313
|
+
expect(day10).toHaveAttribute('aria-selected', 'true');
|
|
314
|
+
expect(day12).toHaveAttribute('aria-selected', 'true');
|
|
315
|
+
expect(day15).toHaveAttribute('aria-selected', 'true');
|
|
381
316
|
});
|
|
382
317
|
|
|
383
318
|
it('caps the range highlight next to a disabled mid-range day (#2715)', () => {
|
|
@@ -541,8 +476,12 @@ describe('Calendar', () => {
|
|
|
541
476
|
it('has navigation buttons with accessible labels', () => {
|
|
542
477
|
render(<Calendar />);
|
|
543
478
|
|
|
544
|
-
expect(
|
|
545
|
-
|
|
479
|
+
expect(
|
|
480
|
+
screen.getByRole('button', {name: 'Previous month'}),
|
|
481
|
+
).toBeInTheDocument();
|
|
482
|
+
expect(
|
|
483
|
+
screen.getByRole('button', {name: 'Next month'}),
|
|
484
|
+
).toBeInTheDocument();
|
|
546
485
|
});
|
|
547
486
|
|
|
548
487
|
// ─── Bug Regression Tests ───────────────────────────────────
|
|
@@ -650,14 +589,14 @@ describe('Calendar', () => {
|
|
|
650
589
|
it('prev button is disabled when focusDate month contains min', () => {
|
|
651
590
|
render(<Calendar focusDate="2026-01-01" min="2026-01-15" />);
|
|
652
591
|
|
|
653
|
-
const prevButton =
|
|
592
|
+
const prevButton = screen.getByRole('button', {name: 'Previous month'});
|
|
654
593
|
expect(prevButton).toBeDisabled();
|
|
655
594
|
});
|
|
656
595
|
|
|
657
596
|
it('next button is disabled when focusDate month contains max', () => {
|
|
658
597
|
render(<Calendar focusDate="2026-01-01" max="2026-01-15" />);
|
|
659
598
|
|
|
660
|
-
const nextButton =
|
|
599
|
+
const nextButton = screen.getByRole('button', {name: 'Next month'});
|
|
661
600
|
expect(nextButton).toBeDisabled();
|
|
662
601
|
});
|
|
663
602
|
|
|
@@ -736,48 +675,4 @@ describe('Calendar', () => {
|
|
|
736
675
|
}
|
|
737
676
|
}
|
|
738
677
|
});
|
|
739
|
-
|
|
740
|
-
// ─── RTL (#3388) ─────────────────────────────────────────────
|
|
741
|
-
|
|
742
|
-
describe('RTL month navigation', () => {
|
|
743
|
-
// jsdom does not apply compiled StyleX CSS, so the scaleX(-1) mirror
|
|
744
|
-
// itself is only observable in a browser (see the dir="rtl" Storybook
|
|
745
|
-
// story). These tests pin the structure the fix depends on: both nav
|
|
746
|
-
// chevrons render inside the navIcon wrapper that carries the
|
|
747
|
-
// ':is([dir="rtl"] *)' conditional transform.
|
|
748
|
-
it('wraps both nav chevrons in the RTL-mirroring navIcon wrapper', () => {
|
|
749
|
-
render(<Calendar focusDate="2026-01-01" />);
|
|
750
|
-
|
|
751
|
-
const {className: navIconClass} = stylex.props(calendarStyles.navIcon);
|
|
752
|
-
expect(navIconClass).toBeTruthy();
|
|
753
|
-
|
|
754
|
-
for (const name of ['Previous month', 'Next month']) {
|
|
755
|
-
const button = getButton(name);
|
|
756
|
-
const wrappers = Array.from(button.querySelectorAll('span')).filter(
|
|
757
|
-
span => span.className === navIconClass,
|
|
758
|
-
);
|
|
759
|
-
expect(wrappers.length).toBe(1);
|
|
760
|
-
}
|
|
761
|
-
});
|
|
762
|
-
|
|
763
|
-
it('keeps navigation semantics unchanged under dir="rtl"', async () => {
|
|
764
|
-
const user = userEvent.setup();
|
|
765
|
-
|
|
766
|
-
render(
|
|
767
|
-
<div dir="rtl">
|
|
768
|
-
<Calendar focusDate="2026-02-01" />
|
|
769
|
-
</div>,
|
|
770
|
-
);
|
|
771
|
-
|
|
772
|
-
expect(screen.getByText('February 2026')).toBeInTheDocument();
|
|
773
|
-
|
|
774
|
-
// DOM order and handlers must not change in RTL: flexbox already
|
|
775
|
-
// places "Previous month" at the visual right; only the glyph mirrors.
|
|
776
|
-
await user.click(getButton('Previous month'));
|
|
777
|
-
expect(screen.getByText('January 2026')).toBeInTheDocument();
|
|
778
|
-
|
|
779
|
-
await user.click(getButton('Next month'));
|
|
780
|
-
expect(screen.getByText('February 2026')).toBeInTheDocument();
|
|
781
|
-
});
|
|
782
|
-
});
|
|
783
678
|
});
|
|
@@ -203,7 +203,7 @@ export function Calendar({ref, ...props}: CalendarProps) {
|
|
|
203
203
|
value,
|
|
204
204
|
defaultValue,
|
|
205
205
|
onChange,
|
|
206
|
-
numberOfMonths
|
|
206
|
+
numberOfMonths = 1,
|
|
207
207
|
min,
|
|
208
208
|
max,
|
|
209
209
|
dateConstraints,
|
|
@@ -223,11 +223,6 @@ export function Calendar({ref, ...props}: CalendarProps) {
|
|
|
223
223
|
// DayOfWeek so all downstream date math keeps working with an index.
|
|
224
224
|
const weekStartsOn = normalizeDayOfWeek(weekStartsOnProp);
|
|
225
225
|
|
|
226
|
-
// `numberOfMonths` is typed `1 | 2`; defensively clamp anything else that
|
|
227
|
-
// slips through at runtime to 1 so `Array.from({length})` can't render an
|
|
228
|
-
// absurd number of month grids (e.g. `numberOfMonths={1000}`).
|
|
229
|
-
const numberOfMonths = numberOfMonthsProp === 2 ? 2 : 1;
|
|
230
|
-
|
|
231
226
|
// Today's date (memoized)
|
|
232
227
|
const today = useMemo(() => plainDateToday(), []);
|
|
233
228
|
|
|
@@ -431,14 +426,7 @@ export function Calendar({ref, ...props}: CalendarProps) {
|
|
|
431
426
|
<Button
|
|
432
427
|
label="Previous month"
|
|
433
428
|
variant="ghost"
|
|
434
|
-
icon={
|
|
435
|
-
// Wrapper span (not Icon props): Icon's string mode clobbers
|
|
436
|
-
// caller classNames, so the RTL mirror must live on its own
|
|
437
|
-
// element.
|
|
438
|
-
<span {...stylex.props(calendarStyles.navIcon)}>
|
|
439
|
-
<Icon icon="chevronLeft" size="sm" color="inherit" />
|
|
440
|
-
</span>
|
|
441
|
-
}
|
|
429
|
+
icon={<Icon icon="chevronLeft" size="sm" color="inherit" />}
|
|
442
430
|
onClick={() => navigateMonth(-1)}
|
|
443
431
|
isDisabled={!canNavigatePrevious}
|
|
444
432
|
isIconOnly
|
|
@@ -451,11 +439,7 @@ export function Calendar({ref, ...props}: CalendarProps) {
|
|
|
451
439
|
<Button
|
|
452
440
|
label="Next month"
|
|
453
441
|
variant="ghost"
|
|
454
|
-
icon={
|
|
455
|
-
<span {...stylex.props(calendarStyles.navIcon)}>
|
|
456
|
-
<Icon icon="chevronRight" size="sm" color="inherit" />
|
|
457
|
-
</span>
|
|
458
|
-
}
|
|
442
|
+
icon={<Icon icon="chevronRight" size="sm" color="inherit" />}
|
|
459
443
|
onClick={() => navigateMonth(1)}
|
|
460
444
|
isDisabled={!canNavigateNext}
|
|
461
445
|
isIconOnly
|
|
@@ -928,10 +912,7 @@ function DayCell({
|
|
|
928
912
|
});
|
|
929
913
|
|
|
930
914
|
return (
|
|
931
|
-
<div
|
|
932
|
-
role="gridcell"
|
|
933
|
-
aria-selected={state.isSelected || state.isInRange || undefined}
|
|
934
|
-
{...stylex.props(dayCellStyles.cell)}>
|
|
915
|
+
<div role="gridcell" {...stylex.props(dayCellStyles.cell)}>
|
|
935
916
|
{/* Range background */}
|
|
936
917
|
{state.isInRange && (
|
|
937
918
|
<div
|
|
@@ -971,10 +952,8 @@ function DayCell({
|
|
|
971
952
|
type="button"
|
|
972
953
|
data-date={day.iso}
|
|
973
954
|
aria-label={plainDateFormat(date, DATE_FORMAT_WITH_WEEKDAY)}
|
|
955
|
+
aria-selected={state.isSelected || state.isInRange || undefined}
|
|
974
956
|
aria-disabled={state.effectivelyDisabled || undefined}
|
|
975
|
-
// Mark today's cell programmatically (APG date-picker pattern), not just
|
|
976
|
-
// visually, so screen-reader users can identify the current date.
|
|
977
|
-
aria-current={state.isToday ? 'date' : undefined}
|
|
978
957
|
disabled={isDisabled}
|
|
979
958
|
// Initial roving tab-stop seed; useGridFocus owns it after mount.
|
|
980
959
|
tabIndex={isTabbableDay ? 0 : -1}
|
|
@@ -193,9 +193,7 @@ export function isRangeHighlighted(input: {
|
|
|
193
193
|
isDisabled: boolean;
|
|
194
194
|
isOutside: boolean;
|
|
195
195
|
}): boolean {
|
|
196
|
-
if (input.mode !== 'range') {
|
|
197
|
-
return false;
|
|
198
|
-
}
|
|
196
|
+
if (input.mode !== 'range') {return false;}
|
|
199
197
|
return isSpanHighlighted({
|
|
200
198
|
date: input.date,
|
|
201
199
|
spanStart: input.rangeStart,
|
package/src/Calendar/styles.ts
CHANGED
|
@@ -64,19 +64,9 @@ export const calendarStyles = stylex.create({
|
|
|
64
64
|
whiteSpace: 'nowrap',
|
|
65
65
|
borderWidth: 0,
|
|
66
66
|
},
|
|
67
|
-
/**
|
|
68
|
-
* Wrapper for the month nav chevrons. In RTL the flex header already
|
|
69
|
-
* swaps the buttons' visual sides; the glyphs must mirror with them so
|
|
70
|
-
* "Previous month" points outward (visually right) instead of inward.
|
|
71
|
-
* Keyed on the dir attribute (dir="rtl"), same as MobileNav's drawer
|
|
72
|
-
* transform — bare CSS `direction: rtl` alone won't trigger it.
|
|
73
|
-
*/
|
|
74
67
|
navIcon: {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
default: null,
|
|
78
|
-
':is([dir="rtl"] *)': 'scaleX(-1)',
|
|
79
|
-
},
|
|
68
|
+
width: spacingVars['--spacing-4'],
|
|
69
|
+
height: spacingVars['--spacing-4'],
|
|
80
70
|
},
|
|
81
71
|
});
|
|
82
72
|
|
package/src/Card/Card.doc.mjs
CHANGED
|
@@ -131,7 +131,7 @@ export const docsZh = {
|
|
|
131
131
|
theming: {
|
|
132
132
|
container: true,
|
|
133
133
|
targets: [
|
|
134
|
-
{className: 'astryx-card'
|
|
134
|
+
{className: 'astryx-card'},
|
|
135
135
|
],
|
|
136
136
|
vars: [
|
|
137
137
|
{name: '--_card-radius', description: 'Border radius of the card', default: 'var(--radius-container)', private: true},
|
package/src/Card/Card.tsx
CHANGED
|
@@ -44,10 +44,8 @@ import {themeProps} from '../utils/themeProps';
|
|
|
44
44
|
* - Non-semantic palette: `blue | cyan | gray | green | orange | pink | purple | red | teal | yellow`
|
|
45
45
|
* Each uses the corresponding `--color-background-<name>` token (20% opacity tint).
|
|
46
46
|
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* keeping content geometry faithful to the spacing scale and identical to the
|
|
50
|
-
* borderless variants. Themes can override borderWidth/borderColor.
|
|
47
|
+
* All variants include a transparent border to prevent layout jitter
|
|
48
|
+
* when switching variants. Themes can override borderWidth/borderColor.
|
|
51
49
|
*/
|
|
52
50
|
export type CardVariant =
|
|
53
51
|
| 'default'
|
|
@@ -73,18 +71,12 @@ const styles = stylex.create({
|
|
|
73
71
|
'--_card-radius': radiusVars['--radius-container'],
|
|
74
72
|
borderRadius: 'var(--_card-radius)',
|
|
75
73
|
overflow: 'clip',
|
|
76
|
-
},
|
|
77
|
-
// The border is drawn *inside* the padding — its width is subtracted from
|
|
78
|
-
// each side — so total inset (border + padding) equals the padding token
|
|
79
|
-
// rather than exceeding it by the border width.
|
|
80
|
-
withBorder: {
|
|
81
74
|
borderWidth: borderVars['--border-width'],
|
|
82
75
|
borderStyle: 'solid',
|
|
76
|
+
borderColor: 'transparent',
|
|
77
|
+
},
|
|
78
|
+
withBorder: {
|
|
83
79
|
borderColor: colorVars['--color-border-emphasized'],
|
|
84
|
-
paddingInlineStart: `calc(var(--container-padding-inline-start) - ${borderVars['--border-width']})`,
|
|
85
|
-
paddingInlineEnd: `calc(var(--container-padding-inline-end) - ${borderVars['--border-width']})`,
|
|
86
|
-
paddingBlockStart: `calc(var(--container-padding-block-start) - ${borderVars['--border-width']})`,
|
|
87
|
-
paddingBlockEnd: `calc(var(--container-padding-block-end) - ${borderVars['--border-width']})`,
|
|
88
80
|
},
|
|
89
81
|
// Fixed-height cards scroll content; overflow: auto also clips to border-radius
|
|
90
82
|
scrollable: {
|
|
@@ -274,6 +266,7 @@ export function Card({
|
|
|
274
266
|
stylex.props(
|
|
275
267
|
styles.card,
|
|
276
268
|
variantStyles[variant],
|
|
269
|
+
variant === 'default' && styles.withBorder,
|
|
277
270
|
hasFixedHeight && styles.scrollable,
|
|
278
271
|
dynamicStyles.sizing(
|
|
279
272
|
width ?? null,
|
|
@@ -303,9 +296,6 @@ export function Card({
|
|
|
303
296
|
!useThemeDefault &&
|
|
304
297
|
effectivePadding !== 4 &&
|
|
305
298
|
containerPaddingBlockEndVarStyles[effectivePadding],
|
|
306
|
-
// Applied after the container padding so the border-inset calc wins;
|
|
307
|
-
// it reads the --container-padding-* vars set above.
|
|
308
|
-
variant === 'default' && styles.withBorder,
|
|
309
299
|
xstyle,
|
|
310
300
|
),
|
|
311
301
|
className,
|
|
@@ -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. Each item is animated with a scroll-driven scale effect.'},
|
|
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 on hover. 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 on hover (desktop only).', 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 scrolls a row of items horizontally when they overflow the available width. Use it for card grids, image galleries, product lists, or any set of items that should be browsable without taking up the full page.',
|
|
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: 'Enable scroll-snap when each item should land precisely at the start edge, like a gallery or product list.'},
|
|
65
|
+
{guidance: true, description: 'Always provide an aria-label that describes what the carousel contains, like "Featured products" or "Team members".'},
|
|
66
|
+
{guidance: true, description: 'Use a consistent gap and item width so the carousel looks intentional, not like content overflowing by accident.'},
|
|
67
|
+
{guidance: false, description: 'Use a carousel for content every user must see. Not everyone scrolls horizontally, so put critical content above the fold.'},
|
|
68
|
+
{guidance: false, description: 'Auto-advance items. Let the user scroll at their own pace.'},
|
|
69
|
+
{guidance: false, description: 'Nest carousels. A carousel inside a carousel is confusing and breaks keyboard navigation.'},
|
|
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 on hover (desktop)',
|
|
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,19 +38,6 @@ 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
|
-
|
|
54
41
|
it('applies data-testid', () => {
|
|
55
42
|
render(
|
|
56
43
|
<Carousel data-testid="my-carousel">
|
|
@@ -318,8 +318,6 @@ export function Carousel({
|
|
|
318
318
|
: null
|
|
319
319
|
: null;
|
|
320
320
|
|
|
321
|
-
// Self-authored position styles (positioning: 'custom' below): a cover
|
|
322
|
-
// centered on the anchor, sized to it — direction-neutral by construction.
|
|
323
321
|
const coverStyle: React.CSSProperties = {
|
|
324
322
|
positionArea: 'center',
|
|
325
323
|
width: 'anchor-size(width)',
|
|
@@ -342,7 +340,6 @@ export function Carousel({
|
|
|
342
340
|
{...htmlProps}>
|
|
343
341
|
<div
|
|
344
342
|
ref={composedRef}
|
|
345
|
-
tabIndex={0}
|
|
346
343
|
{...stylex.props(
|
|
347
344
|
styles.scroller,
|
|
348
345
|
gapStyles[gap],
|
|
@@ -400,7 +397,8 @@ export function Carousel({
|
|
|
400
397
|
</div>
|
|
401
398
|
</>,
|
|
402
399
|
{
|
|
403
|
-
|
|
400
|
+
placement: 'below',
|
|
401
|
+
alignment: 'center',
|
|
404
402
|
style: coverStyle,
|
|
405
403
|
xstyle: styles.buttonOverlay,
|
|
406
404
|
},
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import * as stylex from '@stylexjs/stylex';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Scoped marker for Carousel ancestor selectors.
|
|
7
|
+
* Prevents hover styles from leaking from parent containers.
|
|
8
|
+
*/
|
|
9
|
+
export const carouselScope: ReturnType<typeof stylex.defineMarker> =
|
|
10
|
+
stylex.defineMarker();
|
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']},
|
|
21
21
|
{
|
|
22
22
|
className: 'astryx-chat-message-bubble',
|
|
23
23
|
visualProps: ['sender', 'variant', 'density'],
|
|
@@ -2,7 +2,6 @@
|
|
|
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';
|
|
6
5
|
import {ChatComposerInput} from './ChatComposerInput';
|
|
7
6
|
import type {
|
|
8
7
|
ChatComposerTrigger,
|
|
@@ -130,29 +129,6 @@ describe('ChatComposerInput', () => {
|
|
|
130
129
|
fireEvent.keyDown(textbox, {key: 'Enter'});
|
|
131
130
|
expect(onSubmit).not.toHaveBeenCalled();
|
|
132
131
|
});
|
|
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
|
-
});
|
|
156
132
|
});
|
|
157
133
|
|
|
158
134
|
// Controlled-value sync used to overwrite `textContent` on every
|
|
@@ -369,9 +345,7 @@ describe('ChatComposerInput', () => {
|
|
|
369
345
|
},
|
|
370
346
|
});
|
|
371
347
|
|
|
372
|
-
expect(
|
|
373
|
-
textbox.querySelector('[data-astryx-token]'),
|
|
374
|
-
).not.toBeInTheDocument();
|
|
348
|
+
expect(textbox.querySelector('[data-astryx-token]')).not.toBeInTheDocument();
|
|
375
349
|
expect(textbox.textContent).toBe(long);
|
|
376
350
|
});
|
|
377
351
|
});
|
|
@@ -43,7 +43,10 @@ import {
|
|
|
43
43
|
} from '../theme/tokens.stylex';
|
|
44
44
|
import {mergeProps} from '../utils';
|
|
45
45
|
import {useTriggerMenu} from './useTriggerMenu';
|
|
46
|
-
import {
|
|
46
|
+
import {
|
|
47
|
+
useChatComposerTokens,
|
|
48
|
+
isCustomToken,
|
|
49
|
+
} from './useChatComposerTokens';
|
|
47
50
|
import {ensureCaretInside, insertTextAtCursor} from './chatComposerSelection';
|
|
48
51
|
import {ChatPastedTextToken} from './ChatPastedTextToken';
|
|
49
52
|
import {
|
|
@@ -280,13 +283,12 @@ function serialize(node: Node): string {
|
|
|
280
283
|
|
|
281
284
|
export function ChatComposerInput(props: ChatComposerInputProps) {
|
|
282
285
|
const composerCtx = useChatComposerContext();
|
|
283
|
-
const hasControlledValueProp = props.value !== undefined;
|
|
284
286
|
|
|
285
287
|
const {
|
|
286
288
|
ref,
|
|
287
289
|
handleRef,
|
|
288
290
|
value: controlledValue = composerCtx?.value,
|
|
289
|
-
onChange
|
|
291
|
+
onChange = composerCtx?.onChange,
|
|
290
292
|
placeholder = composerCtx?.placeholder ?? 'Type a message\u2026',
|
|
291
293
|
maxRows = 8,
|
|
292
294
|
triggers,
|
|
@@ -304,21 +306,6 @@ export function ChatComposerInput(props: ChatComposerInputProps) {
|
|
|
304
306
|
...rest
|
|
305
307
|
} = props;
|
|
306
308
|
|
|
307
|
-
const composerOnChange = composerCtx?.onChange;
|
|
308
|
-
const onChange = useCallback(
|
|
309
|
-
(nextValue: string) => {
|
|
310
|
-
if (hasControlledValueProp) {
|
|
311
|
-
onChangeProp?.(nextValue);
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
composerOnChange?.(nextValue);
|
|
315
|
-
if (onChangeProp !== composerOnChange) {
|
|
316
|
-
onChangeProp?.(nextValue);
|
|
317
|
-
}
|
|
318
|
-
},
|
|
319
|
-
[composerOnChange, hasControlledValueProp, onChangeProp],
|
|
320
|
-
);
|
|
321
|
-
|
|
322
309
|
const editableRef = useRef<HTMLDivElement>(null);
|
|
323
310
|
const selfRef = useRef<ChatComposerInputHandle>(null);
|
|
324
311
|
const [isEmpty, setIsEmpty] = useState(true);
|
|
@@ -692,7 +679,11 @@ ChatComposerInput.displayName = 'ChatComposerInput';
|
|
|
692
679
|
// Token element helper (for custom rendering in stories/consumers)
|
|
693
680
|
// =============================================================================
|
|
694
681
|
|
|
695
|
-
export function ChatComposerTokenElement({
|
|
682
|
+
export function ChatComposerTokenElement({
|
|
683
|
+
token,
|
|
684
|
+
}: {
|
|
685
|
+
token: ChatComposerToken;
|
|
686
|
+
}) {
|
|
696
687
|
return (
|
|
697
688
|
<span
|
|
698
689
|
data-astryx-token=""
|
|
@@ -702,7 +693,11 @@ export function ChatComposerTokenElement({token}: {token: ChatComposerToken}) {
|
|
|
702
693
|
{isCustomToken(token) ? (
|
|
703
694
|
token.render()
|
|
704
695
|
) : (
|
|
705
|
-
<Badge
|
|
696
|
+
<Badge
|
|
697
|
+
label={token.label}
|
|
698
|
+
variant={token.variant}
|
|
699
|
+
icon={token.icon}
|
|
700
|
+
/>
|
|
706
701
|
)}
|
|
707
702
|
</span>
|
|
708
703
|
);
|