@wallarm-org/design-system 0.62.0 → 0.63.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.
Files changed (191) hide show
  1. package/dist/components/Breadcrumbs/BreadcrumbsItem.js +1 -0
  2. package/dist/components/BulkBar/BulkBarSummary.d.ts +4 -14
  3. package/dist/components/BulkBar/BulkBarSummary.js +15 -46
  4. package/dist/components/BulkBar/BulkBarSummaryClear.d.ts +7 -0
  5. package/dist/components/BulkBar/BulkBarSummaryClear.js +25 -0
  6. package/dist/components/BulkBar/BulkBarSummaryCount.d.ts +13 -0
  7. package/dist/components/BulkBar/BulkBarSummaryCount.js +18 -0
  8. package/dist/components/BulkBar/BulkBarSummarySelectAll.d.ts +7 -0
  9. package/dist/components/BulkBar/BulkBarSummarySelectAll.js +25 -0
  10. package/dist/components/BulkBar/BulkBarSummarySeparator.d.ts +8 -0
  11. package/dist/components/BulkBar/BulkBarSummarySeparator.js +12 -0
  12. package/dist/components/BulkBar/index.d.ts +5 -0
  13. package/dist/components/BulkBar/index.js +6 -0
  14. package/dist/components/Calendar/CalendarPresetItem.d.ts +9 -3
  15. package/dist/components/Calendar/CalendarPresetItem.js +8 -5
  16. package/dist/components/Calendar/CalendarTrigger.d.ts +12 -3
  17. package/dist/components/Calendar/CalendarTrigger.js +3 -3
  18. package/dist/components/Calendar/index.d.ts +1 -1
  19. package/dist/components/Card/Card.js +2 -0
  20. package/dist/components/CodeSnippet/CodeSnippetCode.js +9 -2
  21. package/dist/components/CodeSnippet/CodeSnippetCopyButton.js +1 -1
  22. package/dist/components/CodeSnippet/CodeSnippetFullscreenButton.js +0 -1
  23. package/dist/components/CodeSnippet/CodeSnippetRoot.d.ts +8 -1
  24. package/dist/components/CodeSnippet/CodeSnippetRoot.js +5 -3
  25. package/dist/components/CodeSnippet/CodeSnippetShowMoreButton.d.ts +12 -0
  26. package/dist/components/CodeSnippet/{internal/ShowMoreButton.js → CodeSnippetShowMoreButton.js} +15 -9
  27. package/dist/components/CodeSnippet/CodeSnippetTab.d.ts +3 -6
  28. package/dist/components/CodeSnippet/CodeSnippetTab.js +5 -7
  29. package/dist/components/CodeSnippet/CodeSnippetWrapButton.js +0 -1
  30. package/dist/components/CodeSnippet/InlineCodeSnippet.d.ts +4 -2
  31. package/dist/components/CodeSnippet/InlineCodeSnippet.js +14 -7
  32. package/dist/components/CodeSnippet/index.d.ts +2 -1
  33. package/dist/components/CodeSnippet/index.js +2 -1
  34. package/dist/components/CodeSnippet/internal/FoldToggle.js +9 -2
  35. package/dist/components/CodeSnippet/lib/foldUtils.d.ts +6 -0
  36. package/dist/components/DateRangeInput/DateRangeEndValue.d.ts +9 -2
  37. package/dist/components/DateRangeInput/DateRangeEndValue.js +3 -2
  38. package/dist/components/DateRangeInput/DateRangeSegmentGroup.d.ts +12 -1
  39. package/dist/components/DateRangeInput/DateRangeSegmentGroup.js +24 -6
  40. package/dist/components/DateRangeInput/DateRangeStartValue.d.ts +11 -4
  41. package/dist/components/DateRangeInput/DateRangeStartValue.js +3 -2
  42. package/dist/components/DateRangeInput/index.d.ts +2 -2
  43. package/dist/components/Drawer/Drawer.d.ts +5 -0
  44. package/dist/components/Drawer/Drawer.js +3 -1
  45. package/dist/components/Drawer/DrawerClose.d.ts +3 -2
  46. package/dist/components/Drawer/DrawerClose.js +6 -3
  47. package/dist/components/Drawer/DrawerHeader.d.ts +1 -1
  48. package/dist/components/Drawer/DrawerHeader.js +4 -1
  49. package/dist/components/Drawer/DrawerResizeHandle.d.ts +7 -2
  50. package/dist/components/Drawer/DrawerResizeHandle.js +31 -6
  51. package/dist/components/Drawer/DrawerRoot.d.ts +3 -0
  52. package/dist/components/Drawer/DrawerRoot.js +3 -1
  53. package/dist/components/Drawer/DrawerTrigger.d.ts +3 -2
  54. package/dist/components/Drawer/DrawerTrigger.js +3 -2
  55. package/dist/components/Drawer/index.d.ts +1 -0
  56. package/dist/components/DropdownMenu/DropdownMenuCheckboxItem.d.ts +2 -1
  57. package/dist/components/DropdownMenu/DropdownMenuCheckboxItem.js +2 -2
  58. package/dist/components/DropdownMenu/DropdownMenuContextTrigger.d.ts +3 -5
  59. package/dist/components/DropdownMenu/DropdownMenuContextTrigger.js +2 -2
  60. package/dist/components/DropdownMenu/DropdownMenuItem.d.ts +2 -1
  61. package/dist/components/DropdownMenu/DropdownMenuItem.js +2 -2
  62. package/dist/components/DropdownMenu/DropdownMenuRadioGroup.d.ts +2 -1
  63. package/dist/components/DropdownMenu/DropdownMenuRadioGroup.js +4 -4
  64. package/dist/components/DropdownMenu/DropdownMenuRadioItem.d.ts +2 -1
  65. package/dist/components/DropdownMenu/DropdownMenuRadioItem.js +2 -2
  66. package/dist/components/DropdownMenu/DropdownMenuTrigger.d.ts +3 -5
  67. package/dist/components/DropdownMenu/DropdownMenuTrigger.js +2 -2
  68. package/dist/components/DropdownMenu/DropdownMenuTriggerItem.d.ts +4 -4
  69. package/dist/components/DropdownMenu/DropdownMenuTriggerItem.js +4 -3
  70. package/dist/components/DropdownMenu/index.d.ts +4 -4
  71. package/dist/components/NavRail/NavRailItem.d.ts +2 -1
  72. package/dist/components/NavRail/NavRailItem.js +6 -4
  73. package/dist/components/Popover/PopoverContent.d.ts +3 -3
  74. package/dist/components/Popover/PopoverContent.js +4 -8
  75. package/dist/components/Popover/PopoverTrigger.d.ts +3 -5
  76. package/dist/components/Popover/PopoverTrigger.js +3 -7
  77. package/dist/components/Popover/index.d.ts +2 -2
  78. package/dist/components/SegmentedControl/SegmentedControlItem.d.ts +6 -4
  79. package/dist/components/SegmentedControl/SegmentedControlItem.js +5 -2
  80. package/dist/components/SegmentedTabs/SegmentedTabsTrigger.d.ts +5 -3
  81. package/dist/components/SegmentedTabs/SegmentedTabsTrigger.js +5 -3
  82. package/dist/components/SegmentedTabs/SegmentedTabsTriggerButton.js +2 -2
  83. package/dist/components/Select/SelectButton.js +2 -2
  84. package/dist/components/Select/SelectClearTrigger.d.ts +2 -1
  85. package/dist/components/Select/SelectClearTrigger.js +2 -2
  86. package/dist/components/Select/SelectInput/SelectInput.d.ts +4 -1
  87. package/dist/components/Select/SelectInput/SelectInput.js +3 -2
  88. package/dist/components/Select/SelectOption.d.ts +2 -1
  89. package/dist/components/Select/SelectOption.js +2 -2
  90. package/dist/components/Select/SelectSearchInput.d.ts +3 -2
  91. package/dist/components/Select/SelectSearchInput.js +3 -2
  92. package/dist/components/Select/index.d.ts +1 -1
  93. package/dist/components/Selection/SelectionBulkBar/SelectionBulkBar.d.ts +1 -1
  94. package/dist/components/Selection/SelectionBulkBar/SelectionBulkBar.js +44 -5
  95. package/dist/components/Selection/index.d.ts +2 -0
  96. package/dist/components/Selection/index.js +2 -1
  97. package/dist/components/Table/Table.js +7 -0
  98. package/dist/components/Table/TableActionBar/TableActionBar.d.ts +7 -1
  99. package/dist/components/Table/TableActionBar/TableActionBar.js +6 -2
  100. package/dist/components/Table/TableActionBar/TableActionBarSelection.d.ts +16 -2
  101. package/dist/components/Table/TableActionBar/TableActionBarSelection.js +52 -10
  102. package/dist/components/Table/TableActionBar/index.d.ts +1 -0
  103. package/dist/components/Table/TableActionBar/index.js +2 -1
  104. package/dist/components/Table/TableColumnMenu/TableColumnMenu.d.ts +37 -0
  105. package/dist/components/Table/TableColumnMenu/TableColumnMenu.js +139 -0
  106. package/dist/components/Table/TableColumnMenu/TableColumnMenuHideItem.d.ts +8 -0
  107. package/dist/components/Table/TableColumnMenu/TableColumnMenuHideItem.js +27 -0
  108. package/dist/components/Table/TableColumnMenu/TableColumnMenuMoveLeftItem.d.ts +8 -0
  109. package/dist/components/Table/TableColumnMenu/TableColumnMenuMoveLeftItem.js +38 -0
  110. package/dist/components/Table/TableColumnMenu/TableColumnMenuMoveRightItem.d.ts +8 -0
  111. package/dist/components/Table/TableColumnMenu/TableColumnMenuMoveRightItem.js +39 -0
  112. package/dist/components/Table/TableColumnMenu/TableColumnMenuPinItem.d.ts +10 -0
  113. package/dist/components/Table/TableColumnMenu/TableColumnMenuPinItem.js +31 -0
  114. package/dist/components/Table/TableColumnMenu/TableColumnMenuSortItem.d.ts +17 -0
  115. package/dist/components/Table/TableColumnMenu/TableColumnMenuSortItem.js +33 -0
  116. package/dist/components/Table/TableColumnMenu/index.d.ts +6 -0
  117. package/dist/components/Table/TableColumnMenu/index.js +7 -0
  118. package/dist/components/Table/TableHeadCell.js +17 -18
  119. package/dist/components/Table/TableInner/TableInner.d.ts +2 -0
  120. package/dist/components/Table/TableInner/TableInner.js +21 -12
  121. package/dist/components/Table/TableInner/TableInnerContainer.d.ts +1 -0
  122. package/dist/components/Table/TableInner/TableInnerContainer.js +5 -3
  123. package/dist/components/Table/TableInner/TableInnerWindow.d.ts +1 -0
  124. package/dist/components/Table/TableInner/TableInnerWindow.js +5 -3
  125. package/dist/components/Table/TableScrollHandler.d.ts +27 -4
  126. package/dist/components/Table/TableScrollHandler.js +99 -68
  127. package/dist/components/Table/TableScrollHandlerContext.d.ts +19 -0
  128. package/dist/components/Table/TableScrollHandlerContext.js +24 -0
  129. package/dist/components/Table/TableScrollHandlerSlot.d.ts +8 -0
  130. package/dist/components/Table/TableScrollHandlerSlot.js +18 -0
  131. package/dist/components/Table/TableSettingsMenu/TableSettingsMenu.d.ts +18 -2
  132. package/dist/components/Table/TableSettingsMenu/TableSettingsMenu.js +105 -95
  133. package/dist/components/Table/TableSettingsMenu/TableSettingsMenuContentContext.d.ts +7 -0
  134. package/dist/components/Table/TableSettingsMenu/TableSettingsMenuContentContext.js +9 -0
  135. package/dist/components/Table/TableSettingsMenu/TableSettingsMenuContext.d.ts +15 -0
  136. package/dist/components/Table/TableSettingsMenu/TableSettingsMenuContext.js +21 -0
  137. package/dist/components/Table/TableSettingsMenu/TableSettingsMenuItem.d.ts +8 -6
  138. package/dist/components/Table/TableSettingsMenu/TableSettingsMenuItem.js +17 -11
  139. package/dist/components/Table/TableSettingsMenu/TableSettingsMenuReset.d.ts +5 -0
  140. package/dist/components/Table/TableSettingsMenu/TableSettingsMenuReset.js +34 -0
  141. package/dist/components/Table/TableSettingsMenu/TableSettingsMenuSearch.d.ts +5 -0
  142. package/dist/components/Table/TableSettingsMenu/TableSettingsMenuSearch.js +17 -0
  143. package/dist/components/Table/TableSettingsMenu/TableSettingsMenuSlot.d.ts +11 -0
  144. package/dist/components/Table/TableSettingsMenu/TableSettingsMenuSlot.js +16 -0
  145. package/dist/components/Table/TableSettingsMenu/index.d.ts +6 -1
  146. package/dist/components/Table/TableSettingsMenu/index.js +6 -1
  147. package/dist/components/Table/TableSortTrigger.d.ts +39 -0
  148. package/dist/components/Table/TableSortTrigger.js +86 -0
  149. package/dist/components/Table/index.d.ts +6 -2
  150. package/dist/components/Table/index.js +7 -3
  151. package/dist/components/Table/lib/collectDirectChildren.d.ts +8 -0
  152. package/dist/components/Table/lib/collectDirectChildren.js +13 -0
  153. package/dist/components/Table/lib/containsDirectChild.d.ts +12 -0
  154. package/dist/components/Table/lib/containsDirectChild.js +12 -0
  155. package/dist/components/Table/lib/index.d.ts +2 -0
  156. package/dist/components/Table/lib/index.js +3 -1
  157. package/dist/components/Tabs/TabsTrigger.d.ts +5 -4
  158. package/dist/components/Tabs/TabsTrigger.js +3 -2
  159. package/dist/components/Tag/Tag.js +2 -1
  160. package/dist/components/Tag/TagClose.d.ts +5 -3
  161. package/dist/components/Tag/TagClose.js +13 -9
  162. package/dist/components/Tag/index.d.ts +1 -1
  163. package/dist/components/Tooltip/Tooltip.js +4 -2
  164. package/dist/components/Tooltip/TooltipContent.d.ts +4 -4
  165. package/dist/components/Tooltip/TooltipContent.js +3 -3
  166. package/dist/components/Tooltip/TooltipTrigger.d.ts +4 -4
  167. package/dist/components/Tooltip/TooltipTrigger.js +2 -2
  168. package/dist/components/Tooltip/index.d.ts +2 -2
  169. package/dist/components/Tour/Tour.d.ts +7 -1
  170. package/dist/components/Tour/Tour.js +8 -2
  171. package/dist/components/Tour/TourClose.d.ts +6 -2
  172. package/dist/components/Tour/TourClose.js +6 -6
  173. package/dist/components/Tour/TourFooter.js +8 -3
  174. package/dist/components/Tour/TourInner.d.ts +7 -1
  175. package/dist/components/Tour/TourInner.js +2 -2
  176. package/dist/components/Tour/index.d.ts +1 -0
  177. package/dist/components/Tour/index.js +2 -1
  178. package/dist/components/Tour/types.d.ts +12 -1
  179. package/dist/hooks/useCopyTooltip.d.ts +1 -3
  180. package/dist/hooks/useCopyTooltip.js +1 -2
  181. package/dist/index.d.ts +2 -2
  182. package/dist/index.js +3 -3
  183. package/dist/metadata/components.json +30183 -16896
  184. package/dist/utils/testId.d.ts +4 -1
  185. package/dist/utils/testId.js +2 -1
  186. package/package.json +1 -1
  187. package/dist/components/CodeSnippet/internal/ShowMoreButton.d.ts +0 -2
  188. package/dist/components/Selection/SelectionBulkBar/SelectionBulkBarSummary.d.ts +0 -2
  189. package/dist/components/Selection/SelectionBulkBar/SelectionBulkBarSummary.js +0 -18
  190. package/dist/components/Table/TableHeadCellMenu.d.ts +0 -9
  191. package/dist/components/Table/TableHeadCellMenu.js +0 -174
