@astryxdesign/core 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +156 -0
- package/dist/AlertDialog/AlertDialog.d.ts +10 -2
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +22 -3
- package/dist/AppShell/AppShell.d.ts +2 -2
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +40 -9
- package/dist/AspectRatio/AspectRatio.d.ts +13 -0
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +9 -0
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +33 -20
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +2 -3
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +15 -14
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +21 -8
- package/dist/Breadcrumbs/index.d.ts +2 -1
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +1 -0
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +11 -15
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +2 -1
- package/dist/Calendar/styles.d.ts +0 -2
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +0 -2
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +8 -12
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +2 -1
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +3 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +4 -3
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +17 -17
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +2 -6
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +36 -125
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +3 -11
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +84 -67
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +35 -15
- package/dist/CommandPalette/CommandPaletteItem.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +6 -3
- package/dist/CommandPalette/CommandPaletteList.js +1 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts +1 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +35 -33
- package/dist/ContextMenu/ContextMenu.d.ts +2 -2
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +1 -1
- package/dist/ContextMenu/index.d.ts +2 -1
- package/dist/ContextMenu/index.d.ts.map +1 -1
- package/dist/ContextMenu/index.js +1 -0
- package/dist/DateInput/DateInput.d.ts +9 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +24 -23
- package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +11 -16
- package/dist/DateTimeInput/DateTimeInput.d.ts +9 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +22 -17
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +4 -4
- package/dist/DropdownMenu/DropdownMenu.d.ts +33 -8
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +62 -20
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +8 -11
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +32 -31
- package/dist/DropdownMenu/DropdownMenuDivider.d.ts +25 -0
- package/dist/DropdownMenu/DropdownMenuDivider.d.ts.map +1 -0
- package/dist/DropdownMenu/DropdownMenuDivider.js +66 -0
- package/dist/DropdownMenu/DropdownMenuItem.d.ts +15 -2
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +20 -8
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +5 -5
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +24 -67
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +2 -8
- package/dist/DropdownMenu/index.d.ts +2 -1
- package/dist/DropdownMenu/index.d.ts.map +1 -1
- package/dist/DropdownMenu/index.js +4 -0
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +35 -27
- package/dist/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/EmptyState/EmptyState.js +9 -5
- package/dist/Field/InputClearButton.d.ts +16 -3
- package/dist/Field/InputClearButton.d.ts.map +1 -1
- package/dist/Field/InputClearButton.js +15 -4
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +3 -19
- package/dist/Indicator/CheckIndicator.d.ts +25 -0
- package/dist/Indicator/CheckIndicator.d.ts.map +1 -0
- package/dist/Indicator/CheckIndicator.js +155 -0
- package/dist/Indicator/CheckboxIndicator.d.ts +22 -0
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -0
- package/dist/Indicator/CheckboxIndicator.js +173 -0
- package/dist/Indicator/RadioIndicator.d.ts +23 -0
- package/dist/Indicator/RadioIndicator.d.ts.map +1 -0
- package/dist/Indicator/RadioIndicator.js +137 -0
- package/dist/Indicator/index.d.ts +24 -0
- package/dist/Indicator/index.d.ts.map +1 -0
- package/dist/Indicator/index.js +26 -0
- package/dist/Indicator/indicator.markers.stylex.d.ts +16 -0
- package/dist/Indicator/indicator.markers.stylex.d.ts.map +1 -0
- package/dist/Indicator/indicator.markers.stylex.js +21 -0
- package/dist/Indicator/indicatorRegistry.d.ts +71 -0
- package/dist/Indicator/indicatorRegistry.d.ts.map +1 -0
- package/dist/Indicator/indicatorRegistry.js +93 -0
- package/dist/Indicator/types.d.ts +167 -0
- package/dist/Indicator/types.d.ts.map +1 -0
- package/dist/Indicator/types.js +1 -0
- package/dist/Indicator/useIndicator.d.ts +18 -0
- package/dist/Indicator/useIndicator.d.ts.map +1 -0
- package/dist/Indicator/useIndicator.js +30 -0
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +4 -8
- package/dist/Layer/useLayer.d.ts +14 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +25 -2
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +56 -53
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +4 -5
- package/dist/MobileNav/MobileNav.js +8 -8
- package/dist/MoreMenu/MoreMenu.d.ts +14 -1
- package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
- package/dist/MoreMenu/MoreMenu.js +4 -0
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +78 -75
- package/dist/NumberInput/NumberInput.d.ts +27 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +230 -42
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +2 -3
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +61 -63
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +6 -8
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +7 -0
- package/dist/ProgressBar/ProgressBar.d.ts +11 -4
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +96 -6
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +29 -84
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +2 -3
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +2 -3
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +3 -11
- package/dist/Selector/Selector.d.ts +2 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +164 -94
- package/dist/Selector/hooks.d.ts +18 -6
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +57 -40
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +29 -14
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +56 -20
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +28 -22
- package/dist/Stack/stack.stylex.d.ts +3 -3
- package/dist/Switch/Switch.js +11 -10
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +2 -3
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +41 -19
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +8 -0
- package/dist/Table/index.d.ts +1 -1
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +22 -18
- package/dist/Table/plugins/rowExpansion/index.d.ts +1 -1
- package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/index.js +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +41 -76
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +94 -345
- package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +23 -4
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +29 -33
- package/dist/Table/tableContextMenu.d.ts.map +1 -1
- package/dist/Table/tableContextMenu.js +2 -1
- package/dist/Table/types.d.ts +11 -0
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/TextArea/TextArea.d.ts +10 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +16 -6
- package/dist/TextInput/TextInput.d.ts +10 -1
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +13 -19
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +32 -26
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +7 -15
- package/dist/Timestamp/TimestampHoverCard.d.ts.map +1 -1
- package/dist/Timestamp/TimestampHoverCard.js +16 -34
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +20 -11
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +4 -2
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +3 -19
- package/dist/TopNav/TopNav.d.ts.map +1 -1
- package/dist/TopNav/TopNav.js +6 -5
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +54 -16
- package/dist/TopNav/TopNavItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavItem.js +3 -9
- package/dist/TopNav/TopNavMegaMenu.d.ts +7 -0
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +146 -60
- package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuItem.js +22 -3
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +83 -38
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +13 -0
- package/dist/TreeList/TreeListBranches.d.ts +1 -1
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +14 -4
- package/dist/TreeList/TreeListItem.d.ts +11 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +57 -30
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +16 -8
- package/dist/astryx.css +74 -85
- package/dist/astryx.umd.js +56 -56
- package/dist/astryx.umd.js.map +4 -4
- package/dist/hooks/containerReveal.stylex.d.ts +61 -0
- package/dist/hooks/containerReveal.stylex.d.ts.map +1 -0
- package/dist/hooks/containerReveal.stylex.js +63 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/useClipboard.d.ts +59 -0
- package/dist/hooks/useClipboard.d.ts.map +1 -0
- package/dist/hooks/useClipboard.js +106 -0
- package/dist/hooks/useContainerReveal.d.ts +14 -8
- package/dist/hooks/useContainerReveal.d.ts.map +1 -1
- package/dist/hooks/useContainerReveal.js +28 -69
- package/dist/hooks/useIndicatorFocusRing.d.ts +28 -0
- package/dist/hooks/useIndicatorFocusRing.d.ts.map +1 -0
- package/dist/hooks/useIndicatorFocusRing.js +96 -0
- package/dist/hooks/useLongPress.d.ts.map +1 -1
- package/dist/hooks/useLongPress.js +12 -2
- package/dist/hooks/useScrollLock.d.ts.map +1 -1
- package/dist/hooks/useScrollLock.js +33 -18
- package/dist/hooks/useStreamingText.d.ts +18 -3
- package/dist/hooks/useStreamingText.d.ts.map +1 -1
- package/dist/hooks/useStreamingText.js +47 -7
- package/dist/hooks/useTreeFocus.d.ts.map +1 -1
- package/dist/hooks/useTreeFocus.js +9 -3
- package/dist/hooks/useTypeahead.d.ts +3 -2
- package/dist/hooks/useTypeahead.d.ts.map +1 -1
- package/dist/hooks/useTypeahead.js +19 -7
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/theme/defineTheme.d.ts +16 -0
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/defineTheme.js +8 -0
- package/dist/theme/derivedVarRegistry.d.ts +8 -0
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +14 -13
- package/dist/theme/expandColorScale.d.ts +3 -1
- package/dist/theme/expandColorScale.d.ts.map +1 -1
- package/dist/theme/expandColorScale.js +17 -7
- package/dist/theme/expandTypeScale.d.ts.map +1 -1
- package/dist/theme/expandTypeScale.js +17 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +11 -0
- package/dist/theme/index.d.ts +1 -0
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/utils/focusOutline.stylex.d.ts +107 -0
- package/dist/utils/focusOutline.stylex.d.ts.map +1 -0
- package/dist/utils/focusOutline.stylex.js +130 -0
- package/dist/utils/focusReturn.d.ts +24 -0
- package/dist/utils/focusReturn.d.ts.map +1 -0
- package/dist/utils/focusReturn.js +29 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/mergeRefs.d.ts.map +1 -1
- package/dist/utils/mergeRefs.js +7 -5
- package/dist/utils/rtlStyles.d.ts +2 -2
- package/dist/utils/rtlStyles.js +2 -2
- package/dist/utils/themeProps.d.ts +20 -1
- package/dist/utils/themeProps.d.ts.map +1 -1
- package/dist/utils/themeProps.js +8 -2
- package/locales/en.json +12 -0
- package/locales/pseudo.json +9 -0
- package/package.json +7 -2
- package/src/AlertDialog/AlertDialog.doc.mjs +16 -3
- package/src/AlertDialog/AlertDialog.test.tsx +208 -1
- package/src/AlertDialog/AlertDialog.tsx +21 -3
- package/src/AppShell/AppShell.doc.mjs +11 -0
- package/src/AppShell/AppShell.test.tsx +139 -0
- package/src/AppShell/AppShell.tsx +32 -22
- package/src/AspectRatio/AspectRatio.doc.mjs +27 -3
- package/src/AspectRatio/AspectRatio.test.tsx +30 -0
- package/src/AspectRatio/AspectRatio.tsx +13 -0
- package/src/Avatar/Avatar.doc.mjs +2 -13
- package/src/Avatar/Avatar.test.tsx +33 -8
- package/src/Avatar/Avatar.tsx +52 -50
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -9
- package/src/Banner/Banner.tsx +9 -6
- package/src/Breadcrumbs/BreadcrumbItem.tsx +16 -6
- package/src/Breadcrumbs/index.ts +5 -1
- package/src/Button/Button.tsx +21 -41
- package/src/Calendar/Calendar.tsx +2 -1
- package/src/Calendar/styles.ts +0 -8
- package/src/Carousel/Carousel.doc.mjs +3 -0
- package/src/Carousel/Carousel.tsx +10 -6
- package/src/Chat/Chat.doc.mjs +2 -0
- package/src/Chat/ChatDictationButton.tsx +7 -1
- package/src/Chat/ChatLayoutScrollButton.test.tsx +22 -0
- package/src/Chat/ChatLayoutScrollButton.tsx +8 -1
- package/src/Chat/ChatSendButton.tsx +2 -3
- package/src/Chat/ChatToolCalls.test.tsx +35 -0
- package/src/Chat/ChatToolCalls.tsx +36 -16
- package/src/Chat/useTriggerMenu.tsx +2 -5
- package/src/CheckboxInput/CheckboxInput.doc.mjs +4 -2
- package/src/CheckboxInput/CheckboxInput.test.tsx +115 -0
- package/src/CheckboxInput/CheckboxInput.tsx +45 -202
- package/src/ClickableCard/ClickableCard.tsx +6 -11
- package/src/CodeBlock/CodeBlock.doc.mjs +3 -0
- package/src/CodeBlock/CodeBlock.test.tsx +91 -0
- package/src/CodeBlock/CodeBlock.tsx +57 -80
- package/src/Collapsible/Collapsible.tsx +22 -18
- package/src/CommandPalette/CommandPalette.test.tsx +29 -0
- package/src/CommandPalette/CommandPaletteItem.tsx +7 -4
- package/src/CommandPalette/CommandPaletteList.tsx +2 -2
- package/src/ComplexSelector/ComplexSelector.doc.mjs +42 -0
- package/src/ComplexSelector/ComplexSelector.test.tsx +64 -0
- package/src/ComplexSelector/ComplexSelector.tsx +46 -29
- package/src/ContextMenu/ContextMenu.doc.mjs +1 -1
- package/src/ContextMenu/ContextMenu.test.tsx +41 -0
- package/src/ContextMenu/ContextMenu.tsx +3 -3
- package/src/ContextMenu/index.ts +5 -1
- package/src/DateInput/DateInput.doc.mjs +18 -3
- package/src/DateInput/DateInput.test.tsx +93 -11
- package/src/DateInput/DateInput.tsx +41 -19
- package/src/DateRangeInput/DateRangeInput.doc.mjs +10 -2
- package/src/DateRangeInput/DateRangeInput.test.tsx +110 -14
- package/src/DateRangeInput/DateRangeInput.tsx +24 -12
- package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -2
- package/src/DateTimeInput/DateTimeInput.test.tsx +75 -0
- package/src/DateTimeInput/DateTimeInput.tsx +35 -8
- package/src/Dialog/Dialog.tsx +2 -9
- package/src/DropdownMenu/DropdownMenu.doc.mjs +5 -9
- package/src/DropdownMenu/DropdownMenu.test.tsx +534 -4
- package/src/DropdownMenu/DropdownMenu.tsx +113 -52
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +27 -30
- package/src/DropdownMenu/DropdownMenuDivider.doc.mjs +34 -0
- package/src/DropdownMenu/DropdownMenuDivider.tsx +81 -0
- package/src/DropdownMenu/DropdownMenuItem.doc.mjs +39 -4
- package/src/DropdownMenu/DropdownMenuItem.tsx +48 -10
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +30 -76
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +25 -19
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +44 -14
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +1 -5
- package/src/DropdownMenu/index.ts +8 -1
- package/src/DropdownMenu/renderDropdownItems.tsx +33 -34
- package/src/EmptyState/EmptyState.doc.mjs +4 -0
- package/src/EmptyState/EmptyState.test.tsx +62 -0
- package/src/EmptyState/EmptyState.tsx +16 -6
- package/src/Field/Field.doc.mjs +1 -0
- package/src/Field/InputClearButton.test.tsx +117 -0
- package/src/Field/InputClearButton.tsx +30 -3
- package/src/HoverCard/useHoverCard.tsx +2 -23
- package/src/Icon/Icon.doc.mjs +2 -1
- package/src/Indicator/CheckIndicator.tsx +174 -0
- package/src/Indicator/CheckboxIndicator.tsx +257 -0
- package/src/Indicator/Indicator.doc.mjs +344 -0
- package/src/Indicator/Indicator.test.tsx +393 -0
- package/src/Indicator/RadioIndicator.tsx +206 -0
- package/src/Indicator/index.ts +45 -0
- package/src/Indicator/indicator.markers.stylex.ts +19 -0
- package/src/Indicator/indicatorRegistry.test.tsx +106 -0
- package/src/Indicator/indicatorRegistry.ts +120 -0
- package/src/Indicator/types.ts +186 -0
- package/src/Indicator/useIndicator.ts +39 -0
- package/src/Item/Item.doc.mjs +1 -1
- package/src/Item/Item.tsx +7 -14
- package/src/Layer/useLayer.doc.mjs +2 -2
- package/src/Layer/useLayer.test.tsx +85 -0
- package/src/Layer/useLayer.tsx +39 -1
- package/src/Lightbox/Lightbox.doc.mjs +1 -1
- package/src/Lightbox/Lightbox.tsx +43 -38
- package/src/Link/Link.tsx +4 -11
- package/src/MobileNav/MobileNav.tsx +3 -3
- package/src/MoreMenu/MoreMenu.doc.mjs +31 -0
- package/src/MoreMenu/MoreMenu.test.tsx +68 -1
- package/src/MoreMenu/MoreMenu.tsx +19 -0
- package/src/MultiSelector/MultiSelector.doc.mjs +9 -1
- package/src/MultiSelector/MultiSelector.test.tsx +255 -16
- package/src/MultiSelector/MultiSelector.tsx +103 -99
- package/src/NumberInput/NumberInput.doc.mjs +265 -50
- package/src/NumberInput/NumberInput.test.tsx +726 -21
- package/src/NumberInput/NumberInput.tsx +353 -59
- package/src/Outline/Outline.tsx +2 -5
- package/src/Pagination/Pagination.doc.mjs +1 -1
- package/src/Pagination/Pagination.test.tsx +22 -7
- package/src/Pagination/Pagination.tsx +38 -35
- package/src/Popover/Popover.tsx +6 -7
- package/src/PowerSearch/PowerSearch.tsx +1 -1
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +42 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +7 -0
- package/src/ProgressBar/ProgressBar.doc.mjs +27 -5
- package/src/ProgressBar/ProgressBar.test.tsx +224 -1
- package/src/ProgressBar/ProgressBar.tsx +124 -22
- package/src/RadioList/RadioList.doc.mjs +4 -2
- package/src/RadioList/RadioListItem.tsx +31 -130
- package/src/Resizable/ResizeHandle.tsx +2 -9
- package/src/SegmentedControl/SegmentedControlItem.tsx +2 -9
- package/src/SelectableCard/SelectableCard.tsx +4 -9
- package/src/Selector/Selector.doc.mjs +7 -4
- package/src/Selector/Selector.test.tsx +935 -25
- package/src/Selector/Selector.tsx +189 -106
- package/src/Selector/hooks.ts +77 -50
- package/src/SideNav/SideNav.test.tsx +46 -0
- package/src/SideNav/SideNav.tsx +1 -0
- package/src/SideNav/SideNavCollapseButton.tsx +15 -10
- package/src/SideNav/SideNavHeading.tsx +48 -10
- package/src/SideNav/SideNavItem.tsx +20 -12
- package/src/Stack/Stack.doc.mjs +110 -0
- package/src/StatusDot/StatusDot.doc.mjs +12 -3
- package/src/Switch/Switch.test.tsx +32 -0
- package/src/Switch/Switch.tsx +8 -8
- package/src/TabList/Tab.tsx +2 -9
- package/src/TabList/TabMenu.tsx +14 -21
- package/src/Table/BaseTable.tsx +11 -0
- package/src/Table/index.ts +1 -4
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +30 -14
- package/src/Table/plugins/rowExpansion/index.ts +1 -4
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +125 -175
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +115 -458
- package/src/Table/plugins/sortable/useTableSortable.tsx +2 -6
- package/src/Table/plugins/tree/useTableTreeData.tsx +43 -24
- package/src/Table/tableContextMenu.test.tsx +27 -0
- package/src/Table/tableContextMenu.tsx +1 -0
- package/src/Table/types.ts +11 -0
- package/src/Table/useTableGroupedRows.doc.mjs +1 -1
- package/src/Table/useTableRowExpansion.doc.mjs +43 -66
- package/src/TextArea/TextArea.doc.mjs +42 -2
- package/src/TextArea/TextArea.test.tsx +219 -0
- package/src/TextArea/TextArea.tsx +34 -7
- package/src/TextInput/TextInput.doc.mjs +18 -2
- package/src/TextInput/TextInput.test.tsx +189 -0
- package/src/TextInput/TextInput.tsx +25 -31
- package/src/Thumbnail/Thumbnail.tsx +2 -9
- package/src/TimeInput/TimeInput.doc.mjs +2 -2
- package/src/TimeInput/TimeInput.test.tsx +30 -3
- package/src/TimeInput/TimeInput.tsx +9 -26
- package/src/Timestamp/Timestamp.doc.mjs +4 -3
- package/src/Timestamp/TimestampHoverCard.tsx +13 -35
- package/src/Token/Token.tsx +5 -28
- package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
- package/src/Tokenizer/Tokenizer.test.tsx +45 -3
- package/src/Tokenizer/Tokenizer.tsx +10 -2
- package/src/Tooltip/useTooltip.tsx +2 -23
- package/src/TopNav/TopNav.tsx +1 -3
- package/src/TopNav/TopNavHeading.tsx +42 -13
- package/src/TopNav/TopNavItem.tsx +3 -21
- package/src/TopNav/TopNavMegaMenu.test.tsx +433 -33
- package/src/TopNav/TopNavMegaMenu.tsx +118 -53
- package/src/TopNav/TopNavMegaMenuItem.tsx +2 -9
- package/src/TopNav/TopNavMenu.tsx +34 -37
- package/src/TreeList/TreeList.doc.mjs +5 -0
- package/src/TreeList/TreeList.test.tsx +206 -7
- package/src/TreeList/TreeList.tsx +22 -0
- package/src/TreeList/TreeListBranches.tsx +25 -2
- package/src/TreeList/TreeListItem.tsx +89 -52
- package/src/Typeahead/BaseTypeahead.tsx +19 -6
- package/src/Typeahead/Typeahead.doc.mjs +1 -0
- package/src/Typeahead/Typeahead.test.tsx +76 -3
- package/src/hooks/containerReveal.stylex.ts +102 -0
- package/src/hooks/index.ts +4 -0
- package/src/hooks/useClipboard.doc.mjs +87 -0
- package/src/hooks/useClipboard.test.tsx +151 -0
- package/src/hooks/useClipboard.ts +135 -0
- package/src/hooks/useContainerReveal.doc.mjs +7 -7
- package/src/hooks/useContainerReveal.test.tsx +42 -62
- package/src/hooks/useContainerReveal.ts +36 -91
- package/src/hooks/useImageMode.test.ts +1 -1
- package/src/hooks/useIndicatorFocusRing.tsx +120 -0
- package/src/hooks/useLongPress.test.tsx +18 -0
- package/src/hooks/useLongPress.ts +12 -2
- package/src/hooks/useScrollLock.test.ts +72 -0
- package/src/hooks/useScrollLock.ts +51 -19
- package/src/hooks/useStreamingText.test.ts +46 -1
- package/src/hooks/useStreamingText.ts +49 -7
- package/src/hooks/useTreeFocus.test.tsx +50 -0
- package/src/hooks/useTreeFocus.ts +14 -3
- package/src/hooks/useTypeahead.test.tsx +150 -0
- package/src/hooks/useTypeahead.ts +24 -9
- package/src/i18n/InternationalizationProvider.doc.mjs +7 -2
- package/src/index.ts +1 -0
- package/src/theme/defineTheme.ts +24 -0
- package/src/theme/derivedVarRegistry.test.ts +21 -1
- package/src/theme/derivedVarRegistry.ts +19 -6
- package/src/theme/expandColorScale.test.ts +14 -0
- package/src/theme/expandColorScale.ts +24 -9
- package/src/theme/expandTypeScale.test.ts +43 -0
- package/src/theme/expandTypeScale.ts +17 -0
- package/src/theme/generateThemeRules.test.ts +61 -20
- package/src/theme/generateThemeRules.ts +11 -0
- package/src/theme/index.ts +13 -0
- package/src/utils/focusOutline.stylex.ts +163 -0
- package/src/utils/focusReturn.test.ts +42 -0
- package/src/utils/focusReturn.ts +31 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/mergeRefs.test.ts +48 -0
- package/src/utils/mergeRefs.ts +12 -6
- package/src/utils/rtlStyles.ts +2 -2
- package/src/utils/themeProps.ts +26 -4
- package/dist/CheckboxInput/checkbox.markers.stylex.d.ts +0 -9
- package/dist/CheckboxInput/checkbox.markers.stylex.d.ts.map +0 -1
- package/dist/CheckboxInput/checkbox.markers.stylex.js +0 -14
- package/dist/RadioList/radio.markers.stylex.d.ts +0 -7
- package/dist/RadioList/radio.markers.stylex.d.ts.map +0 -1
- package/dist/RadioList/radio.markers.stylex.js +0 -12
- package/dist/hooks/containerReveal.pool.stylex.d.ts +0 -303
- package/dist/hooks/containerReveal.pool.stylex.d.ts.map +0 -1
- package/dist/hooks/containerReveal.pool.stylex.js +0 -292
- package/src/CheckboxInput/checkbox.markers.stylex.ts +0 -12
- package/src/RadioList/radio.markers.stylex.ts +0 -10
- package/src/hooks/containerReveal.pool.stylex.ts +0 -571
|
@@ -4,30 +4,30 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file useTableRowExpansion.tsx
|
|
7
|
-
* @input React, StyleX, Icon, Table types
|
|
8
|
-
* @output Exports useTableRowExpansion hook + config
|
|
9
|
-
* @position Row-expansion plugin; consumed by Table via plugins prop
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
7
|
+
* @input React, StyleX, Icon, Table types, i18n (useTranslator)
|
|
8
|
+
* @output Exports useTableRowExpansion hook + config type
|
|
9
|
+
* @position Row-expansion plugin (detail panel); consumed by Table via plugins prop
|
|
10
|
+
*
|
|
11
|
+
* Expands a full-width detail panel below a row, rendered by the consumer's
|
|
12
|
+
* `renderExpanded(item)`. For hierarchical/tree tables (child rows that reuse
|
|
13
|
+
* the parent columns) use `useTableTreeData` + `useTableTreeState` instead.
|
|
13
14
|
*
|
|
14
15
|
* SYNC: When modified, update these files to stay in sync:
|
|
15
16
|
* - /packages/core/src/Table/index.ts (exports)
|
|
17
|
+
* - /packages/core/src/Table/useTableRowExpansion.doc.mjs
|
|
16
18
|
*/
|
|
17
19
|
|
|
18
|
-
import {
|
|
20
|
+
import {useMemo, useRef, type ReactNode} from 'react';
|
|
19
21
|
import * as stylex from '@stylexjs/stylex';
|
|
20
22
|
import {spacingVars, colorVars, radiusVars} from '../../../theme/tokens.stylex';
|
|
21
23
|
import {Icon} from '../../../Icon';
|
|
22
|
-
import {rtlStyles} from '../../../utils';
|
|
23
24
|
import {resolveContextActions} from '../../tableContextMenu';
|
|
24
25
|
import {useTranslator} from '../../../i18n';
|
|
25
26
|
import type {
|
|
26
27
|
TablePlugin,
|
|
27
28
|
TableColumn,
|
|
28
|
-
BodyCellRenderProps,
|
|
29
29
|
BodyRowRenderProps,
|
|
30
|
-
|
|
30
|
+
BodyCellRenderProps,
|
|
31
31
|
} from '../../types';
|
|
32
32
|
|
|
33
33
|
// =============================================================================
|
|
@@ -35,253 +35,29 @@ import type {
|
|
|
35
35
|
// =============================================================================
|
|
36
36
|
|
|
37
37
|
/**
|
|
38
|
-
* Configuration for useTableRowExpansion (
|
|
38
|
+
* Configuration for useTableRowExpansion (detail-panel mode).
|
|
39
39
|
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* function so the plugin knows each row's nesting level.
|
|
40
|
+
* The consumer owns expansion state; the plugin provides the chevron UI, the
|
|
41
|
+
* full-width detail panel rendered below an expanded row, and a right-click
|
|
42
|
+
* "Expand/Collapse row" action.
|
|
44
43
|
*/
|
|
45
44
|
export interface UseTableRowExpansionConfig<T extends Record<string, unknown>> {
|
|
46
45
|
/** Set of currently-expanded row keys. */
|
|
47
46
|
expandedKeys: Set<string>;
|
|
48
|
-
/** Called
|
|
47
|
+
/** Called with a row key when its expansion is toggled. */
|
|
49
48
|
onToggle: (key: string) => void;
|
|
50
49
|
/** Derive a stable unique key from a row item. */
|
|
51
50
|
getRowKey: (item: T) => string;
|
|
52
|
-
/** Return the children of a row (used to determine expandability). */
|
|
53
|
-
getChildren: (item: T) => T[];
|
|
54
|
-
/** Return the depth of a row in the hierarchy (0 = top-level). */
|
|
55
|
-
getDepth?: (item: T) => number;
|
|
56
|
-
/** Optionally control which rows are expandable. @default checks getChildren length */
|
|
57
|
-
getIsItemExpandable?: (item: T) => boolean;
|
|
58
51
|
/**
|
|
59
|
-
*
|
|
60
|
-
*
|
|
52
|
+
* Render the detail content shown in a full-width panel below the row when
|
|
53
|
+
* it is expanded. Receives the row's item.
|
|
61
54
|
*/
|
|
62
|
-
|
|
55
|
+
renderExpanded: (item: T) => ReactNode;
|
|
63
56
|
/**
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
* (together with `onToggleExpandAll`), the header cell shows a toggle button.
|
|
67
|
-
*/
|
|
68
|
-
isAllExpanded?: boolean | 'indeterminate';
|
|
69
|
-
/** Called when the expand-all header toggle is clicked. */
|
|
70
|
-
onToggleExpandAll?: (expand: boolean) => void;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Configuration for {@link useTableRowExpansionState}.
|
|
75
|
-
*
|
|
76
|
-
* Mirrors the shape of {@link useTableSelectionState}: you own the
|
|
77
|
-
* `expandedKeys` set (via `useState`), and the hook derives everything the
|
|
78
|
-
* plugin needs — the flattened `data`, per-row depth, expand/collapse
|
|
79
|
-
* handlers, and the expand-all toggle state.
|
|
80
|
-
*/
|
|
81
|
-
export interface UseTableRowExpansionStateConfig<
|
|
82
|
-
T extends Record<string, unknown>,
|
|
83
|
-
> {
|
|
84
|
-
/** The full, un-flattened tree. */
|
|
85
|
-
baseData: T[];
|
|
86
|
-
/** Return the children of a row. Leaf rows return an empty array. */
|
|
87
|
-
getChildren: (item: T) => T[];
|
|
88
|
-
/** Derive a stable unique key from a row item. */
|
|
89
|
-
getRowKey: (item: T) => string;
|
|
90
|
-
/**
|
|
91
|
-
* Should this row be expandable? Rows that return `false` never show a
|
|
92
|
-
* chevron and are skipped by expand-all. @default rows with children
|
|
57
|
+
* Control which rows are expandable. Non-expandable rows show no chevron, no
|
|
58
|
+
* context-menu action, and never render a panel. @default all rows expandable
|
|
93
59
|
*/
|
|
94
60
|
getIsItemExpandable?: (item: T) => boolean;
|
|
95
|
-
/** Controlled set of currently-expanded row keys. */
|
|
96
|
-
expandedKeys: Set<string>;
|
|
97
|
-
/** Setter for the controlled expanded keys. */
|
|
98
|
-
setExpandedKeys: React.Dispatch<React.SetStateAction<Set<string>>>;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
export interface UseTableRowExpansionStateResult<
|
|
102
|
-
T extends Record<string, unknown>,
|
|
103
|
-
> {
|
|
104
|
-
/** The flattened, currently-visible rows. Pass to `<Table data>`. */
|
|
105
|
-
data: T[];
|
|
106
|
-
/** Ready-to-use config for {@link useTableRowExpansion}. */
|
|
107
|
-
expansionConfig: UseTableRowExpansionConfig<T>;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Manages row-expansion state and derives the config for
|
|
112
|
-
* {@link useTableRowExpansion}.
|
|
113
|
-
*
|
|
114
|
-
* @deprecated Use `useTableTreeState` (with `useTableTreeData`) instead. The
|
|
115
|
-
* tree plugin covers the same affordances (expand-all header control,
|
|
116
|
-
* whole-row click) with a cycle guard and per-row fine-grained re-render. See
|
|
117
|
-
* the migration guide on `useTableRowExpansion` (`astryx component
|
|
118
|
-
* useTableRowExpansion --detail full`) for the before/after and config
|
|
119
|
-
* mapping.
|
|
120
|
-
*
|
|
121
|
-
* @example
|
|
122
|
-
* ```
|
|
123
|
-
* const [expandedKeys, setExpandedKeys] = useState<Set<string>>(new Set());
|
|
124
|
-
* const {data, expansionConfig} = useTableRowExpansionState({
|
|
125
|
-
* baseData: tree,
|
|
126
|
-
* getChildren: item => item.children ?? [],
|
|
127
|
-
* getRowKey: item => item.id,
|
|
128
|
-
* expandedKeys,
|
|
129
|
-
* setExpandedKeys,
|
|
130
|
-
* });
|
|
131
|
-
* const expansion = useTableRowExpansion(expansionConfig);
|
|
132
|
-
* <Table data={data} columns={columns} idKey="id" plugins={{expansion}} />;
|
|
133
|
-
* ```
|
|
134
|
-
*/
|
|
135
|
-
export function useTableRowExpansionState<T extends Record<string, unknown>>({
|
|
136
|
-
baseData,
|
|
137
|
-
getChildren,
|
|
138
|
-
getRowKey,
|
|
139
|
-
getIsItemExpandable,
|
|
140
|
-
expandedKeys,
|
|
141
|
-
setExpandedKeys,
|
|
142
|
-
}: UseTableRowExpansionStateConfig<T>): UseTableRowExpansionStateResult<T> {
|
|
143
|
-
const isExpandable = useCallback(
|
|
144
|
-
(item: T): boolean =>
|
|
145
|
-
getIsItemExpandable
|
|
146
|
-
? getIsItemExpandable(item)
|
|
147
|
-
: getChildren(item).length > 0,
|
|
148
|
-
[getIsItemExpandable, getChildren],
|
|
149
|
-
);
|
|
150
|
-
|
|
151
|
-
const depthMap = useMemo(() => {
|
|
152
|
-
const map = new Map<string, number>();
|
|
153
|
-
// Ancestor keys on the current walk path — guards against cyclic data.
|
|
154
|
-
const path = new Set<string>();
|
|
155
|
-
function walk(items: T[], depth: number) {
|
|
156
|
-
for (const item of items) {
|
|
157
|
-
const key = getRowKey(item);
|
|
158
|
-
if (path.has(key)) {
|
|
159
|
-
continue; // cyclic edge — skip
|
|
160
|
-
}
|
|
161
|
-
map.set(key, depth);
|
|
162
|
-
if (expandedKeys.has(key)) {
|
|
163
|
-
path.add(key);
|
|
164
|
-
walk(getChildren(item), depth + 1);
|
|
165
|
-
path.delete(key);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
walk(baseData, 0);
|
|
170
|
-
return map;
|
|
171
|
-
}, [baseData, getChildren, getRowKey, expandedKeys]);
|
|
172
|
-
|
|
173
|
-
const data = useMemo(() => {
|
|
174
|
-
const result: T[] = [];
|
|
175
|
-
// Ancestor keys on the current walk path — guards against cyclic data.
|
|
176
|
-
const path = new Set<string>();
|
|
177
|
-
function walk(items: T[]) {
|
|
178
|
-
for (const item of items) {
|
|
179
|
-
const key = getRowKey(item);
|
|
180
|
-
if (path.has(key)) {
|
|
181
|
-
continue; // cyclic edge — skip
|
|
182
|
-
}
|
|
183
|
-
result.push(item);
|
|
184
|
-
if (expandedKeys.has(key)) {
|
|
185
|
-
path.add(key);
|
|
186
|
-
walk(getChildren(item));
|
|
187
|
-
path.delete(key);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
walk(baseData);
|
|
192
|
-
return result;
|
|
193
|
-
}, [baseData, getChildren, getRowKey, expandedKeys]);
|
|
194
|
-
|
|
195
|
-
// Every expandable key across the whole tree (drives expand-all).
|
|
196
|
-
const allExpandableKeys = useMemo(() => {
|
|
197
|
-
const keys: string[] = [];
|
|
198
|
-
// Ancestor keys on the current walk path — guards against cyclic data.
|
|
199
|
-
const path = new Set<string>();
|
|
200
|
-
function walk(items: T[]) {
|
|
201
|
-
for (const item of items) {
|
|
202
|
-
const key = getRowKey(item);
|
|
203
|
-
if (path.has(key)) {
|
|
204
|
-
continue; // cyclic edge — skip
|
|
205
|
-
}
|
|
206
|
-
if (isExpandable(item)) {
|
|
207
|
-
keys.push(key);
|
|
208
|
-
path.add(key);
|
|
209
|
-
walk(getChildren(item));
|
|
210
|
-
path.delete(key);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
walk(baseData);
|
|
215
|
-
return keys;
|
|
216
|
-
}, [baseData, getChildren, getRowKey, isExpandable]);
|
|
217
|
-
|
|
218
|
-
const getDepth = useCallback(
|
|
219
|
-
(item: T) => depthMap.get(getRowKey(item)) ?? 0,
|
|
220
|
-
[depthMap, getRowKey],
|
|
221
|
-
);
|
|
222
|
-
|
|
223
|
-
const onToggle = useCallback(
|
|
224
|
-
(key: string) => {
|
|
225
|
-
setExpandedKeys(prev => {
|
|
226
|
-
const next = new Set(prev);
|
|
227
|
-
if (next.has(key)) {
|
|
228
|
-
next.delete(key);
|
|
229
|
-
} else {
|
|
230
|
-
next.add(key);
|
|
231
|
-
}
|
|
232
|
-
return next;
|
|
233
|
-
});
|
|
234
|
-
},
|
|
235
|
-
[setExpandedKeys],
|
|
236
|
-
);
|
|
237
|
-
|
|
238
|
-
const isAllExpanded: boolean | 'indeterminate' = useMemo(() => {
|
|
239
|
-
if (allExpandableKeys.length === 0) {
|
|
240
|
-
return false;
|
|
241
|
-
}
|
|
242
|
-
const expandedCount = allExpandableKeys.filter(k =>
|
|
243
|
-
expandedKeys.has(k),
|
|
244
|
-
).length;
|
|
245
|
-
if (expandedCount === 0) {
|
|
246
|
-
return false;
|
|
247
|
-
}
|
|
248
|
-
if (expandedCount === allExpandableKeys.length) {
|
|
249
|
-
return true;
|
|
250
|
-
}
|
|
251
|
-
return 'indeterminate';
|
|
252
|
-
}, [allExpandableKeys, expandedKeys]);
|
|
253
|
-
|
|
254
|
-
const onToggleExpandAll = useCallback(
|
|
255
|
-
(expand: boolean) => {
|
|
256
|
-
setExpandedKeys(expand ? new Set(allExpandableKeys) : new Set());
|
|
257
|
-
},
|
|
258
|
-
[setExpandedKeys, allExpandableKeys],
|
|
259
|
-
);
|
|
260
|
-
|
|
261
|
-
const expansionConfig = useMemo(
|
|
262
|
-
(): UseTableRowExpansionConfig<T> => ({
|
|
263
|
-
expandedKeys,
|
|
264
|
-
onToggle,
|
|
265
|
-
getRowKey,
|
|
266
|
-
getChildren,
|
|
267
|
-
getDepth,
|
|
268
|
-
getIsItemExpandable,
|
|
269
|
-
isAllExpanded,
|
|
270
|
-
onToggleExpandAll,
|
|
271
|
-
}),
|
|
272
|
-
[
|
|
273
|
-
expandedKeys,
|
|
274
|
-
onToggle,
|
|
275
|
-
getRowKey,
|
|
276
|
-
getChildren,
|
|
277
|
-
getDepth,
|
|
278
|
-
getIsItemExpandable,
|
|
279
|
-
isAllExpanded,
|
|
280
|
-
onToggleExpandAll,
|
|
281
|
-
],
|
|
282
|
-
);
|
|
283
|
-
|
|
284
|
-
return {data, expansionConfig};
|
|
285
61
|
}
|
|
286
62
|
|
|
287
63
|
// =============================================================================
|
|
@@ -290,26 +66,22 @@ export function useTableRowExpansionState<T extends Record<string, unknown>>({
|
|
|
290
66
|
|
|
291
67
|
const EXPANSION_COLUMN_WIDTH = {type: 'pixel' as const, value: 40};
|
|
292
68
|
|
|
293
|
-
/** Indentation applied per depth level, in pixels. */
|
|
294
|
-
const INDENT_PER_DEPTH = 24;
|
|
295
|
-
|
|
296
69
|
const expansionStyles = stylex.create({
|
|
297
70
|
chevronButton: {
|
|
298
71
|
display: 'inline-flex',
|
|
299
72
|
alignItems: 'center',
|
|
300
73
|
justifyContent: 'center',
|
|
301
|
-
width: '
|
|
302
|
-
height: '
|
|
74
|
+
width: spacingVars['--spacing-6'],
|
|
75
|
+
height: spacingVars['--spacing-6'],
|
|
303
76
|
background: 'transparent',
|
|
304
77
|
border: 'none',
|
|
305
78
|
borderRadius: radiusVars['--radius-inner'],
|
|
306
79
|
cursor: 'pointer',
|
|
307
80
|
color: colorVars['--color-icon-secondary'],
|
|
308
|
-
transitionProperty: 'transform, color
|
|
81
|
+
transitionProperty: 'transform, color',
|
|
309
82
|
transitionDuration: '150ms',
|
|
310
83
|
padding: 0,
|
|
311
|
-
|
|
312
|
-
// Match IconButton ghost hover: subtle overlay background
|
|
84
|
+
// Match IconButton ghost hover: subtle overlay background.
|
|
313
85
|
backgroundImage: {
|
|
314
86
|
default: null,
|
|
315
87
|
':hover': {
|
|
@@ -323,62 +95,45 @@ const expansionStyles = stylex.create({
|
|
|
323
95
|
chevronExpanded: {
|
|
324
96
|
transform: 'rotate(90deg)',
|
|
325
97
|
},
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
transitionProperty: 'transform',
|
|
329
|
-
transitionDuration: '150ms',
|
|
330
|
-
},
|
|
331
|
-
indentedCell: {
|
|
332
|
-
display: 'flex',
|
|
333
|
-
alignItems: 'center',
|
|
334
|
-
gap: spacingVars['--spacing-1'],
|
|
98
|
+
expandedRow: {
|
|
99
|
+
backgroundColor: colorVars['--color-background-muted'],
|
|
335
100
|
},
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
placeholder: {
|
|
340
|
-
display: 'inline-block',
|
|
341
|
-
width: '24px',
|
|
342
|
-
height: '24px',
|
|
343
|
-
flexShrink: '0',
|
|
344
|
-
},
|
|
345
|
-
clickableRow: {
|
|
346
|
-
cursor: 'pointer',
|
|
101
|
+
expandedCell: {
|
|
102
|
+
paddingBlock: spacingVars['--spacing-4'],
|
|
103
|
+
paddingInline: spacingVars['--spacing-5'],
|
|
347
104
|
},
|
|
348
105
|
});
|
|
349
106
|
|
|
350
107
|
// =============================================================================
|
|
351
|
-
// Chevron
|
|
108
|
+
// Chevron Cell
|
|
352
109
|
// =============================================================================
|
|
353
110
|
|
|
354
111
|
function ExpansionChevron({
|
|
355
112
|
isExpanded,
|
|
356
113
|
onToggle,
|
|
357
|
-
ariaLabel,
|
|
358
114
|
}: {
|
|
359
115
|
isExpanded: boolean;
|
|
360
116
|
onToggle: () => void;
|
|
361
|
-
ariaLabel: string;
|
|
362
117
|
}) {
|
|
118
|
+
const t = useTranslator();
|
|
363
119
|
return (
|
|
364
120
|
<button
|
|
365
121
|
type="button"
|
|
366
|
-
{...stylex.props(
|
|
122
|
+
{...stylex.props(
|
|
123
|
+
expansionStyles.chevronButton,
|
|
124
|
+
isExpanded && expansionStyles.chevronExpanded,
|
|
125
|
+
)}
|
|
367
126
|
onClick={e => {
|
|
368
127
|
e.stopPropagation();
|
|
369
128
|
onToggle();
|
|
370
129
|
}}
|
|
371
|
-
aria-label={
|
|
130
|
+
aria-label={
|
|
131
|
+
isExpanded
|
|
132
|
+
? t('@astryx.tableRowExpansion.collapseRow')
|
|
133
|
+
: t('@astryx.tableRowExpansion.expandRow')
|
|
134
|
+
}
|
|
372
135
|
aria-expanded={isExpanded}>
|
|
373
|
-
<
|
|
374
|
-
<span
|
|
375
|
-
{...stylex.props(
|
|
376
|
-
expansionStyles.chevronIcon,
|
|
377
|
-
isExpanded && expansionStyles.chevronExpanded,
|
|
378
|
-
)}>
|
|
379
|
-
<Icon icon="chevronRight" size="xsm" />
|
|
380
|
-
</span>
|
|
381
|
-
</span>
|
|
136
|
+
<Icon icon="chevronRight" size="xsm" />
|
|
382
137
|
</button>
|
|
383
138
|
);
|
|
384
139
|
}
|
|
@@ -388,33 +143,48 @@ function ExpansionChevron({
|
|
|
388
143
|
// =============================================================================
|
|
389
144
|
|
|
390
145
|
/**
|
|
391
|
-
* Returns a TablePlugin
|
|
146
|
+
* Returns a TablePlugin that expands a full-width detail panel below a row.
|
|
147
|
+
*
|
|
148
|
+
* The consumer owns the `expandedKeys` set (via `useState`); the plugin adds
|
|
149
|
+
* a leading chevron column, a right-click expand/collapse action, and renders
|
|
150
|
+
* `renderExpanded(item)` in a full-width panel below each expanded row.
|
|
392
151
|
*
|
|
393
|
-
*
|
|
394
|
-
*
|
|
395
|
-
*
|
|
396
|
-
*
|
|
397
|
-
*
|
|
398
|
-
*
|
|
152
|
+
* For hierarchical data (child rows sharing the parent columns) use
|
|
153
|
+
* `useTableTreeData` + `useTableTreeState` instead.
|
|
154
|
+
*
|
|
155
|
+
* @example
|
|
156
|
+
* ```
|
|
157
|
+
* const [expandedKeys, setExpandedKeys] = useState<Set<string>>(new Set());
|
|
158
|
+
* const expansion = useTableRowExpansion({
|
|
159
|
+
* expandedKeys,
|
|
160
|
+
* onToggle: key =>
|
|
161
|
+
* setExpandedKeys(prev => {
|
|
162
|
+
* const next = new Set(prev);
|
|
163
|
+
* next.has(key) ? next.delete(key) : next.add(key);
|
|
164
|
+
* return next;
|
|
165
|
+
* }),
|
|
166
|
+
* getRowKey: item => item.id,
|
|
167
|
+
* renderExpanded: item => <OrderDetails order={item} />,
|
|
168
|
+
* });
|
|
169
|
+
* <Table data={data} columns={columns} idKey="id" plugins={{expansion}} />;
|
|
170
|
+
* ```
|
|
399
171
|
*/
|
|
400
172
|
export function useTableRowExpansion<T extends Record<string, unknown>>(
|
|
401
173
|
config: UseTableRowExpansionConfig<T>,
|
|
402
174
|
): TablePlugin<T> {
|
|
403
|
-
const t = useTranslator();
|
|
404
175
|
const {
|
|
405
176
|
expandedKeys,
|
|
406
177
|
onToggle,
|
|
407
178
|
getRowKey,
|
|
408
|
-
|
|
409
|
-
getDepth,
|
|
179
|
+
renderExpanded,
|
|
410
180
|
getIsItemExpandable,
|
|
411
|
-
hasRowClickExpansion = false,
|
|
412
|
-
isAllExpanded,
|
|
413
|
-
onToggleExpandAll,
|
|
414
181
|
} = config;
|
|
415
182
|
|
|
416
|
-
|
|
417
|
-
|
|
183
|
+
const t = useTranslator();
|
|
184
|
+
|
|
185
|
+
// Final rendered column count, captured in transformColumns (pipeline step
|
|
186
|
+
// 1) and read in transformBodyRow for the detail panel's colSpan.
|
|
187
|
+
const columnCountRef = useRef(1);
|
|
418
188
|
|
|
419
189
|
const expansionColumn = useMemo(
|
|
420
190
|
(): TableColumn<T> => ({
|
|
@@ -423,168 +193,45 @@ export function useTableRowExpansion<T extends Record<string, unknown>>(
|
|
|
423
193
|
width: EXPANSION_COLUMN_WIDTH,
|
|
424
194
|
resizable: false,
|
|
425
195
|
renderCell: (item: T) => {
|
|
426
|
-
// Child rows (depth > 0) show their chevron inline in the first user
|
|
427
|
-
// column instead — don't double up here.
|
|
428
|
-
const depth = getDepth ? getDepth(item) : 0;
|
|
429
|
-
if (depth > 0) {
|
|
430
|
-
return null;
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
const key = getRowKey(item);
|
|
434
196
|
const expandable = getIsItemExpandable
|
|
435
197
|
? getIsItemExpandable(item)
|
|
436
|
-
:
|
|
198
|
+
: true;
|
|
437
199
|
if (!expandable) {
|
|
438
200
|
return null;
|
|
439
201
|
}
|
|
440
|
-
const
|
|
202
|
+
const key = getRowKey(item);
|
|
441
203
|
return (
|
|
442
204
|
<ExpansionChevron
|
|
443
|
-
isExpanded={
|
|
205
|
+
isExpanded={expandedKeys.has(key)}
|
|
444
206
|
onToggle={() => onToggle(key)}
|
|
445
|
-
ariaLabel={
|
|
446
|
-
isExpanded
|
|
447
|
-
? t('@astryx.tableRowExpansion.collapseRow')
|
|
448
|
-
: t('@astryx.tableRowExpansion.expandRow')
|
|
449
|
-
}
|
|
450
207
|
/>
|
|
451
208
|
);
|
|
452
209
|
},
|
|
453
210
|
}),
|
|
454
|
-
[
|
|
455
|
-
expandedKeys,
|
|
456
|
-
onToggle,
|
|
457
|
-
getRowKey,
|
|
458
|
-
getChildren,
|
|
459
|
-
getIsItemExpandable,
|
|
460
|
-
getDepth,
|
|
461
|
-
t,
|
|
462
|
-
],
|
|
211
|
+
[expandedKeys, onToggle, getRowKey, getIsItemExpandable],
|
|
463
212
|
);
|
|
464
213
|
|
|
465
214
|
return useMemo(
|
|
466
215
|
(): TablePlugin<T> => ({
|
|
467
216
|
transformColumns(columns: TableColumn<T>[]) {
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
// Wrap the first user column's renderCell to add depth indentation +
|
|
473
|
-
// an inline chevron for child rows. This is the inherited-columns
|
|
474
|
-
// pattern: child rows use the same columns but indent their first
|
|
475
|
-
// content cell.
|
|
476
|
-
const wrappedColumns = columns.map(col => {
|
|
477
|
-
if (col.key !== firstUserColumnKeyRef.current) {
|
|
478
|
-
return col;
|
|
479
|
-
}
|
|
480
|
-
const originalRenderCell = col.renderCell;
|
|
481
|
-
return {
|
|
482
|
-
...col,
|
|
483
|
-
renderCell: (item: T): ReactNode => {
|
|
484
|
-
const depth = getDepth ? getDepth(item) : 0;
|
|
485
|
-
const originalContent = originalRenderCell
|
|
486
|
-
? originalRenderCell(item)
|
|
487
|
-
: String(
|
|
488
|
-
((item as Record<string, unknown>)[col.key] as
|
|
489
|
-
string | number | null | undefined) ?? '',
|
|
490
|
-
);
|
|
491
|
-
|
|
492
|
-
if (depth === 0) {
|
|
493
|
-
return originalContent;
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
const indent = (depth - 1) * INDENT_PER_DEPTH;
|
|
497
|
-
const key = getRowKey(item);
|
|
498
|
-
const isExpanded = expandedKeys.has(key);
|
|
499
|
-
const expandable = getIsItemExpandable
|
|
500
|
-
? getIsItemExpandable(item)
|
|
501
|
-
: getChildren(item).length > 0;
|
|
502
|
-
|
|
503
|
-
const chevron = expandable ? (
|
|
504
|
-
<ExpansionChevron
|
|
505
|
-
isExpanded={isExpanded}
|
|
506
|
-
onToggle={() => onToggle(key)}
|
|
507
|
-
ariaLabel={
|
|
508
|
-
isExpanded
|
|
509
|
-
? t('@astryx.tableRowExpansion.collapseRow')
|
|
510
|
-
: t('@astryx.tableRowExpansion.expandRow')
|
|
511
|
-
}
|
|
512
|
-
/>
|
|
513
|
-
) : (
|
|
514
|
-
<span {...stylex.props(expansionStyles.placeholder)} />
|
|
515
|
-
);
|
|
516
|
-
|
|
517
|
-
return (
|
|
518
|
-
<div
|
|
519
|
-
{...stylex.props(
|
|
520
|
-
expansionStyles.indentedCell,
|
|
521
|
-
indent > 0 && expansionStyles.indent(indent),
|
|
522
|
-
)}>
|
|
523
|
-
{chevron}
|
|
524
|
-
{originalContent}
|
|
525
|
-
</div>
|
|
526
|
-
);
|
|
527
|
-
},
|
|
528
|
-
};
|
|
529
|
-
});
|
|
530
|
-
|
|
531
|
-
return [expansionColumn, ...wrappedColumns];
|
|
532
|
-
},
|
|
533
|
-
|
|
534
|
-
transformHeaderCell(
|
|
535
|
-
props: HeaderCellRenderProps,
|
|
536
|
-
column: TableColumn<T>,
|
|
537
|
-
): HeaderCellRenderProps {
|
|
538
|
-
if (column.key !== '__expansion') {
|
|
539
|
-
return props;
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
// Show expand-all toggle when the consumer provides the state + callback.
|
|
543
|
-
if (isAllExpanded !== undefined && onToggleExpandAll) {
|
|
544
|
-
const allExpanded = isAllExpanded === true;
|
|
545
|
-
return {
|
|
546
|
-
...props,
|
|
547
|
-
content: (
|
|
548
|
-
<button
|
|
549
|
-
type="button"
|
|
550
|
-
{...stylex.props(expansionStyles.chevronButton)}
|
|
551
|
-
onClick={() => onToggleExpandAll(!allExpanded)}
|
|
552
|
-
aria-label={
|
|
553
|
-
allExpanded
|
|
554
|
-
? t('@astryx.tableRowExpansion.collapseAllRows')
|
|
555
|
-
: t('@astryx.tableRowExpansion.expandAllRows')
|
|
556
|
-
}>
|
|
557
|
-
<span {...stylex.props(rtlStyles.mirror)}>
|
|
558
|
-
<span
|
|
559
|
-
{...stylex.props(
|
|
560
|
-
expansionStyles.chevronIcon,
|
|
561
|
-
allExpanded && expansionStyles.chevronExpanded,
|
|
562
|
-
)}>
|
|
563
|
-
<Icon icon="chevronRight" size="xsm" />
|
|
564
|
-
</span>
|
|
565
|
-
</span>
|
|
566
|
-
</button>
|
|
567
|
-
),
|
|
568
|
-
};
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
return {...props, content: null};
|
|
217
|
+
const withExpansion = [expansionColumn, ...columns];
|
|
218
|
+
columnCountRef.current = withExpansion.length;
|
|
219
|
+
return withExpansion;
|
|
572
220
|
},
|
|
573
221
|
|
|
574
222
|
transformBodyCell(
|
|
575
223
|
props: BodyCellRenderProps,
|
|
576
|
-
|
|
224
|
+
_column: TableColumn<T>,
|
|
577
225
|
item: T,
|
|
578
226
|
): BodyCellRenderProps {
|
|
579
|
-
// Contribute
|
|
580
|
-
//
|
|
227
|
+
// Contribute the expand/collapse action on every cell; BaseTable
|
|
228
|
+
// aggregates them into one menu per row. Skip non-expandable rows.
|
|
581
229
|
const expandable = getIsItemExpandable
|
|
582
230
|
? getIsItemExpandable(item)
|
|
583
|
-
:
|
|
231
|
+
: true;
|
|
584
232
|
if (!expandable) {
|
|
585
233
|
return props;
|
|
586
234
|
}
|
|
587
|
-
|
|
588
235
|
const key = getRowKey(item);
|
|
589
236
|
const isExpanded = expandedKeys.has(key);
|
|
590
237
|
return {
|
|
@@ -598,13 +245,11 @@ export function useTableRowExpansion<T extends Record<string, unknown>>(
|
|
|
598
245
|
? t('@astryx.tableRowExpansion.collapseRow')
|
|
599
246
|
: t('@astryx.tableRowExpansion.expandRow'),
|
|
600
247
|
icon: (
|
|
601
|
-
<
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
/>
|
|
607
|
-
</span>
|
|
248
|
+
<Icon
|
|
249
|
+
icon={isExpanded ? 'chevronDown' : 'chevronRight'}
|
|
250
|
+
size="xsm"
|
|
251
|
+
aria-hidden
|
|
252
|
+
/>
|
|
608
253
|
),
|
|
609
254
|
onSelect: () => onToggle(key),
|
|
610
255
|
},
|
|
@@ -613,38 +258,50 @@ export function useTableRowExpansion<T extends Record<string, unknown>>(
|
|
|
613
258
|
},
|
|
614
259
|
|
|
615
260
|
transformBodyRow(props: BodyRowRenderProps, item: T): BodyRowRenderProps {
|
|
616
|
-
if (!hasRowClickExpansion) {
|
|
617
|
-
return props;
|
|
618
|
-
}
|
|
619
261
|
const expandable = getIsItemExpandable
|
|
620
262
|
? getIsItemExpandable(item)
|
|
621
|
-
:
|
|
263
|
+
: true;
|
|
622
264
|
if (!expandable) {
|
|
623
265
|
return props;
|
|
624
266
|
}
|
|
625
267
|
const key = getRowKey(item);
|
|
268
|
+
if (!expandedKeys.has(key)) {
|
|
269
|
+
return props;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
const panel = (
|
|
273
|
+
<tr
|
|
274
|
+
key={`${key}-expanded`}
|
|
275
|
+
{...stylex.props(expansionStyles.expandedRow)}>
|
|
276
|
+
<td
|
|
277
|
+
colSpan={columnCountRef.current}
|
|
278
|
+
{...stylex.props(expansionStyles.expandedCell)}>
|
|
279
|
+
{renderExpanded(item)}
|
|
280
|
+
</td>
|
|
281
|
+
</tr>
|
|
282
|
+
);
|
|
283
|
+
|
|
626
284
|
return {
|
|
627
285
|
...props,
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
286
|
+
afterRow: props.afterRow ? (
|
|
287
|
+
<>
|
|
288
|
+
{props.afterRow}
|
|
289
|
+
{panel}
|
|
290
|
+
</>
|
|
291
|
+
) : (
|
|
292
|
+
panel
|
|
293
|
+
),
|
|
633
294
|
};
|
|
634
295
|
},
|
|
635
296
|
}),
|
|
636
297
|
[
|
|
637
298
|
expandedKeys,
|
|
638
299
|
getRowKey,
|
|
639
|
-
|
|
640
|
-
getChildren,
|
|
641
|
-
getDepth,
|
|
300
|
+
renderExpanded,
|
|
642
301
|
getIsItemExpandable,
|
|
643
|
-
|
|
644
|
-
isAllExpanded,
|
|
645
|
-
onToggleExpandAll,
|
|
646
|
-
expansionColumn,
|
|
302
|
+
onToggle,
|
|
647
303
|
t,
|
|
304
|
+
expansionColumn,
|
|
648
305
|
],
|
|
649
306
|
);
|
|
650
307
|
}
|