@amboss/design-system 4.5.0 → 4.6.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 (113) hide show
  1. package/build/cjs/components/BulkActionsToolbar/BulkActionsToolbar.js +1 -1
  2. package/build/cjs/components/DataTable/DataTable.d.ts +18 -8
  3. package/build/cjs/components/DataTable/DataTable.js +1 -1
  4. package/build/cjs/components/DataTable/DataTableToolbar/DataTableToolbar.d.ts +97 -0
  5. package/build/cjs/components/DataTable/DataTableToolbar/DataTableToolbar.js +1 -0
  6. package/build/cjs/components/DataTable/TableCell.js +1 -1
  7. package/build/cjs/components/DataTable/TableColumnGroups.d.ts +15 -0
  8. package/build/cjs/components/DataTable/TableColumnGroups.js +1 -0
  9. package/build/cjs/components/DataTable/header/DataTableHeaderLabel.d.ts +28 -0
  10. package/build/cjs/components/DataTable/header/DataTableHeaderLabel.js +1 -0
  11. package/build/cjs/components/DataTable/header/TableHeader.js +1 -1
  12. package/build/cjs/components/DataTable/index.d.ts +1 -1
  13. package/build/cjs/components/DataTable/internal/buildColumnSegments.d.ts +18 -0
  14. package/build/cjs/components/DataTable/internal/buildColumnSegments.js +1 -0
  15. package/build/cjs/components/DataTable/internal/buildInternalColumns.d.ts +2 -2
  16. package/build/cjs/components/DataTable/internal/buildInternalColumns.js +1 -1
  17. package/build/cjs/components/DataTable/internal/getColumnSticky.js +1 -1
  18. package/build/cjs/components/DataTable/internal/types.d.ts +7 -2
  19. package/build/cjs/components/DataTable/isDataTableColumnGroup.d.ts +2 -0
  20. package/build/cjs/components/DataTable/isDataTableColumnGroup.js +1 -0
  21. package/build/cjs/components/DataTable/types.d.ts +52 -8
  22. package/build/cjs/components/DataTable/useDataTableSort.d.ts +4 -4
  23. package/build/cjs/components/DataTable/useDataTableSort.js +1 -1
  24. package/build/cjs/components/FilterToolbar/FilterToolbar.d.ts +103 -0
  25. package/build/cjs/components/FilterToolbar/FilterToolbar.js +1 -0
  26. package/build/cjs/components/Internal/Panel/Panel.d.ts +22 -1
  27. package/build/cjs/components/Internal/Panel/Panel.js +1 -1
  28. package/build/cjs/components/Internal/ToolbarItemCount/ToolbarItemCount.d.ts +16 -0
  29. package/build/cjs/components/Internal/ToolbarItemCount/ToolbarItemCount.js +1 -0
  30. package/build/cjs/components/Kbd/Kbd.d.ts +118 -0
  31. package/build/cjs/components/Kbd/Kbd.js +1 -0
  32. package/build/cjs/components/KbdGroup/KbdGroup.d.ts +7 -0
  33. package/build/cjs/components/KbdGroup/KbdGroup.js +1 -0
  34. package/build/cjs/components/Layout/-types.d.ts +6 -1
  35. package/build/cjs/components/Layout/Layout.js +1 -1
  36. package/build/cjs/components/Layout/LeftPanel/LeftPanelDocked.js +1 -1
  37. package/build/cjs/components/Layout/RightPanel/RightPanel.js +1 -1
  38. package/build/cjs/components/Layout/registry.d.ts +4 -0
  39. package/build/cjs/components/Layout/registry.js +1 -1
  40. package/build/cjs/components/Layout/usePanelDockedSlide.d.ts +4 -1
  41. package/build/cjs/components/Layout/usePanelDockedSlide.js +1 -1
  42. package/build/cjs/components/RangePopover/RangePopover.d.ts +7 -1
  43. package/build/cjs/components/RangePopover/RangePopover.js +1 -1
  44. package/build/cjs/components/Tooltip/BaseTooltip.js +1 -1
  45. package/build/cjs/components/Tooltip/Tooltip.d.ts +3 -1
  46. package/build/cjs/components/Tooltip/Tooltip.js +1 -1
  47. package/build/cjs/index.d.ts +1 -0
  48. package/build/cjs/index.js +1 -1
  49. package/build/cjs/shared/useIsMacOs.d.ts +1 -0
  50. package/build/cjs/shared/useIsMacOs.js +1 -0
  51. package/build/cjs/web-tokens/_colors.json +26 -0
  52. package/build/cjs/web-tokens/_sizes.json +10 -0
  53. package/build/cjs/web-tokens/visualConfig.d.ts +25 -0
  54. package/build/cjs/web-tokens/visualConfig.js +1 -1
  55. package/build/esm/components/BulkActionsToolbar/BulkActionsToolbar.js +1 -1
  56. package/build/esm/components/DataTable/DataTable.d.ts +18 -8
  57. package/build/esm/components/DataTable/DataTable.js +1 -1
  58. package/build/esm/components/DataTable/DataTableToolbar/DataTableToolbar.d.ts +97 -0
  59. package/build/esm/components/DataTable/DataTableToolbar/DataTableToolbar.js +1 -0
  60. package/build/esm/components/DataTable/TableCell.js +1 -1
  61. package/build/esm/components/DataTable/TableColumnGroups.d.ts +15 -0
  62. package/build/esm/components/DataTable/TableColumnGroups.js +1 -0
  63. package/build/esm/components/DataTable/header/DataTableHeaderLabel.d.ts +28 -0
  64. package/build/esm/components/DataTable/header/DataTableHeaderLabel.js +1 -0
  65. package/build/esm/components/DataTable/header/TableHeader.js +1 -1
  66. package/build/esm/components/DataTable/index.d.ts +1 -1
  67. package/build/esm/components/DataTable/internal/buildColumnSegments.d.ts +18 -0
  68. package/build/esm/components/DataTable/internal/buildColumnSegments.js +1 -0
  69. package/build/esm/components/DataTable/internal/buildInternalColumns.d.ts +2 -2
  70. package/build/esm/components/DataTable/internal/buildInternalColumns.js +1 -1
  71. package/build/esm/components/DataTable/internal/getColumnSticky.js +1 -1
  72. package/build/esm/components/DataTable/internal/types.d.ts +7 -2
  73. package/build/esm/components/DataTable/isDataTableColumnGroup.d.ts +2 -0
  74. package/build/esm/components/DataTable/isDataTableColumnGroup.js +1 -0
  75. package/build/esm/components/DataTable/types.d.ts +52 -8
  76. package/build/esm/components/DataTable/useDataTableSort.d.ts +4 -4
  77. package/build/esm/components/DataTable/useDataTableSort.js +1 -1
  78. package/build/esm/components/FilterToolbar/FilterToolbar.d.ts +103 -0
  79. package/build/esm/components/FilterToolbar/FilterToolbar.js +1 -0
  80. package/build/esm/components/Internal/Panel/Panel.d.ts +22 -1
  81. package/build/esm/components/Internal/Panel/Panel.js +1 -1
  82. package/build/esm/components/Internal/ToolbarItemCount/ToolbarItemCount.d.ts +16 -0
  83. package/build/esm/components/Internal/ToolbarItemCount/ToolbarItemCount.js +1 -0
  84. package/build/esm/components/Kbd/Kbd.d.ts +118 -0
  85. package/build/esm/components/Kbd/Kbd.js +1 -0
  86. package/build/esm/components/KbdGroup/KbdGroup.d.ts +7 -0
  87. package/build/esm/components/KbdGroup/KbdGroup.js +1 -0
  88. package/build/esm/components/Layout/-types.d.ts +6 -1
  89. package/build/esm/components/Layout/Layout.js +1 -1
  90. package/build/esm/components/Layout/LeftPanel/LeftPanelDocked.js +1 -1
  91. package/build/esm/components/Layout/RightPanel/RightPanel.js +1 -1
  92. package/build/esm/components/Layout/registry.d.ts +4 -0
  93. package/build/esm/components/Layout/registry.js +1 -1
  94. package/build/esm/components/Layout/usePanelDockedSlide.d.ts +4 -1
  95. package/build/esm/components/Layout/usePanelDockedSlide.js +1 -1
  96. package/build/esm/components/RangePopover/RangePopover.d.ts +7 -1
  97. package/build/esm/components/RangePopover/RangePopover.js +1 -1
  98. package/build/esm/components/Tooltip/BaseTooltip.js +1 -1
  99. package/build/esm/components/Tooltip/Tooltip.d.ts +3 -1
  100. package/build/esm/components/Tooltip/Tooltip.js +1 -1
  101. package/build/esm/index.d.ts +1 -0
  102. package/build/esm/index.js +1 -1
  103. package/build/esm/shared/useIsMacOs.d.ts +1 -0
  104. package/build/esm/shared/useIsMacOs.js +1 -0
  105. package/build/esm/web-tokens/_colors.json +26 -0
  106. package/build/esm/web-tokens/_sizes.json +10 -0
  107. package/build/esm/web-tokens/visualConfig.d.ts +25 -0
  108. package/build/esm/web-tokens/visualConfig.js +1 -1
  109. package/build/scss/_dark.scss +3 -0
  110. package/build/scss/_light.scss +3 -0
  111. package/build/scss/_variables.scss +4 -0
  112. package/build/scss/subthemes/_inverted.scss +6 -0
  113. package/package.json +1 -1
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"BulkActionsToolbar",{enumerable:!0,get:function(){return BulkActionsToolbar}});const _interop_require_default=require("@swc/helpers/_/_interop_require_default"),_react=/*#__PURE__*/require("@swc/helpers/_/_interop_require_wildcard")._(require("react")),_styled=/*#__PURE__*/_interop_require_default._(require("@emotion/styled")),_breakpointsjson=/*#__PURE__*/_interop_require_default._(require("../../web-tokens/_breakpoints.json")),_Text=require("../Typography/Text/Text"),_Button=require("../Button/Button"),_Inline=require("../Inline/Inline"),_Divider=require("../Divider/Divider"),_Checkbox=require("../Form/Checkbox/Checkbox"),_SearchInput=require("../Form/SearchInput/SearchInput"),_useBulkActionsToolbar=require("./useBulkActionsToolbar"),containerSmallSize=_breakpointsjson.default.s.value,toolbarContainerName="bulkActionsToolbar",containerSmall=`@container ${toolbarContainerName} (min-width: 0px) and (max-width:${containerSmallSize}px)`,containerLarge=`@container ${toolbarContainerName} (min-width: ${containerSmallSize}px)`,StyledBulkActionsToolbarContainer=(0,_styled.default)("div",{target:"e3yi6kp0",label:"StyledBulkActionsToolbarContainer"})({containerType:"inline-size",containerName:toolbarContainerName}),InlineContainer=(0,_styled.default)("div",{target:"e3yi6kp1",label:"InlineContainer"})(({theme})=>({display:"flex",padding:theme.variables.size.spacing.xs,gap:theme.variables.size.spacing.xs,[containerSmall]:{display:"flex",flexDirection:"column"},[containerLarge]:{paddingLeft:theme.variables.size.spacing.m}})),ToolbarInner=(0,_styled.default)("div",{target:"e3yi6kp2",label:"ToolbarInner"})(({theme})=>({display:"flex",alignItems:"center",gap:theme.variables.size.spacing.xs,flexGrow:1,[containerSmall]:{display:"contents"}})),ToolbarControls=(0,_styled.default)("div",{target:"e3yi6kp3",label:"ToolbarControls"})(({theme})=>({display:"flex",alignItems:"center",gap:theme.variables.size.spacing.xs,[containerSmall]:{order:3,justifyContent:"space-between"}})),StyledSearch=(0,_styled.default)("div",{target:"e3yi6kp4",label:"StyledSearch"})({[containerSmall]:{order:1}}),StyledRightSlot=(0,_styled.default)("div",{target:"e3yi6kp5",label:"StyledRightSlot"})(({theme,rightContentNoWrapOnMobile})=>({display:"flex",justifyContent:"flex-end",alignItems:"center",flex:1,gap:theme.variables.size.spacing.xs,[containerSmall]:{order:2,flex:"none",...!rightContentNoWrapOnMobile&&{flexWrap:"wrap"}}})),StyledRightContent=(0,_styled.default)("div",{target:"e3yi6kp6",label:"StyledRightContent"})(({rightContentNoWrapOnMobile})=>({...!rightContentNoWrapOnMobile&&{[containerSmall]:{flexGrow:1}}})),CustomInline=(0,_styled.default)(_Inline.Inline,{target:"e3yi6kp7",label:"CustomInline"})(({theme})=>({[containerSmall]:{gap:theme.variables.size.spacing.xxs},[containerLarge]:{gap:theme.variables.size.spacing.m}})),CheckboxStyled=(0,_styled.default)("label",{target:"e3yi6kp8",label:"CheckboxStyled"})(({theme})=>({display:"block",paddingLeft:theme.variables.size.spacing.xs,[containerLarge]:{paddingRight:theme.variables.size.spacing.xxs}})),TotalItemsStyled=(0,_styled.default)("div",{target:"e3yi6kp9",label:"TotalItemsStyled"})(({theme})=>({[containerSmall]:{padding:theme.variables.size.spacing.xs}})),TotalItems=({children,id})=>_react.default.createElement(TotalItemsStyled,{role:"status","aria-atomic":"true"},_react.default.createElement(_Text.Text,{size:"s",color:"secondary",weight:"bold",id:id},children)),BulkActionsToolbar=_react.default.memo(function({actions,checkboxProps,totalItems,searchInputProps,renderRightContent,rightContentNoWrapOnMobile,hideDivider,"data-e2e-test-id":dataE2eTestId,...ariaAttributes}){let id=(0,_react.useId)(),{toolbarId,toolbarRef,onBlur,onFocus}=(0,_useBulkActionsToolbar.useBulkActionsToolbar)(),hasSelectionControls=!!(checkboxProps||searchInputProps);return _react.default.createElement(StyledBulkActionsToolbarContainer,{"data-e2e-test-id":dataE2eTestId,"data-ds-id":"Toolbar"},_react.default.createElement(InlineContainer,null,_react.default.createElement(ToolbarInner,{role:"toolbar","aria-describedby":hasSelectionControls?void 0:id,"aria-orientation":"horizontal",id:toolbarId,ref:toolbarRef,onBlur:onBlur,onFocus:onFocus,...ariaAttributes},_react.default.createElement(ToolbarControls,null,checkboxProps?_react.default.createElement(CustomInline,{vAlignItems:"center"},_react.default.createElement(CheckboxStyled,null,_react.default.createElement(_Checkbox.CheckboxRaw,{...checkboxProps,size:"s","aria-labelledby":id})),_react.default.createElement(TotalItems,{id:id},totalItems)):_react.default.createElement(TotalItems,{id:id},totalItems),_react.default.createElement(_Inline.Inline,{noWrap:!0},actions?.map(({variant="secondary",label,...buttonProps})=>_react.default.createElement(_Button.Button,{...buttonProps,key:`action-${label}`,size:"s",variant:variant,"aria-describedby":id},label)))),renderRightContent&&_react.default.createElement(StyledRightSlot,{rightContentNoWrapOnMobile:rightContentNoWrapOnMobile},_react.default.createElement(StyledRightContent,{rightContentNoWrapOnMobile:rightContentNoWrapOnMobile},renderRightContent({toolbarId:toolbarId})))),searchInputProps&&_react.default.createElement(StyledSearch,null,_react.default.createElement(_SearchInput.SearchInput,{...searchInputProps,"aria-describedby":id}))),!hideDivider&&_react.default.createElement(_Divider.Divider,null))});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"BulkActionsToolbar",{enumerable:!0,get:function(){return BulkActionsToolbar}});const _interop_require_default=require("@swc/helpers/_/_interop_require_default"),_react=/*#__PURE__*/require("@swc/helpers/_/_interop_require_wildcard")._(require("react")),_styled=/*#__PURE__*/_interop_require_default._(require("@emotion/styled")),_breakpointsjson=/*#__PURE__*/_interop_require_default._(require("../../web-tokens/_breakpoints.json")),_ToolbarItemCount=require("../Internal/ToolbarItemCount/ToolbarItemCount"),_Button=require("../Button/Button"),_Inline=require("../Inline/Inline"),_Divider=require("../Divider/Divider"),_Checkbox=require("../Form/Checkbox/Checkbox"),_SearchInput=require("../Form/SearchInput/SearchInput"),_useBulkActionsToolbar=require("./useBulkActionsToolbar"),containerSmallSize=_breakpointsjson.default.s.value,toolbarContainerName="bulkActionsToolbar",containerSmall=`@container ${toolbarContainerName} (min-width: 0px) and (max-width:${containerSmallSize}px)`,containerLarge=`@container ${toolbarContainerName} (min-width: ${containerSmallSize}px)`,StyledBulkActionsToolbarContainer=(0,_styled.default)("div",{target:"e1072qx30",label:"StyledBulkActionsToolbarContainer"})({containerType:"inline-size",containerName:toolbarContainerName}),InlineContainer=(0,_styled.default)("div",{target:"e1072qx31",label:"InlineContainer"})(({theme})=>({display:"flex",padding:theme.variables.size.spacing.xs,gap:theme.variables.size.spacing.xs,[containerSmall]:{display:"flex",flexDirection:"column"},[containerLarge]:{paddingLeft:theme.variables.size.spacing.m}})),ToolbarInner=(0,_styled.default)("div",{target:"e1072qx32",label:"ToolbarInner"})(({theme})=>({display:"flex",alignItems:"center",gap:theme.variables.size.spacing.xs,flexGrow:1,[containerSmall]:{display:"contents"}})),ToolbarControls=(0,_styled.default)("div",{target:"e1072qx33",label:"ToolbarControls"})(({theme})=>({display:"flex",alignItems:"center",gap:theme.variables.size.spacing.xs,[containerSmall]:{order:3,justifyContent:"space-between"}})),StyledSearch=(0,_styled.default)("div",{target:"e1072qx34",label:"StyledSearch"})({[containerSmall]:{order:1}}),StyledRightSlot=(0,_styled.default)("div",{target:"e1072qx35",label:"StyledRightSlot"})(({theme,rightContentNoWrapOnMobile})=>({display:"flex",justifyContent:"flex-end",alignItems:"center",flex:1,gap:theme.variables.size.spacing.xs,[containerSmall]:{order:2,flex:"none",...!rightContentNoWrapOnMobile&&{flexWrap:"wrap"}}})),StyledRightContent=(0,_styled.default)("div",{target:"e1072qx36",label:"StyledRightContent"})(({rightContentNoWrapOnMobile})=>({...!rightContentNoWrapOnMobile&&{[containerSmall]:{flexGrow:1}}})),CustomInline=(0,_styled.default)(_Inline.Inline,{target:"e1072qx37",label:"CustomInline"})(({theme})=>({[containerSmall]:{gap:theme.variables.size.spacing.xxs},[containerLarge]:{gap:theme.variables.size.spacing.m}})),CheckboxStyled=(0,_styled.default)("label",{target:"e1072qx38",label:"CheckboxStyled"})(({theme})=>({display:"block",paddingLeft:theme.variables.size.spacing.xs,[containerLarge]:{paddingRight:theme.variables.size.spacing.xxs}})),CustomToolbarItemCount=(0,_styled.default)(_ToolbarItemCount.ToolbarItemCount,{target:"e1072qx39",label:"CustomToolbarItemCount"})(({theme})=>({[containerSmall]:{padding:theme.variables.size.spacing.xs}})),BulkActionsToolbar=_react.default.memo(function({actions,checkboxProps,totalItems,searchInputProps,renderRightContent,rightContentNoWrapOnMobile,hideDivider,"data-e2e-test-id":dataE2eTestId,...ariaAttributes}){let id=(0,_react.useId)(),{toolbarId,toolbarRef,onBlur,onFocus}=(0,_useBulkActionsToolbar.useBulkActionsToolbar)(),hasSelectionControls=!!(checkboxProps||searchInputProps);return _react.default.createElement(StyledBulkActionsToolbarContainer,{"data-e2e-test-id":dataE2eTestId,"data-ds-id":"Toolbar"},_react.default.createElement(InlineContainer,null,_react.default.createElement(ToolbarInner,{role:"toolbar","aria-describedby":hasSelectionControls?void 0:id,"aria-orientation":"horizontal",id:toolbarId,ref:toolbarRef,onBlur:onBlur,onFocus:onFocus,...ariaAttributes},_react.default.createElement(ToolbarControls,null,checkboxProps?_react.default.createElement(CustomInline,{vAlignItems:"center"},_react.default.createElement(CheckboxStyled,null,_react.default.createElement(_Checkbox.CheckboxRaw,{...checkboxProps,size:"s","aria-labelledby":id})),_react.default.createElement(CustomToolbarItemCount,{id:id},totalItems)):_react.default.createElement(CustomToolbarItemCount,{id:id},totalItems),_react.default.createElement(_Inline.Inline,{noWrap:!0},actions?.map(({variant="secondary",label,...buttonProps})=>_react.default.createElement(_Button.Button,{...buttonProps,key:`action-${label}`,size:"s",variant:variant,"aria-describedby":id},label)))),renderRightContent&&_react.default.createElement(StyledRightSlot,{rightContentNoWrapOnMobile:rightContentNoWrapOnMobile},_react.default.createElement(StyledRightContent,{rightContentNoWrapOnMobile:rightContentNoWrapOnMobile},renderRightContent({toolbarId:toolbarId})))),searchInputProps&&_react.default.createElement(StyledSearch,null,_react.default.createElement(_SearchInput.SearchInput,{...searchInputProps,"aria-describedby":id}))),!hideDivider&&_react.default.createElement(_Divider.Divider,null))});
@@ -1,6 +1,7 @@
1
1
  import type { ReactElement, ReactNode } from "react";
