@rio-cloud/rio-uikit 2.3.0-beta.3 → 2.3.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 (83) hide show
  1. package/Table.js +10 -9
  2. package/TableNext.js +10 -9
  3. package/TableRowActionsDropdown.d.ts +2 -0
  4. package/TableRowActionsDropdown.js +5 -0
  5. package/TableRowActionsDropdown.js.map +1 -0
  6. package/components/dropdown/ButtonDropdown.d.ts +4 -0
  7. package/components/dropdown/ButtonDropdown.js +82 -80
  8. package/components/dropdown/ButtonDropdown.js.map +1 -1
  9. package/components/map/components/Map.js +199 -180
  10. package/components/map/components/Map.js.map +1 -1
  11. package/components/map/components/MapContext.d.ts +2 -0
  12. package/components/map/components/MapContext.js +6 -4
  13. package/components/map/components/MapContext.js.map +1 -1
  14. package/components/map/components/features/MapZoom.js +19 -19
  15. package/components/map/components/features/MapZoom.js.map +1 -1
  16. package/components/map/utils/mapTypes.d.ts +6 -0
  17. package/components/map/utils/mapTypes.js.map +1 -1
  18. package/components/map/utils/mapUtils.d.ts +2 -0
  19. package/components/map/utils/mapUtils.js +4 -0
  20. package/components/map/utils/mapUtils.js.map +1 -1
  21. package/components/table/Table.d.ts +3 -1
  22. package/components/table/Table.js +225 -205
  23. package/components/table/Table.js.map +1 -1
  24. package/components/table/Table.types.d.ts +49 -0
  25. package/components/table/TableExpandedRow.d.ts +4 -0
  26. package/components/table/TableExpandedRow.js +69 -66
  27. package/components/table/TableExpandedRow.js.map +1 -1
  28. package/components/table/TableGroupRow.d.ts +3 -1
  29. package/components/table/TableGroupRow.js +15 -14
  30. package/components/table/TableGroupRow.js.map +1 -1
  31. package/components/table/TableHeader.d.ts +1 -9
  32. package/components/table/TableHeader.js +83 -67
  33. package/components/table/TableHeader.js.map +1 -1
  34. package/components/table/TableRow.d.ts +7 -1
  35. package/components/table/TableRow.js +75 -72
  36. package/components/table/TableRow.js.map +1 -1
  37. package/components/table/TableRowActionsDropdown.d.ts +11 -0
  38. package/components/table/TableRowActionsDropdown.js +22 -0
  39. package/components/table/TableRowActionsDropdown.js.map +1 -0
  40. package/components/table/TableStickyRowButton.d.ts +25 -0
  41. package/components/table/TableStickyRowButton.js +32 -0
  42. package/components/table/TableStickyRowButton.js.map +1 -0
  43. package/components/table/TableToolbar.d.ts +24 -3
  44. package/components/table/TableToolbar.js +78 -37
  45. package/components/table/TableToolbar.js.map +1 -1
  46. package/components/table/TableViewToggles.js +5 -5
  47. package/components/table/TableViewToggles.js.map +1 -1
  48. package/components/table/context/TableInteractionContext.d.ts +3 -0
  49. package/components/table/context/TableInteractionContext.js.map +1 -1
  50. package/components/table/context/TableRenderContext.d.ts +1 -0
  51. package/components/table/context/TableRenderContext.js.map +1 -1
  52. package/components/table/layout/useMeasuredColumnMaxWidths.js +52 -54
  53. package/components/table/layout/useMeasuredColumnMaxWidths.js.map +1 -1
  54. package/components/table/layout/useTableLayout.d.ts +4 -1
  55. package/components/table/layout/useTableLayout.js +54 -48
  56. package/components/table/layout/useTableLayout.js.map +1 -1
  57. package/components/table/layout/useTableVirtualization.js +51 -56
  58. package/components/table/layout/useTableVirtualization.js.map +1 -1
  59. package/components/table/model/resolveResponsiveViewType.d.ts +2 -0
  60. package/components/table/model/resolveResponsiveViewType.js +27 -0
  61. package/components/table/model/resolveResponsiveViewType.js.map +1 -0
  62. package/components/table/render/header/TableHeaderSelectionCell.d.ts +1 -0
  63. package/components/table/render/header/TableHeaderSelectionCell.js +13 -12
  64. package/components/table/render/header/TableHeaderSelectionCell.js.map +1 -1
  65. package/components/table/runtime/useResponsiveResolvedViewType.d.ts +23 -0
  66. package/components/table/runtime/useResponsiveResolvedViewType.js +22 -0
  67. package/components/table/runtime/useResponsiveResolvedViewType.js.map +1 -0
  68. package/components/table/selection/useInternalTableSelectionState.d.ts +2 -0
  69. package/components/table/selection/useInternalTableSelectionState.js +27 -17
  70. package/components/table/selection/useInternalTableSelectionState.js.map +1 -1
  71. package/components/table/selection/useTableSelection.d.ts +5 -1
  72. package/components/table/selection/useTableSelection.js +37 -26
  73. package/components/table/selection/useTableSelection.js.map +1 -1
  74. package/components/table/shared/parsePixelSize.d.ts +2 -0
  75. package/components/table/shared/parsePixelSize.js +13 -0
  76. package/components/table/shared/parsePixelSize.js.map +1 -0
  77. package/hooks/useResizeObserver.d.ts +25 -6
  78. package/hooks/useResizeObserver.js +20 -18
  79. package/hooks/useResizeObserver.js.map +1 -1
  80. package/package.json +10 -10
  81. package/version.d.ts +1 -1
  82. package/version.js +2 -2
  83. package/version.js.map +1 -1
@@ -1,5 +1,5 @@
1
1
  import { CSSProperties } from 'react';
