@astryxdesign/core 0.1.8 → 0.1.9-canary.02ef052
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 +58 -3
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +240 -53
- package/dist/Avatar/AvatarStatusDot.d.ts +35 -5
- package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
- package/dist/Avatar/AvatarStatusDot.js +144 -19
- package/dist/AvatarGroup/AvatarGroup.d.ts +7 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +58 -6
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +1 -0
- package/dist/Banner/Banner.d.ts +9 -1
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +33 -4
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +31 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +215 -6
- package/dist/Breadcrumbs/index.d.ts +6 -0
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +10 -1
- package/dist/Button/Button.d.ts +8 -2
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +33 -4
- package/dist/ButtonGroup/ButtonGroup.d.ts +9 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +30 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +80 -11
- package/dist/Calendar/dayCellUtils.d.ts +4 -4
- package/dist/Calendar/dayCellUtils.js +3 -3
- package/dist/Calendar/styles.d.ts +30 -31
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +30 -31
- 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 +46 -16
- package/dist/Chat/ChatComposer.d.ts +8 -0
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +46 -7
- package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
- package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
- package/dist/Chat/ChatComposerDrawer.js +11 -1
- package/dist/Chat/ChatComposerInput.d.ts +20 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +36 -4
- package/dist/Chat/ChatContext.d.ts +33 -0
- package/dist/Chat/ChatContext.d.ts.map +1 -1
- package/dist/Chat/ChatContext.js +16 -2
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +4 -2
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +4 -4
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +4 -4
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +7 -1
- package/dist/Chat/ChatToolCalls.d.ts +5 -1
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +27 -11
- package/dist/Chat/index.d.ts +2 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/index.js +1 -1
- package/dist/Chat/useChatStreamScroll.d.ts +2 -1
- package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
- package/dist/Chat/useChatStreamScroll.js +22 -8
- package/dist/Chat/useSpeechRecognition.d.ts +0 -1
- package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
- package/dist/Chat/useSpeechRecognition.js +1 -1
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +2 -2
- package/dist/CheckboxInput/CheckboxInput.js +5 -5
- package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +11 -1
- package/dist/Citation/Citation.d.ts +22 -1
- package/dist/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +20 -6
- package/dist/ClickableCard/ClickableCard.d.ts +9 -2
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +5 -2
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +22 -9
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +3 -1
- package/dist/CommandPalette/CommandPalette.d.ts +2 -2
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +45 -4
- package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
- package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +6 -1
- package/dist/CommandPalette/CommandPaletteItem.js +1 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +14 -5
- package/dist/ContextMenu/index.d.ts +1 -0
- package/dist/ContextMenu/index.d.ts.map +1 -1
- package/dist/ContextMenu/index.js +3 -1
- package/dist/DateInput/DateInput.d.ts +56 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +59 -21
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.d.ts +10 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +23 -20
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +33 -19
- 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/DropdownMenu.d.ts +6 -0
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +22 -5
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +5 -3
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +5 -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/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +4 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +104 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +427 -0
- package/dist/DropdownMenu/index.d.ts +10 -0
- package/dist/DropdownMenu/index.d.ts.map +1 -1
- package/dist/DropdownMenu/index.js +13 -0
- package/dist/DropdownMenu/menuItemHover.d.ts +23 -0
- package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -0
- package/dist/DropdownMenu/menuItemHover.js +33 -0
- package/dist/DropdownMenu/menuItemRoles.d.ts +8 -0
- package/dist/DropdownMenu/menuItemRoles.d.ts.map +1 -1
- package/dist/DropdownMenu/menuItemRoles.js +10 -1
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +21 -6
- package/dist/Field/Field.d.ts +3 -1
- package/dist/Field/Field.d.ts.map +1 -1
- package/dist/Field/Field.js +6 -4
- package/dist/Field/FieldLabel.d.ts +1 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +43 -16
- package/dist/Field/inputStyles.stylex.d.ts +1 -0
- package/dist/Field/inputStyles.stylex.d.ts.map +1 -1
- package/dist/Field/inputStyles.stylex.js +1 -0
- package/dist/FieldStatus/FieldStatus.d.ts +18 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +60 -6
- package/dist/FileInput/FileInput.d.ts +10 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +54 -35
- 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 +17 -6
- package/dist/Icon/Icon.d.ts +22 -3
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +19 -3
- package/dist/Item/Item.d.ts +6 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +22 -1
- package/dist/Layer/useLayer.d.ts +6 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +2 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +19 -13
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +7 -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 +9 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +104 -50
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +16 -0
- package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
- package/dist/NumberInput/NumberInput.d.ts +10 -2
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +22 -17
- package/dist/Outline/Outline.d.ts +0 -1
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +0 -1
- package/dist/OverflowList/OverflowList.d.ts +20 -3
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +29 -4
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +11 -3
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +3 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +3 -9
- package/dist/PowerSearch/PowerSearch.d.ts +9 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +2 -0
- package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/RadioList/RadioList.d.ts +2 -2
- package/dist/RadioList/RadioListItem.js +4 -4
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +2 -1
- package/dist/SelectableCard/SelectableCard.d.ts +9 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +16 -13
- package/dist/Selector/Selector.d.ts +8 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +65 -19
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +16 -0
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +5 -5
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +13 -10
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +21 -8
- package/dist/SideNav/SideNavItem.d.ts +1 -1
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +12 -10
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +106 -36
- package/dist/Stack/stack.stylex.d.ts +9 -9
- package/dist/Switch/Switch.d.ts +8 -1
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +160 -91
- package/dist/TabList/Tab.js +2 -2
- package/dist/TabList/TabMenu.js +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +33 -6
- package/dist/Table/TableCell.js +3 -3
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/index.d.ts +2 -0
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +15 -11
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +36 -26
- 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 +7 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +105 -12
- 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/types.d.ts +32 -0
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -3
- package/dist/TextArea/TextArea.d.ts +10 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +18 -19
- package/dist/TextInput/TextInput.d.ts +10 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +20 -17
- 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 +10 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +32 -21
- 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/Token/Token.d.ts +30 -3
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +17 -2
- package/dist/Token/index.d.ts +1 -1
- package/dist/Token/index.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.d.ts +10 -3
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +20 -6
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +17 -1
- 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 +3 -0
- package/dist/TreeList/TreeListBranches.d.ts +5 -0
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +18 -10
- package/dist/TreeList/TreeListItem.d.ts +8 -2
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +59 -21
- package/dist/TreeList/TreeListTypes.d.ts +25 -1
- package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
- package/dist/TreeList/index.d.ts +2 -2
- package/dist/TreeList/index.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +20 -11
- package/dist/Typeahead/Typeahead.d.ts +9 -2
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +3 -1
- package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
- package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
- package/dist/Typeahead/TypeaheadItem.js +20 -10
- package/dist/astryx.css +61 -39
- package/dist/astryx.umd.js +53 -53
- 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 +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -1
- package/dist/hooks/isRtlElement.d.ts +18 -0
- package/dist/hooks/isRtlElement.d.ts.map +1 -0
- package/dist/hooks/isRtlElement.js +27 -0
- package/dist/hooks/useDevWarning.d.ts +18 -0
- package/dist/hooks/useDevWarning.d.ts.map +1 -0
- package/dist/hooks/useDevWarning.js +49 -0
- package/dist/hooks/useGridFocus.d.ts +6 -1
- package/dist/hooks/useGridFocus.d.ts.map +1 -1
- package/dist/hooks/useGridFocus.js +12 -9
- package/dist/hooks/useInputStatusIcon.d.ts +38 -0
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -0
- package/dist/hooks/useInputStatusIcon.js +158 -0
- package/dist/hooks/useListFocus.d.ts +39 -1
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useListFocus.js +54 -9
- package/dist/hooks/useOverflow.d.ts +19 -0
- package/dist/hooks/useOverflow.d.ts.map +1 -1
- package/dist/hooks/useOverflow.js +36 -25
- package/dist/i18n/InternationalizationContext.d.ts +1 -0
- package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
- package/dist/i18n/InternationalizationContext.js +3 -0
- package/dist/i18n/InternationalizationProvider.d.ts +8 -1
- package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
- package/dist/i18n/InternationalizationProvider.js +5 -1
- package/dist/i18n/getLocaleDirection.d.ts +18 -0
- package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
- package/dist/i18n/getLocaleDirection.js +29 -0
- package/dist/i18n/index.d.ts +6 -0
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +7 -1
- package/dist/i18n/resolve.d.ts.map +1 -1
- package/dist/i18n/resolve.js +7 -18
- package/dist/i18n/useDirection.d.ts +2 -0
- package/dist/i18n/useDirection.d.ts.map +1 -0
- package/dist/i18n/useDirection.js +27 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +2 -7
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +13 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +51 -0
- package/dist/theme/hct.d.ts +0 -1
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
- package/dist/utils/devWarning.d.ts +42 -0
- package/dist/utils/devWarning.d.ts.map +1 -0
- package/dist/utils/devWarning.js +88 -0
- package/dist/utils/index.d.ts +4 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -2
- package/dist/utils/plainDate.d.ts +30 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +65 -3
- package/dist/utils/rtlStyles.d.ts +24 -0
- package/dist/utils/rtlStyles.d.ts.map +1 -0
- package/dist/utils/rtlStyles.js +27 -0
- package/dist/utils/types.d.ts +13 -0
- package/dist/utils/types.d.ts.map +1 -1
- package/locales/en.json +104 -0
- package/locales/fr-FR.json +14 -0
- package/locales/pseudo.json +78 -0
- package/package.json +6 -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 +64 -5
- package/src/Avatar/Avatar.test.tsx +374 -1
- package/src/Avatar/Avatar.tsx +367 -69
- package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
- package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
- package/src/Avatar/AvatarStatusDot.tsx +180 -21
- package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
- package/src/AvatarGroup/AvatarGroup.test.tsx +141 -1
- package/src/AvatarGroup/AvatarGroup.tsx +58 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
- package/src/Banner/Banner.doc.mjs +9 -0
- package/src/Banner/Banner.test.tsx +30 -0
- package/src/Banner/Banner.tsx +53 -9
- package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
- package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
- package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +335 -2
- package/src/Breadcrumbs/index.ts +31 -0
- package/src/Button/Button.doc.mjs +9 -4
- package/src/Button/Button.test.tsx +49 -0
- package/src/Button/Button.tsx +27 -3
- package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
- package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
- package/src/ButtonGroup/ButtonGroup.tsx +32 -0
- package/src/Calendar/Calendar.doc.mjs +12 -1
- package/src/Calendar/Calendar.test.tsx +362 -19
- package/src/Calendar/Calendar.tsx +111 -32
- package/src/Calendar/dayCellUtils.test.ts +23 -18
- package/src/Calendar/dayCellUtils.ts +3 -3
- package/src/Calendar/styles.ts +33 -39
- 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 +59 -10
- package/src/Chat/ChatComposer.doc.mjs +12 -3
- package/src/Chat/ChatComposer.test.tsx +115 -0
- package/src/Chat/ChatComposer.tsx +73 -9
- package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
- package/src/Chat/ChatComposerDrawer.tsx +11 -1
- package/src/Chat/ChatComposerInput.doc.mjs +7 -0
- package/src/Chat/ChatComposerInput.test.tsx +103 -0
- package/src/Chat/ChatComposerInput.tsx +51 -5
- package/src/Chat/ChatContext.tsx +37 -10
- package/src/Chat/ChatDictationButton.tsx +11 -2
- package/src/Chat/ChatLayout.tsx +7 -5
- package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
- package/src/Chat/ChatMessageMetadata.tsx +1 -2
- package/src/Chat/ChatSendButton.tsx +11 -1
- package/src/Chat/ChatToolCalls.test.tsx +64 -0
- package/src/Chat/ChatToolCalls.tsx +33 -5
- package/src/Chat/index.ts +5 -1
- package/src/Chat/useChatStreamScroll.test.tsx +49 -0
- package/src/Chat/useChatStreamScroll.ts +27 -10
- package/src/Chat/useSpeechRecognition.ts +1 -1
- package/src/Chat/useTriggerMenu.tsx +4 -2
- package/src/CheckboxInput/CheckboxInput.doc.mjs +6 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
- package/src/CheckboxInput/CheckboxInput.tsx +5 -5
- package/src/CheckboxList/CheckboxList.doc.mjs +6 -0
- package/src/CheckboxList/CheckboxList.test.tsx +81 -3
- package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
- package/src/CheckboxList/CheckboxListItem.tsx +41 -5
- package/src/Citation/Citation.doc.mjs +4 -3
- package/src/Citation/Citation.test.tsx +97 -0
- package/src/Citation/Citation.tsx +43 -11
- package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
- package/src/ClickableCard/ClickableCard.test.tsx +34 -0
- package/src/ClickableCard/ClickableCard.tsx +13 -3
- package/src/CodeBlock/CodeBlock.test.tsx +56 -0
- package/src/CodeBlock/CodeBlock.tsx +45 -10
- package/src/Collapsible/Collapsible.doc.mjs +1 -0
- package/src/Collapsible/Collapsible.test.tsx +7 -0
- package/src/Collapsible/Collapsible.tsx +16 -6
- package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
- package/src/CommandPalette/CommandPalette.test.tsx +95 -1
- package/src/CommandPalette/CommandPalette.tsx +44 -3
- package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
- package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
- package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
- package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
- package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
- package/src/ContextMenu/ContextMenu.test.tsx +235 -0
- package/src/ContextMenu/ContextMenu.tsx +13 -11
- package/src/ContextMenu/index.ts +5 -0
- package/src/DateInput/DateInput.doc.mjs +41 -0
- package/src/DateInput/DateInput.test.tsx +338 -0
- package/src/DateInput/DateInput.tsx +119 -32
- package/src/DateInput/index.ts +1 -0
- package/src/DateRangeInput/DateRangeInput.doc.mjs +16 -0
- package/src/DateRangeInput/DateRangeInput.test.tsx +140 -0
- package/src/DateRangeInput/DateRangeInput.tsx +42 -30
- package/src/DateTimeInput/DateTimeInput.doc.mjs +22 -1
- package/src/DateTimeInput/DateTimeInput.test.tsx +147 -0
- package/src/DateTimeInput/DateTimeInput.tsx +58 -41
- 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 +229 -0
- package/src/DropdownMenu/DropdownMenu.tsx +31 -12
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +9 -4
- package/src/DropdownMenu/DropdownMenuItem.tsx +9 -3
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +8 -2
- package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +88 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +635 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +553 -0
- package/src/DropdownMenu/index.ts +16 -0
- package/src/DropdownMenu/menuItemHover.ts +39 -0
- package/src/DropdownMenu/menuItemRoles.ts +9 -0
- package/src/DropdownMenu/renderDropdownItems.tsx +29 -15
- package/src/Field/Field.test.tsx +57 -12
- package/src/Field/Field.tsx +20 -14
- package/src/Field/FieldLabel.tsx +9 -1
- package/src/Field/inputStyles.stylex.ts +2 -0
- package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
- package/src/FieldStatus/FieldStatus.test.tsx +150 -40
- package/src/FieldStatus/FieldStatus.tsx +69 -5
- package/src/FileInput/FileInput.doc.mjs +23 -2
- package/src/FileInput/FileInput.test.tsx +135 -12
- package/src/FileInput/FileInput.tsx +65 -51
- 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 +39 -5
- package/src/Icon/Icon.doc.mjs +16 -2
- package/src/Icon/Icon.test.tsx +89 -0
- package/src/Icon/Icon.tsx +58 -5
- package/src/IconButton/IconButton.doc.mjs +8 -0
- package/src/IconButton/IconButton.test.tsx +15 -18
- package/src/Item/Item.test.tsx +40 -18
- package/src/Item/Item.tsx +38 -2
- package/src/Layer/useLayer.tsx +8 -0
- package/src/Lightbox/Lightbox.tsx +15 -7
- package/src/List/List.test.tsx +9 -8
- package/src/Markdown/Markdown.test.tsx +21 -0
- package/src/Markdown/Markdown.tsx +4 -0
- 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 +24 -2
- package/src/MultiSelector/MultiSelector.test.tsx +498 -3
- package/src/MultiSelector/MultiSelector.tsx +149 -65
- package/src/MultiSelector/hooks.ts +17 -0
- package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
- package/src/NumberInput/NumberInput.doc.mjs +21 -0
- package/src/NumberInput/NumberInput.test.tsx +82 -7
- package/src/NumberInput/NumberInput.tsx +36 -28
- package/src/Outline/Outline.tsx +0 -1
- package/src/OverflowList/OverflowList.doc.mjs +39 -6
- package/src/OverflowList/OverflowList.test.tsx +111 -0
- package/src/OverflowList/OverflowList.tsx +48 -8
- package/src/Pagination/Pagination.tsx +11 -3
- package/src/Popover/Popover.tsx +7 -4
- package/src/Popover/usePopover.tsx +9 -13
- package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
- package/src/PowerSearch/PowerSearch.test.tsx +43 -0
- package/src/PowerSearch/PowerSearch.tsx +10 -1
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
- package/src/PowerSearch/usePowerSearchSource.ts +1 -2
- package/src/RadioList/RadioList.doc.mjs +6 -0
- package/src/RadioList/RadioList.tsx +2 -2
- package/src/RadioList/RadioListItem.tsx +4 -4
- package/src/SegmentedControl/SegmentedControlItem.tsx +2 -0
- package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
- package/src/SelectableCard/SelectableCard.test.tsx +46 -4
- package/src/SelectableCard/SelectableCard.tsx +29 -16
- package/src/Selector/Selector.doc.mjs +15 -0
- package/src/Selector/Selector.test.tsx +417 -0
- package/src/Selector/Selector.tsx +86 -21
- package/src/Selector/hooks.ts +17 -0
- package/src/SideNav/SideNav.test.tsx +119 -3
- package/src/SideNav/SideNav.tsx +1 -8
- package/src/SideNav/SideNavCollapseButton.tsx +15 -8
- package/src/SideNav/SideNavHeading.tsx +24 -8
- package/src/SideNav/SideNavItem.tsx +10 -4
- package/src/Slider/Slider.doc.mjs +6 -0
- package/src/Slider/Slider.test.tsx +314 -13
- package/src/Slider/Slider.tsx +117 -28
- package/src/Switch/Switch.doc.mjs +142 -42
- package/src/Switch/Switch.test.tsx +54 -1
- package/src/Switch/Switch.tsx +90 -33
- package/src/TabList/Tab.tsx +2 -2
- package/src/TabList/TabMenu.tsx +2 -2
- package/src/Table/BaseTable.tsx +37 -7
- package/src/Table/Table.doc.mjs +11 -0
- package/src/Table/Table.test.tsx +85 -0
- package/src/Table/TableCell.tsx +3 -3
- package/src/Table/TableHeaderCell.tsx +3 -3
- package/src/Table/index.ts +5 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +15 -8
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +24 -17
- 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 +77 -3
- package/src/Table/plugins/selection/useTableSelection.tsx +22 -1
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
- package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
- package/src/Table/plugins/tree/useTableTreeData.tsx +139 -8
- package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
- package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
- package/src/Table/types.ts +33 -0
- package/src/Table/useBaseTablePlugins.ts +10 -6
- package/src/Table/useTableRowStatus.doc.mjs +30 -0
- package/src/Table/useTableSelection.doc.mjs +65 -14
- package/src/Table/useTableTreeData.doc.mjs +29 -0
- package/src/Table/useTableTreeState.doc.mjs +2 -2
- package/src/TextArea/TextArea.doc.mjs +21 -0
- package/src/TextArea/TextArea.test.tsx +32 -1
- package/src/TextArea/TextArea.tsx +27 -26
- package/src/TextInput/TextInput.doc.mjs +21 -0
- package/src/TextInput/TextInput.test.tsx +150 -0
- package/src/TextInput/TextInput.tsx +28 -25
- package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
- package/src/Thumbnail/Thumbnail.test.tsx +98 -7
- package/src/Thumbnail/Thumbnail.tsx +142 -42
- package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
- package/src/TimeInput/TimeInput.doc.mjs +21 -0
- package/src/TimeInput/TimeInput.test.tsx +99 -1
- package/src/TimeInput/TimeInput.tsx +43 -31
- 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/Token/Token.test.tsx +21 -15
- package/src/Token/Token.tsx +31 -14
- package/src/Token/index.ts +1 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +38 -2
- package/src/Tokenizer/Tokenizer.test.tsx +206 -2
- package/src/Tokenizer/Tokenizer.tsx +30 -6
- package/src/Tooltip/Tooltip.test.tsx +46 -0
- package/src/Tooltip/useTooltip.tsx +20 -0
- 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 +28 -0
- package/src/TreeList/TreeList.test.tsx +272 -0
- package/src/TreeList/TreeList.tsx +23 -2
- package/src/TreeList/TreeListBranches.tsx +24 -8
- package/src/TreeList/TreeListItem.tsx +84 -22
- package/src/TreeList/TreeListTypes.ts +27 -1
- package/src/TreeList/index.ts +2 -2
- package/src/Typeahead/BaseTypeahead.tsx +30 -15
- package/src/Typeahead/Typeahead.doc.mjs +13 -0
- package/src/Typeahead/Typeahead.test.tsx +50 -0
- package/src/Typeahead/Typeahead.tsx +11 -1
- package/src/Typeahead/TypeaheadItem.tsx +2 -1
- package/src/__tests__/inputWidthContract.test.tsx +62 -0
- package/src/authoring/doc.ts +1 -3
- package/src/doc-mjs.d.ts +19 -0
- 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 +8 -0
- package/src/hooks/isRtlElement.ts +27 -0
- package/src/hooks/useDevWarning.test.tsx +45 -0
- package/src/hooks/useDevWarning.ts +54 -0
- package/src/hooks/useGridFocus.doc.mjs +3 -3
- package/src/hooks/useGridFocus.test.tsx +41 -0
- package/src/hooks/useGridFocus.ts +21 -10
- package/src/hooks/useInputStatusIcon.test.tsx +162 -0
- package/src/hooks/useInputStatusIcon.tsx +224 -0
- package/src/hooks/useListFocus.doc.mjs +25 -3
- package/src/hooks/useListFocus.test.tsx +153 -1
- package/src/hooks/useListFocus.ts +102 -9
- package/src/hooks/useOverflow.test.ts +96 -4
- package/src/hooks/useOverflow.ts +74 -33
- package/src/i18n/InternationalizationContext.ts +4 -0
- package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
- package/src/i18n/InternationalizationProvider.tsx +12 -2
- package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
- package/src/i18n/__tests__/useDirection.test.tsx +66 -0
- package/src/i18n/getLocaleDirection.ts +29 -0
- package/src/i18n/index.ts +6 -0
- package/src/i18n/resolve.ts +9 -21
- package/src/i18n/useDirection.ts +29 -0
- package/src/reset.css +0 -26
- package/src/reset.test.ts +60 -0
- package/src/theme/Theme.tsx +11 -14
- package/src/theme/derivedVarRegistry.test.ts +1 -0
- package/src/theme/derivedVarRegistry.ts +6 -0
- package/src/theme/generateThemeRules.test.ts +107 -0
- package/src/theme/generateThemeRules.ts +56 -0
- package/src/theme/hct.ts +1 -1
- package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
- package/src/utils/devWarning.test.ts +56 -0
- package/src/utils/devWarning.ts +102 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/plainDate.test.ts +46 -6
- package/src/utils/plainDate.ts +69 -3
- package/src/utils/rtlStyles.ts +27 -0
- package/src/utils/types.ts +14 -0
|
@@ -55,14 +55,18 @@ const columns: TableColumn<FileRow>[] = [
|
|
|
55
55
|
];
|
|
56
56
|
|
|
57
57
|
function TreeTable(
|
|
58
|
-
props: Partial<UseTableTreeStateConfig<FileRow>> & {
|
|
58
|
+
props: Partial<UseTableTreeStateConfig<FileRow>> & {
|
|
59
|
+
data?: FileRow[];
|
|
60
|
+
hasExpandAllControl?: boolean;
|
|
61
|
+
},
|
|
59
62
|
) {
|
|
63
|
+
const {hasExpandAllControl, ...stateProps} = props;
|
|
60
64
|
const {visibleData, treeConfig} = useTableTreeState<FileRow>({
|
|
61
65
|
data: props.data ?? fileTree,
|
|
62
66
|
idKey: 'id',
|
|
63
|
-
...
|
|
67
|
+
...stateProps,
|
|
64
68
|
});
|
|
65
|
-
const tree = useTableTreeData(treeConfig);
|
|
69
|
+
const tree = useTableTreeData({...treeConfig, hasExpandAllControl});
|
|
66
70
|
|
|
67
71
|
return (
|
|
68
72
|
<Table data={visibleData} columns={columns} idKey="id" plugins={{tree}} />
|
|
@@ -592,3 +596,131 @@ describe('useTableTreeData — composition with sorting', () => {
|
|
|
592
596
|
expect(names).toEqual(['src', 'utils.ts', 'components', 'README.md']);
|
|
593
597
|
});
|
|
594
598
|
});
|
|
599
|
+
|
|
600
|
+
// =============================================================================
|
|
601
|
+
// header expand-all control
|
|
602
|
+
// =============================================================================
|
|
603
|
+
|
|
604
|
+
describe('useTableTreeData: expand-all header control', () => {
|
|
605
|
+
/** The header row is the first row; return its expand-all toggle if present. */
|
|
606
|
+
function queryExpandAllButton(): HTMLElement | null {
|
|
607
|
+
const headerRow = screen.getAllByRole('row')[0];
|
|
608
|
+
return (
|
|
609
|
+
within(headerRow).queryByRole('button', {name: /expand all/i}) ??
|
|
610
|
+
within(headerRow).queryByRole('button', {name: /collapse all/i})
|
|
611
|
+
);
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
it('renders no expand-all control by default', () => {
|
|
615
|
+
render(<TreeTable defaultExpandedIds={['src']} />);
|
|
616
|
+
expect(queryExpandAllButton()).toBeNull();
|
|
617
|
+
});
|
|
618
|
+
|
|
619
|
+
it('renders an "Expand all" toggle in the tree column header when enabled and collapsed', () => {
|
|
620
|
+
render(<TreeTable hasExpandAllControl />);
|
|
621
|
+
const headerRow = screen.getAllByRole('row')[0];
|
|
622
|
+
expect(
|
|
623
|
+
within(headerRow).getByRole('button', {name: /expand all/i}),
|
|
624
|
+
).toBeInTheDocument();
|
|
625
|
+
});
|
|
626
|
+
|
|
627
|
+
it('expands every row when the collapsed toggle is clicked', async () => {
|
|
628
|
+
const user = userEvent.setup();
|
|
629
|
+
render(<TreeTable hasExpandAllControl />);
|
|
630
|
+
|
|
631
|
+
// Collapsed: only roots are visible.
|
|
632
|
+
expect(getBodyRows()).toHaveLength(2);
|
|
633
|
+
|
|
634
|
+
await user.click(
|
|
635
|
+
within(screen.getAllByRole('row')[0]).getByRole('button', {
|
|
636
|
+
name: /expand all/i,
|
|
637
|
+
}),
|
|
638
|
+
);
|
|
639
|
+
|
|
640
|
+
// Every level is now visible.
|
|
641
|
+
expect(
|
|
642
|
+
getBodyRows().map(r => within(r).getByText(/.+/, {selector: 'td *'})),
|
|
643
|
+
).not.toHaveLength(2);
|
|
644
|
+
expect(screen.getByText('Button.tsx')).toBeInTheDocument();
|
|
645
|
+
});
|
|
646
|
+
|
|
647
|
+
it('relabels the toggle "Collapse all" once everything is expanded', () => {
|
|
648
|
+
render(
|
|
649
|
+
<TreeTable
|
|
650
|
+
hasExpandAllControl
|
|
651
|
+
defaultExpandedIds={['src', 'components']}
|
|
652
|
+
/>,
|
|
653
|
+
);
|
|
654
|
+
const headerRow = screen.getAllByRole('row')[0];
|
|
655
|
+
expect(
|
|
656
|
+
within(headerRow).getByRole('button', {name: /collapse all/i}),
|
|
657
|
+
).toBeInTheDocument();
|
|
658
|
+
});
|
|
659
|
+
|
|
660
|
+
it('collapses back to roots when the expanded toggle is clicked', async () => {
|
|
661
|
+
const user = userEvent.setup();
|
|
662
|
+
render(
|
|
663
|
+
<TreeTable
|
|
664
|
+
hasExpandAllControl
|
|
665
|
+
defaultExpandedIds={['src', 'components']}
|
|
666
|
+
/>,
|
|
667
|
+
);
|
|
668
|
+
expect(screen.getByText('Button.tsx')).toBeInTheDocument();
|
|
669
|
+
|
|
670
|
+
await user.click(
|
|
671
|
+
within(screen.getAllByRole('row')[0]).getByRole('button', {
|
|
672
|
+
name: /collapse all/i,
|
|
673
|
+
}),
|
|
674
|
+
);
|
|
675
|
+
|
|
676
|
+
expect(getBodyRows()).toHaveLength(2);
|
|
677
|
+
expect(screen.queryByText('Button.tsx')).not.toBeInTheDocument();
|
|
678
|
+
});
|
|
679
|
+
|
|
680
|
+
it('marks the toggle aria-expanded=false in the indeterminate (partial) state', () => {
|
|
681
|
+
// 'src' expanded but 'components' not: partially expanded.
|
|
682
|
+
render(<TreeTable hasExpandAllControl defaultExpandedIds={['src']} />);
|
|
683
|
+
const headerRow = screen.getAllByRole('row')[0];
|
|
684
|
+
const toggle = within(headerRow).getByRole('button', {
|
|
685
|
+
name: /expand all/i,
|
|
686
|
+
});
|
|
687
|
+
expect(toggle).toHaveAttribute('aria-expanded', 'false');
|
|
688
|
+
});
|
|
689
|
+
|
|
690
|
+
it('does not render the control for flat data even when enabled', () => {
|
|
691
|
+
const flat: FileRow[] = [
|
|
692
|
+
{id: 'a', name: 'A', size: 1},
|
|
693
|
+
{id: 'b', name: 'B', size: 2},
|
|
694
|
+
];
|
|
695
|
+
render(<TreeTable data={flat} hasExpandAllControl />);
|
|
696
|
+
expect(queryExpandAllButton()).toBeNull();
|
|
697
|
+
});
|
|
698
|
+
|
|
699
|
+
it('renders the toggle inline with the header label, not stacked above it', () => {
|
|
700
|
+
render(<TreeTable hasExpandAllControl />);
|
|
701
|
+
const headerRow = screen.getAllByRole('row')[0];
|
|
702
|
+
const toggle = within(headerRow).getByRole('button', {
|
|
703
|
+
name: /expand all/i,
|
|
704
|
+
});
|
|
705
|
+
// The tree column's <th> holds the label text ('Name'). The bug was that
|
|
706
|
+
// the toggle went into the `before` slot, which BaseTable renders as a
|
|
707
|
+
// block sibling of the label, stacking the chevron ABOVE the title. The
|
|
708
|
+
// fix wraps the label + toggle in one inline-flex container, so they must
|
|
709
|
+
// share the same immediate parent (the toggle is a sibling of the label,
|
|
710
|
+
// not in a separate stacked slot).
|
|
711
|
+
const th = toggle.closest('th');
|
|
712
|
+
expect(th).not.toBeNull();
|
|
713
|
+
const label = within(th as HTMLElement).getByText('Name');
|
|
714
|
+
const wrapper = label.parentElement as HTMLElement;
|
|
715
|
+
expect(wrapper).toContainElement(toggle);
|
|
716
|
+
// The toggle precedes the label within that shared wrapper (chevron sits
|
|
717
|
+
// to the LEFT of the title). StyleX compiles the inline-flex layout to a
|
|
718
|
+
// class on this wrapper; assert the class is present (real CSS is not
|
|
719
|
+
// applied in jsdom, so we check the class hook, not computed display).
|
|
720
|
+
expect(wrapper.className).not.toBe('');
|
|
721
|
+
const kids = Array.from(wrapper.childNodes);
|
|
722
|
+
expect(kids.indexOf(toggle)).toBeLessThan(
|
|
723
|
+
kids.findIndex(n => n.textContent === 'Name' || n.contains(label)),
|
|
724
|
+
);
|
|
725
|
+
});
|
|
726
|
+
});
|
|
@@ -42,8 +42,13 @@ import {
|
|
|
42
42
|
import * as stylex from '@stylexjs/stylex';
|
|
43
43
|
import {colorVars, radiusVars, spacingVars} from '../../../theme/tokens.stylex';
|
|
44
44
|
import {Icon} from '../../../Icon';
|
|
45
|
-
import {mergeRefs} from '../../../utils';
|
|
46
|
-
import type {
|
|
45
|
+
import {mergeRefs, rtlStyles} from '../../../utils';
|
|
46
|
+
import type {
|
|
47
|
+
TablePlugin,
|
|
48
|
+
TableColumn,
|
|
49
|
+
BodyRowRenderProps,
|
|
50
|
+
HeaderCellRenderProps,
|
|
51
|
+
} from '../../types';
|
|
47
52
|
import {useTranslator} from '../../../i18n';
|
|
48
53
|
|
|
49
54
|
// =============================================================================
|
|
@@ -78,6 +83,22 @@ export interface UseTableTreeDataConfig<T extends Record<string, unknown>> {
|
|
|
78
83
|
* identically to a Table without the plugin.
|
|
79
84
|
*/
|
|
80
85
|
hasExpandableRows: boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Aggregate expansion state across every expandable row. When provided
|
|
88
|
+
* together with `onExpandAll`/`onCollapseAll`, the tree column header shows
|
|
89
|
+
* an expand-all toggle. `useTableTreeState` supplies all three.
|
|
90
|
+
*/
|
|
91
|
+
isAllExpanded?: boolean | 'indeterminate';
|
|
92
|
+
/** Expand every expandable row. Wired to the header expand-all control. */
|
|
93
|
+
onExpandAll?: () => void;
|
|
94
|
+
/** Collapse every row. Wired to the header expand-all control. */
|
|
95
|
+
onCollapseAll?: () => void;
|
|
96
|
+
/**
|
|
97
|
+
* Show the expand-all/collapse-all toggle in the tree column header. Needs
|
|
98
|
+
* `isAllExpanded` and `onExpandAll`/`onCollapseAll` to be present.
|
|
99
|
+
* @default false
|
|
100
|
+
*/
|
|
101
|
+
hasExpandAllControl?: boolean;
|
|
81
102
|
/**
|
|
82
103
|
* Indent step per level, as spacing tokens.
|
|
83
104
|
* @default 'md'
|
|
@@ -243,6 +264,13 @@ const treeStyles = stylex.create({
|
|
|
243
264
|
height: '24px',
|
|
244
265
|
flexShrink: '0',
|
|
245
266
|
},
|
|
267
|
+
/** Header expand-all toggle: same affordance as a row expander. */
|
|
268
|
+
headerCell: {
|
|
269
|
+
display: 'inline-flex',
|
|
270
|
+
alignItems: 'center',
|
|
271
|
+
gap: spacingVars['--spacing-1'],
|
|
272
|
+
minWidth: 0,
|
|
273
|
+
},
|
|
246
274
|
});
|
|
247
275
|
|
|
248
276
|
// =============================================================================
|
|
@@ -271,12 +299,63 @@ function TreeExpander({
|
|
|
271
299
|
: t('@astryx.tableTree.expandRow')
|
|
272
300
|
}
|
|
273
301
|
aria-expanded={isExpanded}>
|
|
274
|
-
<span
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
302
|
+
<span {...stylex.props(rtlStyles.mirror)}>
|
|
303
|
+
<span
|
|
304
|
+
{...stylex.props(
|
|
305
|
+
treeStyles.chevron,
|
|
306
|
+
isExpanded && treeStyles.chevronExpanded,
|
|
307
|
+
)}>
|
|
308
|
+
<Icon icon="chevronRight" size="xsm" />
|
|
309
|
+
</span>
|
|
310
|
+
</span>
|
|
311
|
+
</button>
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Header expand-all/collapse-all toggle. Rendered in the tree column header
|
|
317
|
+
* when `hasExpandAllControl` is set and the state hook supplies the aggregate
|
|
318
|
+
* `isAllExpanded` plus `onExpandAll`/`onCollapseAll`. Shares the chevron
|
|
319
|
+
* affordance with the per-row expander; the chevron points down (expanded)
|
|
320
|
+
* only when every expandable row is expanded, matching the row expander.
|
|
321
|
+
*/
|
|
322
|
+
function TreeExpandAllToggle({
|
|
323
|
+
isAllExpanded,
|
|
324
|
+
onExpandAll,
|
|
325
|
+
onCollapseAll,
|
|
326
|
+
}: {
|
|
327
|
+
isAllExpanded: boolean | 'indeterminate';
|
|
328
|
+
onExpandAll: () => void;
|
|
329
|
+
onCollapseAll: () => void;
|
|
330
|
+
}) {
|
|
331
|
+
const t = useTranslator();
|
|
332
|
+
const allExpanded = isAllExpanded === true;
|
|
333
|
+
return (
|
|
334
|
+
<button
|
|
335
|
+
type="button"
|
|
336
|
+
{...stylex.props(treeStyles.expanderButton)}
|
|
337
|
+
onClick={e => {
|
|
338
|
+
e.stopPropagation();
|
|
339
|
+
if (allExpanded) {
|
|
340
|
+
onCollapseAll();
|
|
341
|
+
} else {
|
|
342
|
+
onExpandAll();
|
|
343
|
+
}
|
|
344
|
+
}}
|
|
345
|
+
aria-label={
|
|
346
|
+
allExpanded
|
|
347
|
+
? t('@astryx.tableTree.collapseAllRows')
|
|
348
|
+
: t('@astryx.tableTree.expandAllRows')
|
|
349
|
+
}
|
|
350
|
+
aria-expanded={allExpanded}>
|
|
351
|
+
<span {...stylex.props(rtlStyles.mirror)}>
|
|
352
|
+
<span
|
|
353
|
+
{...stylex.props(
|
|
354
|
+
treeStyles.chevron,
|
|
355
|
+
allExpanded && treeStyles.chevronExpanded,
|
|
356
|
+
)}>
|
|
357
|
+
<Icon icon="chevronRight" size="xsm" />
|
|
358
|
+
</span>
|
|
280
359
|
</span>
|
|
281
360
|
</button>
|
|
282
361
|
);
|
|
@@ -380,6 +459,11 @@ export function useTableTreeData<T extends Record<string, unknown>>(
|
|
|
380
459
|
output: TableColumn<T>[];
|
|
381
460
|
} | null>(null);
|
|
382
461
|
|
|
462
|
+
// The resolved tree column key, written by transformColumns (pipeline step 1)
|
|
463
|
+
// and read by transformHeaderCell (step 4) to place the expand-all toggle on
|
|
464
|
+
// the same column that carries the row expanders.
|
|
465
|
+
const treeKeyRef = useRef<string | undefined>(undefined);
|
|
466
|
+
|
|
383
467
|
// The plugin object is created once per store and never changes shape:
|
|
384
468
|
// every transform reads the live config through the store, and
|
|
385
469
|
// internally no-ops when hasExpandableRows is false. Swapping between
|
|
@@ -426,6 +510,7 @@ export function useTableTreeData<T extends Record<string, unknown>>(
|
|
|
426
510
|
? treeColumnKey
|
|
427
511
|
: (columns.find(c => !c.key.startsWith('__'))?.key ??
|
|
428
512
|
columns[0]?.key);
|
|
513
|
+
treeKeyRef.current = treeKey;
|
|
429
514
|
|
|
430
515
|
// Migration guarantee: flat data renders identically to a Table
|
|
431
516
|
// without the plugin.
|
|
@@ -459,6 +544,52 @@ export function useTableTreeData<T extends Record<string, unknown>>(
|
|
|
459
544
|
return output;
|
|
460
545
|
},
|
|
461
546
|
|
|
547
|
+
transformHeaderCell(
|
|
548
|
+
props: HeaderCellRenderProps,
|
|
549
|
+
column: TableColumn<T>,
|
|
550
|
+
): HeaderCellRenderProps {
|
|
551
|
+
const {
|
|
552
|
+
hasExpandableRows,
|
|
553
|
+
hasExpandAllControl,
|
|
554
|
+
isAllExpanded,
|
|
555
|
+
onExpandAll,
|
|
556
|
+
onCollapseAll,
|
|
557
|
+
} = store.getConfig();
|
|
558
|
+
|
|
559
|
+
// Only the tree column carries the toggle, and only when the control
|
|
560
|
+
// is enabled, the data is actually hierarchical, and the state hook
|
|
561
|
+
// supplied the aggregate state plus both handlers. Otherwise this is a
|
|
562
|
+
// pass-through (flat data stays a no-op).
|
|
563
|
+
if (
|
|
564
|
+
!hasExpandAllControl ||
|
|
565
|
+
!hasExpandableRows ||
|
|
566
|
+
column.key !== treeKeyRef.current ||
|
|
567
|
+
isAllExpanded === undefined ||
|
|
568
|
+
!onExpandAll ||
|
|
569
|
+
!onCollapseAll
|
|
570
|
+
) {
|
|
571
|
+
return props;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
// Wrap the header label + the toggle in one inline-flex row so the
|
|
575
|
+
// chevron sits to the LEFT of the title on the same line. BaseTable
|
|
576
|
+
// only applies its own flex row for the `after` slot, so a bare
|
|
577
|
+
// `before` would stack above the label in the block-level <th>.
|
|
578
|
+
return {
|
|
579
|
+
...props,
|
|
580
|
+
content: (
|
|
581
|
+
<span {...stylex.props(treeStyles.headerCell)}>
|
|
582
|
+
<TreeExpandAllToggle
|
|
583
|
+
isAllExpanded={isAllExpanded}
|
|
584
|
+
onExpandAll={onExpandAll}
|
|
585
|
+
onCollapseAll={onCollapseAll}
|
|
586
|
+
/>
|
|
587
|
+
{props.content}
|
|
588
|
+
</span>
|
|
589
|
+
),
|
|
590
|
+
};
|
|
591
|
+
},
|
|
592
|
+
|
|
462
593
|
transformBodyRow(props: BodyRowRenderProps, item: T) {
|
|
463
594
|
// Attach a ref that subscribes to the store for imperative row
|
|
464
595
|
// ARIA. The ref returns a cleanup so React unsubscribes on
|
|
@@ -634,3 +634,107 @@ describe('useTableTreeState — semantics edges', () => {
|
|
|
634
634
|
expect(ids(result.current.visibleData)).toEqual(['src', 'readme']);
|
|
635
635
|
});
|
|
636
636
|
});
|
|
637
|
+
|
|
638
|
+
// =============================================================================
|
|
639
|
+
// isAllExpanded (drives the header expand-all control)
|
|
640
|
+
// =============================================================================
|
|
641
|
+
|
|
642
|
+
describe('useTableTreeState: isAllExpanded', () => {
|
|
643
|
+
it('reports false when nothing is expanded', () => {
|
|
644
|
+
const {result} = renderHook(() =>
|
|
645
|
+
useTableTreeState({data: fileTree, idKey: 'id'}),
|
|
646
|
+
);
|
|
647
|
+
|
|
648
|
+
expect(result.current.isAllExpanded).toBe(false);
|
|
649
|
+
});
|
|
650
|
+
|
|
651
|
+
it('reports true only when every expandable row is expanded', () => {
|
|
652
|
+
const {result} = renderHook(() =>
|
|
653
|
+
useTableTreeState({data: fileTree, idKey: 'id'}),
|
|
654
|
+
);
|
|
655
|
+
|
|
656
|
+
act(() => {
|
|
657
|
+
result.current.expandAll();
|
|
658
|
+
});
|
|
659
|
+
|
|
660
|
+
expect(result.current.isAllExpanded).toBe(true);
|
|
661
|
+
});
|
|
662
|
+
|
|
663
|
+
it("reports 'indeterminate' when some but not all expandable rows are expanded", () => {
|
|
664
|
+
const {result} = renderHook(() =>
|
|
665
|
+
useTableTreeState({
|
|
666
|
+
data: fileTree,
|
|
667
|
+
idKey: 'id',
|
|
668
|
+
defaultExpandedIds: ['src'],
|
|
669
|
+
}),
|
|
670
|
+
);
|
|
671
|
+
|
|
672
|
+
// 'src' and 'components' are both expandable; only 'src' is expanded.
|
|
673
|
+
expect(result.current.isAllExpanded).toBe('indeterminate');
|
|
674
|
+
});
|
|
675
|
+
|
|
676
|
+
it('returns to false after collapseAll', () => {
|
|
677
|
+
const {result} = renderHook(() =>
|
|
678
|
+
useTableTreeState({
|
|
679
|
+
data: fileTree,
|
|
680
|
+
idKey: 'id',
|
|
681
|
+
defaultExpandedIds: ['src', 'components'],
|
|
682
|
+
}),
|
|
683
|
+
);
|
|
684
|
+
|
|
685
|
+
act(() => {
|
|
686
|
+
result.current.collapseAll();
|
|
687
|
+
});
|
|
688
|
+
|
|
689
|
+
expect(result.current.isAllExpanded).toBe(false);
|
|
690
|
+
});
|
|
691
|
+
|
|
692
|
+
it('reports false for flat data (no expandable rows)', () => {
|
|
693
|
+
const flat: FileRow[] = [
|
|
694
|
+
{id: 'a', name: 'A', size: 1},
|
|
695
|
+
{id: 'b', name: 'B', size: 2},
|
|
696
|
+
];
|
|
697
|
+
const {result} = renderHook(() =>
|
|
698
|
+
useTableTreeState({data: flat, idKey: 'id'}),
|
|
699
|
+
);
|
|
700
|
+
|
|
701
|
+
expect(result.current.isAllExpanded).toBe(false);
|
|
702
|
+
});
|
|
703
|
+
|
|
704
|
+
it('ignores expanded ids that match no expandable row when aggregating', () => {
|
|
705
|
+
// 'readme' is a leaf (not expandable) and 'ghost' matches nothing; neither
|
|
706
|
+
// should count toward the expandable total, so an all-expandable set that
|
|
707
|
+
// omits them still reads as fully expanded.
|
|
708
|
+
const {result} = renderHook(() =>
|
|
709
|
+
useTableTreeState({
|
|
710
|
+
data: fileTree,
|
|
711
|
+
idKey: 'id',
|
|
712
|
+
defaultExpandedIds: ['src', 'components', 'readme', 'ghost'],
|
|
713
|
+
}),
|
|
714
|
+
);
|
|
715
|
+
|
|
716
|
+
expect(result.current.isAllExpanded).toBe(true);
|
|
717
|
+
});
|
|
718
|
+
|
|
719
|
+
it('exposes the aggregate state and expand/collapse handlers through treeConfig', () => {
|
|
720
|
+
const {result} = renderHook(() =>
|
|
721
|
+
useTableTreeState({data: fileTree, idKey: 'id'}),
|
|
722
|
+
);
|
|
723
|
+
|
|
724
|
+
// The headless plugin reads everything it needs to render the header
|
|
725
|
+
// expand-all control from treeConfig, not from the state hook directly.
|
|
726
|
+
expect(result.current.treeConfig.isAllExpanded).toBe(false);
|
|
727
|
+
|
|
728
|
+
act(() => {
|
|
729
|
+
result.current.treeConfig.onExpandAll?.();
|
|
730
|
+
});
|
|
731
|
+
expect(result.current.isAllExpanded).toBe(true);
|
|
732
|
+
expect(result.current.treeConfig.isAllExpanded).toBe(true);
|
|
733
|
+
|
|
734
|
+
act(() => {
|
|
735
|
+
result.current.treeConfig.onCollapseAll?.();
|
|
736
|
+
});
|
|
737
|
+
expect(result.current.isAllExpanded).toBe(false);
|
|
738
|
+
expect(result.current.treeConfig.isAllExpanded).toBe(false);
|
|
739
|
+
});
|
|
740
|
+
});
|
|
@@ -74,6 +74,12 @@ export interface UseTableTreeStateResult<T extends Record<string, unknown>> {
|
|
|
74
74
|
treeConfig: UseTableTreeDataConfig<T>;
|
|
75
75
|
/** The current expanded row ids. */
|
|
76
76
|
expandedIds: ReadonlySet<string>;
|
|
77
|
+
/**
|
|
78
|
+
* Aggregate expansion state across every expandable row: `true` when all are
|
|
79
|
+
* expanded, `false` when none are, `'indeterminate'` when some but not all
|
|
80
|
+
* are. Drives the header expand-all control. Reports `false` for flat data.
|
|
81
|
+
*/
|
|
82
|
+
isAllExpanded: boolean | 'indeterminate';
|
|
77
83
|
/** Expand every expandable row in the tree. */
|
|
78
84
|
expandAll: () => void;
|
|
79
85
|
/** Collapse every row. */
|
|
@@ -211,6 +217,25 @@ export function useTableTreeState<T extends Record<string, unknown>>(
|
|
|
211
217
|
|
|
212
218
|
const hasExpandableRows = allExpandableIds.length > 0;
|
|
213
219
|
|
|
220
|
+
// Aggregate state for the header expand-all control. Only expandable ids
|
|
221
|
+
// count toward the total, so expanded ids that match a leaf or no row at
|
|
222
|
+
// all never skew the tally.
|
|
223
|
+
const isAllExpanded: boolean | 'indeterminate' = useMemo(() => {
|
|
224
|
+
if (!hasExpandableRows) {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
const expandedCount = allExpandableIds.filter(id =>
|
|
228
|
+
expandedIds.has(id),
|
|
229
|
+
).length;
|
|
230
|
+
if (expandedCount === 0) {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
if (expandedCount === allExpandableIds.length) {
|
|
234
|
+
return true;
|
|
235
|
+
}
|
|
236
|
+
return 'indeterminate';
|
|
237
|
+
}, [hasExpandableRows, allExpandableIds, expandedIds]);
|
|
238
|
+
|
|
214
239
|
const onToggleItem = useCallback(
|
|
215
240
|
(item: T) => {
|
|
216
241
|
const id = getId(item);
|
|
@@ -243,11 +268,30 @@ export function useTableTreeState<T extends Record<string, unknown>>(
|
|
|
243
268
|
getRowMeta,
|
|
244
269
|
onToggleItem,
|
|
245
270
|
hasExpandableRows,
|
|
271
|
+
isAllExpanded,
|
|
272
|
+
onExpandAll: expandAll,
|
|
273
|
+
onCollapseAll: collapseAll,
|
|
246
274
|
indent,
|
|
247
275
|
treeColumnKey,
|
|
248
276
|
}),
|
|
249
|
-
[
|
|
277
|
+
[
|
|
278
|
+
getRowMeta,
|
|
279
|
+
onToggleItem,
|
|
280
|
+
hasExpandableRows,
|
|
281
|
+
isAllExpanded,
|
|
282
|
+
expandAll,
|
|
283
|
+
collapseAll,
|
|
284
|
+
indent,
|
|
285
|
+
treeColumnKey,
|
|
286
|
+
],
|
|
250
287
|
);
|
|
251
288
|
|
|
252
|
-
return {
|
|
289
|
+
return {
|
|
290
|
+
visibleData,
|
|
291
|
+
treeConfig,
|
|
292
|
+
expandedIds,
|
|
293
|
+
isAllExpanded,
|
|
294
|
+
expandAll,
|
|
295
|
+
collapseAll,
|
|
296
|
+
};
|
|
253
297
|
}
|
package/src/Table/types.ts
CHANGED
|
@@ -540,6 +540,39 @@ export interface BaseTableProps<
|
|
|
540
540
|
/** Plugins to transform render props at each level */
|
|
541
541
|
plugins?: TablePlugin<T>[];
|
|
542
542
|
|
|
543
|
+
/**
|
|
544
|
+
* ARIA row index (1-based) assigned to the **first** rendered body row.
|
|
545
|
+
*
|
|
546
|
+
* The row ordinal is an accessibility concern independent of any visible
|
|
547
|
+
* index column: `aria-rowindex` on each `<tr>` should reflect the row's
|
|
548
|
+
* position in the **full** dataset, not just the current page. For a
|
|
549
|
+
* paginated / windowed view, pass the offset of the first visible row,
|
|
550
|
+
* e.g. `(page - 1) * pageSize + 1`.
|
|
551
|
+
*
|
|
552
|
+
* Setting this (or {@link rowCount}) opts the table into emitting
|
|
553
|
+
* `aria-rowindex` on body rows and `aria-rowcount` on the `<table>`. Data
|
|
554
|
+
* rows are numbered from this value; the header row keeps native table
|
|
555
|
+
* semantics and is not assigned an ARIA row index (so the visible
|
|
556
|
+
* `useTableRowIndex` numbering and `aria-rowindex` stay in agreement).
|
|
557
|
+
*
|
|
558
|
+
* Applies to data-driven mode only (ignored in children mode).
|
|
559
|
+
*
|
|
560
|
+
* @default 1
|
|
561
|
+
*/
|
|
562
|
+
rowIndexStart?: number;
|
|
563
|
+
/**
|
|
564
|
+
* Total number of body rows across **all** pages/windows, used for
|
|
565
|
+
* `aria-rowcount` on the `<table>`. Provide this for paginated data so
|
|
566
|
+
* assistive tech can announce "row X of Y" against the full dataset.
|
|
567
|
+
*
|
|
568
|
+
* When omitted but {@link rowIndexStart} is set (a windowed view with an
|
|
569
|
+
* unknown total, e.g. cursor pagination), `aria-rowcount` is set to `-1`
|
|
570
|
+
* per the ARIA convention for an unknown row count.
|
|
571
|
+
*
|
|
572
|
+
* Applies to data-driven mode only (ignored in children mode).
|
|
573
|
+
*/
|
|
574
|
+
rowCount?: number;
|
|
575
|
+
|
|
543
576
|
/** Children mode — render `<tr>`/`<td>` directly instead of data-driven */
|
|
544
577
|
children?: ReactNode;
|
|
545
578
|
/**
|
|
@@ -38,6 +38,7 @@
|
|
|
38
38
|
|
|
39
39
|
import {useRef} from 'react';
|
|
40
40
|
import type {TablePlugin} from './types';
|
|
41
|
+
import {devWarn} from '../utils/devWarning';
|
|
41
42
|
|
|
42
43
|
// ======================================================================// Canonical Plugin Order
|
|
43
44
|
// ======================================================================
|
|
@@ -112,8 +113,9 @@ function validatePlugin<T extends Record<string, unknown>>(
|
|
|
112
113
|
// Warn about unknown keys (likely misspelled transform names)
|
|
113
114
|
for (const key of keys) {
|
|
114
115
|
if (!VALID_TRANSFORM_KEYS.has(key)) {
|
|
115
|
-
|
|
116
|
-
|
|
116
|
+
devWarn(
|
|
117
|
+
'Table',
|
|
118
|
+
`Plugin "${name}" has unknown key "${key}". ` +
|
|
117
119
|
`Valid keys: ${[...VALID_TRANSFORM_KEYS].join(', ')}. ` +
|
|
118
120
|
`This key will be ignored.`,
|
|
119
121
|
);
|
|
@@ -125,8 +127,9 @@ function validatePlugin<T extends Record<string, unknown>>(
|
|
|
125
127
|
if (VALID_TRANSFORM_KEYS.has(key)) {
|
|
126
128
|
const value = (plugin as Record<string, unknown>)[key];
|
|
127
129
|
if (value != null && typeof value !== 'function') {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
+
devWarn(
|
|
131
|
+
'Table',
|
|
132
|
+
`Plugin "${name}" has non-function value for "${key}" ` +
|
|
130
133
|
`(got ${typeof value}). Transform will be skipped.`,
|
|
131
134
|
);
|
|
132
135
|
}
|
|
@@ -140,8 +143,9 @@ function validatePlugin<T extends Record<string, unknown>>(
|
|
|
140
143
|
typeof (plugin as Record<string, unknown>)[key] === 'function',
|
|
141
144
|
);
|
|
142
145
|
if (!hasTransforms) {
|
|
143
|
-
|
|
144
|
-
|
|
146
|
+
devWarn(
|
|
147
|
+
'Table',
|
|
148
|
+
`Plugin "${name}" has no transform methods. ` +
|
|
145
149
|
`It will be included in the pipeline but won't do anything.`,
|
|
146
150
|
);
|
|
147
151
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/** @type {import('../docs-types').ComponentDoc} */
|
|
4
|
+
|
|
5
|
+
export const docs = {
|
|
6
|
+
name: 'useTableRowStatus',
|
|
7
|
+
subComponentOf: 'Table',
|
|
8
|
+
displayName: 'useTableRowStatus',
|
|
9
|
+
description:
|
|
10
|
+
'Hook that returns a TablePlugin which prepends a narrow column signaling per-row status: a colored status dot by default, or an icon when provided (shape + color is more accessible than color alone). getStatus maps a row to a semantic color (mapped to a theme token) or raw CSS color, an optional icon, and a required accessible label (shown in a tooltip on hover and announced to assistive technology, so status is never color-only); return null for no indicator. Memoize getStatus with useCallback for a stable plugin identity.',
|
|
11
|
+
props: [
|
|
12
|
+
{
|
|
13
|
+
name: 'getStatus',
|
|
14
|
+
type: "(item: T) => { color: 'accent' | 'success' | 'error' | 'warning' | 'red' | 'orange' | 'green' | 'yellow' | 'blue' | 'gray' | string; icon?: IconName; label: string } | null",
|
|
15
|
+
description:
|
|
16
|
+
'Derive the status indicator for a row: a semantic color (accent, success, error, warning, red, orange, green, yellow, blue, gray, each mapped to a theme token) or a raw CSS color as an escape hatch; an optional icon to signal status by shape instead of the dot (recommended when multiple statuses coexist; valid names: close, chevronDown, chevronLeft, chevronRight, check, success, error, warning, info, calendar, clock, externalLink, menu, moreHorizontal, search, arrowUp, arrowDown, arrowsUpDown, funnel, eyeSlash, viewColumns, copy, checkDouble, wrench, stop, microphone); and a required accessible label (announced via role="img" and shown in a tooltip on hover, so a status is never conveyed by color alone). Return null for rows with no status. Memoize with useCallback for a stable plugin identity.',
|
|
17
|
+
required: true,
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/** @type {import('../docs-types').TranslationDoc} */
|
|
23
|
+
export const docsDense = {
|
|
24
|
+
description:
|
|
25
|
+
'Returns a TablePlugin that prepends a narrow per-row status column: a colored dot, or an icon when provided (shape + color beats color alone for a11y). getStatus maps a row to {color, icon?, label} or null. color is a semantic name (success/error/warning/etc.) mapped to a theme token, or a raw CSS color. label is required (tooltip + accessible name). Memoize getStatus with useCallback.',
|
|
26
|
+
propDescriptions: {
|
|
27
|
+
getStatus:
|
|
28
|
+
'Map a row to {color, icon?, label} or null. color = semantic status name (mapped to a token) or raw CSS; icon = shape signifier (a11y); label = required accessible name (tooltip + role="img"). Memoize with useCallback.',
|
|
29
|
+
},
|
|
30
|
+
};
|