@perspective-dev/viewer-datagrid 4.3.0 → 4.4.1

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 (87) hide show
  1. package/dist/cdn/perspective-viewer-datagrid.js +4 -22
  2. package/dist/cdn/perspective-viewer-datagrid.js.map +4 -4
  3. package/dist/css/perspective-viewer-datagrid-toolbar.css +1 -1
  4. package/dist/css/perspective-viewer-datagrid.css +1 -1
  5. package/dist/esm/color_utils.d.ts +22 -0
  6. package/dist/esm/custom_elements/datagrid.d.ts +5 -5
  7. package/dist/esm/data_listener/format_cell.d.ts +1 -1
  8. package/dist/esm/data_listener/formatter_cache.d.ts +1 -1
  9. package/dist/esm/data_listener/index.d.ts +3 -2
  10. package/dist/esm/event_handlers/click/edit_click.d.ts +3 -2
  11. package/dist/esm/event_handlers/click.d.ts +4 -6
  12. package/dist/esm/event_handlers/dispatch_click.d.ts +3 -2
  13. package/dist/esm/event_handlers/expand_collapse.d.ts +1 -1
  14. package/dist/esm/event_handlers/focus.d.ts +4 -5
  15. package/dist/esm/event_handlers/header_click.d.ts +5 -3
  16. package/dist/esm/event_handlers/keydown/edit_keydown.d.ts +3 -4
  17. package/dist/esm/event_handlers/select_region.d.ts +3 -1
  18. package/dist/esm/event_handlers/sort.d.ts +8 -7
  19. package/dist/esm/model/create.d.ts +1 -1
  20. package/dist/esm/perspective-viewer-datagrid.js +3 -3
  21. package/dist/esm/perspective-viewer-datagrid.js.map +4 -4
  22. package/dist/esm/plugin/activate.d.ts +1 -1
  23. package/dist/esm/plugin/column_style_controls.d.ts +1 -1
  24. package/dist/esm/style_handlers/body.d.ts +3 -3
  25. package/dist/esm/style_handlers/column_header.d.ts +4 -3
  26. package/dist/esm/style_handlers/consolidated.d.ts +3 -47
  27. package/dist/esm/style_handlers/editable.d.ts +3 -2
  28. package/dist/esm/style_handlers/focus.d.ts +4 -4
  29. package/dist/esm/style_handlers/group_header.d.ts +1 -1
  30. package/dist/esm/style_handlers/table_cell/boolean.d.ts +1 -1
  31. package/dist/esm/style_handlers/table_cell/cell_flash.d.ts +1 -1
  32. package/dist/esm/style_handlers/table_cell/datetime.d.ts +6 -2
  33. package/dist/esm/style_handlers/table_cell/numeric.d.ts +1 -1
  34. package/dist/esm/style_handlers/table_cell/row_header.d.ts +1 -1
  35. package/dist/esm/style_handlers/table_cell/string.d.ts +1 -1
  36. package/dist/esm/style_handlers/types.d.ts +0 -4
  37. package/dist/esm/types.d.ts +10 -17
  38. package/package.json +3 -5
  39. package/src/css/mitered-headers.css +64 -0
  40. package/src/css/perspective-viewer-datagrid.css +6 -0
  41. package/src/{less/pro.less → css/pro.css} +32 -31
  42. package/src/css/regular_table.css +589 -0
  43. package/src/{less/row-hover.less → css/row-hover.css} +48 -29
  44. package/src/{less/scrollbar.less → css/scrollbar.css} +16 -15
  45. package/src/{less/sub-cell-scroll.less → css/sub-cell-scroll.css} +14 -13
  46. package/src/{less/toolbar.less → css/toolbar.css} +57 -39
  47. package/src/ts/color_utils.ts +144 -16
  48. package/src/ts/custom_elements/datagrid.ts +11 -12
  49. package/src/ts/custom_elements/toolbar.ts +4 -5
  50. package/src/ts/data_listener/format_cell.ts +28 -9
  51. package/src/ts/data_listener/formatter_cache.ts +1 -1
  52. package/src/ts/data_listener/index.ts +4 -8
  53. package/src/ts/event_handlers/click/edit_click.ts +7 -6
  54. package/src/ts/event_handlers/click.ts +39 -68
  55. package/src/ts/event_handlers/dispatch_click.ts +24 -25
  56. package/src/ts/event_handlers/expand_collapse.ts +7 -7
  57. package/src/ts/event_handlers/focus.ts +38 -35
  58. package/src/ts/event_handlers/header_click.ts +101 -62
  59. package/src/ts/event_handlers/keydown/edit_keydown.ts +49 -52
  60. package/src/ts/event_handlers/select_region.ts +144 -133
  61. package/src/ts/event_handlers/sort.ts +16 -24
  62. package/src/ts/model/column_overrides.ts +13 -4
  63. package/src/ts/model/create.ts +55 -59
  64. package/src/ts/model/toolbar.ts +23 -7
  65. package/src/ts/plugin/activate.ts +120 -92
  66. package/src/ts/plugin/column_style_controls.ts +1 -1
  67. package/src/ts/plugin/save.ts +1 -0
  68. package/src/ts/style_handlers/body.ts +56 -61
  69. package/src/ts/style_handlers/column_header.ts +16 -19
  70. package/src/ts/style_handlers/consolidated.ts +22 -123
  71. package/src/ts/style_handlers/editable.ts +10 -8
  72. package/src/ts/style_handlers/focus.ts +5 -5
  73. package/src/ts/style_handlers/group_header.ts +3 -2
  74. package/src/ts/style_handlers/table_cell/boolean.ts +3 -3
  75. package/src/ts/style_handlers/table_cell/cell_flash.ts +11 -11
  76. package/src/ts/style_handlers/table_cell/datetime.ts +14 -11
  77. package/src/ts/style_handlers/table_cell/numeric.ts +24 -25
  78. package/src/ts/style_handlers/table_cell/row_header.ts +2 -2
  79. package/src/ts/style_handlers/table_cell/string.ts +20 -18
  80. package/src/ts/style_handlers/types.ts +0 -10
  81. package/src/ts/types.ts +28 -20
  82. package/dist/esm/event_handlers/deselect_all.d.ts +0 -5
  83. package/dist/esm/event_handlers/row_select_click.d.ts +0 -4
  84. package/src/less/mitered-headers.less +0 -65
  85. package/src/less/regular_table.less +0 -526
  86. package/src/ts/event_handlers/deselect_all.ts +0 -28
  87. package/src/ts/event_handlers/row_select_click.ts +0 -92
