@astryxdesign/core 0.3.0 → 0.4.0
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 +11 -15
- 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 +35 -33
- 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 +24 -23
- package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +11 -16
- package/dist/DateTimeInput/DateTimeInput.d.ts +9 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +22 -17
- 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 +167 -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 +56 -53
- 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.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +78 -75
- 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/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 +96 -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 +2 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +164 -94
- 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/Stack/stack.stylex.d.ts +3 -3
- package/dist/Switch/Switch.js +11 -10
- 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 +7 -15
- package/dist/Timestamp/TimestampHoverCard.d.ts.map +1 -1
- package/dist/Timestamp/TimestampHoverCard.js +16 -34
- 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 +74 -85
- 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/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 +16 -0
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/defineTheme.js +8 -0
- 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 +1 -0
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/utils/focusOutline.stylex.d.ts +107 -0
- package/dist/utils/focusOutline.stylex.d.ts.map +1 -0
- package/dist/utils/focusOutline.stylex.js +130 -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 +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -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 +12 -0
- package/locales/pseudo.json +9 -0
- package/package.json +7 -2
- 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.tsx +21 -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 +115 -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 +64 -0
- package/src/ComplexSelector/ComplexSelector.tsx +46 -29
- 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 +93 -11
- package/src/DateInput/DateInput.tsx +41 -19
- package/src/DateRangeInput/DateRangeInput.doc.mjs +10 -2
- package/src/DateRangeInput/DateRangeInput.test.tsx +110 -14
- package/src/DateRangeInput/DateRangeInput.tsx +24 -12
- package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -2
- package/src/DateTimeInput/DateTimeInput.test.tsx +75 -0
- package/src/DateTimeInput/DateTimeInput.tsx +35 -8
- 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 +45 -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 +186 -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 +43 -38
- 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 +9 -1
- package/src/MultiSelector/MultiSelector.test.tsx +255 -16
- package/src/MultiSelector/MultiSelector.tsx +103 -99
- 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.tsx +6 -7
- 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 +124 -22
- 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 +7 -4
- package/src/Selector/Selector.test.tsx +935 -25
- package/src/Selector/Selector.tsx +189 -106
- 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/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 +8 -8
- 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 +30 -3
- package/src/TimeInput/TimeInput.tsx +9 -26
- package/src/Timestamp/Timestamp.doc.mjs +4 -3
- package/src/Timestamp/TimestampHoverCard.tsx +13 -35
- 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 +206 -7
- 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/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 +24 -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 +61 -20
- package/src/theme/generateThemeRules.ts +11 -0
- package/src/theme/index.ts +13 -0
- package/src/utils/focusOutline.stylex.ts +163 -0
- package/src/utils/focusReturn.test.ts +42 -0
- package/src/utils/focusReturn.ts +31 -0
- package/src/utils/index.ts +1 -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/Button/Button.tsx
CHANGED
|
@@ -45,6 +45,7 @@ import {mergeProps, mergeRefs} from '../utils';
|
|
|
45
45
|
import {useLinkComponent} from '../Link/useLinkComponent';
|
|
46
46
|
import type {LinkComponentType} from '../Link/types';
|
|
47
47
|
import {themeProps} from '../utils/themeProps';
|
|
48
|
+
import {focusOutlineProps} from '../utils/focusOutline.stylex';
|
|
48
49
|
import {useTranslator} from '../i18n';
|
|
49
50
|
import type {ButtonVariantMap} from './index';
|
|
50
51
|
|
|
@@ -55,6 +56,15 @@ import type {ButtonVariantMap} from './index';
|
|
|
55
56
|
*/
|
|
56
57
|
const styles = stylex.create({
|
|
57
58
|
base: {
|
|
59
|
+
// Kept as a public themeable var (documented in Button.doc.mjs) even though
|
|
60
|
+
// its default now matches the shared outline: removing it would break any
|
|
61
|
+
// theme setting it, for no gain. It overrides the shared offset, so a theme
|
|
62
|
+
// can still tune the ring distance on buttons specifically.
|
|
63
|
+
'--button-focus-offset': '3px',
|
|
64
|
+
outlineOffset: {
|
|
65
|
+
default: '0',
|
|
66
|
+
':focus-visible': 'var(--button-focus-offset)',
|
|
67
|
+
},
|
|
58
68
|
position: 'relative',
|
|
59
69
|
display: 'inline-flex',
|
|
60
70
|
alignItems: 'center',
|
|
@@ -179,7 +189,7 @@ const elevationStyles = stylex.create({
|
|
|
179
189
|
* Variant styles using backgroundImage for layered colors
|
|
180
190
|
* Pseudo-classes are nested within properties per StyleX recommendation
|
|
181
191
|
* Overlay is stacked on top of base color using multiple linear-gradients
|
|
182
|
-
* Focus outline
|
|
192
|
+
* Focus outline is shared across variants for consistent keyboard affordance.
|
|
183
193
|
*/
|
|
184
194
|
const variants = stylex.create({
|
|
185
195
|
primary: {
|
|
@@ -192,15 +202,6 @@ const variants = stylex.create({
|
|
|
192
202
|
},
|
|
193
203
|
':active': `linear-gradient(${colorVars['--color-overlay-pressed']}, ${colorVars['--color-overlay-pressed']})`,
|
|
194
204
|
},
|
|
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
205
|
},
|
|
205
206
|
secondary: {
|
|
206
207
|
backgroundColor: colorVars['--color-neutral'],
|
|
@@ -212,15 +213,6 @@ const variants = stylex.create({
|
|
|
212
213
|
},
|
|
213
214
|
':active': `linear-gradient(${colorVars['--color-overlay-pressed']}, ${colorVars['--color-overlay-pressed']})`,
|
|
214
215
|
},
|
|
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
216
|
},
|
|
225
217
|
ghost: {
|
|
226
218
|
backgroundColor: 'transparent',
|
|
@@ -232,19 +224,14 @@ const variants = stylex.create({
|
|
|
232
224
|
},
|
|
233
225
|
':active': `linear-gradient(${colorVars['--color-overlay-pressed']}, ${colorVars['--color-overlay-pressed']})`,
|
|
234
226
|
},
|
|
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
227
|
},
|
|
245
228
|
destructive: {
|
|
246
229
|
backgroundColor: colorVars['--color-error'],
|
|
247
230
|
color: colorVars['--color-on-error'],
|
|
231
|
+
// The ring matches the variant it rings: an accent-colored outline on a
|
|
232
|
+
// red button reads as another control's focus. Only the color differs —
|
|
233
|
+
// width, style and offset come from the shared outline.
|
|
234
|
+
outlineColor: {default: null, ':focus-visible': colorVars['--color-error']},
|
|
248
235
|
backgroundImage: {
|
|
249
236
|
default: null,
|
|
250
237
|
':hover': {
|
|
@@ -252,15 +239,6 @@ const variants = stylex.create({
|
|
|
252
239
|
},
|
|
253
240
|
':active': `linear-gradient(${colorVars['--color-overlay-pressed']}, ${colorVars['--color-overlay-pressed']})`,
|
|
254
241
|
},
|
|
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
242
|
},
|
|
265
243
|
});
|
|
266
244
|
|
|
@@ -676,10 +654,9 @@ export function Button({
|
|
|
676
654
|
const edgeCompAttr = isFlat ? {[EDGE_COMP_ATTR]: ''} : null;
|
|
677
655
|
|
|
678
656
|
// Shared StyleX props for both button and link rendering
|
|
679
|
-
const sharedStylexProps =
|
|
657
|
+
const sharedStylexProps = focusOutlineProps.focusVisible(
|
|
680
658
|
styles.base,
|
|
681
659
|
sizeStyles[size],
|
|
682
|
-
variants[variant],
|
|
683
660
|
isIconOnly && styles.iconOnly,
|
|
684
661
|
buttonDisabled && styles.disabled,
|
|
685
662
|
useAriaDisabled && styles.ariaDisabled,
|
|
@@ -693,11 +670,14 @@ export function Button({
|
|
|
693
670
|
(variant === 'primary' || variant === 'destructive') &&
|
|
694
671
|
(buttonGroup.orientation === 'horizontal'
|
|
695
672
|
? groupStyles.onSolidHorizontal
|
|
696
|
-
: groupStyles.onSolidVertical),
|
|
697
|
-
// Standalone floating buttons only — a grouped button's elevation is owned
|
|
673
|
+
: groupStyles.onSolidVertical), // Standalone floating buttons only — a grouped button's elevation is owned
|
|
698
674
|
// by the ButtonGroup so the shared surface lifts as one unit.
|
|
699
675
|
!buttonGroup && elevationStyles[elevation],
|
|
700
676
|
width != null && dynamicStyles.width(width),
|
|
677
|
+
// AFTER the shared focus outline: the outline supplies width/style/offset
|
|
678
|
+
// for every variant, and `destructive` re-colors just the ring to match
|
|
679
|
+
// its own surface. Ordering is the mechanism — StyleX is last-wins.
|
|
680
|
+
variants[variant],
|
|
701
681
|
xstyle,
|
|
702
682
|
);
|
|
703
683
|
|
|
@@ -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}
|
|
@@ -24,6 +24,7 @@ import {useIcon} from '../Icon';
|
|
|
24
24
|
import {useChatComposerContext} from './ChatContext';
|
|
25
25
|
|
|
26
26
|
import type {BaseProps} from '../BaseProps';
|
|
27
|
+
import {mergeProps} from '../utils';
|
|
27
28
|
import {themeProps} from '../utils/themeProps';
|
|
28
29
|
import {useTranslator} from '../i18n';
|
|
29
30
|
|
|
@@ -117,9 +118,7 @@ export function ChatSendButton(props: ChatSendButtonProps): ReactNode {
|
|
|
117
118
|
isDisabled={!isStopShown && isDisabled}
|
|
118
119
|
onClick={isStopShown ? onStop : handleSend}
|
|
119
120
|
{...rest}
|
|
120
|
-
{...themeProps('chat-send-button')}
|
|
121
|
-
className={className}
|
|
122
|
-
style={style}
|
|
121
|
+
{...mergeProps(themeProps('chat-send-button'), {className}, style)}
|
|
123
122
|
xstyle={[styles.root, xstyle]}
|
|
124
123
|
/>
|
|
125
124
|
);
|
|
@@ -216,4 +216,39 @@ describe('ChatToolCalls', () => {
|
|
|
216
216
|
expect(region).toHaveTextContent('searchCode');
|
|
217
217
|
expect(region).toHaveTextContent('readFile');
|
|
218
218
|
});
|
|
219
|
+
|
|
220
|
+
it('compensates the grouped rows overhang on the clip boundary so the hover background is not cut off', () => {
|
|
221
|
+
render(
|
|
222
|
+
<ChatToolCalls
|
|
223
|
+
defaultIsExpanded={true}
|
|
224
|
+
calls={[
|
|
225
|
+
{name: 'bash', status: 'complete'},
|
|
226
|
+
{name: 'read', status: 'complete'},
|
|
227
|
+
]}
|
|
228
|
+
/>,
|
|
229
|
+
);
|
|
230
|
+
const regionId = screen.getByRole('button').getAttribute('aria-controls');
|
|
231
|
+
const groupContent = document.getElementById(regionId as string);
|
|
232
|
+
// groupContentInner is the overflow:hidden clip boundary required for the
|
|
233
|
+
// grid height animation; its direct child (`list`) pulls itself outward
|
|
234
|
+
// by a negative inline margin so each row's hover background can overhang
|
|
235
|
+
// the text column without widening the layout. Without a matching
|
|
236
|
+
// padding/negative-margin pair on groupContentInner itself, that overhang
|
|
237
|
+
// extends past the clip boundary and gets cut off (#4830) instead of
|
|
238
|
+
// being absorbed the same way it is for a single, unwrapped call row.
|
|
239
|
+
const groupContentInner = groupContent!.firstElementChild as HTMLElement;
|
|
240
|
+
const list = groupContentInner.firstElementChild as HTMLElement;
|
|
241
|
+
// jsdom's getComputedStyle doesn't resolve StyleX's generated atomic
|
|
242
|
+
// classes here, so assert on the classes directly instead. StyleX emits
|
|
243
|
+
// one atomic class per distinct property+value pair, so identical
|
|
244
|
+
// paddingInline/marginInline values on two elements always produce the
|
|
245
|
+
// exact same class names — if groupContentInner mirrors list's
|
|
246
|
+
// padding/margin pair, their class lists intersect on (at least) those
|
|
247
|
+
// two classes; if the fix is missing, groupContentInner only has its own
|
|
248
|
+
// unrelated overflow/minHeight classes and shares nothing with list.
|
|
249
|
+
const innerClasses = new Set(groupContentInner.className.split(' '));
|
|
250
|
+
const listClasses = new Set(list.className.split(' '));
|
|
251
|
+
const shared = [...listClasses].filter(c => innerClasses.has(c));
|
|
252
|
+
expect(shared.length).toBeGreaterThanOrEqual(2);
|
|
253
|
+
});
|
|
219
254
|
});
|
|
@@ -134,6 +134,10 @@ const styles = stylex.create({
|
|
|
134
134
|
width: '14px',
|
|
135
135
|
height: '14px',
|
|
136
136
|
color: colorVars['--color-text-disabled'],
|
|
137
|
+
},
|
|
138
|
+
// Rides on the chevron <Icon> (via `xstyle`), next to the rotation it
|
|
139
|
+
// animates, so one element carries both the transform and the theme target.
|
|
140
|
+
chevronTransition: {
|
|
137
141
|
transition: {
|
|
138
142
|
default: `transform ${durationVars['--duration-fast']} ${easeVars['--ease-standard']}`,
|
|
139
143
|
'@media (prefers-reduced-motion: reduce)': 'none',
|
|
@@ -156,6 +160,18 @@ const styles = stylex.create({
|
|
|
156
160
|
groupContentInner: {
|
|
157
161
|
overflow: 'hidden',
|
|
158
162
|
minHeight: 0,
|
|
163
|
+
// `list` (and, within it, each `callRowClickable` row) overhangs its own
|
|
164
|
+
// content box by `--spacing-1` on each inline edge via a negative margin,
|
|
165
|
+
// so its hover background can extend past the text column without
|
|
166
|
+
// widening the layout — `list`'s own matching paddingInline absorbs the
|
|
167
|
+
// row-level overhang, but `list`'s negative margin then overhangs *this*
|
|
168
|
+
// element's box by the same amount, and this is the clip boundary the
|
|
169
|
+
// grid height animation needs `overflow: hidden` for. Mirror the same
|
|
170
|
+
// padding/negative-margin pair here so that overhang is absorbed too,
|
|
171
|
+
// instead of clipped — matching the ungrouped single-call row, which has
|
|
172
|
+
// no such wrapper to clip it.
|
|
173
|
+
paddingInline: spacingVars['--spacing-1'],
|
|
174
|
+
marginInline: `calc(-1 * ${spacingVars['--spacing-1']})`,
|
|
159
175
|
},
|
|
160
176
|
list: {
|
|
161
177
|
display: 'flex',
|
|
@@ -273,10 +289,6 @@ const styles = stylex.create({
|
|
|
273
289
|
width: '14px',
|
|
274
290
|
height: '14px',
|
|
275
291
|
color: colorVars['--color-text-disabled'],
|
|
276
|
-
transition: {
|
|
277
|
-
default: `transform ${durationVars['--duration-fast']} ${easeVars['--ease-standard']}`,
|
|
278
|
-
'@media (prefers-reduced-motion: reduce)': 'none',
|
|
279
|
-
},
|
|
280
292
|
marginInlineStart: 'auto',
|
|
281
293
|
},
|
|
282
294
|
callDetailContent: {
|
|
@@ -451,12 +463,16 @@ function CallRow({call}: {call: ChatToolCallItem}) {
|
|
|
451
463
|
<span {...stylex.props(styles.callDuration)}>{call.duration}</span>
|
|
452
464
|
)}
|
|
453
465
|
{hasDetail && (
|
|
454
|
-
<span
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
466
|
+
<span {...stylex.props(styles.callDetailChevron)}>
|
|
467
|
+
<Icon
|
|
468
|
+
icon="chevronDown"
|
|
469
|
+
size="xsm"
|
|
470
|
+
color="inherit"
|
|
471
|
+
xstyle={[
|
|
472
|
+
styles.chevronTransition,
|
|
473
|
+
isDetailOpen && styles.chevronExpanded,
|
|
474
|
+
]}
|
|
475
|
+
/>
|
|
460
476
|
</span>
|
|
461
477
|
)}
|
|
462
478
|
</div>
|
|
@@ -627,12 +643,16 @@ export function ChatToolCalls(props: ChatToolCallsProps) {
|
|
|
627
643
|
</>
|
|
628
644
|
)}
|
|
629
645
|
</span>
|
|
630
|
-
<span
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
646
|
+
<span {...stylex.props(styles.chevron)}>
|
|
647
|
+
<Icon
|
|
648
|
+
icon="chevronDown"
|
|
649
|
+
size="xsm"
|
|
650
|
+
color="inherit"
|
|
651
|
+
xstyle={[
|
|
652
|
+
styles.chevronTransition,
|
|
653
|
+
isExpanded && styles.chevronExpanded,
|
|
654
|
+
]}
|
|
655
|
+
/>
|
|
636
656
|
</span>
|
|
637
657
|
</div>
|
|
638
658
|
|
|
@@ -110,10 +110,6 @@ const styles = stylex.create({
|
|
|
110
110
|
popoverSurface: {
|
|
111
111
|
minWidth: '180px',
|
|
112
112
|
},
|
|
113
|
-
popoverGap: {
|
|
114
|
-
marginBlockStart: spacingVars['--spacing-1'],
|
|
115
|
-
marginBlockEnd: spacingVars['--spacing-1'],
|
|
116
|
-
},
|
|
117
113
|
item: {
|
|
118
114
|
boxSizing: 'border-box',
|
|
119
115
|
display: 'flex',
|
|
@@ -711,7 +707,8 @@ export function useTriggerMenu(
|
|
|
711
707
|
{
|
|
712
708
|
placement: 'above',
|
|
713
709
|
alignment: 'start',
|
|
714
|
-
|
|
710
|
+
offset: spacingVars['--spacing-1'],
|
|
711
|
+
xstyle: styles.popoverSurface,
|
|
715
712
|
},
|
|
716
713
|
);
|
|
717
714
|
}, [popover, listboxId, state, selectItem, getItemId, t]);
|
|
@@ -131,7 +131,8 @@ export const docs = {
|
|
|
131
131
|
theming: {
|
|
132
132
|
targets: [
|
|
133
133
|
{className: 'astryx-checkbox-input', visualProps: ['size']},
|
|
134
|
-
{className: 'astryx-checkbox', visualProps: ['size'], states: ['checked', 'disabled']},
|
|
134
|
+
{className: 'astryx-checkbox-indicator', visualProps: ['size'], states: ['checked', 'disabled']},
|
|
135
|
+
{className: 'astryx-checkbox', visualProps: ['size'], states: ['checked', 'disabled'], deprecatedFor: 'checkbox-indicator'},
|
|
135
136
|
],
|
|
136
137
|
},
|
|
137
138
|
usage: {
|
|
@@ -206,7 +207,8 @@ export const docsZh = {
|
|
|
206
207
|
'size',
|
|
207
208
|
],
|
|
208
209
|
},
|
|
209
|
-
{className: 'astryx-checkbox', visualProps: ['size'], states: ['checked', 'disabled']},
|
|
210
|
+
{className: 'astryx-checkbox-indicator', visualProps: ['size'], states: ['checked', 'disabled']},
|
|
211
|
+
{className: 'astryx-checkbox', visualProps: ['size'], states: ['checked', 'disabled'], deprecatedFor: 'checkbox-indicator'},
|
|
210
212
|
],
|
|
211
213
|
},
|
|
212
214
|
};
|
|
@@ -13,6 +13,8 @@ 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';
|
|
18
20
|
|
|
@@ -542,6 +544,38 @@ describe('CheckboxInput', () => {
|
|
|
542
544
|
expect(data.get('terms')).toBe('on');
|
|
543
545
|
});
|
|
544
546
|
|
|
547
|
+
it('does not block form submission when required and disabled with a disabledMessage', () => {
|
|
548
|
+
const {container} = render(
|
|
549
|
+
<form>
|
|
550
|
+
<CheckboxInput
|
|
551
|
+
label="Terms"
|
|
552
|
+
htmlName="terms"
|
|
553
|
+
value={false}
|
|
554
|
+
onChange={() => {}}
|
|
555
|
+
isRequired
|
|
556
|
+
isDisabled
|
|
557
|
+
disabledMessage="Terms are managed by your administrator"
|
|
558
|
+
/>
|
|
559
|
+
</form>,
|
|
560
|
+
);
|
|
561
|
+
expect(container.querySelector('form')!.checkValidity()).toBe(true);
|
|
562
|
+
});
|
|
563
|
+
|
|
564
|
+
it('still blocks submission when required and unchecked but enabled', () => {
|
|
565
|
+
const {container} = render(
|
|
566
|
+
<form>
|
|
567
|
+
<CheckboxInput
|
|
568
|
+
label="Terms"
|
|
569
|
+
htmlName="terms"
|
|
570
|
+
value={false}
|
|
571
|
+
onChange={() => {}}
|
|
572
|
+
isRequired
|
|
573
|
+
/>
|
|
574
|
+
</form>,
|
|
575
|
+
);
|
|
576
|
+
expect(container.querySelector('form')!.checkValidity()).toBe(false);
|
|
577
|
+
});
|
|
578
|
+
|
|
545
579
|
it('is excluded from form data when disabled, even with a disabledMessage', () => {
|
|
546
580
|
const {container} = render(
|
|
547
581
|
<form>
|
|
@@ -599,3 +633,84 @@ describe('forced colors (WCAG 1.4.11)', () => {
|
|
|
599
633
|
expect(getForcedColorsRules()).toContain('color: canvastext;');
|
|
600
634
|
});
|
|
601
635
|
});
|
|
636
|
+
|
|
637
|
+
// The control's native input is `opacity: 0`, so the visible focus indicator
|
|
638
|
+
// has to land on the indicator beside it — which is themeable, third-party
|
|
639
|
+
// code. If drawing the ring were the indicator's job, a replacement that
|
|
640
|
+
// simply doesn't would ship a control with no visible focus (WCAG 2.4.7), and
|
|
641
|
+
// that is the default: our own sample replacement destructures
|
|
642
|
+
// {state, size, isDisabled} and drops the rest.
|
|
643
|
+
//
|
|
644
|
+
// So the owner paints it, on the indicator's own element, at focus time. The
|
|
645
|
+
// shape is right because `outline` follows that element's border-radius, and
|
|
646
|
+
// no cooperation is required.
|
|
647
|
+
describe('focus ring ownership (WCAG 2.4.7)', () => {
|
|
648
|
+
/** What a theme author plausibly writes: state in, picture out. */
|
|
649
|
+
const BareIndicator = ({state}: {state: string}) => (
|
|
650
|
+
<span aria-hidden="true" data-testid="bare-indicator">
|
|
651
|
+
{state === 'checked' ? 'x' : ''}
|
|
652
|
+
</span>
|
|
653
|
+
);
|
|
654
|
+
|
|
655
|
+
const bareTheme = defineTheme({
|
|
656
|
+
name: 'bare-indicator-theme',
|
|
657
|
+
indicators: {checkbox: BareIndicator},
|
|
658
|
+
});
|
|
659
|
+
|
|
660
|
+
/**
|
|
661
|
+
* The element the ring is painted on: the indicator slot's only child — the
|
|
662
|
+
* indicator's own root, whatever a theme renders there.
|
|
663
|
+
*/
|
|
664
|
+
const indicatorOf = (container: HTMLElement) => {
|
|
665
|
+
const input = container.querySelector('input[type="checkbox"]');
|
|
666
|
+
const slot = input?.nextElementSibling;
|
|
667
|
+
return slot?.firstElementChild as HTMLElement;
|
|
668
|
+
};
|
|
669
|
+
|
|
670
|
+
const focusInput = (container: HTMLElement) => {
|
|
671
|
+
const input = container.querySelector(
|
|
672
|
+
'input[type="checkbox"]',
|
|
673
|
+
) as HTMLInputElement;
|
|
674
|
+
// A keydown first, so jsdom's :focus-visible heuristic sees keyboard
|
|
675
|
+
// modality — the ring is deliberately keyboard-only, and a bare
|
|
676
|
+
// fireEvent.focus() reads as a pointer focus. Same approach as the
|
|
677
|
+
// TreeList focus test.
|
|
678
|
+
fireEvent.keyDown(document.body, {key: 'Tab'});
|
|
679
|
+
input.focus();
|
|
680
|
+
fireEvent.focus(input);
|
|
681
|
+
return input;
|
|
682
|
+
};
|
|
683
|
+
|
|
684
|
+
it('paints the ring on the built-in indicator', () => {
|
|
685
|
+
const {container} = render(
|
|
686
|
+
<CheckboxInput label="Accept" value={false} onChange={() => {}} />,
|
|
687
|
+
);
|
|
688
|
+
focusInput(container);
|
|
689
|
+
expect(indicatorOf(container).style.outlineStyle).toBe('solid');
|
|
690
|
+
});
|
|
691
|
+
|
|
692
|
+
it('paints it on a replacement that forwards nothing', () => {
|
|
693
|
+
const {container} = render(
|
|
694
|
+
<Theme theme={bareTheme}>
|
|
695
|
+
<CheckboxInput label="Accept" value={false} onChange={() => {}} />
|
|
696
|
+
</Theme>,
|
|
697
|
+
);
|
|
698
|
+
|
|
699
|
+
// The replacement really took effect, and really is bare.
|
|
700
|
+
const replaced = screen.getByTestId('bare-indicator');
|
|
701
|
+
expect(replaced.className).toBe('');
|
|
702
|
+
// ...and it still gets a ring, because the owner drew it.
|
|
703
|
+
focusInput(container);
|
|
704
|
+
expect(replaced.style.outlineStyle).toBe('solid');
|
|
705
|
+
});
|
|
706
|
+
|
|
707
|
+
it('clears the ring on blur', () => {
|
|
708
|
+
const {container} = render(
|
|
709
|
+
<CheckboxInput label="Accept" value={false} onChange={() => {}} />,
|
|
710
|
+
);
|
|
711
|
+
const input = focusInput(container);
|
|
712
|
+
expect(indicatorOf(container).style.outlineStyle).toBe('solid');
|
|
713
|
+
fireEvent.blur(input);
|
|
714
|
+
expect(indicatorOf(container).style.outlineStyle).toBe('');
|
|
715
|
+
});
|
|
716
|
+
});
|