@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
@@ -6,13 +6,14 @@ import { HStack, VStack } from "../Stack/index.js";
6
6
  import { Text } from "../Text/index.js";
7
7
  import { Tooltip, TooltipContent, TooltipTrigger } from "../Tooltip/index.js";
8
8
  import { useHorizontalScrollState } from "./hooks/index.js";
9
- import { TABLE_EXPAND_COLUMN_ID, TABLE_SELECT_COLUMN_ID, getAlignClass, getPinningStyles, isLastPinnedLeft, useColumnDnd } from "./lib/index.js";
9
+ import { TABLE_EXPAND_COLUMN_ID, TABLE_SELECT_COLUMN_ID, containsDirectChild, getAlignClass, getPinningStyles, isLastPinnedLeft, useColumnDnd } from "./lib/index.js";
10
10
  import { Th } from "./primitives/index.js";
11
+ import { TableColumnMenu } from "./TableColumnMenu/index.js";
11
12
  import { useTableContext } from "./TableContext/index.js";
12
- import { TableHeadCellMenu } from "./TableHeadCellMenu.js";
13
13
  import { TableResizeHandler } from "./TableResizeHandler.js";
14
- import { TableScrollHandler } from "./TableScrollHandler.js";
14
+ import { TableScrollHandlerSlot } from "./TableScrollHandlerSlot.js";
15
15
  import { TableSortHandler } from "./TableSortHandler.js";