2
2
  import type { MQ } from "../../types";
3
- import type { DataTableColumn, DataTableRow, DataTableRowProps, DataTableSlotProps } from "./types";
3
+ import type { DataTableColumn, DataTableColumnOrGroup, DataTableRow, DataTableRowProps, DataTableSlotProps } from "./types";
4
+ import { DataTableToolbar } from "./DataTableToolbar/DataTableToolbar";
4
5
  type DataTablePropsBase = {
5
6
  /** Screen reader text for table caption */
6
7
  caption: string;
@@ -15,8 +16,10 @@ type DataTablePropsBase = {
15
16
  /** Footer element */
16
17
  footer?: ReactElement;
17
18
  /**
18
- * Meta data for columns
19
- * @param DataTableColumn[].name - Column name
19
+ * Meta data for columns. An entry with `kind: "group"` and `children` is a
20
+ * group: the children become the columns, and the group renders a shared label
21
+ * above them. A column leaves `kind` out.
22
+ * @param DataTableColumn[].name - Column name, and the key read from each row
20
23
  * @param DataTableColumn[].label - Column label for display
21
24
  * @param DataTableColumn[].align - Align cell content, 'left' | 'right' | 'center'
22
25
  * @param DataTableColumn[].width - Column width
@@ -26,7 +29,7 @@ type DataTablePropsBase = {
26
29
  * @param DataTableColumn[].isSortable - Is table sortable by column
27
30
  * @param DataTableColumn[].sortDirection - Sorted as 'asc' | 'desc'
28
31
  */
29
- columns: DataTableColumn[];
32
+ columns: DataTableColumnOrGroup[];
30
33
  /**
31
34
  * Table content as an array of objects with values for each column
32
35
  * @param DataTableRow[].id - Unique id
@@ -49,11 +52,13 @@ type DataTablePropsBase = {
49
52
  * rendered when `isEmpty` is true. */
50
53
  slotProps?: DataTableSlotProps;
51
54
  /**
52
- * Is first column sticky on horizontal scroll
55
+ * Is first column sticky on horizontal scroll. Ignored when that column
56
+ * belongs to a group, because a group label cannot pin with it.
53
57
  */
54
58
  isFirstColumnSticky?: boolean;
55
59
  /**
56
- * Is first column sticky on horizontal scroll
60
+ * Is last column sticky on horizontal scroll. Ignored when that column
61
+ * belongs to a group, because a group label cannot pin with it.
57
62
  */
58
63
  isLastColumnSticky?: boolean;
59
64
  "data-e2e-test-id"?: string;
@@ -80,8 +85,12 @@ type DataTablePropsBase = {
80
85
  };
81
86
  type DataTableSelectableProps = {
82
87
  /** Renders selectable rows */
83
- isSelectable: true;
84
- /** Accessible name for the header select-all checkbox. Required when `isSelectable` is `true`. */
88
+ isSelectable: boolean;
89
+ /**
90
+ * Accessible name for the header select-all checkbox. Required as soon as
91
+ * `isSelectable` can be `true`, a runtime boolean included. It renders
92
+ * nothing while selection is off.
93
+ */
85
94
  selectAllRowsCheckboxAriaLabel: string;
86
95
  /** Array of selected row ids */
87
96
  selectedRowIds?: DataTableRow["id"][];
@@ -135,5 +144,6 @@ export declare function BaseDataTable({ caption, columns, rows, footer, currentl
135
144
  export declare function DataTable({ children, ...rest }: DataTableProps): ReactElement;
136
145
  export declare namespace DataTable {
137
146
  var sortCompareFn: (a: DataTableRow, b: DataTableRow, columnName: DataTableColumn["name"], desiredSortDirection: DataTableColumn["sortDirection"]) => number;
147
+ var Toolbar: typeof DataTableToolbar;
138
148
  }
139
149
  export {};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var target=exports,all={get BaseDataTable(){return BaseDataTable},get DataTable(){return DataTable}};for(var name in all)Object.defineProperty(target,name,{enumerable:!0,get:Object.getOwnPropertyDescriptor(all,name).get});const _interop_require_default=require("@swc/helpers/_/_interop_require_default"),_interop_require_wildcard=require("@swc/helpers/_/_interop_require_wildcard"),_styled=/*#__PURE__*/_interop_require_default._(require("@emotion/styled")),_react=/*#__PURE__*/_interop_require_wildcard._(require("react")),_mediaQueries=require("../../shared/mediaQueries"),_Container=require("../Container/Container"),_ScreenReaderText=require("../Utilities/ScreenReaderText/ScreenReaderText"),_buildInternalColumns=require("./internal/buildInternalColumns"),_TableHeader=/*#__PURE__*/_interop_require_default._(require("./header/TableHeader")),_TableBody=/*#__PURE__*/_interop_require_default._(require("./TableBody")),_useDataTableScrollContainer=require("./useDataTableScrollContainer"),_useDataTableSort=require("./useDataTableSort");function getTableScrolledToRight(elm){let elmRect=elm.getBoundingClientRect();return elm.scrollLeft+elmRect.width>=elm.scrollWidth}const TableContainer=(0,_styled.default)("div",{target:"ebumpgj0",label:"TableContainer"})(({theme,footer,maxHeight})=>({position:"relative",zIndex:0,overflow:"auto",backgroundColor:theme.values.color.background.primary.default,borderRadius:"inherit",...(0,_mediaQueries.useResponsiveValue)({maxHeight}),...footer&&{borderBottomLeftRadius:0,borderBottomRightRadius:0}})),StyledTable=(0,_styled.default)("table",{target:"ebumpgj1",label:"StyledTable"})(({layout,tableWidth})=>({borderSpacing:0,tableLayout:layout,...(0,_mediaQueries.useResponsiveValue)({width:tableWidth})})),StyledFooter=(0,_styled.default)("div",{target:"ebumpgj2",label:"StyledFooter"})(({theme})=>({padding:theme.variables.size.spacing.xs,backgroundColor:theme.values.color.background.primary.default,borderBottomLeftRadius:"inherit",borderBottomRightRadius:"inherit"}));function BaseDataTable({caption,columns,rows=[],footer,currentlySortedByColumn,isFirstColumnSticky=!0,isLastColumnSticky=!1,"data-e2e-test-id":dataE2eTestId,isLoading=!1,loadingStateScreenReaderText="Loading",isEmpty=!1,slotProps,children,emptyTableContentHeight="15rem",layout="auto",width="100%",bodyCellVerticalPadding="m",emptyCellContent="--",maxHeight,isSelectable,selectedRowIds=[],allRowsSelected,selectAllRowsCheckboxAriaLabel,getRowProps=()=>({}),onRowSelectionChange,onAllRowsSelectionChange,isExpandable,expandedRowIds:expandedRowIdsProp,onRowExpansionChange,expandRowAriaLabel,collapseRowAriaLabel,onSort,...ariaAttributes}){let[isScrolledToRight,setIsScrolledToRight]=(0,_react.useState)(isLastColumnSticky),[isScrolledToLeft,setIsScrolledToLeft]=(0,_react.useState)(isFirstColumnSticky),[uncontrolledExpandedRowIds,setUncontrolledExpandedRowIds]=(0,_react.useState)([]),tableRef=(0,_react.useRef)(null),containerRef=(0,_react.useRef)(null),containerWidth=(0,_useDataTableScrollContainer.useDataTableScrollContainerWidth)(containerRef),isExpandedControlled=void 0!==expandedRowIdsProp,expandedRowIds=isExpandedControlled?expandedRowIdsProp:uncontrolledExpandedRowIds,internalColumns=(0,_buildInternalColumns.buildInternalColumns)({columns,features:{selectable:isSelectable,expandable:isExpandable}}),handleRowExpansionChange=(0,_react.useCallback)(nextExpandedRowIds=>{isExpandedControlled||setUncontrolledExpandedRowIds(nextExpandedRowIds),onRowExpansionChange?.(nextExpandedRowIds)},[isExpandedControlled,onRowExpansionChange]),handleScroll=(0,_react.useCallback)(evt=>{let elm=evt.currentTarget;setIsScrolledToLeft(0===elm.scrollLeft),setIsScrolledToRight(getTableScrolledToRight(elm))},[]);(0,_react.useEffect)(()=>{if("undefined"==typeof ResizeObserver||!containerRef.current)return;let elm=containerRef.current,observer=new ResizeObserver(()=>{setIsScrolledToLeft(0===elm.scrollLeft),setIsScrolledToRight(getTableScrolledToRight(elm))});return observer.observe(elm),()=>observer.disconnect()},[]);let footerElm=footer?_react.default.createElement(StyledFooter,null,footer):null;return _react.default.createElement(_react.default.Fragment,null,_react.default.createElement(TableContainer,{ref:containerRef,footer:footer,maxHeight:maxHeight,onScroll:handleScroll},_react.default.createElement(StyledTable,{"data-e2e-test-id":dataE2eTestId,"data-ds-id":"DataTable",ref:tableRef,layout:layout,tableWidth:width,"aria-busy":isLoading||void 0,...ariaAttributes},_react.default.createElement(_ScreenReaderText.ScreenReaderText,{as:"caption"},caption),_react.default.createElement(_TableHeader.default,{columns:internalColumns,isFirstColumnSticky:isFirstColumnSticky,isLastColumnSticky:isLastColumnSticky,currentlySortedByColumn:currentlySortedByColumn,isTableScrolledToLeft:isScrolledToLeft,isTableScrolledToRight:isScrolledToRight,maxHeight:maxHeight,allRowsSelected:allRowsSelected,selectedRowIds:selectedRowIds,onAllRowsSelectionChange:onAllRowsSelectionChange,selectAllRowsCheckboxAriaLabel:selectAllRowsCheckboxAriaLabel,onSort:onSort}),_react.default.createElement(_TableBody.default,{columns:internalColumns,rows:rows,bodyCellVerticalPadding:bodyCellVerticalPadding,isTableScrolledToLeft:isScrolledToLeft,isTableScrolledToRight:isScrolledToRight,isEmpty:isEmpty,emptyState:slotProps?.emptyState,isLoading:isLoading,loadingStateScreenReaderText:loadingStateScreenReaderText,emptyTableContentHeight:emptyTableContentHeight,containerWidth:containerWidth,footer:footer,isFirstColumnSticky:isFirstColumnSticky,isLastColumnSticky:isLastColumnSticky,emptyCellContent:emptyCellContent,selectedRowIds:selectedRowIds,onRowSelectionChange:onRowSelectionChange,getRowProps:getRowProps,expandedRowIds:expandedRowIds,isTableExpandable:isExpandable,expandRowAriaLabel:expandRowAriaLabel,collapseRowAriaLabel:collapseRowAriaLabel,onRowExpansionChange:handleRowExpansionChange},children))),footerElm)}function DataTable({children,...rest}){return _react.default.createElement(_Container.Container,{elevation:1},_react.default.createElement(BaseDataTable,rest,children))}DataTable.sortCompareFn=_useDataTableSort.defaultSortCompareFn;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var target=exports,all={get BaseDataTable(){return BaseDataTable},get DataTable(){return DataTable}};for(var name in all)Object.defineProperty(target,name,{enumerable:!0,get:Object.getOwnPropertyDescriptor(all,name).get});const _interop_require_default=require("@swc/helpers/_/_interop_require_default"),_interop_require_wildcard=require("@swc/helpers/_/_interop_require_wildcard"),_styled=/*#__PURE__*/_interop_require_default._(require("@emotion/styled")),_react=/*#__PURE__*/_interop_require_wildcard._(require("react")),_mediaQueries=require("../../shared/mediaQueries"),_Container=require("../Container/Container"),_ScreenReaderText=require("../Utilities/ScreenReaderText/ScreenReaderText"),_buildColumnSegments=require("./internal/buildColumnSegments"),_buildInternalColumns=require("./internal/buildInternalColumns"),_TableHeader=/*#__PURE__*/_interop_require_default._(require("./header/TableHeader")),_TableBody=/*#__PURE__*/_interop_require_default._(require("./TableBody")),_TableColumnGroups=/*#__PURE__*/_interop_require_default._(require("./TableColumnGroups")),_useDataTableScrollContainer=require("./useDataTableScrollContainer"),_useDataTableSort=require("./useDataTableSort"),_DataTableToolbar=require("./DataTableToolbar/DataTableToolbar");function getTableScrolledToRight(elm){let elmRect=elm.getBoundingClientRect();return elm.scrollLeft+elmRect.width>=elm.scrollWidth}const TableContainer=(0,_styled.default)("div",{target:"e1eldv6n0",label:"TableContainer"})(({theme,footer,maxHeight})=>({position:"relative",zIndex:0,overflow:"auto",backgroundColor:theme.values.color.background.primary.default,borderRadius:"inherit",...(0,_mediaQueries.useResponsiveValue)({maxHeight}),...footer&&{borderBottomLeftRadius:0,borderBottomRightRadius:0}})),StyledTable=(0,_styled.default)("table",{target:"e1eldv6n1",label:"StyledTable"})(({layout,tableWidth})=>({borderSpacing:0,tableLayout:layout,...(0,_mediaQueries.useResponsiveValue)({width:tableWidth})})),StyledFooter=(0,_styled.default)("div",{target:"e1eldv6n2",label:"StyledFooter"})(({theme})=>({padding:theme.variables.size.spacing.xs,backgroundColor:theme.values.color.background.primary.default,borderBottomLeftRadius:"inherit",borderBottomRightRadius:"inherit"})),NO_SELECTED_ROW_IDS=[];function BaseDataTable({caption,columns,rows=[],footer,currentlySortedByColumn,isFirstColumnSticky=!0,isLastColumnSticky=!1,"data-e2e-test-id":dataE2eTestId,isLoading=!1,loadingStateScreenReaderText="Loading",isEmpty=!1,slotProps,children,emptyTableContentHeight="15rem",layout="auto",width="100%",bodyCellVerticalPadding="m",emptyCellContent="--",maxHeight,isSelectable,selectedRowIds=NO_SELECTED_ROW_IDS,allRowsSelected,selectAllRowsCheckboxAriaLabel,getRowProps=()=>({}),onRowSelectionChange,onAllRowsSelectionChange,isExpandable,expandedRowIds:expandedRowIdsProp,onRowExpansionChange,expandRowAriaLabel,collapseRowAriaLabel,onSort,...ariaAttributes}){let[isScrolledToRight,setIsScrolledToRight]=(0,_react.useState)(isLastColumnSticky),[isScrolledToLeft,setIsScrolledToLeft]=(0,_react.useState)(isFirstColumnSticky),[uncontrolledExpandedRowIds,setUncontrolledExpandedRowIds]=(0,_react.useState)([]),tableRef=(0,_react.useRef)(null),containerRef=(0,_react.useRef)(null),containerWidth=(0,_useDataTableScrollContainer.useDataTableScrollContainerWidth)(containerRef),isExpandedControlled=void 0!==expandedRowIdsProp,expandedRowIds=isExpandedControlled?expandedRowIdsProp:uncontrolledExpandedRowIds,activeSelectedRowIds=isSelectable?selectedRowIds:NO_SELECTED_ROW_IDS,internalColumns=(0,_buildInternalColumns.buildInternalColumns)({columns,features:{selectable:isSelectable,expandable:isExpandable}}),columnSegments=(0,_buildColumnSegments.buildColumnSegments)(internalColumns),hasColumnGroups=columnSegments.some(({group})=>group),handleRowExpansionChange=(0,_react.useCallback)(nextExpandedRowIds=>{isExpandedControlled||setUncontrolledExpandedRowIds(nextExpandedRowIds),onRowExpansionChange?.(nextExpandedRowIds)},[isExpandedControlled,onRowExpansionChange]),handleScroll=(0,_react.useCallback)(evt=>{let elm=evt.currentTarget;setIsScrolledToLeft(0===elm.scrollLeft),setIsScrolledToRight(getTableScrolledToRight(elm))},[]);(0,_react.useEffect)(()=>{if("undefined"==typeof ResizeObserver||!containerRef.current)return;let elm=containerRef.current,observer=new ResizeObserver(()=>{setIsScrolledToLeft(0===elm.scrollLeft),setIsScrolledToRight(getTableScrolledToRight(elm))});return observer.observe(elm),()=>observer.disconnect()},[]);let footerElm=footer?_react.default.createElement(StyledFooter,null,footer):null;return _react.default.createElement(_react.default.Fragment,null,_react.default.createElement(TableContainer,{ref:containerRef,footer:footer,maxHeight:maxHeight,onScroll:handleScroll},_react.default.createElement(StyledTable,{"data-e2e-test-id":dataE2eTestId,"data-ds-id":"DataTable",ref:tableRef,layout:layout,tableWidth:width,"aria-busy":isLoading||void 0,...ariaAttributes},_react.default.createElement(_ScreenReaderText.ScreenReaderText,{as:"caption"},caption),hasColumnGroups&&_react.default.createElement(_TableColumnGroups.default,{segments:columnSegments}),_react.default.createElement(_TableHeader.default,{columns:internalColumns,isFirstColumnSticky:isFirstColumnSticky,isLastColumnSticky:isLastColumnSticky,currentlySortedByColumn:currentlySortedByColumn,isTableScrolledToLeft:isScrolledToLeft,isTableScrolledToRight:isScrolledToRight,maxHeight:maxHeight,allRowsSelected:allRowsSelected,selectedRowIds:activeSelectedRowIds,onAllRowsSelectionChange:onAllRowsSelectionChange,selectAllRowsCheckboxAriaLabel:selectAllRowsCheckboxAriaLabel,onSort:onSort}),_react.default.createElement(_TableBody.default,{columns:internalColumns,rows:rows,bodyCellVerticalPadding:bodyCellVerticalPadding,isTableScrolledToLeft:isScrolledToLeft,isTableScrolledToRight:isScrolledToRight,isEmpty:isEmpty,emptyState:slotProps?.emptyState,isLoading:isLoading,loadingStateScreenReaderText:loadingStateScreenReaderText,emptyTableContentHeight:emptyTableContentHeight,containerWidth:containerWidth,footer:footer,isFirstColumnSticky:isFirstColumnSticky,isLastColumnSticky:isLastColumnSticky,emptyCellContent:emptyCellContent,selectedRowIds:activeSelectedRowIds,onRowSelectionChange:onRowSelectionChange,getRowProps:getRowProps,expandedRowIds:expandedRowIds,isTableExpandable:isExpandable,expandRowAriaLabel:expandRowAriaLabel,collapseRowAriaLabel:collapseRowAriaLabel,onRowExpansionChange:handleRowExpansionChange},children))),footerElm)}function DataTable({children,...rest}){return _react.default.createElement(_Container.Container,{elevation:1},_react.default.createElement(BaseDataTable,rest,children))}DataTable.sortCompareFn=_useDataTableSort.defaultSortCompareFn,DataTable.Toolbar=_DataTableToolbar.DataTableToolbar;
@@ -0,0 +1,97 @@
1
+ import type { ReactElement } from "react";
2
+ import type { ConditionalAccessibleName } from "../../../types/a11y";
3
+ import type { ForbiddenProp } from "../../../types/type-helpers";
4
+ import type { SlotProps } from "../../../shared/slotProps";
5
+ import type { BulkActionsToolbarProps } from "../../BulkActionsToolbar/BulkActionsToolbar";
6
+ import type { FilterToolbarContentProps } from "../../FilterToolbar/FilterToolbar";
7
+ type DataTableToolbarFilterContent = Omit<FilterToolbarContentProps, "totalItems" | "searchInputProps">;
8
+ type NoAccessibleName = {
9
+ "aria-label"?: ForbiddenProp<"Fix: isSelectable={false} renders no toolbar row for aria-label to name. Remove it.">;
10
+ "aria-labelledby"?: ForbiddenProp<"Fix: isSelectable={false} renders no toolbar row for aria-labelledby to name. Remove it.">;
11
+ };
12
+ type DataTableToolbarFilterSlotProps = Required<SlotProps<{
13
+ /** Accessible name of the filter row's control group. */
14
+ filterToolbar: {
15
+ "aria-label": string;
16
+ };
17
+ }>>;
18
+ /**
19
+ * Each row keeps its own accessible name, required only while that row
20
+ * renders: `slotProps.filterToolbar` for the filter row's `role="group"` (an
21
+ * unnamed group is worse than none), and `aria-label`/`aria-labelledby` for
22
+ * the bulk row's `role="toolbar"`. The second arm drops the toolbar name
23
+ * because that row never renders there.
24
+ *
25
+ * The first arm keeps `isSelectable` a plain `boolean` on purpose: a caller
26
+ * deciding selection at runtime can't prove the bulk row is gone, so it still
27
+ * owes a name and still type-checks without branching its JSX.
28
+ */
29
+ type DataTableToolbarFilterSlice = ({
30
+ slotProps: DataTableToolbarFilterSlotProps;
31
+ /**
32
+ * Whether the rows can be selected. When `false`, the bulk-actions row is
33
+ * hidden and the filter row takes over the item count.
34
+ * @default true
35
+ */
36
+ isSelectable?: boolean;
37
+ } & DataTableToolbarFilterContent & ConditionalAccessibleName) | ({
38
+ slotProps: DataTableToolbarFilterSlotProps;
39
+ isSelectable: false;
40
+ } & NoAccessibleName & DataTableToolbarFilterContent) | ({
41
+ slotProps?: never;
42
+ isSelectable?: true;
43
+ segmentedControlProps?: never;
44
+ filters?: never;
45
+ } & ConditionalAccessibleName);
46
+ /**
47
+ * Forwarded to `BulkActionsToolbar`. Each prop keeps that component's own type,
48
+ * so the two cannot drift.
49
+ */
50
+ type DataTableToolbarBulkActionsSlice = {
51
+ /** Bulk action buttons, e.g. "Edit", "Export", "Delete". */
52
+ actions?: BulkActionsToolbarProps["actions"];
53
+ /**
54
+ * Select-all checkbox shown at the start of the bulk row. Omit it when the
55
+ * table renders its own select-all checkbox, to avoid a duplicate control.
56
+ */
57
+ checkboxProps?: BulkActionsToolbarProps["checkboxProps"];
58
+ /**
59
+ * Item count, e.g. `"50 items"`. Shown in the bulk row, or in the filter row
60
+ * when `isSelectable` is `false`. It is the toolbar's single live region.
61
+ */
62
+ totalItems: BulkActionsToolbarProps["totalItems"];
63
+ /** Content rendered at the end of the bulk row. Receives the toolbar's own id. */
64
+ renderRightContent?: BulkActionsToolbarProps["renderRightContent"];
65
+ /** Keeps the right content on one line on narrow viewports. */
66
+ rightContentNoWrapOnMobile?: BulkActionsToolbarProps["rightContentNoWrapOnMobile"];
67
+ /** Hides the divider below the toolbar, whichever row is the last one. */
68
+ hideDivider?: BulkActionsToolbarProps["hideDivider"];
69
+ };
70
+ export type DataTableToolbarProps = DataTableToolbarFilterSlice & DataTableToolbarBulkActionsSlice & {
71
+ /**
72
+ * Search field. It renders in the filter row when that row exists, and in
73
+ * the bulk row otherwise.
74
+ */
75
+ searchInputProps?: FilterToolbarContentProps["searchInputProps"];
76
+ "data-e2e-test-id"?: string;
77
+ };
78
+ /**
79
+ * The controls above a `DataTable`: a `FilterToolbar` (segmented control,
80
+ * filter and column triggers, search) above the existing `BulkActionsToolbar`
81
+ * row.
82
+ *
83
+ * - `isSelectable` (default `true`) decides whether the bulk-actions row
84
+ * renders. The item count sits in that row when it renders, and in the
85
+ * filter row otherwise.
86
+ * - The search field sits in the filter row when that row renders, and in the
87
+ * bulk-actions row otherwise.
88
+ *
89
+ * For a filter row on its own, import `FilterToolbar` directly. It has no
90
+ * dependency on `DataTable`.
91
+ *
92
+ * Render as a sibling of `BaseDataTable` inside a shared
93
+ * `<Container elevation={1}>`, never as a child of `<DataTable>`. `DataTable`
94
+ * renders its `children` inside the `<table>` itself.
95
+ */
96
+ export declare function DataTableToolbar({ slotProps, isSelectable, segmentedControlProps, filters, searchInputProps, actions, checkboxProps, totalItems, renderRightContent, rightContentNoWrapOnMobile, hideDivider, "data-e2e-test-id": dataE2eTestId, ...ariaAttributes }: DataTableToolbarProps): ReactElement;
97
+ export {};
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"DataTableToolbar",{enumerable:!0,get:function(){return DataTableToolbar}});const _interop_require_default=require("@swc/helpers/_/_interop_require_default"),_react=/*#__PURE__*/_interop_require_default._(require("react")),_styled=/*#__PURE__*/_interop_require_default._(require("@emotion/styled")),_Divider=require("../../Divider/Divider"),_BulkActionsToolbar=require("../../BulkActionsToolbar/BulkActionsToolbar"),_FilterToolbar=require("../../FilterToolbar/FilterToolbar"),hasAccessibleName=ariaAttributes=>"aria-label"in ariaAttributes||"aria-labelledby"in ariaAttributes,StyledToolbar=(0,_styled.default)("div",{target:"e116raau0",label:"StyledToolbar"})(({theme,hasFilterRow})=>({borderTopLeftRadius:"inherit",borderTopRightRadius:"inherit",backgroundColor:hasFilterRow?theme.values.color.background.secondary.default:theme.values.color.background.primary.default}));function DataTableToolbar({slotProps,isSelectable=!0,segmentedControlProps,filters,searchInputProps,actions,checkboxProps,totalItems,renderRightContent,rightContentNoWrapOnMobile,hideDivider,"data-e2e-test-id":dataE2eTestId,...ariaAttributes}){let showFilterRow=!!segmentedControlProps||!!filters?.length||!isSelectable;return _react.default.createElement(StyledToolbar,{hasFilterRow:showFilterRow,"data-ds-id":"DataTableToolbar","data-e2e-test-id":dataE2eTestId},showFilterRow&&void 0!==slotProps&&_react.default.createElement(_react.default.Fragment,null,_react.default.createElement(_FilterToolbar.FilterToolbar,{"aria-label":slotProps.filterToolbar["aria-label"],totalItems:isSelectable?void 0:totalItems,segmentedControlProps:segmentedControlProps,filters:filters,searchInputProps:searchInputProps}),(isSelectable||!hideDivider)&&_react.default.createElement(_Divider.Divider,null)),isSelectable&&hasAccessibleName(ariaAttributes)&&_react.default.createElement(_BulkActionsToolbar.BulkActionsToolbar,{actions:actions,checkboxProps:checkboxProps,totalItems:totalItems,searchInputProps:showFilterRow?void 0:searchInputProps,renderRightContent:renderRightContent,rightContentNoWrapOnMobile:rightContentNoWrapOnMobile,hideDivider:hideDivider,...ariaAttributes}))}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"default",{enumerable:!0,get:function(){return _default}});const _styled=/*#__PURE__*/require("@swc/helpers/_/_interop_require_default")._(require("@emotion/styled")),_mediaQueries=require("../../shared/mediaQueries"),_default=(0,_styled.default)("td",{target:"e16jwji60",label:"TableCell"})(({theme,sticky,isTableScrolledToLeft,isTableScrolledToRight,alignColumn,columnWidth,isActive,isSelected})=>({borderBottom:`1px solid ${theme.values.color.divider.primary}`,backgroundColor:theme.values.color.background.primary.default,...isActive&&{backgroundColor:theme.values.color.background.secondary.default},...isSelected&&{backgroundColor:theme.values.color.background.accentSubtle.default},...(0,_mediaQueries.useResponsiveValue)({width:columnWidth,textAlign:alignColumn}),..."left"===sticky&&!isTableScrolledToLeft&&{position:"sticky",left:0,borderRight:`1px solid ${theme.values.color.divider.primary}`,zIndex:1},..."right"===sticky&&!isTableScrolledToRight&&{position:"sticky",right:0,borderLeft:`1px solid ${theme.values.color.divider.primary}`,zIndex:1}}));
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"default",{enumerable:!0,get:function(){return _default}});const _styled=/*#__PURE__*/require("@swc/helpers/_/_interop_require_default")._(require("@emotion/styled")),_mediaQueries=require("../../shared/mediaQueries"),_default=(0,_styled.default)("td",{target:"e1tso8ln0",label:"TableCell"})(({theme,sticky,isTableScrolledToLeft,isTableScrolledToRight,alignColumn,columnWidth,isActive,isSelected})=>({borderBottom:`1px solid ${theme.values.color.divider.primary}`,backgroundColor:theme.values.color.background.primary.default,...isActive&&{backgroundColor:theme.values.color.background.secondary.default},...isSelected&&{backgroundColor:theme.values.color.background.accentSubtle.default},...(0,_mediaQueries.useResponsiveValue)({width:columnWidth,textAlign:alignColumn}),..."left"===sticky&&{borderRight:"1px solid transparent",...!isTableScrolledToLeft&&{position:"sticky",left:0,borderRightColor:theme.values.color.divider.primary,zIndex:1}},..."right"===sticky&&{borderLeft:"1px solid transparent",...!isTableScrolledToRight&&{position:"sticky",right:0,borderLeftColor:theme.values.color.divider.primary,zIndex:1}}}));
@@ -0,0 +1,15 @@
1
+ import React from "react";
2
+ import type { ColumnSegment } from "./internal/buildColumnSegments";
3
+ type TableColumnGroupsProps = {
4
+ segments: ColumnSegment[];
5
+ };
6
+ /**
7
+ * The `<colgroup>` elements that back the header, one per segment.
8
+ *
9
+ * A group header carries `scope="colgroup"`, which names a real column group and
10
+ * nothing else — `colspan` alone does not create one. The `<col>` widths also give
11
+ * a grouped column a width under `layout="fixed"`, where a fixed layout reads the
12
+ * first header row and the grouped column sits in the second.
13
+ */
14
+ declare function TableColumnGroups({ segments, }: TableColumnGroupsProps): React.ReactElement;
15
+ export default TableColumnGroups;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"default",{enumerable:!0,get:function(){return _default}});const _interop_require_default=require("@swc/helpers/_/_interop_require_default"),_react=/*#__PURE__*/_interop_require_default._(require("react")),_styled=/*#__PURE__*/_interop_require_default._(require("@emotion/styled")),_mediaQueries=require("../../shared/mediaQueries"),StyledCol=(0,_styled.default)("col",{target:"e12f45xj0",label:"StyledCol"})(({columnWidth})=>({...(0,_mediaQueries.useResponsiveValue)({width:columnWidth})})),_default=function({segments}){return _react.default.createElement(_react.default.Fragment,null,segments.map(segment=>_react.default.createElement("colgroup",{key:segment.columns[0].column.name},segment.columns.map(({column})=>_react.default.createElement(StyledCol,{key:column.name,columnWidth:column.width})))))};
@@ -0,0 +1,28 @@
1
+ import type { ReactElement } from "react";
2
+ import React from "react";
3
+ import type { SlotProps } from "../../../shared/slotProps";
4
+ import type { DataTableColumn, DataTableColumnDefinition, DataTableColumnGroup } from "../types";
5
+ /**
6
+ * `aria-label` is required inside the slot because the toggletip trigger is an
7
+ * icon-only button, which needs an accessible name (WCAG 2.1 SC 4.1.2).
8
+ */
9
+ type DataTableHeaderLabelSlotProps = SlotProps<{
10
+ toggletip: {
11
+ content: ReactElement;
12
+ "aria-label": string;
13
+ };
14
+ }>;
15
+ /**
16
+ * Builds the slot in one place, so both header call sites pair `content` with
17
+ * its `aria-label` the same way. The project runs without `strictNullChecks`,
18
+ * so nothing here would flag an `aria-label` that arrives undefined.
19
+ */
20
+ export declare const toToggletipSlotProps: (source: DataTableColumnDefinition | DataTableColumnGroup) => DataTableHeaderLabelSlotProps | undefined;
21
+ type DataTableHeaderLabelProps = {
22
+ label: string;
23
+ align: DataTableColumn["align"];
24
+ /** Props forwarded to internal sub-components */
25
+ slotProps?: DataTableHeaderLabelSlotProps;
26
+ };
27
+ export declare function DataTableHeaderLabel({ label, align, slotProps, }: Readonly<DataTableHeaderLabelProps>): React.ReactElement;
28
+ export {};
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var target=exports,all={get DataTableHeaderLabel(){return DataTableHeaderLabel},get toToggletipSlotProps(){return toToggletipSlotProps}};for(var name in all)Object.defineProperty(target,name,{enumerable:!0,get:Object.getOwnPropertyDescriptor(all,name).get});const _react=/*#__PURE__*/require("@swc/helpers/_/_interop_require_default")._(require("react")),_Inline=require("../../Inline/Inline"),_SortableCellContent=require("./SortableCellContent"),_DataTableHeaderToggletip=require("./DataTableHeaderToggletip"),toToggletipSlotProps=source=>source.toggletipContent?{toggletip:{content:source.toggletipContent,"aria-label":source.toggletipAriaLabel}}:void 0;function DataTableHeaderLabel({label,align,slotProps}){return _react.default.createElement(_Inline.Inline,{space:"xs",noWrap:!0,vAlignItems:"center",alignItems:align},_react.default.createElement(_SortableCellContent.StyledLabel,{as:"span",size:"s",alignColumn:align,color:"tertiary",normalizeHeight:!0},label),slotProps?.toggletip&&_react.default.createElement(_DataTableHeaderToggletip.DataTableHeaderToggletip,{content:slotProps.toggletip.content,"aria-label":slotProps.toggletip["aria-label"]}))}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"default",{enumerable:!0,get:function(){return _default}});const _interop_require_default=require("@swc/helpers/_/_interop_require_default"),_react=/*#__PURE__*/_interop_require_default._(require("react")),_styled=/*#__PURE__*/_interop_require_default._(require("@emotion/styled")),_TableCell=/*#__PURE__*/_interop_require_default._(require("../TableCell")),_getColumnSticky=require("../internal/getColumnSticky"),_types=require("../internal/types"),_SortableCellContent=require("./SortableCellContent"),_Inline=require("../../Inline/Inline"),_DataTableHeaderToggletip=require("./DataTableHeaderToggletip"),SORT_DIRECTION_TEXT={asc:"ascending",desc:"descending"},StyledThead=(0,_styled.default)("thead",{target:"eqohg680",label:"StyledThead"})(({maxHeight})=>({...maxHeight&&{position:"sticky",top:0,zIndex:2}})),StyledTh=(0,_styled.default)(_TableCell.default,{target:"eqohg681",label:"StyledTh"})(({theme})=>({padding:`${theme.variables.size.spacing.s} ${theme.variables.size.spacing.m}`,whiteSpace:"nowrap",backgroundColor:theme.values.color.background.primary.default})),_default=_react.default.memo(function({className,columns,isFirstColumnSticky,isLastColumnSticky,currentlySortedByColumn,isTableScrolledToLeft,isTableScrolledToRight,maxHeight,allRowsSelected,selectedRowIds,selectAllRowsCheckboxAriaLabel,onAllRowsSelectionChange,onSort}){let headerContext={onSort,currentlySortedByColumn,allRowsSelected,selectedRowIds,selectAllRowsCheckboxAriaLabel,onAllRowsSelectionChange},columnElements=columns.map((column,columnIndex)=>{let headerElm,sticky=(0,_getColumnSticky.getColumnSticky)({column,columnIndex,columns,isFirstColumnSticky,isLastColumnSticky});if((0,_types.isControlColumn)(column))return _react.default.createElement(StyledTh,{as:"th",alignColumn:"left",columnWidth:column.width,key:column.name,sticky:sticky,isTableScrolledToLeft:isTableScrolledToLeft,isTableScrolledToRight:isTableScrolledToRight,scope:"col"},column.renderHeader(headerContext));let{isSortable,label,align="left",width,name,sortDirection,toggletipContent,toggletipAriaLabel}=column;headerElm=isSortable?_react.default.createElement(_SortableCellContent.SortableCellContent,{onSort:onSort,name:name,label:label,sortDirection:sortDirection,align:align,currentlySortedByColumn:currentlySortedByColumn,toggletipContent:toggletipContent,toggletipAriaLabel:toggletipAriaLabel}):_react.default.createElement(_Inline.Inline,{space:"xs",noWrap:!0,vAlignItems:"center",alignItems:align},_react.default.createElement(_SortableCellContent.StyledLabel,{as:"span",size:"s",alignColumn:align,color:"tertiary",normalizeHeight:!0},label),toggletipContent&&_react.default.createElement(_DataTableHeaderToggletip.DataTableHeaderToggletip,{content:toggletipContent,"aria-label":toggletipAriaLabel}));let ariaSortAttr=currentlySortedByColumn===name&&{"aria-sort":SORT_DIRECTION_TEXT[sortDirection]};return _react.default.createElement(StyledTh,{as:"th",alignColumn:align,columnWidth:width,key:name,sticky:sticky,isTableScrolledToLeft:isTableScrolledToLeft,isTableScrolledToRight:isTableScrolledToRight,scope:"col",...ariaSortAttr},headerElm)});return _react.default.createElement(StyledThead,{className:className,maxHeight:maxHeight},_react.default.createElement("tr",null,columnElements))});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"default",{enumerable:!0,get:function(){return _default}});const _interop_require_default=require("@swc/helpers/_/_interop_require_default"),_react=/*#__PURE__*/_interop_require_default._(require("react")),_styled=/*#__PURE__*/_interop_require_default._(require("@emotion/styled")),_TableCell=/*#__PURE__*/_interop_require_default._(require("../TableCell")),_getColumnSticky=require("../internal/getColumnSticky"),_types=require("../internal/types"),_buildColumnSegments=require("../internal/buildColumnSegments"),_SortableCellContent=require("./SortableCellContent"),_DataTableHeaderLabel=require("./DataTableHeaderLabel"),SORT_DIRECTION_TEXT={asc:"ascending",desc:"descending"},StyledThead=(0,_styled.default)("thead",{target:"elv391v0",label:"StyledThead"})(({maxHeight})=>({...maxHeight&&{position:"sticky",top:0,zIndex:2}})),StyledTh=(0,_styled.default)(_TableCell.default,{target:"elv391v1",label:"StyledTh"})(({theme,hasDivider})=>({padding:`${theme.variables.size.spacing.s} ${theme.variables.size.spacing.m}`,whiteSpace:"nowrap",backgroundColor:theme.values.color.background.primary.default,...hasDivider&&{borderRight:`1px solid ${theme.values.color.divider.primary}`}})),_default=_react.default.memo(function({className,columns,isFirstColumnSticky,isLastColumnSticky,currentlySortedByColumn,isTableScrolledToLeft,isTableScrolledToRight,maxHeight,allRowsSelected,selectedRowIds,selectAllRowsCheckboxAriaLabel,onAllRowsSelectionChange,onSort}){let headerContext={onSort,currentlySortedByColumn,allRowsSelected,selectedRowIds,selectAllRowsCheckboxAriaLabel,onAllRowsSelectionChange},renderColumnCell=({column,columnIndex},rowSpan)=>{let headerElm,isLastColumn=columnIndex===columns.length-1,sticky=(0,_getColumnSticky.getColumnSticky)({column,columnIndex,columns,isFirstColumnSticky,isLastColumnSticky});if((0,_types.isControlColumn)(column))return _react.default.createElement(StyledTh,{as:"th",alignColumn:"left",columnWidth:column.width,key:column.name,rowSpan:rowSpan,sticky:sticky,isTableScrolledToLeft:isTableScrolledToLeft,isTableScrolledToRight:isTableScrolledToRight,hasDivider:!1,scope:"col"},column.renderHeader(headerContext));let{isSortable,label,align="left",width,name,sortDirection,toggletipContent,toggletipAriaLabel}=column;headerElm=isSortable?_react.default.createElement(_SortableCellContent.SortableCellContent,{onSort:onSort,name:name,label:label,sortDirection:sortDirection,align:align,currentlySortedByColumn:currentlySortedByColumn,toggletipContent:toggletipContent,toggletipAriaLabel:toggletipAriaLabel}):_react.default.createElement(_DataTableHeaderLabel.DataTableHeaderLabel,{label:label,align:align,slotProps:(0,_DataTableHeaderLabel.toToggletipSlotProps)(column)});let ariaSortAttr=currentlySortedByColumn===name&&{"aria-sort":SORT_DIRECTION_TEXT[sortDirection]};return _react.default.createElement(StyledTh,{as:"th",alignColumn:align,columnWidth:width,key:name,rowSpan:rowSpan,sticky:sticky,isTableScrolledToLeft:isTableScrolledToLeft,isTableScrolledToRight:isTableScrolledToRight,hasDivider:!isLastColumn,scope:"col",...ariaSortAttr},headerElm)},renderGroupCell=(group,groupColumns)=>{let{name,label,align="center"}=group,isLastColumn=groupColumns[groupColumns.length-1].columnIndex===columns.length-1;return _react.default.createElement(StyledTh,{as:"th",alignColumn:align,key:name,colSpan:groupColumns.length,sticky:!1,isTableScrolledToLeft:isTableScrolledToLeft,isTableScrolledToRight:isTableScrolledToRight,hasDivider:!isLastColumn,scope:"colgroup"},_react.default.createElement(_DataTableHeaderLabel.DataTableHeaderLabel,{label:label,align:align,slotProps:(0,_DataTableHeaderLabel.toToggletipSlotProps)(group)}))},segments=(0,_buildColumnSegments.buildColumnSegments)(columns),hasColumnGroups=segments.some(({group})=>group),ungroupedRowSpan=hasColumnGroups?2:void 0;return _react.default.createElement(StyledThead,{className:className,maxHeight:maxHeight},_react.default.createElement("tr",null,segments.map(segment=>segment.group?renderGroupCell(segment.group,segment.columns):renderColumnCell(segment.columns[0],ungroupedRowSpan))),hasColumnGroups&&_react.default.createElement("tr",null,segments.flatMap(segment=>segment.group?segment.columns.map(indexed=>renderColumnCell(indexed)):[])))});
@@ -1,4 +1,4 @@
1
- export type { DataTableColumn, DataTableRow, DataTableSlotProps, } from "./types";
1
+ export type { DataTableColumn, DataTableColumnGroup, DataTableColumnOrGroup, DataTableRow, DataTableSlotProps, } from "./types";
2
2
  export { DataTable, BaseDataTable } from "./DataTable";
