@astryxdesign/core 0.1.8 → 0.1.9-canary.09e9ddd
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 +100 -0
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +6 -2
- package/dist/AppShell/AppShellMobileContext.d.ts +8 -0
- package/dist/AppShell/AppShellMobileContext.d.ts.map +1 -1
- package/dist/Avatar/Avatar.d.ts +53 -3
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +203 -49
- package/dist/Avatar/AvatarStatusDot.d.ts +33 -5
- package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
- package/dist/Avatar/AvatarStatusDot.js +144 -19
- package/dist/AvatarGroup/AvatarGroup.d.ts +7 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +58 -6
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +1 -0
- package/dist/Banner/Banner.d.ts +9 -1
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +33 -4
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +31 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +208 -6
- package/dist/Breadcrumbs/index.d.ts +5 -0
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +9 -1
- package/dist/Button/Button.d.ts +8 -2
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +33 -4
- package/dist/ButtonGroup/ButtonGroup.d.ts +9 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +30 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +30 -2
- package/dist/Calendar/dayCellUtils.js +1 -1
- package/dist/Card/Card.d.ts +8 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +28 -2
- package/dist/Carousel/Carousel.d.ts +4 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +24 -4
- package/dist/Chat/ChatComposer.d.ts +8 -0
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +46 -7
- package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
- package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
- package/dist/Chat/ChatComposerDrawer.js +11 -1
- package/dist/Chat/ChatComposerInput.d.ts +20 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +36 -4
- package/dist/Chat/ChatContext.d.ts +33 -0
- package/dist/Chat/ChatContext.d.ts.map +1 -1
- package/dist/Chat/ChatContext.js +16 -2
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +1 -1
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +4 -4
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +4 -4
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +7 -1
- package/dist/Chat/ChatToolCalls.d.ts +5 -1
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +18 -9
- package/dist/Chat/index.d.ts +2 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/index.js +1 -1
- package/dist/Chat/useChatStreamScroll.d.ts +2 -1
- package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
- package/dist/Chat/useChatStreamScroll.js +22 -8
- package/dist/Chat/useSpeechRecognition.d.ts +0 -1
- package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
- package/dist/Chat/useSpeechRecognition.js +1 -1
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +2 -2
- package/dist/CheckboxInput/CheckboxInput.js +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +11 -1
- package/dist/Citation/Citation.d.ts +22 -1
- package/dist/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +20 -6
- package/dist/ClickableCard/ClickableCard.d.ts +9 -2
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +5 -2
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +9 -2
- package/dist/CommandPalette/CommandPalette.d.ts +1 -1
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +3 -1
- package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
- package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +6 -1
- package/dist/CommandPalette/CommandPaletteItem.js +1 -1
- package/dist/DateInput/DateInput.d.ts +55 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +28 -2
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +3 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +18 -3
- package/dist/Dialog/Dialog.d.ts +3 -0
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +57 -6
- package/dist/Dialog/DialogContext.d.ts +7 -0
- package/dist/Dialog/DialogContext.d.ts.map +1 -1
- package/dist/Dialog/DialogContext.js +2 -2
- package/dist/Dialog/DialogHeader.d.ts +5 -2
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +6 -1
- package/dist/Divider/Divider.js +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +1 -2
- package/dist/DropdownMenu/DropdownMenuItem.js +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
- package/dist/Field/Field.d.ts.map +1 -1
- package/dist/Field/Field.js +2 -3
- package/dist/Field/FieldLabel.d.ts +1 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +43 -16
- package/dist/FieldStatus/FieldStatus.d.ts +15 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +58 -6
- package/dist/FileInput/FileInput.d.ts +9 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +42 -20
- package/dist/HoverCard/HoverCard.d.ts +9 -1
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +2 -0
- package/dist/HoverCard/useHoverCard.d.ts +8 -0
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +7 -2
- package/dist/Icon/Icon.d.ts +7 -2
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Item/Item.d.ts +6 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +22 -1
- package/dist/Layer/useLayer.d.ts +6 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +2 -0
- package/dist/Lightbox/Lightbox.js +4 -4
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +6 -1
- package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
- package/dist/MobileNav/MobileNavToggle.js +4 -0
- package/dist/MultiSelector/MultiSelector.d.ts +9 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +41 -12
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +16 -0
- package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
- package/dist/NumberInput/NumberInput.d.ts +9 -2
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +8 -1
- package/dist/Outline/Outline.d.ts +0 -1
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +0 -1
- package/dist/OverflowList/OverflowList.d.ts +20 -3
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +29 -4
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +11 -3
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +3 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +3 -9
- package/dist/PowerSearch/PowerSearch.d.ts +9 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +2 -0
- package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.d.ts +9 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +16 -13
- package/dist/Selector/Selector.d.ts +8 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +7 -3
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +16 -0
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +21 -8
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +19 -2
- package/dist/Stack/stack.stylex.d.ts +9 -9
- package/dist/TabList/Tab.js +2 -2
- package/dist/TabList/TabMenu.js +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +3 -2
- package/dist/Table/TableCell.js +3 -3
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/index.d.ts +2 -0
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
- package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/index.js +3 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +4 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +87 -0
- package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
- package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -3
- package/dist/TextArea/TextArea.d.ts +9 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +2 -0
- package/dist/TextInput/TextInput.d.ts +9 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +6 -1
- package/dist/Thumbnail/Thumbnail.d.ts +26 -5
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +97 -54
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
- package/dist/TimeInput/TimeInput.d.ts +9 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +17 -4
- package/dist/Timestamp/Timestamp.d.ts +3 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +8 -6
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +2 -5
- package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
- package/dist/Tokenizer/Tokenizer.d.ts +10 -3
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +18 -4
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +18 -8
- package/dist/TopNav/TopNavMegaMenu.js +10 -4
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
- package/dist/TopNav/TopNavMenu.d.ts +2 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +68 -6
- package/dist/TreeList/TreeList.d.ts +12 -3
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +2 -0
- package/dist/TreeList/TreeListBranches.d.ts +5 -0
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +10 -4
- package/dist/TreeList/TreeListItem.d.ts +8 -2
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +28 -8
- package/dist/TreeList/TreeListTypes.d.ts +25 -1
- package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
- package/dist/TreeList/index.d.ts +2 -2
- package/dist/TreeList/index.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +20 -11
- package/dist/Typeahead/Typeahead.d.ts +9 -2
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +2 -0
- package/dist/astryx.css +41 -31
- package/dist/astryx.umd.js +51 -51
- package/dist/astryx.umd.js.map +4 -4
- package/dist/authoring/doc.d.ts.map +1 -1
- package/dist/docs-types.d.ts +8 -0
- package/dist/docs-types.d.ts.map +1 -1
- package/dist/hooks/computeOverflow.d.ts +47 -0
- package/dist/hooks/computeOverflow.d.ts.map +1 -0
- package/dist/hooks/computeOverflow.js +213 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -1
- package/dist/hooks/isRtlElement.d.ts +18 -0
- package/dist/hooks/isRtlElement.d.ts.map +1 -0
- package/dist/hooks/isRtlElement.js +27 -0
- package/dist/hooks/useDevWarning.d.ts +18 -0
- package/dist/hooks/useDevWarning.d.ts.map +1 -0
- package/dist/hooks/useDevWarning.js +49 -0
- package/dist/hooks/useGridFocus.d.ts +6 -1
- package/dist/hooks/useGridFocus.d.ts.map +1 -1
- package/dist/hooks/useGridFocus.js +12 -9
- package/dist/hooks/useListFocus.d.ts +6 -1
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useListFocus.js +12 -4
- package/dist/hooks/useOverflow.d.ts +19 -0
- package/dist/hooks/useOverflow.d.ts.map +1 -1
- package/dist/hooks/useOverflow.js +36 -25
- package/dist/i18n/InternationalizationContext.d.ts +1 -0
- package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
- package/dist/i18n/InternationalizationContext.js +3 -0
- package/dist/i18n/InternationalizationProvider.d.ts +8 -1
- package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
- package/dist/i18n/InternationalizationProvider.js +5 -1
- package/dist/i18n/getLocaleDirection.d.ts +18 -0
- package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
- package/dist/i18n/getLocaleDirection.js +29 -0
- package/dist/i18n/index.d.ts +6 -0
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +7 -1
- package/dist/i18n/resolve.d.ts.map +1 -1
- package/dist/i18n/resolve.js +7 -18
- package/dist/i18n/useDirection.d.ts +2 -0
- package/dist/i18n/useDirection.d.ts.map +1 -0
- package/dist/i18n/useDirection.js +27 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +2 -7
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +13 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +51 -0
- package/dist/theme/hct.d.ts +0 -1
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
- package/dist/utils/devWarning.d.ts +42 -0
- package/dist/utils/devWarning.d.ts.map +1 -0
- package/dist/utils/devWarning.js +88 -0
- package/dist/utils/index.d.ts +3 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -2
- package/dist/utils/plainDate.d.ts +30 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +53 -0
- package/dist/utils/types.d.ts +13 -0
- package/dist/utils/types.d.ts.map +1 -1
- package/locales/en.json +32 -0
- package/locales/fr-FR.json +14 -0
- package/locales/pseudo.json +24 -0
- package/package.json +1 -1
- package/src/AppShell/AppShell.tsx +6 -0
- package/src/AppShell/AppShellMobileContext.tsx +8 -0
- package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
- package/src/Avatar/Avatar.doc.mjs +60 -3
- package/src/Avatar/Avatar.test.tsx +281 -1
- package/src/Avatar/Avatar.tsx +324 -64
- package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
- package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
- package/src/Avatar/AvatarStatusDot.tsx +178 -21
- package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
- package/src/AvatarGroup/AvatarGroup.test.tsx +125 -0
- package/src/AvatarGroup/AvatarGroup.tsx +58 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
- package/src/Banner/Banner.doc.mjs +9 -0
- package/src/Banner/Banner.test.tsx +30 -0
- package/src/Banner/Banner.tsx +53 -9
- package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
- package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
- package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +284 -2
- package/src/Breadcrumbs/index.ts +27 -0
- package/src/Button/Button.doc.mjs +9 -4
- package/src/Button/Button.test.tsx +49 -0
- package/src/Button/Button.tsx +27 -3
- package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
- package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
- package/src/ButtonGroup/ButtonGroup.tsx +32 -0
- package/src/Calendar/Calendar.doc.mjs +12 -1
- package/src/Calendar/Calendar.test.tsx +193 -0
- package/src/Calendar/Calendar.tsx +38 -16
- package/src/Calendar/dayCellUtils.test.ts +5 -0
- package/src/Calendar/dayCellUtils.ts +1 -1
- package/src/Card/Card.doc.mjs +9 -0
- package/src/Card/Card.test.tsx +21 -3
- package/src/Card/Card.tsx +35 -2
- package/src/Carousel/Carousel.doc.mjs +1 -0
- package/src/Carousel/Carousel.test.tsx +53 -0
- package/src/Carousel/Carousel.tsx +34 -4
- package/src/Chat/ChatComposer.doc.mjs +12 -3
- package/src/Chat/ChatComposer.test.tsx +115 -0
- package/src/Chat/ChatComposer.tsx +73 -9
- package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
- package/src/Chat/ChatComposerDrawer.tsx +11 -1
- package/src/Chat/ChatComposerInput.doc.mjs +7 -0
- package/src/Chat/ChatComposerInput.test.tsx +103 -0
- package/src/Chat/ChatComposerInput.tsx +51 -5
- package/src/Chat/ChatContext.tsx +37 -10
- package/src/Chat/ChatDictationButton.tsx +4 -1
- package/src/Chat/ChatLayout.tsx +7 -5
- package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
- package/src/Chat/ChatMessageMetadata.tsx +1 -2
- package/src/Chat/ChatSendButton.tsx +11 -1
- package/src/Chat/ChatToolCalls.test.tsx +64 -0
- package/src/Chat/ChatToolCalls.tsx +25 -4
- package/src/Chat/index.ts +5 -1
- package/src/Chat/useChatStreamScroll.test.tsx +49 -0
- package/src/Chat/useChatStreamScroll.ts +27 -10
- package/src/Chat/useSpeechRecognition.ts +1 -1
- package/src/Chat/useTriggerMenu.tsx +4 -2
- package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
- package/src/CheckboxInput/CheckboxInput.tsx +1 -1
- package/src/CheckboxList/CheckboxList.test.tsx +81 -3
- package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
- package/src/CheckboxList/CheckboxListItem.tsx +41 -5
- package/src/Citation/Citation.doc.mjs +4 -3
- package/src/Citation/Citation.test.tsx +97 -0
- package/src/Citation/Citation.tsx +43 -11
- package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
- package/src/ClickableCard/ClickableCard.test.tsx +34 -0
- package/src/ClickableCard/ClickableCard.tsx +13 -3
- package/src/CodeBlock/CodeBlock.test.tsx +56 -0
- package/src/CodeBlock/CodeBlock.tsx +10 -2
- package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
- package/src/CommandPalette/CommandPalette.tsx +3 -1
- package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
- package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
- package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
- package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
- package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
- package/src/ContextMenu/ContextMenu.test.tsx +193 -0
- package/src/DateInput/DateInput.doc.mjs +31 -0
- package/src/DateInput/DateInput.test.tsx +131 -0
- package/src/DateInput/DateInput.tsx +78 -3
- package/src/DateInput/index.ts +1 -0
- package/src/DateRangeInput/DateRangeInput.doc.mjs +8 -0
- package/src/DateRangeInput/DateRangeInput.test.tsx +23 -0
- package/src/DateRangeInput/DateRangeInput.tsx +13 -3
- package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -1
- package/src/DateTimeInput/DateTimeInput.test.tsx +147 -0
- package/src/DateTimeInput/DateTimeInput.tsx +42 -18
- package/src/Dialog/Dialog.doc.mjs +2 -2
- package/src/Dialog/Dialog.test.tsx +77 -4
- package/src/Dialog/Dialog.tsx +89 -5
- package/src/Dialog/DialogContext.ts +9 -2
- package/src/Dialog/DialogHeader.doc.mjs +2 -2
- package/src/Dialog/DialogHeader.tsx +9 -2
- package/src/Divider/Divider.tsx +2 -2
- package/src/DropdownMenu/DropdownMenu.test.tsx +169 -0
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +1 -2
- package/src/DropdownMenu/DropdownMenuItem.tsx +1 -1
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
- package/src/Field/Field.test.tsx +57 -12
- package/src/Field/Field.tsx +6 -5
- package/src/Field/FieldLabel.tsx +9 -1
- package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
- package/src/FieldStatus/FieldStatus.test.tsx +150 -40
- package/src/FieldStatus/FieldStatus.tsx +63 -5
- package/src/FileInput/FileInput.doc.mjs +17 -2
- package/src/FileInput/FileInput.test.tsx +135 -12
- package/src/FileInput/FileInput.tsx +53 -28
- package/src/HoverCard/HoverCard.doc.mjs +13 -0
- package/src/HoverCard/HoverCard.test.tsx +21 -2
- package/src/HoverCard/HoverCard.tsx +11 -0
- package/src/HoverCard/useHoverCard.doc.mjs +2 -0
- package/src/HoverCard/useHoverCard.tsx +24 -2
- package/src/Icon/Icon.doc.mjs +3 -2
- package/src/Icon/Icon.tsx +7 -2
- package/src/IconButton/IconButton.doc.mjs +8 -0
- package/src/IconButton/IconButton.test.tsx +15 -18
- package/src/Item/Item.test.tsx +40 -18
- package/src/Item/Item.tsx +38 -2
- package/src/Layer/useLayer.tsx +8 -0
- package/src/Lightbox/Lightbox.tsx +4 -4
- package/src/List/List.test.tsx +9 -8
- package/src/MobileNav/MobileNav.tsx +12 -1
- package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
- package/src/MobileNav/MobileNavToggle.tsx +9 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +13 -2
- package/src/MultiSelector/MultiSelector.test.tsx +195 -3
- package/src/MultiSelector/MultiSelector.tsx +65 -12
- package/src/MultiSelector/hooks.ts +17 -0
- package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
- package/src/NumberInput/NumberInput.doc.mjs +15 -0
- package/src/NumberInput/NumberInput.test.tsx +82 -7
- package/src/NumberInput/NumberInput.tsx +21 -4
- package/src/Outline/Outline.tsx +0 -1
- package/src/OverflowList/OverflowList.doc.mjs +39 -6
- package/src/OverflowList/OverflowList.test.tsx +111 -0
- package/src/OverflowList/OverflowList.tsx +48 -8
- package/src/Pagination/Pagination.tsx +11 -3
- package/src/Popover/Popover.tsx +7 -4
- package/src/Popover/usePopover.tsx +9 -13
- package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
- package/src/PowerSearch/PowerSearch.test.tsx +43 -0
- package/src/PowerSearch/PowerSearch.tsx +10 -1
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
- package/src/PowerSearch/usePowerSearchSource.ts +1 -2
- package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
- package/src/SelectableCard/SelectableCard.test.tsx +46 -4
- package/src/SelectableCard/SelectableCard.tsx +29 -16
- package/src/Selector/Selector.doc.mjs +7 -0
- package/src/Selector/Selector.test.tsx +92 -0
- package/src/Selector/Selector.tsx +16 -2
- package/src/Selector/hooks.ts +17 -0
- package/src/SideNav/SideNav.test.tsx +119 -3
- package/src/SideNav/SideNavCollapseButton.tsx +6 -1
- package/src/SideNav/SideNavHeading.tsx +24 -8
- package/src/SideNav/SideNavItem.tsx +5 -1
- package/src/Slider/Slider.test.tsx +75 -2
- package/src/Slider/Slider.tsx +21 -5
- package/src/Switch/Switch.test.tsx +32 -1
- package/src/TabList/Tab.tsx +2 -2
- package/src/TabList/TabMenu.tsx +2 -2
- package/src/Table/BaseTable.tsx +3 -5
- package/src/Table/TableCell.tsx +3 -3
- package/src/Table/TableHeaderCell.tsx +3 -3
- package/src/Table/index.ts +5 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +6 -2
- package/src/Table/plugins/rowStatus/index.ts +7 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
- package/src/Table/plugins/selection/useTableSelection.test.tsx +16 -0
- package/src/Table/plugins/selection/useTableSelection.tsx +19 -1
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
- package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
- package/src/Table/plugins/tree/useTableTreeData.tsx +128 -1
- package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
- package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
- package/src/Table/useBaseTablePlugins.ts +10 -6
- package/src/Table/useTableRowStatus.doc.mjs +30 -0
- package/src/Table/useTableSelection.doc.mjs +65 -14
- package/src/Table/useTableTreeData.doc.mjs +29 -0
- package/src/Table/useTableTreeState.doc.mjs +2 -2
- package/src/TextArea/TextArea.doc.mjs +15 -0
- package/src/TextArea/TextArea.test.tsx +32 -1
- package/src/TextArea/TextArea.tsx +10 -0
- package/src/TextInput/TextInput.doc.mjs +15 -0
- package/src/TextInput/TextInput.test.tsx +44 -0
- package/src/TextInput/TextInput.tsx +13 -1
- package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
- package/src/Thumbnail/Thumbnail.test.tsx +98 -7
- package/src/Thumbnail/Thumbnail.tsx +142 -42
- package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
- package/src/TimeInput/TimeInput.doc.mjs +15 -0
- package/src/TimeInput/TimeInput.test.tsx +99 -1
- package/src/TimeInput/TimeInput.tsx +29 -6
- package/src/Timestamp/Timestamp.doc.mjs +4 -4
- package/src/Timestamp/Timestamp.test.tsx +32 -0
- package/src/Timestamp/Timestamp.tsx +28 -8
- package/src/Toast/useToast.tsx +7 -8
- package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +30 -1
- package/src/Tokenizer/Tokenizer.test.tsx +206 -2
- package/src/Tokenizer/Tokenizer.tsx +26 -4
- package/src/TopNav/TopNav.test.tsx +125 -1
- package/src/TopNav/TopNavHeading.tsx +24 -8
- package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
- package/src/TopNav/TopNavMegaMenu.tsx +10 -4
- package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
- package/src/TopNav/TopNavMenu.test.tsx +118 -4
- package/src/TopNav/TopNavMenu.tsx +83 -5
- package/src/TreeList/TreeList.doc.mjs +22 -0
- package/src/TreeList/TreeList.test.tsx +232 -0
- package/src/TreeList/TreeList.tsx +18 -2
- package/src/TreeList/TreeListBranches.tsx +16 -2
- package/src/TreeList/TreeListItem.tsx +52 -12
- package/src/TreeList/TreeListTypes.ts +27 -1
- package/src/TreeList/index.ts +2 -2
- package/src/Typeahead/BaseTypeahead.tsx +30 -15
- package/src/Typeahead/Typeahead.doc.mjs +7 -0
- package/src/Typeahead/Typeahead.test.tsx +50 -0
- package/src/Typeahead/Typeahead.tsx +10 -0
- package/src/authoring/doc.ts +1 -3
- package/src/docs-types.ts +5 -0
- package/src/hooks/computeOverflow.test.ts +422 -0
- package/src/hooks/computeOverflow.ts +290 -0
- package/src/hooks/index.ts +2 -0
- package/src/hooks/isRtlElement.ts +27 -0
- package/src/hooks/useDevWarning.test.tsx +45 -0
- package/src/hooks/useDevWarning.ts +54 -0
- package/src/hooks/useGridFocus.doc.mjs +3 -3
- package/src/hooks/useGridFocus.test.tsx +41 -0
- package/src/hooks/useGridFocus.ts +21 -10
- package/src/hooks/useListFocus.doc.mjs +3 -3
- package/src/hooks/useListFocus.test.tsx +67 -1
- package/src/hooks/useListFocus.ts +21 -5
- package/src/hooks/useOverflow.test.ts +96 -4
- package/src/hooks/useOverflow.ts +74 -33
- package/src/i18n/InternationalizationContext.ts +4 -0
- package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
- package/src/i18n/InternationalizationProvider.tsx +12 -2
- package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
- package/src/i18n/__tests__/useDirection.test.tsx +66 -0
- package/src/i18n/getLocaleDirection.ts +29 -0
- package/src/i18n/index.ts +6 -0
- package/src/i18n/resolve.ts +9 -21
- package/src/i18n/useDirection.ts +29 -0
- package/src/reset.css +0 -26
- package/src/reset.test.ts +60 -0
- package/src/theme/Theme.tsx +11 -14
- package/src/theme/derivedVarRegistry.test.ts +1 -0
- package/src/theme/derivedVarRegistry.ts +6 -0
- package/src/theme/generateThemeRules.test.ts +107 -0
- package/src/theme/generateThemeRules.ts +56 -0
- package/src/theme/hct.ts +1 -1
- package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
- package/src/utils/devWarning.test.ts +56 -0
- package/src/utils/devWarning.ts +102 -0
- package/src/utils/index.ts +6 -0
- package/src/utils/plainDate.test.ts +22 -0
- package/src/utils/plainDate.ts +61 -0
- package/src/utils/types.ts +14 -0
package/src/Avatar/Avatar.tsx
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file Avatar.tsx
|
|
7
|
-
* @input Uses React, HTMLAttributes, ReactNode, useState
|
|
7
|
+
* @input Uses React, HTMLAttributes, ReactNode, useState; useTooltip
|
|
8
|
+
* (Tooltip hook) for the optional name-on-hover tooltip
|
|
8
9
|
* @output Exports Avatar component, AvatarProps, AvatarSize types
|
|
9
10
|
* @position Core implementation; consumed by index.ts
|
|
10
11
|
*
|
|
@@ -13,6 +14,8 @@
|
|
|
13
14
|
* - /packages/core/src/Avatar/index.ts (exports if types change)
|
|
14
15
|
* - /apps/storybook/stories/Avatar.stories.tsx (storybook stories)
|
|
15
16
|
* - /packages/cli/templates/blocks/components/Avatar/ (showcase blocks)
|
|
17
|
+
*
|
|
18
|
+
* Last synced props: alt, fallbackSrc, name, size, src, status, href, as, target, rel, onClick
|
|
16
19
|
*/
|
|
17
20
|
|
|
18
21
|
import {useMemo, useState, type ReactNode} from 'react';
|
|
@@ -26,8 +29,11 @@ import {
|
|
|
26
29
|
} from '../theme/tokens.stylex';
|
|
27
30
|
import {AvatarSizeContext} from './AvatarSizeContext';
|
|
28
31
|
import {useAvatarGroup} from '../AvatarGroup/AvatarGroupContext';
|
|
29
|
-
import {mergeProps} from '../utils';
|
|
32
|
+
import {mergeProps, mergeRefs} from '../utils';
|
|
30
33
|
import {themeProps} from '../utils/themeProps';
|
|
34
|
+
import {useTooltip} from '../Tooltip/useTooltip';
|
|
35
|
+
import {useLinkComponent} from '../Link/useLinkComponent';
|
|
36
|
+
import type {LinkComponentType} from '../Link/types';
|
|
31
37
|
|
|
32
38
|
/**
|
|
33
39
|
* The offset ratio for positioning elements on a circle's edge at 45°.
|
|
@@ -59,7 +65,7 @@ const INITIALS_FONT_SIZE_RATIO = 0.4;
|
|
|
59
65
|
*
|
|
60
66
|
* Avatar uses the same abbreviated scale as Icon (`xsm`/`sm`/`md`/`lg`/`xl`),
|
|
61
67
|
* but the values are larger because avatars align with media rather than
|
|
62
|
-
* glyphs. The tiers
|
|
68
|
+
* glyphs. The tiers follow the standard avatar size scale.
|
|
63
69
|
*/
|
|
64
70
|
type AvatarNamedSize = 'xsm' | 'sm' | 'md' | 'lg' | 'xl';
|
|
65
71
|
|
|
@@ -104,6 +110,11 @@ const styles = stylex.create({
|
|
|
104
110
|
position: 'relative',
|
|
105
111
|
display: 'inline-flex',
|
|
106
112
|
flexShrink: 0,
|
|
113
|
+
// The wrapper is not clipped (so the status dot can overflow), so it must be
|
|
114
|
+
// rounded itself: a themed fallback background lands on `.astryx-avatar` (the
|
|
115
|
+
// class-bearing wrapper) as well as the internal var, and an unrounded
|
|
116
|
+
// wrapper would show that fill as square corners behind the circular content.
|
|
117
|
+
borderRadius: radiusVars['--radius-full'],
|
|
107
118
|
},
|
|
108
119
|
content: {
|
|
109
120
|
display: 'flex',
|
|
@@ -124,15 +135,65 @@ const styles = stylex.create({
|
|
|
124
135
|
justifyContent: 'center',
|
|
125
136
|
width: '100%',
|
|
126
137
|
height: '100%',
|
|
127
|
-
|
|
128
|
-
|
|
138
|
+
// Fallback surface (initials + default icon). Each property reads an
|
|
139
|
+
// Avatar-scoped internal var so a theme can re-scope the fallback wash and
|
|
140
|
+
// initials weight/color without forking; the defaults reproduce today's
|
|
141
|
+
// exact output. See derivedVarRegistry (avatar) + Avatar.doc.mjs theming.
|
|
142
|
+
backgroundColor: `var(--_avatar-fallback-background, ${colorVars['--color-neutral']})`,
|
|
143
|
+
color: `var(--_avatar-fallback-color, ${colorVars['--color-text-secondary']})`,
|
|
129
144
|
fontFamily: typographyVars['--font-family-body'],
|
|
130
|
-
fontWeight: fontWeightVars['--font-weight-medium']
|
|
145
|
+
fontWeight: `var(--_avatar-fallback-font-weight, ${fontWeightVars['--font-weight-medium']})`,
|
|
131
146
|
textTransform: 'uppercase',
|
|
132
147
|
},
|
|
133
148
|
status: {
|
|
134
149
|
position: 'absolute',
|
|
135
150
|
},
|
|
151
|
+
// Visible focus ring for the name-tooltip tab stop, matching the repo-wide
|
|
152
|
+
// focus-visible outline treatment (see Timestamp, Token, Thumbnail). Only
|
|
153
|
+
// applied when a tooltip is active so keyboard users can reveal it.
|
|
154
|
+
focusable: {
|
|
155
|
+
outline: {
|
|
156
|
+
default: null,
|
|
157
|
+
':focus-visible': `2px solid ${colorVars['--color-accent']}`,
|
|
158
|
+
},
|
|
159
|
+
outlineOffset: {
|
|
160
|
+
default: '0',
|
|
161
|
+
':focus-visible': '2px',
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
// Reset the intrinsic styling of the interactive element (<a>/<button>) so it
|
|
165
|
+
// is a transparent, correctly-sized wrapper around the avatar visuals. The
|
|
166
|
+
// element carries the focus-visible accent ring for keyboard users.
|
|
167
|
+
interactive: {
|
|
168
|
+
appearance: 'none',
|
|
169
|
+
padding: 0,
|
|
170
|
+
margin: 0,
|
|
171
|
+
borderWidth: 0,
|
|
172
|
+
borderStyle: 'none',
|
|
173
|
+
backgroundColor: 'transparent',
|
|
174
|
+
color: 'inherit',
|
|
175
|
+
font: 'inherit',
|
|
176
|
+
textDecoration: 'none',
|
|
177
|
+
cursor: 'pointer',
|
|
178
|
+
// Match the avatar's circular shape so the focus ring hugs it.
|
|
179
|
+
borderRadius: radiusVars['--radius-full'],
|
|
180
|
+
outlineWidth: {
|
|
181
|
+
default: 0,
|
|
182
|
+
':focus-visible': 2,
|
|
183
|
+
},
|
|
184
|
+
outlineStyle: {
|
|
185
|
+
default: 'none',
|
|
186
|
+
':focus-visible': 'solid',
|
|
187
|
+
},
|
|
188
|
+
outlineColor: {
|
|
189
|
+
default: null,
|
|
190
|
+
':focus-visible': colorVars['--color-accent'],
|
|
191
|
+
},
|
|
192
|
+
outlineOffset: {
|
|
193
|
+
default: 0,
|
|
194
|
+
':focus-visible': 2,
|
|
195
|
+
},
|
|
196
|
+
},
|
|
136
197
|
});
|
|
137
198
|
|
|
138
199
|
/**
|
|
@@ -143,8 +204,13 @@ const dynamicStyles = stylex.create({
|
|
|
143
204
|
width: size,
|
|
144
205
|
height: size,
|
|
145
206
|
}),
|
|
207
|
+
// Initials font size defaults to the proportional `size × ratio` scale but is
|
|
208
|
+
// reachable via the `--_avatar-fallback-font-size` derived var, so a theme can
|
|
209
|
+
// set a per-size type scale (e.g. `components.avatar['size:sm']`).
|
|
146
210
|
fontSize: (size: number) => ({
|
|
147
|
-
fontSize: size
|
|
211
|
+
fontSize: `var(--_avatar-fallback-font-size, ${
|
|
212
|
+
size * INITIALS_FONT_SIZE_RATIO
|
|
213
|
+
}px)`,
|
|
148
214
|
}),
|
|
149
215
|
statusPosition: (size: number) => ({
|
|
150
216
|
bottom: size * CIRCLE_EDGE_OFFSET_RATIO,
|
|
@@ -216,6 +282,48 @@ export interface AvatarProps extends BaseProps<HTMLDivElement> {
|
|
|
216
282
|
* Typically used for status indicators or badges.
|
|
217
283
|
*/
|
|
218
284
|
status?: ReactNode;
|
|
285
|
+
/**
|
|
286
|
+
* Tooltip shown on hover (and keyboard focus).
|
|
287
|
+
* - omitted / `true`: show the avatar's `name`
|
|
288
|
+
* - a string: show that text instead
|
|
289
|
+
* - `false`: no tooltip
|
|
290
|
+
*
|
|
291
|
+
* The avatar owns this tooltip. It is NOT auto-disabled when wrapped in your
|
|
292
|
+
* own Tooltip/HoverCard — set `tooltip={false}` if you provide your own
|
|
293
|
+
* overlay. No tooltip is shown if `tooltip` is `true`/omitted and there is
|
|
294
|
+
* no (non-whitespace) `name`.
|
|
295
|
+
* @default true
|
|
296
|
+
*/
|
|
297
|
+
tooltip?: string | boolean;
|
|
298
|
+
/**
|
|
299
|
+
* When provided, the avatar becomes an interactive link (`<a>` or custom
|
|
300
|
+
* link component) pointing at `href`. Follows the same element-swap rules as
|
|
301
|
+
* Button: `href` renders a link, otherwise `onClick` renders a
|
|
302
|
+
* `<button type="button">`, otherwise the avatar stays a static (non-focusable)
|
|
303
|
+
* element. An interactive avatar requires a meaningful accessible name via
|
|
304
|
+
* `alt` or `name`.
|
|
305
|
+
*/
|
|
306
|
+
href?: string;
|
|
307
|
+
/**
|
|
308
|
+
* Custom link component to use when `href` is provided. Overrides the
|
|
309
|
+
* provider-level default set by LinkProvider. Useful for Next.js `<Link>` or
|
|
310
|
+
* other router-aware components. Only applies when `href` is provided.
|
|
311
|
+
*/
|
|
312
|
+
as?: LinkComponentType;
|
|
313
|
+
/**
|
|
314
|
+
* HTML target attribute for the link. Only applies when `href` is provided.
|
|
315
|
+
*/
|
|
316
|
+
target?: string;
|
|
317
|
+
/**
|
|
318
|
+
* HTML rel attribute for the link. Only applies when `href` is provided.
|
|
319
|
+
*/
|
|
320
|
+
rel?: string;
|
|
321
|
+
/**
|
|
322
|
+
* Click handler. When provided without `href`, renders the avatar as a
|
|
323
|
+
* focusable `<button type="button">`. An interactive avatar requires a
|
|
324
|
+
* meaningful accessible name via `alt` or `name`.
|
|
325
|
+
*/
|
|
326
|
+
onClick?: React.MouseEventHandler<HTMLElement>;
|
|
219
327
|
}
|
|
220
328
|
|
|
221
329
|
/**
|
|
@@ -265,6 +373,10 @@ function DefaultIcon({size}: {size: number}) {
|
|
|
265
373
|
* <Avatar src="/user.jpg" name="John Doe" />
|
|
266
374
|
* <Avatar name="Jane Smith" size="xl" />
|
|
267
375
|
* <Avatar src="/user.jpg" status={<OnlineIndicator />} />
|
|
376
|
+
* <Avatar name="jsmith" tooltip="Jane Smith, Staff Engineer" />
|
|
377
|
+
* <Avatar name="Jane" tooltip={false} />
|
|
378
|
+
* <Avatar src="/user.jpg" name="John Doe" href="/users/john" />
|
|
379
|
+
* <Avatar src="/user.jpg" name="John Doe" onClick={() => openProfile()} />
|
|
268
380
|
* ```
|
|
269
381
|
*/
|
|
270
382
|
export function Avatar({
|
|
@@ -275,6 +387,12 @@ export function Avatar({
|
|
|
275
387
|
size = 'md',
|
|
276
388
|
src,
|
|
277
389
|
status,
|
|
390
|
+
tooltip = true,
|
|
391
|
+
href,
|
|
392
|
+
as,
|
|
393
|
+
target,
|
|
394
|
+
rel,
|
|
395
|
+
onClick,
|
|
278
396
|
xstyle,
|
|
279
397
|
className,
|
|
280
398
|
style,
|
|
@@ -303,70 +421,212 @@ export function Avatar({
|
|
|
303
421
|
const resolvedSize = avatarGroup?.size ?? size;
|
|
304
422
|
const numericSize = useMemo(() => resolveSize(resolvedSize), [resolvedSize]);
|
|
305
423
|
|
|
306
|
-
|
|
307
|
-
|
|
424
|
+
// Resolve the tooltip content:
|
|
425
|
+
// - `false` → no tooltip
|
|
426
|
+
// - a string → that string
|
|
427
|
+
// - `true` / omitted → the `name` (a whitespace-only name yields nothing)
|
|
428
|
+
// Note: the *visible* tooltip prefers `name` (not `alt`); the *accessible
|
|
429
|
+
// name* on the root still uses `alt || name` above, independent of this.
|
|
430
|
+
const tooltipContent =
|
|
431
|
+
tooltip === false
|
|
432
|
+
? undefined
|
|
433
|
+
: typeof tooltip === 'string'
|
|
434
|
+
? tooltip
|
|
435
|
+
: name;
|
|
436
|
+
const trimmedTooltip = tooltipContent?.trim();
|
|
437
|
+
const showTooltip = trimmedTooltip != null && trimmedTooltip !== '';
|
|
438
|
+
// Whether the tooltip text is a consumer-authored override (a custom string)
|
|
439
|
+
// rather than the default name. A custom description is worth wiring to
|
|
440
|
+
// `aria-describedby` (it adds information, matching Button); the default name
|
|
441
|
+
// tooltip is visual-only — its text duplicates the root `aria-label`, so
|
|
442
|
+
// describing it too would double-announce the same name (OQ-4).
|
|
443
|
+
const isCustomTooltip = typeof tooltip === 'string';
|
|
444
|
+
|
|
445
|
+
// Own the name tooltip via the Tooltip hook (the Button pattern), which
|
|
446
|
+
// returns `describedBy` as a value we choose whether to apply — the only way
|
|
447
|
+
// to satisfy the per-case aria-describedby rule (default name: none; custom
|
|
448
|
+
// string: describe) without editing Tooltip. `focusTrigger: 'auto'` shows the
|
|
449
|
+
// tooltip on keyboard focus once the root is focusable (natively for the
|
|
450
|
+
// interactive <a>/<button>, or via an explicit tab stop on the static div).
|
|
451
|
+
const tooltipHook = useTooltip({
|
|
452
|
+
placement: 'above',
|
|
453
|
+
isEnabled: showTooltip,
|
|
454
|
+
});
|
|
455
|
+
// The tooltip ref attaches to whichever root element renders (static or
|
|
456
|
+
// interactive), so the tooltip works for link/button avatars too.
|
|
457
|
+
const rootRef = mergeRefs(ref, showTooltip ? tooltipHook.ref : undefined);
|
|
458
|
+
const describedByProp =
|
|
459
|
+
showTooltip && isCustomTooltip
|
|
460
|
+
? {
|
|
461
|
+
'aria-describedby':
|
|
462
|
+
[props['aria-describedby'], tooltipHook.describedBy]
|
|
463
|
+
.filter(Boolean)
|
|
464
|
+
.join(' ') || undefined,
|
|
465
|
+
}
|
|
466
|
+
: null;
|
|
467
|
+
|
|
468
|
+
// Element-swap trichotomy, copied from Button: `href` renders a link,
|
|
469
|
+
// otherwise `onClick` renders a `<button>`, otherwise today's static element
|
|
470
|
+
// is unchanged (the non-breaking default).
|
|
471
|
+
const renderAsLink = href != null;
|
|
472
|
+
const renderAsButton = !renderAsLink && onClick != null;
|
|
473
|
+
const isInteractive = renderAsLink || renderAsButton;
|
|
474
|
+
const LinkComponent = useLinkComponent(as);
|
|
475
|
+
|
|
476
|
+
// An interactive control with no accessible name is an unacceptable control
|
|
477
|
+
// name. Warn in the same client-safe way sibling components do (Field,
|
|
478
|
+
// Timestamp, Popover) — a plain `console.warn`, never gated on `process.env`
|
|
479
|
+
// (which is not available on the client in this codebase).
|
|
480
|
+
if (isInteractive && !accessibleName) {
|
|
481
|
+
console.warn(
|
|
482
|
+
'Avatar: an interactive avatar (with `href` or `onClick`) needs a ' +
|
|
483
|
+
'meaningful accessible name. Pass `alt` or `name`.',
|
|
484
|
+
);
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
// The inner visuals are identical across the static and interactive variants.
|
|
488
|
+
const visualContent = (
|
|
489
|
+
<>
|
|
490
|
+
<div {...stylex.props(styles.content, dynamicStyles.size(numericSize))}>
|
|
491
|
+
{showImage && (
|
|
492
|
+
<img
|
|
493
|
+
src={src}
|
|
494
|
+
alt=""
|
|
495
|
+
onError={() => setErroredSrc(src)}
|
|
496
|
+
{...stylex.props(styles.image)}
|
|
497
|
+
/>
|
|
498
|
+
)}
|
|
499
|
+
{showFallbackImage && (
|
|
500
|
+
<img
|
|
501
|
+
src={fallbackSrc}
|
|
502
|
+
alt=""
|
|
503
|
+
onError={() => setErroredFallbackSrc(fallbackSrc)}
|
|
504
|
+
{...stylex.props(styles.image)}
|
|
505
|
+
/>
|
|
506
|
+
)}
|
|
507
|
+
{showInitials && (
|
|
508
|
+
<div
|
|
509
|
+
{...stylex.props(
|
|
510
|
+
styles.fallback,
|
|
511
|
+
dynamicStyles.fontSize(numericSize),
|
|
512
|
+
)}>
|
|
513
|
+
{getInitials(name)}
|
|
514
|
+
</div>
|
|
515
|
+
)}
|
|
516
|
+
{showIcon && (
|
|
517
|
+
<div {...stylex.props(styles.fallback)}>
|
|
518
|
+
<DefaultIcon size={numericSize} />
|
|
519
|
+
</div>
|
|
520
|
+
)}
|
|
521
|
+
</div>
|
|
522
|
+
{status && (
|
|
523
|
+
<div
|
|
524
|
+
{...stylex.props(
|
|
525
|
+
styles.status,
|
|
526
|
+
dynamicStyles.statusPosition(numericSize),
|
|
527
|
+
)}>
|
|
528
|
+
{status}
|
|
529
|
+
</div>
|
|
530
|
+
)}
|
|
531
|
+
</>
|
|
532
|
+
);
|
|
533
|
+
|
|
534
|
+
// Shared StyleX + theme props for the root element in every variant. The
|
|
535
|
+
// group ring/overlap, the interactive focus-visible ring, and the
|
|
536
|
+
// tooltip tab-stop focus ring all live here so the interactive
|
|
537
|
+
// `<a>`/`<button>` and the static `<div>` carry the exact same box.
|
|
538
|
+
const rootStylexProps = mergeProps(
|
|
539
|
+
themeProps('avatar', {size: resolvedSize}),
|
|
540
|
+
stylex.props(
|
|
541
|
+
styles.wrapper,
|
|
542
|
+
isInteractive && styles.interactive,
|
|
543
|
+
!isInteractive && showTooltip && !avatarGroup && styles.focusable,
|
|
544
|
+
avatarGroup && groupStyles.ring,
|
|
545
|
+
avatarGroup && groupStyles.overlap,
|
|
546
|
+
avatarGroup && groupDynamicStyles.overlap(-avatarGroup.overlap),
|
|
547
|
+
xstyle,
|
|
548
|
+
),
|
|
549
|
+
className,
|
|
550
|
+
style,
|
|
551
|
+
);
|
|
552
|
+
|
|
553
|
+
let rootElement: ReactNode;
|
|
554
|
+
|
|
555
|
+
// `props` is typed for the default `<div>` root (its event handlers are
|
|
556
|
+
// HTMLDivElement-typed). The interactive branches render an `<a>`/`<button>`,
|
|
557
|
+
// so the passthrough props are re-typed to the generic element here — the
|
|
558
|
+
// avatar's own handlers (onClick) are declared on HTMLElement and stay typed.
|
|
559
|
+
const interactivePassthrough = props as React.HTMLAttributes<HTMLElement>;
|
|
560
|
+
|
|
561
|
+
if (renderAsLink) {
|
|
562
|
+
// The rendered link carries the `data-avatar-item` marker so AvatarGroup's
|
|
563
|
+
// roving focus (which selects on `[data-avatar-item]`, not a tag/role) picks
|
|
564
|
+
// it up while ignoring nested buttons in a custom status/badge slot.
|
|
565
|
+
rootElement = (
|
|
566
|
+
<LinkComponent
|
|
567
|
+
{...interactivePassthrough}
|
|
568
|
+
{...describedByProp}
|
|
569
|
+
ref={rootRef as React.Ref<HTMLAnchorElement>}
|
|
570
|
+
href={href}
|
|
571
|
+
target={target}
|
|
572
|
+
rel={rel}
|
|
573
|
+
aria-label={accessibleName}
|
|
574
|
+
data-avatar-item=""
|
|
575
|
+
data-testid={testId}
|
|
576
|
+
onClick={onClick}
|
|
577
|
+
{...rootStylexProps}>
|
|
578
|
+
{visualContent}
|
|
579
|
+
</LinkComponent>
|
|
580
|
+
);
|
|
581
|
+
} else if (renderAsButton) {
|
|
582
|
+
rootElement = (
|
|
583
|
+
<button
|
|
584
|
+
{...interactivePassthrough}
|
|
585
|
+
{...describedByProp}
|
|
586
|
+
ref={rootRef}
|
|
587
|
+
type="button"
|
|
588
|
+
aria-label={accessibleName}
|
|
589
|
+
data-avatar-item=""
|
|
590
|
+
data-testid={testId}
|
|
591
|
+
onClick={onClick}
|
|
592
|
+
{...rootStylexProps}>
|
|
593
|
+
{visualContent}
|
|
594
|
+
</button>
|
|
595
|
+
);
|
|
596
|
+
} else {
|
|
597
|
+
rootElement = (
|
|
308
598
|
<div
|
|
309
599
|
{...props}
|
|
310
|
-
ref={
|
|
600
|
+
ref={rootRef}
|
|
311
601
|
role={isDecorative ? 'presentation' : 'img'}
|
|
312
602
|
aria-label={isDecorative ? undefined : accessibleName}
|
|
313
603
|
aria-hidden={isDecorative || undefined}
|
|
604
|
+
// The root is a div[role="img"], not natively focusable. When a name
|
|
605
|
+
// tooltip is active, add a tab stop so keyboard users can reveal it
|
|
606
|
+
// (WCAG 1.4.13 / 2.1.1) — matching Timestamp/Button. Suppressed inside
|
|
607
|
+
// an AvatarGroup, which owns a single roving tab stop for its members.
|
|
608
|
+
tabIndex={showTooltip && !avatarGroup ? 0 : undefined}
|
|
314
609
|
data-testid={testId}
|
|
315
|
-
{...
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
styles.wrapper,
|
|
319
|
-
avatarGroup && groupStyles.ring,
|
|
320
|
-
avatarGroup && groupStyles.overlap,
|
|
321
|
-
avatarGroup && groupDynamicStyles.overlap(-avatarGroup.overlap),
|
|
322
|
-
xstyle,
|
|
323
|
-
),
|
|
324
|
-
className,
|
|
325
|
-
style,
|
|
326
|
-
)}>
|
|
327
|
-
<div {...stylex.props(styles.content, dynamicStyles.size(numericSize))}>
|
|
328
|
-
{showImage && (
|
|
329
|
-
<img
|
|
330
|
-
src={src}
|
|
331
|
-
alt=""
|
|
332
|
-
onError={() => setErroredSrc(src)}
|
|
333
|
-
{...stylex.props(styles.image)}
|
|
334
|
-
/>
|
|
335
|
-
)}
|
|
336
|
-
{showFallbackImage && (
|
|
337
|
-
<img
|
|
338
|
-
src={fallbackSrc}
|
|
339
|
-
alt=""
|
|
340
|
-
onError={() => setErroredFallbackSrc(fallbackSrc)}
|
|
341
|
-
{...stylex.props(styles.image)}
|
|
342
|
-
/>
|
|
343
|
-
)}
|
|
344
|
-
{showInitials && (
|
|
345
|
-
<div
|
|
346
|
-
{...stylex.props(
|
|
347
|
-
styles.fallback,
|
|
348
|
-
dynamicStyles.fontSize(numericSize),
|
|
349
|
-
)}>
|
|
350
|
-
{getInitials(name)}
|
|
351
|
-
</div>
|
|
352
|
-
)}
|
|
353
|
-
{showIcon && (
|
|
354
|
-
<div {...stylex.props(styles.fallback)}>
|
|
355
|
-
<DefaultIcon size={numericSize} />
|
|
356
|
-
</div>
|
|
357
|
-
)}
|
|
358
|
-
</div>
|
|
359
|
-
{status && (
|
|
360
|
-
<div
|
|
361
|
-
{...stylex.props(
|
|
362
|
-
styles.status,
|
|
363
|
-
dynamicStyles.statusPosition(numericSize),
|
|
364
|
-
)}>
|
|
365
|
-
{status}
|
|
366
|
-
</div>
|
|
367
|
-
)}
|
|
610
|
+
{...describedByProp}
|
|
611
|
+
{...rootStylexProps}>
|
|
612
|
+
{visualContent}
|
|
368
613
|
</div>
|
|
369
|
-
|
|
614
|
+
);
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
const avatarElement = (
|
|
618
|
+
<AvatarSizeContext value={numericSize}>{rootElement}</AvatarSizeContext>
|
|
619
|
+
);
|
|
620
|
+
|
|
621
|
+
// Always return the same structure so the avatar keeps its position in the
|
|
622
|
+
// React tree regardless of the tooltip flag — toggling it must not remount
|
|
623
|
+
// the avatar subtree (and lose image-load state). The tooltip is a sibling
|
|
624
|
+
// (no wrapper DOM); the hook's ref is already on the root via `rootRef`.
|
|
625
|
+
return (
|
|
626
|
+
<>
|
|
627
|
+
{avatarElement}
|
|
628
|
+
{showTooltip ? tooltipHook.renderTooltip(trimmedTooltip) : null}
|
|
629
|
+
</>
|
|
370
630
|
);
|
|
371
631
|
}
|
|
372
632
|
|
|
@@ -7,23 +7,27 @@ export const docs = {
|
|
|
7
7
|
subComponentOf: 'Avatar',
|
|
8
8
|
displayName: 'Avatar Status Dot',
|
|
9
9
|
isHiddenFromOverview: true,
|
|
10
|
-
description:
|
|
10
|
+
description:
|
|
11
|
+
'Size-aware status indicator dot that reads avatar size from context and scales proportionally. Each variant pairs a colour with a distinct built-in shape (filled, ring, minus) so status is never conveyed by colour alone (WCAG 1.4.1).',
|
|
11
12
|
props: [
|
|
12
13
|
{
|
|
13
14
|
name: 'variant',
|
|
14
15
|
type: "'success' | 'neutral' | 'error'",
|
|
15
|
-
description:
|
|
16
|
+
description:
|
|
17
|
+
'Semantic variant pairing colour with a distinct shape: success = filled green dot, neutral = grey ring, error = red dot with a minus bar.',
|
|
16
18
|
default: "'success'",
|
|
17
19
|
},
|
|
18
20
|
{
|
|
19
21
|
name: 'label',
|
|
20
22
|
type: 'string',
|
|
21
|
-
description:
|
|
23
|
+
description:
|
|
24
|
+
'Accessible label describing the status. Not announced inside an Avatar today (the Avatar root is role="img", which prunes child semantics) — pass it anyway; an Avatar-level name-composition fix is planned.',
|
|
22
25
|
},
|
|
23
26
|
{
|
|
24
27
|
name: 'icon',
|
|
25
28
|
type: 'ReactNode',
|
|
26
|
-
description:
|
|
29
|
+
description:
|
|
30
|
+
'Icon centered inside the dot (hidden at tiny sizes). A rendered icon replaces the built-in shape glyph, so use a different icon per status.',
|
|
27
31
|
slotElements: [
|
|
28
32
|
{
|
|
29
33
|
__element: 'Icon',
|
|
@@ -41,23 +45,27 @@ export const docsZh = {
|
|
|
41
45
|
name: 'AvatarStatusDot',
|
|
42
46
|
isHiddenFromOverview: true,
|
|
43
47
|
displayName: 'Avatar Status Dot',
|
|
44
|
-
description:
|
|
48
|
+
description:
|
|
49
|
+
'尺寸感知的状态指示点,从上下文中读取头像尺寸并等比缩放。每个变体将颜色与独特形状(实心、圆环、横杠)配对,确保状态不仅靠颜色传达(WCAG 1.4.1)。',
|
|
45
50
|
props: [
|
|
46
51
|
{
|
|
47
52
|
name: 'variant',
|
|
48
53
|
type: "'success' | 'neutral' | 'error'",
|
|
49
|
-
description:
|
|
54
|
+
description:
|
|
55
|
+
'语义变体,颜色与形状配对:success = 绿色实心点,neutral = 灰色圆环,error = 带横杠的红色点。',
|
|
50
56
|
default: "'success'",
|
|
51
57
|
},
|
|
52
58
|
{
|
|
53
59
|
name: 'label',
|
|
54
60
|
type: 'string',
|
|
55
|
-
description:
|
|
61
|
+
description:
|
|
62
|
+
'描述状态的无障碍标签。目前在 Avatar 内不会被朗读(Avatar 根元素为 role="img",会裁剪子元素语义)——仍请传入;Avatar 层面的名称合成修复已在计划中。',
|
|
56
63
|
},
|
|
57
64
|
{
|
|
58
65
|
name: 'icon',
|
|
59
66
|
type: 'ReactNode',
|
|
60
|
-
description:
|
|
67
|
+
description:
|
|
68
|
+
'居中显示在状态点内的图标(tiny 尺寸时隐藏)。渲染的图标会替换内置形状标记,请为每个状态使用不同的图标。',
|
|
61
69
|
},
|
|
62
70
|
],
|
|
63
71
|
};
|
|
@@ -66,10 +74,13 @@ export const docsDense = {
|
|
|
66
74
|
name: 'AvatarStatusDot',
|
|
67
75
|
isHiddenFromOverview: true,
|
|
68
76
|
displayName: 'Avatar Status Dot',
|
|
69
|
-
description:
|
|
77
|
+
description:
|
|
78
|
+
'size-aware status dot, reads avatar size from context + scales proportionally; variants pair colour with shape (filled/ring/minus) per WCAG 1.4.1',
|
|
70
79
|
propDescriptions: {
|
|
71
|
-
variant:
|
|
72
|
-
|
|
73
|
-
|
|
80
|
+
variant:
|
|
81
|
+
'colour + shape variant: success filled, neutral ring, error minus',
|
|
82
|
+
label:
|
|
83
|
+
'accessible status label (not yet announced inside Avatar — role="img" prunes children)',
|
|
84
|
+
icon: 'icon centered in dot (hidden at tiny sizes); replaces the built-in shape glyph — differ it per status',
|
|
74
85
|
},
|
|
75
86
|
};
|