16
+ import { TableSortTrigger } from "./TableSortTrigger.js";
16
17
  const TableHeadCell = ({ header, hasTextDescription })=>{
17
18
  const ctx = useTableContext();
18
19
  const testId = useTestId('head-cell');
@@ -33,8 +34,12 @@ const TableHeadCell = ({ header, hasTextDescription })=>{
33
34
  const pinningStyles = getPinningStyles(column);
34
35
  const lastLeft = isLastPinnedLeft(column, allLeafColumns, column.id);
35
36
  const { canDnd, setNodeRef, dndStyle, attributes, listeners } = useColumnDnd(column);
36
- const { hasOverflow, atStart, atEnd } = useHorizontalScrollState(containerRef, isMasterColumn);
37
- const content = flexRender(header.column.columnDef.header, header.getContext());
37
+ const { hasOverflow } = useHorizontalScrollState(containerRef, isMasterColumn);
38
+ const headerDef = header.column.columnDef.header;
39
+ const headerCtx = header.getContext();
40
+ const content = 'function' == typeof headerDef ? headerDef(headerCtx) : flexRender(headerDef, headerCtx);
41
+ const hasCustomSortTrigger = containsDirectChild(content, TableSortTrigger);
42
+ const hasCustomColumnMenu = containsDirectChild(content, TableColumnMenu);
38
43
  const alignClass = getAlignClass(meta);
39
44
  const isRightAligned = 'text-right' === alignClass;
40
45
  const description = meta?.description;
@@ -79,17 +84,14 @@ const TableHeadCell = ({ header, hasTextDescription })=>{
79
84
  align: isTextDescription ? 'start' : 'center',
80
85
  justify: isRightAligned ? hasMenu ? 'between' : 'end' : void 0,
81
86
  children: [
82
- isRightAligned && hasMenu && /*#__PURE__*/ jsx("span", {
83
- className: "shrink-0 opacity-0 group-hover:opacity-100 has-[>_[data-state=open]]:opacity-100 transition-opacity",
84
- children: /*#__PURE__*/ jsx(TableHeadCellMenu, {
85
- column: column
86
- })
87
+ isRightAligned && hasMenu && !hasCustomColumnMenu && /*#__PURE__*/ jsx(TableColumnMenu, {
88
+ column: column
87
89
  }),
88
90
  /*#__PURE__*/ jsxs(VStack, {
89
91
  gap: 0,
90
92
  align: isRightAligned ? 'end' : void 0,
91
93
  children: [
92
- /*#__PURE__*/ jsxs(HStack, {
94
+ hasCustomSortTrigger || hasCustomColumnMenu ? content : /*#__PURE__*/ jsxs(HStack, {
93
95
  gap: 2,
94
96
  children: [
95
97
  isRightAligned && canSort && /*#__PURE__*/ jsx(TableSortHandler, {
@@ -120,16 +122,13 @@ const TableHeadCell = ({ header, hasTextDescription })=>{
120
122
  })
121
123
  ]
122
124
  }),
123
- !isRightAligned && hasMenu && /*#__PURE__*/ jsx("span", {
124
- className: "shrink-0 ml-auto opacity-0 group-hover:opacity-100 has-[>_[data-state=open]]:opacity-100 transition-opacity",
125
- children: /*#__PURE__*/ jsx(TableHeadCellMenu, {
125
+ !isRightAligned && hasMenu && !hasCustomColumnMenu && /*#__PURE__*/ jsx("span", {
126
+ className: "ml-auto inline-flex",
127
+ children: /*#__PURE__*/ jsx(TableColumnMenu, {
126
128
  column: column
127
129
  })
128
130
  }),
129
- isMasterColumn && hasOverflow && /*#__PURE__*/ jsx(TableScrollHandler, {
130
- atStart: atStart,
131
- atEnd: atEnd
132
- })
131
+ isMasterColumn && hasOverflow && /*#__PURE__*/ jsx(TableScrollHandlerSlot, {})
133
132
  ]
134
133
  }),
135
134
  canResize && /*#__PURE__*/ jsx(TableResizeHandler, {
@@ -5,6 +5,8 @@ interface TableInnerProps extends TestableProps {
5
5
  isEmpty: boolean;
6
6
  virtualized?: TableVirtualized;
7
7
  showSettings: boolean;
8
+ hasConsumerSettingsMenu: boolean;
9
+ hasConsumerScrollHandler: boolean;
8
10
  ariaLabel?: string;
9
11
  className?: string;
10
12
  children?: ReactNode;
@@ -1,22 +1,31 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { TableActionBarAnchor, TableActionBarProvider } from "../TableActionBar/index.js";
3
+ import { TableScrollHandlerProvider } from "../TableScrollHandlerContext.js";
4
+ import { TableSettingsMenuProvider } from "../TableSettingsMenu/index.js";
3
5
  import { TableInnerContainer } from "./TableInnerContainer.js";
4
6
  import { TableInnerWindow } from "./TableInnerWindow.js";
5
- const TableInner = ({ isEmpty, virtualized, showSettings, ariaLabel, className, 'data-testid': testId, children })=>/*#__PURE__*/ jsx(TableActionBarProvider, {
7
+ const TableInner = ({ isEmpty, virtualized, showSettings, hasConsumerSettingsMenu, hasConsumerScrollHandler, ariaLabel, className, 'data-testid': testId, children })=>/*#__PURE__*/ jsx(TableActionBarProvider, {
6
8
  children: /*#__PURE__*/ jsx(TableActionBarAnchor, {
7
9
  className: className,
8
10
  "data-testid": testId,
9
- children: 'window' === virtualized ? /*#__PURE__*/ jsx(TableInnerWindow, {
10
- isEmpty: isEmpty,
11
- showSettings: showSettings,
12
- ariaLabel: ariaLabel,
13
- children: children
14
- }) : /*#__PURE__*/ jsx(TableInnerContainer, {
15
- isEmpty: isEmpty,
16
- virtualized: virtualized,
17
- showSettings: showSettings,
18
- ariaLabel: ariaLabel,
19
- children: children
11
+ children: /*#__PURE__*/ jsx(TableSettingsMenuProvider, {
12
+ children: /*#__PURE__*/ jsx(TableScrollHandlerProvider, {
13
+ hasConsumerScrollHandler: hasConsumerScrollHandler,
14
+ children: 'window' === virtualized ? /*#__PURE__*/ jsx(TableInnerWindow, {
15
+ isEmpty: isEmpty,
16
+ showSettings: showSettings,
17
+ hasConsumerSettingsMenu: hasConsumerSettingsMenu,
18
+ ariaLabel: ariaLabel,
19
+ children: children
20
+ }) : /*#__PURE__*/ jsx(TableInnerContainer, {
21
+ isEmpty: isEmpty,
22
+ virtualized: virtualized,
23
+ showSettings: showSettings,
24
+ hasConsumerSettingsMenu: hasConsumerSettingsMenu,
25
+ ariaLabel: ariaLabel,
26
+ children: children
27
+ })
28
+ })
20
29
  })
21
30
  })
22
31
  });
@@ -3,6 +3,7 @@ interface TableInnerContainerProps {
3
3
  isEmpty: boolean;
4
4
  virtualized?: 'container';
5
5
  showSettings: boolean;
6
+ hasConsumerSettingsMenu: boolean;
6
7
  ariaLabel?: string;
7
8
  children?: ReactNode;
8
9
  }
@@ -10,8 +10,8 @@ import { TableBody } from "../TableBody/index.js";
10
10
  import { TableColGroup } from "../TableColGroup.js";
11
11
  import { useTableContext } from "../TableContext/index.js";
12
12
  import { TableHead } from "../TableHead.js";
13
- import { TableSettingsMenu } from "../TableSettingsMenu/index.js";
14
- const TableInnerContainer = ({ isEmpty, virtualized, showSettings, ariaLabel, children })=>{
13
+ import { TableSettingsMenuSlot } from "../TableSettingsMenu/index.js";
14
+ const TableInnerContainer = ({ isEmpty, virtualized, showSettings, hasConsumerSettingsMenu, ariaLabel, children })=>{
15
15
  const { containerRef, table, virtualizerRef, tbodyRef, onEndReached, onEndReachedThreshold, onStartReached, onStartReachedThreshold, initialScrollToRowId } = useTableContext();
16
16
  const testId = useTestId('container');
17
17
  const scrollRootRef = useRef(null);
@@ -85,7 +85,9 @@ const TableInnerContainer = ({ isEmpty, virtualized, showSettings, ariaLabel, ch
85
85
  /*#__PURE__*/ jsx(ScrollAreaCorner, {})
86
86
  ]
87
87
  }),
88
- showSettings && /*#__PURE__*/ jsx(TableSettingsMenu, {})
88
+ showSettings && /*#__PURE__*/ jsx(TableSettingsMenuSlot, {
89
+ hasConsumerMenu: hasConsumerSettingsMenu
90
+ })
89
91
  ]
90
92
  });
91
93
  };
@@ -2,6 +2,7 @@ import { type FC, type ReactNode } from 'react';
2
2
  interface TableInnerWindowProps {
3
3
  isEmpty: boolean;
4
4
  showSettings: boolean;
5
+ hasConsumerSettingsMenu: boolean;
5
6
  ariaLabel?: string;
6
7
  children?: ReactNode;
7
8
  }
@@ -8,8 +8,8 @@ import { TableBody } from "../TableBody/index.js";
8
8
  import { TableColGroup } from "../TableColGroup.js";
9
9
  import { useTableContext } from "../TableContext/index.js";
10
10
  import { TableHead } from "../TableHead.js";
11
- import { TableSettingsMenu } from "../TableSettingsMenu/index.js";
12
- const TableInnerWindow = ({ isEmpty, showSettings, ariaLabel, children })=>{
11
+ import { TableSettingsMenuSlot } from "../TableSettingsMenu/index.js";
12
+ const TableInnerWindow = ({ isEmpty, showSettings, hasConsumerSettingsMenu, ariaLabel, children })=>{
13
13
  const { table, virtualizerRef, tbodyRef, onEndReached, onEndReachedThreshold, onStartReached, onStartReachedThreshold, initialScrollToRowId } = useTableContext();
14
14
  const testId = useTestId('window');
15
15
  const rootRef = useRef(null);
@@ -93,7 +93,9 @@ const TableInnerWindow = ({ isEmpty, showSettings, ariaLabel, children })=>{
93
93
  })
94
94
  ]
95
95
  }),
96
- showSettings && /*#__PURE__*/ jsx(TableSettingsMenu, {})
96
+ showSettings && /*#__PURE__*/ jsx(TableSettingsMenuSlot, {
97
+ hasConsumerMenu: hasConsumerSettingsMenu
98
+ })
97
99
  ]
98
100
  });
99
101
  };
@@ -1,7 +1,30 @@
1
- import { type FC } from 'react';
2
- interface TableScrollHandlerProps {
3
- atStart: boolean;
4
- atEnd: boolean;
1
+ import { type ButtonHTMLAttributes, type FC, type ReactNode } from 'react';
2
+ type ScrollButtonProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'color' | 'type' | 'children'>;
3
+ export type TableScrollHandlerLeftProps = ScrollButtonProps;
4
+ export type TableScrollHandlerRightProps = ScrollButtonProps;
5
+ /**
6
+ * "Scroll left" control. All native button attributes (`data-analytics-id`,
7
+ * `data-analytics-props`, `aria-*`, `id`, `ref`, any `data-*`) reach the
8
+ * underlying `<button>`. Consumer `onClick` runs first; calling
9
+ * `event.preventDefault()` skips the internal scroll. Must be a child of
10
+ * `<TableScrollHandler>`.
11
+ */
12
+ export declare const TableScrollHandlerLeft: FC<TableScrollHandlerLeftProps>;
13
+ /** "Scroll right" control. Same pass-through contract as `TableScrollHandlerLeft`. */
14
+ export declare const TableScrollHandlerRight: FC<TableScrollHandlerRightProps>;
15
+ export interface TableScrollHandlerProps {
16
+ /**
17
+ * Override the default controls — typically the exported
18
+ * `TableScrollHandlerLeft` / `TableScrollHandlerRight` sub-components carrying
19
+ * per-control analytics attributes. When omitted, both default controls
20
+ * render.
21
+ *
22
+ * Render `<TableScrollHandler>` as a direct child of `<Table>` (like
23
+ * `<TableActionBar>` / `<TableSettingsMenu>`). The DS portals it into the
24
+ * scroll slot in the master column header and shows it only on horizontal
25
+ * overflow — no column selection or manual positioning required.
26
+ */
27
+ children?: ReactNode;
5
28
  }
6
29
  export declare const TableScrollHandler: FC<TableScrollHandlerProps>;
7
30
  export {};
@@ -1,82 +1,113 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
2
- import { useCallback } from "react";
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { createContext, useContext } from "react";
3
+ import { createPortal } from "react-dom";
3
4
  import { ArrowLeft, ArrowRight } from "../../icons/index.js";
4
5
  import { Button } from "../Button/index.js";
5
6
  import { Tooltip, TooltipContent, TooltipTrigger } from "../Tooltip/index.js";
7
+ import { useHorizontalScrollState } from "./hooks/index.js";
6
8
  import { useTableContext } from "./TableContext/index.js";
7
- const TableScrollHandler = ({ atStart, atEnd })=>{
8
- const ctx = useTableContext();
9
- const { allLeafColumns, containerRef } = ctx;
10
- const getScrollPageSize = useCallback(()=>{
9
+ import { useTableScrollHandlerContext } from "./TableScrollHandlerContext.js";
10
+ const TableScrollStateContext = /*#__PURE__*/ createContext(null);
11
+ const useTableScrollStateContext = ()=>{
12
+ const ctx = useContext(TableScrollStateContext);
13
+ if (!ctx) throw new Error('TableScrollHandlerLeft / TableScrollHandlerRight must be rendered inside <TableScrollHandler>');
14
+ return ctx;
15
+ };
16
+ const TableScrollHandlerLeft = ({ onClick, disabled, 'aria-label': ariaLabel, ...rest })=>{
17
+ const { atStart, scrollLeft } = useTableScrollStateContext();
18
+ const isDisabled = disabled ?? atStart;
19
+ const handleClick = (e)=>{
20
+ onClick?.(e);
21
+ if (e.defaultPrevented) return;
22
+ scrollLeft();
23
+ };
24
+ return /*#__PURE__*/ jsxs(Tooltip, {
25
+ disabled: isDisabled,
26
+ children: [
27
+ /*#__PURE__*/ jsx(TooltipTrigger, {
28
+ asChild: true,
29
+ children: /*#__PURE__*/ jsx(Button, {
30
+ ...rest,
31
+ type: "button",
32
+ variant: "ghost",
33
+ color: "neutral",
34
+ size: "small",
35
+ disabled: isDisabled,
36
+ onClick: handleClick,
37
+ "aria-label": ariaLabel ?? 'Scroll left',
38
+ children: /*#__PURE__*/ jsx(ArrowLeft, {})
39
+ })
40
+ }),
41
+ /*#__PURE__*/ jsx(TooltipContent, {
42
+ children: "Scroll left"
43
+ })
44
+ ]
45
+ });
46
+ };
47
+ TableScrollHandlerLeft.displayName = 'TableScrollHandlerLeft';
48
+ const TableScrollHandlerRight = ({ onClick, disabled, 'aria-label': ariaLabel, ...rest })=>{
49
+ const { atEnd, scrollRight } = useTableScrollStateContext();
50
+ const isDisabled = disabled ?? atEnd;
51
+ const handleClick = (e)=>{
52
+ onClick?.(e);
53
+ if (e.defaultPrevented) return;
54
+ scrollRight();
55
+ };
56
+ return /*#__PURE__*/ jsxs(Tooltip, {
57
+ disabled: isDisabled,
58
+ children: [
59
+ /*#__PURE__*/ jsx(TooltipTrigger, {
60
+ asChild: true,
61
+ children: /*#__PURE__*/ jsx(Button, {
62
+ ...rest,
63
+ type: "button",
64
+ variant: "ghost",
65
+ color: "neutral",
66
+ size: "small",
67
+ disabled: isDisabled,
68
+ onClick: handleClick,
69
+ "aria-label": ariaLabel ?? 'Scroll right',
70
+ children: /*#__PURE__*/ jsx(ArrowRight, {})
71
+ })
72
+ }),
73
+ /*#__PURE__*/ jsx(TooltipContent, {
74
+ children: "Scroll right"
75
+ })
76
+ ]
77
+ });
78
+ };
79
+ TableScrollHandlerRight.displayName = 'TableScrollHandlerRight';
80
+ const TableScrollHandler = ({ children })=>{
81
+ const { anchorNode } = useTableScrollHandlerContext();
82
+ const { allLeafColumns, containerRef } = useTableContext();
83
+ const { atStart, atEnd } = useHorizontalScrollState(containerRef, true);
84
+ const getScrollPageSize = ()=>{
11
85
  const pinnedLeftWidth = allLeafColumns.filter((c)=>'left' === c.getIsPinned()).reduce((sum, c)=>sum + c.getSize(), 0);
12
86
  return Math.max((containerRef.current?.clientWidth ?? 0) - pinnedLeftWidth, 0);
13
- }, [
14
- allLeafColumns,
15
- containerRef
16
- ]);
17
- const handleScrollLeft = useCallback(()=>{
18
- containerRef.current?.scrollBy({
87
+ };
88
+ const scrollLeft = ()=>containerRef.current?.scrollBy({
19
89
  left: -getScrollPageSize(),
20
90
  behavior: 'smooth'
21
91
  });
22
- }, [
23
- containerRef,
24
- getScrollPageSize
25
- ]);
26
- const handleScrollRight = useCallback(()=>{
27
- containerRef.current?.scrollBy({
92
+ const scrollRight = ()=>containerRef.current?.scrollBy({
28
93
  left: getScrollPageSize(),
29
94
  behavior: 'smooth'
30
95
  });
31
- }, [
32
- containerRef,
33
- getScrollPageSize
34
- ]);
35
- return /*#__PURE__*/ jsxs("div", {
36
- className: "shrink-0 ml-auto flex items-center gap-4",
37
- children: [
38
- /*#__PURE__*/ jsxs(Tooltip, {
39
- disabled: atStart,
40
- children: [
41
- /*#__PURE__*/ jsx(TooltipTrigger, {
42
- asChild: true,
43
- children: /*#__PURE__*/ jsx(Button, {
44
- variant: "ghost",
45
- color: "neutral",
46
- size: "small",
47
- disabled: atStart,
48
- onClick: handleScrollLeft,
49
- "aria-label": "Scroll left",
50
- children: /*#__PURE__*/ jsx(ArrowLeft, {})
51
- })
52
- }),
53
- /*#__PURE__*/ jsx(TooltipContent, {
54
- children: "Scroll left"
55
- })
56
- ]
57
- }),
58
- /*#__PURE__*/ jsxs(Tooltip, {
59
- disabled: atEnd,
60
- children: [
61
- /*#__PURE__*/ jsx(TooltipTrigger, {
62
- asChild: true,
63
- children: /*#__PURE__*/ jsx(Button, {
64
- variant: "ghost",
65
- color: "neutral",
66
- size: "small",
67
- disabled: atEnd,
68
- onClick: handleScrollRight,
69
- "aria-label": "Scroll right",
70
- children: /*#__PURE__*/ jsx(ArrowRight, {})
71
- })
72
- }),
73
- /*#__PURE__*/ jsx(TooltipContent, {
74
- children: "Scroll right"
75
- })
76
- ]
77
- })
78
- ]
79
- });
96
+ if (!anchorNode) return null;
97
+ return /*#__PURE__*/ createPortal(/*#__PURE__*/ jsx(TableScrollStateContext.Provider, {
98
+ value: {
99
+ atStart,
100
+ atEnd,
101
+ scrollLeft,
102
+ scrollRight
103
+ },
104
+ children: children ?? /*#__PURE__*/ jsxs(Fragment, {
105
+ children: [
106
+ /*#__PURE__*/ jsx(TableScrollHandlerLeft, {}),
107
+ /*#__PURE__*/ jsx(TableScrollHandlerRight, {})
108
+ ]
109
+ })
110
+ }), anchorNode);
80
111
  };
81
112
  TableScrollHandler.displayName = 'TableScrollHandler';
82
- export { TableScrollHandler };
113
+ export { TableScrollHandler, TableScrollHandlerLeft, TableScrollHandlerRight };
@@ -0,0 +1,19 @@
1
+ import { type FC, type ReactNode } from 'react';
2
+ interface TableScrollHandlerContextValue {
3
+ anchorNode: HTMLElement | null;
4
+ setAnchorNode: (node: HTMLElement | null) => void;
5
+ /** Whether the consumer rendered their own <TableScrollHandler> in Table children. */
6
+ hasConsumerScrollHandler: boolean;
7
+ }
8
+ /**
9
+ * Holds the DOM node of the internal scroll-controls anchor slot (in the master
10
+ * column header) so a consumer-rendered `<TableScrollHandler>` (declared in
11
+ * `Table` children) can portal into the correct location. Mirrors
12
+ * `TableSettingsMenuProvider`.
13
+ */
14
+ export declare const TableScrollHandlerProvider: FC<{
15
+ hasConsumerScrollHandler: boolean;
16
+ children: ReactNode;
17
+ }>;
18
+ export declare const useTableScrollHandlerContext: () => TableScrollHandlerContextValue;
19
+ export {};
@@ -0,0 +1,24 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useMemo, useState } from "react";
3
+ const TableScrollHandlerContext = /*#__PURE__*/ createContext({
4
+ anchorNode: null,
5
+ setAnchorNode: ()=>{},
6
+ hasConsumerScrollHandler: false
7
+ });
8
+ const TableScrollHandlerProvider = ({ hasConsumerScrollHandler, children })=>{
9
+ const [anchorNode, setAnchorNode] = useState(null);
10
+ const value = useMemo(()=>({
11
+ anchorNode,
12
+ setAnchorNode,
13
+ hasConsumerScrollHandler
14
+ }), [
15
+ anchorNode,
16
+ hasConsumerScrollHandler
17
+ ]);
18
+ return /*#__PURE__*/ jsx(TableScrollHandlerContext.Provider, {
19
+ value: value,
20
+ children: children
21
+ });
22
+ };
23
+ const useTableScrollHandlerContext = ()=>useContext(TableScrollHandlerContext);
24
+ export { TableScrollHandlerProvider, useTableScrollHandlerContext };
@@ -0,0 +1,8 @@
1
+ import type { FC } from 'react';
2
+ /**
3
+ * Internal anchor for the horizontal scroll controls. Registers its DOM node so
4
+ * a consumer-rendered `<TableScrollHandler>` (declared in `Table` children) can
5
+ * portal into it, and renders the default controls when the consumer did not
6
+ * supply one. Mounted in the master column header, gated by overflow.
7
+ */
8
+ export declare const TableScrollHandlerSlot: FC;
@@ -0,0 +1,18 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../../utils/cn.js";
3
+ import { TableScrollHandler } from "./TableScrollHandler.js";
4
+ import { useTableScrollHandlerContext } from "./TableScrollHandlerContext.js";
5
+ const TableScrollHandlerSlot = ()=>{
6
+ const { setAnchorNode, hasConsumerScrollHandler } = useTableScrollHandlerContext();
7
+ return /*#__PURE__*/ jsxs(Fragment, {
8
+ children: [
9
+ /*#__PURE__*/ jsx("div", {
10
+ ref: setAnchorNode,
11
+ className: cn('shrink-0 ml-auto flex items-center gap-4')
12
+ }),
13
+ !hasConsumerScrollHandler && /*#__PURE__*/ jsx(TableScrollHandler, {})
14
+ ]
15
+ });
16
+ };
17
+ TableScrollHandlerSlot.displayName = 'TableScrollHandlerSlot';
18
+ export { TableScrollHandlerSlot };
@@ -1,2 +1,18 @@
1
- import { type FC } from 'react';
2
- export declare const TableSettingsMenu: FC;
1
+ import { type ButtonHTMLAttributes, type FC, type ReactNode, type Ref } from 'react';
2
+ import { type TestableProps } from '../../../utils/testId';
3
+ export interface TableSettingsMenuProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'color' | 'type'>, TestableProps {
4
+ /**
5
+ * Forwarded to the trigger `<button>` (focus management, measurement,
6
+ * ref-based instrumentation). `ButtonHTMLAttributes` does not carry `ref`, so
7
+ * it is declared explicitly; it flows through `{...rest}` to `<Button>`.
8
+ */
9
+ ref?: Ref<HTMLButtonElement>;
10
+ /**
11
+ * Optional override sub-components — `TableSettingsMenuItem` (addressed by
12
+ * `columnId`), `TableSettingsMenuReset`, `TableSettingsMenuSearch`. Each one
13
+ * supplied replaces only its own slot; every other item renders the DS
14
+ * default. DnD, grouping, and filtering remain DS-owned.
15
+ */
16
+ children?: ReactNode;
17
+ }
18
+ export declare const TableSettingsMenu: FC<TableSettingsMenuProps>;