3
3
  export type { DataTableProps } from "./DataTable";
4
4
  export { useDataTableSort } from "./useDataTableSort";
@@ -0,0 +1,18 @@
1
+ import type { DataTableColumnGroup } from "../types";
2
+ import type { InternalColumn } from "./types";
3
+ export type IndexedColumn = {
4
+ column: InternalColumn;
5
+ columnIndex: number;
6
+ };
7
+ export type ColumnSegment = {
8
+ /** Set when the segment's columns share one `DataTableColumnGroup`. */
9
+ group?: DataTableColumnGroup;
10
+ columns: IndexedColumn[];
11
+ };
12
+ /**
13
+ * Splits the flat column list into segments: one segment per group, and a
14
+ * segment of one for every column that has no group. A segment is both a
15
+ * cell of the first header row and a `<colgroup>`, so the two always agree
16
+ * on where a group starts and ends.
17
+ */
18
+ export declare function buildColumnSegments(columns: InternalColumn[]): ColumnSegment[];
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"buildColumnSegments",{enumerable:!0,get:function(){return buildColumnSegments}});const _types=require("./types");function buildColumnSegments(columns){let segments=[];return columns.forEach((column,columnIndex)=>{let group=(0,_types.isDataColumn)(column)?column.group:void 0,currentSegment=segments[segments.length-1];if(group&&currentSegment?.group===group)return void currentSegment.columns.push({column,columnIndex});segments.push({group,columns:[{column,columnIndex}]})}),segments}
@@ -1,10 +1,10 @@
1
- import type { DataTableColumn } from "../types";
1
+ import type { DataTableColumnOrGroup } from "../types";
2
2
  import type { InternalColumn } from "./types";
