@astryxdesign/core 0.1.4 → 0.1.5-canary.76e6697
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 +141 -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.d.ts +0 -2
- package/dist/AlertDialog/useImperativeAlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/useImperativeAlertDialog.js +3 -5
- 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.d.ts +48 -10
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +33 -12
- 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 +28 -26
- package/dist/Avatar/AvatarStatusDot.js +6 -6
- package/dist/AvatarGroup/AvatarGroup.js +6 -6
- package/dist/AvatarGroup/AvatarGroupOverflow.js +7 -7
- 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.js +19 -19
- package/dist/ButtonGroup/ButtonGroup.js +7 -7
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +68 -48
- 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 +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 +24 -21
- 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 +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.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 +25 -23
- 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.js +3 -3
- 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/Collapsible/Collapsible.d.ts +9 -3
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +109 -22
- package/dist/Collapsible/CollapsibleGroup.d.ts +37 -7
- package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroup.js +64 -12
- package/dist/Collapsible/CollapsibleGroupContext.d.ts +24 -0
- package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroupContext.js +26 -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.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 +7 -2
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +76 -43
- package/dist/DateInput/DateInput.js +18 -18
- package/dist/DateRangeInput/DateRangeInput.js +21 -21
- package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
- 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.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.d.ts +5 -1
- 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 +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.d.ts +29 -2
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +44 -31
- 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.d.ts +0 -1
- package/dist/Lightbox/useLightbox.d.ts.map +1 -1
- package/dist/Lightbox/useLightbox.js +3 -4
- package/dist/Link/Link.d.ts +0 -2
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +15 -17
- 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 +26 -23
- 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 +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.d.ts +0 -3
- package/dist/Overlay/useOverlay.d.ts.map +1 -1
- package/dist/Overlay/useOverlay.js +3 -6
- 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.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 +24 -21
- 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.js +46 -46
- 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.js +23 -23
- package/dist/Spinner/Spinner.js +9 -9
- package/dist/StatusDot/StatusDot.js +5 -5
- package/dist/Switch/Switch.d.ts +8 -4
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +34 -29
- 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 +50 -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.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 +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/groupedRows/index.d.ts +3 -0
- package/dist/Table/plugins/groupedRows/index.d.ts.map +1 -0
- package/dist/Table/plugins/groupedRows/index.js +3 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +78 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +250 -0
- 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/useTableRowExpansion.d.ts +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +23 -23
- 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.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 +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.d.ts.map +1 -1
- package/dist/Toast/useToast.js +44 -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.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +36 -34
- package/dist/Toolbar/Toolbar.js +18 -18
- package/dist/Tooltip/Tooltip.js +11 -11
- package/dist/Tooltip/useTooltip.d.ts +5 -1
- 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 +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/VisuallyHidden/VisuallyHidden.d.ts +0 -3
- package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
- package/dist/VisuallyHidden/VisuallyHidden.js +0 -3
- package/dist/astryx.css +7 -0
- package/dist/astryx.umd.js +63 -63
- package/dist/astryx.umd.js.map +4 -4
- package/dist/docs-types.d.ts +8 -2
- 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/theme/useTheme.d.ts +3 -2
- package/dist/theme/useTheme.d.ts.map +1 -1
- package/dist/theme/useTheme.js +73 -6
- 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 +4 -4
- package/src/AlertDialog/AlertDialog.doc.mjs +4 -0
- package/src/AlertDialog/AlertDialog.tsx +2 -0
- package/src/AlertDialog/useImperativeAlertDialog.tsx +0 -2
- package/src/AppShell/AppShell.tsx +2 -0
- package/src/AspectRatio/AspectRatio.doc.mjs +28 -1
- package/src/AspectRatio/AspectRatio.test.tsx +142 -1
- package/src/AspectRatio/AspectRatio.tsx +70 -10
- package/src/AspectRatio/index.ts +5 -1
- package/src/Avatar/Avatar.doc.mjs +11 -0
- package/src/Avatar/Avatar.test.tsx +32 -1
- package/src/Avatar/Avatar.tsx +14 -22
- package/src/Avatar/AvatarStatusDot.tsx +2 -2
- package/src/AvatarGroup/AvatarGroup.doc.mjs +1 -0
- package/src/AvatarGroup/AvatarGroup.tsx +2 -2
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -2
- 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/Calendar/Calendar.doc.mjs +1 -1
- package/src/Calendar/Calendar.test.tsx +122 -17
- package/src/Calendar/Calendar.tsx +26 -5
- package/src/Calendar/dayCellUtils.ts +3 -1
- 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 +4 -2
- package/src/Chat/Chat.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.test.tsx +27 -1
- package/src/Chat/ChatComposerInput.tsx +20 -15
- 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/useTriggerMenu.tsx +1 -4
- package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -3
- package/src/CheckboxInput/CheckboxInput.test.tsx +71 -4
- package/src/CheckboxInput/CheckboxInput.tsx +2 -0
- 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/CodeBlock/CodeBlock.doc.mjs +7 -2
- package/src/CodeBlock/CodeBlock.test.tsx +122 -3
- package/src/CodeBlock/CodeBlock.tsx +62 -4
- package/src/Collapsible/Collapsible.doc.mjs +8 -4
- package/src/Collapsible/Collapsible.test.tsx +403 -0
- package/src/Collapsible/Collapsible.tsx +85 -10
- package/src/Collapsible/CollapsibleGroup.doc.mjs +27 -3
- package/src/Collapsible/CollapsibleGroup.test.tsx +314 -0
- package/src/Collapsible/CollapsibleGroup.tsx +97 -9
- package/src/Collapsible/CollapsibleGroupContext.tsx +34 -2
- package/src/Collapsible/index.ts +1 -0
- package/src/Collapsible/useCollapsible.ts +20 -6
- package/src/CommandPalette/CommandPalette.doc.mjs +5 -0
- package/src/CommandPalette/CommandPalette.tsx +5 -3
- package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +5 -0
- 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 +87 -0
- package/src/ContextMenu/ContextMenu.tsx +87 -28
- package/src/ContextMenu/ContextMenuItem.doc.mjs +6 -0
- package/src/DateInput/DateInput.test.tsx +11 -20
- package/src/DateRangeInput/DateRangeInput.doc.mjs +9 -6
- package/src/DateRangeInput/DateRangeInput.test.tsx +31 -44
- package/src/DateTimeInput/DateTimeInput.doc.mjs +3 -2
- package/src/DateTimeInput/DateTimeInput.test.tsx +118 -16
- package/src/DateTimeInput/DateTimeInput.tsx +8 -2
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/Dialog.doc.mjs +4 -0
- package/src/Dialog/DialogHeader.doc.mjs +45 -0
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenu.test.tsx +22 -2
- package/src/DropdownMenu/DropdownMenuItem.tsx +5 -17
- package/src/EmptyState/EmptyState.doc.mjs +1 -1
- package/src/Field/Field.test.tsx +1 -4
- package/src/Field/FieldLabel.test.tsx +2 -2
- package/src/FieldStatus/FieldStatus.test.tsx +282 -0
- package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -3
- package/src/Grid/Grid.test.tsx +43 -18
- package/src/Grid/Grid.tsx +26 -9
- package/src/HoverCard/HoverCard.doc.mjs +6 -6
- package/src/HoverCard/useHoverCard.doc.mjs +5 -5
- package/src/HoverCard/useHoverCard.tsx +9 -2
- package/src/Icon/Icon.test.tsx +41 -29
- package/src/Icon/Icon.tsx +6 -2
- package/src/InputGroup/InputGroup.doc.mjs +1 -0
- package/src/InputGroup/InputGroup.tsx +2 -2
- package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +185 -0
- package/src/Item/Item.tsx +1 -1
- package/src/Layer/useLayer.doc.mjs +2 -2
- package/src/Layer/useLayer.test.tsx +221 -2
- package/src/Layer/useLayer.tsx +69 -30
- 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/Lightbox/Lightbox.doc.mjs +5 -0
- package/src/Lightbox/Lightbox.test.tsx +123 -2
- package/src/Lightbox/Lightbox.tsx +29 -1
- package/src/Lightbox/useLightbox.tsx +0 -1
- package/src/Link/Link.tsx +0 -2
- package/src/Markdown/Markdown.tsx +9 -7
- package/src/Markdown/parser.perf.test.ts +34 -12
- package/src/MobileNav/MobileNav.test.tsx +56 -0
- package/src/MobileNav/MobileNav.tsx +13 -8
- 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/Outline.doc.mjs +2 -0
- 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/Overlay/useOverlay.tsx +0 -3
- package/src/Pagination/Pagination.test.tsx +162 -0
- package/src/Pagination/Pagination.tsx +80 -26
- package/src/Popover/Popover.doc.mjs +6 -6
- package/src/Popover/Popover.test.tsx +65 -0
- package/src/Popover/usePopover.doc.mjs +1 -1
- package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
- package/src/PowerSearch/PowerSearch.test.tsx +109 -1
- package/src/PowerSearch/PowerSearch.tsx +37 -16
- package/src/ProgressBar/ProgressBar.doc.mjs +2 -0
- package/src/ProgressBar/ProgressBar.test.tsx +30 -0
- package/src/ProgressBar/ProgressBar.tsx +12 -5
- package/src/RadioList/RadioList.test.tsx +19 -0
- package/src/RadioList/RadioListItem.tsx +9 -4
- package/src/Resizable/ResizeHandle.test.tsx +218 -0
- package/src/Resizable/ResizeHandle.tsx +22 -4
- package/src/SegmentedControl/SegmentedControl.doc.mjs +1 -1
- 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.test.tsx +27 -1
- 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/Switch/Switch.doc.mjs +7 -7
- package/src/Switch/Switch.test.tsx +102 -3
- package/src/Switch/Switch.tsx +20 -7
- package/src/TabList/TabList.test.tsx +185 -1
- package/src/TabList/TabMenu.tsx +45 -9
- package/src/Table/BaseTable.tsx +13 -2
- package/src/Table/Table.doc.mjs +6 -1
- package/src/Table/Table.test.tsx +87 -0
- package/src/Table/TableBody.tsx +15 -2
- 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/groupedRows/index.ts +7 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +231 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +349 -0
- package/src/Table/plugins/pagination/paginateData.ts +5 -1
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +13 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +1 -1
- 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/useTableGroupedRows.doc.mjs +71 -0
- package/src/TextArea/TextArea.test.tsx +3 -3
- 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.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/Toast/useToast.test.tsx +258 -0
- package/src/Toast/useToast.tsx +41 -0
- package/src/ToggleButton/ToggleButton.doc.mjs +1 -0
- package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
- package/src/Tokenizer/Tokenizer.test.tsx +54 -0
- package/src/Tokenizer/Tokenizer.tsx +5 -4
- package/src/Tooltip/Tooltip.doc.mjs +6 -6
- package/src/Tooltip/useTooltip.doc.mjs +5 -5
- package/src/Tooltip/useTooltip.tsx +12 -2
- package/src/TopNav/TopNav.doc.mjs +1 -1
- package/src/TopNav/TopNav.test.tsx +23 -7
- 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 +1 -1
- package/src/Typeahead/Typeahead.test.tsx +45 -1
- package/src/VisuallyHidden/VisuallyHidden.tsx +0 -3
- 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 +9 -1
- 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/useStreamingText.test.ts +54 -19
- package/src/hooks/useStreamingText.ts +16 -5
- package/src/hooks/useTreeFocus.test.tsx +1 -3
- package/src/reset.css +29 -0
- 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/themingTargets.test.ts +353 -0
- package/src/theme/tokens.test.ts +182 -9
- package/src/theme/tokens.ts +239 -4
- package/src/theme/useTheme.test.tsx +126 -2
- package/src/theme/useTheme.ts +87 -6
- 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
- package/dist/Carousel/carousel.markers.stylex.d.ts +0 -7
- package/dist/Carousel/carousel.markers.stylex.d.ts.map +0 -1
- package/dist/Carousel/carousel.markers.stylex.js +0 -12
- package/src/Carousel/carousel.markers.stylex.ts +0 -10
|
@@ -7,8 +7,8 @@ export const docs = {
|
|
|
7
7
|
group: 'HoverCard',
|
|
8
8
|
keywords: ['hovercard', 'hover', 'preview', 'card', 'tooltip', 'popup', 'floating', 'anchor'],
|
|
9
9
|
params: [
|
|
10
|
-
{name: 'placement', type: "'above' | 'below' | 'start' | 'end'", description:
|
|
11
|
-
{name: 'alignment', type: "'start' | 'center' | 'end'", description:
|
|
10
|
+
{name: 'placement', type: "'above' | 'below' | 'start' | 'end'", description: "Position relative to the trigger. Logical: start/end resolve against the popover\'s own inherited direction (RTL mirrors in pure CSS).", default: "'above'"},
|
|
11
|
+
{name: 'alignment', type: "'start' | 'center' | 'end'", description: "Alignment along the placement axis. Logical: start/end resolve against the popover\'s own inherited direction (RTL mirrors in pure CSS).", default: "'center'"},
|
|
12
12
|
{name: 'delay', type: 'number', description: 'Delay before showing the hover card on hover, in milliseconds.', default: '300'},
|
|
13
13
|
{name: 'hideDelay', type: 'number', description: 'Delay before hiding after mouse or focus leaves, in milliseconds.', default: '200'},
|
|
14
14
|
{name: 'focusTrigger', type: "'auto' | 'always' | 'never'", description: 'When focus should open the hover card. auto only attaches focus listeners to naturally focusable elements.', default: "'auto'"},
|
|
@@ -24,7 +24,7 @@ export const docs = {
|
|
|
24
24
|
{name: 'interactionRef', type: 'RefCallback<HTMLElement>', description: 'Ref for the hover/focus interaction element. Use with positionRef for split trigger patterns.'},
|
|
25
25
|
{name: 'anchorId', type: 'string', description: 'CSS anchor name for advanced positioning cases.'},
|
|
26
26
|
{name: 'describedBy', type: 'string', description: 'ID to compose into aria-describedby on the trigger.'},
|
|
27
|
-
{name: 'renderHoverCard', type:
|
|
27
|
+
{name: 'renderHoverCard', type: "(children: ReactNode, props?: Omit<ContextRenderProps, 'positioning'>) => ReactNode", description: 'Render function for the anchor-positioned hover card content. The positioning opt-out is excluded: the hover card always derives its position from placement/alignment.'},
|
|
28
28
|
{name: 'show', type: '() => void', description: 'Imperatively show the hover card immediately.'},
|
|
29
29
|
{name: 'hide', type: '() => void', description: 'Imperatively hide the hover card immediately.'},
|
|
30
30
|
],
|
|
@@ -46,8 +46,8 @@ export const docs = {
|
|
|
46
46
|
export const docsDense = {
|
|
47
47
|
description: 'Headless hover-triggered floating cards. Builds on useLayer w/ hover/focus intent, delays, safe hover behavior, aria-describedby. Use for rich previews when trigger/content rendering needs full control.',
|
|
48
48
|
paramDescriptions: {
|
|
49
|
-
placement: 'position relative to trigger.',
|
|
50
|
-
alignment: 'alignment along placement axis.',
|
|
49
|
+
placement: 'position relative to trigger. logical: start/end follow the popover\'s inherited direction (RTL mirrors).',
|
|
50
|
+
alignment: 'alignment along placement axis. logical: start/end follow the popover\'s inherited direction (RTL mirrors).',
|
|
51
51
|
delay: 'show delay in ms.',
|
|
52
52
|
hideDelay: 'hide delay after mouse/focus leave in ms.',
|
|
53
53
|
focusTrigger: 'when focus opens hover card; auto = naturally focusable elements only.',
|
|
@@ -181,10 +181,14 @@ export interface HoverCardReturn {
|
|
|
181
181
|
/**
|
|
182
182
|
* Render function for hover card content.
|
|
183
183
|
* Returns anchor-positioned popover element.
|
|
184
|
+
*
|
|
185
|
+
* `positioning` is excluded: the hover card always derives its position
|
|
186
|
+
* from placement/alignment, so accepting the custom opt-out here would be
|
|
187
|
+
* a silent no-op.
|
|
184
188
|
*/
|
|
185
189
|
renderHoverCard: (
|
|
186
190
|
children: ReactNode,
|
|
187
|
-
props?: ContextRenderProps,
|
|
191
|
+
props?: Omit<ContextRenderProps, 'positioning'>,
|
|
188
192
|
) => ReactNode;
|
|
189
193
|
|
|
190
194
|
/**
|
|
@@ -450,7 +454,10 @@ export function useHoverCard(options: HoverCardOptions = {}): HoverCardReturn {
|
|
|
450
454
|
|
|
451
455
|
// Render function that wraps layer.render with hover card behavior
|
|
452
456
|
const renderHoverCard = useCallback(
|
|
453
|
-
(
|
|
457
|
+
(
|
|
458
|
+
children: ReactNode,
|
|
459
|
+
props?: Omit<ContextRenderProps, 'positioning'>,
|
|
460
|
+
): ReactNode => {
|
|
454
461
|
const renderPlacement = props?.placement ?? placement;
|
|
455
462
|
const renderProps = {
|
|
456
463
|
placement: renderPlacement,
|
package/src/Icon/Icon.test.tsx
CHANGED
|
@@ -11,48 +11,48 @@
|
|
|
11
11
|
|
|
12
12
|
import {describe, it, expect, vi} from 'vitest';
|
|
13
13
|
import {render, screen} from '@testing-library/react';
|
|
14
|
-
import {
|
|
14
|
+
import {TestIcon} from '../__tests__/TestIcon';
|
|
15
15
|
import {Icon} from './Icon';
|
|
16
16
|
|
|
17
17
|
describe('Icon', () => {
|
|
18
18
|
it('renders the icon component', () => {
|
|
19
|
-
render(<Icon icon={
|
|
19
|
+
render(<Icon icon={TestIcon} data-testid="icon" />);
|
|
20
20
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
21
21
|
});
|
|
22
22
|
|
|
23
23
|
it('renders as an SVG element', () => {
|
|
24
|
-
render(<Icon icon={
|
|
24
|
+
render(<Icon icon={TestIcon} data-testid="icon" />);
|
|
25
25
|
const icon = screen.getByTestId('icon');
|
|
26
26
|
expect(icon.tagName.toLowerCase()).toBe('svg');
|
|
27
27
|
});
|
|
28
28
|
|
|
29
29
|
it('applies aria-hidden by default', () => {
|
|
30
|
-
render(<Icon icon={
|
|
30
|
+
render(<Icon icon={TestIcon} data-testid="icon" />);
|
|
31
31
|
expect(screen.getByTestId('icon')).toHaveAttribute('aria-hidden', 'true');
|
|
32
32
|
});
|
|
33
33
|
|
|
34
34
|
it('renders with different color variants', () => {
|
|
35
35
|
const {rerender} = render(
|
|
36
|
-
<Icon icon={
|
|
36
|
+
<Icon icon={TestIcon} color="primary" data-testid="icon" />,
|
|
37
37
|
);
|
|
38
38
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
39
39
|
|
|
40
|
-
rerender(<Icon icon={
|
|
40
|
+
rerender(<Icon icon={TestIcon} color="secondary" data-testid="icon" />);
|
|
41
41
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
42
42
|
|
|
43
|
-
rerender(<Icon icon={
|
|
43
|
+
rerender(<Icon icon={TestIcon} color="accent" data-testid="icon" />);
|
|
44
44
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
45
45
|
|
|
46
|
-
rerender(<Icon icon={
|
|
46
|
+
rerender(<Icon icon={TestIcon} color="success" data-testid="icon" />);
|
|
47
47
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
48
48
|
|
|
49
|
-
rerender(<Icon icon={
|
|
49
|
+
rerender(<Icon icon={TestIcon} color="error" data-testid="icon" />);
|
|
50
50
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
51
51
|
|
|
52
|
-
rerender(<Icon icon={
|
|
52
|
+
rerender(<Icon icon={TestIcon} color="warning" data-testid="icon" />);
|
|
53
53
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
54
54
|
|
|
55
|
-
rerender(<Icon icon={
|
|
55
|
+
rerender(<Icon icon={TestIcon} color="inherit" data-testid="icon" />);
|
|
56
56
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
57
57
|
});
|
|
58
58
|
|
|
@@ -70,50 +70,41 @@ describe('Icon', () => {
|
|
|
70
70
|
'purple',
|
|
71
71
|
] as const;
|
|
72
72
|
const {rerender} = render(
|
|
73
|
-
<Icon
|
|
74
|
-
icon={HomeIcon}
|
|
75
|
-
color={nonSemanticColors[0]}
|
|
76
|
-
data-testid="icon"
|
|
77
|
-
/>,
|
|
73
|
+
<Icon icon={TestIcon} color={nonSemanticColors[0]} data-testid="icon" />,
|
|
78
74
|
);
|
|
79
75
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
80
76
|
|
|
81
77
|
for (const c of nonSemanticColors.slice(1)) {
|
|
82
|
-
rerender(<Icon icon={
|
|
78
|
+
rerender(<Icon icon={TestIcon} color={c} data-testid="icon" />);
|
|
83
79
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
84
80
|
}
|
|
85
81
|
});
|
|
86
82
|
|
|
87
83
|
it('renders with different size variants', () => {
|
|
88
84
|
const {rerender} = render(
|
|
89
|
-
<Icon icon={
|
|
85
|
+
<Icon icon={TestIcon} size="xsm" data-testid="icon" />,
|
|
90
86
|
);
|
|
91
87
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
92
88
|
|
|
93
|
-
rerender(<Icon icon={
|
|
89
|
+
rerender(<Icon icon={TestIcon} size="sm" data-testid="icon" />);
|
|
94
90
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
95
91
|
|
|
96
|
-
rerender(<Icon icon={
|
|
92
|
+
rerender(<Icon icon={TestIcon} size="md" data-testid="icon" />);
|
|
97
93
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
98
94
|
|
|
99
|
-
rerender(<Icon icon={
|
|
95
|
+
rerender(<Icon icon={TestIcon} size="lg" data-testid="icon" />);
|
|
100
96
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
101
97
|
});
|
|
102
98
|
|
|
103
99
|
it('forwards ref correctly', () => {
|
|
104
100
|
const ref = vi.fn();
|
|
105
|
-
render(<Icon icon={
|
|
101
|
+
render(<Icon icon={TestIcon} ref={ref} />);
|
|
106
102
|
expect(ref).toHaveBeenCalledWith(expect.any(SVGSVGElement));
|
|
107
103
|
});
|
|
108
104
|
|
|
109
105
|
it('passes additional SVG props', () => {
|
|
110
106
|
render(
|
|
111
|
-
<Icon
|
|
112
|
-
icon={HomeIcon}
|
|
113
|
-
data-testid="icon"
|
|
114
|
-
role="img"
|
|
115
|
-
aria-label="Home"
|
|
116
|
-
/>,
|
|
107
|
+
<Icon icon={TestIcon} data-testid="icon" role="img" aria-label="Home" />,
|
|
117
108
|
);
|
|
118
109
|
const icon = screen.getByTestId('icon');
|
|
119
110
|
expect(icon).toHaveAttribute('role', 'img');
|
|
@@ -121,8 +112,29 @@ describe('Icon', () => {
|
|
|
121
112
|
});
|
|
122
113
|
|
|
123
114
|
it('uses default color and size when not specified', () => {
|
|
124
|
-
render(<Icon icon={
|
|
115
|
+
render(<Icon icon={TestIcon} data-testid="icon" />);
|
|
125
116
|
// The component should render without errors with defaults
|
|
126
117
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
127
118
|
});
|
|
119
|
+
|
|
120
|
+
it('applies aria-hidden by default in string (registry) mode', () => {
|
|
121
|
+
render(<Icon icon="check" data-testid="icon" />);
|
|
122
|
+
expect(screen.getByTestId('icon')).toHaveAttribute('aria-hidden', 'true');
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('lets a string-mode icon be made meaningful by overriding aria-hidden', () => {
|
|
126
|
+
render(
|
|
127
|
+
<Icon
|
|
128
|
+
icon="check"
|
|
129
|
+
data-testid="icon"
|
|
130
|
+
role="img"
|
|
131
|
+
aria-label="Done"
|
|
132
|
+
aria-hidden={false}
|
|
133
|
+
/>,
|
|
134
|
+
);
|
|
135
|
+
const icon = screen.getByTestId('icon');
|
|
136
|
+
expect(icon).toHaveAttribute('role', 'img');
|
|
137
|
+
expect(icon).toHaveAttribute('aria-label', 'Done');
|
|
138
|
+
expect(icon).toHaveAttribute('aria-hidden', 'false');
|
|
139
|
+
});
|
|
128
140
|
});
|
package/src/Icon/Icon.tsx
CHANGED
|
@@ -281,12 +281,16 @@ function IconFromRegistry({
|
|
|
281
281
|
|
|
282
282
|
return (
|
|
283
283
|
<span
|
|
284
|
+
// Decorative by default, but placed BEFORE the prop spread so consumers
|
|
285
|
+
// can override it (e.g. `aria-hidden={false}` + `role="img"` +
|
|
286
|
+
// `aria-label`) to expose a meaningful standalone icon. This matches
|
|
287
|
+
// component-mode Icon, which already sets aria-hidden before its spread.
|
|
288
|
+
aria-hidden="true"
|
|
284
289
|
{...(spanProps as React.HTMLAttributes<HTMLSpanElement>)}
|
|
285
290
|
{...mergeProps(
|
|
286
291
|
themeProps('icon', {size, color}),
|
|
287
292
|
stylex.props(styles.span, colorStyles[color], spanSizeStyles[size]),
|
|
288
|
-
)}
|
|
289
|
-
aria-hidden="true">
|
|
293
|
+
)}>
|
|
290
294
|
{resolvedIcon}
|
|
291
295
|
</span>
|
|
292
296
|
);
|
|
@@ -201,11 +201,11 @@ export function InputGroup({
|
|
|
201
201
|
labelTooltip={labelTooltip}>
|
|
202
202
|
<div
|
|
203
203
|
ref={ref}
|
|
204
|
+
data-testid={testId}
|
|
205
|
+
{...rest}
|
|
204
206
|
role="group"
|
|
205
207
|
aria-labelledby={labelID}
|
|
206
208
|
aria-describedby={describedByIDs}
|
|
207
|
-
data-testid={testId}
|
|
208
|
-
{...rest}
|
|
209
209
|
{...mergeProps(
|
|
210
210
|
themeProps('input-group', {
|
|
211
211
|
size,
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file InteractiveRoleContext.test.tsx
|
|
5
|
+
* @input Uses vitest, @testing-library/react, InteractiveRoleContext + useInteractiveRole
|
|
6
|
+
* @output Characterization tests for the interactive-role override context
|
|
7
|
+
* @position Testing; validates the role-override contract and its consumption
|
|
8
|
+
* by useInteractiveRole
|
|
9
|
+
*
|
|
10
|
+
* SYNC: When InteractiveRoleContext.ts changes, update tests to match new behavior
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {describe, it, expect} from 'vitest';
|
|
14
|
+
import {renderHook} from '@testing-library/react';
|
|
15
|
+
import {createElement, type ReactNode} from 'react';
|
|
16
|
+
import {
|
|
17
|
+
InteractiveRoleContext,
|
|
18
|
+
useInteractiveRoleContext,
|
|
19
|
+
} from './InteractiveRoleContext';
|
|
20
|
+
import {
|
|
21
|
+
useInteractiveRole,
|
|
22
|
+
type InteractiveRole,
|
|
23
|
+
} from '../hooks/useInteractiveRole';
|
|
24
|
+
|
|
25
|
+
/** Wrap children in an InteractiveRoleContext provider set to `role`. */
|
|
26
|
+
function withRole(role: InteractiveRole | null) {
|
|
27
|
+
return function Wrapper({children}: {children: ReactNode}) {
|
|
28
|
+
return (
|
|
29
|
+
<InteractiveRoleContext value={role}>{children}</InteractiveRoleContext>
|
|
30
|
+
);
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
describe('InteractiveRoleContext', () => {
|
|
35
|
+
describe('context primitive', () => {
|
|
36
|
+
it('defaults to null when read with no provider', () => {
|
|
37
|
+
const {result} = renderHook(() => useInteractiveRoleContext());
|
|
38
|
+
expect(result.current).toBeNull();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('exposes a displayName for devtools', () => {
|
|
42
|
+
expect(InteractiveRoleContext.displayName).toBe('InteractiveRoleContext');
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('returns the provided role override', () => {
|
|
46
|
+
const {result} = renderHook(() => useInteractiveRoleContext(), {
|
|
47
|
+
wrapper: withRole('button'),
|
|
48
|
+
});
|
|
49
|
+
expect(result.current).toBe('button');
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('returns null when a provider explicitly supplies null', () => {
|
|
53
|
+
const {result} = renderHook(() => useInteractiveRoleContext(), {
|
|
54
|
+
wrapper: withRole(null),
|
|
55
|
+
});
|
|
56
|
+
expect(result.current).toBeNull();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it.each(['link', 'button', 'inert'] as const)(
|
|
60
|
+
'passes through the "%s" override verbatim',
|
|
61
|
+
role => {
|
|
62
|
+
const {result} = renderHook(() => useInteractiveRoleContext(), {
|
|
63
|
+
wrapper: withRole(role),
|
|
64
|
+
});
|
|
65
|
+
expect(result.current).toBe(role);
|
|
66
|
+
},
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
it('resolves to the nearest provider when nested', () => {
|
|
70
|
+
function Nested({children}: {children: ReactNode}) {
|
|
71
|
+
return (
|
|
72
|
+
<InteractiveRoleContext value="link">
|
|
73
|
+
<InteractiveRoleContext value="button">
|
|
74
|
+
{children}
|
|
75
|
+
</InteractiveRoleContext>
|
|
76
|
+
</InteractiveRoleContext>
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
const {result} = renderHook(() => useInteractiveRoleContext(), {
|
|
80
|
+
wrapper: Nested,
|
|
81
|
+
});
|
|
82
|
+
expect(result.current).toBe('button');
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('supports the createElement (no-JSX) provider form', () => {
|
|
86
|
+
const {result} = renderHook(() => useInteractiveRoleContext(), {
|
|
87
|
+
wrapper: ({children}: {children: ReactNode}) =>
|
|
88
|
+
createElement(InteractiveRoleContext, {value: 'button'}, children),
|
|
89
|
+
});
|
|
90
|
+
expect(result.current).toBe('button');
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
// useInteractiveRole is the real consumer of this context; these tests pin
|
|
95
|
+
// down how the context signal participates in the role-resolution priority.
|
|
96
|
+
describe('consumption via useInteractiveRole', () => {
|
|
97
|
+
it('href alone resolves to "link"', () => {
|
|
98
|
+
const {result} = renderHook(() =>
|
|
99
|
+
useInteractiveRole({href: '/somewhere'}),
|
|
100
|
+
);
|
|
101
|
+
expect(result.current).toBe('link');
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('onClick alone resolves to "button"', () => {
|
|
105
|
+
const {result} = renderHook(() =>
|
|
106
|
+
useInteractiveRole({onClick: () => {}}),
|
|
107
|
+
);
|
|
108
|
+
expect(result.current).toBe('button');
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('nothing interactive resolves to "inert"', () => {
|
|
112
|
+
const {result} = renderHook(() => useInteractiveRole({}));
|
|
113
|
+
expect(result.current).toBe('inert');
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('context override is used when neither href nor onClick is set', () => {
|
|
117
|
+
const {result} = renderHook(() => useInteractiveRole({}), {
|
|
118
|
+
wrapper: withRole('button'),
|
|
119
|
+
});
|
|
120
|
+
expect(result.current).toBe('button');
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('href wins over a context override (navigation has top priority)', () => {
|
|
124
|
+
const {result} = renderHook(() => useInteractiveRole({href: '/x'}), {
|
|
125
|
+
wrapper: withRole('button'),
|
|
126
|
+
});
|
|
127
|
+
expect(result.current).toBe('link');
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('onClick wins over a context override', () => {
|
|
131
|
+
const {result} = renderHook(
|
|
132
|
+
() => useInteractiveRole({onClick: () => {}}),
|
|
133
|
+
{wrapper: withRole('link')},
|
|
134
|
+
);
|
|
135
|
+
expect(result.current).toBe('button');
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
// NOTE — documents current behavior. The `isDisabled` JSDoc says a disabled
|
|
139
|
+
// href "falls back to button", but the implementation only *skips* the link
|
|
140
|
+
// branch when disabled — it does not force a button. With no onClick and no
|
|
141
|
+
// context override, a disabled href therefore resolves to "inert", not
|
|
142
|
+
// "button". (The doc-promised "button" fallback only holds when an onClick
|
|
143
|
+
// or a context override is also present — see the two tests below.)
|
|
144
|
+
it('a disabled href with nothing else resolves to "inert" (not "button" as the JSDoc implies)', () => {
|
|
145
|
+
const {result} = renderHook(() =>
|
|
146
|
+
useInteractiveRole({href: '/x', isDisabled: true}),
|
|
147
|
+
);
|
|
148
|
+
expect(result.current).toBe('inert');
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
it('a disabled href with an onClick resolves to "button" via the onClick branch', () => {
|
|
152
|
+
const {result} = renderHook(() =>
|
|
153
|
+
useInteractiveRole({href: '/x', isDisabled: true, onClick: () => {}}),
|
|
154
|
+
);
|
|
155
|
+
expect(result.current).toBe('button');
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it('a disabled href with a context override falls through to that override', () => {
|
|
159
|
+
const {result} = renderHook(
|
|
160
|
+
() => useInteractiveRole({href: '/x', isDisabled: true}),
|
|
161
|
+
{wrapper: withRole('button')},
|
|
162
|
+
);
|
|
163
|
+
expect(result.current).toBe('button');
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it('an "inert" context override is honored when nothing else is interactive', () => {
|
|
167
|
+
const {result} = renderHook(() => useInteractiveRole({}), {
|
|
168
|
+
wrapper: withRole('inert'),
|
|
169
|
+
});
|
|
170
|
+
expect(result.current).toBe('inert');
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
it('a null onClick is treated as absent (falls through to inert)', () => {
|
|
174
|
+
const {result} = renderHook(() => useInteractiveRole({onClick: null}));
|
|
175
|
+
expect(result.current).toBe('inert');
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it('a null onClick still yields to a context override', () => {
|
|
179
|
+
const {result} = renderHook(() => useInteractiveRole({onClick: null}), {
|
|
180
|
+
wrapper: withRole('button'),
|
|
181
|
+
});
|
|
182
|
+
expect(result.current).toBe('button');
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
});
|
package/src/Item/Item.tsx
CHANGED
|
@@ -470,9 +470,9 @@ export function Item({
|
|
|
470
470
|
return (
|
|
471
471
|
<Component
|
|
472
472
|
ref={ref as React.Ref<never>}
|
|
473
|
+
{...restProps}
|
|
473
474
|
aria-selected={isSelected || undefined}
|
|
474
475
|
aria-disabled={isDisabled || undefined}
|
|
475
|
-
{...restProps}
|
|
476
476
|
{...mergeProps(
|
|
477
477
|
themeProps('item', {density, align}),
|
|
478
478
|
stylex.props(
|
|
@@ -78,7 +78,7 @@ export const docs = {
|
|
|
78
78
|
name: 'render',
|
|
79
79
|
type: '(children: ReactNode, props: ContextRenderProps | FixedRenderProps) => ReactNode',
|
|
80
80
|
description:
|
|
81
|
-
'Render function for the popover element. Pass placement/alignment in context mode or x/y in fixed mode. In context mode, pass `as: "span"` to render an inline-safe layer (e.g. inside a paragraph). The layer renders inline in the React tree; the Popover API promotes it to the top layer when shown, so it escapes ancestor clipping and stacking without a portal.',
|
|
81
|
+
'Render function for the popover element. Pass placement/alignment in context mode or x/y in fixed mode. Placement/alignment are logical: they map to the self-* position-area keyword family, which resolves against the popover\'s own inherited direction, so RTL contexts mirror automatically in pure CSS. Pass `positioning: "custom"` in context mode to author position styles yourself via `style` (e.g. explicit anchor() insets or an anchor-size() cover): the hook keeps the popover behavior and position-anchor wiring but derives no position styles — including the automatic RTL mirroring, which becomes your responsibility. In context mode, pass `as: "span"` to render an inline-safe layer (e.g. inside a paragraph). The layer renders inline in the React tree; the Popover API promotes it to the top layer when shown, so it escapes ancestor clipping and stacking without a portal.',
|
|
82
82
|
},
|
|
83
83
|
],
|
|
84
84
|
usage: {
|
|
@@ -130,7 +130,7 @@ export const docsDense = {
|
|
|
130
130
|
hide: 'hide layer.',
|
|
131
131
|
isOpen: 'whether layer is open.',
|
|
132
132
|
id: 'unique ARIA id.',
|
|
133
|
-
render: 'renders popover element; pass placement/alignment or x/y. Context mode accepts `as: "span"` for inline-safe layers. Renders inline; the Popover API top layer escapes clipping/stacking without a portal.',
|
|
133
|
+
render: 'renders popover element; pass placement/alignment or x/y. Placement/alignment logical: mapped to self-* position-area keywords resolved against the popover\'s inherited direction (RTL mirrors in pure CSS). `positioning: "custom"` (context mode) = author position styles yourself via `style`; keeps popover behavior + position-anchor wiring, derives nothing (incl. RTL mirroring — yours). Context mode accepts `as: "span"` for inline-safe layers. Renders inline; the Popover API top layer escapes clipping/stacking without a portal.',
|
|
134
134
|
},
|
|
135
135
|
usage: {
|
|
136
136
|
description:
|