@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
|
@@ -9,13 +9,21 @@ export const docs = {
|
|
|
9
9
|
keywords: ["aspect-ratio","ratio","proportion","responsive","embed","container","widescreen","thumbnail","letterbox","crop"],
|
|
10
10
|
usage: {
|
|
11
11
|
description:
|
|
12
|
-
'Maintains a fixed width-to-height ratio for its children
|
|
12
|
+
'Maintains a fixed width-to-height ratio for its children as its container resizes. Use it for media containers like videos, images, thumbnails, or any content that needs consistent proportions. It takes its width from the container and derives its height from the ratio, so it needs an ancestor with a definite width.',
|
|
13
13
|
bestPractices: [
|
|
14
14
|
{guidance: true, description: 'Express the ratio as a fraction like `16/9` or `4/3` for readability.'},
|
|
15
15
|
{guidance: true, description: 'Use for media that needs consistent proportions across screen sizes.'},
|
|
16
16
|
{guidance: true, description: 'Use `fit="cover"` for images and video so the component sizes the child; the child should not repeat `width`/`height`/`objectFit` styles.'},
|
|
17
|
+
{guidance: true, description: 'Pass one child. With `fit` set, every direct child is stretched to fill the box, so put an overlay or caption inside a single wrapper child rather than passing it as a second child.'},
|
|
18
|
+
{guidance: true, description: 'Describe media children with `alt`, or `alt=""` when the image is decorative. AspectRatio adds no role and no accessible name of its own, so the child carries the whole accessible description.'},
|
|
17
19
|
{guidance: false, description: 'Use for general layout containers; use standard layout components instead.'},
|
|
18
20
|
{guidance: false, description: 'Nest AspectRatio containers; one level is sufficient.'},
|
|
21
|
+
{guidance: false, description: 'Constrain the height on its own. The width comes from the container, so a `height` or `maxHeight` by itself clamps the box off ratio; pair it with `width: "auto"` to size from the height instead.'},
|
|
22
|
+
{guidance: false, description: 'Place it in a shrink-to-fit parent such as `inline-flex`, `width: fit-content` or a floated box. It contributes no intrinsic width there and collapses to zero.'},
|
|
23
|
+
],
|
|
24
|
+
anatomy: [
|
|
25
|
+
{name: 'Ratio box', required: true, description: 'The outer element that holds the aspect ratio and clips overflow. Carries the `astryx-aspect-ratio` theme target, and the elliptical clip when `shape` is `ellipse`.'},
|
|
26
|
+
{name: 'Content slot', required: true, description: 'A wrapper that fills the ratio box and positions the child. With `fit` set it also sizes the child; without it the child styles itself.'},
|
|
19
27
|
],
|
|
20
28
|
},
|
|
21
29
|
props: [
|
|
@@ -68,13 +76,21 @@ export const docsZh = {
|
|
|
68
76
|
displayName: 'Aspect Ratio',
|
|
69
77
|
usage: {
|
|
70
78
|
description:
|
|
71
|
-
'Maintains a fixed width-to-height ratio for its children
|
|
79
|
+
'Maintains a fixed width-to-height ratio for its children as its container resizes. Use it for media containers like videos, images, thumbnails, or any content that needs consistent proportions. It takes its width from the container and derives its height from the ratio, so it needs an ancestor with a definite width.',
|
|
72
80
|
bestPractices: [
|
|
73
81
|
{guidance: true, description: 'Express the ratio as a fraction like `16/9` or `4/3` for readability.'},
|
|
74
82
|
{guidance: true, description: 'Use for media that needs consistent proportions across screen sizes.'},
|
|
75
83
|
{guidance: true, description: 'Use `fit="cover"` for images and video so the component sizes the child; the child should not repeat `width`/`height`/`objectFit` styles.'},
|
|
84
|
+
{guidance: true, description: 'Pass one child. With `fit` set, every direct child is stretched to fill the box, so put an overlay or caption inside a single wrapper child rather than passing it as a second child.'},
|
|
85
|
+
{guidance: true, description: 'Describe media children with `alt`, or `alt=""` when the image is decorative. AspectRatio adds no role and no accessible name of its own, so the child carries the whole accessible description.'},
|
|
76
86
|
{guidance: false, description: 'Use for general layout containers; use standard layout components instead.'},
|
|
77
87
|
{guidance: false, description: 'Nest AspectRatio containers; one level is sufficient.'},
|
|
88
|
+
{guidance: false, description: 'Constrain the height on its own. The width comes from the container, so a `height` or `maxHeight` by itself clamps the box off ratio; pair it with `width: "auto"` to size from the height instead.'},
|
|
89
|
+
{guidance: false, description: 'Place it in a shrink-to-fit parent such as `inline-flex`, `width: fit-content` or a floated box. It contributes no intrinsic width there and collapses to zero.'},
|
|
90
|
+
],
|
|
91
|
+
anatomy: [
|
|
92
|
+
{name: 'Ratio box', required: true, description: 'The outer element that holds the aspect ratio and clips overflow. Carries the `astryx-aspect-ratio` theme target, and the elliptical clip when `shape` is `ellipse`.'},
|
|
93
|
+
{name: 'Content slot', required: true, description: 'A wrapper that fills the ratio box and positions the child. With `fit` set it also sizes the child; without it the child styles itself.'},
|
|
78
94
|
],
|
|
79
95
|
},
|
|
80
96
|
props: [
|
|
@@ -110,13 +126,21 @@ export const docsDense = {
|
|
|
110
126
|
description: 'maintains specific aspect ratio for children',
|
|
111
127
|
usage: {
|
|
112
128
|
description:
|
|
113
|
-
'Maintains a fixed width-to-height ratio for its children
|
|
129
|
+
'Maintains a fixed width-to-height ratio for its children as its container resizes. Use it for media containers like videos, images, thumbnails, or any content that needs consistent proportions. It takes its width from the container and derives its height from the ratio, so it needs an ancestor with a definite width.',
|
|
114
130
|
bestPractices: [
|
|
115
131
|
{guidance: true, description: 'Express the ratio as a fraction like `16/9` or `4/3` for readability.'},
|
|
116
132
|
{guidance: true, description: 'Use for media that needs consistent proportions across screen sizes.'},
|
|
117
133
|
{guidance: true, description: 'Use `fit="cover"` for images and video so the component sizes the child; the child should not repeat `width`/`height`/`objectFit` styles.'},
|
|
134
|
+
{guidance: true, description: 'Pass one child. With `fit` set, every direct child is stretched to fill the box, so put an overlay or caption inside a single wrapper child rather than passing it as a second child.'},
|
|
135
|
+
{guidance: true, description: 'Describe media children with `alt`, or `alt=""` when the image is decorative. AspectRatio adds no role and no accessible name of its own, so the child carries the whole accessible description.'},
|
|
118
136
|
{guidance: false, description: 'Use for general layout containers; use standard layout components instead.'},
|
|
119
137
|
{guidance: false, description: 'Nest AspectRatio containers; one level is sufficient.'},
|
|
138
|
+
{guidance: false, description: 'Constrain the height on its own. The width comes from the container, so a `height` or `maxHeight` by itself clamps the box off ratio; pair it with `width: "auto"` to size from the height instead.'},
|
|
139
|
+
{guidance: false, description: 'Place it in a shrink-to-fit parent such as `inline-flex`, `width: fit-content` or a floated box. It contributes no intrinsic width there and collapses to zero.'},
|
|
140
|
+
],
|
|
141
|
+
anatomy: [
|
|
142
|
+
{name: 'Ratio box', required: true, description: 'The outer element that holds the aspect ratio and clips overflow. Carries the `astryx-aspect-ratio` theme target, and the elliptical clip when `shape` is `ellipse`.'},
|
|
143
|
+
{name: 'Content slot', required: true, description: 'A wrapper that fills the ratio box and positions the child. With `fit` set it also sizes the child; without it the child styles itself.'},
|
|
120
144
|
],
|
|
121
145
|
},
|
|
122
146
|
propDescriptions: {
|
|
@@ -276,6 +276,36 @@ describe('AspectRatio', () => {
|
|
|
276
276
|
});
|
|
277
277
|
});
|
|
278
278
|
|
|
279
|
+
describe('style merging', () => {
|
|
280
|
+
it('keeps the consumer style and applies the ratio over it', () => {
|
|
281
|
+
render(
|
|
282
|
+
<AspectRatio
|
|
283
|
+
ratio={16 / 9}
|
|
284
|
+
data-testid="aspect-ratio"
|
|
285
|
+
style={{opacity: 0.5, aspectRatio: '3 / 1'}}>
|
|
286
|
+
<div>Content</div>
|
|
287
|
+
</AspectRatio>,
|
|
288
|
+
);
|
|
289
|
+
const element = screen.getByTestId('aspect-ratio');
|
|
290
|
+
expect(element.style.opacity).toBe('0.5');
|
|
291
|
+
expect(element.style.aspectRatio).toBe(String(16 / 9));
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
it('keeps a consumer className beside the theme target', () => {
|
|
295
|
+
render(
|
|
296
|
+
<AspectRatio
|
|
297
|
+
ratio={1}
|
|
298
|
+
data-testid="aspect-ratio"
|
|
299
|
+
className="consumer-class">
|
|
300
|
+
<div>Content</div>
|
|
301
|
+
</AspectRatio>,
|
|
302
|
+
);
|
|
303
|
+
const element = screen.getByTestId('aspect-ratio');
|
|
304
|
+
expect(element).toHaveClass('consumer-class');
|
|
305
|
+
expect(element).toHaveClass('astryx-aspect-ratio');
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
|
|
279
309
|
describe('reset.css fit baseline rules', () => {
|
|
280
310
|
// The cover/contain child sizing ships as zero-specificity baseline
|
|
281
311
|
// rules in reset.css keyed on the data-astryx-aspect-ratio-override
|
|
@@ -94,6 +94,10 @@ export interface AspectRatioProps extends BaseProps<HTMLDivElement> {
|
|
|
94
94
|
/**
|
|
95
95
|
* Content to render inside the aspect ratio container.
|
|
96
96
|
* The child element will be positioned absolutely to fill the container.
|
|
97
|
+
*
|
|
98
|
+
* Pass a single child. With `fit` set, every direct child is stretched to
|
|
99
|
+
* fill the box, so a second child is laid out below the first and clipped
|
|
100
|
+
* out of view; compose an overlay or caption inside one wrapper child.
|
|
97
101
|
*/
|
|
98
102
|
children: ReactNode;
|
|
99
103
|
}
|
|
@@ -145,6 +149,15 @@ const styles = stylex.create({
|
|
|
145
149
|
* `ratio={1}` or an oval at other ratios. Both shapes respect the provided
|
|
146
150
|
* `ratio`.
|
|
147
151
|
*
|
|
152
|
+
* Sizing: the box takes its width from its container and derives its height
|
|
153
|
+
* from the ratio, so it needs an ancestor with a definite width. Two
|
|
154
|
+
* consequences are worth knowing. Constraining only the height (`height` or
|
|
155
|
+
* `maxHeight`) clamps the box without releasing the width, so the rendered
|
|
156
|
+
* ratio no longer matches `ratio`; pass `width: 'auto'` alongside to size from
|
|
157
|
+
* the height instead. And in a shrink-to-fit parent (`inline-flex`,
|
|
158
|
+
* `width: fit-content`, a floated box) it contributes no intrinsic width and
|
|
159
|
+
* collapses to zero.
|
|
160
|
+
*
|
|
148
161
|
* @example
|
|
149
162
|
* ```
|
|
150
163
|
* <AspectRatio ratio={16 / 9} fit="cover">
|
|
@@ -29,21 +29,10 @@ export const docs = {
|
|
|
29
29
|
theming: {
|
|
30
30
|
targets: [
|
|
31
31
|
{className: 'astryx-avatar', visualProps: ['size']},
|
|
32
|
+
{className: 'astryx-avatar-fallback', visualProps: ['size']},
|
|
32
33
|
{className: 'astryx-avatar-status-dot', visualProps: ['variant']},
|
|
33
34
|
{className: 'astryx-avatar-status-dot-glyph', visualProps: ['shape']},
|
|
34
35
|
],
|
|
35
|
-
vars: [
|
|
36
|
-
{name: '--_avatar-fallback-font-size', description: 'Initials font size; default is proportional to the avatar size (size × 0.4). Override per size tier (e.g. size:sm) for a custom type scale.', default: 'calc(avatar-size × 0.4)', private: true},
|
|
37
|
-
{name: '--_avatar-fallback-font-weight', description: 'Initials font weight', default: 'var(--font-weight-medium)', private: true},
|
|
38
|
-
{name: '--_avatar-fallback-color', description: 'Fallback text and default-icon color', default: 'var(--color-text-secondary)', private: true},
|
|
39
|
-
{name: '--_avatar-fallback-background', description: 'Fallback wash background fill', default: 'var(--color-neutral)', private: true},
|
|
40
|
-
],
|
|
41
|
-
derived: [
|
|
42
|
-
{property: 'fontSize', vars: ['--_avatar-fallback-font-size']},
|
|
43
|
-
{property: 'fontWeight', vars: ['--_avatar-fallback-font-weight']},
|
|
44
|
-
{property: 'color', vars: ['--_avatar-fallback-color']},
|
|
45
|
-
{property: 'backgroundColor', vars: ['--_avatar-fallback-background']},
|
|
46
|
-
],
|
|
47
36
|
},
|
|
48
37
|
description: 'Displays a user avatar with image, initials fallback, and optional status indicator.',
|
|
49
38
|
props: [
|
|
@@ -104,7 +93,7 @@ export const docs = {
|
|
|
104
93
|
name: 'as',
|
|
105
94
|
type: 'ElementType',
|
|
106
95
|
description:
|
|
107
|
-
'Custom link component used when `href` is set (e.g.
|
|
96
|
+
'Custom link component used when `href` is set (e.g. `next/link`). Overrides the provider-level LinkProvider default. Only applies with `href`.',
|
|
108
97
|
},
|
|
109
98
|
{
|
|
110
99
|
name: 'target',
|
|
@@ -37,17 +37,42 @@ describe('Avatar', () => {
|
|
|
37
37
|
expect(innerImg).toHaveAttribute('alt', '');
|
|
38
38
|
});
|
|
39
39
|
|
|
40
|
-
it('renders fallback initials
|
|
40
|
+
it('renders fallback initials at the proportional size via a StyleX class, not an inline property', () => {
|
|
41
41
|
render(<Avatar name="Ada Lovelace" size="sm" data-testid="a" />);
|
|
42
42
|
const initials = screen.getByText('AL');
|
|
43
|
-
// The
|
|
44
|
-
//
|
|
45
|
-
//
|
|
46
|
-
//
|
|
43
|
+
// The default proportional size (sm = 24 × 0.4 = 9.6px) is fed to StyleX as
|
|
44
|
+
// a dynamic value: StyleX applies `font-size` through a class and sets only
|
|
45
|
+
// the computed value inline (as a custom property). Because the property
|
|
46
|
+
// lands via a class, a theme's `.astryx-avatar-fallback.<size>` rule in the
|
|
47
|
+
// theme layer overrides it per size tier — no internal var seam needed.
|
|
47
48
|
const style = initials.getAttribute('style') ?? '';
|
|
48
|
-
expect(style).
|
|
49
|
-
//
|
|
50
|
-
expect(style).
|
|
49
|
+
expect(style).toMatch(/9\.6\d*px/);
|
|
50
|
+
// Regression guard: the seam must NOT reintroduce the removed internal var.
|
|
51
|
+
expect(style).not.toContain('--_avatar-fallback-font-size');
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('marks the fallback surface with the stable theming class (initials and icon)', () => {
|
|
55
|
+
// The background is themed directly on `.astryx-avatar-fallback`, so both
|
|
56
|
+
// the initials and the default-icon fallback must carry the class.
|
|
57
|
+
const {rerender} = render(<Avatar name="Ada Lovelace" />);
|
|
58
|
+
expect(screen.getByText('AL').className).toContain(
|
|
59
|
+
'astryx-avatar-fallback',
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
rerender(<Avatar />);
|
|
63
|
+
const icon = document.querySelector('.astryx-avatar-fallback');
|
|
64
|
+
expect(icon).not.toBeNull();
|
|
65
|
+
expect(icon?.querySelector('svg')).not.toBeNull();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('does not split an emoji surrogate pair when generating initials', () => {
|
|
69
|
+
render(<Avatar name="😀 Ada" data-testid="avatar" />);
|
|
70
|
+
expect(screen.getByTestId('avatar')).toHaveTextContent('😀A');
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('preserves a complete grapheme when generating initials', () => {
|
|
74
|
+
render(<Avatar name="🇬🇧 Ada" data-testid="avatar" />);
|
|
75
|
+
expect(screen.getByTestId('avatar')).toHaveTextContent('🇬🇧A');
|
|
51
76
|
});
|
|
52
77
|
|
|
53
78
|
it('retries a new src after a previous src failed to load', () => {
|
package/src/Avatar/Avatar.tsx
CHANGED
|
@@ -31,6 +31,7 @@ import {AvatarSizeContext} from './AvatarSizeContext';
|
|
|
31
31
|
import {useAvatarGroup} from '../AvatarGroup/AvatarGroupContext';
|
|
32
32
|
import {mergeProps, mergeRefs} from '../utils';
|
|
33
33
|
import {themeProps} from '../utils/themeProps';
|
|
34
|
+
import {focusOutlineProps} from '../utils/focusOutline.stylex';
|
|
34
35
|
import {useTooltip} from '../Tooltip/useTooltip';
|
|
35
36
|
import {useLinkComponent} from '../Link/useLinkComponent';
|
|
36
37
|
import type {LinkComponentType} from '../Link/types';
|
|
@@ -112,9 +113,9 @@ const styles = stylex.create({
|
|
|
112
113
|
display: 'inline-flex',
|
|
113
114
|
flexShrink: 0,
|
|
114
115
|
// The wrapper is not clipped (so the status dot can overflow), so it must be
|
|
115
|
-
// rounded itself: a
|
|
116
|
-
//
|
|
117
|
-
//
|
|
116
|
+
// rounded itself: a theme can set a background on the `.astryx-avatar`
|
|
117
|
+
// wrapper, and an unrounded wrapper would show that fill as square corners
|
|
118
|
+
// behind the circular content.
|
|
118
119
|
borderRadius: radiusVars['--radius-full'],
|
|
119
120
|
},
|
|
120
121
|
content: {
|
|
@@ -136,14 +137,15 @@ const styles = stylex.create({
|
|
|
136
137
|
justifyContent: 'center',
|
|
137
138
|
width: '100%',
|
|
138
139
|
height: '100%',
|
|
139
|
-
// Fallback surface (initials + default icon).
|
|
140
|
-
//
|
|
141
|
-
//
|
|
142
|
-
//
|
|
143
|
-
|
|
144
|
-
|
|
140
|
+
// Fallback surface (initials + default icon). Background, text color,
|
|
141
|
+
// weight, and per-size font size are all themed directly via the stable
|
|
142
|
+
// `.astryx-avatar-fallback` class target (font size through its size
|
|
143
|
+
// variant, `.astryx-avatar-fallback.<size>`), so the defaults here are
|
|
144
|
+
// plain values with no internal-var seam. See Avatar.doc.mjs theming.
|
|
145
|
+
backgroundColor: colorVars['--color-neutral'],
|
|
146
|
+
color: colorVars['--color-text-secondary'],
|
|
145
147
|
fontFamily: typographyVars['--font-family-body'],
|
|
146
|
-
fontWeight:
|
|
148
|
+
fontWeight: fontWeightVars['--font-weight-medium'],
|
|
147
149
|
textTransform: 'uppercase',
|
|
148
150
|
},
|
|
149
151
|
status: {
|
|
@@ -152,16 +154,6 @@ const styles = stylex.create({
|
|
|
152
154
|
// Visible focus ring for the name-tooltip tab stop, matching the repo-wide
|
|
153
155
|
// focus-visible outline treatment (see Timestamp, Token, Thumbnail). Only
|
|
154
156
|
// applied when a tooltip is active so keyboard users can reveal it.
|
|
155
|
-
focusable: {
|
|
156
|
-
outline: {
|
|
157
|
-
default: null,
|
|
158
|
-
':focus-visible': `2px solid ${colorVars['--color-accent']}`,
|
|
159
|
-
},
|
|
160
|
-
outlineOffset: {
|
|
161
|
-
default: '0',
|
|
162
|
-
':focus-visible': '2px',
|
|
163
|
-
},
|
|
164
|
-
},
|
|
165
157
|
// Reset the intrinsic styling of the interactive element (<a>/<button>) so it
|
|
166
158
|
// is a transparent, correctly-sized wrapper around the avatar visuals. The
|
|
167
159
|
// element carries the focus-visible accent ring for keyboard users.
|
|
@@ -178,22 +170,6 @@ const styles = stylex.create({
|
|
|
178
170
|
cursor: 'pointer',
|
|
179
171
|
// Match the avatar's circular shape so the focus ring hugs it.
|
|
180
172
|
borderRadius: radiusVars['--radius-full'],
|
|
181
|
-
outlineWidth: {
|
|
182
|
-
default: 0,
|
|
183
|
-
':focus-visible': 2,
|
|
184
|
-
},
|
|
185
|
-
outlineStyle: {
|
|
186
|
-
default: 'none',
|
|
187
|
-
':focus-visible': 'solid',
|
|
188
|
-
},
|
|
189
|
-
outlineColor: {
|
|
190
|
-
default: null,
|
|
191
|
-
':focus-visible': colorVars['--color-accent'],
|
|
192
|
-
},
|
|
193
|
-
outlineOffset: {
|
|
194
|
-
default: 0,
|
|
195
|
-
':focus-visible': 2,
|
|
196
|
-
},
|
|
197
173
|
},
|
|
198
174
|
});
|
|
199
175
|
|
|
@@ -205,13 +181,12 @@ const dynamicStyles = stylex.create({
|
|
|
205
181
|
width: size,
|
|
206
182
|
height: size,
|
|
207
183
|
}),
|
|
208
|
-
// Initials font size defaults to the proportional `size × ratio` scale
|
|
209
|
-
//
|
|
210
|
-
//
|
|
184
|
+
// Initials font size defaults to the proportional `size × ratio` scale. It's
|
|
185
|
+
// a StyleX dynamic style, so the value lands via a class (not an inline
|
|
186
|
+
// property) — a theme's `.astryx-avatar-fallback.<size>` rule in the theme
|
|
187
|
+
// layer overrides it per size tier, no internal var needed.
|
|
211
188
|
fontSize: (size: number) => ({
|
|
212
|
-
fontSize:
|
|
213
|
-
size * INITIALS_FONT_SIZE_RATIO
|
|
214
|
-
}px)`,
|
|
189
|
+
fontSize: `${size * INITIALS_FONT_SIZE_RATIO}px`,
|
|
215
190
|
}),
|
|
216
191
|
statusPosition: (size: number) => ({
|
|
217
192
|
bottom: size * CIRCLE_EDGE_OFFSET_RATIO,
|
|
@@ -337,6 +312,25 @@ export interface AvatarProps extends BaseProps<HTMLDivElement> {
|
|
|
337
312
|
onClick?: React.MouseEventHandler<HTMLElement>;
|
|
338
313
|
}
|
|
339
314
|
|
|
315
|
+
/**
|
|
316
|
+
* Reuse a single segmenter when the runtime supports Intl.Segmenter.
|
|
317
|
+
*/
|
|
318
|
+
const graphemeSegmenter =
|
|
319
|
+
typeof Intl.Segmenter === 'function'
|
|
320
|
+
? new Intl.Segmenter(undefined, {granularity: 'grapheme'})
|
|
321
|
+
: null;
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Return the first user-perceived character, with a code-point fallback.
|
|
325
|
+
*/
|
|
326
|
+
function firstGrapheme(word: string): string {
|
|
327
|
+
if (graphemeSegmenter) {
|
|
328
|
+
return [...graphemeSegmenter.segment(word)][0]?.segment ?? '';
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
return [...word][0] ?? '';
|
|
332
|
+
}
|
|
333
|
+
|
|
340
334
|
/**
|
|
341
335
|
* Generates initials from a name string.
|
|
342
336
|
* Takes the first letter of the first two words.
|
|
@@ -352,9 +346,11 @@ function getInitials(name: string): string {
|
|
|
352
346
|
return '';
|
|
353
347
|
}
|
|
354
348
|
if (words.length === 1) {
|
|
355
|
-
return words[0]
|
|
349
|
+
return firstGrapheme(words[0]).toUpperCase();
|
|
356
350
|
}
|
|
357
|
-
return (
|
|
351
|
+
return (
|
|
352
|
+
firstGrapheme(words[0]) + firstGrapheme(words[words.length - 1])
|
|
353
|
+
).toUpperCase();
|
|
358
354
|
}
|
|
359
355
|
|
|
360
356
|
/**
|
|
@@ -549,15 +545,22 @@ export function Avatar({
|
|
|
549
545
|
)}
|
|
550
546
|
{showInitials && (
|
|
551
547
|
<div
|
|
552
|
-
{...
|
|
553
|
-
|
|
554
|
-
|
|
548
|
+
{...mergeProps(
|
|
549
|
+
themeProps('avatar-fallback', {size: resolvedSize}),
|
|
550
|
+
stylex.props(
|
|
551
|
+
styles.fallback,
|
|
552
|
+
dynamicStyles.fontSize(numericSize),
|
|
553
|
+
),
|
|
555
554
|
)}>
|
|
556
555
|
{getInitials(name)}
|
|
557
556
|
</div>
|
|
558
557
|
)}
|
|
559
558
|
{showIcon && (
|
|
560
|
-
<div
|
|
559
|
+
<div
|
|
560
|
+
{...mergeProps(
|
|
561
|
+
themeProps('avatar-fallback', {size: resolvedSize}),
|
|
562
|
+
stylex.props(styles.fallback),
|
|
563
|
+
)}>
|
|
561
564
|
<DefaultIcon size={numericSize} />
|
|
562
565
|
</div>
|
|
563
566
|
)}
|
|
@@ -580,10 +583,9 @@ export function Avatar({
|
|
|
580
583
|
// `<a>`/`<button>` and the static `<div>` carry the exact same box.
|
|
581
584
|
const rootStylexProps = mergeProps(
|
|
582
585
|
themeProps('avatar', {size: resolvedSize}),
|
|
583
|
-
|
|
586
|
+
focusOutlineProps.focusVisible(
|
|
584
587
|
styles.wrapper,
|
|
585
588
|
isInteractive && styles.interactive,
|
|
586
|
-
!isInteractive && showTooltip && !avatarGroup && styles.focusable,
|
|
587
589
|
avatarGroup && groupStyles.ring,
|
|
588
590
|
avatarGroup && groupStyles.overlap,
|
|
589
591
|
avatarGroup && groupDynamicStyles.overlap(-avatarGroup.overlap),
|
|
@@ -26,6 +26,7 @@ import {mergeProps} from '../utils';
|
|
|
26
26
|
import {useAvatarGroup} from './AvatarGroupContext';
|
|
27
27
|
import type {BaseProps} from '../BaseProps';
|
|
28
28
|
import {themeProps} from '../utils/themeProps';
|
|
29
|
+
import {focusOutlineProps} from '../utils/focusOutline.stylex';
|
|
29
30
|
import {useTranslator} from '../i18n';
|
|
30
31
|
|
|
31
32
|
const BORDER_WIDTH = 2;
|
|
@@ -93,14 +94,6 @@ const styles = stylex.create({
|
|
|
93
94
|
':active': `linear-gradient(${colorVars['--color-overlay-pressed']}, ${colorVars['--color-overlay-pressed']}), linear-gradient(${colorVars['--color-neutral']}, ${colorVars['--color-neutral']})`,
|
|
94
95
|
},
|
|
95
96
|
// Focus ring via focus-visible
|
|
96
|
-
outline: {
|
|
97
|
-
default: 'none',
|
|
98
|
-
':focus-visible': `2px solid ${colorVars['--color-accent']}`,
|
|
99
|
-
},
|
|
100
|
-
outlineOffset: {
|
|
101
|
-
default: null,
|
|
102
|
-
':focus-visible': '2px',
|
|
103
|
-
},
|
|
104
97
|
},
|
|
105
98
|
overlap: {
|
|
106
99
|
marginInlineStart: 'var(--_avatar-group-overlap)',
|
|
@@ -170,7 +163,7 @@ export function AvatarGroupOverflow({
|
|
|
170
163
|
data-avatar-item=""
|
|
171
164
|
{...mergeProps(
|
|
172
165
|
themeProps('avatar-group-overflow'),
|
|
173
|
-
|
|
166
|
+
focusOutlineProps.focusVisible(
|
|
174
167
|
styles.base,
|
|
175
168
|
styles.button,
|
|
176
169
|
styles.overlap,
|
package/src/Banner/Banner.tsx
CHANGED
|
@@ -271,8 +271,9 @@ const styles = stylex.create({
|
|
|
271
271
|
borderEndStartRadius: radiusVars['--radius-container'],
|
|
272
272
|
borderEndEndRadius: radiusVars['--radius-container'],
|
|
273
273
|
},
|
|
274
|
+
// Applied to the chevron <Icon> itself (via `xstyle`) rather than a wrapper,
|
|
275
|
+
// so the element that rotates is the element a theme targets.
|
|
274
276
|
chevron: {
|
|
275
|
-
display: 'inline-flex',
|
|
276
277
|
transitionProperty: 'transform',
|
|
277
278
|
transitionDuration: {
|
|
278
279
|
default: durationVars['--duration-fast'],
|
|
@@ -484,13 +485,15 @@ export function Banner({
|
|
|
484
485
|
: t('@astryx.banner.expand')
|
|
485
486
|
}
|
|
486
487
|
icon={
|
|
487
|
-
<
|
|
488
|
-
|
|
488
|
+
<Icon
|
|
489
|
+
icon="chevronDown"
|
|
490
|
+
size="sm"
|
|
491
|
+
color="inherit"
|
|
492
|
+
xstyle={[
|
|
489
493
|
styles.chevron,
|
|
490
494
|
isExpanded && styles.chevronExpanded,
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
</span>
|
|
495
|
+
]}
|
|
496
|
+
/>
|
|
494
497
|
}
|
|
495
498
|
onClick={handleToggleExpand}
|
|
496
499
|
aria-expanded={isExpanded}
|
|
@@ -45,7 +45,7 @@ import type {LinkComponentType} from '../Link/types';
|
|
|
45
45
|
import {mergeProps, mergeRefs} from '../utils';
|
|
46
46
|
import type {BaseProps} from '../BaseProps';
|
|
47
47
|
import {themeProps} from '../utils/themeProps';
|
|
48
|
-
import {
|
|
48
|
+
import {Icon} from '../Icon';
|
|
49
49
|
import {usePopover} from '../Popover/usePopover';
|
|
50
50
|
import {useListFocus} from '../hooks/useListFocus';
|
|
51
51
|
import {useTypeahead} from '../hooks/useTypeahead';
|
|
@@ -196,6 +196,11 @@ const itemStyles = stylex.create({
|
|
|
196
196
|
display: 'flex',
|
|
197
197
|
alignItems: 'center',
|
|
198
198
|
flexShrink: 0,
|
|
199
|
+
// Sized off supporting text (12px) — exactly Icon's `xsm` box at the
|
|
200
|
+
// default type scale. Width/height stay on the token so the box and the
|
|
201
|
+
// glyph keep matching if a theme retunes the supporting step.
|
|
202
|
+
width: typeScaleVars['--text-supporting-size'],
|
|
203
|
+
height: typeScaleVars['--text-supporting-size'],
|
|
199
204
|
fontSize: typeScaleVars['--text-supporting-size'],
|
|
200
205
|
},
|
|
201
206
|
separator: {
|
|
@@ -507,8 +512,6 @@ function BreadcrumbMenuTrigger({
|
|
|
507
512
|
role: 'none',
|
|
508
513
|
});
|
|
509
514
|
|
|
510
|
-
const chevronDownIcon = useIcon('chevronDown');
|
|
511
|
-
|
|
512
515
|
const closeMenu = useCallback(() => {
|
|
513
516
|
popover.hide();
|
|
514
517
|
}, [popover]);
|
|
@@ -624,9 +627,16 @@ function BreadcrumbMenuTrigger({
|
|
|
624
627
|
isSupporting ? itemStyles.supportingLink : itemStyles.defaultLink,
|
|
625
628
|
)}>
|
|
626
629
|
{children}
|
|
627
|
-
<
|
|
628
|
-
|
|
629
|
-
|
|
630
|
+
<Icon
|
|
631
|
+
icon="chevronDown"
|
|
632
|
+
// 0.75rem — the 12px supporting-text box the bare glyph already
|
|
633
|
+
// rendered at; `itemStyles.chevron` keeps that box on the token.
|
|
634
|
+
size="xsm"
|
|
635
|
+
// The chevron reads as part of the link label, so it takes the
|
|
636
|
+
// trigger's link color rather than an icon color.
|
|
637
|
+
color="inherit"
|
|
638
|
+
xstyle={itemStyles.chevron}
|
|
639
|
+
/>
|
|
630
640
|
</button>
|
|
631
641
|
|
|
632
642
|
{popover.render(
|
package/src/Breadcrumbs/index.ts
CHANGED
|
@@ -37,6 +37,10 @@ export {
|
|
|
37
37
|
DropdownMenuItem as BreadcrumbMenuItem,
|
|
38
38
|
type DropdownMenuItemProps as BreadcrumbMenuItemProps,
|
|
39
39
|
} from '../DropdownMenu/DropdownMenuItem';
|
|
40
|
+
export {
|
|
41
|
+
DropdownMenuDivider as BreadcrumbMenuDivider,
|
|
42
|
+
type DropdownMenuDividerProps as BreadcrumbMenuDividerProps,
|
|
43
|
+
} from '../DropdownMenu/DropdownMenuDivider';
|
|
40
44
|
export {
|
|
41
45
|
DropdownMenuCheckboxItem as BreadcrumbMenuCheckboxItem,
|
|
42
46
|
type DropdownMenuCheckboxItemProps as BreadcrumbMenuCheckboxItemProps,
|
|
@@ -56,6 +60,6 @@ export {
|
|
|
56
60
|
export type {
|
|
57
61
|
DropdownMenuOption as BreadcrumbMenuOption,
|
|
58
62
|
DropdownMenuItemData as BreadcrumbMenuItemData,
|
|
59
|
-
|
|
63
|
+
DropdownMenuDividerData as BreadcrumbMenuDividerData,
|
|
60
64
|
DropdownMenuSection as BreadcrumbMenuSection,
|
|
61
65
|
} from '../DropdownMenu/DropdownMenu';
|