@@ -1,25 +1,30 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { useMemo, useState } from "react";
2
+ import { cloneElement, useMemo, useState } from "react";
3
+ import { createPortal } from "react-dom";
3
4
  import { DndContext, KeyboardSensor, PointerSensor, closestCenter, useSensor, useSensors } from "@dnd-kit/core";
4
5
  import { SortableContext, arrayMove, sortableKeyboardCoordinates, verticalListSortingStrategy } from "@dnd-kit/sortable";
5
- import { isEqual } from "lodash-es";
6
6
  import { Settings } from "../../../icons/index.js";
7
7
  import { cn } from "../../../utils/cn.js";
8
8
  import { useTestId } from "../../../utils/testId.js";
9
9
  import { Button } from "../../Button/index.js";
10
- import { DropdownMenu, DropdownMenuContent, DropdownMenuFooter, DropdownMenuInput, DropdownMenuLabel, DropdownMenuTrigger } from "../../DropdownMenu/index.js";
10
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuFooter, DropdownMenuLabel, DropdownMenuTrigger } from "../../DropdownMenu/index.js";
11
11
  import { Separator } from "../../Separator/index.js";
12
12
  import { VStack } from "../../Stack/index.js";
13
13
  import { Tooltip, TooltipContent, TooltipTrigger } from "../../Tooltip/index.js";
