@astryxdesign/core 0.1.8 → 0.1.9
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/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/resolve.d.ts.map +1 -1
- package/dist/i18n/resolve.js +7 -18
- 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/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/InternationalizationProvider.doc.mjs +99 -2
- package/src/i18n/resolve.ts +9 -21
- 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
|
@@ -14,6 +14,8 @@ import {render, screen, fireEvent} from '@testing-library/react';
|
|
|
14
14
|
import userEvent from '@testing-library/user-event';
|
|
15
15
|
import {TreeList} from './TreeList';
|
|
16
16
|
import type {TreeListItemData} from './TreeListTypes';
|
|
17
|
+
import {defineTheme} from '../theme/defineTheme';
|
|
18
|
+
import {generateThemeCSSFlat} from '../theme/generateThemeRules';
|
|
17
19
|
|
|
18
20
|
const simpleItems: TreeListItemData[] = [
|
|
19
21
|
{id: 'a', label: 'Item A'},
|
|
@@ -393,6 +395,115 @@ describe('TreeList', () => {
|
|
|
393
395
|
expect(screen.getByRole('tree')).toBeInTheDocument();
|
|
394
396
|
});
|
|
395
397
|
|
|
398
|
+
// ===========================================================================
|
|
399
|
+
// Variant (guide lines)
|
|
400
|
+
// ===========================================================================
|
|
401
|
+
|
|
402
|
+
describe('variant', () => {
|
|
403
|
+
it('renders guide lines by default', () => {
|
|
404
|
+
const {container} = render(<TreeList items={nestedItemsExpanded} />);
|
|
405
|
+
expect(container.querySelector('.astryx-tree-list-guide')).not.toBeNull();
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
it("variant='lineGuides' renders guide lines (explicit == default)", () => {
|
|
409
|
+
const {container} = render(
|
|
410
|
+
<TreeList items={nestedItemsExpanded} variant="lineGuides" />,
|
|
411
|
+
);
|
|
412
|
+
expect(container.querySelector('.astryx-tree-list-guide')).not.toBeNull();
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
it("variant='noGuides' renders NO guide lines", () => {
|
|
416
|
+
const {container} = render(
|
|
417
|
+
<TreeList items={nestedItemsExpanded} variant="noGuides" />,
|
|
418
|
+
);
|
|
419
|
+
expect(container.querySelector('.astryx-tree-list-guide')).toBeNull();
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
it("variant='noGuides' preserves the tree structure and items", () => {
|
|
423
|
+
render(<TreeList items={nestedItemsExpanded} variant="noGuides" />);
|
|
424
|
+
// Rows, roles, and nesting are all intact — only the connectors are gone.
|
|
425
|
+
expect(screen.getByRole('tree')).toBeInTheDocument();
|
|
426
|
+
expect(screen.getAllByRole('treeitem')).toHaveLength(4);
|
|
427
|
+
expect(screen.getByText('Parent')).toBeInTheDocument();
|
|
428
|
+
expect(screen.getByText('Child 1')).toBeInTheDocument();
|
|
429
|
+
expect(screen.getByText('Child 2')).toBeInTheDocument();
|
|
430
|
+
expect(screen.getByText('Sibling')).toBeInTheDocument();
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
it("variant='noGuides' preserves per-level indentation on the rows", () => {
|
|
434
|
+
// Indentation lives on the row's marginLeft (not the guide element), so
|
|
435
|
+
// it must survive when the connectors are suppressed. A deeper row is
|
|
436
|
+
// indented more than a shallower one.
|
|
437
|
+
const {container} = render(
|
|
438
|
+
<TreeList items={deepItems} variant="noGuides" />,
|
|
439
|
+
);
|
|
440
|
+
const marginOf = (text: string): string => {
|
|
441
|
+
const li = screen.getByText(text).closest('li')!;
|
|
442
|
+
const styled = li.querySelector('[style*="margin-left"]');
|
|
443
|
+
return styled?.getAttribute('style') ?? '';
|
|
444
|
+
};
|
|
445
|
+
// Guides are gone…
|
|
446
|
+
expect(container.querySelector('.astryx-tree-list-guide')).toBeNull();
|
|
447
|
+
// …but each level still carries an inline margin-left, and the level
|
|
448
|
+
// multiplier grows with depth (0, 1, 2).
|
|
449
|
+
expect(marginOf('Root')).toContain('margin-left');
|
|
450
|
+
expect(marginOf('Mid')).toContain('margin-left');
|
|
451
|
+
expect(marginOf('Leaf')).toContain('margin-left');
|
|
452
|
+
const level = (text: string): number => {
|
|
453
|
+
const m = /calc\((\d+)/.exec(marginOf(text));
|
|
454
|
+
return m ? Number(m[1]) : NaN;
|
|
455
|
+
};
|
|
456
|
+
expect(level('Mid')).toBeGreaterThan(level('Root'));
|
|
457
|
+
expect(level('Leaf')).toBeGreaterThan(level('Mid'));
|
|
458
|
+
});
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
// ===========================================================================
|
|
462
|
+
// Guide theme target
|
|
463
|
+
// ===========================================================================
|
|
464
|
+
|
|
465
|
+
describe('guide theme target', () => {
|
|
466
|
+
it('renders the astryx-tree-list-guide target on the connector lines', () => {
|
|
467
|
+
const {container} = render(<TreeList items={nestedItemsExpanded} />);
|
|
468
|
+
const guide = container.querySelector('.astryx-tree-list-guide');
|
|
469
|
+
// A dedicated, stable target so a theme can recolor or hide the guides
|
|
470
|
+
// without hiding the built-in connectors and reimplementing them.
|
|
471
|
+
expect(guide).not.toBeNull();
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
it('exposes tree-list-guide as a themeable defineTheme target', () => {
|
|
475
|
+
// jsdom cannot resolve the @layer cascade, so the generated CSS is what
|
|
476
|
+
// proves a theme override reaches the guide element.
|
|
477
|
+
const theme = defineTheme({
|
|
478
|
+
name: 'tree-list-guide-test',
|
|
479
|
+
components: {
|
|
480
|
+
'tree-list-guide': {
|
|
481
|
+
base: {backgroundColor: 'var(--color-accent)'},
|
|
482
|
+
},
|
|
483
|
+
},
|
|
484
|
+
});
|
|
485
|
+
const css = generateThemeCSSFlat(theme);
|
|
486
|
+
expect(css).toContain('.astryx-tree-list-guide {');
|
|
487
|
+
expect(css).toContain('background-color: var(--color-accent)');
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
it('lets a theme hide the guides via display: none on the target', () => {
|
|
491
|
+
// Hiding the guides is done through the theme target, not a prop — the
|
|
492
|
+
// theme rule lands in @layer astryx-theme, above StyleX's base layer.
|
|
493
|
+
const theme = defineTheme({
|
|
494
|
+
name: 'tree-list-guide-hidden-test',
|
|
495
|
+
components: {
|
|
496
|
+
'tree-list-guide': {
|
|
497
|
+
base: {display: 'none'},
|
|
498
|
+
},
|
|
499
|
+
},
|
|
500
|
+
});
|
|
501
|
+
const css = generateThemeCSSFlat(theme);
|
|
502
|
+
expect(css).toContain('.astryx-tree-list-guide {');
|
|
503
|
+
expect(css).toContain('display: none');
|
|
504
|
+
});
|
|
505
|
+
});
|
|
506
|
+
|
|
396
507
|
// ===========================================================================
|
|
397
508
|
// xds class name
|
|
398
509
|
// ===========================================================================
|
|
@@ -403,6 +514,127 @@ describe('TreeList', () => {
|
|
|
403
514
|
expect(root.className).toContain('astryx-tree-list');
|
|
404
515
|
});
|
|
405
516
|
|
|
517
|
+
// ===========================================================================
|
|
518
|
+
// Chevron theme target
|
|
519
|
+
// ===========================================================================
|
|
520
|
+
|
|
521
|
+
describe('chevron theme target', () => {
|
|
522
|
+
it('renders the astryx-tree-list-chevron target on the toggle button', () => {
|
|
523
|
+
render(<TreeList items={nestedItems} />);
|
|
524
|
+
const toggle = screen
|
|
525
|
+
.getByText('Parent')
|
|
526
|
+
.closest('li')!
|
|
527
|
+
.querySelector('[data-tree-toggle]')!;
|
|
528
|
+
|
|
529
|
+
// Dedicated, stable theme target on the expand/collapse control, so a
|
|
530
|
+
// theme can restyle the chevron without a fragile [data-tree-toggle] hook.
|
|
531
|
+
expect(toggle).toHaveClass('astryx-tree-list-chevron');
|
|
532
|
+
// Open/closed state is reflected so a theme can target each state alone.
|
|
533
|
+
expect(toggle).toHaveAttribute('data-state', 'collapsed');
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
it('reflects the expanded state on the toggle when open', () => {
|
|
537
|
+
render(<TreeList items={nestedItemsExpanded} />);
|
|
538
|
+
const toggle = screen
|
|
539
|
+
.getByText('Parent')
|
|
540
|
+
.closest('li')!
|
|
541
|
+
.querySelector('[data-tree-toggle]')!;
|
|
542
|
+
|
|
543
|
+
expect(toggle).toHaveClass('astryx-tree-list-chevron');
|
|
544
|
+
expect(toggle).toHaveAttribute('data-state', 'expanded');
|
|
545
|
+
});
|
|
546
|
+
|
|
547
|
+
it('keeps the functional data-tree-toggle hook alongside the new target', () => {
|
|
548
|
+
// The theme target is additive — the toggle is still a real <button> and
|
|
549
|
+
// still carries the functional activation attribute TreeList relies on.
|
|
550
|
+
render(<TreeList items={nestedItems} />);
|
|
551
|
+
const toggle = screen
|
|
552
|
+
.getByText('Parent')
|
|
553
|
+
.closest('li')!
|
|
554
|
+
.querySelector('[data-tree-toggle]')!;
|
|
555
|
+
expect(toggle.tagName).toBe('BUTTON');
|
|
556
|
+
expect(toggle).toHaveAttribute('data-tree-toggle');
|
|
557
|
+
});
|
|
558
|
+
|
|
559
|
+
it('exposes tree-list-chevron as a themeable defineTheme target', () => {
|
|
560
|
+
// The generated CSS is what proves the target is reachable by a theme:
|
|
561
|
+
// jsdom cannot resolve the @layer cascade, so the DOM-class assertions
|
|
562
|
+
// above and this generation assertion together cover the seam.
|
|
563
|
+
const theme = defineTheme({
|
|
564
|
+
name: 'tree-list-chevron-test',
|
|
565
|
+
components: {
|
|
566
|
+
'tree-list-chevron': {
|
|
567
|
+
base: {color: 'var(--color-accent)'},
|
|
568
|
+
'state:expanded': {color: 'var(--color-text-primary)'},
|
|
569
|
+
},
|
|
570
|
+
},
|
|
571
|
+
});
|
|
572
|
+
const css = generateThemeCSSFlat(theme);
|
|
573
|
+
expect(css).toContain('.astryx-tree-list-chevron {');
|
|
574
|
+
expect(css).toContain('color: var(--color-accent)');
|
|
575
|
+
expect(css).toContain('.astryx-tree-list-chevron.expanded');
|
|
576
|
+
expect(css).toContain('color: var(--color-text-primary)');
|
|
577
|
+
});
|
|
578
|
+
});
|
|
579
|
+
|
|
580
|
+
// ===========================================================================
|
|
581
|
+
// Item label theme target
|
|
582
|
+
// ===========================================================================
|
|
583
|
+
|
|
584
|
+
describe('item label theme target', () => {
|
|
585
|
+
it('renders the astryx-tree-list-item-label target on the label span', () => {
|
|
586
|
+
render(<TreeList items={simpleItems} />);
|
|
587
|
+
const label = screen.getByText('Item A');
|
|
588
|
+
|
|
589
|
+
// Dedicated, stable theme target on the label text, so a theme can style
|
|
590
|
+
// just the label without a fragile `button:not([data-tree-toggle]) > span`
|
|
591
|
+
// structural selector.
|
|
592
|
+
expect(label).toHaveClass('astryx-tree-list-item-label');
|
|
593
|
+
// A non-selected item's label carries no selected reflection.
|
|
594
|
+
expect(label).not.toHaveAttribute('data-selected');
|
|
595
|
+
});
|
|
596
|
+
|
|
597
|
+
it('reflects the selected state on the selected item label', () => {
|
|
598
|
+
render(
|
|
599
|
+
<TreeList items={[{id: 'a', label: 'Item A', isSelected: true}]} />,
|
|
600
|
+
);
|
|
601
|
+
const label = screen.getByText('Item A');
|
|
602
|
+
expect(label).toHaveClass('astryx-tree-list-item-label');
|
|
603
|
+
expect(label).toHaveAttribute('data-selected', 'selected');
|
|
604
|
+
});
|
|
605
|
+
|
|
606
|
+
it('keeps the label linked to its row via aria-labelledby', () => {
|
|
607
|
+
// The theme target is additive — the label still owns the id the
|
|
608
|
+
// interactive row references for its accessible name.
|
|
609
|
+
render(
|
|
610
|
+
<TreeList items={[{id: 'a', label: 'Item A', onClick: () => {}}]} />,
|
|
611
|
+
);
|
|
612
|
+
const label = screen.getByText('Item A');
|
|
613
|
+
const action = screen.getByRole('button');
|
|
614
|
+
expect(action).toHaveAttribute('aria-labelledby', label.id);
|
|
615
|
+
});
|
|
616
|
+
|
|
617
|
+
it('exposes tree-list-item-label as a themeable defineTheme target', () => {
|
|
618
|
+
// The generated CSS is what proves the target is reachable by a theme:
|
|
619
|
+
// jsdom cannot resolve the @layer cascade, so the DOM-class assertions
|
|
620
|
+
// above and this generation assertion together cover the seam.
|
|
621
|
+
const theme = defineTheme({
|
|
622
|
+
name: 'tree-list-item-label-test',
|
|
623
|
+
components: {
|
|
624
|
+
'tree-list-item-label': {
|
|
625
|
+
base: {color: 'var(--color-text-primary)'},
|
|
626
|
+
selected: {fontWeight: 'var(--font-weight-bold)'},
|
|
627
|
+
},
|
|
628
|
+
},
|
|
629
|
+
});
|
|
630
|
+
const css = generateThemeCSSFlat(theme);
|
|
631
|
+
expect(css).toContain('.astryx-tree-list-item-label {');
|
|
632
|
+
expect(css).toContain('color: var(--color-text-primary)');
|
|
633
|
+
expect(css).toContain('.astryx-tree-list-item-label.selected');
|
|
634
|
+
expect(css).toContain('font-weight: var(--font-weight-bold)');
|
|
635
|
+
});
|
|
636
|
+
});
|
|
637
|
+
|
|
406
638
|
// ===========================================================================
|
|
407
639
|
// APG structural ARIA (aria-level / aria-posinset / aria-setsize)
|
|
408
640
|
// ===========================================================================
|
|
@@ -21,7 +21,11 @@ import {spacingVars} from '../theme/tokens.stylex';
|
|
|
21
21
|
import {mergeProps} from '../utils';
|
|
22
22
|
import type {BaseProps} from '../BaseProps';
|
|
23
23
|
import {TreeListItem} from './TreeListItem';
|
|
24
|
-
import type {
|
|
24
|
+
import type {
|
|
25
|
+
TreeListItemData,
|
|
26
|
+
TreeListDensity,
|
|
27
|
+
TreeListVariant,
|
|
28
|
+
} from './TreeListTypes';
|
|
25
29
|
import {themeProps} from '../utils/themeProps';
|
|
26
30
|
import {useTreeFocus} from '../hooks/useTreeFocus';
|
|
27
31
|
|
|
@@ -29,7 +33,7 @@ import {useTreeFocus} from '../hooks/useTreeFocus';
|
|
|
29
33
|
// Types
|
|
30
34
|
// =============================================================================
|
|
31
35
|
|
|
32
|
-
export {type TreeListDensity} from './TreeListTypes';
|
|
36
|
+
export {type TreeListDensity, type TreeListVariant} from './TreeListTypes';
|
|
33
37
|
|
|
34
38
|
export interface TreeListProps extends BaseProps<HTMLDivElement> {
|
|
35
39
|
/** Ref forwarded to the root element */
|
|
@@ -50,6 +54,16 @@ export interface TreeListProps extends BaseProps<HTMLDivElement> {
|
|
|
50
54
|
*/
|
|
51
55
|
density?: TreeListDensity;
|
|
52
56
|
|
|
57
|
+
/**
|
|
58
|
+
* Visual treatment of the hierarchy guide (connector) lines.
|
|
59
|
+
* - `lineGuides`: connector lines between parent and child rows
|
|
60
|
+
* - `noGuides`: no connector lines; indentation alone conveys nesting
|
|
61
|
+
*
|
|
62
|
+
* Orthogonal to `density` (which controls spacing) — the two compose.
|
|
63
|
+
* @default 'lineGuides'
|
|
64
|
+
*/
|
|
65
|
+
variant?: TreeListVariant;
|
|
66
|
+
|
|
53
67
|
/**
|
|
54
68
|
* Header content rendered above the tree list.
|
|
55
69
|
* Semantically associated via aria-labelledby.
|
|
@@ -156,6 +170,7 @@ function findInitialTabbableId(items: TreeListItemData[]): string | undefined {
|
|
|
156
170
|
export function TreeList({
|
|
157
171
|
items,
|
|
158
172
|
density = 'balanced',
|
|
173
|
+
variant = 'lineGuides',
|
|
159
174
|
header,
|
|
160
175
|
xstyle,
|
|
161
176
|
className,
|
|
@@ -275,6 +290,7 @@ export function TreeList({
|
|
|
275
290
|
isExpanded={isExpanded}
|
|
276
291
|
onToggle={handleToggle}
|
|
277
292
|
density={density}
|
|
293
|
+
variant={variant}
|
|
278
294
|
renderedChildren={renderedChildren}
|
|
279
295
|
posInSet={index + 1}
|
|
280
296
|
setSize={items.length}
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
import * as stylex from '@stylexjs/stylex';
|
|
17
17
|
import {colorVars, spacingVars} from '../theme/tokens.stylex';
|
|
18
18
|
import {mergeProps} from '../utils';
|
|
19
|
+
import {themeProps} from '../utils/themeProps';
|
|
19
20
|
|
|
20
21
|
const LINE_WIDTH = 1;
|
|
21
22
|
|
|
@@ -65,6 +66,11 @@ interface TreeListBranchesProps {
|
|
|
65
66
|
/**
|
|
66
67
|
* Renders vertical lines showing parent-child relationships in the tree.
|
|
67
68
|
* Positioned in a full-height container to span the entire item including children.
|
|
69
|
+
*
|
|
70
|
+
* The line element carries the stable `astryx-tree-list-guide` theme target so a
|
|
71
|
+
* theme can recolor or hide the connectors via `defineTheme` (e.g.
|
|
72
|
+
* `backgroundColor` or `display: 'none'`) instead of hiding the built-in guides
|
|
73
|
+
* and reimplementing them.
|
|
68
74
|
*/
|
|
69
75
|
export function TreeListBranches({
|
|
70
76
|
ancestorsIsLast,
|
|
@@ -90,7 +96,10 @@ export function TreeListBranches({
|
|
|
90
96
|
},
|
|
91
97
|
})}>
|
|
92
98
|
<div
|
|
93
|
-
{...
|
|
99
|
+
{...mergeProps(
|
|
100
|
+
themeProps('tree-list-guide'),
|
|
101
|
+
stylex.props(styles.verticalLine, styles.verticalFull),
|
|
102
|
+
)}
|
|
94
103
|
/>
|
|
95
104
|
</div>
|
|
96
105
|
)
|
|
@@ -103,7 +112,12 @@ export function TreeListBranches({
|
|
|
103
112
|
left: `calc(${BRANCH_MARGIN} + ${nestedLevel - 1} * ${LEVEL_INDENT})`,
|
|
104
113
|
},
|
|
105
114
|
})}>
|
|
106
|
-
<div
|
|
115
|
+
<div
|
|
116
|
+
{...mergeProps(
|
|
117
|
+
themeProps('tree-list-guide'),
|
|
118
|
+
stylex.props(styles.verticalLine, styles.verticalFull),
|
|
119
|
+
)}
|
|
120
|
+
/>
|
|
107
121
|
</div>
|
|
108
122
|
)}
|
|
109
123
|
</>
|
|
@@ -28,7 +28,7 @@ import {getIcon} from '../Icon/globalIconRegistry';
|
|
|
28
28
|
import {mergeProps} from '../utils';
|
|
29
29
|
import {useLinkComponent} from '../Link/useLinkComponent';
|
|
30
30
|
import {TreeListBranches} from './TreeListBranches';
|
|
31
|
-
import type {TreeListDensity} from './TreeListTypes';
|
|
31
|
+
import type {TreeListDensity, TreeListVariant} from './TreeListTypes';
|
|
32
32
|
import {themeProps} from '../utils/themeProps';
|
|
33
33
|
import {useTranslator} from '../i18n';
|
|
34
34
|
|
|
@@ -268,6 +268,12 @@ export interface TreeListItemInternalProps {
|
|
|
268
268
|
isExpanded: boolean;
|
|
269
269
|
onToggle?: (id: string) => void;
|
|
270
270
|
density: TreeListDensity;
|
|
271
|
+
/**
|
|
272
|
+
* Guide-line visual treatment. `noGuides` suppresses the connector lines;
|
|
273
|
+
* indentation is unaffected (it lives on the row's `marginLeft`, not the
|
|
274
|
+
* guide element).
|
|
275
|
+
*/
|
|
276
|
+
variant: TreeListVariant;
|
|
271
277
|
/** Pre-rendered children subtree (rendered by the parent recursion) */
|
|
272
278
|
renderedChildren?: ReactNode;
|
|
273
279
|
/** 1-based position of this item among its siblings (aria-posinset). */
|
|
@@ -304,6 +310,7 @@ export function TreeListItem({
|
|
|
304
310
|
isExpanded,
|
|
305
311
|
onToggle,
|
|
306
312
|
density,
|
|
313
|
+
variant,
|
|
307
314
|
renderedChildren,
|
|
308
315
|
posInSet,
|
|
309
316
|
setSize,
|
|
@@ -352,7 +359,20 @@ export function TreeListItem({
|
|
|
352
359
|
|
|
353
360
|
const labelAndDescription = (
|
|
354
361
|
<>
|
|
355
|
-
<span
|
|
362
|
+
<span
|
|
363
|
+
id={labelId}
|
|
364
|
+
{...mergeProps(
|
|
365
|
+
// Stable theme target for the item's label text. The label carries no
|
|
366
|
+
// themeable handle today, so a theme can only reach it through a
|
|
367
|
+
// fragile structural selector (a content button's first span). This
|
|
368
|
+
// adds an `astryx-tree-list-item-label` class and reflects the row's
|
|
369
|
+
// `selected` state so a theme can, e.g., bold just the selected
|
|
370
|
+
// item's label via `defineTheme`.
|
|
371
|
+
themeProps('tree-list-item-label', {
|
|
372
|
+
selected: isSelected ? 'selected' : null,
|
|
373
|
+
}),
|
|
374
|
+
stylex.props(styles.label),
|
|
375
|
+
)}>
|
|
356
376
|
{label}
|
|
357
377
|
</span>
|
|
358
378
|
{description != null && (
|
|
@@ -394,12 +414,30 @@ export function TreeListItem({
|
|
|
394
414
|
// a separate tab stop. Row-level Enter/Space forwards to this button.
|
|
395
415
|
tabIndex={-1}
|
|
396
416
|
onClick={handleToggle}
|
|
397
|
-
{...
|
|
417
|
+
{...mergeProps(
|
|
418
|
+
// Stable theme target for the expand/collapse control. `data-tree-toggle`
|
|
419
|
+
// stays as the functional activation hook; this adds a themeable
|
|
420
|
+
// `astryx-tree-list-chevron` class and reflects the open/closed state so
|
|
421
|
+
// a theme can restyle the toggle (and each state) without a fragile
|
|
422
|
+
// `[data-tree-toggle]` selector.
|
|
423
|
+
themeProps('tree-list-chevron', {
|
|
424
|
+
state: isExpanded ? 'expanded' : 'collapsed',
|
|
425
|
+
}),
|
|
426
|
+
stylex.props(styles.chevronButton),
|
|
427
|
+
)}>
|
|
398
428
|
{chevronIcon}
|
|
399
429
|
</button>
|
|
400
430
|
) : (
|
|
401
431
|
// Non-interactive chevron only when toggling is not wired up at all
|
|
402
|
-
<span
|
|
432
|
+
<span
|
|
433
|
+
{...mergeProps(
|
|
434
|
+
themeProps('tree-list-chevron', {
|
|
435
|
+
state: isExpanded ? 'expanded' : 'collapsed',
|
|
436
|
+
}),
|
|
437
|
+
stylex.props(styles.chevronContainer),
|
|
438
|
+
)}>
|
|
439
|
+
{chevronIcon}
|
|
440
|
+
</span>
|
|
403
441
|
)
|
|
404
442
|
) : null;
|
|
405
443
|
|
|
@@ -461,13 +499,15 @@ export function TreeListItem({
|
|
|
461
499
|
data-tree-level={nestedLevel + 1}
|
|
462
500
|
data-tree-disabled={isDisabled || undefined}
|
|
463
501
|
{...stylex.props(styles.wrapper)}>
|
|
464
|
-
|
|
465
|
-
<
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
502
|
+
{variant !== 'noGuides' && (
|
|
503
|
+
<div {...stylex.props(styles.treeBranches)}>
|
|
504
|
+
<TreeListBranches
|
|
505
|
+
ancestorsIsLast={ancestorsIsLast}
|
|
506
|
+
isLast={isLast}
|
|
507
|
+
nestedLevel={nestedLevel}
|
|
508
|
+
/>
|
|
509
|
+
</div>
|
|
510
|
+
)}
|
|
471
511
|
<div {...stylex.props(styles.rowWrapper)}>
|
|
472
512
|
<div
|
|
473
513
|
{...mergeProps(
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* @file TreeListTypes.ts
|
|
5
5
|
* @input Uses React types
|
|
6
|
-
* @output Exports TreeListItemData, TreeListDensity types
|
|
6
|
+
* @output Exports TreeListItemData, TreeListDensity, TreeListVariant types
|
|
7
7
|
* @position Type definitions; consumed by TreeList.tsx, TreeListItem.tsx, index.ts
|
|
8
8
|
*
|
|
9
9
|
* SYNC: When modified, update these files to stay in sync:
|
|
@@ -16,6 +16,32 @@ import type {ReactNode} from 'react';
|
|
|
16
16
|
/** Spacing density for tree list items. */
|
|
17
17
|
export type TreeListDensity = 'compact' | 'balanced' | 'spacious';
|
|
18
18
|
|
|
19
|
+
/**
|
|
20
|
+
* Extensible variant map for TreeList.
|
|
21
|
+
*
|
|
22
|
+
* Theme packages can add custom variants via TypeScript module augmentation:
|
|
23
|
+
* @example
|
|
24
|
+
* ```
|
|
25
|
+
* declare module '@astryxdesign/core/TreeList' {
|
|
26
|
+
* interface TreeListVariantMap {
|
|
27
|
+
* 'dotted': true;
|
|
28
|
+
* }
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export interface TreeListVariantMap {
|
|
33
|
+
lineGuides: true;
|
|
34
|
+
noGuides: true;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Visual treatment of the hierarchy guide (connector) lines. Extensible via
|
|
39
|
+
* module augmentation of TreeListVariantMap.
|
|
40
|
+
* - `lineGuides`: connector lines between parent and child rows (default)
|
|
41
|
+
* - `noGuides`: no connector lines; indentation alone conveys nesting
|
|
42
|
+
*/
|
|
43
|
+
export type TreeListVariant = keyof TreeListVariantMap;
|
|
44
|
+
|
|
19
45
|
/** Recursive item configuration for TreeList. */
|
|
20
46
|
export interface TreeListItemData {
|
|
21
47
|
/** Unique identifier for the item. Used as React key and for expansion tracking. */
|
package/src/TreeList/index.ts
CHANGED
|
@@ -12,5 +12,5 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
export {TreeList} from './TreeList';
|
|
15
|
-
export type {TreeListProps, TreeListDensity} from './TreeList';
|
|
16
|
-
export type {TreeListItemData} from './TreeListTypes';
|
|
15
|
+
export type {TreeListProps, TreeListDensity, TreeListVariant} from './TreeList';
|
|
16
|
+
export type {TreeListItemData, TreeListVariantMap} from './TreeListTypes';
|
package/src/authoring/doc.ts
CHANGED
|
@@ -130,9 +130,7 @@ export type AstryxGenericDocInput = AstryxBaseDocInput;
|
|
|
130
130
|
* any code referring to the old name.
|
|
131
131
|
*/
|
|
132
132
|
export type AstryxComponentDoc =
|
|
133
|
-
|
|
|
134
|
-
| AstryxFunctionDocInput
|
|
135
|
-
| AstryxGenericDocInput;
|
|
133
|
+
AstryxComponentDocInput | AstryxFunctionDocInput | AstryxGenericDocInput;
|
|
136
134
|
|
|
137
135
|
/**
|
|
138
136
|
* Author a component doc. Stamp-only: returns the def with `type: 'component'`
|
package/src/docs-types.ts
CHANGED
|
@@ -669,6 +669,7 @@ export interface TranslationDoc {
|
|
|
669
669
|
* @example
|
|
670
670
|
* ```
|
|
671
671
|
* { type: 'prose', text: 'Spacing tokens control gap and padding...' }
|
|
672
|
+
* { type: 'heading', level: 3, text: 'Examples' }
|
|
672
673
|
* { type: 'code', lang: 'tsx', code: 'padding: spacingVars[...]' }
|
|
673
674
|
* { type: 'table', headers: ['Token', 'Value'], rows: [['--spacing-4', '16px']] }
|
|
674
675
|
* { type: 'list', style: 'do', items: ['Use semantic tokens'] }
|
|
@@ -677,6 +678,7 @@ export interface TranslationDoc {
|
|
|
677
678
|
*/
|
|
678
679
|
export type ContentBlock =
|
|
679
680
|
| {type: 'prose'; text: string}
|
|
681
|
+
| {type: 'heading'; level: 3 | 4 | 5 | 6; text: string}
|
|
680
682
|
| {type: 'code'; lang: string; code: string; label?: string}
|
|
681
683
|
| {type: 'table'; headers: string[]; rows: string[][]}
|
|
682
684
|
| {
|
|
@@ -729,6 +731,9 @@ export type TokenPreviewType =
|
|
|
729
731
|
export interface ReferenceSection {
|
|
730
732
|
/** Section title, e.g. "Spacing Tokens", "Light/Dark Mode" */
|
|
731
733
|
title: string;
|
|
734
|
+
/** Navigation category ('guide' | 'foundations'). Mirrors the parent doc's
|
|
735
|
+
* category so sections can be grouped independently in the docsite nav. */
|
|
736
|
+
category?: string;
|
|
732
737
|
/** Ordered content blocks. Mix prose, code, tables, and lists freely. */
|
|
733
738
|
content: ContentBlock[];
|
|
734
739
|
/** Preview type for token tables in this section. When set, the docsite
|