@astryxdesign/core 0.3.0 → 0.4.0-canary.058f476
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 +156 -0
- package/dist/AlertDialog/AlertDialog.d.ts +10 -2
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +22 -3
- package/dist/AppShell/AppShell.d.ts +2 -2
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +40 -9
- package/dist/AspectRatio/AspectRatio.d.ts +13 -0
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +10 -2
- package/dist/AspectRatio/index.d.ts.map +1 -1
- package/dist/AspectRatio/index.js +1 -2
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +33 -20
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +2 -3
- package/dist/Badge/Badge.d.ts.map +1 -1
- package/dist/Badge/Badge.js +1 -2
- package/dist/Badge/index.d.ts.map +1 -1
- package/dist/Badge/index.js +1 -2
- package/dist/Banner/Banner.d.ts +3 -0
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +32 -17
- package/dist/Blockquote/Blockquote.d.ts.map +1 -1
- package/dist/Blockquote/Blockquote.js +1 -2
- package/dist/Blockquote/index.d.ts.map +1 -1
- package/dist/Blockquote/index.js +1 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +21 -8
- package/dist/Breadcrumbs/index.d.ts +2 -1
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +1 -0
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +12 -16
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +2 -1
- package/dist/Calendar/styles.d.ts +0 -2
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +0 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +1 -2
- package/dist/Card/index.d.ts.map +1 -1
- package/dist/Card/index.js +1 -2
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +8 -12
- package/dist/Center/Center.d.ts.map +1 -1
- package/dist/Center/Center.js +1 -2
- package/dist/Center/index.d.ts.map +1 -1
- package/dist/Center/index.js +1 -2
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +2 -1
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +3 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +4 -3
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +17 -17
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +2 -6
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +36 -125
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +3 -11
- package/dist/Code/Code.d.ts.map +1 -1
- package/dist/Code/Code.js +1 -2
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +84 -67
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +35 -15
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +5 -0
- package/dist/CommandPalette/CommandPaletteItem.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +6 -3
- package/dist/CommandPalette/CommandPaletteList.js +1 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts +1 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +32 -31
- package/dist/ContextMenu/ContextMenu.d.ts +2 -2
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +1 -1
- package/dist/ContextMenu/index.d.ts +2 -1
- package/dist/ContextMenu/index.d.ts.map +1 -1
- package/dist/ContextMenu/index.js +1 -0
- package/dist/DateInput/DateInput.d.ts +9 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +47 -33
- package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +55 -32
- package/dist/DateTimeInput/DateTimeInput.d.ts +9 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +54 -30
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +4 -4
- package/dist/DropdownMenu/DropdownMenu.d.ts +33 -8
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +62 -20
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +8 -11
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +32 -31
- package/dist/DropdownMenu/DropdownMenuDivider.d.ts +25 -0
- package/dist/DropdownMenu/DropdownMenuDivider.d.ts.map +1 -0
- package/dist/DropdownMenu/DropdownMenuDivider.js +66 -0
- package/dist/DropdownMenu/DropdownMenuItem.d.ts +15 -2
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +20 -8
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +10 -3
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +5 -5
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +24 -67
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +2 -8
- package/dist/DropdownMenu/index.d.ts +2 -1
- package/dist/DropdownMenu/index.d.ts.map +1 -1
- package/dist/DropdownMenu/index.js +4 -0
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +35 -27
- package/dist/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/EmptyState/EmptyState.js +9 -5
- package/dist/Field/InputClearButton.d.ts +16 -3
- package/dist/Field/InputClearButton.d.ts.map +1 -1
- package/dist/Field/InputClearButton.js +15 -4
- package/dist/Field/PanelSearchInput.d.ts +81 -0
- package/dist/Field/PanelSearchInput.d.ts.map +1 -0
- package/dist/Field/PanelSearchInput.js +151 -0
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +21 -10
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/Grid.js +1 -2
- package/dist/Grid/index.d.ts.map +1 -1
- package/dist/Grid/index.js +1 -2
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +3 -19
- package/dist/Icon/globalIconRegistry.d.ts +5 -4
- package/dist/Icon/globalIconRegistry.d.ts.map +1 -1
- package/dist/Icon/globalIconRegistry.js +5 -4
- package/dist/Indicator/CheckIndicator.d.ts +25 -0
- package/dist/Indicator/CheckIndicator.d.ts.map +1 -0
- package/dist/Indicator/CheckIndicator.js +155 -0
- package/dist/Indicator/CheckboxIndicator.d.ts +22 -0
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -0
- package/dist/Indicator/CheckboxIndicator.js +173 -0
- package/dist/Indicator/RadioIndicator.d.ts +23 -0
- package/dist/Indicator/RadioIndicator.d.ts.map +1 -0
- package/dist/Indicator/RadioIndicator.js +137 -0
- package/dist/Indicator/index.d.ts +24 -0
- package/dist/Indicator/index.d.ts.map +1 -0
- package/dist/Indicator/index.js +26 -0
- package/dist/Indicator/indicator.markers.stylex.d.ts +16 -0
- package/dist/Indicator/indicator.markers.stylex.d.ts.map +1 -0
- package/dist/Indicator/indicator.markers.stylex.js +21 -0
- package/dist/Indicator/indicatorRegistry.d.ts +71 -0
- package/dist/Indicator/indicatorRegistry.d.ts.map +1 -0
- package/dist/Indicator/indicatorRegistry.js +93 -0
- package/dist/Indicator/types.d.ts +177 -0
- package/dist/Indicator/types.d.ts.map +1 -0
- package/dist/Indicator/types.js +1 -0
- package/dist/Indicator/useIndicator.d.ts +18 -0
- package/dist/Indicator/useIndicator.d.ts.map +1 -0
- package/dist/Indicator/useIndicator.js +30 -0
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +4 -8
- package/dist/Layer/useLayer.d.ts +14 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +25 -2
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +80 -103
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +4 -5
- package/dist/MobileNav/MobileNav.js +8 -8
- package/dist/MoreMenu/MoreMenu.d.ts +14 -1
- package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
- package/dist/MoreMenu/MoreMenu.js +4 -0
- package/dist/MultiSelector/MultiSelector.d.ts +8 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +205 -170
- package/dist/NumberInput/NumberInput.d.ts +27 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +230 -42
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +2 -3
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +61 -63
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +6 -8
- package/dist/Popover/usePopover.d.ts +15 -0
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +14 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +7 -0
- package/dist/ProgressBar/ProgressBar.d.ts +11 -4
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +95 -6
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +29 -84
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +2 -3
- package/dist/Section/Section.d.ts.map +1 -1
- package/dist/Section/Section.js +1 -2
- package/dist/Section/index.d.ts.map +1 -1
- package/dist/Section/index.js +1 -2
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +2 -3
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +3 -11
- package/dist/Selector/Selector.d.ts +12 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +293 -183
- package/dist/Selector/hooks.d.ts +18 -6
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +57 -40
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +29 -14
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +56 -20
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +28 -22
- package/dist/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/Skeleton/Skeleton.js +1 -2
- package/dist/Skeleton/index.d.ts.map +1 -1
- package/dist/Skeleton/index.js +1 -2
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +2 -6
- package/dist/Stack/stack.stylex.d.ts +3 -3
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +14 -13
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +2 -3
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +41 -19
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +8 -0
- package/dist/Table/TableRow.d.ts +1 -1
- package/dist/Table/TableRow.d.ts.map +1 -1
- package/dist/Table/TableRow.js +4 -2
- package/dist/Table/index.d.ts +1 -1
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +22 -18
- package/dist/Table/plugins/rowExpansion/index.d.ts +1 -1
- package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/index.js +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +41 -76
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +94 -345
- package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +23 -4
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +29 -33
- package/dist/Table/tableContextMenu.d.ts.map +1 -1
- package/dist/Table/tableContextMenu.js +2 -1
- package/dist/Table/types.d.ts +11 -0
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/TextArea/TextArea.d.ts +10 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +16 -6
- package/dist/TextInput/TextInput.d.ts +10 -1
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +13 -19
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +32 -26
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +14 -17
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +14 -3
- package/dist/Timestamp/TimestampHoverCard.d.ts.map +1 -1
- package/dist/Timestamp/TimestampHoverCard.js +16 -34
- package/dist/Timestamp/formatInstant.d.ts +11 -1
- package/dist/Timestamp/formatInstant.d.ts.map +1 -1
- package/dist/Timestamp/formatInstant.js +3 -1
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +20 -11
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +4 -2
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +3 -19
- package/dist/TopNav/TopNav.d.ts.map +1 -1
- package/dist/TopNav/TopNav.js +6 -5
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +54 -16
- package/dist/TopNav/TopNavItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavItem.js +3 -9
- package/dist/TopNav/TopNavMegaMenu.d.ts +7 -0
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +146 -60
- package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuItem.js +22 -3
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +83 -38
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +13 -0
- package/dist/TreeList/TreeListBranches.d.ts +1 -1
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +14 -4
- package/dist/TreeList/TreeListItem.d.ts +11 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +57 -30
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +16 -8
- package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
- package/dist/VisuallyHidden/VisuallyHidden.js +1 -2
- package/dist/VisuallyHidden/index.d.ts.map +1 -1
- package/dist/VisuallyHidden/index.js +1 -2
- package/dist/astryx.css +86 -96
- package/dist/astryx.umd.js +56 -56
- package/dist/astryx.umd.js.map +4 -4
- package/dist/hooks/containerReveal.stylex.d.ts +61 -0
- package/dist/hooks/containerReveal.stylex.d.ts.map +1 -0
- package/dist/hooks/containerReveal.stylex.js +63 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/useClipboard.d.ts +59 -0
- package/dist/hooks/useClipboard.d.ts.map +1 -0
- package/dist/hooks/useClipboard.js +106 -0
- package/dist/hooks/useContainerReveal.d.ts +14 -8
- package/dist/hooks/useContainerReveal.d.ts.map +1 -1
- package/dist/hooks/useContainerReveal.js +28 -69
- package/dist/hooks/useIndicatorFocusRing.d.ts +28 -0
- package/dist/hooks/useIndicatorFocusRing.d.ts.map +1 -0
- package/dist/hooks/useIndicatorFocusRing.js +96 -0
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
- package/dist/hooks/useInputStatusIcon.js +17 -4
- package/dist/hooks/useLongPress.d.ts.map +1 -1
- package/dist/hooks/useLongPress.js +12 -2
- package/dist/hooks/useScrollLock.d.ts.map +1 -1
- package/dist/hooks/useScrollLock.js +33 -18
- package/dist/hooks/useStreamingText.d.ts +18 -3
- package/dist/hooks/useStreamingText.d.ts.map +1 -1
- package/dist/hooks/useStreamingText.js +47 -7
- package/dist/hooks/useTreeFocus.d.ts.map +1 -1
- package/dist/hooks/useTreeFocus.js +9 -3
- package/dist/hooks/useTypeahead.d.ts +3 -2
- package/dist/hooks/useTypeahead.d.ts.map +1 -1
- package/dist/hooks/useTypeahead.js +19 -7
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/theme/defineTheme.d.ts +18 -2
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/defineTheme.js +10 -1
- package/dist/theme/derivedVarRegistry.d.ts +8 -0
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +14 -13
- package/dist/theme/expandColorScale.d.ts +3 -1
- package/dist/theme/expandColorScale.d.ts.map +1 -1
- package/dist/theme/expandColorScale.js +17 -7
- package/dist/theme/expandTypeScale.d.ts.map +1 -1
- package/dist/theme/expandTypeScale.js +17 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +11 -0
- package/dist/theme/index.d.ts +2 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +1 -1
- package/dist/theme/tokens.stylex.d.ts +12 -0
- package/dist/theme/tokens.stylex.d.ts.map +1 -1
- package/dist/theme/tokens.stylex.js +23 -0
- package/dist/utils/focusOutline.stylex.d.ts +122 -0
- package/dist/utils/focusOutline.stylex.d.ts.map +1 -0
- package/dist/utils/focusOutline.stylex.js +143 -0
- package/dist/utils/focusReturn.d.ts +24 -0
- package/dist/utils/focusReturn.d.ts.map +1 -0
- package/dist/utils/focusReturn.js +29 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +6 -1
- package/dist/utils/interactionModality.d.ts +34 -0
- package/dist/utils/interactionModality.d.ts.map +1 -0
- package/dist/utils/interactionModality.js +70 -0
- package/dist/utils/mergeRefs.d.ts.map +1 -1
- package/dist/utils/mergeRefs.js +7 -5
- package/dist/utils/rtlStyles.d.ts +2 -2
- package/dist/utils/rtlStyles.js +2 -2
- package/dist/utils/themeProps.d.ts +20 -1
- package/dist/utils/themeProps.d.ts.map +1 -1
- package/dist/utils/themeProps.js +8 -2
- package/locales/en.json +52 -0
- package/locales/pseudo.json +39 -0
- package/package.json +8 -3
- package/src/AlertDialog/AlertDialog.doc.mjs +16 -3
- package/src/AlertDialog/AlertDialog.test.tsx +208 -1
- package/src/AlertDialog/AlertDialog.tsx +21 -3
- package/src/AppShell/AppShell.doc.mjs +14 -0
- package/src/AppShell/AppShell.test.tsx +139 -0
- package/src/AppShell/AppShell.tsx +32 -22
- package/src/AspectRatio/AspectRatio.doc.mjs +27 -3
- package/src/AspectRatio/AspectRatio.test.tsx +30 -0
- package/src/AspectRatio/AspectRatio.tsx +13 -2
- package/src/AspectRatio/index.ts +0 -2
- package/src/Avatar/Avatar.doc.mjs +2 -13
- package/src/Avatar/Avatar.test.tsx +33 -8
- package/src/Avatar/Avatar.tsx +52 -50
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -9
- package/src/Badge/Badge.tsx +0 -2
- package/src/Badge/index.ts +0 -2
- package/src/Banner/Banner.test.tsx +58 -1
- package/src/Banner/Banner.tsx +33 -11
- package/src/Blockquote/Blockquote.tsx +0 -2
- package/src/Blockquote/index.ts +0 -2
- package/src/Breadcrumbs/BreadcrumbItem.tsx +16 -6
- package/src/Breadcrumbs/index.ts +5 -1
- package/src/Button/Button.doc.mjs +2 -2
- package/src/Button/Button.tsx +22 -41
- package/src/Calendar/Calendar.tsx +2 -1
- package/src/Calendar/styles.ts +0 -8
- package/src/Card/Card.tsx +0 -2
- package/src/Card/index.ts +0 -2
- package/src/Carousel/Carousel.doc.mjs +3 -0
- package/src/Carousel/Carousel.tsx +10 -6
- package/src/Center/Center.tsx +0 -2
- package/src/Center/index.ts +0 -2
- package/src/Chat/Chat.doc.mjs +2 -0
- package/src/Chat/ChatDictationButton.tsx +7 -1
- package/src/Chat/ChatLayoutScrollButton.test.tsx +22 -0
- package/src/Chat/ChatLayoutScrollButton.tsx +8 -1
- package/src/Chat/ChatSendButton.tsx +2 -3
- package/src/Chat/ChatToolCalls.test.tsx +35 -0
- package/src/Chat/ChatToolCalls.tsx +36 -16
- package/src/Chat/useTriggerMenu.tsx +2 -5
- package/src/CheckboxInput/CheckboxInput.doc.mjs +4 -2
- package/src/CheckboxInput/CheckboxInput.test.tsx +120 -0
- package/src/CheckboxInput/CheckboxInput.tsx +45 -202
- package/src/ClickableCard/ClickableCard.tsx +6 -11
- package/src/Code/Code.tsx +0 -2
- package/src/CodeBlock/CodeBlock.doc.mjs +3 -0
- package/src/CodeBlock/CodeBlock.test.tsx +91 -0
- package/src/CodeBlock/CodeBlock.tsx +57 -80
- package/src/Collapsible/Collapsible.tsx +22 -18
- package/src/CommandPalette/CommandPalette.test.tsx +83 -0
- package/src/CommandPalette/CommandPalette.tsx +5 -0
- package/src/CommandPalette/CommandPaletteItem.tsx +7 -4
- package/src/CommandPalette/CommandPaletteList.tsx +2 -2
- package/src/ComplexSelector/ComplexSelector.doc.mjs +42 -0
- package/src/ComplexSelector/ComplexSelector.test.tsx +73 -0
- package/src/ComplexSelector/ComplexSelector.tsx +41 -28
- package/src/ContextMenu/ContextMenu.doc.mjs +1 -1
- package/src/ContextMenu/ContextMenu.test.tsx +41 -0
- package/src/ContextMenu/ContextMenu.tsx +3 -3
- package/src/ContextMenu/index.ts +5 -1
- package/src/DateInput/DateInput.doc.mjs +18 -3
- package/src/DateInput/DateInput.test.tsx +112 -11
- package/src/DateInput/DateInput.tsx +44 -25
- package/src/DateRangeInput/DateRangeInput.doc.mjs +10 -2
- package/src/DateRangeInput/DateRangeInput.test.tsx +110 -14
- package/src/DateRangeInput/DateRangeInput.tsx +27 -21
- package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -2
- package/src/DateTimeInput/DateTimeInput.test.tsx +154 -1
- package/src/DateTimeInput/DateTimeInput.tsx +58 -17
- package/src/Dialog/Dialog.tsx +2 -9
- package/src/DropdownMenu/DropdownMenu.doc.mjs +5 -9
- package/src/DropdownMenu/DropdownMenu.test.tsx +534 -4
- package/src/DropdownMenu/DropdownMenu.tsx +113 -52
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +27 -30
- package/src/DropdownMenu/DropdownMenuDivider.doc.mjs +34 -0
- package/src/DropdownMenu/DropdownMenuDivider.tsx +81 -0
- package/src/DropdownMenu/DropdownMenuItem.doc.mjs +39 -4
- package/src/DropdownMenu/DropdownMenuItem.tsx +48 -10
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +2 -1
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +30 -76
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +25 -19
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +44 -14
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +1 -5
- package/src/DropdownMenu/index.ts +8 -1
- package/src/DropdownMenu/renderDropdownItems.tsx +33 -34
- package/src/EmptyState/EmptyState.doc.mjs +4 -0
- package/src/EmptyState/EmptyState.test.tsx +62 -0
- package/src/EmptyState/EmptyState.tsx +16 -6
- package/src/Field/Field.doc.mjs +1 -0
- package/src/Field/InputClearButton.test.tsx +117 -0
- package/src/Field/InputClearButton.tsx +30 -3
- package/src/Field/PanelSearchInput.tsx +271 -0
- package/src/FileInput/FileInput.tsx +21 -8
- package/src/Grid/Grid.tsx +0 -2
- package/src/Grid/index.ts +0 -2
- package/src/HoverCard/useHoverCard.tsx +2 -23
- package/src/Icon/Icon.doc.mjs +2 -1
- package/src/Icon/globalIconRegistry.tsx +5 -4
- package/src/Indicator/CheckIndicator.tsx +174 -0
- package/src/Indicator/CheckboxIndicator.tsx +257 -0
- package/src/Indicator/Indicator.doc.mjs +344 -0
- package/src/Indicator/Indicator.test.tsx +393 -0
- package/src/Indicator/RadioIndicator.tsx +206 -0
- package/src/Indicator/index.ts +46 -0
- package/src/Indicator/indicator.markers.stylex.ts +19 -0
- package/src/Indicator/indicatorRegistry.test.tsx +106 -0
- package/src/Indicator/indicatorRegistry.ts +120 -0
- package/src/Indicator/types.ts +197 -0
- package/src/Indicator/useIndicator.ts +39 -0
- package/src/Item/Item.doc.mjs +1 -1
- package/src/Item/Item.tsx +7 -14
- package/src/Layer/useLayer.doc.mjs +2 -2
- package/src/Layer/useLayer.test.tsx +85 -0
- package/src/Layer/useLayer.tsx +39 -1
- package/src/Lightbox/Lightbox.doc.mjs +1 -1
- package/src/Lightbox/Lightbox.tsx +45 -49
- package/src/Link/Link.tsx +4 -11
- package/src/MobileNav/MobileNav.tsx +3 -3
- package/src/MoreMenu/MoreMenu.doc.mjs +31 -0
- package/src/MoreMenu/MoreMenu.test.tsx +68 -1
- package/src/MoreMenu/MoreMenu.tsx +19 -0
- package/src/MultiSelector/MultiSelector.doc.mjs +18 -1
- package/src/MultiSelector/MultiSelector.test.tsx +387 -18
- package/src/MultiSelector/MultiSelector.tsx +267 -220
- package/src/NumberInput/NumberInput.doc.mjs +265 -50
- package/src/NumberInput/NumberInput.test.tsx +726 -21
- package/src/NumberInput/NumberInput.tsx +353 -59
- package/src/Outline/Outline.tsx +2 -5
- package/src/Pagination/Pagination.doc.mjs +1 -1
- package/src/Pagination/Pagination.test.tsx +22 -7
- package/src/Pagination/Pagination.tsx +38 -35
- package/src/Popover/Popover.doc.mjs +2 -0
- package/src/Popover/Popover.tsx +6 -7
- package/src/Popover/usePopover.tsx +37 -4
- package/src/PowerSearch/PowerSearch.tsx +1 -1
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +42 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +7 -0
- package/src/ProgressBar/ProgressBar.doc.mjs +27 -5
- package/src/ProgressBar/ProgressBar.test.tsx +224 -1
- package/src/ProgressBar/ProgressBar.tsx +126 -30
- package/src/RadioList/RadioList.doc.mjs +4 -2
- package/src/RadioList/RadioListItem.tsx +31 -130
- package/src/Resizable/ResizeHandle.tsx +2 -9
- package/src/Section/Section.tsx +0 -2
- package/src/Section/index.ts +0 -2
- package/src/SegmentedControl/SegmentedControlItem.tsx +2 -9
- package/src/SelectableCard/SelectableCard.tsx +4 -9
- package/src/Selector/Selector.doc.mjs +17 -4
- package/src/Selector/Selector.test.tsx +1394 -100
- package/src/Selector/Selector.tsx +355 -212
- package/src/Selector/hooks.ts +77 -50
- package/src/SideNav/SideNav.test.tsx +46 -0
- package/src/SideNav/SideNav.tsx +1 -0
- package/src/SideNav/SideNavCollapseButton.tsx +15 -10
- package/src/SideNav/SideNavHeading.tsx +48 -10
- package/src/SideNav/SideNavItem.tsx +20 -12
- package/src/Skeleton/Skeleton.tsx +0 -2
- package/src/Skeleton/index.ts +0 -2
- package/src/Slider/Slider.tsx +2 -11
- package/src/Stack/Stack.doc.mjs +110 -0
- package/src/StatusDot/StatusDot.doc.mjs +12 -3
- package/src/Switch/Switch.test.tsx +32 -0
- package/src/Switch/Switch.tsx +18 -10
- package/src/TabList/Tab.tsx +2 -9
- package/src/TabList/TabMenu.tsx +14 -21
- package/src/Table/BaseTable.tsx +11 -0
- package/src/Table/Table.test.tsx +31 -0
- package/src/Table/TableRow.tsx +6 -0
- package/src/Table/index.ts +1 -4
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +30 -14
- package/src/Table/plugins/rowExpansion/index.ts +1 -4
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +125 -175
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +115 -458
- package/src/Table/plugins/sortable/useTableSortable.tsx +2 -6
- package/src/Table/plugins/tree/useTableTreeData.tsx +43 -24
- package/src/Table/tableContextMenu.test.tsx +27 -0
- package/src/Table/tableContextMenu.tsx +1 -0
- package/src/Table/types.ts +11 -0
- package/src/Table/useTableGroupedRows.doc.mjs +1 -1
- package/src/Table/useTableRowExpansion.doc.mjs +43 -66
- package/src/TextArea/TextArea.doc.mjs +42 -2
- package/src/TextArea/TextArea.test.tsx +219 -0
- package/src/TextArea/TextArea.tsx +34 -7
- package/src/TextInput/TextInput.doc.mjs +18 -2
- package/src/TextInput/TextInput.test.tsx +189 -0
- package/src/TextInput/TextInput.tsx +25 -31
- package/src/Thumbnail/Thumbnail.tsx +2 -9
- package/src/TimeInput/TimeInput.doc.mjs +2 -2
- package/src/TimeInput/TimeInput.test.tsx +84 -3
- package/src/TimeInput/TimeInput.tsx +26 -28
- package/src/Timestamp/Timestamp.doc.mjs +4 -3
- package/src/Timestamp/Timestamp.test.tsx +91 -14
- package/src/Timestamp/Timestamp.tsx +14 -2
- package/src/Timestamp/TimestampHoverCard.tsx +13 -35
- package/src/Timestamp/formatInstant.ts +16 -1
- package/src/Token/Token.tsx +5 -28
- package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
- package/src/Tokenizer/Tokenizer.test.tsx +45 -3
- package/src/Tokenizer/Tokenizer.tsx +10 -2
- package/src/Tooltip/useTooltip.tsx +2 -23
- package/src/TopNav/TopNav.tsx +1 -3
- package/src/TopNav/TopNavHeading.tsx +42 -13
- package/src/TopNav/TopNavItem.tsx +3 -21
- package/src/TopNav/TopNavMegaMenu.doc.mjs +5 -0
- package/src/TopNav/TopNavMegaMenu.test.tsx +433 -33
- package/src/TopNav/TopNavMegaMenu.tsx +118 -53
- package/src/TopNav/TopNavMegaMenuItem.tsx +2 -9
- package/src/TopNav/TopNavMenu.tsx +34 -37
- package/src/TreeList/TreeList.doc.mjs +5 -0
- package/src/TreeList/TreeList.test.tsx +208 -8
- package/src/TreeList/TreeList.tsx +22 -0
- package/src/TreeList/TreeListBranches.tsx +25 -2
- package/src/TreeList/TreeListItem.tsx +89 -52
- package/src/Typeahead/BaseTypeahead.tsx +19 -6
- package/src/Typeahead/Typeahead.doc.mjs +1 -0
- package/src/Typeahead/Typeahead.test.tsx +76 -3
- package/src/VisuallyHidden/VisuallyHidden.tsx +0 -2
- package/src/VisuallyHidden/index.ts +0 -2
- package/src/hooks/containerReveal.stylex.ts +102 -0
- package/src/hooks/index.ts +4 -0
- package/src/hooks/useClipboard.doc.mjs +87 -0
- package/src/hooks/useClipboard.test.tsx +151 -0
- package/src/hooks/useClipboard.ts +135 -0
- package/src/hooks/useContainerReveal.doc.mjs +7 -7
- package/src/hooks/useContainerReveal.test.tsx +42 -62
- package/src/hooks/useContainerReveal.ts +36 -91
- package/src/hooks/useImageMode.test.ts +1 -1
- package/src/hooks/useIndicatorFocusRing.tsx +120 -0
- package/src/hooks/useInputStatusIcon.tsx +8 -8
- package/src/hooks/useLongPress.test.tsx +18 -0
- package/src/hooks/useLongPress.ts +12 -2
- package/src/hooks/useScrollLock.test.ts +72 -0
- package/src/hooks/useScrollLock.ts +51 -19
- package/src/hooks/useStreamingText.test.ts +46 -1
- package/src/hooks/useStreamingText.ts +49 -7
- package/src/hooks/useTreeFocus.test.tsx +50 -0
- package/src/hooks/useTreeFocus.ts +14 -3
- package/src/hooks/useTypeahead.test.tsx +150 -0
- package/src/hooks/useTypeahead.ts +24 -9
- package/src/i18n/InternationalizationProvider.doc.mjs +7 -2
- package/src/index.ts +1 -0
- package/src/serverSafeComponents.test.ts +665 -0
- package/src/theme/defineTheme.ts +27 -0
- package/src/theme/derivedVarRegistry.test.ts +21 -1
- package/src/theme/derivedVarRegistry.ts +19 -6
- package/src/theme/expandColorScale.test.ts +14 -0
- package/src/theme/expandColorScale.ts +24 -9
- package/src/theme/expandTypeScale.test.ts +43 -0
- package/src/theme/expandTypeScale.ts +17 -0
- package/src/theme/generateThemeRules.test.ts +78 -20
- package/src/theme/generateThemeRules.ts +11 -0
- package/src/theme/index.ts +15 -0
- package/src/theme/tokens.stylex.ts +18 -0
- package/src/theme/tokens.test.ts +37 -0
- package/src/utils/focusOutline.stylex.ts +177 -0
- package/src/utils/focusReturn.test.ts +42 -0
- package/src/utils/focusReturn.ts +31 -0
- package/src/utils/index.ts +5 -0
- package/src/utils/interactionModality.ts +74 -0
- package/src/utils/mergeRefs.test.ts +48 -0
- package/src/utils/mergeRefs.ts +12 -6
- package/src/utils/rtlStyles.ts +2 -2
- package/src/utils/themeProps.ts +26 -4
- package/dist/CheckboxInput/checkbox.markers.stylex.d.ts +0 -9
- package/dist/CheckboxInput/checkbox.markers.stylex.d.ts.map +0 -1
- package/dist/CheckboxInput/checkbox.markers.stylex.js +0 -14
- package/dist/RadioList/radio.markers.stylex.d.ts +0 -7
- package/dist/RadioList/radio.markers.stylex.d.ts.map +0 -1
- package/dist/RadioList/radio.markers.stylex.js +0 -12
- package/dist/hooks/containerReveal.pool.stylex.d.ts +0 -303
- package/dist/hooks/containerReveal.pool.stylex.d.ts.map +0 -1
- package/dist/hooks/containerReveal.pool.stylex.js +0 -292
- package/src/CheckboxInput/checkbox.markers.stylex.ts +0 -12
- package/src/RadioList/radio.markers.stylex.ts +0 -10
- package/src/hooks/containerReveal.pool.stylex.ts +0 -571
|
@@ -13,8 +13,11 @@ import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
|
|
|
13
13
|
import {render, screen, fireEvent, waitFor} from '@testing-library/react';
|
|
14
14
|
import userEvent from '@testing-library/user-event';
|
|
15
15
|
import {CheckboxInput} from './CheckboxInput';
|
|
16
|
+
import {Theme} from '../theme/Theme';
|
|
17
|
+
import {defineTheme} from '../theme/defineTheme';
|
|
16
18
|
import {getForcedColorsRules} from '../__tests__/forcedColors';
|
|
17
19
|
import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
|
|
20
|
+
import {FOCUS_OUTLINE_PARTS} from '../utils/focusOutline.stylex';
|
|
18
21
|
|
|
19
22
|
afterEach(() => {
|
|
20
23
|
__resetLiveRegionsForTest();
|
|
@@ -542,6 +545,38 @@ describe('CheckboxInput', () => {
|
|
|
542
545
|
expect(data.get('terms')).toBe('on');
|
|
543
546
|
});
|
|
544
547
|
|
|
548
|
+
it('does not block form submission when required and disabled with a disabledMessage', () => {
|
|
549
|
+
const {container} = render(
|
|
550
|
+
<form>
|
|
551
|
+
<CheckboxInput
|
|
552
|
+
label="Terms"
|
|
553
|
+
htmlName="terms"
|
|
554
|
+
value={false}
|
|
555
|
+
onChange={() => {}}
|
|
556
|
+
isRequired
|
|
557
|
+
isDisabled
|
|
558
|
+
disabledMessage="Terms are managed by your administrator"
|
|
559
|
+
/>
|
|
560
|
+
</form>,
|
|
561
|
+
);
|
|
562
|
+
expect(container.querySelector('form')!.checkValidity()).toBe(true);
|
|
563
|
+
});
|
|
564
|
+
|
|
565
|
+
it('still blocks submission when required and unchecked but enabled', () => {
|
|
566
|
+
const {container} = render(
|
|
567
|
+
<form>
|
|
568
|
+
<CheckboxInput
|
|
569
|
+
label="Terms"
|
|
570
|
+
htmlName="terms"
|
|
571
|
+
value={false}
|
|
572
|
+
onChange={() => {}}
|
|
573
|
+
isRequired
|
|
574
|
+
/>
|
|
575
|
+
</form>,
|
|
576
|
+
);
|
|
577
|
+
expect(container.querySelector('form')!.checkValidity()).toBe(false);
|
|
578
|
+
});
|
|
579
|
+
|
|
545
580
|
it('is excluded from form data when disabled, even with a disabledMessage', () => {
|
|
546
581
|
const {container} = render(
|
|
547
582
|
<form>
|
|
@@ -599,3 +634,88 @@ describe('forced colors (WCAG 1.4.11)', () => {
|
|
|
599
634
|
expect(getForcedColorsRules()).toContain('color: canvastext;');
|
|
600
635
|
});
|
|
601
636
|
});
|
|
637
|
+
|
|
638
|
+
// The control's native input is `opacity: 0`, so the visible focus indicator
|
|
639
|
+
// has to land on the indicator beside it — which is themeable, third-party
|
|
640
|
+
// code. If drawing the ring were the indicator's job, a replacement that
|
|
641
|
+
// simply doesn't would ship a control with no visible focus (WCAG 2.4.7), and
|
|
642
|
+
// that is the default: our own sample replacement destructures
|
|
643
|
+
// {state, size, isDisabled} and drops the rest.
|
|
644
|
+
//
|
|
645
|
+
// So the owner paints it, on the indicator's own element, at focus time. The
|
|
646
|
+
// shape is right because `outline` follows that element's border-radius, and
|
|
647
|
+
// no cooperation is required.
|
|
648
|
+
describe('focus ring ownership (WCAG 2.4.7)', () => {
|
|
649
|
+
/** What a theme author plausibly writes: state in, picture out. */
|
|
650
|
+
const BareIndicator = ({state}: {state: string}) => (
|
|
651
|
+
<span aria-hidden="true" data-testid="bare-indicator">
|
|
652
|
+
{state === 'checked' ? 'x' : ''}
|
|
653
|
+
</span>
|
|
654
|
+
);
|
|
655
|
+
|
|
656
|
+
const bareTheme = defineTheme({
|
|
657
|
+
name: 'bare-indicator-theme',
|
|
658
|
+
indicators: {checkbox: BareIndicator},
|
|
659
|
+
});
|
|
660
|
+
|
|
661
|
+
/**
|
|
662
|
+
* The element the ring is painted on: the indicator slot's only child — the
|
|
663
|
+
* indicator's own root, whatever a theme renders there.
|
|
664
|
+
*/
|
|
665
|
+
const indicatorOf = (container: HTMLElement) => {
|
|
666
|
+
const input = container.querySelector('input[type="checkbox"]');
|
|
667
|
+
const slot = input?.nextElementSibling;
|
|
668
|
+
return slot?.firstElementChild as HTMLElement;
|
|
669
|
+
};
|
|
670
|
+
|
|
671
|
+
const focusInput = (container: HTMLElement) => {
|
|
672
|
+
const input = container.querySelector(
|
|
673
|
+
'input[type="checkbox"]',
|
|
674
|
+
) as HTMLInputElement;
|
|
675
|
+
// A keydown first, so jsdom's :focus-visible heuristic sees keyboard
|
|
676
|
+
// modality — the ring is deliberately keyboard-only, and a bare
|
|
677
|
+
// fireEvent.focus() reads as a pointer focus. Same approach as the
|
|
678
|
+
// TreeList focus test.
|
|
679
|
+
fireEvent.keyDown(document.body, {key: 'Tab'});
|
|
680
|
+
input.focus();
|
|
681
|
+
fireEvent.focus(input);
|
|
682
|
+
return input;
|
|
683
|
+
};
|
|
684
|
+
|
|
685
|
+
it('paints the ring on the built-in indicator', () => {
|
|
686
|
+
const {container} = render(
|
|
687
|
+
<CheckboxInput label="Accept" value={false} onChange={() => {}} />,
|
|
688
|
+
);
|
|
689
|
+
focusInput(container);
|
|
690
|
+
expect(indicatorOf(container).style.outlineStyle).toBe(
|
|
691
|
+
FOCUS_OUTLINE_PARTS.outlineStyle,
|
|
692
|
+
);
|
|
693
|
+
});
|
|
694
|
+
|
|
695
|
+
it('paints it on a replacement that forwards nothing', () => {
|
|
696
|
+
const {container} = render(
|
|
697
|
+
<Theme theme={bareTheme}>
|
|
698
|
+
<CheckboxInput label="Accept" value={false} onChange={() => {}} />
|
|
699
|
+
</Theme>,
|
|
700
|
+
);
|
|
701
|
+
|
|
702
|
+
// The replacement really took effect, and really is bare.
|
|
703
|
+
const replaced = screen.getByTestId('bare-indicator');
|
|
704
|
+
expect(replaced.className).toBe('');
|
|
705
|
+
// ...and it still gets a ring, because the owner drew it.
|
|
706
|
+
focusInput(container);
|
|
707
|
+
expect(replaced.style.outlineStyle).toBe(FOCUS_OUTLINE_PARTS.outlineStyle);
|
|
708
|
+
});
|
|
709
|
+
|
|
710
|
+
it('clears the ring on blur', () => {
|
|
711
|
+
const {container} = render(
|
|
712
|
+
<CheckboxInput label="Accept" value={false} onChange={() => {}} />,
|
|
713
|
+
);
|
|
714
|
+
const input = focusInput(container);
|
|
715
|
+
expect(indicatorOf(container).style.outlineStyle).toBe(
|
|
716
|
+
FOCUS_OUTLINE_PARTS.outlineStyle,
|
|
717
|
+
);
|
|
718
|
+
fireEvent.blur(input);
|
|
719
|
+
expect(indicatorOf(container).style.outlineStyle).toBe('');
|
|
720
|
+
});
|
|
721
|
+
});
|
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
useCallback,
|
|
22
22
|
use,
|
|
23
23
|
useOptimistic,
|
|
24
|
+
useRef,
|
|
24
25
|
useTransition,
|
|
25
26
|
type ChangeEvent,
|
|
26
27
|
type FocusEvent,
|
|
@@ -31,12 +32,9 @@ import {
|
|
|
31
32
|
colorVars,
|
|
32
33
|
spacingVars,
|
|
33
34
|
radiusVars,
|
|
34
|
-
durationVars,
|
|
35
|
-
easeVars,
|
|
36
35
|
typographyVars,
|
|
37
36
|
typeScaleVars,
|
|
38
37
|
fontWeightVars,
|
|
39
|
-
borderVars,
|
|
40
38
|
} from '../theme/tokens.stylex';
|
|
41
39
|
import type {BaseProps} from '../BaseProps';
|
|
42
40
|
import type {SizeValue} from '../utils/types';
|
|
@@ -47,7 +45,9 @@ import type {InputStatus} from '../Field/types';
|
|
|
47
45
|
import {Spinner} from '../Spinner';
|
|
48
46
|
import {useTooltip} from '../Tooltip';
|
|
49
47
|
import {mergeProps, mergeRefs} from '../utils';
|
|
50
|
-
import {
|
|
48
|
+
import {indicatorScope} from '../Indicator/indicator.markers.stylex';
|
|
49
|
+
import {useIndicatorFocusRing} from '../hooks/useIndicatorFocusRing';
|
|
50
|
+
import {useIndicator} from '../Indicator';
|
|
51
51
|
import {themeProps} from '../utils/themeProps';
|
|
52
52
|
import {CheckboxListContext} from '../CheckboxList/CheckboxListContext';
|
|
53
53
|
|
|
@@ -68,6 +68,12 @@ const styles = stylex.create({
|
|
|
68
68
|
flexShrink: 0,
|
|
69
69
|
isolation: 'isolate',
|
|
70
70
|
},
|
|
71
|
+
// Holds only the indicator, so the focus ring has one unambiguous target.
|
|
72
|
+
// `display: contents` adds no box of its own — the indicator keeps whatever
|
|
73
|
+
// layout relationship it already had with the wrapper.
|
|
74
|
+
indicatorSlot: {
|
|
75
|
+
display: 'contents',
|
|
76
|
+
},
|
|
71
77
|
input: {
|
|
72
78
|
position: 'absolute',
|
|
73
79
|
margin: 0,
|
|
@@ -79,113 +85,6 @@ const styles = stylex.create({
|
|
|
79
85
|
inputDisabled: {
|
|
80
86
|
cursor: 'not-allowed',
|
|
81
87
|
},
|
|
82
|
-
checkbox: {
|
|
83
|
-
display: 'flex',
|
|
84
|
-
alignItems: 'center',
|
|
85
|
-
justifyContent: 'center',
|
|
86
|
-
borderWidth: borderVars['--border-width'],
|
|
87
|
-
borderStyle: 'solid',
|
|
88
|
-
borderRadius: radiusVars['--radius-inner'],
|
|
89
|
-
transitionProperty: 'background-color, border-color',
|
|
90
|
-
transitionDuration: {
|
|
91
|
-
default: durationVars['--duration-fast'],
|
|
92
|
-
'@media (prefers-reduced-motion: reduce)': '0s',
|
|
93
|
-
},
|
|
94
|
-
transitionTimingFunction: easeVars['--ease-standard'],
|
|
95
|
-
},
|
|
96
|
-
checkboxFocus: {
|
|
97
|
-
outline: {
|
|
98
|
-
default: 'none',
|
|
99
|
-
[stylex.when.ancestor(':has(:focus-visible)', checkboxScope)]:
|
|
100
|
-
`2px solid ${colorVars['--color-accent']}`,
|
|
101
|
-
},
|
|
102
|
-
outlineOffset: {
|
|
103
|
-
default: null,
|
|
104
|
-
[stylex.when.ancestor(':has(:focus-visible)', checkboxScope)]: '2px',
|
|
105
|
-
},
|
|
106
|
-
},
|
|
107
|
-
// State-dependent colors with ancestor hover behavior
|
|
108
|
-
checkboxUnchecked: {
|
|
109
|
-
// Foreground for the inherit-shade loading spinner (reads currentColor):
|
|
110
|
-
// brand accent on the light surface fill.
|
|
111
|
-
color: colorVars['--color-accent'],
|
|
112
|
-
borderColor: {
|
|
113
|
-
default: colorVars['--color-border-emphasized'],
|
|
114
|
-
[stylex.when.ancestor(':hover', checkboxScope)]: {
|
|
115
|
-
'@media (hover: hover)': `color-mix(in srgb, ${colorVars['--color-border-emphasized']}, ${colorVars['--color-tint-hover']} 20%)`,
|
|
116
|
-
},
|
|
117
|
-
},
|
|
118
|
-
backgroundColor: {
|
|
119
|
-
default: colorVars['--color-background-surface'],
|
|
120
|
-
[stylex.when.ancestor(':hover', checkboxScope)]: {
|
|
121
|
-
'@media (hover: hover)': `color-mix(in srgb, ${colorVars['--color-background-surface']}, ${colorVars['--color-tint-hover']} 5%)`,
|
|
122
|
-
},
|
|
123
|
-
},
|
|
124
|
-
},
|
|
125
|
-
checkboxChecked: {
|
|
126
|
-
// Foreground for the inherit-shade loading spinner (reads currentColor):
|
|
127
|
-
// on-accent color against the accent fill.
|
|
128
|
-
color: colorVars['--color-on-accent'],
|
|
129
|
-
borderColor: {
|
|
130
|
-
default: colorVars['--color-accent'],
|
|
131
|
-
[stylex.when.ancestor(':hover', checkboxScope)]: {
|
|
132
|
-
'@media (hover: hover)': `color-mix(in srgb, ${colorVars['--color-accent']}, ${colorVars['--color-tint-hover']} 15%)`,
|
|
133
|
-
},
|
|
134
|
-
},
|
|
135
|
-
backgroundColor: {
|
|
136
|
-
default: colorVars['--color-accent'],
|
|
137
|
-
[stylex.when.ancestor(':hover', checkboxScope)]: {
|
|
138
|
-
'@media (hover: hover)': `color-mix(in srgb, ${colorVars['--color-accent']}, ${colorVars['--color-tint-hover']} 15%)`,
|
|
139
|
-
},
|
|
140
|
-
},
|
|
141
|
-
},
|
|
142
|
-
checkboxDisabled: {
|
|
143
|
-
opacity: 0.5,
|
|
144
|
-
borderColor: {
|
|
145
|
-
default: colorVars['--color-border'],
|
|
146
|
-
[stylex.when.ancestor(':hover', checkboxScope)]: {
|
|
147
|
-
'@media (hover: hover)': colorVars['--color-border'],
|
|
148
|
-
},
|
|
149
|
-
},
|
|
150
|
-
},
|
|
151
|
-
checkboxDisabledUnchecked: {
|
|
152
|
-
backgroundColor: {
|
|
153
|
-
default: colorVars['--color-background-muted'],
|
|
154
|
-
[stylex.when.ancestor(':hover', checkboxScope)]: {
|
|
155
|
-
'@media (hover: hover)': colorVars['--color-background-muted'],
|
|
156
|
-
},
|
|
157
|
-
},
|
|
158
|
-
},
|
|
159
|
-
checkmark: {
|
|
160
|
-
display: 'none',
|
|
161
|
-
color: {
|
|
162
|
-
default: colorVars['--color-on-accent'],
|
|
163
|
-
// Forced colors (Windows High Contrast) does not reliably force an SVG
|
|
164
|
-
// stroke painted with currentColor, so the check stays the same white as
|
|
165
|
-
// the flattened (Canvas) box fill — a white check on a white box.
|
|
166
|
-
// CanvasText keeps it perceivable on the Canvas box, matching the
|
|
167
|
-
// indeterminate mark (WCAG 1.4.11).
|
|
168
|
-
'@media (forced-colors: active)': 'CanvasText',
|
|
169
|
-
},
|
|
170
|
-
},
|
|
171
|
-
checkmarkVisible: {
|
|
172
|
-
display: 'block',
|
|
173
|
-
},
|
|
174
|
-
indeterminateMark: {
|
|
175
|
-
display: 'none',
|
|
176
|
-
backgroundColor: {
|
|
177
|
-
default: colorVars['--color-on-accent'],
|
|
178
|
-
// Forced colors (Windows High Contrast) strips painted backgrounds,
|
|
179
|
-
// which would make the indeterminate bar invisible; CanvasText keeps it
|
|
180
|
-
// perceivable on the Canvas box fill (WCAG 1.4.11). The checkmark carries
|
|
181
|
-
// the matching CanvasText treatment on its own style.
|
|
182
|
-
'@media (forced-colors: active)': 'CanvasText',
|
|
183
|
-
},
|
|
184
|
-
borderRadius: radiusVars['--radius-full'],
|
|
185
|
-
},
|
|
186
|
-
indeterminateMarkVisible: {
|
|
187
|
-
display: 'block',
|
|
188
|
-
},
|
|
189
88
|
labelWrapper: {
|
|
190
89
|
display: 'flex',
|
|
191
90
|
flexDirection: 'column',
|
|
@@ -211,39 +110,6 @@ const wrapperSizeStyles = stylex.create({
|
|
|
211
110
|
},
|
|
212
111
|
});
|
|
213
112
|
|
|
214
|
-
const checkboxSizeStyles = stylex.create({
|
|
215
|
-
sm: {
|
|
216
|
-
width: 20,
|
|
217
|
-
height: 20,
|
|
218
|
-
},
|
|
219
|
-
md: {
|
|
220
|
-
width: 24,
|
|
221
|
-
height: 24,
|
|
222
|
-
},
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
const checkmarkSizeStyles = stylex.create({
|
|
226
|
-
sm: {
|
|
227
|
-
width: 12,
|
|
228
|
-
height: 12,
|
|
229
|
-
},
|
|
230
|
-
md: {
|
|
231
|
-
width: 14,
|
|
232
|
-
height: 14,
|
|
233
|
-
},
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
const indeterminateSizeStyles = stylex.create({
|
|
237
|
-
sm: {
|
|
238
|
-
width: 10,
|
|
239
|
-
height: 2,
|
|
240
|
-
},
|
|
241
|
-
md: {
|
|
242
|
-
width: 12,
|
|
243
|
-
height: 2,
|
|
244
|
-
},
|
|
245
|
-
});
|
|
246
|
-
|
|
247
113
|
export type CheckboxInputSize = keyof typeof wrapperSizeStyles;
|
|
248
114
|
|
|
249
115
|
export interface CheckboxInputProps extends Omit<BaseProps, 'onChange'> {
|
|
@@ -443,9 +309,17 @@ export function CheckboxInput({
|
|
|
443
309
|
isEnabled: showsDisabledMessage,
|
|
444
310
|
});
|
|
445
311
|
|
|
312
|
+
// The checkbox visual is an indicator: a theme can restyle it through the
|
|
313
|
+
// `checkbox` target or replace the component outright.
|
|
314
|
+
const CheckboxControl = useIndicator('checkbox');
|
|
315
|
+
// The ring is drawn on the indicator itself: the native input is
|
|
316
|
+
// `opacity: 0`, and only the indicator's own element can shape the outline
|
|
317
|
+
// to match it. See useIndicatorFocusRing.
|
|
318
|
+
const indicatorRef = useRef<HTMLSpanElement>(null);
|
|
319
|
+
const {focusProps} = useIndicatorFocusRing(indicatorRef, isDisabled);
|
|
320
|
+
|
|
446
321
|
const isIndeterminate = optimisticValue === 'indeterminate';
|
|
447
322
|
const isChecked = optimisticValue === true;
|
|
448
|
-
const isCheckedOrIndeterminate = isChecked || isIndeterminate;
|
|
449
323
|
|
|
450
324
|
// Sync the native indeterminate DOM property (can't be set via JSX
|
|
451
325
|
// attribute). On a native checkbox this is the authoritative way to expose
|
|
@@ -498,9 +372,13 @@ export function CheckboxInput({
|
|
|
498
372
|
{...stylex.props(
|
|
499
373
|
styles.container,
|
|
500
374
|
isLabelHidden && styles.containerLabelHidden,
|
|
501
|
-
|
|
375
|
+
// Hover and focus reach the checkbox visual through this ancestor
|
|
376
|
+
// marker rather than props, so the whole row drives it.
|
|
377
|
+
!isDisabled && indicatorScope,
|
|
502
378
|
)}>
|
|
503
|
-
<div
|
|
379
|
+
<div
|
|
380
|
+
{...stylex.props(styles.checkboxWrapper, wrapperSizeStyles[size])}
|
|
381
|
+
{...focusProps}>
|
|
504
382
|
<input
|
|
505
383
|
{...rest}
|
|
506
384
|
ref={mergeRefs(
|
|
@@ -520,6 +398,7 @@ export function CheckboxInput({
|
|
|
520
398
|
// still blocked by the isDisabled guard in onChange below.
|
|
521
399
|
disabled={isDisabled && !isFocusableDisabled}
|
|
522
400
|
aria-disabled={isFocusableDisabled ? 'true' : undefined}
|
|
401
|
+
form={isFocusableDisabled ? '' : undefined}
|
|
523
402
|
readOnly={isReadOnly}
|
|
524
403
|
required={isRequired}
|
|
525
404
|
onChange={e => {
|
|
@@ -547,61 +426,25 @@ export function CheckboxInput({
|
|
|
547
426
|
isDisabled && styles.inputDisabled,
|
|
548
427
|
)}
|
|
549
428
|
/>
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
isDisabled && styles.checkboxDisabled,
|
|
570
|
-
isDisabled &&
|
|
571
|
-
!isCheckedOrIndeterminate &&
|
|
572
|
-
styles.checkboxDisabledUnchecked,
|
|
573
|
-
),
|
|
574
|
-
)}>
|
|
575
|
-
{isBusy ? (
|
|
576
|
-
<Spinner size="sm" shade="inherit" />
|
|
577
|
-
) : (
|
|
578
|
-
<>
|
|
579
|
-
<svg
|
|
580
|
-
viewBox="0 0 10 10"
|
|
581
|
-
{...stylex.props(
|
|
582
|
-
styles.checkmark,
|
|
583
|
-
checkmarkSizeStyles[size],
|
|
584
|
-
isChecked && styles.checkmarkVisible,
|
|
585
|
-
)}>
|
|
586
|
-
<path
|
|
587
|
-
d="M8.5 2.5L4 7.5L1.5 5"
|
|
588
|
-
stroke="currentColor"
|
|
589
|
-
strokeWidth="1.5"
|
|
590
|
-
fill="none"
|
|
591
|
-
strokeLinecap="round"
|
|
592
|
-
strokeLinejoin="round"
|
|
593
|
-
/>
|
|
594
|
-
</svg>
|
|
595
|
-
<div
|
|
596
|
-
{...stylex.props(
|
|
597
|
-
styles.indeterminateMark,
|
|
598
|
-
indeterminateSizeStyles[size],
|
|
599
|
-
isIndeterminate && styles.indeterminateMarkVisible,
|
|
600
|
-
)}
|
|
601
|
-
/>
|
|
602
|
-
</>
|
|
603
|
-
)}
|
|
604
|
-
</div>
|
|
429
|
+
{/*
|
|
430
|
+
* A container holding ONLY the indicator, so the focus ring has an
|
|
431
|
+
* unambiguous target whatever a theme renders. `display: contents`
|
|
432
|
+
* keeps it out of layout entirely.
|
|
433
|
+
*/}
|
|
434
|
+
<span ref={indicatorRef} {...stylex.props(styles.indicatorSlot)}>
|
|
435
|
+
<CheckboxControl
|
|
436
|
+
state={
|
|
437
|
+
isIndeterminate
|
|
438
|
+
? 'indeterminate'
|
|
439
|
+
: isChecked
|
|
440
|
+
? 'checked'
|
|
441
|
+
: 'unchecked'
|
|
442
|
+
}
|
|
443
|
+
size={size}
|
|
444
|
+
isDisabled={isDisabled}>
|
|
445
|
+
{isBusy ? <Spinner size="sm" shade="inherit" /> : null}
|
|
446
|
+
</CheckboxControl>
|
|
447
|
+
</span>
|
|
605
448
|
</div>
|
|
606
449
|
<div {...stylex.props(styles.labelWrapper)}>
|
|
607
450
|
<FieldLabel
|
|
@@ -46,6 +46,7 @@ import {useClickableContainer} from '../hooks/useClickableContainer';
|
|
|
46
46
|
import type {BaseProps} from '../BaseProps';
|
|
47
47
|
import {useLinkComponent} from '../Link/useLinkComponent';
|
|
48
48
|
import {themeProps} from '../utils/themeProps';
|
|
49
|
+
import {focusOutlineProps} from '../utils/focusOutline.stylex';
|
|
49
50
|
|
|
50
51
|
// =============================================================================
|
|
51
52
|
// Styles — only the interactive layer, Card handles everything else
|
|
@@ -57,13 +58,6 @@ const styles = stylex.create({
|
|
|
57
58
|
cursor: 'pointer',
|
|
58
59
|
textDecoration: 'none',
|
|
59
60
|
color: 'inherit',
|
|
60
|
-
outlineOffset: '2px',
|
|
61
|
-
},
|
|
62
|
-
focusWithin: {
|
|
63
|
-
':has(:focus-visible)': {
|
|
64
|
-
outline: `2px solid ${colorVars['--color-accent']}`,
|
|
65
|
-
outlineOffset: '2px',
|
|
66
|
-
},
|
|
67
61
|
},
|
|
68
62
|
// Hover overlay — guarded by @media (hover: hover) so touch devices
|
|
69
63
|
// don't show a stuck hover state. Active/pressed state works everywhere.
|
|
@@ -307,14 +301,15 @@ export function ClickableCard({
|
|
|
307
301
|
padding={padding}
|
|
308
302
|
variant={variant}
|
|
309
303
|
elevation={elevation}
|
|
310
|
-
{...mergeProps(
|
|
311
|
-
|
|
304
|
+
{...mergeProps(
|
|
305
|
+
themeProps('clickable-card', {variant}),
|
|
306
|
+
focusOutlineProps.focusWithin(),
|
|
307
|
+
classNameProp,
|
|
312
308
|
style,
|
|
313
|
-
|
|
309
|
+
)}
|
|
314
310
|
xstyle={
|
|
315
311
|
[
|
|
316
312
|
styles.interactive,
|
|
317
|
-
styles.focusWithin,
|
|
318
313
|
hasBorder ? styles.bordered : styles.borderless,
|
|
319
314
|
!isDisabled && styles.overlay,
|
|
320
315
|
!isDisabled && styles.hoverOnPointer,
|
package/src/Code/Code.tsx
CHANGED
|
@@ -142,6 +142,9 @@ export const docs = {
|
|
|
142
142
|
targets: [
|
|
143
143
|
{className: 'astryx-code', visualProps: ['color']},
|
|
144
144
|
{className: 'astryx-codeblock', visualProps: ['size', 'language', 'container']},
|
|
145
|
+
{className: 'astryx-codeblock-header', visualProps: ['size', 'language', 'container']},
|
|
146
|
+
{className: 'astryx-codeblock-title', visualProps: ['size', 'language']},
|
|
147
|
+
{className: 'astryx-codeblock-copy-button'},
|
|
145
148
|
],
|
|
146
149
|
},
|
|
147
150
|
usage: {
|
|
@@ -15,6 +15,13 @@ import {CodeBlock} from './CodeBlock';
|
|
|
15
15
|
import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
|
|
16
16
|
import {dracula} from '../theme/syntax';
|
|
17
17
|
import {InternationalizationProvider} from '../i18n';
|
|
18
|
+
import {defineTheme} from '../theme/defineTheme';
|
|
19
|
+
import {generateThemeCSS} from '../theme/generateThemeRules';
|
|
20
|
+
|
|
21
|
+
function generateThemeTestCSS(theme: Parameters<typeof generateThemeCSS>[0]) {
|
|
22
|
+
const {prose, component} = generateThemeCSS(theme);
|
|
23
|
+
return [prose, component].filter(Boolean).join('\n\n');
|
|
24
|
+
}
|
|
18
25
|
|
|
19
26
|
function politeRegion(): HTMLElement | null {
|
|
20
27
|
return document.querySelector('[data-astryx-live-region="polite"]');
|
|
@@ -64,6 +71,30 @@ describe('CodeBlock', () => {
|
|
|
64
71
|
expect(navigator.clipboard.writeText).toHaveBeenCalledWith('const x = 1;');
|
|
65
72
|
});
|
|
66
73
|
|
|
74
|
+
it('renders the copy button as a themeable target with a "Copy code" tooltip', () => {
|
|
75
|
+
render(<CodeBlock code="const x = 1;" language="javascript" />);
|
|
76
|
+
const copyButton = screen.getByRole('button', {name: 'Copy code'});
|
|
77
|
+
// Theme seam: a design system can restyle the copy control via this class
|
|
78
|
+
// without turning the button off and re-implementing it.
|
|
79
|
+
expect(copyButton).toHaveClass('astryx-codeblock-copy-button');
|
|
80
|
+
// The button carries a visible "Copy code" hover/focus hint (tooltip),
|
|
81
|
+
// wired through aria-describedby — a bare <button> could not.
|
|
82
|
+
expect(copyButton).toHaveAttribute('aria-describedby');
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('keeps the copy button tooltip as "Copy code" after copying', async () => {
|
|
86
|
+
render(<CodeBlock code="const x = 1;" language="javascript" />);
|
|
87
|
+
fireEvent.click(screen.getByRole('button', {name: 'Copy code'}));
|
|
88
|
+
await act(async () => {});
|
|
89
|
+
// The icon flip (copy → check) is the confirmation; the tooltip text does
|
|
90
|
+
// not change. The accessible name still swaps to "Copied" for AT.
|
|
91
|
+
const copyButton = screen.getByRole('button', {name: 'Copied'});
|
|
92
|
+
const tooltipId = copyButton.getAttribute('aria-describedby');
|
|
93
|
+
expect(tooltipId).toBeTruthy();
|
|
94
|
+
const tooltip = document.getElementById(tooltipId as string);
|
|
95
|
+
expect(tooltip).toHaveTextContent('Copy code');
|
|
96
|
+
});
|
|
97
|
+
|
|
67
98
|
it('announces "Copied" to a polite live region after copying', async () => {
|
|
68
99
|
render(<CodeBlock code="const x = 1;" language="javascript" />);
|
|
69
100
|
const copyButton = screen.getByRole('button', {name: 'Copy code'});
|
|
@@ -304,4 +335,64 @@ describe('CodeBlock', () => {
|
|
|
304
335
|
expect(container.querySelector('[data-astryx-syntax-theme]')).toBeNull();
|
|
305
336
|
expect(container.firstElementChild?.tagName).toBe('PRE');
|
|
306
337
|
});
|
|
338
|
+
|
|
339
|
+
describe('header theming targets', () => {
|
|
340
|
+
it('puts astryx-codeblock-header on the header row when a header shows', () => {
|
|
341
|
+
const {container} = render(
|
|
342
|
+
<CodeBlock
|
|
343
|
+
code="const x = 1;"
|
|
344
|
+
language="javascript"
|
|
345
|
+
title="example.js"
|
|
346
|
+
/>,
|
|
347
|
+
);
|
|
348
|
+
expect(
|
|
349
|
+
container.querySelector('.astryx-codeblock-header'),
|
|
350
|
+
).not.toBeNull();
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
it('puts astryx-codeblock-title on the header title element', () => {
|
|
354
|
+
const {container} = render(
|
|
355
|
+
<CodeBlock
|
|
356
|
+
code="const x = 1;"
|
|
357
|
+
language="javascript"
|
|
358
|
+
title="example.js"
|
|
359
|
+
/>,
|
|
360
|
+
);
|
|
361
|
+
const titleEl = container.querySelector('.astryx-codeblock-title');
|
|
362
|
+
expect(titleEl).not.toBeNull();
|
|
363
|
+
// The language label + title text live in this element.
|
|
364
|
+
expect(titleEl).toHaveTextContent('example.js');
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
it('renders no header targets when there is no header', () => {
|
|
368
|
+
// plaintext hides the language label and no title is given, so the
|
|
369
|
+
// header row is not rendered at all.
|
|
370
|
+
const {container} = render(
|
|
371
|
+
<CodeBlock code="const x = 1;" language="plaintext" />,
|
|
372
|
+
);
|
|
373
|
+
expect(container.querySelector('.astryx-codeblock-header')).toBeNull();
|
|
374
|
+
expect(container.querySelector('.astryx-codeblock-title')).toBeNull();
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
it('exposes the header and title as themeable defineTheme targets', () => {
|
|
378
|
+
// jsdom can't resolve the @layer cascade, so this asserts the targets are
|
|
379
|
+
// reachable by a theme via the sanctioned defineTheme channel — replacing
|
|
380
|
+
// the structural `> div:first-child > div > span` header/title selectors a
|
|
381
|
+
// consumer would otherwise need to restyle the header padding and title.
|
|
382
|
+
const theme = defineTheme({
|
|
383
|
+
name: 'codeblock-header-target-test',
|
|
384
|
+
components: {
|
|
385
|
+
'codeblock-header': {
|
|
386
|
+
base: {paddingBlock: 'var(--spacing-1)'},
|
|
387
|
+
},
|
|
388
|
+
'codeblock-title': {
|
|
389
|
+
base: {fontSize: 'var(--text-body-size)'},
|
|
390
|
+
},
|
|
391
|
+
},
|
|
392
|
+
});
|
|
393
|
+
const css = generateThemeTestCSS(theme);
|
|
394
|
+
expect(css).toContain('.astryx-codeblock-header');
|
|
395
|
+
expect(css).toContain('.astryx-codeblock-title');
|
|
396
|
+
});
|
|
397
|
+
});
|
|
307
398
|
});
|