2
- import { TableCardsStyleSettings, TableColumnDefinition, TableRowData } from '../Table.types';
2
+ import { TableCardsStyleSettings, TableColumnDefinition, TableRowData, TableStickyReference } from '../Table.types';
3
3
  export type TableColumnWithArea<RowType extends TableRowData> = {
4
4
  column: TableColumnDefinition<RowType>;
5
5
  columnIndex: number;
@@ -12,6 +12,7 @@ type UseTableLayoutProps<RowType extends TableRowData> = {
12
12
  hasFooterCells?: boolean;
13
13
  rowSeparatorWidth?: number | string;
14
14
  showSelectionColumn?: boolean;
15
+ stickyReference?: TableStickyReference;
15
16
  style?: CSSProperties;
16
17
  };
17
18
  type InternalTableStyle = CSSProperties & {
@@ -21,6 +22,7 @@ type InternalTableStyle = CSSProperties & {
21
22
  '--table-cards-max'?: string;
22
23
  '--table-column-count'?: string;
23
24
  '--table-row-separator-width'?: string;
25
+ '--table-sticky-reference-top'?: string;
24
26
  '--table-width'?: string;
25
27
  };
26
28
  export declare const useTableLayout: <RowType extends TableRowData>(props: UseTableLayoutProps<RowType>) => {
@@ -32,6 +34,7 @@ export declare const useTableLayout: <RowType extends TableRowData>(props: UseTa
32
34
  tableWrapperRef: import('react').MutableRefObject<HTMLDivElement | null>;
33
35
  tableFooterRowRef: import('react').RefObject<HTMLDivElement>;
34
36
  tableHeadRowRef: import('react').RefObject<HTMLDivElement>;
37
+ wrapperWidth: number | undefined;
35
38
  wrapperStyle: InternalTableStyle;
36
39
  };
37
40
  export {};
@@ -1,66 +1,72 @@
1
- import { useMeasuredColumnMaxWidths as N } from "./useMeasuredColumnMaxWidths.js";
2
- import { MIN_COLUMN_WIDTH_PX as R } from "../tableSizing.constants.js";
3
- import { toCssSize as l, getColumnTrack as L } from "./columnSizing.js";
4
- import { useHorizontalSectionSync as $ } from "./useHorizontalSectionSync.js";
5
- import B from "../../../hooks/useResizeObserver.js";
6
- const h = 50, E = (r) => {
7
- if (!r)
8
- return;
9
- const a = r.trim().match(/^(-?\d+(?:\.\d+)?)px$/);
10
- if (a)
11
- return Number(a[1]);
12
- }, k = (r) => {
13
- const { bodyMaxHeight: a, cardsStyle: d, columns: n, hasFooterCells: p, rowSeparatorWidth: u, showSelectionColumn: i, style: b } = r, [c, , { inlineSize: f }] = B(), e = n.map((t, o) => ({
14
- column: t,
15
- columnIndex: o,
16
- areaName: `table-col-${o + 1}`
17
- })), s = f ?? c.current?.clientWidth, S = (i ? h : 0) + n.reduce((t, o) => {
18
- if (o.width === void 0)
19
- return t + R;
20
- const v = E(l(o.width));
21
- return t + (v ?? 0);
22
- }, 0), m = s !== void 0 && S > s, W = s !== void 0 ? `${s}px` : "100%", {
23
- handleBodyScroll: w,
1
+ import L from "../shared/parsePixelSize.js";
2
+ import { useMeasuredColumnMaxWidths as k } from "./useMeasuredColumnMaxWidths.js";
3
+ import { MIN_COLUMN_WIDTH_PX as N } from "../tableSizing.constants.js";
4
+ import { toCssSize as i, getColumnTrack as B } from "./columnSizing.js";
5
+ import { useHorizontalSectionSync as E } from "./useHorizontalSectionSync.js";
6
+ import $ from "../../../hooks/useResizeObserver.js";
7
+ const d = 50, F = (m) => {
8
+ const {
9
+ bodyMaxHeight: p,
10
+ cardsStyle: s,
11
+ columns: r,
12
+ hasFooterCells: h,
13
+ rowSeparatorWidth: f,
14
+ showSelectionColumn: n,
15
+ stickyReference: b = "applicationLayout",
16
+ style: u
17
+ } = m, [l, , { inlineSize: S }] = $(), t = r.map((e, a) => ({
18
+ column: e,
19
+ columnIndex: a,
20
+ areaName: `table-col-${a + 1}`
21
+ })), o = S ?? l.current?.clientWidth, W = (n ? d : 0) + r.reduce((e, a) => {
22
+ if (a.width === void 0)
23
+ return e + N;
24
+ const _ = L(i(a.width));
25
+ return e + (_ ?? 0);
26
+ }, 0), c = o !== void 0 && W > o, w = o !== void 0 ? `${o}px` : "100%", {
27
+ handleBodyScroll: y,
24
28
  hasHorizontalScrollEndOffset: x,
25
29
  hasHorizontalScrollStartOffset: C,
26
30
  tableFooterRowRef: M,
27
31
  tableHeadRowRef: T
28
- } = $({
29
- enabled: !!a,
30
- hasFooterCells: p
31
- }), g = N({
32
- columns: n,
33
- enabled: m,
34
- tableWrapperRef: c
35
- }), y = e.length > 0 ? [
36
- i ? `${h}px` : void 0,
37
- ...e.map(({ column: t }) => L(t, g[t.key]))
38
- ].filter(Boolean).join(" ") : "minmax(0, 1fr)", z = e.length > 0 ? `"${[
39
- i ? "table-selection" : void 0,
40
- ...e.map(({ areaName: t }) => t)
41
- ].filter(Boolean).join(" ")}"` : "none", H = l(d?.minWidth) ?? "280px", O = l(d?.maxWidth) ?? "1fr", _ = {
42
- ...b ?? {},
43
- "--table-columns": y,
32
+ } = E({
33
+ enabled: !!p,
34
+ hasFooterCells: h
35
+ }), g = k({
36
+ columns: r,
37
+ enabled: c,
38
+ tableWrapperRef: l
39
+ }), v = t.length > 0 ? [
40
+ n ? `${d}px` : void 0,
41
+ ...t.map(({ column: e }) => B(e, g[e.key]))
42
+ ].filter(Boolean).join(" ") : "minmax(0, 1fr)", z = t.length > 0 ? `"${[
43
+ n ? "table-selection" : void 0,
44
+ ...t.map(({ areaName: e }) => e)
45
+ ].filter(Boolean).join(" ")}"` : "none", H = i(s?.minWidth), O = i(s?.maxWidth), R = {
46
+ ...u ?? {},
47
+ "--table-columns": v,
44
48
  "--table-areas": z,
45
49
  "--table-cards-min": H,
46
50
  "--table-cards-max": O,
47
- "--table-column-count": String(n.length + (i ? 1 : 0)),
48
- "--table-row-separator-width": l(u),
49
- "--table-width": W
51
+ "--table-column-count": String(r.length + (n ? 1 : 0)),
52
+ "--table-row-separator-width": i(f),
53
+ "--table-sticky-reference-top": b === "container" ? "0px" : "var(--table-sticky-offset)",
54
+ "--table-width": w
50
55
  };
51
56
  return {
52
- columnsWithAreas: e,
53
- handleBodyScroll: w,
57
+ columnsWithAreas: t,
58
+ handleBodyScroll: y,
54
59
  hasHorizontalScrollEndOffset: x,
55
60
  hasHorizontalScrollStartOffset: C,
56
- tableUseOverflow: m,
57
- tableWrapperRef: c,
61
+ tableUseOverflow: c,
62
+ tableWrapperRef: l,
58
63
  tableFooterRowRef: M,
59
64
  tableHeadRowRef: T,
60
- wrapperStyle: _
65
+ wrapperWidth: o,
66
+ wrapperStyle: R
61
67
  };
62
68
  };
63
69
  export {
64
- k as useTableLayout
70
+ F as useTableLayout
65
71
  };
66
72
  //# sourceMappingURL=useTableLayout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTableLayout.js","sources":["../../../../src/components/table/layout/useTableLayout.ts"],"sourcesContent":["import type { CSSProperties } from 'react';\n\nimport type { TableCardsStyleSettings, TableColumnDefinition, TableRowData } from '../Table.types';\nimport { useMeasuredColumnMaxWidths } from './useMeasuredColumnMaxWidths';\nimport { MIN_COLUMN_WIDTH_PX } from '../tableSizing.constants';\nimport { getColumnTrack, toCssSize } from './columnSizing';\nimport { useHorizontalSectionSync } from './useHorizontalSectionSync';\nimport useResizeObserver from '../../../useResizeObserver';\n\nconst TABLE_SELECTION_COLUMN_WIDTH_PX = 50;\n\nconst parsePixelSize = (value?: string) => {\n if (!value) {\n return;\n }\n\n const match = value.trim().match(/^(-?\\d+(?:\\.\\d+)?)px$/);\n\n if (!match) {\n return;\n }\n\n return Number(match[1]);\n};\n\nexport type TableColumnWithArea<RowType extends TableRowData> = {\n column: TableColumnDefinition<RowType>;\n columnIndex: number;\n areaName: string;\n};\n\ntype UseTableLayoutProps<RowType extends TableRowData> = {\n bodyMaxHeight?: string;\n cardsStyle?: TableCardsStyleSettings;\n columns: TableColumnDefinition<RowType>[];\n hasFooterCells?: boolean;\n rowSeparatorWidth?: number | string;\n showSelectionColumn?: boolean;\n style?: CSSProperties;\n};\n\ntype InternalTableStyle = CSSProperties & {\n '--table-columns'?: string;\n '--table-areas'?: string;\n '--table-cards-min'?: string;\n '--table-cards-max'?: string;\n '--table-column-count'?: string;\n '--table-row-separator-width'?: string;\n '--table-width'?: string;\n};\n\nexport const useTableLayout = <RowType extends TableRowData>(props: UseTableLayoutProps<RowType>) => {\n const { bodyMaxHeight, cardsStyle, columns, hasFooterCells, rowSeparatorWidth, showSelectionColumn, style } = props;\n const [tableWrapperRef, , { inlineSize }] = useResizeObserver<HTMLDivElement>();\n\n const columnsWithAreas: TableColumnWithArea<RowType>[] = columns.map((column, columnIndex) => ({\n column,\n columnIndex,\n areaName: `table-col-${columnIndex + 1}`,\n }));\n\n const wrapperWidth = inlineSize ?? tableWrapperRef.current?.clientWidth;\n\n const minWidthTotal =\n (showSelectionColumn ? TABLE_SELECTION_COLUMN_WIDTH_PX : 0) +\n columns.reduce((totalWidth, column) => {\n if (column.width === undefined) {\n return totalWidth + MIN_COLUMN_WIDTH_PX;\n }\n\n const columnWidth = parsePixelSize(toCssSize(column.width));\n\n return totalWidth + (columnWidth ?? 0);\n }, 0);\n\n const tableUseOverflow = wrapperWidth !== undefined && minWidthTotal > wrapperWidth;\n const tableWidth = wrapperWidth !== undefined ? `${wrapperWidth}px` : '100%';\n\n const {\n handleBodyScroll,\n hasHorizontalScrollEndOffset,\n hasHorizontalScrollStartOffset,\n tableFooterRowRef,\n tableHeadRowRef,\n } = useHorizontalSectionSync({\n enabled: !!bodyMaxHeight,\n hasFooterCells,\n });\n\n const measuredColumnMaxWidths = useMeasuredColumnMaxWidths({\n columns,\n enabled: tableUseOverflow,\n tableWrapperRef,\n });\n\n const gridTemplateColumns =\n columnsWithAreas.length > 0\n ? [\n showSelectionColumn ? `${TABLE_SELECTION_COLUMN_WIDTH_PX}px` : undefined,\n ...columnsWithAreas.map(({ column }) => getColumnTrack(column, measuredColumnMaxWidths[column.key])),\n ]\n .filter(Boolean)\n .join(' ')\n : 'minmax(0, 1fr)';\n\n const gridTemplateAreas =\n columnsWithAreas.length > 0\n ? `\"${[\n showSelectionColumn ? 'table-selection' : undefined,\n ...columnsWithAreas.map(({ areaName }) => areaName),\n ]\n .filter(Boolean)\n .join(' ')}\"`\n : 'none';\n\n const cardsMinWidth = toCssSize(cardsStyle?.minWidth) ?? '280px';\n const cardsMaxWidth = toCssSize(cardsStyle?.maxWidth) ?? '1fr';\n\n const wrapperStyle: InternalTableStyle = {\n ...(style ?? {}),\n '--table-columns': gridTemplateColumns,\n '--table-areas': gridTemplateAreas,\n '--table-cards-min': cardsMinWidth,\n '--table-cards-max': cardsMaxWidth,\n '--table-column-count': String(columns.length + (showSelectionColumn ? 1 : 0)),\n '--table-row-separator-width': toCssSize(rowSeparatorWidth),\n '--table-width': tableWidth,\n };\n\n return {\n columnsWithAreas,\n handleBodyScroll,\n hasHorizontalScrollEndOffset,\n hasHorizontalScrollStartOffset,\n tableUseOverflow,\n tableWrapperRef,\n tableFooterRowRef,\n tableHeadRowRef,\n wrapperStyle,\n };\n};\n"],"names":["TABLE_SELECTION_COLUMN_WIDTH_PX","parsePixelSize","value","match","useTableLayout","props","bodyMaxHeight","cardsStyle","columns","hasFooterCells","rowSeparatorWidth","showSelectionColumn","style","tableWrapperRef","inlineSize","useResizeObserver","columnsWithAreas","column","columnIndex","wrapperWidth","minWidthTotal","totalWidth","MIN_COLUMN_WIDTH_PX","columnWidth","toCssSize","tableUseOverflow","tableWidth","handleBodyScroll","hasHorizontalScrollEndOffset","hasHorizontalScrollStartOffset","tableFooterRowRef","tableHeadRowRef","useHorizontalSectionSync","measuredColumnMaxWidths","useMeasuredColumnMaxWidths","gridTemplateColumns","getColumnTrack","gridTemplateAreas","areaName","cardsMinWidth","cardsMaxWidth","wrapperStyle"],"mappings":";;;;;AASA,MAAMA,IAAkC,IAElCC,IAAiB,CAACC,MAAmB;AACvC,MAAI,CAACA;AACD;AAGJ,QAAMC,IAAQD,EAAM,KAAA,EAAO,MAAM,uBAAuB;AAExD,MAAKC;AAIL,WAAO,OAAOA,EAAM,CAAC,CAAC;AAC1B,GA4BaC,IAAiB,CAA+BC,MAAwC;AACjG,QAAM,EAAE,eAAAC,GAAe,YAAAC,GAAY,SAAAC,GAAS,gBAAAC,GAAgB,mBAAAC,GAAmB,qBAAAC,GAAqB,OAAAC,MAAUP,GACxG,CAACQ,GAAA,EAAmB,EAAE,YAAAC,EAAA,CAAY,IAAIC,EAAA,GAEtCC,IAAmDR,EAAQ,IAAI,CAACS,GAAQC,OAAiB;AAAA,IAC3F,QAAAD;AAAA,IACA,aAAAC;AAAA,IACA,UAAU,aAAaA,IAAc,CAAC;AAAA,EAAA,EACxC,GAEIC,IAAeL,KAAcD,EAAgB,SAAS,aAEtDO,KACDT,IAAsBX,IAAkC,KACzDQ,EAAQ,OAAO,CAACa,GAAYJ,MAAW;AACnC,QAAIA,EAAO,UAAU;AACjB,aAAOI,IAAaC;AAGxB,UAAMC,IAActB,EAAeuB,EAAUP,EAAO,KAAK,CAAC;AAE1D,WAAOI,KAAcE,KAAe;AAAA,EACxC,GAAG,CAAC,GAEFE,IAAmBN,MAAiB,UAAaC,IAAgBD,GACjEO,IAAaP,MAAiB,SAAY,GAAGA,CAAY,OAAO,QAEhE;AAAA,IACF,kBAAAQ;AAAA,IACA,8BAAAC;AAAA,IACA,gCAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,iBAAAC;AAAA,EAAA,IACAC,EAAyB;AAAA,IACzB,SAAS,CAAC,CAAC1B;AAAA,IACX,gBAAAG;AAAA,EAAA,CACH,GAEKwB,IAA0BC,EAA2B;AAAA,IACvD,SAAA1B;AAAA,IACA,SAASiB;AAAA,IACT,iBAAAZ;AAAA,EAAA,CACH,GAEKsB,IACFnB,EAAiB,SAAS,IACpB;AAAA,IACIL,IAAsB,GAAGX,CAA+B,OAAO;AAAA,IAC/D,GAAGgB,EAAiB,IAAI,CAAC,EAAE,QAAAC,EAAA,MAAamB,EAAenB,GAAQgB,EAAwBhB,EAAO,GAAG,CAAC,CAAC;AAAA,EAAA,EAElG,OAAO,OAAO,EACd,KAAK,GAAG,IACb,kBAEJoB,IACFrB,EAAiB,SAAS,IACpB,IAAI;AAAA,IACAL,IAAsB,oBAAoB;AAAA,IAC1C,GAAGK,EAAiB,IAAI,CAAC,EAAE,UAAAsB,EAAA,MAAeA,CAAQ;AAAA,EAAA,EAEjD,OAAO,OAAO,EACd,KAAK,GAAG,CAAC,MACd,QAEJC,IAAgBf,EAAUjB,GAAY,QAAQ,KAAK,SACnDiC,IAAgBhB,EAAUjB,GAAY,QAAQ,KAAK,OAEnDkC,IAAmC;AAAA,IACrC,GAAI7B,KAAS,CAAA;AAAA,IACb,mBAAmBuB;AAAA,IACnB,iBAAiBE;AAAA,IACjB,qBAAqBE;AAAA,IACrB,qBAAqBC;AAAA,IACrB,wBAAwB,OAAOhC,EAAQ,UAAUG,IAAsB,IAAI,EAAE;AAAA,IAC7E,+BAA+Ba,EAAUd,CAAiB;AAAA,IAC1D,iBAAiBgB;AAAA,EAAA;AAGrB,SAAO;AAAA,IACH,kBAAAV;AAAA,IACA,kBAAAW;AAAA,IACA,8BAAAC;AAAA,IACA,gCAAAC;AAAA,IACA,kBAAAJ;AAAA,IACA,iBAAAZ;AAAA,IACA,mBAAAiB;AAAA,IACA,iBAAAC;AAAA,IACA,cAAAU;AAAA,EAAA;AAER;"}
1
+ {"version":3,"file":"useTableLayout.js","sources":["../../../../src/components/table/layout/useTableLayout.ts"],"sourcesContent":["import type { CSSProperties } from 'react';\n\nimport parsePixelSize from '../shared/parsePixelSize';\nimport type {\n TableCardsStyleSettings,\n TableColumnDefinition,\n TableRowData,\n TableStickyReference,\n} from '../Table.types';\nimport { useMeasuredColumnMaxWidths } from './useMeasuredColumnMaxWidths';\nimport { MIN_COLUMN_WIDTH_PX } from '../tableSizing.constants';\nimport { getColumnTrack, toCssSize } from './columnSizing';\nimport { useHorizontalSectionSync } from './useHorizontalSectionSync';\nimport useResizeObserver from '../../../useResizeObserver';\n\nconst TABLE_SELECTION_COLUMN_WIDTH_PX = 50;\n\nexport type TableColumnWithArea<RowType extends TableRowData> = {\n column: TableColumnDefinition<RowType>;\n columnIndex: number;\n areaName: string;\n};\n\ntype UseTableLayoutProps<RowType extends TableRowData> = {\n bodyMaxHeight?: string;\n cardsStyle?: TableCardsStyleSettings;\n columns: TableColumnDefinition<RowType>[];\n hasFooterCells?: boolean;\n rowSeparatorWidth?: number | string;\n showSelectionColumn?: boolean;\n stickyReference?: TableStickyReference;\n style?: CSSProperties;\n};\n\ntype InternalTableStyle = CSSProperties & {\n '--table-columns'?: string;\n '--table-areas'?: string;\n '--table-cards-min'?: string;\n '--table-cards-max'?: string;\n '--table-column-count'?: string;\n '--table-row-separator-width'?: string;\n '--table-sticky-reference-top'?: string;\n '--table-width'?: string;\n};\n\nexport const useTableLayout = <RowType extends TableRowData>(props: UseTableLayoutProps<RowType>) => {\n const {\n bodyMaxHeight,\n cardsStyle,\n columns,\n hasFooterCells,\n rowSeparatorWidth,\n showSelectionColumn,\n stickyReference = 'applicationLayout',\n style,\n } = props;\n const [tableWrapperRef, , { inlineSize }] = useResizeObserver<HTMLDivElement>();\n\n const columnsWithAreas: TableColumnWithArea<RowType>[] = columns.map((column, columnIndex) => ({\n column,\n columnIndex,\n areaName: `table-col-${columnIndex + 1}`,\n }));\n\n const wrapperWidth = inlineSize ?? tableWrapperRef.current?.clientWidth;\n\n const minWidthTotal =\n (showSelectionColumn ? TABLE_SELECTION_COLUMN_WIDTH_PX : 0) +\n columns.reduce((totalWidth, column) => {\n if (column.width === undefined) {\n return totalWidth + MIN_COLUMN_WIDTH_PX;\n }\n\n const columnWidth = parsePixelSize(toCssSize(column.width));\n\n return totalWidth + (columnWidth ?? 0);\n }, 0);\n\n const tableUseOverflow = wrapperWidth !== undefined && minWidthTotal > wrapperWidth;\n const tableWidth = wrapperWidth !== undefined ? `${wrapperWidth}px` : '100%';\n\n const {\n handleBodyScroll,\n hasHorizontalScrollEndOffset,\n hasHorizontalScrollStartOffset,\n tableFooterRowRef,\n tableHeadRowRef,\n } = useHorizontalSectionSync({\n enabled: !!bodyMaxHeight,\n hasFooterCells,\n });\n\n const measuredColumnMaxWidths = useMeasuredColumnMaxWidths({\n columns,\n enabled: tableUseOverflow,\n tableWrapperRef,\n });\n\n const gridTemplateColumns =\n columnsWithAreas.length > 0\n ? [\n showSelectionColumn ? `${TABLE_SELECTION_COLUMN_WIDTH_PX}px` : undefined,\n ...columnsWithAreas.map(({ column }) => getColumnTrack(column, measuredColumnMaxWidths[column.key])),\n ]\n .filter(Boolean)\n .join(' ')\n : 'minmax(0, 1fr)';\n\n const gridTemplateAreas =\n columnsWithAreas.length > 0\n ? `\"${[\n showSelectionColumn ? 'table-selection' : undefined,\n ...columnsWithAreas.map(({ areaName }) => areaName),\n ]\n .filter(Boolean)\n .join(' ')}\"`\n : 'none';\n\n const cardsMinWidth = toCssSize(cardsStyle?.minWidth);\n const cardsMaxWidth = toCssSize(cardsStyle?.maxWidth);\n\n const wrapperStyle: InternalTableStyle = {\n ...(style ?? {}),\n '--table-columns': gridTemplateColumns,\n '--table-areas': gridTemplateAreas,\n '--table-cards-min': cardsMinWidth,\n '--table-cards-max': cardsMaxWidth,\n '--table-column-count': String(columns.length + (showSelectionColumn ? 1 : 0)),\n '--table-row-separator-width': toCssSize(rowSeparatorWidth),\n '--table-sticky-reference-top': stickyReference === 'container' ? '0px' : 'var(--table-sticky-offset)',\n '--table-width': tableWidth,\n };\n\n return {\n columnsWithAreas,\n handleBodyScroll,\n hasHorizontalScrollEndOffset,\n hasHorizontalScrollStartOffset,\n tableUseOverflow,\n tableWrapperRef,\n tableFooterRowRef,\n tableHeadRowRef,\n wrapperWidth,\n wrapperStyle,\n };\n};\n"],"names":["TABLE_SELECTION_COLUMN_WIDTH_PX","useTableLayout","props","bodyMaxHeight","cardsStyle","columns","hasFooterCells","rowSeparatorWidth","showSelectionColumn","stickyReference","style","tableWrapperRef","inlineSize","useResizeObserver","columnsWithAreas","column","columnIndex","wrapperWidth","minWidthTotal","totalWidth","MIN_COLUMN_WIDTH_PX","columnWidth","parsePixelSize","toCssSize","tableUseOverflow","tableWidth","handleBodyScroll","hasHorizontalScrollEndOffset","hasHorizontalScrollStartOffset","tableFooterRowRef","tableHeadRowRef","useHorizontalSectionSync","measuredColumnMaxWidths","useMeasuredColumnMaxWidths","gridTemplateColumns","getColumnTrack","gridTemplateAreas","areaName","cardsMinWidth","cardsMaxWidth","wrapperStyle"],"mappings":";;;;;;AAeA,MAAMA,IAAkC,IA8B3BC,IAAiB,CAA+BC,MAAwC;AACjG,QAAM;AAAA,IACF,eAAAC;AAAA,IACA,YAAAC;AAAA,IACA,SAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,iBAAAC,IAAkB;AAAA,IAClB,OAAAC;AAAA,EAAA,IACAR,GACE,CAACS,GAAA,EAAmB,EAAE,YAAAC,EAAA,CAAY,IAAIC,EAAA,GAEtCC,IAAmDT,EAAQ,IAAI,CAACU,GAAQC,OAAiB;AAAA,IAC3F,QAAAD;AAAA,IACA,aAAAC;AAAA,IACA,UAAU,aAAaA,IAAc,CAAC;AAAA,EAAA,EACxC,GAEIC,IAAeL,KAAcD,EAAgB,SAAS,aAEtDO,KACDV,IAAsBR,IAAkC,KACzDK,EAAQ,OAAO,CAACc,GAAYJ,MAAW;AACnC,QAAIA,EAAO,UAAU;AACjB,aAAOI,IAAaC;AAGxB,UAAMC,IAAcC,EAAeC,EAAUR,EAAO,KAAK,CAAC;AAE1D,WAAOI,KAAcE,KAAe;AAAA,EACxC,GAAG,CAAC,GAEFG,IAAmBP,MAAiB,UAAaC,IAAgBD,GACjEQ,IAAaR,MAAiB,SAAY,GAAGA,CAAY,OAAO,QAEhE;AAAA,IACF,kBAAAS;AAAA,IACA,8BAAAC;AAAA,IACA,gCAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,iBAAAC;AAAA,EAAA,IACAC,EAAyB;AAAA,IACzB,SAAS,CAAC,CAAC5B;AAAA,IACX,gBAAAG;AAAA,EAAA,CACH,GAEK0B,IAA0BC,EAA2B;AAAA,IACvD,SAAA5B;AAAA,IACA,SAASmB;AAAA,IACT,iBAAAb;AAAA,EAAA,CACH,GAEKuB,IACFpB,EAAiB,SAAS,IACpB;AAAA,IACIN,IAAsB,GAAGR,CAA+B,OAAO;AAAA,IAC/D,GAAGc,EAAiB,IAAI,CAAC,EAAE,QAAAC,EAAA,MAAaoB,EAAepB,GAAQiB,EAAwBjB,EAAO,GAAG,CAAC,CAAC;AAAA,EAAA,EAElG,OAAO,OAAO,EACd,KAAK,GAAG,IACb,kBAEJqB,IACFtB,EAAiB,SAAS,IACpB,IAAI;AAAA,IACAN,IAAsB,oBAAoB;AAAA,IAC1C,GAAGM,EAAiB,IAAI,CAAC,EAAE,UAAAuB,EAAA,MAAeA,CAAQ;AAAA,EAAA,EAEjD,OAAO,OAAO,EACd,KAAK,GAAG,CAAC,MACd,QAEJC,IAAgBf,EAAUnB,GAAY,QAAQ,GAC9CmC,IAAgBhB,EAAUnB,GAAY,QAAQ,GAE9CoC,IAAmC;AAAA,IACrC,GAAI9B,KAAS,CAAA;AAAA,IACb,mBAAmBwB;AAAA,IACnB,iBAAiBE;AAAA,IACjB,qBAAqBE;AAAA,IACrB,qBAAqBC;AAAA,IACrB,wBAAwB,OAAOlC,EAAQ,UAAUG,IAAsB,IAAI,EAAE;AAAA,IAC7E,+BAA+Be,EAAUhB,CAAiB;AAAA,IAC1D,gCAAgCE,MAAoB,cAAc,QAAQ;AAAA,IAC1E,iBAAiBgB;AAAA,EAAA;AAGrB,SAAO;AAAA,IACH,kBAAAX;AAAA,IACA,kBAAAY;AAAA,IACA,8BAAAC;AAAA,IACA,gCAAAC;AAAA,IACA,kBAAAJ;AAAA,IACA,iBAAAb;AAAA,IACA,mBAAAkB;AAAA,IACA,iBAAAC;AAAA,IACA,cAAAb;AAAA,IACA,cAAAuB;AAAA,EAAA;AAER;"}
@@ -1,92 +1,87 @@
1
- import { useState as M, useCallback as c, useEffect as T, useMemo as O } from "react";
2
- const V = 50, E = (m, i) => m.start === i.start && m.end === i.end, I = (m) => {
3
- const { enabled: i, overscan: d, rows: r, scrollContainer: v, viewportHeightFallback: w } = m, [l, H] = M({
1
+ import { useState as B, useCallback as a, useEffect as E, useMemo as I } from "react";
2
+ import L from "../../../hooks/useResizeObserver.js";
3
+ const O = 50, x = (d, i) => d.start === i.start && d.end === i.end, P = (d) => {
4
+ const { enabled: i, overscan: u, rows: r, scrollContainer: k, viewportHeightFallback: w } = d, c = k?.view ?? null, [, , { blockSize: f }] = L(c), [l, H] = B({
4
5
  itemHeights: {},
5
6
  scrollTop: 0,
6
7
  viewportHeight: 0,
7
8
  visibleRange: { start: 0, end: 10 }
8
- }), b = c(() => v?.view ?? null, [v]), f = c(() => {
9
+ }), v = a(() => c, [c]), p = a(() => {
9
10
  const e = Object.values(l.itemHeights);
10
- return e.length === 0 ? V : e.reduce((t, n) => t + n, 0) / e.length;
11
- }, [l.itemHeights]), g = c(
12
- (e) => l.itemHeights[e] ?? f(),
13
- [f, l.itemHeights]
14
- ), p = c(
11
+ return e.length === 0 ? O : e.reduce((t, n) => t + n, 0) / e.length;
12
+ }, [l.itemHeights]), h = a(
13
+ (e) => l.itemHeights[e] ?? p(),
14
+ [p, l.itemHeights]
15
+ ), T = a(
15
16
  (e) => {
16
17
  let t = 0;
17
18
  for (let n = 0; n < e; n++)
18
- t += g(n);
19
+ t += h(n);
19
20
  return t;
20
21
  },
21
- [g]
22
- ), x = c(() => {
22
+ [h]
23
+ ), V = a(() => {
23
24
  let e = 0;
24
25
  for (let t = 0; t < r.length; t++)
25
- e += g(t);
26
+ e += h(t);
26
27
  return e;
27
- }, [g, r.length]), h = c(
28
+ }, [h, r.length]), m = a(
28
29
  (e, t) => {
29
30
  if (!i || r.length === 0)
30
31
  return { start: 0, end: r.length };
31
- let n = 0, a = 0;
32
+ let n = 0, g = 0;
32
33
  for (; n < r.length; ) {
33
- const o = g(n);
34
- if (a + o > e - d * o)
34
+ const o = h(n);
35
+ if (g + o > e - u * o)
35
36
  break;
36
- a += o, n++;
37
+ g += o, n++;
37
38
  }
38
39
  let s = n;
39
40
  for (; s < r.length; ) {
40
- const o = g(s);
41
- if (a > e + t + d * o)
41
+ const o = h(s);
42
+ if (g > e + t + u * o)
42
43
  break;
43
- a += o, s++;
44
+ g += o, s++;
44
45
  }
45
46
  return {
46
- start: Math.max(0, n - d),
47
- end: Math.min(r.length, s + d)
47
+ start: Math.max(0, n - u),
48
+ end: Math.min(r.length, s + u)
48
49
  };
49
50
  },
50
- [i, g, d, r.length]
51
- ), u = c(() => {
52
- const e = b();
51
+ [i, h, u, r.length]
52
+ ), b = a(() => {
53
+ const e = v();
53
54
  if (!e)
54
55
  return;
55
- const t = e.clientHeight || w || 0, n = e.scrollTop, a = h(n, t);
56
+ const t = e.clientHeight || f || w || 0, n = e.scrollTop, g = m(n, t);
56
57
  H(
57
- (s) => s.scrollTop === n && s.viewportHeight === t && E(s.visibleRange, a) ? s : {
58
+ (s) => s.scrollTop === n && s.viewportHeight === t && x(s.visibleRange, g) ? s : {
58
59
  ...s,
59
60
  scrollTop: n,
60
61
  viewportHeight: t,
61
- visibleRange: a
62
+ visibleRange: g
62
63
  }
63
64
  );
64
- }, [h, b, w]);
65
- T(() => {
66
- if (!i)
67
- return;
68
- const e = b();
69
- if (!e)
70
- return;
71
- u(), e.addEventListener("scroll", u, { passive: !0 });
72
- const t = new ResizeObserver(u);
73
- return t.observe(e), () => {
74
- e.removeEventListener("scroll", u), t.disconnect();
75
- };
76
- }, [i, b, u]), T(() => {
65
+ }, [m, v, f, w]);
66
+ E(() => {
67
+ if (i && c)
68
+ return b(), c.addEventListener("scroll", b, { passive: !0 }), () => {
69
+ c.removeEventListener("scroll", b);
70
+ };
71
+ }, [i, b, c]), E(() => {
77
72
  i && H((e) => {
78
- const t = h(e.scrollTop, e.viewportHeight);
79
- return E(e.visibleRange, t) ? e : {
73
+ const t = m(e.scrollTop, e.viewportHeight);
74
+ return x(e.visibleRange, t) ? e : {
80
75
  ...e,
81
76
  visibleRange: t
82
77
  };
83
78
  });
84
- }, [h, i, r]);
85
- const k = c(
79
+ }, [m, i, r]);
80
+ const z = a(
86
81
  (e, t) => {
87
82
  if (!t)
88
83
  return;
89
- const n = t.getBoundingClientRect(), a = window.getComputedStyle(t), s = n.height + Number.parseFloat(a.marginTop || "0") + Number.parseFloat(a.marginBottom || "0");
84
+ const n = t.getBoundingClientRect(), g = window.getComputedStyle(t), s = n.height + Number.parseFloat(g.marginTop || "0") + Number.parseFloat(g.marginBottom || "0");
90
85
  s <= 0 || H((o) => {
91
86
  if (o.itemHeights[e] === s)
92
87
  return o;
@@ -99,27 +94,27 @@ const V = 50, E = (m, i) => m.start === i.start && m.end === i.end, I = (m) => {
99
94
  };
100
95
  return {
101
96
  ...R,
102
- visibleRange: h(R.scrollTop, R.viewportHeight)
97
+ visibleRange: m(R.scrollTop, R.viewportHeight)
103
98
  };
104
99
  });
105
100
  },
106
- [h]
107
- ), z = O(
101
+ [m]
102
+ ), C = I(
108
103
  () => i ? r.slice(l.visibleRange.start, l.visibleRange.end).map((e, t) => ({
109
104
  index: l.visibleRange.start + t,
110
105
  row: e
111
106
  })) : [],
112
107
  [i, r, l.visibleRange.end, l.visibleRange.start]
113
- ), C = i ? p(l.visibleRange.start) : 0, F = i ? Math.max(0, x() - p(l.visibleRange.end)) : 0;
108
+ ), F = i ? T(l.visibleRange.start) : 0, M = i ? Math.max(0, V() - T(l.visibleRange.end)) : 0;
114
109
  return {
115
110
  isVirtualized: i,
116
- measureRow: k,
117
- paddingBottom: F,
118
- paddingTop: C,
119
- virtualRows: z
111
+ measureRow: z,
112
+ paddingBottom: M,
113
+ paddingTop: F,
114
+ virtualRows: C
120
115
  };
121
116
  };
122
117
  export {
123
- I as default
118
+ P as default
124
119
  };
125
120
  //# sourceMappingURL=useTableVirtualization.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTableVirtualization.js","sources":["../../../../src/components/table/layout/useTableVirtualization.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\n\ntype TableVirtualScrollContainer = {\n view?: HTMLDivElement | null;\n};\n\ntype TableVirtualRow<RowType> = {\n index: number;\n row: RowType;\n};\n\ntype UseTableVirtualizationOptions<RowType> = {\n enabled: boolean;\n overscan: number;\n rows: RowType[];\n scrollContainer: TableVirtualScrollContainer | null;\n viewportHeightFallback?: number;\n};\n\ntype TableVirtualizationState = {\n itemHeights: Record<number, number>;\n scrollTop: number;\n viewportHeight: number;\n visibleRange: {\n start: number;\n end: number;\n };\n};\n\nconst DEFAULT_ROW_HEIGHT = 50;\n\nconst areVisibleRangesEqual = (\n currentRange: TableVirtualizationState['visibleRange'],\n nextRange: TableVirtualizationState['visibleRange']\n) => currentRange.start === nextRange.start && currentRange.end === nextRange.end;\n\nconst useTableVirtualization = <RowType>(options: UseTableVirtualizationOptions<RowType>) => {\n const { enabled, overscan, rows, scrollContainer, viewportHeightFallback } = options;\n const [state, setState] = useState<TableVirtualizationState>({\n itemHeights: {},\n scrollTop: 0,\n viewportHeight: 0,\n visibleRange: { start: 0, end: 10 },\n });\n\n const getScrollElement = useCallback(() => scrollContainer?.view ?? null, [scrollContainer]);\n\n const getEstimatedRowHeight = useCallback(() => {\n const measuredHeights = Object.values(state.itemHeights);\n\n if (measuredHeights.length === 0) {\n return DEFAULT_ROW_HEIGHT;\n }\n\n return measuredHeights.reduce((sum, height) => sum + height, 0) / measuredHeights.length;\n }, [state.itemHeights]);\n\n const getRowHeight = useCallback(\n (index: number) => state.itemHeights[index] ?? getEstimatedRowHeight(),\n [getEstimatedRowHeight, state.itemHeights]\n );\n\n const getItemPosition = useCallback(\n (index: number) => {\n let position = 0;\n\n for (let currentIndex = 0; currentIndex < index; currentIndex++) {\n position += getRowHeight(currentIndex);\n }\n\n return position;\n },\n [getRowHeight]\n );\n\n const getTotalHeight = useCallback(() => {\n let totalHeight = 0;\n\n for (let index = 0; index < rows.length; index++) {\n totalHeight += getRowHeight(index);\n }\n\n return totalHeight;\n }, [getRowHeight, rows.length]);\n\n const calculateVisibleRange = useCallback(\n (scrollTop: number, viewportHeight: number) => {\n if (!enabled || rows.length === 0) {\n return { start: 0, end: rows.length };\n }\n\n let start = 0;\n let currentPosition = 0;\n\n while (start < rows.length) {\n const rowHeight = getRowHeight(start);\n\n if (currentPosition + rowHeight > scrollTop - overscan * rowHeight) {\n break;\n }\n\n currentPosition += rowHeight;\n start++;\n }\n\n let end = start;\n\n while (end < rows.length) {\n const rowHeight = getRowHeight(end);\n\n if (currentPosition > scrollTop + viewportHeight + overscan * rowHeight) {\n break;\n }\n\n currentPosition += rowHeight;\n end++;\n }\n\n return {\n start: Math.max(0, start - overscan),\n end: Math.min(rows.length, end + overscan),\n };\n },\n [enabled, getRowHeight, overscan, rows.length]\n );\n\n const handleScroll = useCallback(() => {\n const scrollElement = getScrollElement();\n\n if (!scrollElement) {\n return;\n }\n\n const viewportHeight = scrollElement.clientHeight || viewportHeightFallback || 0;\n const scrollTop = scrollElement.scrollTop;\n const visibleRange = calculateVisibleRange(scrollTop, viewportHeight);\n\n setState(previousState =>\n previousState.scrollTop === scrollTop &&\n previousState.viewportHeight === viewportHeight &&\n areVisibleRangesEqual(previousState.visibleRange, visibleRange)\n ? previousState\n : {\n ...previousState,\n scrollTop,\n viewportHeight,\n visibleRange,\n }\n );\n }, [calculateVisibleRange, getScrollElement, viewportHeightFallback]);\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n const scrollElement = getScrollElement();\n\n if (!scrollElement) {\n return;\n }\n\n handleScroll();\n scrollElement.addEventListener('scroll', handleScroll, { passive: true });\n\n const resizeObserver = new ResizeObserver(handleScroll);\n resizeObserver.observe(scrollElement);\n\n return () => {\n scrollElement.removeEventListener('scroll', handleScroll);\n resizeObserver.disconnect();\n };\n }, [enabled, getScrollElement, handleScroll]);\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n setState(previousState => {\n const visibleRange = calculateVisibleRange(previousState.scrollTop, previousState.viewportHeight);\n\n return areVisibleRangesEqual(previousState.visibleRange, visibleRange)\n ? previousState\n : {\n ...previousState,\n visibleRange,\n };\n });\n }, [calculateVisibleRange, enabled, rows]);\n\n const measureRow = useCallback(\n (index: number, element: HTMLElement | null) => {\n if (!element) {\n return;\n }\n\n const rect = element.getBoundingClientRect();\n const computedStyle = window.getComputedStyle(element);\n const height =\n rect.height +\n Number.parseFloat(computedStyle.marginTop || '0') +\n Number.parseFloat(computedStyle.marginBottom || '0');\n\n if (height <= 0) {\n return;\n }\n\n setState(previousState => {\n if (previousState.itemHeights[index] === height) {\n return previousState;\n }\n\n const nextState = {\n ...previousState,\n itemHeights: {\n ...previousState.itemHeights,\n [index]: height,\n },\n };\n\n return {\n ...nextState,\n visibleRange: calculateVisibleRange(nextState.scrollTop, nextState.viewportHeight),\n };\n });\n },\n [calculateVisibleRange]\n );\n\n const virtualRows = useMemo<TableVirtualRow<RowType>[]>(\n () =>\n enabled\n ? rows.slice(state.visibleRange.start, state.visibleRange.end).map((row, offset) => {\n const index = state.visibleRange.start + offset;\n\n return {\n index,\n row,\n };\n })\n : [],\n [enabled, rows, state.visibleRange.end, state.visibleRange.start]\n );\n\n const paddingTop = enabled ? getItemPosition(state.visibleRange.start) : 0;\n const paddingBottom = enabled ? Math.max(0, getTotalHeight() - getItemPosition(state.visibleRange.end)) : 0;\n\n return {\n isVirtualized: enabled,\n measureRow,\n paddingBottom,\n paddingTop,\n virtualRows,\n };\n};\n\nexport default useTableVirtualization;\n"],"names":["DEFAULT_ROW_HEIGHT","areVisibleRangesEqual","currentRange","nextRange","useTableVirtualization","options","enabled","overscan","rows","scrollContainer","viewportHeightFallback","state","setState","useState","getScrollElement","useCallback","getEstimatedRowHeight","measuredHeights","sum","height","getRowHeight","index","getItemPosition","position","currentIndex","getTotalHeight","totalHeight","calculateVisibleRange","scrollTop","viewportHeight","start","currentPosition","rowHeight","end","handleScroll","scrollElement","visibleRange","previousState","useEffect","resizeObserver","measureRow","element","rect","computedStyle","nextState","virtualRows","useMemo","row","offset","paddingTop","paddingBottom"],"mappings":"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"}
1
+ {"version":3,"file":"useTableVirtualization.js","sources":["../../../../src/components/table/layout/useTableVirtualization.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport useResizeObserver from '../../../useResizeObserver';\n\ntype TableVirtualScrollContainer = {\n view?: HTMLDivElement | null;\n};\n\ntype TableVirtualRow<RowType> = {\n index: number;\n row: RowType;\n};\n\ntype UseTableVirtualizationOptions<RowType> = {\n enabled: boolean;\n overscan: number;\n rows: RowType[];\n scrollContainer: TableVirtualScrollContainer | null;\n viewportHeightFallback?: number;\n};\n\ntype TableVirtualizationState = {\n itemHeights: Record<number, number>;\n scrollTop: number;\n viewportHeight: number;\n visibleRange: {\n start: number;\n end: number;\n };\n};\n\nconst DEFAULT_ROW_HEIGHT = 50;\n\nconst areVisibleRangesEqual = (\n currentRange: TableVirtualizationState['visibleRange'],\n nextRange: TableVirtualizationState['visibleRange']\n) => currentRange.start === nextRange.start && currentRange.end === nextRange.end;\n\nconst useTableVirtualization = <RowType>(options: UseTableVirtualizationOptions<RowType>) => {\n const { enabled, overscan, rows, scrollContainer, viewportHeightFallback } = options;\n const scrollElement = scrollContainer?.view ?? null;\n const [, , { blockSize: observedViewportHeight }] = useResizeObserver(scrollElement);\n const [state, setState] = useState<TableVirtualizationState>({\n itemHeights: {},\n scrollTop: 0,\n viewportHeight: 0,\n visibleRange: { start: 0, end: 10 },\n });\n\n const getScrollElement = useCallback(() => scrollElement, [scrollElement]);\n\n const getEstimatedRowHeight = useCallback(() => {\n const measuredHeights = Object.values(state.itemHeights);\n\n if (measuredHeights.length === 0) {\n return DEFAULT_ROW_HEIGHT;\n }\n\n return measuredHeights.reduce((sum, height) => sum + height, 0) / measuredHeights.length;\n }, [state.itemHeights]);\n\n const getRowHeight = useCallback(\n (index: number) => state.itemHeights[index] ?? getEstimatedRowHeight(),\n [getEstimatedRowHeight, state.itemHeights]\n );\n\n const getItemPosition = useCallback(\n (index: number) => {\n let position = 0;\n\n for (let currentIndex = 0; currentIndex < index; currentIndex++) {\n position += getRowHeight(currentIndex);\n }\n\n return position;\n },\n [getRowHeight]\n );\n\n const getTotalHeight = useCallback(() => {\n let totalHeight = 0;\n\n for (let index = 0; index < rows.length; index++) {\n totalHeight += getRowHeight(index);\n }\n\n return totalHeight;\n }, [getRowHeight, rows.length]);\n\n const calculateVisibleRange = useCallback(\n (scrollTop: number, viewportHeight: number) => {\n if (!enabled || rows.length === 0) {\n return { start: 0, end: rows.length };\n }\n\n let start = 0;\n let currentPosition = 0;\n\n while (start < rows.length) {\n const rowHeight = getRowHeight(start);\n\n if (currentPosition + rowHeight > scrollTop - overscan * rowHeight) {\n break;\n }\n\n currentPosition += rowHeight;\n start++;\n }\n\n let end = start;\n\n while (end < rows.length) {\n const rowHeight = getRowHeight(end);\n\n if (currentPosition > scrollTop + viewportHeight + overscan * rowHeight) {\n break;\n }\n\n currentPosition += rowHeight;\n end++;\n }\n\n return {\n start: Math.max(0, start - overscan),\n end: Math.min(rows.length, end + overscan),\n };\n },\n [enabled, getRowHeight, overscan, rows.length]\n );\n\n const handleScroll = useCallback(() => {\n const scrollElement = getScrollElement();\n\n if (!scrollElement) {\n return;\n }\n\n const viewportHeight = scrollElement.clientHeight || observedViewportHeight || viewportHeightFallback || 0;\n const scrollTop = scrollElement.scrollTop;\n const visibleRange = calculateVisibleRange(scrollTop, viewportHeight);\n\n setState(previousState =>\n previousState.scrollTop === scrollTop &&\n previousState.viewportHeight === viewportHeight &&\n areVisibleRangesEqual(previousState.visibleRange, visibleRange)\n ? previousState\n : {\n ...previousState,\n scrollTop,\n viewportHeight,\n visibleRange,\n }\n );\n }, [calculateVisibleRange, getScrollElement, observedViewportHeight, viewportHeightFallback]);\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n if (!scrollElement) {\n return;\n }\n\n handleScroll();\n scrollElement.addEventListener('scroll', handleScroll, { passive: true });\n\n return () => {\n scrollElement.removeEventListener('scroll', handleScroll);\n };\n }, [enabled, handleScroll, scrollElement]);\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n setState(previousState => {\n const visibleRange = calculateVisibleRange(previousState.scrollTop, previousState.viewportHeight);\n\n return areVisibleRangesEqual(previousState.visibleRange, visibleRange)\n ? previousState\n : {\n ...previousState,\n visibleRange,\n };\n });\n }, [calculateVisibleRange, enabled, rows]);\n\n const measureRow = useCallback(\n (index: number, element: HTMLElement | null) => {\n if (!element) {\n return;\n }\n\n const rect = element.getBoundingClientRect();\n const computedStyle = window.getComputedStyle(element);\n const height =\n rect.height +\n Number.parseFloat(computedStyle.marginTop || '0') +\n Number.parseFloat(computedStyle.marginBottom || '0');\n\n if (height <= 0) {\n return;\n }\n\n setState(previousState => {\n if (previousState.itemHeights[index] === height) {\n return previousState;\n }\n\n const nextState = {\n ...previousState,\n itemHeights: {\n ...previousState.itemHeights,\n [index]: height,\n },\n };\n\n return {\n ...nextState,\n visibleRange: calculateVisibleRange(nextState.scrollTop, nextState.viewportHeight),\n };\n });\n },\n [calculateVisibleRange]\n );\n\n const virtualRows = useMemo<TableVirtualRow<RowType>[]>(\n () =>\n enabled\n ? rows.slice(state.visibleRange.start, state.visibleRange.end).map((row, offset) => {\n const index = state.visibleRange.start + offset;\n\n return {\n index,\n row,\n };\n })\n : [],\n [enabled, rows, state.visibleRange.end, state.visibleRange.start]\n );\n\n const paddingTop = enabled ? getItemPosition(state.visibleRange.start) : 0;\n const paddingBottom = enabled ? Math.max(0, getTotalHeight() - getItemPosition(state.visibleRange.end)) : 0;\n\n return {\n isVirtualized: enabled,\n measureRow,\n paddingBottom,\n paddingTop,\n virtualRows,\n };\n};\n\nexport default useTableVirtualization;\n"],"names":["DEFAULT_ROW_HEIGHT","areVisibleRangesEqual","currentRange","nextRange","useTableVirtualization","options","enabled","overscan","rows","scrollContainer","viewportHeightFallback","scrollElement","observedViewportHeight","useResizeObserver","state","setState","useState","getScrollElement","useCallback","getEstimatedRowHeight","measuredHeights","sum","height","getRowHeight","index","getItemPosition","position","currentIndex","getTotalHeight","totalHeight","calculateVisibleRange","scrollTop","viewportHeight","start","currentPosition","rowHeight","end","handleScroll","visibleRange","previousState","useEffect","measureRow","element","rect","computedStyle","nextState","virtualRows","useMemo","row","offset","paddingTop","paddingBottom"],"mappings":";;AA+BA,MAAMA,IAAqB,IAErBC,IAAwB,CAC1BC,GACAC,MACCD,EAAa,UAAUC,EAAU,SAASD,EAAa,QAAQC,EAAU,KAExEC,IAAyB,CAAUC,MAAoD;AACzF,QAAM,EAAE,SAAAC,GAAS,UAAAC,GAAU,MAAAC,GAAM,iBAAAC,GAAiB,wBAAAC,MAA2BL,GACvEM,IAAgBF,GAAiB,QAAQ,MACzC,CAAA,EAAA,EAAK,EAAE,WAAWG,EAAA,CAAwB,IAAIC,EAAkBF,CAAa,GAC7E,CAACG,GAAOC,CAAQ,IAAIC,EAAmC;AAAA,IACzD,aAAa,CAAA;AAAA,IACb,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,cAAc,EAAE,OAAO,GAAG,KAAK,GAAA;AAAA,EAAG,CACrC,GAEKC,IAAmBC,EAAY,MAAMP,GAAe,CAACA,CAAa,CAAC,GAEnEQ,IAAwBD,EAAY,MAAM;AAC5C,UAAME,IAAkB,OAAO,OAAON,EAAM,WAAW;AAEvD,WAAIM,EAAgB,WAAW,IACpBpB,IAGJoB,EAAgB,OAAO,CAACC,GAAKC,MAAWD,IAAMC,GAAQ,CAAC,IAAIF,EAAgB;AAAA,EACtF,GAAG,CAACN,EAAM,WAAW,CAAC,GAEhBS,IAAeL;AAAA,IACjB,CAACM,MAAkBV,EAAM,YAAYU,CAAK,KAAKL,EAAA;AAAA,IAC/C,CAACA,GAAuBL,EAAM,WAAW;AAAA,EAAA,GAGvCW,IAAkBP;AAAA,IACpB,CAACM,MAAkB;AACf,UAAIE,IAAW;AAEf,eAASC,IAAe,GAAGA,IAAeH,GAAOG;AAC7C,QAAAD,KAAYH,EAAaI,CAAY;AAGzC,aAAOD;AAAA,IACX;AAAA,IACA,CAACH,CAAY;AAAA,EAAA,GAGXK,IAAiBV,EAAY,MAAM;AACrC,QAAIW,IAAc;AAElB,aAASL,IAAQ,GAAGA,IAAQhB,EAAK,QAAQgB;AACrC,MAAAK,KAAeN,EAAaC,CAAK;AAGrC,WAAOK;AAAA,EACX,GAAG,CAACN,GAAcf,EAAK,MAAM,CAAC,GAExBsB,IAAwBZ;AAAA,IAC1B,CAACa,GAAmBC,MAA2B;AAC3C,UAAI,CAAC1B,KAAWE,EAAK,WAAW;AAC5B,eAAO,EAAE,OAAO,GAAG,KAAKA,EAAK,OAAA;AAGjC,UAAIyB,IAAQ,GACRC,IAAkB;AAEtB,aAAOD,IAAQzB,EAAK,UAAQ;AACxB,cAAM2B,IAAYZ,EAAaU,CAAK;AAEpC,YAAIC,IAAkBC,IAAYJ,IAAYxB,IAAW4B;AACrD;AAGJ,QAAAD,KAAmBC,GACnBF;AAAA,MACJ;AAEA,UAAIG,IAAMH;AAEV,aAAOG,IAAM5B,EAAK,UAAQ;AACtB,cAAM2B,IAAYZ,EAAaa,CAAG;AAElC,YAAIF,IAAkBH,IAAYC,IAAiBzB,IAAW4B;AAC1D;AAGJ,QAAAD,KAAmBC,GACnBC;AAAA,MACJ;AAEA,aAAO;AAAA,QACH,OAAO,KAAK,IAAI,GAAGH,IAAQ1B,CAAQ;AAAA,QACnC,KAAK,KAAK,IAAIC,EAAK,QAAQ4B,IAAM7B,CAAQ;AAAA,MAAA;AAAA,IAEjD;AAAA,IACA,CAACD,GAASiB,GAAchB,GAAUC,EAAK,MAAM;AAAA,EAAA,GAG3C6B,IAAenB,EAAY,MAAM;AACnC,UAAMP,IAAgBM,EAAA;AAEtB,QAAI,CAACN;AACD;AAGJ,UAAMqB,IAAiBrB,EAAc,gBAAgBC,KAA0BF,KAA0B,GACnGqB,IAAYpB,EAAc,WAC1B2B,IAAeR,EAAsBC,GAAWC,CAAc;AAEpE,IAAAjB;AAAA,MAAS,CAAAwB,MACLA,EAAc,cAAcR,KAC5BQ,EAAc,mBAAmBP,KACjC/B,EAAsBsC,EAAc,cAAcD,CAAY,IACxDC,IACA;AAAA,QACI,GAAGA;AAAA,QACH,WAAAR;AAAA,QACA,gBAAAC;AAAA,QACA,cAAAM;AAAA,MAAA;AAAA,IACJ;AAAA,EAEd,GAAG,CAACR,GAAuBb,GAAkBL,GAAwBF,CAAsB,CAAC;AAE5F,EAAA8B,EAAU,MAAM;AACZ,QAAKlC,KAIAK;AAIL,aAAA0B,EAAA,GACA1B,EAAc,iBAAiB,UAAU0B,GAAc,EAAE,SAAS,IAAM,GAEjE,MAAM;AACT,QAAA1B,EAAc,oBAAoB,UAAU0B,CAAY;AAAA,MAC5D;AAAA,EACJ,GAAG,CAAC/B,GAAS+B,GAAc1B,CAAa,CAAC,GAEzC6B,EAAU,MAAM;AACZ,IAAKlC,KAILS,EAAS,CAAAwB,MAAiB;AACtB,YAAMD,IAAeR,EAAsBS,EAAc,WAAWA,EAAc,cAAc;AAEhG,aAAOtC,EAAsBsC,EAAc,cAAcD,CAAY,IAC/DC,IACA;AAAA,QACI,GAAGA;AAAA,QACH,cAAAD;AAAA,MAAA;AAAA,IAEd,CAAC;AAAA,EACL,GAAG,CAACR,GAAuBxB,GAASE,CAAI,CAAC;AAEzC,QAAMiC,IAAavB;AAAA,IACf,CAACM,GAAekB,MAAgC;AAC5C,UAAI,CAACA;AACD;AAGJ,YAAMC,IAAOD,EAAQ,sBAAA,GACfE,IAAgB,OAAO,iBAAiBF,CAAO,GAC/CpB,IACFqB,EAAK,SACL,OAAO,WAAWC,EAAc,aAAa,GAAG,IAChD,OAAO,WAAWA,EAAc,gBAAgB,GAAG;AAEvD,MAAItB,KAAU,KAIdP,EAAS,CAAAwB,MAAiB;AACtB,YAAIA,EAAc,YAAYf,CAAK,MAAMF;AACrC,iBAAOiB;AAGX,cAAMM,IAAY;AAAA,UACd,GAAGN;AAAA,UACH,aAAa;AAAA,YACT,GAAGA,EAAc;AAAA,YACjB,CAACf,CAAK,GAAGF;AAAA,UAAA;AAAA,QACb;AAGJ,eAAO;AAAA,UACH,GAAGuB;AAAA,UACH,cAAcf,EAAsBe,EAAU,WAAWA,EAAU,cAAc;AAAA,QAAA;AAAA,MAEzF,CAAC;AAAA,IACL;AAAA,IACA,CAACf,CAAqB;AAAA,EAAA,GAGpBgB,IAAcC;AAAA,IAChB,MACIzC,IACME,EAAK,MAAMM,EAAM,aAAa,OAAOA,EAAM,aAAa,GAAG,EAAE,IAAI,CAACkC,GAAKC,OAG5D;AAAA,MACH,OAHUnC,EAAM,aAAa,QAAQmC;AAAA,MAIrC,KAAAD;AAAA,IAAA,EAEP,IACD,CAAA;AAAA,IACV,CAAC1C,GAASE,GAAMM,EAAM,aAAa,KAAKA,EAAM,aAAa,KAAK;AAAA,EAAA,GAG9DoC,IAAa5C,IAAUmB,EAAgBX,EAAM,aAAa,KAAK,IAAI,GACnEqC,IAAgB7C,IAAU,KAAK,IAAI,GAAGsB,MAAmBH,EAAgBX,EAAM,aAAa,GAAG,CAAC,IAAI;AAE1G,SAAO;AAAA,IACH,eAAeR;AAAA,IACf,YAAAmC;AAAA,IACA,eAAAU;AAAA,IACA,YAAAD;AAAA,IACA,aAAAJ;AAAA,EAAA;AAER;"}
@@ -0,0 +1,2 @@
1
+ import { TableResponsiveBreakpoint, TableViewType } from '../Table.types';
2
+ export declare const resolveResponsiveViewType: (viewType: TableViewType, wrapperWidth: number | undefined, responsiveBreakpoint: TableResponsiveBreakpoint | undefined) => TableViewType;
@@ -0,0 +1,27 @@
1
+ import s from "../shared/parsePixelSize.js";
2
+ const r = (i) => {
3
+ if (typeof i == "number")
4
+ return Number.isFinite(i) ? i : void 0;
5
+ const t = i.trim();
6
+ if (!t || typeof window > "u" || typeof document > "u")
7
+ return;
8
+ const o = s(t);
9
+ if (o !== void 0)
10
+ return o;
11
+ const e = document.createElement("div");
12
+ e.style.position = "absolute", e.style.visibility = "hidden", e.style.pointerEvents = "none", e.style.boxSizing = "border-box", e.style.width = t, e.style.height = "0", e.style.padding = "0", e.style.border = "0", document.body.appendChild(e);
13
+ const n = e.getBoundingClientRect().width;
14
+ return e.remove(), Number.isFinite(n) ? n : void 0;
15
+ }, d = (i) => i ? {
16
+ multiCardsMaxWidth: i.cards !== void 0 ? r(i.cards) : void 0,
17
+ singleCardMaxWidth: i.list !== void 0 ? r(i.list) : void 0
18
+ } : {}, m = (i, t, o) => {
19
+ if (t === void 0)
20
+ return i;
21
+ const { multiCardsMaxWidth: e, singleCardMaxWidth: n } = d(o);
22
+ return n !== void 0 && t < n ? "SINGLE_CARD" : e !== void 0 && t < e ? "MULTI_CARDS" : i;
23
+ };
24
+ export {
25
+ m as resolveResponsiveViewType
26
+ };
27
+ //# sourceMappingURL=resolveResponsiveViewType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveResponsiveViewType.js","sources":["../../../../src/components/table/model/resolveResponsiveViewType.ts"],"sourcesContent":["import type { TableResponsiveBreakpoint, TableViewType } from '../Table.types';\nimport parsePixelSize from '../shared/parsePixelSize';\n\nconst resolveResponsiveBreakpointPx = (value: number | string): number | undefined => {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : undefined;\n }\n\n const trimmedValue = value.trim();\n\n if (!trimmedValue) {\n return;\n }\n\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return;\n }\n const pixelSize = parsePixelSize(trimmedValue);\n\n if (pixelSize !== undefined) {\n return pixelSize;\n }\n\n const measurementElement = document.createElement('div');\n measurementElement.style.position = 'absolute';\n measurementElement.style.visibility = 'hidden';\n measurementElement.style.pointerEvents = 'none';\n measurementElement.style.boxSizing = 'border-box';\n measurementElement.style.width = trimmedValue;\n measurementElement.style.height = '0';\n measurementElement.style.padding = '0';\n measurementElement.style.border = '0';\n document.body.appendChild(measurementElement);\n\n const resolvedWidth = measurementElement.getBoundingClientRect().width;\n\n measurementElement.remove();\n\n return Number.isFinite(resolvedWidth) ? resolvedWidth : undefined;\n};\n\nconst resolveResponsiveBreakpointsPx = (value: TableResponsiveBreakpoint | undefined) => {\n if (!value) {\n return {};\n }\n\n return {\n multiCardsMaxWidth: value.cards !== undefined ? resolveResponsiveBreakpointPx(value.cards) : undefined,\n singleCardMaxWidth: value.list !== undefined ? resolveResponsiveBreakpointPx(value.list) : undefined,\n };\n};\n\nexport const resolveResponsiveViewType = (\n viewType: TableViewType,\n wrapperWidth: number | undefined,\n responsiveBreakpoint: TableResponsiveBreakpoint | undefined\n): TableViewType => {\n if (viewType !== 'TABLE' || wrapperWidth === undefined) {\n return viewType;\n }\n\n const { multiCardsMaxWidth, singleCardMaxWidth } = resolveResponsiveBreakpointsPx(responsiveBreakpoint);\n\n if (singleCardMaxWidth !== undefined && wrapperWidth < singleCardMaxWidth) {\n return 'SINGLE_CARD';\n }\n\n if (multiCardsMaxWidth !== undefined && wrapperWidth < multiCardsMaxWidth) {\n return 'MULTI_CARDS';\n }\n\n return viewType;\n};\n"],"names":["resolveResponsiveBreakpointPx","value","trimmedValue","pixelSize","parsePixelSize","measurementElement","resolvedWidth","resolveResponsiveBreakpointsPx","resolveResponsiveViewType","viewType","wrapperWidth","responsiveBreakpoint","multiCardsMaxWidth","singleCardMaxWidth"],"mappings":";AAGA,MAAMA,IAAgC,CAACC,MAA+C;AAClF,MAAI,OAAOA,KAAU;AACjB,WAAO,OAAO,SAASA,CAAK,IAAIA,IAAQ;AAG5C,QAAMC,IAAeD,EAAM,KAAA;AAM3B,MAJI,CAACC,KAID,OAAO,SAAW,OAAe,OAAO,WAAa;AACrD;AAEJ,QAAMC,IAAYC,EAAeF,CAAY;AAE7C,MAAIC,MAAc;AACd,WAAOA;AAGX,QAAME,IAAqB,SAAS,cAAc,KAAK;AACvD,EAAAA,EAAmB,MAAM,WAAW,YACpCA,EAAmB,MAAM,aAAa,UACtCA,EAAmB,MAAM,gBAAgB,QACzCA,EAAmB,MAAM,YAAY,cACrCA,EAAmB,MAAM,QAAQH,GACjCG,EAAmB,MAAM,SAAS,KAClCA,EAAmB,MAAM,UAAU,KACnCA,EAAmB,MAAM,SAAS,KAClC,SAAS,KAAK,YAAYA,CAAkB;AAE5C,QAAMC,IAAgBD,EAAmB,sBAAA,EAAwB;AAEjE,SAAAA,EAAmB,OAAA,GAEZ,OAAO,SAASC,CAAa,IAAIA,IAAgB;AAC5D,GAEMC,IAAiC,CAACN,MAC/BA,IAIE;AAAA,EACH,oBAAoBA,EAAM,UAAU,SAAYD,EAA8BC,EAAM,KAAK,IAAI;AAAA,EAC7F,oBAAoBA,EAAM,SAAS,SAAYD,EAA8BC,EAAM,IAAI,IAAI;AAAA,IALpF,CAAA,GASFO,IAA4B,CACrCC,GACAC,GACAC,MACgB;AAChB,MAA4BD,MAAiB;AACzC,WAAOD;AAGX,QAAM,EAAE,oBAAAG,GAAoB,oBAAAC,MAAuBN,EAA+BI,CAAoB;AAEtG,SAAIE,MAAuB,UAAaH,IAAeG,IAC5C,gBAGPD,MAAuB,UAAaF,IAAeE,IAC5C,gBAGJH;AACX;"}
@@ -2,6 +2,7 @@ type TableHeaderSelectionCellProps = {
2
2
  isAllSelected?: boolean;
3
3
  isSomeRowsSelected?: boolean;
4
4
  onToggleAllSelection?: () => void;
5
+ disabled?: boolean;
5
6
  rowCount: number;
6
7
  selectionHeaderContent?: React.ReactNode;
7
8
  };
@@ -1,31 +1,32 @@
1
1
  import { jsx as o } from "react/jsx-runtime";
2
- import c from "../../../checkbox/Checkbox.js";
3
- import s from "../../../../utils/classNames.js";
4
- import { resolveAriaSpan as d } from "../../shared/resolveTableAria.js";
5
- const h = (a) => {
6
- const { isAllSelected: l, isSomeRowsSelected: r, onToggleAllSelection: i, rowCount: n, selectionHeaderContent: t } = a;
2
+ import s from "../../../checkbox/Checkbox.js";
3
+ import d from "../../../../utils/classNames.js";
4
+ import { resolveAriaSpan as m } from "../../shared/resolveTableAria.js";
5
+ const C = (t) => {
6
+ const { isAllSelected: l, isSomeRowsSelected: r, onToggleAllSelection: i, disabled: c, rowCount: a, selectionHeaderContent: n } = t;
7
7
  return /* @__PURE__ */ o(
8
8
  "div",
9
9
  {
10
- className: s(
10
+ className: d(
11
11
  "table-head-cell table-selection-cell table-align-center",
12
- t && "table-selection-cell-custom-content"
12
+ n && "table-selection-cell-custom-content"
13
13
  ),
14
14
  role: "columnheader",
15
15
  "aria-colindex": 1,
16
16
  "aria-rowindex": 1,
17
- "aria-rowspan": d(n),
18
- style: { gridColumn: "1 / span 1", gridRow: `1 / span ${n}` },
17
+ "aria-rowspan": m(a),
18
+ style: { gridColumn: "1 / span 1", gridRow: `1 / span ${a}` },
19
19
  children: /* @__PURE__ */ o(
20
20
  "div",
21
21
  {
22
22
  className: "table-selection-control",
23
23
  onClick: (e) => e.stopPropagation(),
24
24
  onKeyDown: (e) => e.stopPropagation(),
25
- children: t ?? /* @__PURE__ */ o(
26
- c,
25
+ children: n ?? /* @__PURE__ */ o(
26
+ s,
27
27
  {
28
28
  checked: l,
29
+ disabled: c,
29
30
  indeterminate: !l && !!r,
30
31
  onChange: () => i?.()
31
32
  }
@@ -36,6 +37,6 @@ const h = (a) => {
36
37
  );
37
38
  };
38
39
  export {
39
- h as default
40
+ C as default
40
41
  };
41
42
  //# sourceMappingURL=TableHeaderSelectionCell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TableHeaderSelectionCell.js","sources":["../../../../../src/components/table/render/header/TableHeaderSelectionCell.tsx"],"sourcesContent":["import Checkbox from '../../../checkbox/Checkbox';\nimport classNames from '../../../../utils/classNames';\nimport { resolveAriaSpan } from '../../shared/resolveTableAria';\n\ntype TableHeaderSelectionCellProps = {\n isAllSelected?: boolean;\n isSomeRowsSelected?: boolean;\n onToggleAllSelection?: () => void;\n rowCount: number;\n selectionHeaderContent?: React.ReactNode;\n};\n\nconst TableHeaderSelectionCell = (props: TableHeaderSelectionCellProps) => {\n const { isAllSelected, isSomeRowsSelected, onToggleAllSelection, rowCount, selectionHeaderContent } = props;\n\n return (\n <div\n className={classNames(\n 'table-head-cell table-selection-cell table-align-center',\n selectionHeaderContent && 'table-selection-cell-custom-content'\n )}\n role='columnheader'\n aria-colindex={1}\n aria-rowindex={1}\n aria-rowspan={resolveAriaSpan(rowCount)}\n style={{ gridColumn: '1 / span 1', gridRow: `1 / span ${rowCount}` }}\n >\n <div\n className='table-selection-control'\n onClick={event => event.stopPropagation()}\n onKeyDown={event => event.stopPropagation()}\n >\n {selectionHeaderContent ?? (\n <Checkbox\n checked={isAllSelected}\n indeterminate={!isAllSelected && !!isSomeRowsSelected}\n onChange={() => onToggleAllSelection?.()}\n />\n )}\n </div>\n </div>\n );\n};\n\nexport default TableHeaderSelectionCell;\n"],"names":["TableHeaderSelectionCell","props","isAllSelected","isSomeRowsSelected","onToggleAllSelection","rowCount","selectionHeaderContent","jsx","classNames","resolveAriaSpan","event","Checkbox"],"mappings":";;;;AAYA,MAAMA,IAA2B,CAACC,MAAyC;AACvE,QAAM,EAAE,eAAAC,GAAe,oBAAAC,GAAoB,sBAAAC,GAAsB,UAAAC,GAAU,wBAAAC,MAA2BL;AAEtG,SACI,gBAAAM;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWC;AAAA,QACP;AAAA,QACAF,KAA0B;AAAA,MAAA;AAAA,MAE9B,MAAK;AAAA,MACL,iBAAe;AAAA,MACf,iBAAe;AAAA,MACf,gBAAcG,EAAgBJ,CAAQ;AAAA,MACtC,OAAO,EAAE,YAAY,cAAc,SAAS,YAAYA,CAAQ,GAAA;AAAA,MAEhE,UAAA,gBAAAE;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAU;AAAA,UACV,SAAS,CAAAG,MAASA,EAAM,gBAAA;AAAA,UACxB,WAAW,CAAAA,MAASA,EAAM,gBAAA;AAAA,UAEzB,UAAAJ,KACG,gBAAAC;AAAA,YAACI;AAAA,YAAA;AAAA,cACG,SAAST;AAAA,cACT,eAAe,CAACA,KAAiB,CAAC,CAACC;AAAA,cACnC,UAAU,MAAMC,IAAA;AAAA,YAAuB;AAAA,UAAA;AAAA,QAC3C;AAAA,MAAA;AAAA,IAER;AAAA,EAAA;AAGZ;"}
1
+ {"version":3,"file":"TableHeaderSelectionCell.js","sources":["../../../../../src/components/table/render/header/TableHeaderSelectionCell.tsx"],"sourcesContent":["import Checkbox from '../../../checkbox/Checkbox';\nimport classNames from '../../../../utils/classNames';\nimport { resolveAriaSpan } from '../../shared/resolveTableAria';\n\ntype TableHeaderSelectionCellProps = {\n isAllSelected?: boolean;\n isSomeRowsSelected?: boolean;\n onToggleAllSelection?: () => void;\n disabled?: boolean;\n rowCount: number;\n selectionHeaderContent?: React.ReactNode;\n};\n\nconst TableHeaderSelectionCell = (props: TableHeaderSelectionCellProps) => {\n const { isAllSelected, isSomeRowsSelected, onToggleAllSelection, disabled, rowCount, selectionHeaderContent } =\n props;\n\n return (\n <div\n className={classNames(\n 'table-head-cell table-selection-cell table-align-center',\n selectionHeaderContent && 'table-selection-cell-custom-content'\n )}\n role='columnheader'\n aria-colindex={1}\n aria-rowindex={1}\n aria-rowspan={resolveAriaSpan(rowCount)}\n style={{ gridColumn: '1 / span 1', gridRow: `1 / span ${rowCount}` }}\n >\n <div\n className='table-selection-control'\n onClick={event => event.stopPropagation()}\n onKeyDown={event => event.stopPropagation()}\n >\n {selectionHeaderContent ?? (\n <Checkbox\n checked={isAllSelected}\n disabled={disabled}\n indeterminate={!isAllSelected && !!isSomeRowsSelected}\n onChange={() => onToggleAllSelection?.()}\n />\n )}\n </div>\n </div>\n );\n};\n\nexport default TableHeaderSelectionCell;\n"],"names":["TableHeaderSelectionCell","props","isAllSelected","isSomeRowsSelected","onToggleAllSelection","disabled","rowCount","selectionHeaderContent","jsx","classNames","resolveAriaSpan","event","Checkbox"],"mappings":";;;;AAaA,MAAMA,IAA2B,CAACC,MAAyC;AACvE,QAAM,EAAE,eAAAC,GAAe,oBAAAC,GAAoB,sBAAAC,GAAsB,UAAAC,GAAU,UAAAC,GAAU,wBAAAC,MACjFN;AAEJ,SACI,gBAAAO;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWC;AAAA,QACP;AAAA,QACAF,KAA0B;AAAA,MAAA;AAAA,MAE9B,MAAK;AAAA,MACL,iBAAe;AAAA,MACf,iBAAe;AAAA,MACf,gBAAcG,EAAgBJ,CAAQ;AAAA,MACtC,OAAO,EAAE,YAAY,cAAc,SAAS,YAAYA,CAAQ,GAAA;AAAA,MAEhE,UAAA,gBAAAE;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAU;AAAA,UACV,SAAS,CAAAG,MAASA,EAAM,gBAAA;AAAA,UACxB,WAAW,CAAAA,MAASA,EAAM,gBAAA;AAAA,UAEzB,UAAAJ,KACG,gBAAAC;AAAA,YAACI;AAAA,YAAA;AAAA,cACG,SAASV;AAAA,cACT,UAAAG;AAAA,cACA,eAAe,CAACH,KAAiB,CAAC,CAACC;AAAA,cACnC,UAAU,MAAMC,IAAA;AAAA,YAAuB;AAAA,UAAA;AAAA,QAC3C;AAAA,MAAA;AAAA,IAER;AAAA,EAAA;AAGZ;"}
@@ -0,0 +1,23 @@
1
+ import { TableResponsiveBreakpoint, TableViewType } from '../Table.types';
2
+ type UseResponsiveResolvedViewTypeProps = {
3
+ onViewTypeChange?: (viewType: TableViewType) => void;
4
+ responsiveBreakpoint?: TableResponsiveBreakpoint;
5
+ viewType: TableViewType;
6
+ wrapperTableWidth?: string | number;
7
+ wrapperWidth?: number;
8
+ };
9
+ /**
10
+ * Resolves the effective table view when responsive breakpoints and manual view changes are both active.
11
+ *
12
+ * With `responsiveBreakpoint`, the table derives a responsive view bucket from the current rendered width:
13
+ * `TABLE`, `MULTI_CARDS`, or `SINGLE_CARD`.
14
+ *
15
+ * Manual view changes are intentionally sticky within the current responsive bucket. Example:
16
+ * when the width currently resolves to `MULTI_CARDS`, the user can still switch to `TABLE` manually.
17
+ * That manual choice stays active until resizing crosses into a different responsive bucket, at which point
18
+ * the hook clears the override and resolves the view from the current breakpoints again.
19
+ *
20
+ * Without `responsiveBreakpoint`, the hook simply returns the requested `viewType`.
21
+ */
22
+ declare const useResponsiveResolvedViewType: (props: UseResponsiveResolvedViewTypeProps) => TableViewType;
23
+ export default useResponsiveResolvedViewType;
@@ -0,0 +1,22 @@
1
+ import { useRef as v, useEffect as c } from "react";
2
+ import { resolveResponsiveViewType as w } from "../model/resolveResponsiveViewType.js";
3
+ import y from "../shared/parsePixelSize.js";
4
+ const h = (u) => {
5
+ const { onViewTypeChange: n, responsiveBreakpoint: p, viewType: r, wrapperTableWidth: a, wrapperWidth: d } = u, t = v(r), i = v(
6
+ void 0
7
+ ), e = p !== void 0, f = e ? y(a) ?? d : void 0, T = e && r !== t.current, o = e ? w("TABLE", f, p) : r;
8
+ e ? T && (i.current = {
9
+ responsiveViewType: o,
10
+ viewType: r
11
+ }) : i.current = void 0, e && i.current?.responsiveViewType !== o && (i.current = void 0);
12
+ const s = e ? i.current?.viewType ?? o : r;
13
+ return c(() => {
14
+ e && n?.(s);
15
+ }, [e, n, s]), c(() => {
16
+ t.current = r;
17
+ }, [r]), s;
18
+ };
19
+ export {
20
+ h as default
21
+ };
22
+ //# sourceMappingURL=useResponsiveResolvedViewType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useResponsiveResolvedViewType.js","sources":["../../../../src/components/table/runtime/useResponsiveResolvedViewType.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport { resolveResponsiveViewType } from '../model/resolveResponsiveViewType';\nimport parsePixelSize from '../shared/parsePixelSize';\nimport type { TableResponsiveBreakpoint, TableViewType } from '../Table.types';\n\ntype UseResponsiveResolvedViewTypeProps = {\n onViewTypeChange?: (viewType: TableViewType) => void;\n responsiveBreakpoint?: TableResponsiveBreakpoint;\n viewType: TableViewType;\n wrapperTableWidth?: string | number;\n wrapperWidth?: number;\n};\n\n/**\n * Resolves the effective table view when responsive breakpoints and manual view changes are both active.\n *\n * With `responsiveBreakpoint`, the table derives a responsive view bucket from the current rendered width:\n * `TABLE`, `MULTI_CARDS`, or `SINGLE_CARD`.\n *\n * Manual view changes are intentionally sticky within the current responsive bucket. Example:\n * when the width currently resolves to `MULTI_CARDS`, the user can still switch to `TABLE` manually.\n * That manual choice stays active until resizing crosses into a different responsive bucket, at which point\n * the hook clears the override and resolves the view from the current breakpoints again.\n *\n * Without `responsiveBreakpoint`, the hook simply returns the requested `viewType`.\n */\nconst useResponsiveResolvedViewType = (props: UseResponsiveResolvedViewTypeProps): TableViewType => {\n const { onViewTypeChange, responsiveBreakpoint, viewType, wrapperTableWidth, wrapperWidth } = props;\n\n const previousPropViewTypeRef = useRef<TableViewType>(viewType);\n const manualOverrideRef = useRef<{ responsiveViewType: TableViewType; viewType: TableViewType } | undefined>(\n undefined\n );\n\n const hasResponsiveBreakpoint = responsiveBreakpoint !== undefined;\n const responsiveTableWidth = hasResponsiveBreakpoint\n ? (parsePixelSize(wrapperTableWidth) ?? wrapperWidth)\n : undefined;\n const hasRequestedViewTypeChange = hasResponsiveBreakpoint && viewType !== previousPropViewTypeRef.current;\n\n const responsiveViewType = hasResponsiveBreakpoint\n ? resolveResponsiveViewType('TABLE', responsiveTableWidth, responsiveBreakpoint)\n : viewType;\n\n if (!hasResponsiveBreakpoint) {\n manualOverrideRef.current = undefined;\n } else if (hasRequestedViewTypeChange) {\n manualOverrideRef.current = {\n responsiveViewType,\n viewType,\n };\n }\n\n if (hasResponsiveBreakpoint && manualOverrideRef.current?.responsiveViewType !== responsiveViewType) {\n manualOverrideRef.current = undefined;\n }\n\n const resolvedViewType = hasResponsiveBreakpoint\n ? (manualOverrideRef.current?.viewType ?? responsiveViewType)\n : viewType;\n\n useEffect(() => {\n if (!hasResponsiveBreakpoint) {\n return;\n }\n\n onViewTypeChange?.(resolvedViewType);\n }, [hasResponsiveBreakpoint, onViewTypeChange, resolvedViewType]);\n\n useEffect(() => {\n previousPropViewTypeRef.current = viewType;\n }, [viewType]);\n\n return resolvedViewType;\n};\n\nexport default useResponsiveResolvedViewType;\n"],"names":["useResponsiveResolvedViewType","props","onViewTypeChange","responsiveBreakpoint","viewType","wrapperTableWidth","wrapperWidth","previousPropViewTypeRef","useRef","manualOverrideRef","hasResponsiveBreakpoint","responsiveTableWidth","parsePixelSize","hasRequestedViewTypeChange","responsiveViewType","resolveResponsiveViewType","resolvedViewType","useEffect"],"mappings":";;;AA2BA,MAAMA,IAAgC,CAACC,MAA6D;AAChG,QAAM,EAAE,kBAAAC,GAAkB,sBAAAC,GAAsB,UAAAC,GAAU,mBAAAC,GAAmB,cAAAC,MAAiBL,GAExFM,IAA0BC,EAAsBJ,CAAQ,GACxDK,IAAoBD;AAAA,IACtB;AAAA,EAAA,GAGEE,IAA0BP,MAAyB,QACnDQ,IAAuBD,IACtBE,EAAeP,CAAiB,KAAKC,IACtC,QACAO,IAA6BH,KAA2BN,MAAaG,EAAwB,SAE7FO,IAAqBJ,IACrBK,EAA0B,SAASJ,GAAsBR,CAAoB,IAC7EC;AAEN,EAAKM,IAEMG,MACPJ,EAAkB,UAAU;AAAA,IACxB,oBAAAK;AAAA,IACA,UAAAV;AAAA,EAAA,KAJJK,EAAkB,UAAU,QAQ5BC,KAA2BD,EAAkB,SAAS,uBAAuBK,MAC7EL,EAAkB,UAAU;AAGhC,QAAMO,IAAmBN,IAClBD,EAAkB,SAAS,YAAYK,IACxCV;AAEN,SAAAa,EAAU,MAAM;AACZ,IAAKP,KAILR,IAAmBc,CAAgB;AAAA,EACvC,GAAG,CAACN,GAAyBR,GAAkBc,CAAgB,CAAC,GAEhEC,EAAU,MAAM;AACZ,IAAAV,EAAwB,UAAUH;AAAA,EACtC,GAAG,CAACA,CAAQ,CAAC,GAENY;AACX;"}