@@ -14,69 +14,19 @@ import { RegularTableElement } from "regular-table";
14
14
  import { PRIVATE_PLUGIN_SYMBOL } from "../model/index.js";
15
15
  import type {
16
16
  DatagridModel,
17
- PerspectiveViewerElement,
18
17
  ColumnsConfig,
19
18
  DatagridPluginElement,
20
- SelectedPosition,
19
+ SelectedPositionMap,
21
20
  } from "../types.js";
21
+ import { isEditableMode } from "../types.js";
22
+ import type { HTMLPerspectiveViewerElement } from "@perspective-dev/viewer";
22
23
 
23
24
  import { applyFocusStyle } from "./focus.js";
24
- import { styleColumnHeaderRow } from "./column_header.js";
25
25
  import { applyColumnHeaderStyles } from "./editable.js";
26
26
  import { applyGroupHeaderStyles } from "./group_header.js";
27
27
  import { applyBodyCellStyles } from "./body.js";
28
28
  import { CellMetadata } from "regular-table/dist/esm/types.js";
29
-
30
- interface CollectedCell {
31
- element: HTMLElement;
32
- metadata: CellMetadata;
33
- isHeader: boolean;
34
- }
35
-
36
- interface CollectedHeaderRow {
37
- row: HTMLTableRowElement;
38
- cells: Array<{
39
- element: HTMLTableCellElement;
40
- metadata: CellMetadata | undefined;
41
- }>;
42
- }
43
-
44
- /**
45
- * Context object passed through consolidated styling
46
- */
47
- export interface StyleContext {
48
- model: DatagridModel;
49
- regularTable: RegularTableElement;
50
- viewer: PerspectiveViewerElement;
51
- datagrid: DatagridPluginElement;
52
- plugins: ColumnsConfig;
53
- isSettingsOpen: boolean;
54
- isSelectable: boolean;
55
- isEditable: boolean;
56
- selectedRowsMap: Map<RegularTableElement, unknown[]>;
57
- selectedPositionMap: Map<RegularTableElement, SelectedPosition>;
58
- }
59
-
60
- // Local types for selection maps - match the actual runtime usage
61
- // (activate.ts uses `as any` casts when passing these)
62
- type LocalSelectedRowsMap = WeakMap<RegularTableElement, unknown[]>;
63
- type LocalSelectedPositionMap = WeakMap<RegularTableElement, SelectedPosition>;
64
-
65
- function isEditableMode(
66
- model: DatagridModel,
67
- viewer: PerspectiveViewerElement,
68
- allowed: boolean = false,
69
- ): boolean {
70
- const has_pivots =
71
- model._config.group_by.length === 0 &&
72
- model._config.split_by.length === 0;
73
- const selectable = viewer.hasAttribute("selectable");
74
- const plugin = viewer.children[0] as
75
- | (DatagridPluginElement & { dataset: DOMStringMap })
76
- | undefined;
77
- const editable = allowed || plugin?.dataset?.editMode === "EDIT";
78
- return has_pivots && !selectable && editable;
79
- }
29
+ import { CollectedCell, CollectedHeaderRow } from "./types.js";
80
30
 
