@astryxdesign/core 0.3.0 → 0.4.0-canary.41f53a0
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 +9 -0
- 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/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +15 -14
- 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/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +8 -12
- 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/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/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/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/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +3 -19
- 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 +119 -95
- 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/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 +222 -111
- 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/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/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/astryx.css +84 -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/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 +20 -0
- package/locales/pseudo.json +15 -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 +11 -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 -0
- 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/Banner/Banner.tsx +9 -6
- 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/Carousel/Carousel.doc.mjs +3 -0
- package/src/Carousel/Carousel.tsx +10 -6
- 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/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 +29 -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/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/HoverCard/useHoverCard.tsx +2 -23
- package/src/Icon/Icon.doc.mjs +2 -1
- 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 +16 -1
- package/src/MultiSelector/MultiSelector.test.tsx +259 -16
- package/src/MultiSelector/MultiSelector.tsx +144 -121
- 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/SegmentedControl/SegmentedControlItem.tsx +2 -9
- package/src/SelectableCard/SelectableCard.tsx +4 -9
- package/src/Selector/Selector.doc.mjs +15 -4
- package/src/Selector/Selector.test.tsx +1234 -98
- package/src/Selector/Selector.tsx +254 -126
- 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/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/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.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/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/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/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
package/src/Avatar/Avatar.tsx
CHANGED
|
@@ -31,6 +31,7 @@ import {AvatarSizeContext} from './AvatarSizeContext';
|
|
|
31
31
|
import {useAvatarGroup} from '../AvatarGroup/AvatarGroupContext';
|
|
32
32
|
import {mergeProps, mergeRefs} from '../utils';
|
|
33
33
|
import {themeProps} from '../utils/themeProps';
|
|
34
|
+
import {focusOutlineProps} from '../utils/focusOutline.stylex';
|
|
34
35
|
import {useTooltip} from '../Tooltip/useTooltip';
|
|
35
36
|
import {useLinkComponent} from '../Link/useLinkComponent';
|
|
36
37
|
import type {LinkComponentType} from '../Link/types';
|
|
@@ -112,9 +113,9 @@ const styles = stylex.create({
|
|
|
112
113
|
display: 'inline-flex',
|
|
113
114
|
flexShrink: 0,
|
|
114
115
|
// The wrapper is not clipped (so the status dot can overflow), so it must be
|
|
115
|
-
// rounded itself: a
|
|
116
|
-
//
|
|
117
|
-
//
|
|
116
|
+
// rounded itself: a theme can set a background on the `.astryx-avatar`
|
|
117
|
+
// wrapper, and an unrounded wrapper would show that fill as square corners
|
|
118
|
+
// behind the circular content.
|
|
118
119
|
borderRadius: radiusVars['--radius-full'],
|
|
119
120
|
},
|
|
120
121
|
content: {
|
|
@@ -136,14 +137,15 @@ const styles = stylex.create({
|
|
|
136
137
|
justifyContent: 'center',
|
|
137
138
|
width: '100%',
|
|
138
139
|
height: '100%',
|
|
139
|
-
// Fallback surface (initials + default icon).
|
|
140
|
-
//
|
|
141
|
-
//
|
|
142
|
-
//
|
|
143
|
-
|
|
144
|
-
|
|
140
|
+
// Fallback surface (initials + default icon). Background, text color,
|
|
141
|
+
// weight, and per-size font size are all themed directly via the stable
|
|
142
|
+
// `.astryx-avatar-fallback` class target (font size through its size
|
|
143
|
+
// variant, `.astryx-avatar-fallback.<size>`), so the defaults here are
|
|
144
|
+
// plain values with no internal-var seam. See Avatar.doc.mjs theming.
|
|
145
|
+
backgroundColor: colorVars['--color-neutral'],
|
|
146
|
+
color: colorVars['--color-text-secondary'],
|
|
145
147
|
fontFamily: typographyVars['--font-family-body'],
|
|
146
|
-
fontWeight:
|
|
148
|
+
fontWeight: fontWeightVars['--font-weight-medium'],
|
|
147
149
|
textTransform: 'uppercase',
|
|
148
150
|
},
|
|
149
151
|
status: {
|
|
@@ -152,16 +154,6 @@ const styles = stylex.create({
|
|
|
152
154
|
// Visible focus ring for the name-tooltip tab stop, matching the repo-wide
|
|
153
155
|
// focus-visible outline treatment (see Timestamp, Token, Thumbnail). Only
|
|
154
156
|
// applied when a tooltip is active so keyboard users can reveal it.
|
|
155
|
-
focusable: {
|
|
156
|
-
outline: {
|
|
157
|
-
default: null,
|
|
158
|
-
':focus-visible': `2px solid ${colorVars['--color-accent']}`,
|
|
159
|
-
},
|
|
160
|
-
outlineOffset: {
|
|
161
|
-
default: '0',
|
|
162
|
-
':focus-visible': '2px',
|
|
163
|
-
},
|
|
164
|
-
},
|
|
165
157
|
// Reset the intrinsic styling of the interactive element (<a>/<button>) so it
|
|
166
158
|
// is a transparent, correctly-sized wrapper around the avatar visuals. The
|
|
167
159
|
// element carries the focus-visible accent ring for keyboard users.
|
|
@@ -178,22 +170,6 @@ const styles = stylex.create({
|
|
|
178
170
|
cursor: 'pointer',
|
|
179
171
|
// Match the avatar's circular shape so the focus ring hugs it.
|
|
180
172
|
borderRadius: radiusVars['--radius-full'],
|
|
181
|
-
outlineWidth: {
|
|
182
|
-
default: 0,
|
|
183
|
-
':focus-visible': 2,
|
|
184
|
-
},
|
|
185
|
-
outlineStyle: {
|
|
186
|
-
default: 'none',
|
|
187
|
-
':focus-visible': 'solid',
|
|
188
|
-
},
|
|
189
|
-
outlineColor: {
|
|
190
|
-
default: null,
|
|
191
|
-
':focus-visible': colorVars['--color-accent'],
|
|
192
|
-
},
|
|
193
|
-
outlineOffset: {
|
|
194
|
-
default: 0,
|
|
195
|
-
':focus-visible': 2,
|
|
196
|
-
},
|
|
197
173
|
},
|
|
198
174
|
});
|
|
199
175
|
|
|
@@ -205,13 +181,12 @@ const dynamicStyles = stylex.create({
|
|
|
205
181
|
width: size,
|
|
206
182
|
height: size,
|
|
207
183
|
}),
|
|
208
|
-
// Initials font size defaults to the proportional `size × ratio` scale
|
|
209
|
-
//
|
|
210
|
-
//
|
|
184
|
+
// Initials font size defaults to the proportional `size × ratio` scale. It's
|
|
185
|
+
// a StyleX dynamic style, so the value lands via a class (not an inline
|
|
186
|
+
// property) — a theme's `.astryx-avatar-fallback.<size>` rule in the theme
|
|
187
|
+
// layer overrides it per size tier, no internal var needed.
|
|
211
188
|
fontSize: (size: number) => ({
|
|
212
|
-
fontSize:
|
|
213
|
-
size * INITIALS_FONT_SIZE_RATIO
|
|
214
|
-
}px)`,
|
|
189
|
+
fontSize: `${size * INITIALS_FONT_SIZE_RATIO}px`,
|
|
215
190
|
}),
|
|
216
191
|
statusPosition: (size: number) => ({
|
|
217
192
|
bottom: size * CIRCLE_EDGE_OFFSET_RATIO,
|
|
@@ -337,6 +312,25 @@ export interface AvatarProps extends BaseProps<HTMLDivElement> {
|
|
|
337
312
|
onClick?: React.MouseEventHandler<HTMLElement>;
|
|
338
313
|
}
|
|
339
314
|
|
|
315
|
+
/**
|
|
316
|
+
* Reuse a single segmenter when the runtime supports Intl.Segmenter.
|
|
317
|
+
*/
|
|
318
|
+
const graphemeSegmenter =
|
|
319
|
+
typeof Intl.Segmenter === 'function'
|
|
320
|
+
? new Intl.Segmenter(undefined, {granularity: 'grapheme'})
|
|
321
|
+
: null;
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Return the first user-perceived character, with a code-point fallback.
|
|
325
|
+
*/
|
|
326
|
+
function firstGrapheme(word: string): string {
|
|
327
|
+
if (graphemeSegmenter) {
|
|
328
|
+
return [...graphemeSegmenter.segment(word)][0]?.segment ?? '';
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
return [...word][0] ?? '';
|
|
332
|
+
}
|
|
333
|
+
|
|
340
334
|
/**
|
|
341
335
|
* Generates initials from a name string.
|
|
342
336
|
* Takes the first letter of the first two words.
|
|
@@ -352,9 +346,11 @@ function getInitials(name: string): string {
|
|
|
352
346
|
return '';
|
|
353
347
|
}
|
|
354
348
|
if (words.length === 1) {
|
|
355
|
-
return words[0]
|
|
349
|
+
return firstGrapheme(words[0]).toUpperCase();
|
|
356
350
|
}
|
|
357
|
-
return (
|
|
351
|
+
return (
|
|
352
|
+
firstGrapheme(words[0]) + firstGrapheme(words[words.length - 1])
|
|
353
|
+
).toUpperCase();
|
|
358
354
|
}
|
|
359
355
|
|
|
360
356
|
/**
|
|
@@ -549,15 +545,22 @@ export function Avatar({
|
|
|
549
545
|
)}
|
|
550
546
|
{showInitials && (
|
|
551
547
|
<div
|
|
552
|
-
{...
|
|
553
|
-
|
|
554
|
-
|
|
548
|
+
{...mergeProps(
|
|
549
|
+
themeProps('avatar-fallback', {size: resolvedSize}),
|
|
550
|
+
stylex.props(
|
|
551
|
+
styles.fallback,
|
|
552
|
+
dynamicStyles.fontSize(numericSize),
|
|
553
|
+
),
|
|
555
554
|
)}>
|
|
556
555
|
{getInitials(name)}
|
|
557
556
|
</div>
|
|
558
557
|
)}
|
|
559
558
|
{showIcon && (
|
|
560
|
-
<div
|
|
559
|
+
<div
|
|
560
|
+
{...mergeProps(
|
|
561
|
+
themeProps('avatar-fallback', {size: resolvedSize}),
|
|
562
|
+
stylex.props(styles.fallback),
|
|
563
|
+
)}>
|
|
561
564
|
<DefaultIcon size={numericSize} />
|
|
562
565
|
</div>
|
|
563
566
|
)}
|
|
@@ -580,10 +583,9 @@ export function Avatar({
|
|
|
580
583
|
// `<a>`/`<button>` and the static `<div>` carry the exact same box.
|
|
581
584
|
const rootStylexProps = mergeProps(
|
|
582
585
|
themeProps('avatar', {size: resolvedSize}),
|
|
583
|
-
|
|
586
|
+
focusOutlineProps.focusVisible(
|
|
584
587
|
styles.wrapper,
|
|
585
588
|
isInteractive && styles.interactive,
|
|
586
|
-
!isInteractive && showTooltip && !avatarGroup && styles.focusable,
|
|
587
589
|
avatarGroup && groupStyles.ring,
|
|
588
590
|
avatarGroup && groupStyles.overlap,
|
|
589
591
|
avatarGroup && groupDynamicStyles.overlap(-avatarGroup.overlap),
|
|
@@ -26,6 +26,7 @@ import {mergeProps} from '../utils';
|
|
|
26
26
|
import {useAvatarGroup} from './AvatarGroupContext';
|
|
27
27
|
import type {BaseProps} from '../BaseProps';
|
|
28
28
|
import {themeProps} from '../utils/themeProps';
|
|
29
|
+
import {focusOutlineProps} from '../utils/focusOutline.stylex';
|
|
29
30
|
import {useTranslator} from '../i18n';
|
|
30
31
|
|
|
31
32
|
const BORDER_WIDTH = 2;
|
|
@@ -93,14 +94,6 @@ const styles = stylex.create({
|
|
|
93
94
|
':active': `linear-gradient(${colorVars['--color-overlay-pressed']}, ${colorVars['--color-overlay-pressed']}), linear-gradient(${colorVars['--color-neutral']}, ${colorVars['--color-neutral']})`,
|
|
94
95
|
},
|
|
95
96
|
// Focus ring via focus-visible
|
|
96
|
-
outline: {
|
|
97
|
-
default: 'none',
|
|
98
|
-
':focus-visible': `2px solid ${colorVars['--color-accent']}`,
|
|
99
|
-
},
|
|
100
|
-
outlineOffset: {
|
|
101
|
-
default: null,
|
|
102
|
-
':focus-visible': '2px',
|
|
103
|
-
},
|
|
104
97
|
},
|
|
105
98
|
overlap: {
|
|
106
99
|
marginInlineStart: 'var(--_avatar-group-overlap)',
|
|
@@ -170,7 +163,7 @@ export function AvatarGroupOverflow({
|
|
|
170
163
|
data-avatar-item=""
|
|
171
164
|
{...mergeProps(
|
|
172
165
|
themeProps('avatar-group-overflow'),
|
|
173
|
-
|
|
166
|
+
focusOutlineProps.focusVisible(
|
|
174
167
|
styles.base,
|
|
175
168
|
styles.button,
|
|
176
169
|
styles.overlap,
|
package/src/Banner/Banner.tsx
CHANGED
|
@@ -271,8 +271,9 @@ const styles = stylex.create({
|
|
|
271
271
|
borderEndStartRadius: radiusVars['--radius-container'],
|
|
272
272
|
borderEndEndRadius: radiusVars['--radius-container'],
|
|
273
273
|
},
|
|
274
|
+
// Applied to the chevron <Icon> itself (via `xstyle`) rather than a wrapper,
|
|
275
|
+
// so the element that rotates is the element a theme targets.
|
|
274
276
|
chevron: {
|
|
275
|
-
display: 'inline-flex',
|
|
276
277
|
transitionProperty: 'transform',
|
|
277
278
|
transitionDuration: {
|
|
278
279
|
default: durationVars['--duration-fast'],
|
|
@@ -484,13 +485,15 @@ export function Banner({
|
|
|
484
485
|
: t('@astryx.banner.expand')
|
|
485
486
|
}
|
|
486
487
|
icon={
|
|
487
|
-
<
|
|
488
|
-
|
|
488
|
+
<Icon
|
|
489
|
+
icon="chevronDown"
|
|
490
|
+
size="sm"
|
|
491
|
+
color="inherit"
|
|
492
|
+
xstyle={[
|
|
489
493
|
styles.chevron,
|
|
490
494
|
isExpanded && styles.chevronExpanded,
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
</span>
|
|
495
|
+
]}
|
|
496
|
+
/>
|
|
494
497
|
}
|
|
495
498
|
onClick={handleToggleExpand}
|
|
496
499
|
aria-expanded={isExpanded}
|
|
@@ -45,7 +45,7 @@ import type {LinkComponentType} from '../Link/types';
|
|
|
45
45
|
import {mergeProps, mergeRefs} from '../utils';
|
|
46
46
|
import type {BaseProps} from '../BaseProps';
|
|
47
47
|
import {themeProps} from '../utils/themeProps';
|
|
48
|
-
import {
|
|
48
|
+
import {Icon} from '../Icon';
|
|
49
49
|
import {usePopover} from '../Popover/usePopover';
|
|
50
50
|
import {useListFocus} from '../hooks/useListFocus';
|
|
51
51
|
import {useTypeahead} from '../hooks/useTypeahead';
|
|
@@ -196,6 +196,11 @@ const itemStyles = stylex.create({
|
|
|
196
196
|
display: 'flex',
|
|
197
197
|
alignItems: 'center',
|
|
198
198
|
flexShrink: 0,
|
|
199
|
+
// Sized off supporting text (12px) — exactly Icon's `xsm` box at the
|
|
200
|
+
// default type scale. Width/height stay on the token so the box and the
|
|
201
|
+
// glyph keep matching if a theme retunes the supporting step.
|
|
202
|
+
width: typeScaleVars['--text-supporting-size'],
|
|
203
|
+
height: typeScaleVars['--text-supporting-size'],
|
|
199
204
|
fontSize: typeScaleVars['--text-supporting-size'],
|
|
200
205
|
},
|
|
201
206
|
separator: {
|
|
@@ -507,8 +512,6 @@ function BreadcrumbMenuTrigger({
|
|
|
507
512
|
role: 'none',
|
|
508
513
|
});
|
|
509
514
|
|
|
510
|
-
const chevronDownIcon = useIcon('chevronDown');
|
|
511
|
-
|
|
512
515
|
const closeMenu = useCallback(() => {
|
|
513
516
|
popover.hide();
|
|
514
517
|
}, [popover]);
|
|
@@ -624,9 +627,16 @@ function BreadcrumbMenuTrigger({
|
|
|
624
627
|
isSupporting ? itemStyles.supportingLink : itemStyles.defaultLink,
|
|
625
628
|
)}>
|
|
626
629
|
{children}
|
|
627
|
-
<
|
|
628
|
-
|
|
629
|
-
|
|
630
|
+
<Icon
|
|
631
|
+
icon="chevronDown"
|
|
632
|
+
// 0.75rem — the 12px supporting-text box the bare glyph already
|
|
633
|
+
// rendered at; `itemStyles.chevron` keeps that box on the token.
|
|
634
|
+
size="xsm"
|
|
635
|
+
// The chevron reads as part of the link label, so it takes the
|
|
636
|
+
// trigger's link color rather than an icon color.
|
|
637
|
+
color="inherit"
|
|
638
|
+
xstyle={itemStyles.chevron}
|
|
639
|
+
/>
|
|
630
640
|
</button>
|
|
631
641
|
|
|
632
642
|
{popover.render(
|
package/src/Breadcrumbs/index.ts
CHANGED
|
@@ -37,6 +37,10 @@ export {
|
|
|
37
37
|
DropdownMenuItem as BreadcrumbMenuItem,
|
|
38
38
|
type DropdownMenuItemProps as BreadcrumbMenuItemProps,
|
|
39
39
|
} from '../DropdownMenu/DropdownMenuItem';
|
|
40
|
+
export {
|
|
41
|
+
DropdownMenuDivider as BreadcrumbMenuDivider,
|
|
42
|
+
type DropdownMenuDividerProps as BreadcrumbMenuDividerProps,
|
|
43
|
+
} from '../DropdownMenu/DropdownMenuDivider';
|
|
40
44
|
export {
|
|
41
45
|
DropdownMenuCheckboxItem as BreadcrumbMenuCheckboxItem,
|
|
42
46
|
type DropdownMenuCheckboxItemProps as BreadcrumbMenuCheckboxItemProps,
|
|
@@ -56,6 +60,6 @@ export {
|
|
|
56
60
|
export type {
|
|
57
61
|
DropdownMenuOption as BreadcrumbMenuOption,
|
|
58
62
|
DropdownMenuItemData as BreadcrumbMenuItemData,
|
|
59
|
-
|
|
63
|
+
DropdownMenuDividerData as BreadcrumbMenuDividerData,
|
|
60
64
|
DropdownMenuSection as BreadcrumbMenuSection,
|
|
61
65
|
} from '../DropdownMenu/DropdownMenu';
|
|
@@ -163,7 +163,7 @@ export const docs = {
|
|
|
163
163
|
],
|
|
164
164
|
vars: [
|
|
165
165
|
{name: '--_button-radius', description: 'Border radius', default: 'var(--radius-element)', private: true},
|
|
166
|
-
{name: '--button-focus-offset', description: 'Focus ring outline offset', default: '
|
|
166
|
+
{name: '--button-focus-offset', description: 'Focus ring outline offset', default: 'var(--focus-outline-offset)'},
|
|
167
167
|
{name: '--button-icon-only-aspect', description: 'Aspect ratio for icon-only buttons', default: '1 / 1'},
|
|
168
168
|
],
|
|
169
169
|
derived: [
|
|
@@ -245,7 +245,7 @@ export const docsZh = {
|
|
|
245
245
|
],
|
|
246
246
|
vars: [
|
|
247
247
|
{name: '--_button-radius', description: '圆角半径', default: 'var(--radius-element)', private: true},
|
|
248
|
-
{name: '--button-focus-offset', description: '焦点环轮廓偏移', default: '
|
|
248
|
+
{name: '--button-focus-offset', description: '焦点环轮廓偏移', default: 'var(--focus-outline-offset)'},
|
|
249
249
|
{name: '--button-icon-only-aspect', description: '纯图标按钮的宽高比', default: '1 / 1'},
|
|
250
250
|
],
|
|
251
251
|
derived: [
|
package/src/Button/Button.tsx
CHANGED
|
@@ -34,6 +34,7 @@ import {
|
|
|
34
34
|
fontWeightVars,
|
|
35
35
|
typeScaleVars,
|
|
36
36
|
shadowVars,
|
|
37
|
+
focusVars,
|
|
37
38
|
} from '../theme/tokens.stylex';
|
|
38
39
|
import {Spinner} from '../Spinner';
|
|
39
40
|
import {VisuallyHidden} from '../VisuallyHidden';
|
|
@@ -45,6 +46,7 @@ import {mergeProps, mergeRefs} from '../utils';
|
|
|
45
46
|
import {useLinkComponent} from '../Link/useLinkComponent';
|
|
46
47
|
import type {LinkComponentType} from '../Link/types';
|
|
47
48
|
import {themeProps} from '../utils/themeProps';
|
|
49
|
+
import {focusOutlineProps} from '../utils/focusOutline.stylex';
|
|
48
50
|
import {useTranslator} from '../i18n';
|
|
49
51
|
import type {ButtonVariantMap} from './index';
|
|
50
52
|
|
|
@@ -55,6 +57,15 @@ import type {ButtonVariantMap} from './index';
|
|
|
55
57
|
*/
|
|
56
58
|
const styles = stylex.create({
|
|
57
59
|
base: {
|
|
60
|
+
// Kept as a public themeable var (documented in Button.doc.mjs) even though
|
|
61
|
+
// it now defaults to the shared token: removing it would break any theme
|
|
62
|
+
// setting it, for no gain. It overrides the shared offset, so a theme can
|
|
63
|
+
// still tune the ring distance on buttons specifically.
|
|
64
|
+
'--button-focus-offset': focusVars['--focus-outline-offset'],
|
|
65
|
+
outlineOffset: {
|
|
66
|
+
default: '0',
|
|
67
|
+
':focus-visible': 'var(--button-focus-offset)',
|
|
68
|
+
},
|
|
58
69
|
position: 'relative',
|
|
59
70
|
display: 'inline-flex',
|
|
60
71
|
alignItems: 'center',
|
|
@@ -179,7 +190,7 @@ const elevationStyles = stylex.create({
|
|
|
179
190
|
* Variant styles using backgroundImage for layered colors
|
|
180
191
|
* Pseudo-classes are nested within properties per StyleX recommendation
|
|
181
192
|
* Overlay is stacked on top of base color using multiple linear-gradients
|
|
182
|
-
* Focus outline
|
|
193
|
+
* Focus outline is shared across variants for consistent keyboard affordance.
|
|
183
194
|
*/
|
|
184
195
|
const variants = stylex.create({
|
|
185
196
|
primary: {
|
|
@@ -192,15 +203,6 @@ const variants = stylex.create({
|
|
|
192
203
|
},
|
|
193
204
|
':active': `linear-gradient(${colorVars['--color-overlay-pressed']}, ${colorVars['--color-overlay-pressed']})`,
|
|
194
205
|
},
|
|
195
|
-
outline: {
|
|
196
|
-
default: null,
|
|
197
|
-
':focus-visible': `2px solid ${colorVars['--color-accent']}`,
|
|
198
|
-
},
|
|
199
|
-
'--button-focus-offset': '3px',
|
|
200
|
-
outlineOffset: {
|
|
201
|
-
default: '0',
|
|
202
|
-
':focus-visible': 'var(--button-focus-offset)',
|
|
203
|
-
},
|
|
204
206
|
},
|
|
205
207
|
secondary: {
|
|
206
208
|
backgroundColor: colorVars['--color-neutral'],
|
|
@@ -212,15 +214,6 @@ const variants = stylex.create({
|
|
|
212
214
|
},
|
|
213
215
|
':active': `linear-gradient(${colorVars['--color-overlay-pressed']}, ${colorVars['--color-overlay-pressed']})`,
|
|
214
216
|
},
|
|
215
|
-
outline: {
|
|
216
|
-
default: null,
|
|
217
|
-
':focus-visible': `2px solid ${colorVars['--color-accent']}`,
|
|
218
|
-
},
|
|
219
|
-
'--button-focus-offset': '3px',
|
|
220
|
-
outlineOffset: {
|
|
221
|
-
default: '0',
|
|
222
|
-
':focus-visible': 'var(--button-focus-offset)',
|
|
223
|
-
},
|
|
224
217
|
},
|
|
225
218
|
ghost: {
|
|
226
219
|
backgroundColor: 'transparent',
|
|
@@ -232,19 +225,14 @@ const variants = stylex.create({
|
|
|
232
225
|
},
|
|
233
226
|
':active': `linear-gradient(${colorVars['--color-overlay-pressed']}, ${colorVars['--color-overlay-pressed']})`,
|
|
234
227
|
},
|
|
235
|
-
outline: {
|
|
236
|
-
default: null,
|
|
237
|
-
':focus-visible': `2px solid ${colorVars['--color-accent']}`,
|
|
238
|
-
},
|
|
239
|
-
'--button-focus-offset': '3px',
|
|
240
|
-
outlineOffset: {
|
|
241
|
-
default: '0',
|
|
242
|
-
':focus-visible': 'var(--button-focus-offset)',
|
|
243
|
-
},
|
|
244
228
|
},
|
|
245
229
|
destructive: {
|
|
246
230
|
backgroundColor: colorVars['--color-error'],
|
|
247
231
|
color: colorVars['--color-on-error'],
|
|
232
|
+
// The ring matches the variant it rings: an accent-colored outline on a
|
|
233
|
+
// red button reads as another control's focus. Only the color differs —
|
|
234
|
+
// width, style and offset come from the shared outline.
|
|
235
|
+
outlineColor: {default: null, ':focus-visible': colorVars['--color-error']},
|
|
248
236
|
backgroundImage: {
|
|
249
237
|
default: null,
|
|
250
238
|
':hover': {
|
|
@@ -252,15 +240,6 @@ const variants = stylex.create({
|
|
|
252
240
|
},
|
|
253
241
|
':active': `linear-gradient(${colorVars['--color-overlay-pressed']}, ${colorVars['--color-overlay-pressed']})`,
|
|
254
242
|
},
|
|
255
|
-
outline: {
|
|
256
|
-
default: null,
|
|
257
|
-
':focus-visible': `2px solid ${colorVars['--color-error']}`,
|
|
258
|
-
},
|
|
259
|
-
'--button-focus-offset': '3px',
|
|
260
|
-
outlineOffset: {
|
|
261
|
-
default: '0',
|
|
262
|
-
':focus-visible': 'var(--button-focus-offset)',
|
|
263
|
-
},
|
|
264
243
|
},
|
|
265
244
|
});
|
|
266
245
|
|
|
@@ -676,10 +655,9 @@ export function Button({
|
|
|
676
655
|
const edgeCompAttr = isFlat ? {[EDGE_COMP_ATTR]: ''} : null;
|
|
677
656
|
|
|
678
657
|
// Shared StyleX props for both button and link rendering
|
|
679
|
-
const sharedStylexProps =
|
|
658
|
+
const sharedStylexProps = focusOutlineProps.focusVisible(
|
|
680
659
|
styles.base,
|
|
681
660
|
sizeStyles[size],
|
|
682
|
-
variants[variant],
|
|
683
661
|
isIconOnly && styles.iconOnly,
|
|
684
662
|
buttonDisabled && styles.disabled,
|
|
685
663
|
useAriaDisabled && styles.ariaDisabled,
|
|
@@ -693,11 +671,14 @@ export function Button({
|
|
|
693
671
|
(variant === 'primary' || variant === 'destructive') &&
|
|
694
672
|
(buttonGroup.orientation === 'horizontal'
|
|
695
673
|
? groupStyles.onSolidHorizontal
|
|
696
|
-
: groupStyles.onSolidVertical),
|
|
697
|
-
// Standalone floating buttons only — a grouped button's elevation is owned
|
|
674
|
+
: groupStyles.onSolidVertical), // Standalone floating buttons only — a grouped button's elevation is owned
|
|
698
675
|
// by the ButtonGroup so the shared surface lifts as one unit.
|
|
699
676
|
!buttonGroup && elevationStyles[elevation],
|
|
700
677
|
width != null && dynamicStyles.width(width),
|
|
678
|
+
// AFTER the shared focus outline: the outline supplies width/style/offset
|
|
679
|
+
// for every variant, and `destructive` re-colors just the ring to match
|
|
680
|
+
// its own surface. Ordering is the mechanism — StyleX is last-wins.
|
|
681
|
+
variants[variant],
|
|
701
682
|
xstyle,
|
|
702
683
|
);
|
|
703
684
|
|
|
@@ -58,6 +58,7 @@ import {
|
|
|
58
58
|
DATE_FORMAT_MONTH_YEAR,
|
|
59
59
|
} from '../utils/plainDate';
|
|
60
60
|
import {mergeProps, composeEventHandlers, rtlStyles} from '../utils';
|
|
61
|
+
import {focusOutlineProps} from '../utils/focusOutline.stylex';
|
|
61
62
|
import {
|
|
62
63
|
computeDayCellState,
|
|
63
64
|
computeRangeRounding,
|
|
@@ -1102,7 +1103,7 @@ function DayCell({
|
|
|
1102
1103
|
// the default rendering.
|
|
1103
1104
|
marker: markerState,
|
|
1104
1105
|
}),
|
|
1105
|
-
|
|
1106
|
+
focusOutlineProps.focusVisible(
|
|
1106
1107
|
dayCellStyles.day,
|
|
1107
1108
|
dayCellTheme.day,
|
|
1108
1109
|
isOutside && dayCellStyles.dayOutside,
|
package/src/Calendar/styles.ts
CHANGED
|
@@ -258,14 +258,6 @@ export const dayCellTheme = stylex.create({
|
|
|
258
258
|
'@media (hover: hover)': `linear-gradient(${colorVars['--color-overlay-hover']}, ${colorVars['--color-overlay-hover']})`,
|
|
259
259
|
},
|
|
260
260
|
},
|
|
261
|
-
outline: {
|
|
262
|
-
default: null,
|
|
263
|
-
':focus-visible': `2px solid ${colorVars['--color-accent']}`,
|
|
264
|
-
},
|
|
265
|
-
outlineOffset: {
|
|
266
|
-
default: '0',
|
|
267
|
-
':focus-visible': '2px',
|
|
268
|
-
},
|
|
269
261
|
},
|
|
270
262
|
|
|
271
263
|
// Outside days (adjacent months)
|
|
@@ -66,8 +66,10 @@ export const docsZh = {
|
|
|
66
66
|
'Carousel 在项目超出可用宽度时将一行项目水平滚动。适用于卡片网格、图片画廊、产品列表,或任何希望无需占据整页即可浏览的项目集合。',
|
|
67
67
|
bestPractices: [
|
|
68
68
|
{guidance: true, description: '当每个项目应精确对齐到起始边缘时启用滚动吸附,例如画廊或产品列表。'},
|
|
69
|
+
{guidance: true, description: '在小型可循环的集合(如照片画廊)上使用 hasLoop,此时从最后一项绕回第一项的滚动更自然。'},
|
|
69
70
|
{guidance: true, description: '始终提供描述轮播内容的 aria-label,例如"精选产品"或"团队成员"。'},
|
|
70
71
|
{guidance: true, description: '使用一致的间距和项目宽度,让轮播看起来是有意为之,而不是内容意外溢出。'},
|
|
72
|
+
{guidance: true, description: '信任内置导航:触控板用户可水平滑动,鼠标用户可按住 Shift 滚动滚轮来浏览项目。'},
|
|
71
73
|
{guidance: false, description: '将每位用户都必须看到的内容放入轮播。并非所有人都会水平滚动,关键内容应放在首屏。'},
|
|
72
74
|
{guidance: false, description: '自动轮播项目。让用户按自己的节奏滚动。'},
|
|
73
75
|
{guidance: false, description: '嵌套轮播。轮播中嵌套轮播会造成困惑并破坏键盘导航。'},
|
|
@@ -94,6 +96,7 @@ export const docsDense = {
|
|
|
94
96
|
'Carousel scrolls items horizontally when they overflow. Use for card grids, galleries, product lists.',
|
|
95
97
|
bestPractices: [
|
|
96
98
|
{guidance: true, description: 'Enable scroll-snap when each item should land precisely at the start edge: gallery, product list.'},
|
|
99
|
+
{guidance: true, description: 'Reach for hasLoop on small cyclable sets (photo gallery) where wrapping past the last item back to the first feels natural.'},
|
|
97
100
|
{guidance: true, description: 'Always provide an aria-label describing what the carousel contains: "Featured products", "Team members".'},
|
|
98
101
|
{guidance: true, description: 'Use consistent gap + item width so the carousel looks intentional, not like content overflowing by accident.'},
|
|
99
102
|
{guidance: true, description: 'Trust built-in navigation: trackpad users swipe horizontally, mouse users hold Shift + wheel to move through items.'},
|
|
@@ -560,9 +560,11 @@ export function Carousel({
|
|
|
560
560
|
)}>
|
|
561
561
|
<Button
|
|
562
562
|
icon={
|
|
563
|
-
<
|
|
564
|
-
|
|
565
|
-
|
|
563
|
+
<Icon
|
|
564
|
+
icon="chevronLeft"
|
|
565
|
+
size="xsm"
|
|
566
|
+
xstyle={rtlStyles.mirror}
|
|
567
|
+
/>
|
|
566
568
|
}
|
|
567
569
|
label={t('@astryx.carousel.scrollLeft')}
|
|
568
570
|
variant="ghost"
|
|
@@ -585,9 +587,11 @@ export function Carousel({
|
|
|
585
587
|
)}>
|
|
586
588
|
<Button
|
|
587
589
|
icon={
|
|
588
|
-
<
|
|
589
|
-
|
|
590
|
-
|
|
590
|
+
<Icon
|
|
591
|
+
icon="chevronRight"
|
|
592
|
+
size="xsm"
|
|
593
|
+
xstyle={rtlStyles.mirror}
|
|
594
|
+
/>
|
|
591
595
|
}
|
|
592
596
|
label={t('@astryx.carousel.scrollRight')}
|
|
593
597
|
variant="ghost"
|
package/src/Chat/Chat.doc.mjs
CHANGED
|
@@ -26,6 +26,8 @@ export const docs = {
|
|
|
26
26
|
{className: 'astryx-chat-system-message', visualProps: ['variant']},
|
|
27
27
|
{className: 'astryx-chat-message-metadata'},
|
|
28
28
|
{className: 'astryx-chat-send-button'},
|
|
29
|
+
{className: 'astryx-chat-dictation-button'},
|
|
30
|
+
{className: 'astryx-chat-layout-scroll-button'},
|
|
29
31
|
{className: 'astryx-chat-tokenized-text'},
|
|
30
32
|
{className: 'astryx-chat-tool-calls'},
|
|
31
33
|
{className: 'astryx-trigger-menu'},
|
|
@@ -26,6 +26,7 @@ import {Button} from '../Button';
|
|
|
26
26
|
import {Icon} from '../Icon';
|
|
27
27
|
import {mergeProps} from '../utils';
|
|
28
28
|
import type {BaseProps} from '../BaseProps';
|
|
29
|
+
import {themeProps} from '../utils/themeProps';
|
|
29
30
|
import {useTranslator} from '../i18n';
|
|
30
31
|
|
|
31
32
|
// =============================================================================
|
|
@@ -140,7 +141,12 @@ export function ChatDictationButton({
|
|
|
140
141
|
return (
|
|
141
142
|
<span
|
|
142
143
|
ref={ref}
|
|
143
|
-
{...mergeProps(
|
|
144
|
+
{...mergeProps(
|
|
145
|
+
themeProps('chat-dictation-button'),
|
|
146
|
+
stylex.props(styles.wrapper, xstyle),
|
|
147
|
+
className,
|
|
148
|
+
style,
|
|
149
|
+
)}
|
|
144
150
|
{...rest}>
|
|
145
151
|
{isListening && (
|
|
146
152
|
<span
|
|
@@ -16,6 +16,28 @@ describe('ChatLayoutScrollButton', () => {
|
|
|
16
16
|
expect(screen.getByTestId('scroll')).toBeTruthy();
|
|
17
17
|
});
|
|
18
18
|
|
|
19
|
+
it('renders icon-only (no visible label text) in the default, label-less state', () => {
|
|
20
|
+
render(<ChatLayoutScrollButton isVisible onClick={() => {}} />);
|
|
21
|
+
const button = screen.getByRole('button', {name: 'Scroll to bottom'});
|
|
22
|
+
// The translated name must stay accessible-only. Button renders visible
|
|
23
|
+
// text whenever isIconOnly is false (its default), so a missing
|
|
24
|
+
// isIconOnly here previously rendered the full translation as clipped
|
|
25
|
+
// visible text inside the circular button instead of just the chevron.
|
|
26
|
+
expect(button.textContent).toBe('');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('renders the label as visible text when provided', () => {
|
|
30
|
+
render(
|
|
31
|
+
<ChatLayoutScrollButton
|
|
32
|
+
isVisible
|
|
33
|
+
onClick={() => {}}
|
|
34
|
+
label="New messages"
|
|
35
|
+
/>,
|
|
36
|
+
);
|
|
37
|
+
const button = screen.getByRole('button', {name: 'New messages'});
|
|
38
|
+
expect(button).toHaveTextContent('New messages');
|
|
39
|
+
});
|
|
40
|
+
|
|
19
41
|
it('forwards rest props (data-*, aria-*, id) to the root element', () => {
|
|
20
42
|
render(
|
|
21
43
|
<ChatLayoutScrollButton
|
|
@@ -30,6 +30,7 @@ import {Icon} from '../Icon';
|
|
|
30
30
|
import {Button} from '../Button';
|
|
31
31
|
import type {BaseProps} from '../BaseProps';
|
|
32
32
|
import {mergeProps} from '../utils';
|
|
33
|
+
import {themeProps} from '../utils/themeProps';
|
|
33
34
|
import {useTranslator} from '../i18n';
|
|
34
35
|
|
|
35
36
|
// =============================================================================
|
|
@@ -128,7 +129,12 @@ export function ChatLayoutScrollButton({
|
|
|
128
129
|
return (
|
|
129
130
|
<div
|
|
130
131
|
ref={ref}
|
|
131
|
-
{...mergeProps(
|
|
132
|
+
{...mergeProps(
|
|
133
|
+
themeProps('chat-layout-scroll-button'),
|
|
134
|
+
stylex.props(styles.wrapper, xstyle),
|
|
135
|
+
className,
|
|
136
|
+
style,
|
|
137
|
+
)}
|
|
132
138
|
{...rest}>
|
|
133
139
|
<div
|
|
134
140
|
{...stylex.props(
|
|
@@ -144,6 +150,7 @@ export function ChatLayoutScrollButton({
|
|
|
144
150
|
icon={<Icon icon="chevronDown" size="md" />}
|
|
145
151
|
variant="ghost"
|
|
146
152
|
size="md"
|
|
153
|
+
isIconOnly={!label}
|
|
147
154
|
onClick={onClick}
|
|
148
155
|
xstyle={[styles.button, label ? styles.buttonWithLabel : null]}>
|
|
149
156
|
{label ?? undefined}
|