@astryxdesign/core 0.1.8 → 0.1.9-canary.75d2d03
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 +18 -2
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +63 -7
- 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/Banner/Banner.d.ts +9 -1
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +31 -2
- 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 +31 -2
- 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 +35 -3
- 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/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/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/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 +8 -1
- 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/DateInput/DateInput.d.ts +47 -1
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +26 -2
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +10 -1
- 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/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 +42 -15
- package/dist/FieldStatus/FieldStatus.d.ts +8 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +22 -4
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +10 -2
- 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/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.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +39 -12
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +16 -0
- package/dist/NumberInput/NumberInput.d.ts.map +1 -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/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.map +1 -1
- package/dist/Selector/Selector.js +4 -2
- 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/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +3 -2
- 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/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/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.map +1 -1
- package/dist/TimeInput/TimeInput.js +15 -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 +1 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +16 -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 +27 -7
- 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/astryx.css +28 -18
- 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/useDevWarning.d.ts +18 -0
- package/dist/hooks/useDevWarning.d.ts.map +1 -0
- package/dist/hooks/useDevWarning.js +49 -0
- 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/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 +24 -0
- package/locales/fr-FR.json +14 -0
- package/locales/pseudo.json +18 -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 +15 -3
- package/src/Avatar/Avatar.test.tsx +156 -1
- package/src/Avatar/Avatar.tsx +96 -4
- 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/Banner/Banner.doc.mjs +9 -0
- package/src/Banner/Banner.test.tsx +30 -0
- package/src/Banner/Banner.tsx +47 -3
- 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 -0
- package/src/Button/Button.test.tsx +49 -0
- package/src/Button/Button.tsx +25 -1
- 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 +49 -3
- package/src/Chat/ChatContext.tsx +37 -10
- package/src/Chat/ChatDictationButton.tsx +4 -1
- package/src/Chat/ChatLayout.tsx +3 -1
- 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 +3 -1
- 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/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 +9 -1
- 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/ContextMenu/ContextMenu.test.tsx +193 -0
- package/src/DateInput/DateInput.doc.mjs +16 -0
- package/src/DateInput/DateInput.test.tsx +108 -0
- package/src/DateInput/DateInput.tsx +68 -3
- package/src/DateInput/index.ts +1 -0
- package/src/DateTimeInput/DateTimeInput.test.tsx +35 -0
- package/src/DateTimeInput/DateTimeInput.tsx +14 -2
- 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/DropdownMenuRadioGroup.tsx +1 -2
- package/src/Field/Field.test.tsx +57 -12
- package/src/Field/Field.tsx +6 -5
- package/src/Field/FieldLabel.tsx +8 -0
- package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
- package/src/FieldStatus/FieldStatus.test.tsx +78 -40
- package/src/FieldStatus/FieldStatus.tsx +22 -4
- package/src/FileInput/FileInput.test.tsx +52 -3
- package/src/FileInput/FileInput.tsx +13 -2
- 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/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 +4 -2
- package/src/MultiSelector/MultiSelector.test.tsx +172 -3
- package/src/MultiSelector/MultiSelector.tsx +55 -12
- package/src/MultiSelector/hooks.ts +17 -0
- package/src/NumberInput/NumberInput.test.tsx +11 -7
- package/src/NumberInput/NumberInput.tsx +1 -2
- 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 +14 -0
- package/src/PowerSearch/PowerSearch.test.tsx +20 -0
- 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.test.tsx +69 -0
- package/src/Selector/Selector.tsx +5 -1
- 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/Table/BaseTable.tsx +3 -5
- 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/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.test.tsx +9 -1
- package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
- package/src/Thumbnail/Thumbnail.test.tsx +98 -7
- package/src/Thumbnail/Thumbnail.tsx +141 -41
- package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
- package/src/TimeInput/TimeInput.test.tsx +76 -1
- package/src/TimeInput/TimeInput.tsx +19 -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 +15 -1
- package/src/Tokenizer/Tokenizer.test.tsx +183 -2
- package/src/Tokenizer/Tokenizer.tsx +16 -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 +51 -11
- package/src/TreeList/TreeListTypes.ts +27 -1
- package/src/TreeList/index.ts +2 -2
- 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/useDevWarning.test.tsx +45 -0
- package/src/hooks/useDevWarning.ts +54 -0
- 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/theme/Theme.tsx +11 -14
- package/src/theme/generateThemeRules.test.ts +65 -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
|
@@ -20,37 +20,49 @@ import type {BaseProps} from '../BaseProps';
|
|
|
20
20
|
import * as stylex from '@stylexjs/stylex';
|
|
21
21
|
import {colorVars, radiusVars} from '../theme/tokens.stylex';
|
|
22
22
|
import {AvatarSizeContext} from './AvatarSizeContext';
|
|
23
|
-
import {mergeProps} from '../utils';
|
|
23
|
+
import {isRenderable, mergeProps} from '../utils';
|
|
24
24
|
import {themeProps} from '../utils/themeProps';
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
27
|
+
* Discrete size tier of the status dot, derived from the avatar size.
|
|
28
|
+
* Keys the built-in shape glyph's stroke weight — see `GLYPH_STROKE_WIDTH`.
|
|
29
|
+
*/
|
|
30
|
+
type StatusDotSizeTier = 'small' | 'medium' | 'large';
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Resolves the status dot size, border width, icon size, and size tier
|
|
34
|
+
* based on the avatar size.
|
|
29
35
|
*
|
|
30
36
|
* Uses discrete size tiers rather than a continuous ratio so the dot
|
|
31
37
|
* looks intentional at every avatar size:
|
|
32
38
|
*
|
|
33
|
-
* | Avatar size | Dot | Border | Icon |
|
|
34
|
-
*
|
|
35
|
-
* | ≤ 36px | 10px | 1px | — |
|
|
36
|
-
* | 40–72px | 20px | 2px | 12px |
|
|
37
|
-
* | ≥ 96px | 32px | 4px | 18px |
|
|
39
|
+
* | Avatar size | Tier | Dot | Border | Icon | Field | Glyph stroke |
|
|
40
|
+
* |--------------|--------|------|--------|------|-------|--------------|
|
|
41
|
+
* | ≤ 36px | small | 10px | 1px | — | 8px | 1px |
|
|
42
|
+
* | 40–72px | medium | 20px | 2px | 12px | 16px | 1.5px |
|
|
43
|
+
* | ≥ 96px | large | 32px | 4px | 18px | 24px | 2px |
|
|
44
|
+
*
|
|
45
|
+
* "Field" is the dot's inner field — the dot minus both borders — that the
|
|
46
|
+
* shape glyph is drawn into; see `GLYPH_STROKE_WIDTH` for the stroke ladder.
|
|
38
47
|
*
|
|
39
48
|
* Icons are not rendered at the smallest tier — there isn't enough
|
|
40
|
-
* room for them to be legible.
|
|
49
|
+
* room for them to be legible. The built-in shape glyphs (see
|
|
50
|
+
* `glyphShapeMap`) do render there, so status stays distinguishable
|
|
51
|
+
* without colour at every size.
|
|
41
52
|
*/
|
|
42
53
|
function resolveStatusDotSize(avatarSize: number): {
|
|
43
54
|
dotSize: number;
|
|
44
55
|
borderWidth: number;
|
|
45
56
|
iconSize: number;
|
|
57
|
+
tier: StatusDotSizeTier;
|
|
46
58
|
} {
|
|
47
59
|
if (avatarSize <= 36) {
|
|
48
|
-
return {dotSize: 10, borderWidth: 1, iconSize: 0};
|
|
60
|
+
return {dotSize: 10, borderWidth: 1, iconSize: 0, tier: 'small'};
|
|
49
61
|
}
|
|
50
62
|
if (avatarSize <= 72) {
|
|
51
|
-
return {dotSize: 20, borderWidth: 2, iconSize: 12};
|
|
63
|
+
return {dotSize: 20, borderWidth: 2, iconSize: 12, tier: 'medium'};
|
|
52
64
|
}
|
|
53
|
-
return {dotSize: 32, borderWidth: 4, iconSize: 18};
|
|
65
|
+
return {dotSize: 32, borderWidth: 4, iconSize: 18, tier: 'large'};
|
|
54
66
|
}
|
|
55
67
|
|
|
56
68
|
/**
|
|
@@ -65,6 +77,13 @@ function resolveStatusDotSize(avatarSize: number): {
|
|
|
65
77
|
* }
|
|
66
78
|
* }
|
|
67
79
|
* ```
|
|
80
|
+
*
|
|
81
|
+
* Custom variants render no background fill, no ink colour, and no built-in
|
|
82
|
+
* shape glyph — the theme must supply the fill and, if it passes an `icon`,
|
|
83
|
+
* a `color` for it to paint with. It should also supply a non-colour mark
|
|
84
|
+
* so the status is not distinguishable by colour alone (a WCAG 1.4.1
|
|
85
|
+
* failure): pass `icon`, or theme a glyph onto the dot via
|
|
86
|
+
* `.astryx-avatar-status-dot[data-variant="..."]` (e.g. a `::before` mark).
|
|
68
87
|
*/
|
|
69
88
|
export interface AvatarStatusDotVariantMap {
|
|
70
89
|
success: true;
|
|
@@ -80,12 +99,14 @@ export type AvatarStatusDotVariant = keyof AvatarStatusDotVariantMap;
|
|
|
80
99
|
export interface AvatarStatusDotProps extends BaseProps<HTMLDivElement> {
|
|
81
100
|
ref?: React.Ref<HTMLDivElement>;
|
|
82
101
|
/**
|
|
83
|
-
* The semantic
|
|
84
|
-
* -
|
|
85
|
-
*
|
|
86
|
-
* - `
|
|
102
|
+
* The semantic variant of the dot. Each variant pairs a colour with a
|
|
103
|
+
* distinct built-in shape so status is never conveyed by colour alone
|
|
104
|
+
* (WCAG 2.1 SC 1.4.1):
|
|
105
|
+
* - `success` — filled green dot (e.g. online, accepted)
|
|
106
|
+
* - `neutral` — grey ring (e.g. away, offline, pending)
|
|
107
|
+
* - `error` — red dot with a minus bar (e.g. busy, do not disturb)
|
|
87
108
|
*
|
|
88
|
-
* Matches the `variant` convention from `StatusDot`.
|
|
109
|
+
* Matches the `variant` naming convention from `StatusDot`.
|
|
89
110
|
* @default 'success'
|
|
90
111
|
*/
|
|
91
112
|
variant?: AvatarStatusDotVariant;
|
|
@@ -93,6 +114,11 @@ export interface AvatarStatusDotProps extends BaseProps<HTMLDivElement> {
|
|
|
93
114
|
* Accessible label for the status dot.
|
|
94
115
|
* Describes the meaning of the indicator for screen readers
|
|
95
116
|
* (e.g. "Online", "Accepted", "John Doe is busy").
|
|
117
|
+
*
|
|
118
|
+
* Note: inside an Avatar the label is currently not announced — the
|
|
119
|
+
* Avatar root is `role="img"`, which prunes descendant semantics.
|
|
120
|
+
* Pass it anyway; composing status into the avatar's accessible name
|
|
121
|
+
* is a planned Avatar-level fix.
|
|
96
122
|
*/
|
|
97
123
|
label?: string;
|
|
98
124
|
/**
|
|
@@ -101,6 +127,14 @@ export interface AvatarStatusDotProps extends BaseProps<HTMLDivElement> {
|
|
|
101
127
|
* The icon is automatically sized to fit the dot and hidden
|
|
102
128
|
* at the smallest avatar sizes where there isn't enough room.
|
|
103
129
|
*
|
|
130
|
+
* A rendered icon replaces the variant's built-in shape glyph, so use a
|
|
131
|
+
* different icon per status — the same icon on every variant leaves the
|
|
132
|
+
* statuses distinguishable by colour alone (WCAG 1.4.1). At the smallest
|
|
133
|
+
* avatar sizes the built-in glyph still shows instead of the icon.
|
|
134
|
+
* Booleans and empty strings are ignored (safe for `cond && <Icon />`),
|
|
135
|
+
* but a component that renders nothing still counts as an icon and
|
|
136
|
+
* suppresses the glyph.
|
|
137
|
+
*
|
|
104
138
|
* @example
|
|
105
139
|
* ```
|
|
106
140
|
* <AvatarStatusDot variant="success" label="Verified" icon={<CheckIcon />} />
|
|
@@ -119,20 +153,29 @@ const styles = stylex.create({
|
|
|
119
153
|
alignItems: 'center',
|
|
120
154
|
justifyContent: 'center',
|
|
121
155
|
},
|
|
156
|
+
// Each variant sets both the plate colour and the ink colour. Everything
|
|
157
|
+
// drawn on the dot — the shape glyph and any user `icon` — paints from
|
|
158
|
+
// `currentColor`, so the two can never drift out of contrast.
|
|
122
159
|
success: {
|
|
123
160
|
backgroundColor: colorVars['--color-success'],
|
|
161
|
+
color: colorVars['--color-background-surface'],
|
|
124
162
|
},
|
|
163
|
+
// The ring variant inverts: a hollow shape only reads as hollow if its
|
|
164
|
+
// interior is not the variant colour, so the plate is surface and the
|
|
165
|
+
// colour moves to the stroke. This also keeps a user `icon` legible on
|
|
166
|
+
// it — surface ink on a surface plate would be invisible.
|
|
125
167
|
neutral: {
|
|
126
|
-
backgroundColor: colorVars['--color-
|
|
168
|
+
backgroundColor: colorVars['--color-background-surface'],
|
|
169
|
+
color: colorVars['--color-text-secondary'],
|
|
127
170
|
},
|
|
128
171
|
error: {
|
|
129
172
|
backgroundColor: colorVars['--color-error'],
|
|
173
|
+
color: colorVars['--color-background-surface'],
|
|
130
174
|
},
|
|
131
175
|
icon: {
|
|
132
176
|
display: 'flex',
|
|
133
177
|
alignItems: 'center',
|
|
134
178
|
justifyContent: 'center',
|
|
135
|
-
color: colorVars['--color-background-surface'],
|
|
136
179
|
lineHeight: 0,
|
|
137
180
|
},
|
|
138
181
|
});
|
|
@@ -157,10 +200,112 @@ const variantStyleMap: Partial<
|
|
|
157
200
|
error: styles.error,
|
|
158
201
|
};
|
|
159
202
|
|
|
203
|
+
/**
|
|
204
|
+
* Built-in shape glyph per variant, so each status differs by shape and not
|
|
205
|
+
* only by colour (WCAG 2.1 SC 1.4.1). The glyph is a stroked inline SVG
|
|
206
|
+
* painted in `currentColor`:
|
|
207
|
+
* - `ring` — a stroked circle on a surface plate; the dot reads as hollow
|
|
208
|
+
* (away/offline).
|
|
209
|
+
* - `minus` — a round-capped bar across the filled dot; the dot reads as
|
|
210
|
+
* "do not disturb" (busy).
|
|
211
|
+
*
|
|
212
|
+
* `success` stays the plain filled dot — filled, hollow, and barred are the
|
|
213
|
+
* three distinct fill topologies. Custom augmented variants have no entry
|
|
214
|
+
* and render no glyph; see the `AvatarStatusDotVariantMap` docs.
|
|
215
|
+
*/
|
|
216
|
+
type AvatarStatusDotGlyphShape = 'ring' | 'minus';
|
|
217
|
+
|
|
218
|
+
const glyphShapeMap: Partial<
|
|
219
|
+
Record<AvatarStatusDotVariant, AvatarStatusDotGlyphShape>
|
|
220
|
+
> = {
|
|
221
|
+
neutral: 'ring',
|
|
222
|
+
error: 'minus',
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Glyph stroke weight per tier, in px of the dot's inner field.
|
|
227
|
+
*
|
|
228
|
+
* Roughly `field / 12`, floored at 1px so the smallest tier stays visible.
|
|
229
|
+
* That lands on the 1 / 1.5 / 2 ladder the rest of the system draws with —
|
|
230
|
+
* `Icon`'s default set strokes at 1.5 in a 24 viewBox, as does the
|
|
231
|
+
* `CheckboxInput` checkmark — rather than the 25% band a CSS box cutout
|
|
232
|
+
* produced, which was several times heavier than any other glyph we ship.
|
|
233
|
+
*/
|
|
234
|
+
const GLYPH_STROKE_WIDTH: Record<StatusDotSizeTier, number> = {
|
|
235
|
+
small: 1,
|
|
236
|
+
medium: 1.5,
|
|
237
|
+
large: 2,
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
/** Fraction of the inner field the minus bar spans, cap to cap. */
|
|
241
|
+
const MINUS_BAR_SPAN = 0.75;
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* The built-in shape glyph, drawn as a stroked inline SVG in `currentColor`.
|
|
245
|
+
*
|
|
246
|
+
* Stroking (rather than a CSS box) is what buys sub-pixel control and round
|
|
247
|
+
* line caps, so the mark stays intentional at every tier — including the
|
|
248
|
+
* 10px dot, where a box cutout can only land on whole pixels.
|
|
249
|
+
*
|
|
250
|
+
* `viewBox` is one user unit per px of the inner field, so every value here
|
|
251
|
+
* is literal px.
|
|
252
|
+
*/
|
|
253
|
+
function StatusDotGlyph({
|
|
254
|
+
shape,
|
|
255
|
+
field,
|
|
256
|
+
stroke,
|
|
257
|
+
}: {
|
|
258
|
+
shape: AvatarStatusDotGlyphShape;
|
|
259
|
+
field: number;
|
|
260
|
+
stroke: number;
|
|
261
|
+
}) {
|
|
262
|
+
const center = field / 2;
|
|
263
|
+
return (
|
|
264
|
+
<svg
|
|
265
|
+
aria-hidden="true"
|
|
266
|
+
viewBox={`0 0 ${field} ${field}`}
|
|
267
|
+
width={field}
|
|
268
|
+
height={field}
|
|
269
|
+
fill="none"
|
|
270
|
+
{...themeProps('avatar-status-dot-glyph', {shape})}>
|
|
271
|
+
{shape === 'ring' ? (
|
|
272
|
+
// Radius is to the stroke centreline, so the ring's outer edge lands
|
|
273
|
+
// exactly on the inner field and never clips against the border.
|
|
274
|
+
<circle
|
|
275
|
+
cx={center}
|
|
276
|
+
cy={center}
|
|
277
|
+
r={(field - stroke) / 2}
|
|
278
|
+
fill="none"
|
|
279
|
+
stroke="currentColor"
|
|
280
|
+
strokeWidth={stroke}
|
|
281
|
+
/>
|
|
282
|
+
) : (
|
|
283
|
+
// Ends inset by half the stroke so the round caps land inside the
|
|
284
|
+
// span rather than overhanging it.
|
|
285
|
+
<line
|
|
286
|
+
x1={(field * (1 - MINUS_BAR_SPAN)) / 2 + stroke / 2}
|
|
287
|
+
y1={center}
|
|
288
|
+
x2={(field * (1 + MINUS_BAR_SPAN)) / 2 - stroke / 2}
|
|
289
|
+
y2={center}
|
|
290
|
+
stroke="currentColor"
|
|
291
|
+
strokeWidth={stroke}
|
|
292
|
+
strokeLinecap="round"
|
|
293
|
+
/>
|
|
294
|
+
)}
|
|
295
|
+
</svg>
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
|
|
160
299
|
/**
|
|
161
300
|
* A status indicator dot that automatically scales to match the parent
|
|
162
301
|
* Avatar's size.
|
|
163
302
|
*
|
|
303
|
+
* Each variant pairs a colour with a distinct built-in shape (filled dot,
|
|
304
|
+
* ring, minus bar) so status stays distinguishable without colour
|
|
305
|
+
* perception (WCAG 2.1 SC 1.4.1). Themes can target the shape glyph via
|
|
306
|
+
* the `astryx-avatar-status-dot-glyph` class and its `data-shape`
|
|
307
|
+
* attribute.
|
|
308
|
+
*
|
|
164
309
|
* Must be used inside an Avatar's `status` prop so it can read
|
|
165
310
|
* the avatar size from context.
|
|
166
311
|
*
|
|
@@ -189,7 +334,12 @@ export function AvatarStatusDot({
|
|
|
189
334
|
...props
|
|
190
335
|
}: AvatarStatusDotProps) {
|
|
191
336
|
const avatarSize = use(AvatarSizeContext);
|
|
192
|
-
const {dotSize, borderWidth, iconSize} =
|
|
337
|
+
const {dotSize, borderWidth, iconSize, tier} =
|
|
338
|
+
resolveStatusDotSize(avatarSize);
|
|
339
|
+
const showsIcon = isRenderable(icon) && iconSize > 0;
|
|
340
|
+
// A rendered icon is itself a non-colour mark; overlaying both cutouts in
|
|
341
|
+
// the dot's small inner field would make each illegible.
|
|
342
|
+
const glyphShape = showsIcon ? undefined : glyphShapeMap[variant];
|
|
193
343
|
|
|
194
344
|
return (
|
|
195
345
|
<div
|
|
@@ -207,13 +357,20 @@ export function AvatarStatusDot({
|
|
|
207
357
|
className,
|
|
208
358
|
style,
|
|
209
359
|
)}>
|
|
210
|
-
{
|
|
360
|
+
{showsIcon && (
|
|
211
361
|
<span
|
|
212
362
|
aria-hidden="true"
|
|
213
363
|
{...stylex.props(styles.icon, dynamicStyles.iconSize(iconSize))}>
|
|
214
364
|
{icon}
|
|
215
365
|
</span>
|
|
216
366
|
)}
|
|
367
|
+
{glyphShape && (
|
|
368
|
+
<StatusDotGlyph
|
|
369
|
+
shape={glyphShape}
|
|
370
|
+
field={dotSize - borderWidth * 2}
|
|
371
|
+
stroke={GLYPH_STROKE_WIDTH[tier]}
|
|
372
|
+
/>
|
|
373
|
+
)}
|
|
217
374
|
</div>
|
|
218
375
|
);
|
|
219
376
|
}
|
|
@@ -81,6 +81,13 @@ export const docs = {
|
|
|
81
81
|
'Container type: card has border-radius; section is full-width with no border-radius for page-level use.',
|
|
82
82
|
default: "'card'",
|
|
83
83
|
},
|
|
84
|
+
{
|
|
85
|
+
name: 'elevation',
|
|
86
|
+
type: "'none' | 'low' | 'med' | 'high'",
|
|
87
|
+
description:
|
|
88
|
+
'Resting shadow depth. Use for a floating banner that hovers above content; `none` is the default inline banner. A `card`-container banner rounds its shadow to match.',
|
|
89
|
+
default: "'none'",
|
|
90
|
+
},
|
|
84
91
|
{
|
|
85
92
|
name: 'children',
|
|
86
93
|
type: 'ReactNode',
|
|
@@ -157,6 +164,7 @@ export const docsZh = {
|
|
|
157
164
|
{name: 'onDismiss', type: '() => void', description: '点击关闭按钮时调用;无论是否提供此回调,横幅都会自动隐藏。'},
|
|
158
165
|
{name: 'endContent', type: 'ReactNode', description: '渲染在头部区域末端对齐的操作内容,通常是按钮或链接。'},
|
|
159
166
|
{name: 'container', type: "'card' | 'section'", description: '视觉变体:card 带圆角;section 无圆角全宽,适用于页面级场景。', default: "'card'"},
|
|
167
|
+
{name: 'elevation', type: "'none' | 'low' | 'med' | 'high'", description: '静止阴影深度。用于悬浮于内容之上的浮动横幅;none 为默认内联横幅。', default: "'none'"},
|
|
160
168
|
{name: 'children', type: 'ReactNode', description: '渲染在彩色头部下方卡片背景区域的内容。'},
|
|
161
169
|
{name: 'defaultIsExpanded', type: 'boolean', description: '内容区域(children)是否初始展开。仅在提供 children 时相关。', default: 'false'},
|
|
162
170
|
{
|
|
@@ -230,6 +238,7 @@ export const docsDense = {
|
|
|
230
238
|
onDismiss: 'dismiss callback; banner self-hides regardless',
|
|
231
239
|
endContent: 'end-aligned action in header, typically button/link',
|
|
232
240
|
container: 'card=border-radius; section=full-width no radius for page-level',
|
|
241
|
+
elevation: 'resting shadow depth: none|low|med|high; raise for a floating banner',
|
|
233
242
|
children: 'content in card-bg area below colored header',
|
|
234
243
|
xstyle: 'StyleX layout customization via stylex.create()',
|
|
235
244
|
},
|
|
@@ -368,4 +368,34 @@ describe('Banner', () => {
|
|
|
368
368
|
);
|
|
369
369
|
expect(screen.getByTestId('custom-chevron')).toBeInTheDocument();
|
|
370
370
|
});
|
|
371
|
+
|
|
372
|
+
describe('elevation', () => {
|
|
373
|
+
it('renders a distinct root class for each elevation level', () => {
|
|
374
|
+
const classFor = (elevation: 'none' | 'low' | 'med' | 'high') => {
|
|
375
|
+
const {container} = render(
|
|
376
|
+
<Banner status="info" title="Heads up" elevation={elevation} />,
|
|
377
|
+
);
|
|
378
|
+
return container.firstElementChild!.className;
|
|
379
|
+
};
|
|
380
|
+
const classes = new Set([
|
|
381
|
+
classFor('none'),
|
|
382
|
+
classFor('low'),
|
|
383
|
+
classFor('med'),
|
|
384
|
+
classFor('high'),
|
|
385
|
+
]);
|
|
386
|
+
expect(classes.size).toBe(4);
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
it('defaults to flat (elevation none)', () => {
|
|
390
|
+
const {container: def} = render(
|
|
391
|
+
<Banner status="info" title="Heads up" />,
|
|
392
|
+
);
|
|
393
|
+
const {container: none} = render(
|
|
394
|
+
<Banner status="info" title="Heads up" elevation="none" />,
|
|
395
|
+
);
|
|
396
|
+
expect(def.firstElementChild!.className).toBe(
|
|
397
|
+
none.firstElementChild!.className,
|
|
398
|
+
);
|
|
399
|
+
});
|
|
400
|
+
});
|
|
371
401
|
});
|
package/src/Banner/Banner.tsx
CHANGED
|
@@ -46,8 +46,10 @@ import {
|
|
|
46
46
|
borderVars,
|
|
47
47
|
durationVars,
|
|
48
48
|
easeVars,
|
|
49
|
+
shadowVars,
|
|
49
50
|
} from '../theme/tokens.stylex';
|
|
50
51
|
import {mergeProps} from '../utils';
|
|
52
|
+
import type {Elevation} from '../utils/types';
|
|
51
53
|
import {edgeCompSlot} from '../Layout/edgeCompensation.stylex';
|
|
52
54
|
import {themeProps} from '../utils/themeProps';
|
|
53
55
|
import {useTranslator} from '../i18n';
|
|
@@ -157,6 +159,13 @@ export interface BannerProps extends BaseProps<HTMLDivElement> {
|
|
|
157
159
|
* @default 'card'
|
|
158
160
|
*/
|
|
159
161
|
container?: BannerContainer;
|
|
162
|
+
/**
|
|
163
|
+
* Resting elevation — the shadow depth the banner sits at. Use for a
|
|
164
|
+
* floating banner that hovers above content. `none` is the default inline
|
|
165
|
+
* banner.
|
|
166
|
+
* @default 'none'
|
|
167
|
+
*/
|
|
168
|
+
elevation?: Elevation;
|
|
160
169
|
/**
|
|
161
170
|
* Whether the content area (children) starts expanded.
|
|
162
171
|
* Only relevant when children are provided.
|
|
@@ -215,6 +224,11 @@ const styles = stylex.create({
|
|
|
215
224
|
flexDirection: 'column',
|
|
216
225
|
fontFamily: 'inherit',
|
|
217
226
|
},
|
|
227
|
+
// When elevated, a card-container banner rounds its root so the shadow
|
|
228
|
+
// follows the same silhouette as the header/content border-radius.
|
|
229
|
+
rootElevatedCard: {
|
|
230
|
+
borderRadius: radiusVars['--radius-container'],
|
|
231
|
+
},
|
|
218
232
|
// Header area — colored status background with icon, title, description, actions
|
|
219
233
|
// This is the primary theme target ('banner')
|
|
220
234
|
header: {
|
|
@@ -323,6 +337,18 @@ const statusStyles = stylex.create({
|
|
|
323
337
|
},
|
|
324
338
|
});
|
|
325
339
|
|
|
340
|
+
// Resting elevation for the banner. Applied to the root so the shadow wraps
|
|
341
|
+
// the whole banner (header + optional content). 'none' is the default and
|
|
342
|
+
// leaves the layout-only root untouched. For the `card` container the root is
|
|
343
|
+
// rounded (rootElevatedCard) so the shadow follows the card silhouette; the
|
|
344
|
+
// full-width `section` container stays square.
|
|
345
|
+
const elevationStyles = stylex.create({
|
|
346
|
+
none: {boxShadow: 'none'},
|
|
347
|
+
low: {boxShadow: shadowVars['--shadow-low']},
|
|
348
|
+
med: {boxShadow: shadowVars['--shadow-med']},
|
|
349
|
+
high: {boxShadow: shadowVars['--shadow-high']},
|
|
350
|
+
});
|
|
351
|
+
|
|
326
352
|
// =============================================================================
|
|
327
353
|
// Component
|
|
328
354
|
// =============================================================================
|
|
@@ -381,6 +407,7 @@ export function Banner({
|
|
|
381
407
|
onDismiss,
|
|
382
408
|
endContent,
|
|
383
409
|
container = 'card',
|
|
410
|
+
elevation = 'none',
|
|
384
411
|
defaultIsExpanded = false,
|
|
385
412
|
children,
|
|
386
413
|
xstyle,
|
|
@@ -429,7 +456,16 @@ export function Banner({
|
|
|
429
456
|
<div
|
|
430
457
|
ref={ref}
|
|
431
458
|
role={role}
|
|
432
|
-
{...mergeProps(
|
|
459
|
+
{...mergeProps(
|
|
460
|
+
stylex.props(
|
|
461
|
+
styles.root,
|
|
462
|
+
elevationStyles[elevation],
|
|
463
|
+
isCard && elevation !== 'none' && styles.rootElevatedCard,
|
|
464
|
+
xstyle,
|
|
465
|
+
),
|
|
466
|
+
className,
|
|
467
|
+
style,
|
|
468
|
+
)}
|
|
433
469
|
{...rest}>
|
|
434
470
|
{/* Header: colored status background — primary theme target ('banner') */}
|
|
435
471
|
<div
|
|
@@ -474,8 +510,16 @@ export function Banner({
|
|
|
474
510
|
<Button
|
|
475
511
|
variant="ghost"
|
|
476
512
|
size="sm"
|
|
477
|
-
label={
|
|
478
|
-
|
|
513
|
+
label={
|
|
514
|
+
isExpanded
|
|
515
|
+
? t('@astryx.banner.collapse')
|
|
516
|
+
: t('@astryx.banner.expand')
|
|
517
|
+
}
|
|
518
|
+
tooltip={
|
|
519
|
+
isExpanded
|
|
520
|
+
? t('@astryx.banner.collapse')
|
|
521
|
+
: t('@astryx.banner.expand')
|
|
522
|
+
}
|
|
479
523
|
icon={
|
|
480
524
|
<span
|
|
481
525
|
{...stylex.props(
|
|
@@ -45,6 +45,18 @@ export const docs = {
|
|
|
45
45
|
},
|
|
46
46
|
],
|
|
47
47
|
},
|
|
48
|
+
{
|
|
49
|
+
name: 'menu',
|
|
50
|
+
type: 'DropdownMenuOption[] | ReactNode',
|
|
51
|
+
description:
|
|
52
|
+
'Menu opened when the item is activated, using the same item API as DropdownMenu/MoreMenu/ContextMenu (a DropdownMenuOption[] array or composed DropdownMenuItem children). Renders a link-styled menu trigger with a chevron and aria-haspopup="menu". Takes precedence over href/onClick.',
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'menuSize',
|
|
56
|
+
type: "'sm' | 'md' | 'lg'",
|
|
57
|
+
description:
|
|
58
|
+
"Size passed to the menu items. Defaults from the breadcrumb variant ('supporting' → 'sm', otherwise 'md').",
|
|
59
|
+
},
|
|
48
60
|
{
|
|
49
61
|
name: 'as',
|
|
50
62
|
type: 'LinkComponentType',
|
|
@@ -86,6 +98,18 @@ export const docsZh = {
|
|
|
86
98
|
type: 'ReactNode',
|
|
87
99
|
description: '在项目标签前渲染的图标。',
|
|
88
100
|
},
|
|
101
|
+
{
|
|
102
|
+
name: 'menu',
|
|
103
|
+
type: 'DropdownMenuOption[] | ReactNode',
|
|
104
|
+
description:
|
|
105
|
+
'激活项目时打开的菜单,使用与 DropdownMenu/MoreMenu/ContextMenu 相同的项目 API(DropdownMenuOption[] 数组或组合的 DropdownMenuItem 子元素)。渲染为带 chevron 和 aria-haspopup="menu" 的链接样式触发器。优先于 href/onClick。',
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: 'menuSize',
|
|
109
|
+
type: "'sm' | 'md' | 'lg'",
|
|
110
|
+
description:
|
|
111
|
+
"传递给菜单项的尺寸。默认根据面包屑变体推断('supporting' → 'sm',否则 'md')。",
|
|
112
|
+
},
|
|
89
113
|
{
|
|
90
114
|
name: 'as',
|
|
91
115
|
type: 'LinkComponentType',
|
|
@@ -105,6 +129,8 @@ export const docsDense = {
|
|
|
105
129
|
onClick: 'click handler',
|
|
106
130
|
isCurrent: 'marks current page w/ aria-current="page"',
|
|
107
131
|
startIcon: 'icon before label',
|
|
132
|
+
menu: 'DropdownMenuOption[] | children; opens a menu trigger (aria-haspopup="menu"); reuses the DropdownMenu item API',
|
|
133
|
+
menuSize: "menu item size; defaults from variant (supporting→sm, else md)",
|
|
108
134
|
as: 'custom link component; overrides LinkProvider default',
|
|
109
135
|
},
|
|
110
136
|
};
|