3
3
  export type DataTableFeatures = {
4
4
  selectable?: boolean;
5
5
  expandable?: boolean;
6
6
  };
7
7
  export declare function buildInternalColumns({ columns, features: { selectable, expandable }, }: {
8
- columns: DataTableColumn[];
8
+ columns: DataTableColumnOrGroup[];
9
9
  features: DataTableFeatures;
10
10
  }): InternalColumn[];
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"buildInternalColumns",{enumerable:!0,get:function(){return buildInternalColumns}});const _checkboxColumn=require("./controlColumns/checkboxColumn"),_expandColumn=require("./controlColumns/expandColumn");function buildInternalColumns({columns,features:{selectable,expandable}}){let dataColumns=columns.map(column=>({...column,kind:"data"})),controlColumns=[];return expandable&&controlColumns.push((0,_expandColumn.createExpandColumn)()),selectable&&controlColumns.push((0,_checkboxColumn.createCheckboxColumn)()),[...controlColumns,...dataColumns]}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"buildInternalColumns",{enumerable:!0,get:function(){return buildInternalColumns}});const _isDataTableColumnGroup=require("../isDataTableColumnGroup"),_checkboxColumn=require("./controlColumns/checkboxColumn"),_expandColumn=require("./controlColumns/expandColumn"),toDataColumns=column=>(0,_isDataTableColumnGroup.isDataTableColumnGroup)(column)?column.children.map(child=>({...child,kind:"data",group:column})):[{...column,kind:"data"}];function buildInternalColumns({columns,features:{selectable,expandable}}){let dataColumns=columns.flatMap(toDataColumns),controlColumns=[];return expandable&&controlColumns.push((0,_expandColumn.createExpandColumn)()),selectable&&controlColumns.push((0,_checkboxColumn.createCheckboxColumn)()),[...controlColumns,...dataColumns]}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"getColumnSticky",{enumerable:!0,get:function(){return getColumnSticky}});const _types=require("./types");function getColumnSticky({column,columnIndex,columns,isFirstColumnSticky,isLastColumnSticky}){if((0,_types.isControlColumn)(column))return!1;let dataColumnIndices=columns.reduce((indices,col,index)=>((0,_types.isDataColumn)(col)&&indices.push(index),indices),[]),firstDataIndex=dataColumnIndices[0],lastDataIndex=dataColumnIndices[dataColumnIndices.length-1];return isFirstColumnSticky&&columnIndex===firstDataIndex?"left":!!isLastColumnSticky&&columnIndex===lastDataIndex&&"right"}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"getColumnSticky",{enumerable:!0,get:function(){return getColumnSticky}});const _types=require("./types");function getColumnSticky({column,columnIndex,columns,isFirstColumnSticky,isLastColumnSticky}){if((0,_types.isControlColumn)(column)||column.group)return!1;let dataColumnIndices=columns.reduce((indices,col,index)=>((0,_types.isDataColumn)(col)&&indices.push(index),indices),[]),firstDataIndex=dataColumnIndices[0],lastDataIndex=dataColumnIndices[dataColumnIndices.length-1];return isFirstColumnSticky&&columnIndex===firstDataIndex?"left":!!isLastColumnSticky&&columnIndex===lastDataIndex&&"right"}
@@ -1,6 +1,6 @@
1
1
  import type { ReactNode } from "react";
