@astryxdesign/core 0.3.0 → 0.4.0-canary.3112e99
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 +3 -0
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +32 -17
- 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/DropdownMenuRadioGroup.d.ts +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +10 -3
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +5 -5
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +24 -67
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +2 -8
- package/dist/DropdownMenu/index.d.ts +2 -1
- package/dist/DropdownMenu/index.d.ts.map +1 -1
- package/dist/DropdownMenu/index.js +4 -0
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +35 -27
- package/dist/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/EmptyState/EmptyState.js +9 -5
- package/dist/Field/InputClearButton.d.ts +16 -3
- package/dist/Field/InputClearButton.d.ts.map +1 -1
- package/dist/Field/InputClearButton.js +15 -4
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +21 -10
- 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/TableRow.d.ts +1 -1
- package/dist/Table/TableRow.d.ts.map +1 -1
- package/dist/Table/TableRow.js +4 -2
- package/dist/Table/index.d.ts +1 -1
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +22 -18
- package/dist/Table/plugins/rowExpansion/index.d.ts +1 -1
- package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/index.js +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +41 -76
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +94 -345
- package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +23 -4
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +29 -33
- package/dist/Table/tableContextMenu.d.ts.map +1 -1
- package/dist/Table/tableContextMenu.js +2 -1
- package/dist/Table/types.d.ts +11 -0
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/TextArea/TextArea.d.ts +10 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +16 -6
- package/dist/TextInput/TextInput.d.ts +10 -1
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +13 -19
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +32 -26
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +14 -17
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +14 -3
- package/dist/Timestamp/TimestampHoverCard.d.ts.map +1 -1
- package/dist/Timestamp/TimestampHoverCard.js +16 -34
- package/dist/Timestamp/formatInstant.d.ts +11 -1
- package/dist/Timestamp/formatInstant.d.ts.map +1 -1
- package/dist/Timestamp/formatInstant.js +3 -1
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +20 -11
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +4 -2
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +3 -19
- package/dist/TopNav/TopNav.d.ts.map +1 -1
- package/dist/TopNav/TopNav.js +6 -5
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +54 -16
- package/dist/TopNav/TopNavItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavItem.js +3 -9
- package/dist/TopNav/TopNavMegaMenu.d.ts +7 -0
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +146 -60
- package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuItem.js +22 -3
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +83 -38
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +13 -0
- package/dist/TreeList/TreeListBranches.d.ts +1 -1
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +14 -4
- package/dist/TreeList/TreeListItem.d.ts +11 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +57 -30
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +16 -8
- package/dist/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 +52 -0
- package/locales/pseudo.json +39 -0
- package/package.json +8 -3
- package/src/AlertDialog/AlertDialog.doc.mjs +16 -3
- package/src/AlertDialog/AlertDialog.test.tsx +208 -1
- package/src/AlertDialog/AlertDialog.tsx +21 -3
- package/src/AppShell/AppShell.doc.mjs +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.test.tsx +58 -1
- package/src/Banner/Banner.tsx +33 -11
- 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/DropdownMenuRadioGroup.tsx +2 -1
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +30 -76
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +25 -19
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +44 -14
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +1 -5
- package/src/DropdownMenu/index.ts +8 -1
- package/src/DropdownMenu/renderDropdownItems.tsx +33 -34
- package/src/EmptyState/EmptyState.doc.mjs +4 -0
- package/src/EmptyState/EmptyState.test.tsx +62 -0
- package/src/EmptyState/EmptyState.tsx +16 -6
- package/src/Field/Field.doc.mjs +1 -0
- package/src/Field/InputClearButton.test.tsx +117 -0
- package/src/Field/InputClearButton.tsx +30 -3
- package/src/FileInput/FileInput.tsx +21 -8
- 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/Table.test.tsx +31 -0
- package/src/Table/TableRow.tsx +6 -0
- package/src/Table/index.ts +1 -4
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +30 -14
- package/src/Table/plugins/rowExpansion/index.ts +1 -4
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +125 -175
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +115 -458
- package/src/Table/plugins/sortable/useTableSortable.tsx +2 -6
- package/src/Table/plugins/tree/useTableTreeData.tsx +43 -24
- package/src/Table/tableContextMenu.test.tsx +27 -0
- package/src/Table/tableContextMenu.tsx +1 -0
- package/src/Table/types.ts +11 -0
- package/src/Table/useTableGroupedRows.doc.mjs +1 -1
- package/src/Table/useTableRowExpansion.doc.mjs +43 -66
- package/src/TextArea/TextArea.doc.mjs +42 -2
- package/src/TextArea/TextArea.test.tsx +219 -0
- package/src/TextArea/TextArea.tsx +34 -7
- package/src/TextInput/TextInput.doc.mjs +18 -2
- package/src/TextInput/TextInput.test.tsx +189 -0
- package/src/TextInput/TextInput.tsx +25 -31
- package/src/Thumbnail/Thumbnail.tsx +2 -9
- package/src/TimeInput/TimeInput.doc.mjs +2 -2
- package/src/TimeInput/TimeInput.test.tsx +84 -3
- package/src/TimeInput/TimeInput.tsx +26 -28
- package/src/Timestamp/Timestamp.doc.mjs +4 -3
- package/src/Timestamp/Timestamp.test.tsx +91 -14
- package/src/Timestamp/Timestamp.tsx +14 -2
- package/src/Timestamp/TimestampHoverCard.tsx +13 -35
- package/src/Timestamp/formatInstant.ts +16 -1
- package/src/Token/Token.tsx +5 -28
- package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
- package/src/Tokenizer/Tokenizer.test.tsx +45 -3
- package/src/Tokenizer/Tokenizer.tsx +10 -2
- package/src/Tooltip/useTooltip.tsx +2 -23
- package/src/TopNav/TopNav.tsx +1 -3
- package/src/TopNav/TopNavHeading.tsx +42 -13
- package/src/TopNav/TopNavItem.tsx +3 -21
- package/src/TopNav/TopNavMegaMenu.doc.mjs +5 -0
- package/src/TopNav/TopNavMegaMenu.test.tsx +433 -33
- package/src/TopNav/TopNavMegaMenu.tsx +118 -53
- package/src/TopNav/TopNavMegaMenuItem.tsx +2 -9
- package/src/TopNav/TopNavMenu.tsx +34 -37
- package/src/TreeList/TreeList.doc.mjs +5 -0
- package/src/TreeList/TreeList.test.tsx +208 -8
- package/src/TreeList/TreeList.tsx +22 -0
- package/src/TreeList/TreeListBranches.tsx +25 -2
- package/src/TreeList/TreeListItem.tsx +89 -52
- package/src/Typeahead/BaseTypeahead.tsx +19 -6
- package/src/Typeahead/Typeahead.doc.mjs +1 -0
- package/src/Typeahead/Typeahead.test.tsx +76 -3
- package/src/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
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file focusOutline.stylex.ts
|
|
5
|
+
* @input Uses StyleX and theme color tokens
|
|
6
|
+
* @output Exports shared focus-outline prop builders
|
|
7
|
+
* @position Internal utility for consistent keyboard focus outlines across core components
|
|
8
|
+
*
|
|
9
|
+
* Centralizes the standard Astryx focus outline, shown only for keyboard focus.
|
|
10
|
+
* Every focusable surface drew the same 2px accent ring already; writing it per
|
|
11
|
+
* component meant dozens of identical definitions to keep in step, and they did
|
|
12
|
+
* not stay in step — offsets drifted and one ring was a border-width thick.
|
|
13
|
+
*
|
|
14
|
+
* Every ring in core and lab is drawn from here, with one exception recorded in
|
|
15
|
+
* Switch: its condition is a component-scoped ancestor marker, which cannot be
|
|
16
|
+
* shared without leaking focus state between components. A component may still
|
|
17
|
+
* override the OFFSET (a ring that must sit inset, or clear of a field border);
|
|
18
|
+
* width, style and color are not restated anywhere.
|
|
19
|
+
*
|
|
20
|
+
* Every value comes from the `--focus-outline-*` tokens, which is how a theme
|
|
21
|
+
* restyles the ring: one override reaches every component at once. The
|
|
22
|
+
* `:focus-visible` condition is not themeable and stays here, so a theme can
|
|
23
|
+
* change what the ring looks like but cannot show it to pointer users.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import * as stylex from '@stylexjs/stylex';
|
|
27
|
+
import {focusVars} from '../theme/tokens.stylex';
|
|
28
|
+
|
|
29
|
+
const FOCUS_OUTLINE_WIDTH = focusVars['--focus-outline-width'];
|
|
30
|
+
const FOCUS_OUTLINE_STYLE = focusVars['--focus-outline-style'];
|
|
31
|
+
const FOCUS_OUTLINE_COLOR = focusVars['--focus-outline-color'];
|
|
32
|
+
|
|
33
|
+
const FOCUS_OUTLINE_OFFSET = focusVars['--focus-outline-offset'];
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The ring as a single `outline` value, for reading it at runtime — an
|
|
37
|
+
* assertion, or an element styled imperatively.
|
|
38
|
+
*
|
|
39
|
+
* NOT usable inside another file's `stylex.create`: StyleX resolves imported
|
|
40
|
+
* `defineVars` and nothing else, so a component whose condition
|
|
41
|
+
* {@link focusOutlineStyles} cannot express (Switch, whose ring keys off a
|
|
42
|
+
* component-scoped ancestor marker) has to compose the `focusVars` tokens
|
|
43
|
+
* itself.
|
|
44
|
+
*/
|
|
45
|
+
export const FOCUS_OUTLINE = `${FOCUS_OUTLINE_WIDTH} ${FOCUS_OUTLINE_STYLE} ${FOCUS_OUTLINE_COLOR}`;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Written as longhands rather than the `outline` shorthand.
|
|
49
|
+
*
|
|
50
|
+
* A shorthand resets every longhand it covers, so `outline: 2px solid accent`
|
|
51
|
+
* would clobber a later `outlineColor` no matter the order — which is how
|
|
52
|
+
* destructive buttons silently lost their red ring. With longhands, a variant
|
|
53
|
+
* can re-color the ring and inherit width, style and offset.
|
|
54
|
+
*/
|
|
55
|
+
const focusOutlineLonghands = {
|
|
56
|
+
outlineWidth: FOCUS_OUTLINE_WIDTH,
|
|
57
|
+
outlineStyle: FOCUS_OUTLINE_STYLE,
|
|
58
|
+
outlineColor: FOCUS_OUTLINE_COLOR,
|
|
59
|
+
} as const;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* The standard focus ring as plain CSS values, for the one case that has to
|
|
63
|
+
* apply it imperatively: a control whose focusable input is visually hidden and
|
|
64
|
+
* whose ring must land on a *themeable indicator* beside it (see
|
|
65
|
+
* `useIndicatorFocusRing`). Everything else should use the styles above.
|
|
66
|
+
*
|
|
67
|
+
* Longhands, not the `outline` shorthand, for the same reason the styles are:
|
|
68
|
+
* a shorthand resets every longhand it covers, so a caller could not re-color
|
|
69
|
+
* the ring without restating its width and style. Split, each part is
|
|
70
|
+
* independently overridable — and every part stays a var, so a theme's
|
|
71
|
+
* `--focus-outline-*` overrides still flow through.
|
|
72
|
+
*
|
|
73
|
+
* Keys are camelCase to match `HTMLElement.style`, so this spreads straight
|
|
74
|
+
* onto an element:
|
|
75
|
+
*
|
|
76
|
+
* ```ts
|
|
77
|
+
* Object.assign(el.style, FOCUS_OUTLINE_PARTS); // draw
|
|
78
|
+
* Object.assign(el.style, FOCUS_OUTLINE_PARTS_NONE); // clear
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export const FOCUS_OUTLINE_PARTS = {
|
|
82
|
+
outlineWidth: FOCUS_OUTLINE_WIDTH,
|
|
83
|
+
outlineStyle: FOCUS_OUTLINE_STYLE,
|
|
84
|
+
outlineColor: FOCUS_OUTLINE_COLOR,
|
|
85
|
+
outlineOffset: FOCUS_OUTLINE_OFFSET,
|
|
86
|
+
} as const;
|
|
87
|
+
|
|
88
|
+
/** Clears {@link FOCUS_OUTLINE_PARTS}, one key per part so nothing lingers. */
|
|
89
|
+
export const FOCUS_OUTLINE_PARTS_NONE = {
|
|
90
|
+
outlineWidth: '',
|
|
91
|
+
outlineStyle: '',
|
|
92
|
+
outlineColor: '',
|
|
93
|
+
outlineOffset: '',
|
|
94
|
+
} as const;
|
|
95
|
+
|
|
96
|
+
export const focusOutlineStyles = stylex.create({
|
|
97
|
+
focusVisible: {
|
|
98
|
+
outlineWidth: {
|
|
99
|
+
default: '0',
|
|
100
|
+
':focus-visible': focusOutlineLonghands.outlineWidth,
|
|
101
|
+
},
|
|
102
|
+
outlineStyle: {
|
|
103
|
+
default: 'none',
|
|
104
|
+
':focus-visible': focusOutlineLonghands.outlineStyle,
|
|
105
|
+
},
|
|
106
|
+
outlineColor: {
|
|
107
|
+
default: null,
|
|
108
|
+
':focus-visible': focusOutlineLonghands.outlineColor,
|
|
109
|
+
},
|
|
110
|
+
outlineOffset: {default: '0', ':focus-visible': FOCUS_OUTLINE_OFFSET},
|
|
111
|
+
},
|
|
112
|
+
focusWithin: {
|
|
113
|
+
outlineWidth: {
|
|
114
|
+
default: '0',
|
|
115
|
+
':has(:focus-visible)': focusOutlineLonghands.outlineWidth,
|
|
116
|
+
},
|
|
117
|
+
outlineStyle: {
|
|
118
|
+
default: 'none',
|
|
119
|
+
':has(:focus-visible)': focusOutlineLonghands.outlineStyle,
|
|
120
|
+
},
|
|
121
|
+
outlineColor: {
|
|
122
|
+
default: null,
|
|
123
|
+
':has(:focus-visible)': focusOutlineLonghands.outlineColor,
|
|
124
|
+
},
|
|
125
|
+
outlineOffset: {default: '0', ':has(:focus-visible)': FOCUS_OUTLINE_OFFSET},
|
|
126
|
+
},
|
|
127
|
+
publishFocusVisibleVars: {
|
|
128
|
+
'--_focus-outline': {
|
|
129
|
+
default: 'none',
|
|
130
|
+
':focus-visible': FOCUS_OUTLINE,
|
|
131
|
+
},
|
|
132
|
+
'--_focus-outline-offset': {
|
|
133
|
+
default: '0',
|
|
134
|
+
':focus-visible': FOCUS_OUTLINE_OFFSET,
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
focusWithinOrPublished: {
|
|
138
|
+
outline: {
|
|
139
|
+
default: 'var(--_focus-outline, none)',
|
|
140
|
+
':has(:focus-visible)': FOCUS_OUTLINE,
|
|
141
|
+
},
|
|
142
|
+
outlineOffset: {
|
|
143
|
+
default: 'var(--_focus-outline-offset, 0)',
|
|
144
|
+
':has(:focus-visible)': FOCUS_OUTLINE_OFFSET,
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
// StyleX does not expose a stable public input type for stylex.props();
|
|
150
|
+
// keep this helper permissive so it mirrors stylex.props() itself.
|
|
151
|
+
type StyleXPropsArg = unknown;
|
|
152
|
+
|
|
153
|
+
function makeFocusOutlineProps(style: StyleXPropsArg) {
|
|
154
|
+
return (...styles: StyleXPropsArg[]) =>
|
|
155
|
+
// Caller styles LAST, so a component can deliberately re-color its ring —
|
|
156
|
+
// destructive buttons ring in error red, not accent. StyleX is last-wins,
|
|
157
|
+
// and reversing this to protect the ring silently ate that override.
|
|
158
|
+
//
|
|
159
|
+
// The hazard in this direction is the opposite one: a caller whose base
|
|
160
|
+
// style carries `outline: 'none'` wipes the ring out entirely (TreeList
|
|
161
|
+
// did, and shipped a focusable row with no visible focus). Two things
|
|
162
|
+
// guard it — this file states the rule, and the ring is written as
|
|
163
|
+
// LONGHANDS, so an override has to name `outlineStyle`/`outlineWidth`
|
|
164
|
+
// explicitly rather than erasing them through the `outline` shorthand.
|
|
165
|
+
stylex.props(style as never, ...(styles as never[]));
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export const focusOutlineProps = {
|
|
169
|
+
focusVisible: makeFocusOutlineProps(focusOutlineStyles.focusVisible),
|
|
170
|
+
focusWithin: makeFocusOutlineProps(focusOutlineStyles.focusWithin),
|
|
171
|
+
publishFocusVisibleVars: makeFocusOutlineProps(
|
|
172
|
+
focusOutlineStyles.publishFocusVisibleVars,
|
|
173
|
+
),
|
|
174
|
+
focusWithinOrPublished: makeFocusOutlineProps(
|
|
175
|
+
focusOutlineStyles.focusWithinOrPublished,
|
|
176
|
+
),
|
|
177
|
+
} as const;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import {describe, it, expect, afterEach} from 'vitest';
|
|
4
|
+
import {isFocusDetached} from './focusReturn';
|
|
5
|
+
|
|
6
|
+
describe('isFocusDetached', () => {
|
|
7
|
+
afterEach(() => {
|
|
8
|
+
document.body.innerHTML = '';
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it('is true when focus rests on the body (Escape / empty-space dismiss)', () => {
|
|
12
|
+
// Nothing focused → activeElement is <body>.
|
|
13
|
+
(document.activeElement as HTMLElement | null)?.blur();
|
|
14
|
+
expect(isFocusDetached()).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('is false when a real element holds focus (the user moved focus there)', () => {
|
|
18
|
+
const input = document.createElement('input');
|
|
19
|
+
document.body.appendChild(input);
|
|
20
|
+
input.focus();
|
|
21
|
+
expect(document.activeElement).toBe(input);
|
|
22
|
+
expect(isFocusDetached()).toBe(false);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('treats the documentElement as detached', () => {
|
|
26
|
+
const doc = {
|
|
27
|
+
activeElement: document.documentElement,
|
|
28
|
+
body: document.body,
|
|
29
|
+
documentElement: document.documentElement,
|
|
30
|
+
} as unknown as Document;
|
|
31
|
+
expect(isFocusDetached(doc)).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('treats a null activeElement as detached', () => {
|
|
35
|
+
const doc = {
|
|
36
|
+
activeElement: null,
|
|
37
|
+
body: document.body,
|
|
38
|
+
documentElement: document.documentElement,
|
|
39
|
+
} as unknown as Document;
|
|
40
|
+
expect(isFocusDetached(doc)).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file focusReturn.ts
|
|
5
|
+
* @input The document's current active element.
|
|
6
|
+
* @output Whether focus is currently "detached" — on nothing in particular.
|
|
7
|
+
* @position Utility; used by overlay triggers (e.g. DateInput, DateTimeInput)
|
|
8
|
+
* that return focus to their control when the overlay closes, but only when
|
|
9
|
+
* the dismiss did not already move focus somewhere the user chose.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* True when focus rests on nothing in particular — no active element, or the
|
|
14
|
+
* document body / root element.
|
|
15
|
+
*
|
|
16
|
+
* An overlay (popover, calendar, dropdown) that restores focus to its trigger
|
|
17
|
+
* on close should do so ONLY when this is true. A native `popover="auto"`
|
|
18
|
+
* light-dismiss fires its close synchronously with the pointer event that
|
|
19
|
+
* moved focus, so by the time the close handler runs, focus has already
|
|
20
|
+
* landed on whatever the user clicked — another field, a button, anywhere.
|
|
21
|
+
* Restoring focus unconditionally would yank it back and fight that click.
|
|
22
|
+
* The one case the browser leaves unresolved is Escape or a click on
|
|
23
|
+
* non-focusable empty space, which drops focus to the body; that is exactly
|
|
24
|
+
* when the trigger should reclaim it.
|
|
25
|
+
*/
|
|
26
|
+
export function isFocusDetached(doc: Document = document): boolean {
|
|
27
|
+
const active = doc.activeElement;
|
|
28
|
+
return (
|
|
29
|
+
active == null || active === doc.body || active === doc.documentElement
|
|
30
|
+
);
|
|
31
|
+
}
|
package/src/utils/index.ts
CHANGED
|
@@ -72,6 +72,7 @@ export {getKey, type Key, type KeyFallback} from './getKey';
|
|
|
72
72
|
|
|
73
73
|
export {mergeProps} from './mergeProps';
|
|
74
74
|
export {mergeRefs} from './mergeRefs';
|
|
75
|
+
export {isFocusDetached} from './focusReturn';
|
|
75
76
|
export {composeEventHandlers} from './composeEventHandlers';
|
|
76
77
|
export {themeProps, themeDataAttributes} from './themeProps';
|
|
77
78
|
export type {
|
|
@@ -100,3 +101,7 @@ export type {RGBA} from './color';
|
|
|
100
101
|
export {devWarn, devError, warnOnce, formatDevMessage} from './devWarning';
|
|
101
102
|
|
|
102
103
|
export {rtlStyles} from './rtlStyles';
|
|
104
|
+
|
|
105
|
+
// The shared focus ring, exported for @astryxdesign/lab — same reason
|
|
106
|
+
// rtlStyles is: a style that must be identical across packages, not copied.
|
|
107
|
+
export {focusOutlineStyles, focusOutlineProps} from './focusOutline.stylex';
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import {createElement, createRef} from 'react';
|
|
4
|
+
import {render} from '@testing-library/react';
|
|
5
|
+
import {describe, expect, it, vi} from 'vitest';
|
|
6
|
+
import {mergeRefs} from './mergeRefs';
|
|
7
|
+
|
|
8
|
+
describe('mergeRefs', () => {
|
|
9
|
+
it('forwards the value to callback and object refs', () => {
|
|
10
|
+
const callbackRef = vi.fn();
|
|
11
|
+
const objectRef = createRef<HTMLDivElement>();
|
|
12
|
+
|
|
13
|
+
const {container} = render(
|
|
14
|
+
createElement('div', {ref: mergeRefs(callbackRef, objectRef)}),
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
expect(callbackRef).toHaveBeenCalledWith(container.firstElementChild);
|
|
18
|
+
expect(objectRef.current).toBe(container.firstElementChild);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('runs callback cleanup and clears object refs', () => {
|
|
22
|
+
const cleanup = vi.fn();
|
|
23
|
+
const callbackRef = vi.fn(() => cleanup);
|
|
24
|
+
const objectRef = createRef<HTMLDivElement>();
|
|
25
|
+
|
|
26
|
+
const {unmount} = render(
|
|
27
|
+
createElement('div', {ref: mergeRefs(callbackRef, objectRef)}),
|
|
28
|
+
);
|
|
29
|
+
unmount();
|
|
30
|
+
|
|
31
|
+
expect(cleanup).toHaveBeenCalledTimes(1);
|
|
32
|
+
expect(callbackRef).toHaveBeenCalledTimes(1);
|
|
33
|
+
expect(objectRef.current).toBeNull();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('passes null to callback refs that do not return cleanup functions', () => {
|
|
37
|
+
const callbackRef = vi.fn();
|
|
38
|
+
|
|
39
|
+
const {container, unmount} = render(
|
|
40
|
+
createElement('div', {ref: mergeRefs(callbackRef)}),
|
|
41
|
+
);
|
|
42
|
+
const element = container.firstElementChild;
|
|
43
|
+
unmount();
|
|
44
|
+
|
|
45
|
+
expect(callbackRef).toHaveBeenNthCalledWith(1, element);
|
|
46
|
+
expect(callbackRef).toHaveBeenNthCalledWith(2, null);
|
|
47
|
+
});
|
|
48
|
+
});
|
package/src/utils/mergeRefs.ts
CHANGED
|
@@ -16,16 +16,22 @@ export function mergeRefs<T>(...refs: (Ref<T> | undefined)[]): RefCallback<T> {
|
|
|
16
16
|
for (const ref of refs) {
|
|
17
17
|
if (typeof ref === 'function') {
|
|
18
18
|
const cleanup = ref(value);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
cleanups.push(
|
|
20
|
+
typeof cleanup === 'function' ? cleanup : () => ref(null),
|
|
21
|
+
);
|
|
22
22
|
} else if (ref != null) {
|
|
23
|
-
|
|
23
|
+
const mutableRef = ref as {current: T | null};
|
|
24
|
+
mutableRef.current = value;
|
|
25
|
+
cleanups.push(() => {
|
|
26
|
+
mutableRef.current = null;
|
|
27
|
+
});
|
|
24
28
|
}
|
|
25
29
|
}
|
|
26
|
-
if (cleanups.length > 0) {
|
|
30
|
+
if (value != null && cleanups.length > 0) {
|
|
27
31
|
return () => {
|
|
28
|
-
for (const cleanup of cleanups) {
|
|
32
|
+
for (const cleanup of cleanups) {
|
|
33
|
+
cleanup();
|
|
34
|
+
}
|
|
29
35
|
};
|
|
30
36
|
}
|
|
31
37
|
};
|
package/src/utils/rtlStyles.ts
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* @file rtlStyles.ts
|
|
5
5
|
* @input None
|
|
6
6
|
* @output Shared StyleX style that horizontally mirrors an element under RTL
|
|
7
|
-
* @position Core utility; applied to directional
|
|
8
|
-
*
|
|
7
|
+
* @position Core utility; applied to directional icons in Calendar, Lightbox,
|
|
8
|
+
* Pagination, Carousel and the Table expand/disclosure plugins
|
|
9
9
|
*
|
|
10
10
|
* `mirror` flips its element on the horizontal axis only when an ancestor
|
|
11
11
|
* carries `dir="rtl"`. Using `scaleX(-1)` (not `scale(-1, -1)`) keeps the
|
package/src/utils/themeProps.ts
CHANGED
|
@@ -73,9 +73,7 @@ function buildClassName(component: string, props?: ClassProps): string {
|
|
|
73
73
|
* literal prop values, including numeric values (`level: 1` → `data-level="1"`).
|
|
74
74
|
* Nullish values are omitted.
|
|
75
75
|
*/
|
|
76
|
-
export function themeDataAttributes(
|
|
77
|
-
props?: ClassProps,
|
|
78
|
-
): ThemeDataAttributes {
|
|
76
|
+
export function themeDataAttributes(props?: ClassProps): ThemeDataAttributes {
|
|
79
77
|
const attrs: ThemeDataAttributes = {};
|
|
80
78
|
|
|
81
79
|
if (props) {
|
|
@@ -102,12 +100,36 @@ export function themeDataAttributes(
|
|
|
102
100
|
* // → { className: 'astryx-button primary sm', data-variant: 'primary', data-size: 'sm' }
|
|
103
101
|
* ```
|
|
104
102
|
*/
|
|
103
|
+
/**
|
|
104
|
+
* Options for {@link themeProps}.
|
|
105
|
+
*/
|
|
106
|
+
export type ThemePropsOptions = {
|
|
107
|
+
/**
|
|
108
|
+
* Stable class names to emit ALONGSIDE the component's own, for targets that
|
|
109
|
+
* have been renamed.
|
|
110
|
+
*
|
|
111
|
+
* A theme target is public API: renaming one silently breaks every theme
|
|
112
|
+
* that styles it. Emitting the old name beside the new one keeps those
|
|
113
|
+
* themes working through a deprecation window, at the cost of one extra
|
|
114
|
+
* class on the element until the old name is dropped in a major.
|
|
115
|
+
*
|
|
116
|
+
* Pass plain string literals — the theming guards scan for them statically.
|
|
117
|
+
* Document the old name with `deprecated` in the component's
|
|
118
|
+
* `theming.targets` so the docsite says which to use.
|
|
119
|
+
*/
|
|
120
|
+
legacyNames?: ReadonlyArray<string>;
|
|
121
|
+
};
|
|
122
|
+
|
|
105
123
|
export function themeProps(
|
|
106
124
|
component: string,
|
|
107
125
|
props?: ClassProps,
|
|
126
|
+
options?: ThemePropsOptions,
|
|
108
127
|
): ThemeProps {
|
|
128
|
+
const className = buildClassName(component, props);
|
|
129
|
+
const legacy = options?.legacyNames?.map(name => stableClassName(name)) ?? [];
|
|
130
|
+
|
|
109
131
|
return {
|
|
110
|
-
className:
|
|
132
|
+
className: legacy.length > 0 ? [className, ...legacy].join(' ') : className,
|
|
111
133
|
...themeDataAttributes(props),
|
|
112
134
|
};
|
|
113
135
|
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import * as stylex from '@stylexjs/stylex';
|
|
2
|
-
/**
|
|
3
|
-
* Scoped marker for CheckboxInput ancestor selectors.
|
|
4
|
-
* Prevents focus-within and hover styles from leaking when
|
|
5
|
-
* checkboxes are placed inside Popovers or other containers
|
|
6
|
-
* that also have focus-within state.
|
|
7
|
-
*/
|
|
8
|
-
export declare const checkboxScope: ReturnType<typeof stylex.defineMarker>;
|
|
9
|
-
//# sourceMappingURL=checkbox.markers.stylex.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"checkbox.markers.stylex.d.ts","sourceRoot":"","sources":["../../src/CheckboxInput/checkbox.markers.stylex.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAE3C;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,YAAY,CAC1C,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
|
|
3
|
-
import * as stylex from '@stylexjs/stylex';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Scoped marker for CheckboxInput ancestor selectors.
|
|
7
|
-
* Prevents focus-within and hover styles from leaking when
|
|
8
|
-
* checkboxes are placed inside Popovers or other containers
|
|
9
|
-
* that also have focus-within state.
|
|
10
|
-
*/
|
|
11
|
-
export const checkboxScope = {
|
|
12
|
-
x1tspnpo: "x1tspnpo",
|
|
13
|
-
$$css: true
|
|
14
|
-
};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import * as stylex from '@stylexjs/stylex';
|
|
2
|
-
/**
|
|
3
|
-
* Scoped marker for RadioListItem ancestor selectors.
|
|
4
|
-
* Prevents hover styles from leaking from parent containers.
|
|
5
|
-
*/
|
|
6
|
-
export declare const radioScope: ReturnType<typeof stylex.defineMarker>;
|
|
7
|
-
//# sourceMappingURL=radio.markers.stylex.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"radio.markers.stylex.d.ts","sourceRoot":"","sources":["../../src/RadioList/radio.markers.stylex.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAE3C;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,YAAY,CACvC,CAAC"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
|
|
3
|
-
import * as stylex from '@stylexjs/stylex';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Scoped marker for RadioListItem ancestor selectors.
|
|
7
|
-
* Prevents hover styles from leaking from parent containers.
|
|
8
|
-
*/
|
|
9
|
-
export const radioScope = {
|
|
10
|
-
xklqth5: "xklqth5",
|
|
11
|
-
$$css: true
|
|
12
|
-
};
|