14
- import { TABLE_EXPAND_COLUMN_ID, TABLE_SELECT_COLUMN_ID } from "../lib/index.js";
14
+ import { TABLE_EXPAND_COLUMN_ID, TABLE_SELECT_COLUMN_ID, collectDirectChildren } from "../lib/index.js";
15
15
  import { useTableContext } from "../TableContext/index.js";
16
+ import { TableSettingsMenuContentProvider } from "./TableSettingsMenuContentContext.js";
17
+ import { useTableSettingsMenuContext } from "./TableSettingsMenuContext.js";
16
18
  import { TableSettingsMenuItem } from "./TableSettingsMenuItem.js";
19
+ import { TableSettingsMenuReset } from "./TableSettingsMenuReset.js";
20
+ import { TableSettingsMenuSearch } from "./TableSettingsMenuSearch.js";
17
21
  const DEFAULT_HEADER_HEIGHT = 34;
18
22
  const HEADER_HEIGHT_WITH_DESCRIPTION = 50;
19
- const TableSettingsMenu = ()=>{
20
- const testId = useTestId('settings-menu');
23
+ const TableSettingsMenu = ({ 'data-testid': testIdProp, children, ...rest })=>{
24
+ const testId = useTestId('settings-menu', testIdProp);
25
+ const { anchorNode } = useTableSettingsMenuContext();
21
26
  const ctx = useTableContext();
22
- const { table, visibilityEnabled, columnDndEnabled, defaultColumnVisibility, defaultColumnOrder, alwaysPinnedLeft, masterColumnId } = ctx;
27
+ const { table, alwaysPinnedLeft, masterColumnId } = ctx;
23
28
  const hasTextDescription = table.getAllLeafColumns().some((col)=>col.columnDef.meta?.description?.type === 'text');
24
29
  const [search, setSearch] = useState('');
25
30
  const [menuOpen, setMenuOpen] = useState(false);
@@ -47,7 +52,30 @@ const TableSettingsMenu = ()=>{
47
52
  }, [
48
53
  filteredColumns
49
54
  ]);
55
+ const { searchOverride, resetOverride, itemOverrides } = useMemo(()=>{
56
+ const [search] = collectDirectChildren(children, TableSettingsMenuSearch);
57
+ const [reset] = collectDirectChildren(children, TableSettingsMenuReset);
58
+ const items = new Map(collectDirectChildren(children, TableSettingsMenuItem).map((el)=>[
59
+ el.props.columnId,
60
+ el
61
+ ]));
62
+ return {
63
+ searchOverride: search,
64
+ resetOverride: reset,
65
+ itemOverrides: items
66
+ };
67
+ }, [
68
+ children
69
+ ]);
50
70
  const hasUserPinned = pinnedColumns.some((col)=>col.id !== masterColumnId);
71
+ const renderColumnItem = (col)=>{
72
+ const override = itemOverrides.get(col.id);
73
+ return override ? /*#__PURE__*/ cloneElement(override, {
74
+ key: col.id
75
+ }) : /*#__PURE__*/ jsx(TableSettingsMenuItem, {
76
+ columnId: col.id
77
+ }, col.id);
78
+ };
51
79
  const sensors = useSensors(useSensor(PointerSensor, {
52
80
  activationConstraint: {
53
81
  distance: 5
@@ -64,101 +92,83 @@ const TableSettingsMenu = ()=>{
64
92
  const newOrder = arrayMove(currentOrder, oldIndex, newIndex);
65
93
  ctx.setColumnOrder(newOrder);
66
94
  };
67
- const handleReset = ()=>{
68
- if (defaultColumnVisibility && visibilityEnabled) table.setColumnVisibility(defaultColumnVisibility);
69
- if (defaultColumnOrder && columnDndEnabled) ctx.setColumnOrder(defaultColumnOrder);
70
- };
71
- const { columnVisibility: currentVisibility, columnOrder: currentOrder } = table.getState();
72
- const effectiveOrder = 0 === currentOrder.length ? defaultColumnOrder : currentOrder;
73
- const visibilityMatch = !defaultColumnVisibility || isEqual(currentVisibility, defaultColumnVisibility);
74
- const orderMatch = !defaultColumnOrder || isEqual(effectiveOrder, defaultColumnOrder);
75
- const isDefaultState = visibilityMatch && orderMatch;
76
- return /*#__PURE__*/ jsx("div", {
77
- "data-testid": testId,
78
- className: cn('absolute top-0 right-0 z-30', 'flex items-start', 'bg-bg-light-primary border rounded-tr-12 border-border-primary-light', 'pl-6 pr-4 py-4', 'rounded-tr-12'),
79
- style: {
80
- height: hasTextDescription ? HEADER_HEIGHT_WITH_DESCRIPTION : DEFAULT_HEADER_HEIGHT
95
+ const content = /*#__PURE__*/ jsx(TableSettingsMenuContentProvider, {
96
+ value: {
97
+ search,
98
+ setSearch
81
99
  },
82
- children: /*#__PURE__*/ jsxs(Tooltip, {
83
- disabled: menuOpen,
84
- children: [
85
- /*#__PURE__*/ jsx(TooltipTrigger, {
86
- asChild: true,
87
- children: /*#__PURE__*/ jsx("span", {
88
- className: "inline-flex",
89
- children: /*#__PURE__*/ jsxs(DropdownMenu, {
90
- onOpenChange: setMenuOpen,
91
- children: [
92
- /*#__PURE__*/ jsx(DropdownMenuTrigger, {
93
- asChild: true,
94
- children: /*#__PURE__*/ jsx(Button, {
95
- variant: "outline",
96
- color: "neutral",
97
- size: "small",
98
- className: "shadow-sm",
99
- "aria-label": "Table settings",
100
- children: /*#__PURE__*/ jsx(Settings, {})
101
- })
102
- }),
103
- /*#__PURE__*/ jsxs(DropdownMenuContent, {
104
- className: cn('min-w-256 max-h-[430px]'),
105
- children: [
106
- /*#__PURE__*/ jsx(DropdownMenuInput, {
107
- placeholder: "Search",
108
- value: search,
109
- onChange: (e)=>setSearch(e.target.value)
110
- }),
111
- /*#__PURE__*/ jsx(VStack, {
112
- gap: 1,
113
- children: /*#__PURE__*/ jsx(DndContext, {
114
- sensors: sensors,
115
- collisionDetection: closestCenter,
116
- onDragEnd: handleDragEnd,
117
- children: /*#__PURE__*/ jsxs(SortableContext, {
118
- items: filteredColumns.filter((c)=>!alwaysPinnedLeft.includes(c.id)).map((c)=>c.id),
119
- strategy: verticalListSortingStrategy,
120
- children: [
121
- hasUserPinned && /*#__PURE__*/ jsx(DropdownMenuLabel, {
122
- children: "Pinned"
123
- }),
124
- pinnedColumns.map((col)=>/*#__PURE__*/ jsx(TableSettingsMenuItem, {
125
- column: col,
126
- canDrag: columnDndEnabled
127
- }, col.id)),
128
- hasUserPinned && unpinnedColumns.length > 0 && /*#__PURE__*/ jsx(Separator, {
129
- spacing: 4
130
- }),
131
- unpinnedColumns.map((col)=>/*#__PURE__*/ jsx(TableSettingsMenuItem, {
132
- column: col,
133
- canDrag: columnDndEnabled
134
- }, col.id))
135
- ]
100
+ children: /*#__PURE__*/ jsx("div", {
101
+ "data-testid": testId,
102
+ className: cn('absolute top-0 right-0 z-30', 'flex items-start', 'bg-bg-light-primary border rounded-tr-12 border-border-primary-light', 'pl-6 pr-4 py-4', 'rounded-tr-12'),
103
+ style: {
104
+ height: hasTextDescription ? HEADER_HEIGHT_WITH_DESCRIPTION : DEFAULT_HEADER_HEIGHT
105
+ },
106
+ children: /*#__PURE__*/ jsxs(Tooltip, {
107
+ disabled: menuOpen,
108
+ children: [
109
+ /*#__PURE__*/ jsx(TooltipTrigger, {
110
+ asChild: true,
111
+ children: /*#__PURE__*/ jsx("span", {
112
+ className: "inline-flex",
113
+ children: /*#__PURE__*/ jsxs(DropdownMenu, {
114
+ onOpenChange: setMenuOpen,
115
+ children: [
116
+ /*#__PURE__*/ jsx(DropdownMenuTrigger, {
117
+ asChild: true,
118
+ children: /*#__PURE__*/ jsx(Button, {
119
+ variant: "outline",
120
+ color: "neutral",
121
+ size: "small",
122
+ className: "shadow-sm",
123
+ "aria-label": "Table settings",
124
+ ...rest,
125
+ children: /*#__PURE__*/ jsx(Settings, {})
126
+ })
127
+ }),
128
+ /*#__PURE__*/ jsxs(DropdownMenuContent, {
129
+ className: cn('min-w-256 max-h-[430px]'),
130
+ children: [
131
+ searchOverride ?? /*#__PURE__*/ jsx(TableSettingsMenuSearch, {}),
132
+ /*#__PURE__*/ jsx(VStack, {
133
+ gap: 1,
134
+ children: /*#__PURE__*/ jsx(DndContext, {
135
+ sensors: sensors,
136
+ collisionDetection: closestCenter,
137
+ onDragEnd: handleDragEnd,
138
+ children: /*#__PURE__*/ jsxs(SortableContext, {
139
+ items: filteredColumns.filter((c)=>!alwaysPinnedLeft.includes(c.id)).map((c)=>c.id),
140
+ strategy: verticalListSortingStrategy,
141
+ children: [
142
+ hasUserPinned && /*#__PURE__*/ jsx(DropdownMenuLabel, {
143
+ children: "Pinned"
144
+ }),
145
+ pinnedColumns.map(renderColumnItem),
146
+ hasUserPinned && unpinnedColumns.length > 0 && /*#__PURE__*/ jsx(Separator, {
147
+ spacing: 4
148
+ }),
149
+ unpinnedColumns.map(renderColumnItem)
150
+ ]
151
+ })
136
152
  })
153
+ }),
154
+ /*#__PURE__*/ jsx(DropdownMenuFooter, {
155
+ children: resetOverride ?? /*#__PURE__*/ jsx(TableSettingsMenuReset, {})
137
156
  })
138
- }),
139
- /*#__PURE__*/ jsx(DropdownMenuFooter, {
140
- children: /*#__PURE__*/ jsx(Button, {
141
- variant: "ghost",
142
- color: "neutral",
143
- size: "small",
144
- onClick: handleReset,
145
- disabled: isDefaultState,
146
- fullWidth: true,
147
- children: "Reset to default"
148
- })
149
- })
150
- ]
151
- })
152
- ]
157
+ ]
158
+ })
159
+ ]
160
+ })
153
161
  })
162
+ }),
163
+ /*#__PURE__*/ jsx(TooltipContent, {
164
+ children: "Table settings"
154
165
  })
155
- }),
156
- /*#__PURE__*/ jsx(TooltipContent, {
157
- children: "Table settings"
158
- })
159
- ]
166
+ ]
167
+ })
160
168
  })
161
169
  });
170
+ if (!anchorNode) return null;
171
+ return /*#__PURE__*/ createPortal(content, anchorNode);
162
172
  };
163
173
  TableSettingsMenu.displayName = 'TableSettingsMenu';
164
174
  export { TableSettingsMenu };
@@ -0,0 +1,7 @@
1
+ interface TableSettingsMenuContentContextValue {
2
+ search: string;
3
+ setSearch: (value: string) => void;
4
+ }
5
+ export declare const TableSettingsMenuContentProvider: import("react").Provider<TableSettingsMenuContentContextValue | null>;
6
+ export declare const useTableSettingsMenuContentContext: () => TableSettingsMenuContentContextValue;
7
+ export {};
@@ -0,0 +1,9 @@
1
+ import { createContext, useContext } from "react";
2
+ const TableSettingsMenuContentContext = /*#__PURE__*/ createContext(null);
3
+ const TableSettingsMenuContentProvider = TableSettingsMenuContentContext.Provider;
4
+ const useTableSettingsMenuContentContext = ()=>{
5
+ const ctx = useContext(TableSettingsMenuContentContext);
6
+ if (!ctx) throw new Error('TableSettingsMenu item components must be rendered inside <TableSettingsMenu>');
7
+ return ctx;
8
+ };
9
+ export { TableSettingsMenuContentProvider, useTableSettingsMenuContentContext };
@@ -0,0 +1,15 @@
1
+ import { type FC, type ReactNode } from 'react';
2
+ interface TableSettingsMenuContextValue {
3
+ anchorNode: HTMLElement | null;
4
+ setAnchorNode: (node: HTMLElement | null) => void;
5
+ }
6
+ /**
7
+ * Holds the DOM node of the internal settings-menu anchor slot so a
8
+ * consumer-rendered `<TableSettingsMenu>` (declared in `Table` children) can
9
+ * portal its trigger into the correct absolutely-positioned location.
10
+ */
11
+ export declare const TableSettingsMenuProvider: FC<{
12
+ children: ReactNode;
13
+ }>;
14
+ export declare const useTableSettingsMenuContext: () => TableSettingsMenuContextValue;
15
+ export {};
@@ -0,0 +1,21 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useMemo, useState } from "react";
3
+ const TableSettingsMenuContext = /*#__PURE__*/ createContext({
4
+ anchorNode: null,
5
+ setAnchorNode: ()=>{}
6
+ });
7
+ const TableSettingsMenuProvider = ({ children })=>{
8
+ const [anchorNode, setAnchorNode] = useState(null);
9
+ const value = useMemo(()=>({
10
+ anchorNode,
11
+ setAnchorNode
12
+ }), [
13
+ anchorNode
14
+ ]);
15
+ return /*#__PURE__*/ jsx(TableSettingsMenuContext.Provider, {
16
+ value: value,
17
+ children: children
18
+ });
19
+ };
20
+ const useTableSettingsMenuContext = ()=>useContext(TableSettingsMenuContext);
21
+ export { TableSettingsMenuProvider, useTableSettingsMenuContext };
@@ -1,7 +1,9 @@
1
- import type { Column } from '@tanstack/react-table';
2
- interface TableSettingsMenuItemProps<T> {
3
- column: Column<T, unknown>;
4
- canDrag: boolean;
1
+ import { type SwitchProps } from '../../Switch';
2
+ export interface TableSettingsMenuItemProps extends Omit<SwitchProps, 'checked' | 'onCheckedChange' | 'disabled' | 'children'> {
3
+ /** Column id from the table's column definitions. */
4
+ columnId: string;
5
5
  }
6
- export declare const TableSettingsMenuItem: <T>({ column, canDrag }: TableSettingsMenuItemProps<T>) => import("react/jsx-runtime").JSX.Element;
7
- export {};
6
+ export declare const TableSettingsMenuItem: {
7
+ ({ columnId, className, "data-testid": testIdProp, ...rest }: TableSettingsMenuItemProps): import("react/jsx-runtime").JSX.Element | null;
8
+ displayName: string;
9
+ };
@@ -6,17 +6,20 @@ import { cn } from "../../../utils/cn.js";
6
6
  import { useTestId } from "../../../utils/testId.js";
7
7
  import { Switch, SwitchControl, SwitchLabel } from "../../Switch/index.js";
8
8
  import { useTableContext } from "../TableContext/index.js";
9
- const TableSettingsMenuItem = ({ column, canDrag })=>{
10
- const { masterColumnId } = useTableContext();
11
- const testId = useTestId('settings-menu-item');
9
+ const TableSettingsMenuItem = ({ columnId, className, 'data-testid': testIdProp, ...rest })=>{
10
+ const { masterColumnId, columnDndEnabled, table } = useTableContext();
11
+ const slotTestId = useTestId('settings-menu-item');
12
+ const switchTestId = useTestId(`settings-menu-item-${columnId}`, testIdProp);
13
+ const column = table.getColumn(columnId);
14
+ const isMasterColumn = column?.id === masterColumnId;
15
+ const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
16
+ id: columnId,
17
+ disabled: isMasterColumn || !columnDndEnabled
18
+ });
19
+ if (!column) return null;
12
20
  const isVisible = column.getIsVisible();
13
21
  const canHide = column.getCanHide();
14
22
  const header = 'string' == typeof column.columnDef.header ? column.columnDef.header : column.id;
15
- const isMasterColumn = column.id === masterColumnId;
16
- const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
17
- id: column.id,
18
- disabled: isMasterColumn || !canDrag
19
- });
20
23
  const style = {
21
24
  transform: CSS.Transform.toString(transform),
22
25
  transition,
@@ -25,7 +28,7 @@ const TableSettingsMenuItem = ({ column, canDrag })=>{
25
28
  return /*#__PURE__*/ jsxs("div", {
26
29
  ref: setNodeRef,
27
30
  style: style,
28
- "data-testid": testId,
31
+ "data-testid": slotTestId,
29
32
  className: cn('relative flex items-center w-full rounded-6 pl-20 pr-8 py-6', 'hover:bg-states-primary-hover transition-colors', 'data-disabled:opacity-50 data-disabled:pointer-events-none'),
30
33
  "data-disabled": isMasterColumn || void 0,
31
34
  children: [
@@ -33,13 +36,15 @@ const TableSettingsMenuItem = ({ column, canDrag })=>{
33
36
  className: cn('absolute left-4 top-1/2 -translate-y-1/2 cursor-grab active:cursor-grabbing text-icon-secondary hover:text-icon-primary data-disabled:opacity-50 data-disabled:pointer-events-none'),
34
37
  ...attributes,
35
38
  ...listeners,
36
- "data-disabled": isMasterColumn || !canDrag || void 0,
39
+ "data-disabled": isMasterColumn || !columnDndEnabled || void 0,
37
40
  children: /*#__PURE__*/ jsx(GripVertical, {
38
41
  size: "sm"
39
42
  })
40
43
  }),
41
44
  /*#__PURE__*/ jsxs(Switch, {
42
- className: cn('flex-1'),
45
+ ...rest,
46
+ "data-testid": switchTestId,
47
+ className: cn('flex-1', className),
43
48
  checked: isVisible,
44
49
  onCheckedChange: (details)=>column.toggleVisibility(details.checked),
45
50
  disabled: isMasterColumn || !canHide,
@@ -54,4 +59,5 @@ const TableSettingsMenuItem = ({ column, canDrag })=>{
54
59
  ]
55
60
  });
56
61
  };
62
+ TableSettingsMenuItem.displayName = 'TableSettingsMenuItem';
57
63
  export { TableSettingsMenuItem };
@@ -0,0 +1,5 @@
1
+ import type { ButtonHTMLAttributes, FC } from 'react';
2
+ import { type TestableProps } from '../../../utils/testId';
3
+ export interface TableSettingsMenuResetProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'color' | 'type'>, TestableProps {
4
+ }
5
+ export declare const TableSettingsMenuReset: FC<TableSettingsMenuResetProps>;
@@ -0,0 +1,34 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { isEqual } from "lodash-es";
3
+ import { useTestId } from "../../../utils/testId.js";
4
+ import { Button } from "../../Button/index.js";
5
+ import { useTableContext } from "../TableContext/index.js";
6
+ const TableSettingsMenuReset = ({ 'data-testid': testIdProp, onClick, ...rest })=>{
7
+ const testId = useTestId('settings-menu-reset', testIdProp);
8
+ const { table, visibilityEnabled, columnDndEnabled, defaultColumnVisibility, defaultColumnOrder, setColumnOrder } = useTableContext();
9
+ const handleClick = (event)=>{
10
+ onClick?.(event);
11
+ if (event.defaultPrevented) return;
12
+ if (defaultColumnVisibility && visibilityEnabled) table.setColumnVisibility(defaultColumnVisibility);
13
+ if (defaultColumnOrder && columnDndEnabled) setColumnOrder(defaultColumnOrder);
14
+ };
15
+ const { columnVisibility: currentVisibility, columnOrder: currentOrder } = table.getState();
16
+ const effectiveOrder = 0 === currentOrder.length ? defaultColumnOrder : currentOrder;
17
+ const visibilityMatch = !defaultColumnVisibility || isEqual(currentVisibility, defaultColumnVisibility);
18
+ const orderMatch = !defaultColumnOrder || isEqual(effectiveOrder, defaultColumnOrder);
19
+ const isDefaultState = visibilityMatch && orderMatch;
20
+ return /*#__PURE__*/ jsx(Button, {
21
+ ...rest,
22
+ type: "button",
23
+ "data-testid": testId,
24
+ variant: "ghost",
25
+ color: "neutral",
26
+ size: "small",
27
+ onClick: handleClick,
28
+ disabled: isDefaultState,
29
+ fullWidth: true,
30
+ children: "Reset to default"
31
+ });
32
+ };
33
+ TableSettingsMenuReset.displayName = 'TableSettingsMenuReset';
34
+ export { TableSettingsMenuReset };
@@ -0,0 +1,5 @@
1
+ import type { FC, InputHTMLAttributes } from 'react';
2
+ import { type TestableProps } from '../../../utils/testId';
3
+ export interface TableSettingsMenuSearchProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'value' | 'onChange'>, TestableProps {
4
+ }
5
+ export declare const TableSettingsMenuSearch: FC<TableSettingsMenuSearchProps>;
@@ -0,0 +1,17 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useTestId } from "../../../utils/testId.js";
3
+ import { DropdownMenuInput } from "../../DropdownMenu/index.js";
4
+ import { useTableSettingsMenuContentContext } from "./TableSettingsMenuContentContext.js";
5
+ const TableSettingsMenuSearch = ({ 'data-testid': testIdProp, placeholder = 'Search', ...rest })=>{
6
+ const testId = useTestId('settings-menu-search', testIdProp);
7
+ const { search, setSearch } = useTableSettingsMenuContentContext();
8
+ return /*#__PURE__*/ jsx(DropdownMenuInput, {
9
+ ...rest,
10
+ "data-testid": testId,
11
+ placeholder: placeholder,
12
+ value: search,
13
+ onChange: (e)=>setSearch(e.target.value)
14
+ });
15
+ };
16
+ TableSettingsMenuSearch.displayName = 'TableSettingsMenuSearch';
17
+ export { TableSettingsMenuSearch };
@@ -0,0 +1,11 @@
1
+ import type { FC } from 'react';
2
+ interface TableSettingsMenuSlotProps {
3
+ hasConsumerMenu: boolean;
4
+ }
5
+ /**
6
+ * Internal anchor for the settings menu. Registers its DOM node with the
7
+ * context so a consumer-rendered `<TableSettingsMenu>` can portal into it, and
8
+ * renders the default menu when the consumer did not supply one.
9
+ */
10
+ export declare const TableSettingsMenuSlot: FC<TableSettingsMenuSlotProps>;
11
+ export {};
@@ -0,0 +1,16 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { TableSettingsMenu } from "./TableSettingsMenu.js";
3
+ import { useTableSettingsMenuContext } from "./TableSettingsMenuContext.js";
4
+ const TableSettingsMenuSlot = ({ hasConsumerMenu })=>{
5
+ const { setAnchorNode } = useTableSettingsMenuContext();
6
+ return /*#__PURE__*/ jsxs(Fragment, {
7
+ children: [
8
+ /*#__PURE__*/ jsx("div", {
9
+ ref: setAnchorNode
10
+ }),
11
+ !hasConsumerMenu && /*#__PURE__*/ jsx(TableSettingsMenu, {})
12
+ ]
13
+ });
14
+ };
15
+ TableSettingsMenuSlot.displayName = 'TableSettingsMenuSlot';
16
+ export { TableSettingsMenuSlot };
@@ -1 +1,6 @@
1
- export { TableSettingsMenu } from './TableSettingsMenu';
1
+ export { TableSettingsMenu, type TableSettingsMenuProps } from './TableSettingsMenu';
2
+ export { TableSettingsMenuProvider } from './TableSettingsMenuContext';
3
+ export { TableSettingsMenuItem, type TableSettingsMenuItemProps } from './TableSettingsMenuItem';
4
+ export { TableSettingsMenuReset, type TableSettingsMenuResetProps } from './TableSettingsMenuReset';
5
+ export { TableSettingsMenuSearch, type TableSettingsMenuSearchProps, } from './TableSettingsMenuSearch';
6
+ export { TableSettingsMenuSlot } from './TableSettingsMenuSlot';
@@ -1,2 +1,7 @@
1
1
  import { TableSettingsMenu } from "./TableSettingsMenu.js";
2
- export { TableSettingsMenu };
2
+ import { TableSettingsMenuProvider } from "./TableSettingsMenuContext.js";
3
+ import { TableSettingsMenuItem } from "./TableSettingsMenuItem.js";
4
+ import { TableSettingsMenuReset } from "./TableSettingsMenuReset.js";
5
+ import { TableSettingsMenuSearch } from "./TableSettingsMenuSearch.js";
6
+ import { TableSettingsMenuSlot } from "./TableSettingsMenuSlot.js";
7
+ export { TableSettingsMenu, TableSettingsMenuItem, TableSettingsMenuProvider, TableSettingsMenuReset, TableSettingsMenuSearch, TableSettingsMenuSlot };
@@ -0,0 +1,39 @@
1
+ import { type ButtonHTMLAttributes, type ReactNode } from 'react';
2
+ import type { Column } from '@tanstack/react-table';
3
+ import { type TestableProps } from '../../utils/testId';
4
+ export interface TableSortTriggerProps<T = unknown> extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'color' | 'type' | 'children'>, TestableProps {
5
+ /**
6
+ * Column from the header render context — wires the trigger to TanStack's
7
+ * sort state. Pass `header.column` directly:
8
+ *
9
+ * ```tsx
10
+ * header: ({ column }) => (
11
+ * <TableSortTrigger column={column} data-analytics-id='users.sort.name'>
12
+ * Name
13
+ * </TableSortTrigger>
14
+ * )
15
+ * ```
16
+ */
17
+ column: Column<T, unknown>;
18
+ /** Label rendered next to the sort icon. Visual styling matches the default header text. */
19
+ children?: ReactNode;
20
+ }
21
+ /**
22
+ * Consumer-rendered sort trigger. Replaces the auto-rendered sort icon when
23
+ * present as a direct child of the column's `header` render return — the
24
+ * `TableHeadCell` children-scan suppresses the default `TableSortHandler` and
25
+ * does not wrap the label in its own `<Text>`.
26
+ *
27
+ * All native button attributes (including `data-analytics-id`,
28
+ * `data-analytics-props`, `aria-*`, `id`, `ref`, and any `data-*`) reach the
29
+ * underlying `<button>` so analytics SDKs that walk up via
30
+ * `closest('[data-analytics-id]')` resolve clicks on the icon to the
31
+ * consumer-supplied id.
32
+ *
33
+ * Consumer-passed `onClick` runs first; if it calls `event.preventDefault()`,
34
+ * the internal `toggleSorting` is skipped.
35
+ */
36
+ export declare const TableSortTrigger: {
37
+ <T>({ column, children, "data-testid": testIdProp, className, onClick, ...rest }: TableSortTriggerProps<T>): import("react/jsx-runtime").JSX.Element;
38
+ displayName: string;
39
+ };
@@ -0,0 +1,86 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useCallback } from "react";
3
+ import { MoveDown, MoveUp, MoveVertical } from "../../icons/index.js";
4
+ import { cn } from "../../utils/cn.js";
5
+ import { useTestId } from "../../utils/testId.js";
6
+ import { HStack } from "../Stack/index.js";
7
+ import { Text } from "../Text/index.js";
8
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../Tooltip/index.js";
9
+ import { tableHeaderButtonClass } from "./classes.js";
10
+ import { SORT_LABELS, getAlignClass } from "./lib/index.js";
11
+ import { useTableContext } from "./TableContext/index.js";
12
+ const getSortTooltip = (sortType, sortDirection)=>{
13
+ const labels = sortType && SORT_LABELS[sortType] || SORT_LABELS.text;
14
+ const [ascLabel, descLabel] = labels;
15
+ return 'asc' === sortDirection ? descLabel : ascLabel;
16
+ };
17
+ const getAriaLabel = (sortDirection)=>{
18
+ if ('asc' === sortDirection) return 'Sorted ascending';
19
+ if ('desc' === sortDirection) return 'Sorted descending';
20
+ return 'Sort column';
21
+ };
22
+ const renderSortIcon = (sortDirection)=>{
23
+ if ('asc' === sortDirection) return /*#__PURE__*/ jsx(MoveUp, {
24
+ size: "sm"
25
+ });
26
+ if ('desc' === sortDirection) return /*#__PURE__*/ jsx(MoveDown, {
27
+ size: "sm"
28
+ });
29
+ return /*#__PURE__*/ jsx(MoveVertical, {
30
+ size: "sm"
31
+ });
32
+ };
33
+ const TableSortTrigger = ({ column, children, 'data-testid': testIdProp, className, onClick, ...rest })=>{
34
+ const ctx = useTableContext();
35
+ const testId = useTestId('sort', testIdProp);
36
+ const canSort = ctx.sortingEnabled && column.getCanSort();
37
+ const sortDirection = column.getIsSorted();
38
+ const sortType = column.columnDef.meta?.sortType;
39
+ const tooltipText = getSortTooltip(sortType, sortDirection);
40
+ const isRightAligned = 'text-right' === getAlignClass(column.columnDef.meta);
41
+ const handleClick = useCallback((e)=>{
42
+ onClick?.(e);
43
+ if (e.defaultPrevented) return;
44
+ if (canSort) column.toggleSorting(void 0, e.shiftKey);
45
+ }, [
46
+ canSort,
47
+ column,
48
+ onClick
49
+ ]);
50
+ const iconButton = /*#__PURE__*/ jsxs(Tooltip, {
51
+ children: [
52
+ /*#__PURE__*/ jsx(TooltipTrigger, {
53
+ asChild: true,
54
+ children: /*#__PURE__*/ jsx("button", {
55
+ ...rest,
56
+ type: "button",
57
+ "data-testid": testId,
58
+ className: cn(tableHeaderButtonClass, className),
59
+ onClick: handleClick,
60
+ "aria-label": getAriaLabel(sortDirection),
61
+ children: renderSortIcon(sortDirection)
62
+ })
63
+ }),
64
+ /*#__PURE__*/ jsx(TooltipContent, {
65
+ children: tooltipText
66
+ })
67
+ ]
68
+ });
69
+ const label = children ? /*#__PURE__*/ jsx(Text, {
70
+ size: "xs",
71
+ weight: "medium",
72
+ truncate: true,
73
+ children: children
74
+ }) : null;
75
+ return /*#__PURE__*/ jsxs(HStack, {
76
+ gap: 2,
77
+ align: "center",
78
+ children: [
79
+ isRightAligned ? iconButton : null,
80
+ label,
81
+ isRightAligned ? null : iconButton
82
+ ]
83
+ });
84
+ };
85
+ TableSortTrigger.displayName = 'TableSortTrigger';
86
+ export { TableSortTrigger };