81
31
  /**
82
32
  * Consolidated style listener that handles all cell styling in a single pass.
@@ -86,24 +36,18 @@ function isEditableMode(
86
36
  */
87
37
  export function createConsolidatedStyleListener(
88
38
  datagrid: DatagridPluginElement,
89
- selectedRowsMap: LocalSelectedRowsMap,
90
- selectedPositionMap: LocalSelectedPositionMap,
91
- ): (
92
- this: DatagridModel,
39
+ model: DatagridModel,
93
40
  regularTable: RegularTableElement,
94
- viewer: PerspectiveViewerElement,
95
- ) => void {
96
- return function consolidatedStyleListener(
97
- this: DatagridModel,
98
- regularTable: RegularTableElement,
99
- viewer: PerspectiveViewerElement,
100
- ): void {
41
+ viewer: HTMLPerspectiveViewerElement,
42
+ selectedPositionMap: SelectedPositionMap,
43
+ ): () => void {
44
+ return function consolidatedStyleListener(): void {
101
45
  const plugins: ColumnsConfig =
102
46
  (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {};
103
47
  const isSettingsOpen = viewer.hasAttribute("settings");
104
- const isSelectable = viewer.hasAttribute("selectable");
105
- const isEditable = isEditableMode(this, viewer);
106
- const isEditableAllowed = isEditableMode(this, viewer, true);
48
+ const isSelectable = model._edit_mode === "SELECT_ROW_TREE";
49
+ const isEditable = isEditableMode(model, viewer);
50
+ const isEditableAllowed = isEditableMode(model, viewer, true);
107
51
 
108
52
  // Toggle edit mode class on datagrid
109
53
  datagrid.classList.toggle("edit-mode-allowed", isEditableAllowed);
@@ -117,7 +61,11 @@ export function createConsolidatedStyleListener(
117
61
  cell as HTMLElement,
118
62
  ) as CellMetadata | undefined;
119
63
 
120
- if (metadata) {
64
+ if (
65
+ metadata &&
66
+ (metadata.type === "body" ||
67
+ metadata.type === "row_header")
68
+ ) {
121
69
  const isHeader = cell.tagName === "TH";
122
70
  bodyCells.push({
123
71
  element: cell as HTMLElement,
@@ -152,67 +100,18 @@ export function createConsolidatedStyleListener(
152
100
  }
153
101
  }
154
102
 
155
- this._applyBodyCellStyles(
103
+ applyBodyCellStyles(
104
+ model,
156
105
  bodyCells,
157
106
  plugins,
158
107
  isSettingsOpen,
159
108
  isSelectable,
160
109
  isEditable,
161
110
  regularTable,
162
- selectedRowsMap,
163
- selectedPositionMap,
164
- viewer,
165
111
  );
166
112
 
167
- this._applyGroupHeaderStyles(groupHeaderRows, regularTable);
168
- this._applyColumnHeaderStyles(groupHeaderRows, regularTable, viewer);
169
- this._applyFocusStyle(bodyCells, regularTable, selectedPositionMap);
113
+ applyGroupHeaderStyles(model, groupHeaderRows, regularTable);
114
+ applyColumnHeaderStyles(model, groupHeaderRows, regularTable, viewer);
115
+ applyFocusStyle(model, bodyCells, regularTable, selectedPositionMap);
170
116
  };
171
117
  }
172
-
173
- declare module "../types.js" {
174
- interface DatagridModel {
175
- _applyBodyCellStyles(
176
- cells: CollectedCell[],
177
- plugins: ColumnsConfig,
178
- isSettingsOpen: boolean,
179
- isSelectable: boolean,
180
- isEditable: boolean,
181
- regularTable: RegularTableElement,
182
- selectedRowsMap: LocalSelectedRowsMap,
183
- selectedPositionMap: LocalSelectedPositionMap,
184
- viewer: PerspectiveViewerElement,
185
- ): void;
186
- _applyGroupHeaderStyles(
187
- headerRows: CollectedHeaderRow[],
188
- regularTable: RegularTableElement,
189
- ): void;
190
- _applyColumnHeaderStyles(
191
- headerRows: CollectedHeaderRow[],
192
- regularTable: RegularTableElement,
193
- viewer: PerspectiveViewerElement,
194
- ): void;
195
- _applyFocusStyle(
196
- cells: CollectedCell[],
197
- regularTable: RegularTableElement,
198
- selectedPositionMap: LocalSelectedPositionMap,
199
- ): void;
200
- _styleColumnHeaderRow(
201
- headerRow: CollectedHeaderRow,
202
- regularTable: RegularTableElement,
203
- is_menu_row: boolean,
204
- ): void;
205
- }
206
- }
207
-
208
- /**
209
- * Install the styling methods on the DatagridModel prototype.
210
- * This should be called once during module initialization.
211
- */
212
- export function installConsolidatedStyleMethods(modelPrototype: any): void {
213
- modelPrototype._applyBodyCellStyles = applyBodyCellStyles;
214
- modelPrototype._applyGroupHeaderStyles = applyGroupHeaderStyles;
215
- modelPrototype._applyColumnHeaderStyles = applyColumnHeaderStyles;
216
- modelPrototype._applyFocusStyle = applyFocusStyle;
217
- modelPrototype._styleColumnHeaderRow = styleColumnHeaderRow;
218
- }
@@ -12,7 +12,9 @@
12
12
 
13
13
  import { RegularTableElement } from "regular-table";
14
14
 
15
- import type { DatagridModel, PerspectiveViewerElement } from "../types.js";
15
+ import type { DatagridModel } from "../types.js";
16
+ import type { HTMLPerspectiveViewerElement } from "@perspective-dev/viewer";
17
+ import { styleColumnHeaderRow } from "./column_header.js";
16
18
 
17
19
  import { CollectedHeaderRow } from "./types.js";
18
20
 
@@ -20,15 +22,15 @@ import { CollectedHeaderRow } from "./types.js";
20
22
  * Apply styles to column header rows.
21
23
  */
22
24
  export function applyColumnHeaderStyles(
23
- this: DatagridModel,
25
+ model: DatagridModel,
24
26
  headerRows: CollectedHeaderRow[],
25
27
  regularTable: RegularTableElement,
26
- viewer: PerspectiveViewerElement,
28
+ viewer: HTMLPerspectiveViewerElement,
27
29
  ): void {
28
30
  if (headerRows.length === 0) return;
29
31
 
30
32
  // Style selected column for settings panel
31
- const selectedColumn = this._column_settings_selected_column;
33
+ const selectedColumn = model._column_settings_selected_column;
32
34
  const len = headerRows.length;
33
35
  const settings_open = viewer.hasAttribute("settings");
34
36
 
@@ -76,19 +78,19 @@ export function applyColumnHeaderStyles(
76
78
  }
77
79
 
78
80
  // Style the actual column header rows
79
- const colHeadersIndex = this._config.split_by.length;
81
+ const colHeadersIndex = model._config.split_by.length;
80
82
  if (colHeadersIndex < headerRows.length) {
81
83
  const colHeaders = headerRows[colHeadersIndex];
82
84
  if (colHeaders) {
83
- this._styleColumnHeaderRow(colHeaders, regularTable, false);
85
+ styleColumnHeaderRow(model, colHeaders, regularTable, false);
84
86
  }
85
87
  }
86
88
 
87
- const menuHeadersIndex = this._config.split_by.length + 1;
89
+ const menuHeadersIndex = model._config.split_by.length + 1;
88
90
  if (menuHeadersIndex < headerRows.length) {
89
91
  const menuHeaders = headerRows[menuHeadersIndex];
90
92
  if (menuHeaders) {
91
- this._styleColumnHeaderRow(menuHeaders, regularTable, true);
93
+ styleColumnHeaderRow(model, menuHeaders, regularTable, true);
92
94
  }
93
95
  }
94
96
  }
@@ -11,18 +11,18 @@
11
11
  // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
12
 
13
13
  import { RegularTableElement } from "regular-table";
14
- import type { DatagridModel, SelectedPosition } from "../types.js";
15
- import { CollectedCell, LocalSelectedPositionMap } from "./types.js";
14
+ import type { DatagridModel, SelectedPositionMap } from "../types.js";
15
+ import { CollectedCell } from "./types.js";
16
16
 
17
17
  /**
18
18
  * Apply focus style to the selected cell.
19
19
  * Optimized to use collected cells instead of querySelectorAll.
20
20
  */
21
21
  export function applyFocusStyle(
22
- this: DatagridModel,
22
+ _model: DatagridModel,
23
23
  cells: CollectedCell[],
24
24
  regularTable: RegularTableElement,
25
- selectedPositionMap: LocalSelectedPositionMap,
25
+ selectedPositionMap: SelectedPositionMap,
26
26
  ): void {
27
27
  const selected_position = selectedPositionMap.get(regularTable);
28
28
  const host = regularTable.getRootNode() as Document;
@@ -60,7 +60,7 @@ export function applyFocusStyle(
60
60
  */
61
61
  export function focusSelectedCell(
62
62
  regularTable: RegularTableElement,
63
- selectedPositionMap: Map<RegularTableElement, SelectedPosition>,
63
+ selectedPositionMap: SelectedPositionMap,
64
64
  ): boolean {
65
65
  const selected_position = selectedPositionMap.get(regularTable);
66
66
  if (!selected_position) {
@@ -19,11 +19,11 @@ import { CollectedHeaderRow } from "./types.js";
19
19
  * Apply styles to group header rows.
20
20
  */
21
21
  export function applyGroupHeaderStyles(
22
- this: DatagridModel,
22
+ model: DatagridModel,
23
23
  headerRows: CollectedHeaderRow[],
24
24
  regularTable: RegularTableElement,
25
25
  ): void {
26
- const header_depth = this._config.group_by.length;
26
+ const header_depth = model._config.group_by.length;
27
27
  const m: boolean[][] = [];
28
28
  let marked = new Set<number>();
29
29
 
@@ -54,6 +54,7 @@ export function applyGroupHeaderStyles(
54
54
  );
55
55
 
56
56
  td.classList.toggle("psp-color-mode-bar", false);
57
+ td.classList.toggle("psp-color-mode-label-bar", false);
57
58
  td.classList.toggle("psp-header-sort-asc", false);
58
59
  td.classList.toggle("psp-header-sort-desc", false);
59
60
  td.classList.toggle("psp-header-sort-col-asc", false);
@@ -14,7 +14,7 @@ import { CellMetadata } from "regular-table/dist/esm/types.js";
14
14
  import type { DatagridModel, ColumnConfig, ColorRecord } from "../../types.js";
15
15
 
16
16
  export function cell_style_boolean(
17
- this: DatagridModel,
17
+ model: DatagridModel,
18
18
  _plugin: ColumnConfig | undefined,
19
19
  td: HTMLElement,
20
20
  metadata: CellMetadata,
@@ -26,9 +26,9 @@ export function cell_style_boolean(
26
26
  } else {
27
27
  const [hex]: ColorRecord | [string, number, number, number, string] =
28
28
  metadata.user === true
29
- ? this._pos_fg_color
29
+ ? model._pos_fg_color
30
30
  : metadata.user === false
31
- ? this._neg_fg_color
31
+ ? model._neg_fg_color
32
32
  : ["", 0, 0, 0, ""];
33
33
  td.style.backgroundColor = "";
34
34
  td.style.color = hex;
@@ -14,14 +14,14 @@ import { CellMetadataBody } from "regular-table/dist/esm/types.js";
14
14
  import type { DatagridModel, ColorRecord } from "../../types.js";
15
15
 
16
16
  export function style_cell_flash(
17
- this: DatagridModel,
17
+ model: DatagridModel,
18
18
  metadata: CellMetadataBody,
19
19
  td: HTMLElement,
20
20
  [, , , , , pos_s, pos_e]: ColorRecord,
21
21
  [, , , , , neg_s, neg_e]: ColorRecord,
22
22
  is_settings_open: boolean,
23
23
  ): void {
24
- const id = this._ids?.[metadata.dy ?? 0]?.join("|");
24
+ const id = model._ids?.[metadata.dy ?? 0]?.join("|");
25
25
  const metadata_path = (
26
26
  is_settings_open
27
27
  ? (metadata.column_header ?? []).slice(0, -1)
@@ -29,19 +29,19 @@ export function style_cell_flash(
29
29
  ).join("|");
30
30
 
31
31
  if (
32
- this.last_reverse_columns?.has(metadata_path) &&
33
- this.last_reverse_ids?.has(id)
32
+ model.last_reverse_columns?.has(metadata_path) &&
33
+ model.last_reverse_ids?.has(id)
34
34
  ) {
35
- const row_idx = this.last_reverse_ids?.get(id);
36
- const col_idx = this.last_reverse_columns.get(metadata_path);
37
- if (!this._is_old_viewport) {
35
+ const row_idx = model.last_reverse_ids?.get(id);
36
+ const col_idx = model.last_reverse_columns.get(metadata_path);
37
+ if (!model._is_old_viewport) {
38
38
  td.style.animation = "";
39
39
  } else if (
40
40
  col_idx !== undefined &&
41
41
  row_idx !== undefined &&
42
- (this.last_meta?.[col_idx]?.[row_idx] as number | undefined) !==
42
+ (model.last_meta?.[col_idx]?.[row_idx] as number | undefined) !==
43
43
  undefined &&
44
- (this.last_meta![col_idx]![row_idx] as number) >
44
+ (model.last_meta![col_idx]![row_idx] as number) >
45
45
  ((metadata.user ?? 0) as number)
46
46
  ) {
47
47
  td.style.setProperty("--pulse--background-color-start", neg_s);
@@ -54,9 +54,9 @@ export function style_cell_flash(
54
54
  } else if (
55
55
  col_idx !== undefined &&
56
56
  row_idx !== undefined &&
57
- (this.last_meta?.[col_idx]?.[row_idx] as number | undefined) !==
57
+ (model.last_meta?.[col_idx]?.[row_idx] as number | undefined) !==
58
58
  undefined &&
59
- (this.last_meta![col_idx]![row_idx] as number) <
59
+ (model.last_meta![col_idx]![row_idx] as number) <
60
60
  ((metadata.user ?? 0) as number)
61
61
  ) {
62
62
  td.style.setProperty("--pulse--background-color-start", pos_s);
@@ -17,20 +17,23 @@ import {
17
17
  } from "../../color_utils.js";
18
18
  import type { DatagridModel, ColumnConfig, ColorRecord } from "../../types.js";
19
19
 
20
+ interface PluginWithColor extends Omit<ColumnConfig, "color"> {
21
+ color?: ColorRecord;
22
+ }
23
+
20
24
  export function cell_style_datetime(
21
- this: DatagridModel,
22
- plugin: ColumnConfig,
25
+ model: DatagridModel,
26
+ plugin: PluginWithColor,
23
27
  td: HTMLElement,
24
28
  metadata: CellMetadata,
25
29
  ): void {
26
- const colorRecord: ColorRecord = //(() => {
27
- // if (plugin?.color !== undefined) {
28
- // return plugin.color;
29
- // } else {
30
- // return
31
- this._color;
32
- // }
33
- // })();
30
+ const colorRecord: ColorRecord = (() => {
31
+ if (plugin?.color !== undefined) {
32
+ return plugin.color;
33
+ } else {
34
+ return model._color;
35
+ }
36
+ })();
34
37
 
35
38
  const [hex, r, g, b] = colorRecord;
36
39
 
@@ -48,7 +51,7 @@ export function cell_style_datetime(
48
51
  plugin?.datetime_color_mode === "background" &&
49
52
  metadata.user !== null
50
53
  ) {
51
- const source = this._plugin_background as [number, number, number];
54
+ const source = model._plugin_background as [number, number, number];
52
55
  const foreground = infer_foreground_from_background(
53
56
  rgbaToRgb([r, g, b, 1], source),
54
57
  );
@@ -36,7 +36,7 @@ interface PluginWithColors
36
36
  }
37
37
 
38
38
  export function cell_style_numeric(
39
- this: DatagridModel,
39
+ model: DatagridModel,
40
40
  plugin: PluginWithColors | undefined,
41
41
  td: HTMLElement,
42
42
  metadata: CellMetaWithExtras,
@@ -49,14 +49,14 @@ export function cell_style_numeric(
49
49
  if (plugin?.pos_bg_color !== undefined) {
50
50
  pos_bg_color = plugin.pos_bg_color;
51
51
  } else {
52
- pos_bg_color = this._pos_bg_color;
52
+ pos_bg_color = model._pos_bg_color;
53
53
  }
54
54
 
55
55
  let neg_bg_color: ColorRecord;
56
56
  if (plugin?.neg_bg_color !== undefined) {
57
57
  neg_bg_color = plugin.neg_bg_color;
58
58
  } else {
59
- neg_bg_color = this._neg_bg_color;
59
+ neg_bg_color = model._neg_bg_color;
60
60
  }
61
61
 
62
62
  const bg_tuple: ColorRecord = is_positive
@@ -65,9 +65,9 @@ export function cell_style_numeric(
65
65
  ? neg_bg_color
66
66
  : [
67
67
  "",
68
- this._plugin_background[0],
69
- this._plugin_background[1],
70
- this._plugin_background[2],
68
+ model._plugin_background[0],
69
+ model._plugin_background[1],
70
+ model._plugin_background[2],
71
71
  "",
72
72
  "",
73
73
  "",
@@ -91,7 +91,7 @@ export function cell_style_numeric(
91
91
  Math.abs((metadata.user ?? 0) / (plugin.bg_gradient ?? 1)),
92
92
  ),
93
93
  );
94
- const source = this._plugin_background as [number, number, number];
94
+ const source = model._plugin_background as [number, number, number];
95
95
  const foreground = infer_foreground_from_background(
96
96
  rgbaToRgb([r, g, b, a], source),
97
97
  );
@@ -100,8 +100,8 @@ export function cell_style_numeric(
100
100
  td.style.color = foreground;
101
101
  td.style.backgroundColor = `rgba(${r},${g},${b},${a})`;
102
102
  } else if (plugin?.number_bg_mode === "pulse") {
103
- style_cell_flash.call(
104
- this,
103
+ style_cell_flash(
104
+ model,
105
105
  metadata as any,
106
106
  td,
107
107
  pos_bg_color,
@@ -129,23 +129,23 @@ export function cell_style_numeric(
129
129
  ? plugin.neg_fg_color!
130
130
  : [
131
131
  "",
132
- this._plugin_background[0],
133
- this._plugin_background[1],
134
- this._plugin_background[2],
132
+ model._plugin_background[0],
133
+ model._plugin_background[1],
134
+ model._plugin_background[2],
135
135
  "",
136
136
  "",
137
137
  "",
138
138
  ];
139
139
  } else {
140
140
  return is_positive
141
- ? this._pos_fg_color
141
+ ? model._pos_fg_color
142
142
  : is_negative
143
- ? this._neg_fg_color
143
+ ? model._neg_fg_color
144
144
  : [
145
145
  "",
146
- this._plugin_background[0],
147
- this._plugin_background[1],
148
- this._plugin_background[2],
146
+ model._plugin_background[0],
147
+ model._plugin_background[1],
148
+ model._plugin_background[2],
149
149
  "",
150
150
  "",
151
151
  "",
@@ -160,7 +160,7 @@ export function cell_style_numeric(
160
160
  td.style.color = "";
161
161
  } else if (plugin?.number_fg_mode === "disabled") {
162
162
  if (plugin?.number_bg_mode === "color") {
163
- const source = this._plugin_background as [number, number, number];
163
+ const source = model._plugin_background as [number, number, number];
164
164
  const foreground = infer_foreground_from_background(
165
165
  rgbaToRgb([bg_tuple[1], bg_tuple[2], bg_tuple[3], 1], source),
166
166
  );
@@ -173,13 +173,12 @@ export function cell_style_numeric(
173
173
  } else if (plugin?.number_fg_mode === "bar") {
174
174
  td.style.color = "";
175
175
  td.style.position = "relative";
176
- if (
177
- gradhex !== "" &&
178
- td.children.length > 0 &&
179
- td.children[0].nodeType === Node.ELEMENT_NODE
180
- ) {
181
- (td.children[0] as HTMLElement).style.background = gradhex;
182
- }
176
+ td.style.setProperty("--psp-label-bar-color", gradhex);
177
+ td.style.setProperty("--psp-label-bar-bg", hex);
178
+ } else if (plugin?.number_fg_mode === "label-bar") {
179
+ td.style.color = "";
180
+ td.style.setProperty("--psp-label-bar-color", gradhex);
181
+ td.style.setProperty("--psp-label-bar-bg", hex);
183
182
  } else if (plugin?.number_fg_mode === "color" || !plugin?.number_fg_mode) {
184
183
  td.style.color = hex;
185
184
  }
@@ -18,7 +18,7 @@ import type { DatagridModel } from "../../types.js";
18
18
  import { RegularTableElement } from "regular-table";
19
19
 
20
20
  export function cell_style_row_header(
21
- this: DatagridModel,
21
+ model: DatagridModel,
22
22
  regularTable: RegularTableElement,
23
23
  td: HTMLElement,
24
24
  metadata: CellMetadataRowHeader,
@@ -28,7 +28,7 @@ export function cell_style_row_header(
28
28
  metadata.value !== null &&
29
29
  metadata.value?.toString()?.trim().length > 0;
30
30
  const is_leaf =
31
- (metadata.row_header_x ?? 0) >= this._config.group_by.length;
31
+ (metadata.row_header_x ?? 0) >= model._config.group_by.length;
32
32
  const next = regularTable.getMeta({
33
33
  dx: 0,
34
34
  dy: (metadata.y ?? 0) - (metadata.y0 ?? 0) + 1,
@@ -10,10 +10,13 @@
10
10
  // ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
11
  // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
12
 
13
- import chroma from "chroma-js";
14
13
  import {
15
- rgbaToRgb,
14
+ hslToRgb,
16
15
  infer_foreground_from_background,
16
+ parseColor,
17
+ rgbaToRgb,
18
+ rgbToHex,
19
+ rgbToHsl,
17
20
  } from "../../color_utils.js";
18
21
  import type { DatagridModel, ColumnConfig, ColorRecord } from "../../types.js";
19
22
 
@@ -28,17 +31,17 @@ interface PluginWithColor extends Omit<ColumnConfig, "color"> {
28
31
  }
29
32
 
30
33
  export function cell_style_string(
31
- this: DatagridModel,
34
+ model: DatagridModel,
32
35
  plugin: PluginWithColor | undefined,
33
36
  td: HTMLElement,
34
37
  metadata: CellMetaWithExtras,
35
38
  ): void {
36
- const column_name = metadata.column_header?.[this._config.split_by.length];
39
+ const column_name = metadata.column_header?.[model._config.split_by.length];
37
40
  const colorRecord: ColorRecord = (() => {
38
41
  if (plugin?.color !== undefined) {
39
42
  return plugin.color;
40
43
  } else {
41
- return this._color;
44
+ return model._color;
42
45
  }
43
46
  })();
44
47
 
@@ -60,7 +63,7 @@ export function cell_style_string(
60
63
  plugin?.string_color_mode === "background" &&
61
64
  metadata.user !== null
62
65
  ) {
63
- const source = this._plugin_background as [number, number, number];
66
+ const source = model._plugin_background as [number, number, number];
64
67
  const foreground = infer_foreground_from_background(
65
68
  rgbaToRgb([r, g, b, 1], source),
66
69
  );
@@ -71,25 +74,24 @@ export function cell_style_string(
71
74
  metadata.user !== null &&
72
75
  column_name
73
76
  ) {
74
- if (!this._series_color_map.has(column_name)) {
75
- this._series_color_map.set(column_name, new Map());
76
- this._series_color_seed.set(column_name, 0);
77
+ if (!model._series_color_map.has(column_name)) {
78
+ model._series_color_map.set(column_name, new Map());
79
+ model._series_color_seed.set(column_name, 0);
77
80
  }
78
81
 
79
- const series_map = this._series_color_map.get(column_name)!;
82
+ const series_map = model._series_color_map.get(column_name)!;
80
83
  if (metadata.user && !series_map.has(metadata.user)) {
81
- const seed = this._series_color_seed.get(column_name) ?? 0;
84
+ const seed = model._series_color_seed.get(column_name) ?? 0;
82
85
  series_map.set(metadata.user, seed);
83
- this._series_color_seed.set(column_name, seed + 1);
86
+ model._series_color_seed.set(column_name, seed + 1);
84
87
  }
85
88
 
86
89
  const color_seed = series_map.get(metadata.user!) ?? 0;
87
- let [h, s, l] = chroma(hex).hsl();
88
- h = h + ((color_seed * 150) % 360);
89
- const color2 = chroma(h, s, l, "hsl");
90
- const [r2, g2, b2] = color2.rgb();
91
- const hex2 = color2.hex();
92
- const source = this._plugin_background as [number, number, number];
90
+ const [h, s, l] = rgbToHsl(parseColor(hex));
91
+ const rotated = hslToRgb([h + ((color_seed * 150) % 360), s, l]);
92
+ const [r2, g2, b2] = rotated;
93
+ const hex2 = rgbToHex(rotated);
94
+ const source = model._plugin_background as [number, number, number];
93
95
  const foreground = infer_foreground_from_background(
94
96
  rgbaToRgb([r2, g2, b2, 1], source),
95
97
  );
@@ -10,13 +10,11 @@
10
10
  // ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
11
  // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
12
 
13
- import { RegularTableElement } from "regular-table";
14
13
  import {
15
14
  CellMetadata,
16
15
  CellMetadataBody,
17
16
  CellMetadataRowHeader,
18
17
  } from "regular-table/dist/esm/types.js";
19
- import type { SelectedPosition } from "../types.js";
20
18
 
21
19
  export interface CollectedCell {
22
20
  element: HTMLElement;
@@ -31,11 +29,3 @@ export interface CollectedHeaderRow {
31
29
  metadata: CellMetadata | undefined;
32
30
  }>;
33
31
  }
34
-
35
- // Local types for selection maps - match the actual runtime usage
36
- // (activate.ts uses `as any` casts when passing these)
37
- export type LocalSelectedRowsMap = WeakMap<RegularTableElement, unknown[]>;
38
- export type LocalSelectedPositionMap = WeakMap<
39
- RegularTableElement,
40
- SelectedPosition
41
- >;