@astryxdesign/core 0.1.8 → 0.1.9-canary.02ef052
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +100 -0
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +6 -2
- package/dist/AppShell/AppShellMobileContext.d.ts +8 -0
- package/dist/AppShell/AppShellMobileContext.d.ts.map +1 -1
- package/dist/Avatar/Avatar.d.ts +58 -3
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +240 -53
- package/dist/Avatar/AvatarStatusDot.d.ts +35 -5
- package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
- package/dist/Avatar/AvatarStatusDot.js +144 -19
- package/dist/AvatarGroup/AvatarGroup.d.ts +7 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +58 -6
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +1 -0
- package/dist/Banner/Banner.d.ts +9 -1
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +33 -4
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +31 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +215 -6
- package/dist/Breadcrumbs/index.d.ts +6 -0
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +10 -1
- package/dist/Button/Button.d.ts +8 -2
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +33 -4
- package/dist/ButtonGroup/ButtonGroup.d.ts +9 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +30 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +80 -11
- package/dist/Calendar/dayCellUtils.d.ts +4 -4
- package/dist/Calendar/dayCellUtils.js +3 -3
- package/dist/Calendar/styles.d.ts +30 -31
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +30 -31
- package/dist/Card/Card.d.ts +8 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +28 -2
- package/dist/Carousel/Carousel.d.ts +4 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +46 -16
- package/dist/Chat/ChatComposer.d.ts +8 -0
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +46 -7
- package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
- package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
- package/dist/Chat/ChatComposerDrawer.js +11 -1
- package/dist/Chat/ChatComposerInput.d.ts +20 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +36 -4
- package/dist/Chat/ChatContext.d.ts +33 -0
- package/dist/Chat/ChatContext.d.ts.map +1 -1
- package/dist/Chat/ChatContext.js +16 -2
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +4 -2
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +4 -4
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +4 -4
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +7 -1
- package/dist/Chat/ChatToolCalls.d.ts +5 -1
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +27 -11
- package/dist/Chat/index.d.ts +2 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/index.js +1 -1
- package/dist/Chat/useChatStreamScroll.d.ts +2 -1
- package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
- package/dist/Chat/useChatStreamScroll.js +22 -8
- package/dist/Chat/useSpeechRecognition.d.ts +0 -1
- package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
- package/dist/Chat/useSpeechRecognition.js +1 -1
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +2 -2
- package/dist/CheckboxInput/CheckboxInput.js +5 -5
- package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +11 -1
- package/dist/Citation/Citation.d.ts +22 -1
- package/dist/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +20 -6
- package/dist/ClickableCard/ClickableCard.d.ts +9 -2
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +5 -2
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +22 -9
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +3 -1
- package/dist/CommandPalette/CommandPalette.d.ts +2 -2
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +45 -4
- package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
- package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +6 -1
- package/dist/CommandPalette/CommandPaletteItem.js +1 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +14 -5
- package/dist/ContextMenu/index.d.ts +1 -0
- package/dist/ContextMenu/index.d.ts.map +1 -1
- package/dist/ContextMenu/index.js +3 -1
- package/dist/DateInput/DateInput.d.ts +56 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +59 -21
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.d.ts +10 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +23 -20
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +33 -19
- package/dist/Dialog/Dialog.d.ts +3 -0
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +57 -6
- package/dist/Dialog/DialogContext.d.ts +7 -0
- package/dist/Dialog/DialogContext.d.ts.map +1 -1
- package/dist/Dialog/DialogContext.js +2 -2
- package/dist/Dialog/DialogHeader.d.ts +5 -2
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +6 -1
- package/dist/Divider/Divider.js +1 -1
- package/dist/DropdownMenu/DropdownMenu.d.ts +6 -0
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +22 -5
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +5 -3
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +5 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +4 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +104 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +427 -0
- package/dist/DropdownMenu/index.d.ts +10 -0
- package/dist/DropdownMenu/index.d.ts.map +1 -1
- package/dist/DropdownMenu/index.js +13 -0
- package/dist/DropdownMenu/menuItemHover.d.ts +23 -0
- package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -0
- package/dist/DropdownMenu/menuItemHover.js +33 -0
- package/dist/DropdownMenu/menuItemRoles.d.ts +8 -0
- package/dist/DropdownMenu/menuItemRoles.d.ts.map +1 -1
- package/dist/DropdownMenu/menuItemRoles.js +10 -1
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +21 -6
- package/dist/Field/Field.d.ts +3 -1
- package/dist/Field/Field.d.ts.map +1 -1
- package/dist/Field/Field.js +6 -4
- package/dist/Field/FieldLabel.d.ts +1 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +43 -16
- package/dist/Field/inputStyles.stylex.d.ts +1 -0
- package/dist/Field/inputStyles.stylex.d.ts.map +1 -1
- package/dist/Field/inputStyles.stylex.js +1 -0
- package/dist/FieldStatus/FieldStatus.d.ts +18 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +60 -6
- package/dist/FileInput/FileInput.d.ts +10 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +54 -35
- package/dist/HoverCard/HoverCard.d.ts +9 -1
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +2 -0
- package/dist/HoverCard/useHoverCard.d.ts +8 -0
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +17 -6
- package/dist/Icon/Icon.d.ts +22 -3
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +19 -3
- package/dist/Item/Item.d.ts +6 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +22 -1
- package/dist/Layer/useLayer.d.ts +6 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +2 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +19 -13
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +7 -0
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +6 -1
- package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
- package/dist/MobileNav/MobileNavToggle.js +4 -0
- package/dist/MultiSelector/MultiSelector.d.ts +9 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +104 -50
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +16 -0
- package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
- package/dist/NumberInput/NumberInput.d.ts +10 -2
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +22 -17
- package/dist/Outline/Outline.d.ts +0 -1
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +0 -1
- package/dist/OverflowList/OverflowList.d.ts +20 -3
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +29 -4
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +11 -3
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +3 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +3 -9
- package/dist/PowerSearch/PowerSearch.d.ts +9 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +2 -0
- package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/RadioList/RadioList.d.ts +2 -2
- package/dist/RadioList/RadioListItem.js +4 -4
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +2 -1
- package/dist/SelectableCard/SelectableCard.d.ts +9 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +16 -13
- package/dist/Selector/Selector.d.ts +8 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +65 -19
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +16 -0
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +5 -5
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +13 -10
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +21 -8
- package/dist/SideNav/SideNavItem.d.ts +1 -1
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +12 -10
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +106 -36
- package/dist/Stack/stack.stylex.d.ts +9 -9
- package/dist/Switch/Switch.d.ts +8 -1
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +160 -91
- package/dist/TabList/Tab.js +2 -2
- package/dist/TabList/TabMenu.js +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +33 -6
- package/dist/Table/TableCell.js +3 -3
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/index.d.ts +2 -0
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +15 -11
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +36 -26
- package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
- package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/index.js +3 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +7 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +105 -12
- package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
- package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
- package/dist/Table/types.d.ts +32 -0
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -3
- package/dist/TextArea/TextArea.d.ts +10 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +18 -19
- package/dist/TextInput/TextInput.d.ts +10 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +20 -17
- package/dist/Thumbnail/Thumbnail.d.ts +26 -5
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +97 -54
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
- package/dist/TimeInput/TimeInput.d.ts +10 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +32 -21
- package/dist/Timestamp/Timestamp.d.ts +3 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +8 -6
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +2 -5
- package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
- package/dist/Token/Token.d.ts +30 -3
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +17 -2
- package/dist/Token/index.d.ts +1 -1
- package/dist/Token/index.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.d.ts +10 -3
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +20 -6
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +17 -1
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +18 -8
- package/dist/TopNav/TopNavMegaMenu.js +10 -4
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
- package/dist/TopNav/TopNavMenu.d.ts +2 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +68 -6
- package/dist/TreeList/TreeList.d.ts +12 -3
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +3 -0
- package/dist/TreeList/TreeListBranches.d.ts +5 -0
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +18 -10
- package/dist/TreeList/TreeListItem.d.ts +8 -2
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +59 -21
- package/dist/TreeList/TreeListTypes.d.ts +25 -1
- package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
- package/dist/TreeList/index.d.ts +2 -2
- package/dist/TreeList/index.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +20 -11
- package/dist/Typeahead/Typeahead.d.ts +9 -2
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +3 -1
- package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
- package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
- package/dist/Typeahead/TypeaheadItem.js +20 -10
- package/dist/astryx.css +61 -39
- package/dist/astryx.umd.js +53 -53
- package/dist/astryx.umd.js.map +4 -4
- package/dist/authoring/doc.d.ts.map +1 -1
- package/dist/docs-types.d.ts +8 -0
- package/dist/docs-types.d.ts.map +1 -1
- package/dist/hooks/computeOverflow.d.ts +47 -0
- package/dist/hooks/computeOverflow.d.ts.map +1 -0
- package/dist/hooks/computeOverflow.js +213 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -1
- package/dist/hooks/isRtlElement.d.ts +18 -0
- package/dist/hooks/isRtlElement.d.ts.map +1 -0
- package/dist/hooks/isRtlElement.js +27 -0
- package/dist/hooks/useDevWarning.d.ts +18 -0
- package/dist/hooks/useDevWarning.d.ts.map +1 -0
- package/dist/hooks/useDevWarning.js +49 -0
- package/dist/hooks/useGridFocus.d.ts +6 -1
- package/dist/hooks/useGridFocus.d.ts.map +1 -1
- package/dist/hooks/useGridFocus.js +12 -9
- package/dist/hooks/useInputStatusIcon.d.ts +38 -0
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -0
- package/dist/hooks/useInputStatusIcon.js +158 -0
- package/dist/hooks/useListFocus.d.ts +39 -1
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useListFocus.js +54 -9
- package/dist/hooks/useOverflow.d.ts +19 -0
- package/dist/hooks/useOverflow.d.ts.map +1 -1
- package/dist/hooks/useOverflow.js +36 -25
- package/dist/i18n/InternationalizationContext.d.ts +1 -0
- package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
- package/dist/i18n/InternationalizationContext.js +3 -0
- package/dist/i18n/InternationalizationProvider.d.ts +8 -1
- package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
- package/dist/i18n/InternationalizationProvider.js +5 -1
- package/dist/i18n/getLocaleDirection.d.ts +18 -0
- package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
- package/dist/i18n/getLocaleDirection.js +29 -0
- package/dist/i18n/index.d.ts +6 -0
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +7 -1
- package/dist/i18n/resolve.d.ts.map +1 -1
- package/dist/i18n/resolve.js +7 -18
- package/dist/i18n/useDirection.d.ts +2 -0
- package/dist/i18n/useDirection.d.ts.map +1 -0
- package/dist/i18n/useDirection.js +27 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +2 -7
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +13 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +51 -0
- package/dist/theme/hct.d.ts +0 -1
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
- package/dist/utils/devWarning.d.ts +42 -0
- package/dist/utils/devWarning.d.ts.map +1 -0
- package/dist/utils/devWarning.js +88 -0
- package/dist/utils/index.d.ts +4 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -2
- package/dist/utils/plainDate.d.ts +30 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +65 -3
- package/dist/utils/rtlStyles.d.ts +24 -0
- package/dist/utils/rtlStyles.d.ts.map +1 -0
- package/dist/utils/rtlStyles.js +27 -0
- package/dist/utils/types.d.ts +13 -0
- package/dist/utils/types.d.ts.map +1 -1
- package/locales/en.json +104 -0
- package/locales/fr-FR.json +14 -0
- package/locales/pseudo.json +78 -0
- package/package.json +6 -1
- package/src/AppShell/AppShell.tsx +6 -0
- package/src/AppShell/AppShellMobileContext.tsx +8 -0
- package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
- package/src/Avatar/Avatar.doc.mjs +64 -5
- package/src/Avatar/Avatar.test.tsx +374 -1
- package/src/Avatar/Avatar.tsx +367 -69
- package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
- package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
- package/src/Avatar/AvatarStatusDot.tsx +180 -21
- package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
- package/src/AvatarGroup/AvatarGroup.test.tsx +141 -1
- package/src/AvatarGroup/AvatarGroup.tsx +58 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
- package/src/Banner/Banner.doc.mjs +9 -0
- package/src/Banner/Banner.test.tsx +30 -0
- package/src/Banner/Banner.tsx +53 -9
- package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
- package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
- package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +335 -2
- package/src/Breadcrumbs/index.ts +31 -0
- package/src/Button/Button.doc.mjs +9 -4
- package/src/Button/Button.test.tsx +49 -0
- package/src/Button/Button.tsx +27 -3
- package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
- package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
- package/src/ButtonGroup/ButtonGroup.tsx +32 -0
- package/src/Calendar/Calendar.doc.mjs +12 -1
- package/src/Calendar/Calendar.test.tsx +362 -19
- package/src/Calendar/Calendar.tsx +111 -32
- package/src/Calendar/dayCellUtils.test.ts +23 -18
- package/src/Calendar/dayCellUtils.ts +3 -3
- package/src/Calendar/styles.ts +33 -39
- package/src/Card/Card.doc.mjs +9 -0
- package/src/Card/Card.test.tsx +21 -3
- package/src/Card/Card.tsx +35 -2
- package/src/Carousel/Carousel.doc.mjs +1 -0
- package/src/Carousel/Carousel.test.tsx +53 -0
- package/src/Carousel/Carousel.tsx +59 -10
- package/src/Chat/ChatComposer.doc.mjs +12 -3
- package/src/Chat/ChatComposer.test.tsx +115 -0
- package/src/Chat/ChatComposer.tsx +73 -9
- package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
- package/src/Chat/ChatComposerDrawer.tsx +11 -1
- package/src/Chat/ChatComposerInput.doc.mjs +7 -0
- package/src/Chat/ChatComposerInput.test.tsx +103 -0
- package/src/Chat/ChatComposerInput.tsx +51 -5
- package/src/Chat/ChatContext.tsx +37 -10
- package/src/Chat/ChatDictationButton.tsx +11 -2
- package/src/Chat/ChatLayout.tsx +7 -5
- package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
- package/src/Chat/ChatMessageMetadata.tsx +1 -2
- package/src/Chat/ChatSendButton.tsx +11 -1
- package/src/Chat/ChatToolCalls.test.tsx +64 -0
- package/src/Chat/ChatToolCalls.tsx +33 -5
- package/src/Chat/index.ts +5 -1
- package/src/Chat/useChatStreamScroll.test.tsx +49 -0
- package/src/Chat/useChatStreamScroll.ts +27 -10
- package/src/Chat/useSpeechRecognition.ts +1 -1
- package/src/Chat/useTriggerMenu.tsx +4 -2
- package/src/CheckboxInput/CheckboxInput.doc.mjs +6 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
- package/src/CheckboxInput/CheckboxInput.tsx +5 -5
- package/src/CheckboxList/CheckboxList.doc.mjs +6 -0
- package/src/CheckboxList/CheckboxList.test.tsx +81 -3
- package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
- package/src/CheckboxList/CheckboxListItem.tsx +41 -5
- package/src/Citation/Citation.doc.mjs +4 -3
- package/src/Citation/Citation.test.tsx +97 -0
- package/src/Citation/Citation.tsx +43 -11
- package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
- package/src/ClickableCard/ClickableCard.test.tsx +34 -0
- package/src/ClickableCard/ClickableCard.tsx +13 -3
- package/src/CodeBlock/CodeBlock.test.tsx +56 -0
- package/src/CodeBlock/CodeBlock.tsx +45 -10
- package/src/Collapsible/Collapsible.doc.mjs +1 -0
- package/src/Collapsible/Collapsible.test.tsx +7 -0
- package/src/Collapsible/Collapsible.tsx +16 -6
- package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
- package/src/CommandPalette/CommandPalette.test.tsx +95 -1
- package/src/CommandPalette/CommandPalette.tsx +44 -3
- package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
- package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
- package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
- package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
- package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
- package/src/ContextMenu/ContextMenu.test.tsx +235 -0
- package/src/ContextMenu/ContextMenu.tsx +13 -11
- package/src/ContextMenu/index.ts +5 -0
- package/src/DateInput/DateInput.doc.mjs +41 -0
- package/src/DateInput/DateInput.test.tsx +338 -0
- package/src/DateInput/DateInput.tsx +119 -32
- package/src/DateInput/index.ts +1 -0
- package/src/DateRangeInput/DateRangeInput.doc.mjs +16 -0
- package/src/DateRangeInput/DateRangeInput.test.tsx +140 -0
- package/src/DateRangeInput/DateRangeInput.tsx +42 -30
- package/src/DateTimeInput/DateTimeInput.doc.mjs +22 -1
- package/src/DateTimeInput/DateTimeInput.test.tsx +147 -0
- package/src/DateTimeInput/DateTimeInput.tsx +58 -41
- package/src/Dialog/Dialog.doc.mjs +2 -2
- package/src/Dialog/Dialog.test.tsx +77 -4
- package/src/Dialog/Dialog.tsx +89 -5
- package/src/Dialog/DialogContext.ts +9 -2
- package/src/Dialog/DialogHeader.doc.mjs +2 -2
- package/src/Dialog/DialogHeader.tsx +9 -2
- package/src/Divider/Divider.tsx +2 -2
- package/src/DropdownMenu/DropdownMenu.test.tsx +229 -0
- package/src/DropdownMenu/DropdownMenu.tsx +31 -12
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +9 -4
- package/src/DropdownMenu/DropdownMenuItem.tsx +9 -3
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +8 -2
- package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +88 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +635 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +553 -0
- package/src/DropdownMenu/index.ts +16 -0
- package/src/DropdownMenu/menuItemHover.ts +39 -0
- package/src/DropdownMenu/menuItemRoles.ts +9 -0
- package/src/DropdownMenu/renderDropdownItems.tsx +29 -15
- package/src/Field/Field.test.tsx +57 -12
- package/src/Field/Field.tsx +20 -14
- package/src/Field/FieldLabel.tsx +9 -1
- package/src/Field/inputStyles.stylex.ts +2 -0
- package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
- package/src/FieldStatus/FieldStatus.test.tsx +150 -40
- package/src/FieldStatus/FieldStatus.tsx +69 -5
- package/src/FileInput/FileInput.doc.mjs +23 -2
- package/src/FileInput/FileInput.test.tsx +135 -12
- package/src/FileInput/FileInput.tsx +65 -51
- package/src/HoverCard/HoverCard.doc.mjs +13 -0
- package/src/HoverCard/HoverCard.test.tsx +21 -2
- package/src/HoverCard/HoverCard.tsx +11 -0
- package/src/HoverCard/useHoverCard.doc.mjs +2 -0
- package/src/HoverCard/useHoverCard.tsx +39 -5
- package/src/Icon/Icon.doc.mjs +16 -2
- package/src/Icon/Icon.test.tsx +89 -0
- package/src/Icon/Icon.tsx +58 -5
- package/src/IconButton/IconButton.doc.mjs +8 -0
- package/src/IconButton/IconButton.test.tsx +15 -18
- package/src/Item/Item.test.tsx +40 -18
- package/src/Item/Item.tsx +38 -2
- package/src/Layer/useLayer.tsx +8 -0
- package/src/Lightbox/Lightbox.tsx +15 -7
- package/src/List/List.test.tsx +9 -8
- package/src/Markdown/Markdown.test.tsx +21 -0
- package/src/Markdown/Markdown.tsx +4 -0
- package/src/MobileNav/MobileNav.tsx +12 -1
- package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
- package/src/MobileNav/MobileNavToggle.tsx +9 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +24 -2
- package/src/MultiSelector/MultiSelector.test.tsx +498 -3
- package/src/MultiSelector/MultiSelector.tsx +149 -65
- package/src/MultiSelector/hooks.ts +17 -0
- package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
- package/src/NumberInput/NumberInput.doc.mjs +21 -0
- package/src/NumberInput/NumberInput.test.tsx +82 -7
- package/src/NumberInput/NumberInput.tsx +36 -28
- package/src/Outline/Outline.tsx +0 -1
- package/src/OverflowList/OverflowList.doc.mjs +39 -6
- package/src/OverflowList/OverflowList.test.tsx +111 -0
- package/src/OverflowList/OverflowList.tsx +48 -8
- package/src/Pagination/Pagination.tsx +11 -3
- package/src/Popover/Popover.tsx +7 -4
- package/src/Popover/usePopover.tsx +9 -13
- package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
- package/src/PowerSearch/PowerSearch.test.tsx +43 -0
- package/src/PowerSearch/PowerSearch.tsx +10 -1
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
- package/src/PowerSearch/usePowerSearchSource.ts +1 -2
- package/src/RadioList/RadioList.doc.mjs +6 -0
- package/src/RadioList/RadioList.tsx +2 -2
- package/src/RadioList/RadioListItem.tsx +4 -4
- package/src/SegmentedControl/SegmentedControlItem.tsx +2 -0
- package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
- package/src/SelectableCard/SelectableCard.test.tsx +46 -4
- package/src/SelectableCard/SelectableCard.tsx +29 -16
- package/src/Selector/Selector.doc.mjs +15 -0
- package/src/Selector/Selector.test.tsx +417 -0
- package/src/Selector/Selector.tsx +86 -21
- package/src/Selector/hooks.ts +17 -0
- package/src/SideNav/SideNav.test.tsx +119 -3
- package/src/SideNav/SideNav.tsx +1 -8
- package/src/SideNav/SideNavCollapseButton.tsx +15 -8
- package/src/SideNav/SideNavHeading.tsx +24 -8
- package/src/SideNav/SideNavItem.tsx +10 -4
- package/src/Slider/Slider.doc.mjs +6 -0
- package/src/Slider/Slider.test.tsx +314 -13
- package/src/Slider/Slider.tsx +117 -28
- package/src/Switch/Switch.doc.mjs +142 -42
- package/src/Switch/Switch.test.tsx +54 -1
- package/src/Switch/Switch.tsx +90 -33
- package/src/TabList/Tab.tsx +2 -2
- package/src/TabList/TabMenu.tsx +2 -2
- package/src/Table/BaseTable.tsx +37 -7
- package/src/Table/Table.doc.mjs +11 -0
- package/src/Table/Table.test.tsx +85 -0
- package/src/Table/TableCell.tsx +3 -3
- package/src/Table/TableHeaderCell.tsx +3 -3
- package/src/Table/index.ts +5 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +15 -8
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +24 -17
- package/src/Table/plugins/rowStatus/index.ts +7 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
- package/src/Table/plugins/selection/useTableSelection.test.tsx +77 -3
- package/src/Table/plugins/selection/useTableSelection.tsx +22 -1
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
- package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
- package/src/Table/plugins/tree/useTableTreeData.tsx +139 -8
- package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
- package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
- package/src/Table/types.ts +33 -0
- package/src/Table/useBaseTablePlugins.ts +10 -6
- package/src/Table/useTableRowStatus.doc.mjs +30 -0
- package/src/Table/useTableSelection.doc.mjs +65 -14
- package/src/Table/useTableTreeData.doc.mjs +29 -0
- package/src/Table/useTableTreeState.doc.mjs +2 -2
- package/src/TextArea/TextArea.doc.mjs +21 -0
- package/src/TextArea/TextArea.test.tsx +32 -1
- package/src/TextArea/TextArea.tsx +27 -26
- package/src/TextInput/TextInput.doc.mjs +21 -0
- package/src/TextInput/TextInput.test.tsx +150 -0
- package/src/TextInput/TextInput.tsx +28 -25
- package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
- package/src/Thumbnail/Thumbnail.test.tsx +98 -7
- package/src/Thumbnail/Thumbnail.tsx +142 -42
- package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
- package/src/TimeInput/TimeInput.doc.mjs +21 -0
- package/src/TimeInput/TimeInput.test.tsx +99 -1
- package/src/TimeInput/TimeInput.tsx +43 -31
- package/src/Timestamp/Timestamp.doc.mjs +4 -4
- package/src/Timestamp/Timestamp.test.tsx +32 -0
- package/src/Timestamp/Timestamp.tsx +28 -8
- package/src/Toast/useToast.tsx +7 -8
- package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
- package/src/Token/Token.test.tsx +21 -15
- package/src/Token/Token.tsx +31 -14
- package/src/Token/index.ts +1 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +38 -2
- package/src/Tokenizer/Tokenizer.test.tsx +206 -2
- package/src/Tokenizer/Tokenizer.tsx +30 -6
- package/src/Tooltip/Tooltip.test.tsx +46 -0
- package/src/Tooltip/useTooltip.tsx +20 -0
- package/src/TopNav/TopNav.test.tsx +125 -1
- package/src/TopNav/TopNavHeading.tsx +24 -8
- package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
- package/src/TopNav/TopNavMegaMenu.tsx +10 -4
- package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
- package/src/TopNav/TopNavMenu.test.tsx +118 -4
- package/src/TopNav/TopNavMenu.tsx +83 -5
- package/src/TreeList/TreeList.doc.mjs +28 -0
- package/src/TreeList/TreeList.test.tsx +272 -0
- package/src/TreeList/TreeList.tsx +23 -2
- package/src/TreeList/TreeListBranches.tsx +24 -8
- package/src/TreeList/TreeListItem.tsx +84 -22
- package/src/TreeList/TreeListTypes.ts +27 -1
- package/src/TreeList/index.ts +2 -2
- package/src/Typeahead/BaseTypeahead.tsx +30 -15
- package/src/Typeahead/Typeahead.doc.mjs +13 -0
- package/src/Typeahead/Typeahead.test.tsx +50 -0
- package/src/Typeahead/Typeahead.tsx +11 -1
- package/src/Typeahead/TypeaheadItem.tsx +2 -1
- package/src/__tests__/inputWidthContract.test.tsx +62 -0
- package/src/authoring/doc.ts +1 -3
- package/src/doc-mjs.d.ts +19 -0
- package/src/docs-types.ts +5 -0
- package/src/hooks/computeOverflow.test.ts +422 -0
- package/src/hooks/computeOverflow.ts +290 -0
- package/src/hooks/index.ts +8 -0
- package/src/hooks/isRtlElement.ts +27 -0
- package/src/hooks/useDevWarning.test.tsx +45 -0
- package/src/hooks/useDevWarning.ts +54 -0
- package/src/hooks/useGridFocus.doc.mjs +3 -3
- package/src/hooks/useGridFocus.test.tsx +41 -0
- package/src/hooks/useGridFocus.ts +21 -10
- package/src/hooks/useInputStatusIcon.test.tsx +162 -0
- package/src/hooks/useInputStatusIcon.tsx +224 -0
- package/src/hooks/useListFocus.doc.mjs +25 -3
- package/src/hooks/useListFocus.test.tsx +153 -1
- package/src/hooks/useListFocus.ts +102 -9
- package/src/hooks/useOverflow.test.ts +96 -4
- package/src/hooks/useOverflow.ts +74 -33
- package/src/i18n/InternationalizationContext.ts +4 -0
- package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
- package/src/i18n/InternationalizationProvider.tsx +12 -2
- package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
- package/src/i18n/__tests__/useDirection.test.tsx +66 -0
- package/src/i18n/getLocaleDirection.ts +29 -0
- package/src/i18n/index.ts +6 -0
- package/src/i18n/resolve.ts +9 -21
- package/src/i18n/useDirection.ts +29 -0
- package/src/reset.css +0 -26
- package/src/reset.test.ts +60 -0
- package/src/theme/Theme.tsx +11 -14
- package/src/theme/derivedVarRegistry.test.ts +1 -0
- package/src/theme/derivedVarRegistry.ts +6 -0
- package/src/theme/generateThemeRules.test.ts +107 -0
- package/src/theme/generateThemeRules.ts +56 -0
- package/src/theme/hct.ts +1 -1
- package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
- package/src/utils/devWarning.test.ts +56 -0
- package/src/utils/devWarning.ts +102 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/plainDate.test.ts +46 -6
- package/src/utils/plainDate.ts +69 -3
- package/src/utils/rtlStyles.ts +27 -0
- package/src/utils/types.ts +14 -0
|
@@ -10,10 +10,14 @@
|
|
|
10
10
|
*
|
|
11
11
|
* SYNC: When modified, update these files to stay in sync:
|
|
12
12
|
* - /packages/core/src/Citation/index.ts (exports if types change)
|
|
13
|
+
* - /packages/core/src/Citation/Citation.doc.mjs (props table, features)
|
|
14
|
+
* - /packages/core/src/Citation/Citation.test.tsx (tests for new/changed behavior)
|
|
15
|
+
* - /apps/storybook/stories/Citation.stories.tsx (storybook stories)
|
|
13
16
|
* - /packages/cli/templates/blocks/components/Citation/ (showcase blocks)
|
|
14
17
|
*/
|
|
15
18
|
|
|
16
19
|
import type React from 'react';
|
|
20
|
+
import type {ReactNode} from 'react';
|
|
17
21
|
import * as stylex from '@stylexjs/stylex';
|
|
18
22
|
import {
|
|
19
23
|
colorVars,
|
|
@@ -29,11 +33,29 @@ import {mergeProps} from '../utils';
|
|
|
29
33
|
import type {BaseProps} from '../BaseProps';
|
|
30
34
|
import {themeProps} from '../utils/themeProps';
|
|
31
35
|
import {useTranslator} from '../i18n';
|
|
36
|
+
import {renderIconSlot} from '../Icon';
|
|
32
37
|
|
|
33
38
|
export interface CitationSource {
|
|
34
39
|
title?: string;
|
|
35
40
|
url?: string;
|
|
36
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Image URL for a favicon or source logo, rendered as `<img src>` inside the
|
|
43
|
+
* icon circle. This is the idiomatic field for image sources (mirrors
|
|
44
|
+
* `Avatar`/`Thumbnail` `src`). When both `src` and a non-string `icon` are
|
|
45
|
+
* provided, `icon` wins.
|
|
46
|
+
*/
|
|
47
|
+
src?: string;
|
|
48
|
+
/**
|
|
49
|
+
* Source icon shown before the label text (label variant only). Accepts:
|
|
50
|
+
* - a React node / Astryx `<Icon>` / SVG element — rendered as-is, or
|
|
51
|
+
* - a string image URL — rendered as `<img src>` for backward compatibility
|
|
52
|
+
* with callers that passed a favicon URL here.
|
|
53
|
+
*
|
|
54
|
+
* Note: unlike icon slots elsewhere in the system, a bare string is treated
|
|
55
|
+
* as an image URL (not a semantic icon name) to preserve the original
|
|
56
|
+
* favicon behavior. Pass an Astryx `<Icon>` (or other node) for a real icon.
|
|
57
|
+
*/
|
|
58
|
+
icon?: ReactNode;
|
|
37
59
|
}
|
|
38
60
|
|
|
39
61
|
export interface CitationProps extends BaseProps<HTMLElement> {
|
|
@@ -162,7 +184,18 @@ export function Citation({
|
|
|
162
184
|
const t = useTranslator();
|
|
163
185
|
const title = source.title ?? String(number);
|
|
164
186
|
const href = source.url;
|
|
165
|
-
|
|
187
|
+
|
|
188
|
+
// Resolve the source icon. A non-string `icon` node renders as-is (an Astryx
|
|
189
|
+
// <Icon>, SVG, avatar, etc.). Otherwise fall back to an image URL: `src`, or
|
|
190
|
+
// a legacy string passed to `icon` (back-compat — favicon URLs still render
|
|
191
|
+
// as <img>). The icon is decorative; the accessible name comes solely from
|
|
192
|
+
// the element's aria-label, so nothing is double-announced.
|
|
193
|
+
const iconNode =
|
|
194
|
+
source.icon != null && typeof source.icon !== 'string' ? source.icon : null;
|
|
195
|
+
const imageSrc =
|
|
196
|
+
source.src ?? (typeof source.icon === 'string' ? source.icon : undefined);
|
|
197
|
+
const hasIcon = iconNode != null || imageSrc != null;
|
|
198
|
+
|
|
166
199
|
const Tag = href ? 'a' : 'span';
|
|
167
200
|
// `doc-noteref` is a reference role — only appropriate on the interactive
|
|
168
201
|
// link form. On a plain (unlinked) span it is not a permitted role
|
|
@@ -218,7 +251,7 @@ export function Citation({
|
|
|
218
251
|
themeProps('citation', {variant}),
|
|
219
252
|
stylex.props(
|
|
220
253
|
styles.label,
|
|
221
|
-
|
|
254
|
+
hasIcon && styles.labelWithIcon,
|
|
222
255
|
href != null && styles.labelHover,
|
|
223
256
|
href != null && styles.labelInteractive,
|
|
224
257
|
xstyle,
|
|
@@ -226,14 +259,13 @@ export function Citation({
|
|
|
226
259
|
className,
|
|
227
260
|
style,
|
|
228
261
|
)}>
|
|
229
|
-
{
|
|
230
|
-
<span {...stylex.props(styles.iconWrap)}>
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
/>
|
|
262
|
+
{hasIcon && (
|
|
263
|
+
<span aria-hidden="true" {...stylex.props(styles.iconWrap)}>
|
|
264
|
+
{iconNode != null ? (
|
|
265
|
+
renderIconSlot(iconNode, {size: 'sm'})
|
|
266
|
+
) : (
|
|
267
|
+
<img src={imageSrc} alt="" {...stylex.props(styles.icon)} />
|
|
268
|
+
)}
|
|
237
269
|
</span>
|
|
238
270
|
)}
|
|
239
271
|
<span {...stylex.props(styles.labelText)}>{title}</span>
|
|
@@ -28,6 +28,7 @@ export const docs = {
|
|
|
28
28
|
{name: 'children', type: 'ReactNode', description: 'Card content.'},
|
|
29
29
|
{name: 'padding', type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10', description: 'Inner padding.', default: '4'},
|
|
30
30
|
{name: 'variant', type: "'default' | 'transparent' | 'muted' | 'blue' | 'cyan' | 'gray' | 'green' | 'orange' | 'pink' | 'purple' | 'red' | 'teal' | 'yellow'", description: 'Background color variant.', default: "'default'"},
|
|
31
|
+
{name: 'elevation', type: "'none' | 'low' | 'med' | 'high'", description: 'Resting shadow depth. Often raised to signal the whole card is clickable.', default: "'none'"},
|
|
31
32
|
{name: 'width', type: 'SizeValue', description: 'Card width.'},
|
|
32
33
|
{name: 'height', type: 'SizeValue', description: 'Card height.'},
|
|
33
34
|
{name: 'maxWidth', type: 'SizeValue', description: 'Maximum card width.'},
|
|
@@ -73,6 +74,7 @@ export const docsDense = {
|
|
|
73
74
|
isDisabled: 'disables card',
|
|
74
75
|
padding: 'inner padding',
|
|
75
76
|
variant: 'background color variant',
|
|
77
|
+
elevation: 'resting shadow depth: none|low|med|high; often raised to signal clickability',
|
|
76
78
|
width: 'card width',
|
|
77
79
|
height: 'card height',
|
|
78
80
|
maxWidth: 'max card width',
|
|
@@ -106,4 +106,38 @@ describe('ClickableCard', () => {
|
|
|
106
106
|
const link = screen.getByRole('link', {name: 'Disabled link'});
|
|
107
107
|
expect(link).toHaveAttribute('aria-disabled', 'true');
|
|
108
108
|
});
|
|
109
|
+
|
|
110
|
+
describe('elevation', () => {
|
|
111
|
+
it('forwards a distinct elevation class to the card for each level', () => {
|
|
112
|
+
const classFor = (elevation: 'none' | 'low' | 'med' | 'high') => {
|
|
113
|
+
const {container} = render(
|
|
114
|
+
<ClickableCard label="Card" elevation={elevation}>
|
|
115
|
+
Content
|
|
116
|
+
</ClickableCard>,
|
|
117
|
+
);
|
|
118
|
+
return container.firstElementChild!.className;
|
|
119
|
+
};
|
|
120
|
+
const classes = new Set([
|
|
121
|
+
classFor('none'),
|
|
122
|
+
classFor('low'),
|
|
123
|
+
classFor('med'),
|
|
124
|
+
classFor('high'),
|
|
125
|
+
]);
|
|
126
|
+
expect(classes.size).toBe(4);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it('defaults to flat (elevation none)', () => {
|
|
130
|
+
const {container: def} = render(
|
|
131
|
+
<ClickableCard label="Card">Content</ClickableCard>,
|
|
132
|
+
);
|
|
133
|
+
const {container: none} = render(
|
|
134
|
+
<ClickableCard label="Card" elevation="none">
|
|
135
|
+
Content
|
|
136
|
+
</ClickableCard>,
|
|
137
|
+
);
|
|
138
|
+
expect(def.firstElementChild!.className).toBe(
|
|
139
|
+
none.firstElementChild!.className,
|
|
140
|
+
);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
109
143
|
});
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* - /apps/storybook/stories/ClickableCard.stories.tsx (storybook stories)
|
|
15
15
|
* - /packages/cli/templates/blocks/components/Card/ClickableCardShowcase.tsx (showcase block)
|
|
16
16
|
* - /packages/cli/templates/blocks/components/Card/ClickableCardWithNestedButton.tsx (block)
|
|
17
|
+
* - /packages/cli/templates/blocks/components/Card/ClickableCardElevated.tsx (block)
|
|
17
18
|
*
|
|
18
19
|
* Composes Card for all visual styling (radius, padding, variants,
|
|
19
20
|
* container tokens, theming). Adds an interactive wrapper with
|
|
@@ -37,7 +38,7 @@ import {
|
|
|
37
38
|
durationVars,
|
|
38
39
|
easeVars,
|
|
39
40
|
} from '../theme/tokens.stylex';
|
|
40
|
-
import type {SizeValue, SpacingStep} from '../utils/types';
|
|
41
|
+
import type {SizeValue, SpacingStep, Elevation} from '../utils/types';
|
|
41
42
|
import {mergeProps, mergeRefs} from '../utils';
|
|
42
43
|
import {Card} from '../Card/Card';
|
|
43
44
|
import type {CardVariant} from '../Card/Card';
|
|
@@ -78,13 +79,13 @@ const styles = stylex.create({
|
|
|
78
79
|
backgroundColor: 'transparent',
|
|
79
80
|
},
|
|
80
81
|
':active::after': {
|
|
81
|
-
backgroundColor: 'color-
|
|
82
|
+
backgroundColor: colorVars['--color-overlay-pressed'],
|
|
82
83
|
},
|
|
83
84
|
},
|
|
84
85
|
hoverOnPointer: {
|
|
85
86
|
'@media (hover: hover)': {
|
|
86
87
|
':hover::after': {
|
|
87
|
-
backgroundColor: 'color-
|
|
88
|
+
backgroundColor: colorVars['--color-overlay-hover'],
|
|
88
89
|
},
|
|
89
90
|
},
|
|
90
91
|
},
|
|
@@ -197,6 +198,13 @@ export interface ClickableCardProps extends BaseProps {
|
|
|
197
198
|
*/
|
|
198
199
|
variant?: CardVariant;
|
|
199
200
|
|
|
201
|
+
/**
|
|
202
|
+
* Resting elevation — the shadow depth the card sits at. Often raised to
|
|
203
|
+
* signal that the whole card is clickable.
|
|
204
|
+
* @default 'none'
|
|
205
|
+
*/
|
|
206
|
+
elevation?: Elevation;
|
|
207
|
+
|
|
200
208
|
/** Width of the card. */
|
|
201
209
|
width?: SizeValue;
|
|
202
210
|
|
|
@@ -253,6 +261,7 @@ export function ClickableCard({
|
|
|
253
261
|
children,
|
|
254
262
|
padding,
|
|
255
263
|
variant = 'default',
|
|
264
|
+
elevation = 'none',
|
|
256
265
|
width,
|
|
257
266
|
height,
|
|
258
267
|
maxWidth,
|
|
@@ -297,6 +306,7 @@ export function ClickableCard({
|
|
|
297
306
|
maxWidth={maxWidth}
|
|
298
307
|
padding={padding}
|
|
299
308
|
variant={variant}
|
|
309
|
+
elevation={elevation}
|
|
300
310
|
{...mergeProps(themeProps('clickable-card', {variant}), {
|
|
301
311
|
className: classNameProp,
|
|
302
312
|
style,
|
|
@@ -210,6 +210,62 @@ describe('CodeBlock', () => {
|
|
|
210
210
|
expect(document.getElementById(controlsId as string)).not.toBeNull();
|
|
211
211
|
});
|
|
212
212
|
|
|
213
|
+
it('makes the collapsed region inert so the scroll container is unreachable', () => {
|
|
214
|
+
render(
|
|
215
|
+
<CodeBlock
|
|
216
|
+
code={LONG_CODE}
|
|
217
|
+
language="javascript"
|
|
218
|
+
title="example"
|
|
219
|
+
isCollapsible
|
|
220
|
+
/>,
|
|
221
|
+
);
|
|
222
|
+
const header = screen
|
|
223
|
+
.getAllByRole('button')
|
|
224
|
+
.find(el => el.hasAttribute('aria-expanded'))!;
|
|
225
|
+
const region = document.getElementById(
|
|
226
|
+
header.getAttribute('aria-controls') as string,
|
|
227
|
+
)!;
|
|
228
|
+
// Expanded: the region is not inert and the scroll container is reachable.
|
|
229
|
+
expect(region).not.toHaveAttribute('inert');
|
|
230
|
+
|
|
231
|
+
fireEvent.click(header);
|
|
232
|
+
expect(header).toHaveAttribute('aria-expanded', 'false');
|
|
233
|
+
// Collapsed: the wrapper is inert, so the keyboard-focusable scroll
|
|
234
|
+
// container (tabIndex=0) inside it drops out of the tab order and the
|
|
235
|
+
// accessibility tree instead of remaining an invisible tab stop.
|
|
236
|
+
expect(region).toHaveAttribute('inert');
|
|
237
|
+
const scrollContainer = screen.getByRole('group');
|
|
238
|
+
expect(scrollContainer.closest('[inert]')).toBe(region);
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
it('restores focusability of the scroll container after expanding again', () => {
|
|
242
|
+
render(
|
|
243
|
+
<CodeBlock
|
|
244
|
+
code={LONG_CODE}
|
|
245
|
+
language="javascript"
|
|
246
|
+
title="example"
|
|
247
|
+
isCollapsible
|
|
248
|
+
/>,
|
|
249
|
+
);
|
|
250
|
+
const header = screen
|
|
251
|
+
.getAllByRole('button')
|
|
252
|
+
.find(el => el.hasAttribute('aria-expanded'))!;
|
|
253
|
+
const region = document.getElementById(
|
|
254
|
+
header.getAttribute('aria-controls') as string,
|
|
255
|
+
)!;
|
|
256
|
+
// Collapse, then expand again.
|
|
257
|
+
fireEvent.click(header);
|
|
258
|
+
expect(region).toHaveAttribute('inert');
|
|
259
|
+
fireEvent.click(header);
|
|
260
|
+
expect(header).toHaveAttribute('aria-expanded', 'true');
|
|
261
|
+
// Expanded again: inert is removed and the scroll container is a
|
|
262
|
+
// keyboard-focusable group once more.
|
|
263
|
+
expect(region).not.toHaveAttribute('inert');
|
|
264
|
+
const scrollContainer = screen.getByRole('group');
|
|
265
|
+
expect(scrollContainer.closest('[inert]')).toBeNull();
|
|
266
|
+
expect(scrollContainer).toHaveAttribute('tabindex', '0');
|
|
267
|
+
});
|
|
268
|
+
|
|
213
269
|
it('applies a per-instance syntax theme via the syntaxTheme prop', () => {
|
|
214
270
|
const {container} = render(
|
|
215
271
|
<CodeBlock
|
|
@@ -88,6 +88,23 @@ const dynamicStyles = stylex.create({
|
|
|
88
88
|
}),
|
|
89
89
|
});
|
|
90
90
|
|
|
91
|
+
// Light reveal so the leading chevron eases into view instead of popping in.
|
|
92
|
+
// Growing the chevron's own footprint (width + inline margin) from zero slides
|
|
93
|
+
// the title into place instead of snapping it over, and clipping keeps the
|
|
94
|
+
// glyph from spilling while it's mid-reveal.
|
|
95
|
+
const chevronReveal = stylex.keyframes({
|
|
96
|
+
from: {
|
|
97
|
+
width: 0,
|
|
98
|
+
marginInlineEnd: 0,
|
|
99
|
+
opacity: 0,
|
|
100
|
+
},
|
|
101
|
+
to: {
|
|
102
|
+
width: '14px',
|
|
103
|
+
marginInlineEnd: spacingVars['--spacing-1'],
|
|
104
|
+
opacity: 1,
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
|
|
91
108
|
const styles = stylex.create({
|
|
92
109
|
root: {
|
|
93
110
|
position: 'relative',
|
|
@@ -133,7 +150,6 @@ const styles = stylex.create({
|
|
|
133
150
|
headerTitle: {
|
|
134
151
|
display: 'flex',
|
|
135
152
|
alignItems: 'center',
|
|
136
|
-
gap: spacingVars['--spacing-1'],
|
|
137
153
|
fontSize: typeScaleVars['--text-supporting-size'],
|
|
138
154
|
fontFamily: typographyVars['--font-family-code'],
|
|
139
155
|
fontWeight: fontWeightVars['--font-weight-medium'],
|
|
@@ -173,13 +189,24 @@ const styles = stylex.create({
|
|
|
173
189
|
flexShrink: 0,
|
|
174
190
|
width: '14px',
|
|
175
191
|
height: '14px',
|
|
192
|
+
marginInlineEnd: spacingVars['--spacing-1'],
|
|
193
|
+
overflow: 'hidden',
|
|
176
194
|
color: 'var(--color-syntax-comment)',
|
|
195
|
+
animationName: {
|
|
196
|
+
default: chevronReveal,
|
|
197
|
+
'@media (prefers-reduced-motion: reduce)': 'none',
|
|
198
|
+
},
|
|
199
|
+
animationDuration: durationVars['--duration-medium'],
|
|
200
|
+
animationTimingFunction: easeVars['--ease-standard'],
|
|
177
201
|
transitionProperty: 'transform',
|
|
178
202
|
transitionDuration: durationVars['--duration-fast'],
|
|
179
203
|
transitionTimingFunction: easeVars['--ease-standard'],
|
|
180
204
|
},
|
|
181
|
-
|
|
182
|
-
|
|
205
|
+
collapseChevronExpanded: {
|
|
206
|
+
// Leading disclosure convention (matches TreeList/Table): the resting
|
|
207
|
+
// chevronRight points right (>) when collapsed; rotate it down (v) when
|
|
208
|
+
// expanded.
|
|
209
|
+
transform: 'rotate(90deg)',
|
|
183
210
|
},
|
|
184
211
|
headerCollapsible: {
|
|
185
212
|
cursor: 'pointer',
|
|
@@ -296,7 +323,7 @@ const styles = stylex.create({
|
|
|
296
323
|
copyButtonAbsolute: {
|
|
297
324
|
position: 'absolute',
|
|
298
325
|
top: spacingVars['--spacing-2'],
|
|
299
|
-
|
|
326
|
+
insetInlineEnd: spacingVars['--spacing-2'],
|
|
300
327
|
},
|
|
301
328
|
});
|
|
302
329
|
|
|
@@ -807,7 +834,9 @@ export function CodeBlock({
|
|
|
807
834
|
e.stopPropagation();
|
|
808
835
|
void handleCopy();
|
|
809
836
|
}}
|
|
810
|
-
aria-label={
|
|
837
|
+
aria-label={
|
|
838
|
+
copied ? t('@astryx.codeBlock.copied') : t('@astryx.codeBlock.copyCode')
|
|
839
|
+
}
|
|
811
840
|
{...stylex.props(
|
|
812
841
|
styles.copyButton,
|
|
813
842
|
!showHeader && styles.copyButtonAbsolute,
|
|
@@ -843,18 +872,18 @@ export function CodeBlock({
|
|
|
843
872
|
canCollapse && styles.headerCollapsible,
|
|
844
873
|
)}>
|
|
845
874
|
<span {...stylex.props(styles.headerTitle)}>
|
|
846
|
-
{title}
|
|
847
|
-
{title && languageLabel ? ' — ' : ''}
|
|
848
|
-
{languageLabel}
|
|
849
875
|
{canCollapse && (
|
|
850
876
|
<span
|
|
851
877
|
{...stylex.props(
|
|
852
878
|
styles.collapseChevron,
|
|
853
|
-
isCollapsed && styles.
|
|
879
|
+
!isCollapsed && styles.collapseChevronExpanded,
|
|
854
880
|
)}>
|
|
855
|
-
<Icon icon="
|
|
881
|
+
<Icon icon="chevronRight" size="xsm" color="inherit" />
|
|
856
882
|
</span>
|
|
857
883
|
)}
|
|
884
|
+
{title}
|
|
885
|
+
{title && languageLabel ? ' — ' : ''}
|
|
886
|
+
{languageLabel}
|
|
858
887
|
</span>
|
|
859
888
|
</div>
|
|
860
889
|
{copyButtonEl}
|
|
@@ -923,6 +952,12 @@ export function CodeBlock({
|
|
|
923
952
|
{canCollapse ? (
|
|
924
953
|
<div
|
|
925
954
|
id={regionId}
|
|
955
|
+
// While collapsed, the region is only hidden visually (0fr grid
|
|
956
|
+
// row); inert also removes it from the tab order and accessibility
|
|
957
|
+
// tree so keyboard users cannot Tab into the invisible scroll
|
|
958
|
+
// container (tabIndex=0). aria-controls pointing at an inert
|
|
959
|
+
// element remains a valid, resolvable reference.
|
|
960
|
+
inert={isCollapsed ? true : undefined}
|
|
926
961
|
{...stylex.props(
|
|
927
962
|
styles.collapseGrid,
|
|
928
963
|
isCollapsed && styles.collapseGridCollapsed,
|
|
@@ -17,6 +17,7 @@ export const docs = {
|
|
|
17
17
|
theming: {
|
|
18
18
|
targets: [
|
|
19
19
|
{className: 'astryx-collapsible', visualProps: ['density']},
|
|
20
|
+
{className: 'astryx-collapsible-trigger', visualProps: ['density']},
|
|
20
21
|
{className: 'astryx-collapsible-content', visualProps: ['density']},
|
|
21
22
|
{className: 'astryx-collapsible-group', visualProps: ['density']},
|
|
22
23
|
],
|
|
@@ -72,6 +72,13 @@ describe('Collapsible', () => {
|
|
|
72
72
|
expect(screen.getByTestId('root')).toHaveClass('astryx-collapsible');
|
|
73
73
|
});
|
|
74
74
|
|
|
75
|
+
it('renders the stable astryx-collapsible-trigger class on the trigger button', () => {
|
|
76
|
+
render(<Collapsible trigger="T">c</Collapsible>);
|
|
77
|
+
expect(screen.getByRole('button')).toHaveClass(
|
|
78
|
+
'astryx-collapsible-trigger',
|
|
79
|
+
);
|
|
80
|
+
});
|
|
81
|
+
|
|
75
82
|
it('renders the stable astryx-collapsible-content class on the content area', () => {
|
|
76
83
|
render(<Collapsible trigger="T">c</Collapsible>);
|
|
77
84
|
const content = contentFor(screen.getByRole('button'));
|
|
@@ -51,7 +51,12 @@ const styles = stylex.create({
|
|
|
51
51
|
root: {
|
|
52
52
|
width: '100%',
|
|
53
53
|
},
|
|
54
|
-
// Trigger button — full width, flex row, no browser button styling
|
|
54
|
+
// Trigger button — full width, flex row, no browser button styling.
|
|
55
|
+
// Anchors heading-adjacent typography (body family, large size, semibold)
|
|
56
|
+
// so the label reads as a section header regardless of where the
|
|
57
|
+
// Collapsible is placed. External themes retarget it independently from the
|
|
58
|
+
// content via the `astryx-collapsible-trigger` target — e.g. a heading font
|
|
59
|
+
// on the trigger while the content stays on the body font.
|
|
55
60
|
trigger: {
|
|
56
61
|
all: 'unset',
|
|
57
62
|
boxSizing: 'border-box',
|
|
@@ -113,7 +118,7 @@ const styles = stylex.create({
|
|
|
113
118
|
// Anchors body typography so revealed text renders at the system's body
|
|
114
119
|
// scale (family/size/weight/leading) instead of inheriting from wherever
|
|
115
120
|
// the Collapsible is placed. External themes override via the
|
|
116
|
-
// `astryx-collapsible-content` target.
|
|
121
|
+
// `astryx-collapsible-content` target, independently from the trigger.
|
|
117
122
|
content: {
|
|
118
123
|
paddingBlockStart: spacingVars['--spacing-1'],
|
|
119
124
|
fontFamily: typographyVars['--font-family-body'],
|
|
@@ -318,10 +323,15 @@ export function Collapsible({
|
|
|
318
323
|
// the system-wide disabled convention (never native `disabled`, which
|
|
319
324
|
// would swallow events like a wrapping tooltip's hover).
|
|
320
325
|
tabIndex={isDisabled ? -1 : undefined}
|
|
321
|
-
{...
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
326
|
+
{...mergeProps(
|
|
327
|
+
themeProps('collapsible-trigger', {
|
|
328
|
+
density: density ?? undefined,
|
|
329
|
+
}),
|
|
330
|
+
stylex.props(
|
|
331
|
+
styles.trigger,
|
|
332
|
+
density != null && triggerDensity[density],
|
|
333
|
+
isDisabled && styles.triggerDisabled,
|
|
334
|
+
),
|
|
325
335
|
)}>
|
|
326
336
|
<span {...stylex.props(styles.triggerLabel)}>{trigger}</span>
|
|
327
337
|
<span
|
|
@@ -145,6 +145,7 @@ export const docs = {
|
|
|
145
145
|
{className: 'astryx-command-palette-empty'},
|
|
146
146
|
{className: 'astryx-command-palette-footer'},
|
|
147
147
|
{className: 'astryx-command-palette-group'},
|
|
148
|
+
{className: 'astryx-command-palette-group-heading'},
|
|
148
149
|
{className: 'astryx-command-palette-input'},
|
|
149
150
|
{className: 'astryx-command-palette-item'},
|
|
150
151
|
{className: 'astryx-command-palette-list'},
|
|
@@ -8,10 +8,11 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import {describe, it, expect, vi, beforeEach} from 'vitest';
|
|
11
|
-
import {render, screen, waitFor, fireEvent} from '@testing-library/react';
|
|
11
|
+
import {render, screen, waitFor, fireEvent, act} from '@testing-library/react';
|
|
12
12
|
import {CommandPalette} from './CommandPalette';
|
|
13
13
|
import {createStaticSource} from '@astryxdesign/core/Typeahead';
|
|
14
14
|
import type {SearchSource, SearchableItem} from '@astryxdesign/core/Typeahead';
|
|
15
|
+
import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
|
|
15
16
|
|
|
16
17
|
const simpleSource = createStaticSource([
|
|
17
18
|
{id: 'home', label: 'Home'},
|
|
@@ -35,6 +36,9 @@ beforeEach(() => {
|
|
|
35
36
|
HTMLDialogElement.prototype.close = vi.fn(function (this: HTMLDialogElement) {
|
|
36
37
|
this.removeAttribute('open');
|
|
37
38
|
});
|
|
39
|
+
// The live regions are module-level singletons; reset them so
|
|
40
|
+
// announcements from one test don't leak into the next.
|
|
41
|
+
__resetLiveRegionsForTest();
|
|
38
42
|
});
|
|
39
43
|
|
|
40
44
|
describe('CommandPalette', () => {
|
|
@@ -269,4 +273,94 @@ describe('CommandPalette', () => {
|
|
|
269
273
|
expect(screen.getByText('No results')).toBeInTheDocument(),
|
|
270
274
|
);
|
|
271
275
|
});
|
|
276
|
+
|
|
277
|
+
describe('screen reader announcements', () => {
|
|
278
|
+
const politeRegion = () =>
|
|
279
|
+
document.querySelector('[data-astryx-live-region="polite"]');
|
|
280
|
+
|
|
281
|
+
it('announces the result count politely after typing a query', async () => {
|
|
282
|
+
render(
|
|
283
|
+
<CommandPalette
|
|
284
|
+
isOpen={true}
|
|
285
|
+
onOpenChange={() => {}}
|
|
286
|
+
searchSource={simpleSource}
|
|
287
|
+
/>,
|
|
288
|
+
);
|
|
289
|
+
await waitFor(() => expect(screen.getByText('Home')).toBeInTheDocument());
|
|
290
|
+
// "e" matches both Home and Settings.
|
|
291
|
+
fireEvent.change(screen.getByRole('combobox'), {target: {value: 'e'}});
|
|
292
|
+
await waitFor(() => {
|
|
293
|
+
expect(politeRegion()).toHaveTextContent('2 results');
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
it('announces the singular form when one item matches', async () => {
|
|
298
|
+
render(
|
|
299
|
+
<CommandPalette
|
|
300
|
+
isOpen={true}
|
|
301
|
+
onOpenChange={() => {}}
|
|
302
|
+
searchSource={simpleSource}
|
|
303
|
+
/>,
|
|
304
|
+
);
|
|
305
|
+
await waitFor(() => expect(screen.getByText('Home')).toBeInTheDocument());
|
|
306
|
+
// "set" matches only Settings. Anchored so it cannot pass on "1 results".
|
|
307
|
+
fireEvent.change(screen.getByRole('combobox'), {target: {value: 'set'}});
|
|
308
|
+
await waitFor(() => {
|
|
309
|
+
expect(politeRegion()).toHaveTextContent(/^1 result$/);
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
it('announces the empty state with the query when nothing matches', async () => {
|
|
314
|
+
render(
|
|
315
|
+
<CommandPalette
|
|
316
|
+
isOpen={true}
|
|
317
|
+
onOpenChange={() => {}}
|
|
318
|
+
searchSource={simpleSource}
|
|
319
|
+
/>,
|
|
320
|
+
);
|
|
321
|
+
await waitFor(() => expect(screen.getByText('Home')).toBeInTheDocument());
|
|
322
|
+
fireEvent.change(screen.getByRole('combobox'), {target: {value: 'zzz'}});
|
|
323
|
+
await waitFor(() => {
|
|
324
|
+
expect(politeRegion()).toHaveTextContent('No results for zzz');
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
it('announces loading politely while a search is in flight', async () => {
|
|
329
|
+
// A source whose searches never resolve, so the palette stays busy and
|
|
330
|
+
// only the loading announcement can reach the live region.
|
|
331
|
+
const source: SearchSource = {
|
|
332
|
+
bootstrap: () => [],
|
|
333
|
+
async search(): Promise<SearchableItem[]> {
|
|
334
|
+
return new Promise<SearchableItem[]>(() => {});
|
|
335
|
+
},
|
|
336
|
+
};
|
|
337
|
+
render(
|
|
338
|
+
<CommandPalette
|
|
339
|
+
isOpen={true}
|
|
340
|
+
onOpenChange={() => {}}
|
|
341
|
+
searchSource={source}
|
|
342
|
+
/>,
|
|
343
|
+
);
|
|
344
|
+
fireEvent.change(screen.getByRole('combobox'), {target: {value: 'z'}});
|
|
345
|
+
await waitFor(() => {
|
|
346
|
+
expect(politeRegion()).toHaveTextContent('Loading');
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
it('does not announce on initial open (bootstrap)', async () => {
|
|
351
|
+
render(
|
|
352
|
+
<CommandPalette
|
|
353
|
+
isOpen={true}
|
|
354
|
+
onOpenChange={() => {}}
|
|
355
|
+
searchSource={simpleSource}
|
|
356
|
+
/>,
|
|
357
|
+
);
|
|
358
|
+
await waitFor(() => expect(screen.getByText('Home')).toBeInTheDocument());
|
|
359
|
+
// Flush effects and any pending live-region rAF writes.
|
|
360
|
+
await act(async () => {
|
|
361
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
362
|
+
});
|
|
363
|
+
expect(politeRegion()?.textContent ?? '').toBe('');
|
|
364
|
+
});
|
|
365
|
+
});
|
|
272
366
|
});
|