2
2
  import type { DataTableProps } from "../DataTable";
3
- import type { DataTableColumn, DataTableRow, DataTableRowProps } from "../types";
3
+ import type { DataTableColumnDefinition, DataTableColumnGroup, DataTableRow, DataTableRowProps } from "../types";
4
4
  export type ControlColumnKind = "checkbox" | "expand";
5
5
  export type HeaderRenderContext = Pick<DataTableProps, "onSort" | "currentlySortedByColumn" | "allRowsSelected" | "selectedRowIds" | "selectAllRowsCheckboxAriaLabel" | "onAllRowsSelectionChange">;
6
6
  export type RowCellRenderContext = {
@@ -14,8 +14,13 @@ export type RowCellRenderContext = {
14
14
  onRowExpansionChange: (expandedRowIds: DataTableRow["id"][]) => void;
15
15
  emptyCellContent: string;
16
16
  };
17
- export type DataColumn = DataTableColumn & {
17
+ export type DataColumn = DataTableColumnDefinition & {
18
18
  kind: "data";
19
+ /**
20
+ * Set when the column came from a `DataTableColumnGroup`. The header collapses
21
+ * neighbours that share this reference into one spanning cell.
22
+ */
23
+ group?: DataTableColumnGroup;
19
24
  };
20
25
  export type ControlColumn = {
21
26
  kind: ControlColumnKind;
@@ -0,0 +1,2 @@
1
+ import type { DataTableColumnGroup, DataTableColumnOrGroup } from "./types";
2
+ export declare function isDataTableColumnGroup(column: DataTableColumnOrGroup): column is DataTableColumnGroup;
@@ -0,0 +1 @@
1
+ "use strict";function isDataTableColumnGroup(column){return"group"===column.kind}Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"isDataTableColumnGroup",{enumerable:!0,get:function(){return isDataTableColumnGroup}});
@@ -7,6 +7,16 @@ export type DataTableRow = {
7
7
  id: string;
8
8
  [key: string]: any;
9
9
  };
10
+ /** A toggletip needs both fields or neither. A column and a group share the pair. */
11
+ type WithToggletip = {
12
+ toggletipContent: ReactElement;
13
+ /** Accessible name for the toggletip trigger button. Required when `toggletipContent` is set. */
14
+ toggletipAriaLabel: string;
15
+ };
16
+ type WithoutToggletip = {
17
+ toggletipContent?: never;
18
+ toggletipAriaLabel?: never;
19
+ };
10
20
  type DataTableColumnBase = {
11
21
  name: string;
12
22
  label: string;
@@ -16,16 +26,50 @@ type DataTableColumnBase = {
16
26
  sortDirection?: "asc" | "desc";
17
27
  renderCell?: (row: DataTableRow) => React.ReactElement;
18
28
  };
19
- type DataTableColumnWithToggletip = DataTableColumnBase & {
20
- toggletipContent: ReactElement;
21
- /** Accessible name for the toggletip trigger button. Required when `toggletipContent` is set. */
22
- toggletipAriaLabel: string;
29
+ /**
30
+ * A column before a discriminant marks it public or internal. The public
31
+ * `DataTableColumn` adds `kind?: "column"`; the internal `DataColumn` adds
32
+ * `kind: "data"`. Each adds its own, so neither has to strip the other's.
33
+ */
34
+ export type DataTableColumnDefinition = (DataTableColumnBase & WithToggletip) | (DataTableColumnBase & WithoutToggletip);
35
+ export type DataTableColumn = DataTableColumnDefinition & {
36
+ /** Leave it out on a column. Only a group sets it, to `"group"`. */
37
+ kind?: "column";
38
+ /** Not on a column — `children` makes a group, and a group is one level deep. */
39
+ children?: never;
23
40
  };
24
- type DataTableColumnWithoutToggletip = DataTableColumnBase & {
25
- toggletipContent?: never;
26
- toggletipAriaLabel?: never;
41
+ type DataTableColumnGroupBase = {
42
+ /**
43
+ * Marks the entry as a group. Required: it also makes TypeScript match the
44
+ * literal against the group alone, so a rejected field is reported where you
45
+ * wrote it instead of blaming `children`.
46
+ */
47
+ kind: "group";
48
+ name: string;
49
+ label: string;
50
+ /** Defaults to `"center"`. It aligns the group label only, not the children. */
51
+ align?: TextAlignment | MQ<TextAlignment>;
52
+ /** The columns under the shared label. One level only — a column cannot itself be a group. */
53
+ children: DataTableColumn[];
54
+ /** Not on a group — a group spans its children and has no width of its own. */
55
+ width?: never;
56
+ /** Not on a group — a group label has no sort control. Sort a child instead. */
57
+ isSortable?: never;
58
+ /** Not on a group — sorting belongs to a child column. */
59
+ sortDirection?: never;
60
+ /** Not on a group — a group renders a label, not a cell of data. */
61
+ renderCell?: never;
27
62
  };
28
- export type DataTableColumn = DataTableColumnWithToggletip | DataTableColumnWithoutToggletip;
63
+ /**
64
+ * A shared label above its `children`, rendered in the first header row.
65
+ *
66
+ * A group labels columns and owns no data, so it rejects `width`,
67
+ * `isSortable`, `sortDirection` and `renderCell`. Passing one is a type error
68
+ * rather than a silent no-op. They stay readable on `DataTableColumnOrGroup`,
69
+ * so reading a column field off the union still needs no narrowing step.
70
+ */
71
+ export type DataTableColumnGroup = (DataTableColumnGroupBase & WithToggletip) | (DataTableColumnGroupBase & WithoutToggletip);
72
+ export type DataTableColumnOrGroup = DataTableColumn | DataTableColumnGroup;
29
73
  export type DataTableRowProps = {
30
74
  verticalAlign?: Property.VerticalAlign;
31
75
  isActive?: boolean;
@@ -1,15 +1,15 @@
1
1
  import type { Dispatch, SetStateAction } from "react";
2
- import type { DataTableColumn, DataTableRow } from "./types";
2
+ import type { DataTableColumn, DataTableColumnOrGroup, DataTableRow } from "./types";
3
3
  import type { DataTableProps } from "./DataTable";
4
4
  type SortCompareFn = (a: DataTableRow, b: DataTableRow, columnName: DataTableColumn["name"], desiredSortDirection: DataTableColumn["sortDirection"]) => number;
5
5
  export declare const defaultSortCompareFn: (a: DataTableRow, b: DataTableRow, columnName: DataTableColumn["name"], desiredSortDirection: DataTableColumn["sortDirection"]) => number;
6
- export declare function useDataTableSort(initialColumns: DataTableColumn[], initialRows: DataTableRow[], initialSortedByColumn?: DataTableColumn["name"], sortCompareFn?: SortCompareFn): {
7
- columns: DataTableColumn[];
6
+ export declare function useDataTableSort(initialColumns: DataTableColumnOrGroup[], initialRows: DataTableRow[], initialSortedByColumn?: DataTableColumn["name"], sortCompareFn?: SortCompareFn): {
7
+ columns: DataTableColumnOrGroup[];
8
8
  rows: DataTableRow[];
9
9
  currentlySortedByColumn: DataTableColumn["name"];
10
10
  handleSort: DataTableProps["onSort"];
11
11
  resetColumns: VoidFunction;
12
- setColumns: Dispatch<SetStateAction<DataTableColumn[]>>;
12
+ setColumns: Dispatch<SetStateAction<DataTableColumnOrGroup[]>>;
13
13
  setRows: Dispatch<SetStateAction<DataTableRow[]>>;
14
14
  setCurrentlySortedByColumn: Dispatch<SetStateAction<DataTableColumn["name"]>>;
15
15
  };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var target=exports,all={get defaultSortCompareFn(){return defaultSortCompareFn},get useDataTableSort(){return useDataTableSort}};for(var name in all)Object.defineProperty(target,name,{enumerable:!0,get:Object.getOwnPropertyDescriptor(all,name).get});const _react=require("react"),defaultSortCompareFn=(a,b,columnName,desiredSortDirection)=>a[columnName]<b[columnName]?"asc"===desiredSortDirection?-1:1:a[columnName]>b[columnName]?"asc"===desiredSortDirection?1:-1:0;function useDataTableSort(initialColumns,initialRows,initialSortedByColumn,sortCompareFn=defaultSortCompareFn){let[columns,setColumns]=(0,_react.useState)(initialColumns),[currentlySortedByColumn,setCurrentlySortedByColumn]=(0,_react.useState)(initialSortedByColumn),[rows,setRows]=(0,_react.useState)(initialRows);return{columns,rows,currentlySortedByColumn,handleSort:(columnName,desiredSortDirection)=>{let newColumns=[...columns],newRows=[...rows],column=newColumns.find(item=>item.name===columnName);column&&(column.sortDirection=desiredSortDirection),newRows.sort((a,b)=>sortCompareFn(a,b,columnName,desiredSortDirection)),setRows(newRows),setColumns(newColumns),setCurrentlySortedByColumn(columnName)},setColumns,resetColumns:()=>{setColumns(initialColumns),setCurrentlySortedByColumn(initialSortedByColumn)},setRows,setCurrentlySortedByColumn}}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var target=exports,all={get defaultSortCompareFn(){return defaultSortCompareFn},get useDataTableSort(){return useDataTableSort}};for(var name in all)Object.defineProperty(target,name,{enumerable:!0,get:Object.getOwnPropertyDescriptor(all,name).get});const _react=require("react"),_isDataTableColumnGroup=require("./isDataTableColumnGroup"),defaultSortCompareFn=(a,b,columnName,desiredSortDirection)=>a[columnName]<b[columnName]?"asc"===desiredSortDirection?-1:1:a[columnName]>b[columnName]?"asc"===desiredSortDirection?1:-1:0,withUpdatedSortDirection=({columns,columnName,desiredSortDirection})=>{let updateColumn=column=>column.name===columnName?{...column,sortDirection:desiredSortDirection}:column;return columns.map(column=>(0,_isDataTableColumnGroup.isDataTableColumnGroup)(column)?{...column,children:column.children.map(updateColumn)}:updateColumn(column))};function useDataTableSort(initialColumns,initialRows,initialSortedByColumn,sortCompareFn=defaultSortCompareFn){let[columns,setColumns]=(0,_react.useState)(initialColumns),[currentlySortedByColumn,setCurrentlySortedByColumn]=(0,_react.useState)(initialSortedByColumn),[rows,setRows]=(0,_react.useState)(initialRows);return{columns,rows,currentlySortedByColumn,handleSort:(columnName,desiredSortDirection)=>{let newColumns=withUpdatedSortDirection({columns,columnName,desiredSortDirection}),newRows=[...rows];newRows.sort((a,b)=>sortCompareFn(a,b,columnName,desiredSortDirection)),setRows(newRows),setColumns(newColumns),setCurrentlySortedByColumn(columnName)},setColumns,resetColumns:()=>{setColumns(initialColumns),setCurrentlySortedByColumn(initialSortedByColumn)},setRows,setCurrentlySortedByColumn}}