argent-grid 0.2.0 → 0.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 (55) hide show
  1. package/AGENTS.md +70 -27
  2. package/e2e/advanced.spec.ts +1 -1
  3. package/e2e/benchmark.spec.ts +7 -7
  4. package/e2e/cell-renderers.spec.ts +152 -0
  5. package/e2e/debug-streaming.spec.ts +31 -0
  6. package/e2e/dnd.spec.ts +73 -0
  7. package/e2e/screenshots.spec.ts +1 -1
  8. package/e2e/visual.spec.ts +30 -9
  9. package/e2e/visual.spec.ts-snapshots/checkbox-renderer-mixed.png +0 -0
  10. package/e2e/visual.spec.ts-snapshots/debug.png +0 -0
  11. package/e2e/visual.spec.ts-snapshots/grid-column-group-headers.png +0 -0
  12. package/e2e/visual.spec.ts-snapshots/grid-default.png +0 -0
  13. package/e2e/visual.spec.ts-snapshots/grid-empty-state.png +0 -0
  14. package/e2e/visual.spec.ts-snapshots/grid-filter-popup.png +0 -0
  15. package/e2e/visual.spec.ts-snapshots/grid-scroll-borders.png +0 -0
  16. package/e2e/visual.spec.ts-snapshots/grid-sidebar-buttons.png +0 -0
  17. package/e2e/visual.spec.ts-snapshots/grid-text-filter.png +0 -0
  18. package/e2e/visual.spec.ts-snapshots/grid-with-selection.png +0 -0
  19. package/e2e/visual.spec.ts-snapshots/rating-renderer-varied.png +0 -0
  20. package/package.json +5 -5
  21. package/plan.md +30 -34
  22. package/src/lib/components/argent-grid.component.css +258 -549
  23. package/src/lib/components/argent-grid.component.html +272 -306
  24. package/src/lib/components/argent-grid.component.ts +585 -135
  25. package/src/lib/components/argent-grid.regressions.spec.ts +301 -0
  26. package/src/lib/components/argent-grid.selection.spec.ts +2 -2
  27. package/src/lib/components/set-filter/set-filter.component.spec.ts +191 -0
  28. package/src/lib/components/set-filter/set-filter.component.ts +7 -2
  29. package/src/lib/rendering/canvas-renderer.spec.ts +148 -1
  30. package/src/lib/rendering/canvas-renderer.ts +177 -286
  31. package/src/lib/rendering/render/cells.ts +122 -5
  32. package/src/lib/rendering/render/column-utils.ts +27 -5
  33. package/src/lib/rendering/render/hit-test.ts +6 -11
  34. package/src/lib/rendering/render/index.ts +15 -6
  35. package/src/lib/rendering/render/lines.ts +12 -6
  36. package/src/lib/rendering/render/primitives.ts +269 -7
  37. package/src/lib/rendering/render/types.ts +2 -1
  38. package/src/lib/rendering/render/walk.ts +39 -19
  39. package/src/lib/services/grid.service.spec.ts +76 -0
  40. package/src/lib/services/grid.service.ts +451 -114
  41. package/src/lib/themes/theme-quartz.ts +2 -2
  42. package/src/lib/types/ag-grid-types.ts +500 -0
  43. package/src/stories/Advanced.stories.ts +78 -17
  44. package/src/stories/ArgentGrid.stories.ts +50 -26
  45. package/src/stories/Benchmark.stories.ts +17 -15
  46. package/src/stories/CellRenderers.stories.ts +205 -31
  47. package/src/stories/Filtering.stories.ts +56 -16
  48. package/src/stories/Grouping.stories.ts +86 -13
  49. package/src/stories/Streaming.stories.ts +57 -0
  50. package/src/stories/Theming.stories.ts +23 -10
  51. package/src/stories/Tooltips.stories.ts +381 -0
  52. package/src/stories/benchmark-wrapper.component.ts +69 -29
  53. package/src/stories/story-utils.ts +88 -0
  54. package/src/stories/streaming-wrapper.component.ts +441 -0
  55. package/tsconfig.json +1 -0
@@ -1,21 +1,10 @@
1
1
  .argent-grid-container {
2
2
  box-sizing: border-box;
3
3
  position: relative;
4
- overflow: hidden;
5
4
  border: 1px solid var(--ag-border-color, #babed1);
6
5
  background: var(--ag-background-color, #fff);
7
- font-family: var(
8
- --ag-font-family,
9
- -apple-system,
10
- BlinkMacSystemFont,
11
- "Segoe UI",
12
- Roboto,
13
- Oxygen,
14
- Ubuntu,
15
- sans-serif
16
- );
17
- font-size: var(--ag-font-size, 14px);
18
- color: var(--ag-foreground-color, #181d1f);
6
+ font-family: sans-serif;
7
+ font-size: 14px;
19
8
  display: flex;
20
9
  flex-direction: column;
21
10
  }
@@ -24,7 +13,6 @@
24
13
  display: flex;
25
14
  flex: 1;
26
15
  overflow: hidden;
27
- width: 100%;
28
16
  }
29
17
 
30
18
  .argent-grid-content-area {
@@ -32,703 +20,424 @@
32
20
  display: flex;
33
21
  flex-direction: column;
34
22
  overflow: hidden;
35
- min-width: 0;
36
23
  }
37
24
 
38
- .argent-grid-side-bar {
39
- position: absolute;
40
- right: 0;
41
- top: 0;
42
- bottom: 0;
43
- z-index: 25; /* Higher than header z-index (20) */
44
- background: transparent;
25
+ .argent-grid-row-group-panel {
26
+ background: #f8f9fa;
27
+ border-bottom: 1px solid #babed1;
28
+ padding: 8px;
29
+ min-height: 40px;
45
30
  display: flex;
46
- flex-direction: row-reverse;
47
- transition: width 0.2s ease-in-out;
48
- pointer-events: none;
49
- width: 32px;
50
- }
51
-
52
- .argent-grid-side-bar.has-active-panel {
53
- width: 282px; /* 250px panel + 32px buttons */
31
+ gap: 8px;
32
+ align-items: center;
54
33
  }
55
34
 
56
- .side-bar-buttons {
57
- width: 32px;
35
+ .row-group-pill {
36
+ background: #2196f3;
37
+ color: white;
38
+ padding: 4px 8px;
39
+ border-radius: 4px;
58
40
  display: flex;
59
- flex-direction: column;
60
- pointer-events: none;
61
- height: 100%;
62
- border-left: 1px solid var(--ag-border-color, #babed1);
63
- padding-top: 32px; /* Start below the header row */
41
+ gap: 4px;
64
42
  }
65
43
 
66
- .side-bar-button {
67
- writing-mode: vertical-rl;
68
- padding: 12px 8px;
69
- cursor: pointer;
70
- font-size: 12px;
71
- color: var(--ag-secondary-foreground-color, #666);
72
- border-bottom: 1px solid var(--ag-border-color, #ddd);
73
- background: var(--ag-background-color, #f4f4f4);
74
- pointer-events: auto;
44
+ .argent-grid-header {
45
+ background: #f8f9fa;
46
+ border-bottom: 1px solid #babed1;
47
+ box-sizing: border-box;
75
48
  }
76
49
 
77
- .side-bar-button:hover {
78
- background: var(--ag-background-color, #fff);
50
+ .argent-grid-header * {
51
+ box-sizing: border-box;
79
52
  }
80
53
 
81
- .side-bar-button.active {
82
- background: var(--ag-background-color, #fff);
83
- border-left: 2px solid var(--ag-selected-row-background-color, #2196f3);
84
- color: var(--ag-selected-row-background-color, #2196f3);
85
- font-weight: bold;
54
+ .argent-grid-header-main {
55
+ display: flex;
86
56
  }
87
57
 
88
- .tool-panel-content {
89
- width: 250px;
90
- padding: 12px;
91
- padding-top: 32px; /* Start below the header row */
92
- overflow-y: auto;
93
- background: var(--ag-background-color, #fff);
94
- pointer-events: auto;
95
- border-left: 1px solid var(--ag-border-color, #babed1);
96
- box-shadow: -5px 0 10px rgba(0, 0, 0, 0.05);
58
+ .argent-grid-header-pinned-left-container {
59
+ display: flex;
97
60
  }
98
61
 
99
- .tool-panel-content h3 {
100
- margin: 0 0 12px 0;
101
- font-size: 14px;
102
- color: var(--ag-foreground-color, #333);
103
- border-bottom: 1px solid var(--ag-border-color, #eee);
104
- padding-bottom: 8px;
62
+ .argent-grid-header-pinned-right-container {
63
+ display: flex;
105
64
  }
106
65
 
107
- .column-item {
66
+ .argent-grid-header-scrollable {
67
+ flex: 1;
68
+ overflow: hidden;
108
69
  display: flex;
109
- align-items: center;
110
- padding: 6px 8px;
111
- gap: 8px;
112
- background: var(--ag-background-color, #fff);
113
- border-bottom: 1px solid var(--ag-border-color, #f0f0f0);
114
- cursor: default;
115
70
  }
116
71
 
117
- .column-item:last-child {
118
- border-bottom: none;
72
+ .argent-grid-header-scrollable-content {
73
+ display: flex;
119
74
  }
120
75
 
121
- .column-drag-handle {
122
- cursor: grab;
123
- color: var(--ag-secondary-foreground-color, #ccc);
124
- font-size: 14px;
76
+ .argent-grid-header-cell {
77
+ box-sizing: border-box;
78
+ padding: 8px 12px;
79
+ border-right: 1px solid #babed1;
80
+ min-width: 50px;
81
+ cursor: default;
82
+ background: white;
125
83
  user-select: none;
126
84
  display: flex;
127
85
  align-items: center;
86
+ position: relative;
87
+ overflow: visible;
128
88
  }
129
89
 
130
- .column-drag-handle:active {
131
- cursor: grabbing;
90
+ .argent-grid-header-cell.sortable {
91
+ cursor: pointer;
132
92
  }
133
93
 
134
- .column-label {
135
- flex: 1;
136
- font-size: 12px;
137
- color: var(--ag-foreground-color, #333);
138
- overflow: hidden;
139
- text-overflow: ellipsis;
140
- white-space: nowrap;
94
+ .argent-grid-header-group-cell {
95
+ border-bottom: 1px solid #babed1;
96
+ font-weight: 600;
97
+ justify-content: center;
141
98
  }
142
99
 
143
- /* CDK Drag & Drop Sidebar Styles */
144
- .sidebar-drag-preview {
145
- box-sizing: border-box;
146
- border-radius: 4px;
147
- box-shadow:
148
- 0 5px 5px -3px rgba(0, 0, 0, 0.2),
149
- 0 8px 10px 1px rgba(0, 0, 0, 0.14),
150
- 0 3px 14px 2px rgba(0, 0, 0, 0.12);
100
+ .argent-grid-header-content {
101
+ flex: 1;
151
102
  display: flex;
152
103
  align-items: center;
153
- padding: 8px 12px;
154
- background: var(--ag-background-color, white);
155
- z-index: 10001;
156
- gap: 8px;
157
- color: var(--ag-foreground-color, #181d1f);
158
- }
159
-
160
- .sidebar-drag-placeholder {
161
- opacity: 0.3;
162
- background: var(--ag-border-color, #e0e0e0);
163
- }
164
-
165
- .column-list.cdk-drop-list-dragging .column-item:not(.cdk-drag-placeholder) {
166
- transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
167
- }
168
-
169
- .column-item input {
170
- margin: 0;
104
+ overflow: hidden;
105
+ gap: 4px;
171
106
  }
172
107
 
173
- .argent-grid-container *,
174
- .argent-grid-container *:before,
175
- .argent-grid-container *:after {
176
- box-sizing: inherit;
108
+ .argent-grid-floating-filter-cell {
109
+ box-sizing: border-box;
110
+ padding: 4px;
111
+ border-right: 1px solid #babed1;
177
112
  }
178
113
 
179
- .argent-grid-header {
180
- border-bottom: 1px solid var(--ag-border-color, #babed1);
181
- background: var(--ag-header-background-color, #f8f9fa);
182
- color: var(--ag-header-foreground-color, #181d1f);
183
- font-weight: 600;
184
- position: relative;
185
- z-index: 20;
114
+ .floating-filter-row {
186
115
  display: flex;
187
- flex-direction: column;
116
+ border-top: 1px solid #babed1;
117
+ background: #f8f9fa;
188
118
  }
189
119
 
190
120
  .argent-grid-header-row {
191
121
  display: flex;
192
- white-space: nowrap;
193
- }
194
-
195
- .argent-grid-header-scrollable {
196
- overflow: hidden;
197
- flex: 1;
198
- display: flex;
199
- }
200
-
201
- .argent-grid-header-scrollable .argent-grid-header-row {
202
- flex: 1;
203
122
  }
204
123
 
205
- .argent-grid-header-pinned-left-container,
206
- .argent-grid-header-pinned-right-container {
124
+ .floating-filter-container {
125
+ width: 100%;
126
+ height: 100%;
207
127
  display: flex;
128
+ align-items: center;
129
+ position: relative;
208
130
  }
209
131
 
210
- .cdk-drag-preview {
132
+ .floating-filter-input {
133
+ width: 100%;
134
+ height: 24px;
211
135
  box-sizing: border-box;
136
+ padding: 2px 20px 2px 4px;
137
+ border: 1px solid #ccc;
212
138
  border-radius: 4px;
213
- box-shadow:
214
- 0 5px 5px -3px rgba(0, 0, 0, 0.2),
215
- 0 8px 10px 1px rgba(0, 0, 0, 0.14),
216
- 0 3px 14px 2px rgba(0, 0, 0, 0.12);
217
- background: var(--ag-background-color, #f5f5f5);
218
- display: flex;
219
- align-items: center;
220
- justify-content: center;
221
- padding: 8px 12px;
222
- font-weight: 600;
223
- opacity: 0.8;
224
- color: var(--ag-foreground-color, #181d1f);
225
- }
226
-
227
- .cdk-drag-placeholder {
228
- opacity: 0.3;
229
- }
230
-
231
- .cdk-drag-animating {
232
- transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
139
+ font-size: 12px;
233
140
  }
234
141
 
235
- .argent-grid-header-cell.cdk-drop-list-dragging
236
- .argent-grid-header-cell:not(.cdk-drag-placeholder) {
237
- transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
142
+ .floating-filter-clear {
143
+ position: absolute;
144
+ right: 6px;
145
+ cursor: pointer;
146
+ color: #999;
147
+ font-size: 12px;
238
148
  }
239
149
 
240
- .argent-grid-header-checkbox {
150
+ .floating-filter-btn {
151
+ width: 100%;
152
+ height: 24px;
241
153
  display: flex;
154
+ justify-content: space-between;
242
155
  align-items: center;
243
- justify-content: center;
244
- margin-right: 8px;
245
- flex-shrink: 0;
156
+ padding: 0 8px;
157
+ background: white;
158
+ border: 1px solid #ccc;
159
+ border-radius: 4px;
160
+ font-size: 12px;
161
+ cursor: pointer;
246
162
  }
247
163
 
248
- .argent-grid-header-cell.center-content .argent-grid-header-checkbox {
249
- margin-right: 0;
164
+ .argent-grid-header-scrollbar-spacer {
165
+ background: #f8f9fa;
166
+ border-left: 1px solid #babed1;
167
+ flex-shrink: 0;
250
168
  }
251
169
 
252
- .argent-grid-header-cell.center-content {
170
+ .argent-grid-header-menu-icon {
171
+ padding: 0 4px;
172
+ cursor: pointer;
173
+ color: #666;
174
+ font-size: 16px;
175
+ display: flex;
176
+ align-items: center;
253
177
  justify-content: center;
178
+ border-radius: 2px;
179
+ z-index: 2;
254
180
  }
255
181
 
256
- .argent-grid-header-cell.center-content .argent-grid-header-content {
257
- justify-content: center;
258
- flex: none; /* Don't grow so parent's justify-content works better, or just center inside */
259
- width: 100%;
182
+ .argent-grid-header-menu-icon:hover {
183
+ background: #eee;
260
184
  }
261
185
 
262
- .argent-grid-header-checkbox input {
263
- margin: 0;
186
+ .argent-grid-header-filter-icon {
187
+ padding: 0 4px;
264
188
  cursor: pointer;
265
- width: 14px;
266
- height: 14px;
267
- }
268
-
269
- .argent-grid-header-cell {
270
- padding: 4px 12px;
271
- border-right: 1px solid var(--ag-border-color, #babed1);
189
+ color: #999;
272
190
  display: flex;
273
191
  align-items: center;
274
- justify-content: space-between;
275
- cursor: pointer;
276
- user-select: none;
192
+ justify-content: center;
193
+ border-radius: 2px;
194
+ z-index: 2;
277
195
  flex-shrink: 0;
278
- position: relative;
279
- min-height: 32px;
280
- color: var(--ag-header-foreground-color, #181d1f);
281
196
  }
282
197
 
283
- .argent-grid-header-cell:hover .argent-grid-header-menu-icon {
284
- opacity: 1;
285
- }
286
-
287
- .argent-grid-header-content {
288
- display: flex;
289
- align-items: center;
290
- overflow: hidden;
291
- flex: 1;
198
+ .argent-grid-header-filter-icon:hover {
199
+ background: #eee;
200
+ color: #333;
292
201
  }
293
202
 
294
- .header-text {
295
- overflow: hidden;
296
- text-overflow: ellipsis;
297
- padding-right: 4px;
203
+ .argent-grid-header-filter-icon.active {
204
+ color: #2563eb;
298
205
  }
299
206
 
300
- .argent-grid-header-menu-icon {
301
- opacity: 0;
302
- padding: 0 6px;
303
- color: var(--ag-secondary-foreground-color, #666);
304
- transition: opacity 0.2s;
305
- font-size: 16px;
306
- line-height: 1;
207
+ .argent-grid-header-filter-icon.active:hover {
208
+ background: #dbeafe;
209
+ color: #1d4ed8;
307
210
  }
308
211
 
309
- .argent-grid-header-menu-icon:hover {
310
- color: var(--ag-foreground-color, #000);
311
- background: var(--ag-row-hover-color, #e0e0e0);
312
- border-radius: 4px;
212
+ .argent-grid-header-menu {
213
+ position: absolute;
214
+ background: white;
215
+ border: 1px solid #babed1;
216
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
217
+ z-index: 1000;
218
+ min-width: 150px;
219
+ padding: 4px 0;
313
220
  }
314
221
 
315
- .argent-grid-header-resize-handle {
222
+ .set-filter-popup {
316
223
  position: absolute;
317
- right: 0;
318
- top: 0;
319
- bottom: 0;
320
- width: 4px;
321
- cursor: col-resize;
322
- z-index: 5;
323
- transition: background-color 0.2s;
324
- height: 100%;
224
+ background: white;
225
+ border: 1px solid #babed1;
226
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
227
+ z-index: 1000;
325
228
  }
326
229
 
327
- .argent-grid-header-resize-handle:hover,
328
- .argent-grid-header-resize-handle.resizing {
329
- background-color: var(--ag-selected-row-background-color, #2196f3);
230
+ .context-menu-popup {
231
+ position: absolute;
232
+ background: white;
233
+ border: 1px solid #babed1;
234
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
235
+ z-index: 1000;
236
+ min-width: 180px;
237
+ padding: 4px 0;
330
238
  }
331
239
 
332
- .argent-grid-header-cell-pinned-left {
333
- position: sticky;
334
- left: 0;
335
- z-index: 10;
336
- background: var(--ag-header-background-color, #f8f9fa);
240
+ .filter-popup {
241
+ position: absolute;
242
+ background: white;
243
+ border: 1px solid #babed1;
244
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
245
+ z-index: 1000;
246
+ min-width: 200px;
247
+ padding: 12px;
337
248
  }
338
249
 
339
- .argent-grid-header-cell-pinned-right {
340
- position: sticky;
341
- right: 0;
342
- z-index: 10;
343
- background: var(--ag-header-background-color, #f8f9fa);
250
+ .filter-popup-header {
251
+ font-weight: bold;
252
+ margin-bottom: 8px;
253
+ color: #333;
344
254
  }
345
255
 
346
- .argent-grid-header-cell.sortable:hover {
347
- background: var(--ag-row-hover-color, #e8e8e8);
256
+ .filter-operator-select {
257
+ width: 100%;
258
+ padding: 4px;
259
+ margin-bottom: 8px;
260
+ border: 1px solid #ccc;
261
+ border-radius: 4px;
348
262
  }
349
263
 
350
- .sort-indicator {
351
- margin-left: 4px;
352
- font-size: 12px;
353
- color: var(--ag-foreground-color, #181d1f);
354
- }
355
- .argent-grid-viewport {
356
- position: relative;
357
- overflow: auto;
358
- contain: strict;
359
- will-change: scroll-position;
360
- flex: 1;
361
- min-height: 0;
362
- background: var(--ag-background-color, #fff);
264
+ .filter-input-container {
265
+ margin-bottom: 8px;
363
266
  }
364
267
 
365
- .argent-grid-canvas {
366
- position: sticky;
367
- top: 0;
368
- left: 0;
369
- display: block;
268
+ .filter-input {
370
269
  width: 100%;
371
- image-rendering: -webkit-optimize-contrast;
372
- image-rendering: crisp-edges;
373
- z-index: 1;
374
- }
375
-
376
- .argent-grid-scroll-spacer {
377
- position: absolute;
378
- top: 0;
379
- left: 0;
380
- pointer-events: none;
381
- z-index: -1;
382
- background: var(--ag-background-color, #fff);
270
+ padding: 6px;
271
+ box-sizing: border-box;
272
+ border: 1px solid #ccc;
273
+ border-radius: 4px;
383
274
  }
384
275
 
385
- .argent-grid-overlay {
386
- position: absolute;
387
- top: 0;
388
- left: 0;
389
- right: 0;
390
- bottom: 0;
276
+ .filter-popup-footer {
277
+ margin-top: 12px;
391
278
  display: flex;
392
- align-items: center;
393
- justify-content: center;
394
- background: var(--ag-background-color, rgba(255, 255, 255, 0.9));
395
- z-index: 10;
396
- }
397
-
398
- .argent-grid-cell-editor {
399
- position: absolute;
400
- z-index: 100;
401
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
279
+ justify-content: flex-end;
402
280
  }
403
281
 
404
- .argent-grid-editor-input {
405
- width: 100%;
406
- height: 100%;
407
- border: 2px solid var(--ag-selected-row-background-color, #2196f3);
408
- outline: none;
409
- padding: 4px 8px;
410
- font-size: var(--ag-font-size, 13px);
411
- font-family: var(--ag-font-family, inherit);
412
- box-sizing: border-box;
413
- background: var(--ag-background-color, #fff);
414
- color: var(--ag-foreground-color, #181d1f);
282
+ .filter-clear-btn {
283
+ padding: 4px 12px;
284
+ background: #f0f0f0;
285
+ border: 1px solid #ccc;
286
+ border-radius: 4px;
287
+ cursor: pointer;
415
288
  }
416
289
 
417
- .argent-grid-header-menu,
418
- .argent-grid-context-menu {
419
- position: fixed;
420
- background: var(--ag-background-color, #ffffff);
421
- border: 1px solid var(--ag-border-color, #babed1);
422
- box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.2);
423
- border-radius: 3px;
424
- padding: 4px 0;
425
- z-index: 10000;
426
- min-width: 200px;
427
- font-size: 13px;
428
- color: var(--ag-foreground-color, #181d1f);
290
+ .filter-clear-btn:hover {
291
+ background: #e0e0e0;
429
292
  }
430
293
 
431
294
  .menu-item {
432
- padding: 6px 12px;
295
+ padding: 8px 12px;
433
296
  cursor: pointer;
434
297
  display: flex;
435
298
  align-items: center;
436
- position: relative;
437
- transition: background-color 0.1s;
299
+ gap: 8px;
300
+ white-space: nowrap;
438
301
  }
439
302
 
440
303
  .menu-item:hover {
441
- background-color: var(--ag-row-hover-color, #f0f2f5);
304
+ background: #f0f0f0;
442
305
  }
443
306
 
444
307
  .menu-item.disabled {
445
- color: var(--ag-secondary-foreground-color, #999);
308
+ color: #ccc;
446
309
  cursor: not-allowed;
447
310
  }
448
311
 
449
- .menu-item.disabled:hover {
450
- background-color: transparent;
451
- }
452
-
453
- .menu-text {
454
- flex: 1;
455
- }
456
-
457
- .menu-arrow {
458
- margin-left: 8px;
312
+ .menu-chevron {
313
+ margin-left: auto;
314
+ padding-left: 8px;
459
315
  font-size: 10px;
460
- color: var(--ag-secondary-foreground-color, #999);
316
+ color: #888;
461
317
  }
462
318
 
463
- /* Sub-menu styling */
464
- .menu-item:hover > .sub-menu {
465
- display: block;
319
+ .menu-item.has-submenu {
320
+ position: relative;
466
321
  }
467
322
 
468
323
  .sub-menu {
469
324
  display: none;
470
325
  position: absolute;
471
326
  left: 100%;
472
- top: -5px;
473
- margin-left: 1px;
327
+ top: -4px;
328
+ background: white;
329
+ border: 1px solid #babed1;
330
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.15);
331
+ min-width: 180px;
332
+ padding: 4px 0;
333
+ z-index: 1001;
474
334
  }
475
335
 
476
- .menu-icon {
477
- width: 24px;
478
- display: flex;
479
- justify-content: center;
480
- align-items: center;
481
- margin-right: 8px;
482
- font-size: 14px;
483
- color: var(--ag-foreground-color, #555);
336
+ .menu-item.has-submenu:hover > .sub-menu {
337
+ display: block;
484
338
  }
485
339
 
486
340
  .menu-divider {
487
341
  height: 1px;
488
- background-color: var(--ag-border-color, #babed1);
342
+ background: #eee;
489
343
  margin: 4px 0;
490
- opacity: 0.5;
491
344
  }
492
345
 
493
- .floating-filter-row {
494
- background: var(--ag-background-color, #fafafa);
495
- border-top: 1px solid var(--ag-border-color, #babed1);
496
- position: relative;
497
- z-index: 20;
498
- min-height: 28px;
499
- }
500
-
501
- .argent-grid-floating-filter-cell {
502
- padding: 2px 12px;
503
- cursor: default;
504
- min-height: 28px;
505
- }
506
-
507
- .floating-filter-container {
508
- width: 100%;
509
- padding: 1px 4px;
510
- box-sizing: border-box;
511
- position: relative;
512
- display: flex;
513
- align-items: center;
514
- }
515
-
516
- .floating-filter-input {
517
- width: 100%;
518
- height: 22px;
519
- border: 1px solid var(--ag-border-color, #d0d0d0);
520
- border-radius: 2px;
521
- padding: 0 20px 0 6px;
346
+ /* ============================================================================
347
+ TOOLTIP (AG Grid compatible)
348
+ ============================================================================ */
349
+ .ag-tooltip {
350
+ position: absolute;
351
+ z-index: 2000;
352
+ max-width: 300px;
353
+ padding: 6px 10px;
354
+ background: #1e293b;
355
+ color: #f8fafc;
522
356
  font-size: 12px;
523
- outline: none;
524
- box-sizing: border-box;
525
- background: var(--ag-background-color, #fff);
526
- color: var(--ag-foreground-color, #181d1f);
357
+ line-height: 1.4;
358
+ border-radius: 4px;
359
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
360
+ pointer-events: none;
361
+ white-space: pre-wrap;
362
+ word-break: break-word;
527
363
  }
528
364
 
529
- .floating-filter-clear {
365
+ .argent-grid-header-resize-handle {
530
366
  position: absolute;
531
- right: 8px;
532
- cursor: pointer;
533
- color: var(--ag-secondary-foreground-color, #999);
534
- font-size: 10px;
535
- display: flex;
536
- align-items: center;
537
- justify-content: center;
538
- width: 14px;
539
- height: 14px;
540
- border-radius: 50%;
541
- transition:
542
- background-color 0.2s,
543
- color 0.2s;
544
- }
545
-
546
- .floating-filter-clear:hover {
547
- background-color: var(--ag-row-hover-color, #eee);
548
- color: var(--ag-foreground-color, #333);
549
- }
550
-
551
- .floating-filter-input:focus {
552
- border-color: var(--ag-selected-row-background-color, #2196f3);
553
- box-shadow: 0 0 2px rgba(33, 150, 243, 0.2);
554
- }
555
-
556
- /* Set Filter Button */
557
- .floating-filter-btn {
558
- width: 100%;
559
- height: 22px;
560
- border: 1px solid var(--ag-border-color, #d0d0d0);
561
- border-radius: 2px;
562
- padding: 0 8px;
563
- font-size: 11px;
564
- background: var(--ag-background-color, #fff);
565
- cursor: pointer;
566
- display: flex;
567
- align-items: center;
568
- justify-content: space-between;
569
- gap: 4px;
570
- outline: none;
571
- transition: all 0.2s;
572
- color: var(--ag-foreground-color, #181d1f);
573
- }
574
-
575
- .floating-filter-btn:hover {
576
- border-color: var(--ag-selected-row-background-color, #4f46e5);
577
- background: var(--ag-row-hover-color, #f5f5f5);
578
- }
579
-
580
- .floating-filter-btn.active {
581
- border-color: var(--ag-selected-row-background-color, #4f46e5);
582
- background: var(--ag-selected-row-background-color, #eef2ff);
583
- color: var(--ag-selected-row-background-color, #4f46e5);
584
- }
585
-
586
- /* Set Filter Popup */
587
- .set-filter-popup {
588
- position: fixed;
589
- z-index: 1000;
590
- background: var(--ag-background-color, #fff);
591
- border: 1px solid var(--ag-border-color, #e0e0e0);
592
- border-radius: 6px;
593
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
594
- animation: fadeIn 0.15s ease-out;
367
+ right: -3px;
368
+ top: 0;
369
+ bottom: 0;
370
+ width: 6px;
371
+ cursor: col-resize;
372
+ z-index: 100;
595
373
  }
596
374
 
597
- /* Filter Popup */
598
- .filter-popup {
599
- position: fixed;
600
- z-index: 1000;
601
- background: var(--ag-background-color, #fff);
602
- border: 1px solid var(--ag-border-color, #babed1);
603
- border-radius: 4px;
604
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
605
- min-width: 180px;
606
- padding: 8px;
607
- animation: fadeIn 0.1s ease-out;
608
- pointer-events: auto;
375
+ .argent-grid-header-resize-handle:hover,
376
+ .argent-grid-header-resize-handle.resizing {
377
+ background: #2196f3;
378
+ cursor: col-resize;
609
379
  }
610
380
 
611
- .filter-popup-header {
612
- font-size: 11px;
613
- font-weight: bold;
614
- color: var(--ag-secondary-foreground-color, #666);
615
- margin-bottom: 6px;
616
- text-transform: uppercase;
381
+ .argent-grid-side-bar {
617
382
  display: flex;
618
- justify-content: space-between;
619
- align-items: center;
620
- }
621
-
622
- .filter-popup-close {
623
- cursor: pointer;
624
- padding: 2px;
625
- opacity: 0.6;
626
- }
627
-
628
- .filter-popup-close:hover {
629
- opacity: 1;
383
+ background: #f8f9fa;
384
+ border-left: 1px solid #babed1;
385
+ transition: width 0.2s;
386
+ flex-basis: 40px;
387
+ width: 40px;
630
388
  }
631
389
 
632
- .filter-popup-body {
633
- display: flex;
634
- flex-direction: column;
635
- gap: 8px;
390
+ .argent-grid-side-bar.has-active-panel {
391
+ flex-basis: 250px;
392
+ width: 250px;
636
393
  }
637
394
 
638
- .filter-popup-row {
395
+ .side-bar-buttons {
396
+ flex-basis: 40px;
397
+ width: 40px;
639
398
  display: flex;
640
399
  flex-direction: column;
400
+ border-right: 1px solid #babed1;
641
401
  }
642
402
 
643
- .filter-popup-select {
644
- width: 100%;
645
- height: 28px;
646
- border: 1px solid var(--ag-border-color, #d0d0d0);
647
- border-radius: 2px;
648
- padding: 0 4px;
649
- font-size: 13px;
650
- background: var(--ag-background-color, #fff);
651
- outline: none;
652
- }
653
-
654
- .filter-popup-select:focus {
655
- border-color: var(--ag-selected-row-background-color, #2196f3);
656
- }
657
-
658
- .filter-popup-footer {
659
- display: flex;
660
- justify-content: flex-end;
661
- gap: 8px;
662
- margin-top: 4px;
663
- padding-top: 8px;
664
- border-top: 1px solid var(--ag-border-color, #f0f0f0);
665
- }
666
-
667
- .filter-popup-btn {
668
- padding: 4px 12px;
669
- border-radius: 3px;
670
- font-size: 12px;
403
+ .side-bar-button {
404
+ writing-mode: vertical-rl;
405
+ padding: 12px 8px;
671
406
  cursor: pointer;
672
- border: 1px solid transparent;
673
- transition: all 0.1s;
674
- }
675
-
676
- .clear-btn {
677
- background: transparent;
678
- color: var(--ag-secondary-foreground-color, #666);
679
- border-color: var(--ag-border-color, #d0d0d0);
680
- }
681
-
682
- .clear-btn:hover {
683
- background: #f5f5f5;
684
- color: #333;
407
+ border-bottom: 1px solid #babed1;
408
+ background: white;
409
+ user-select: none;
685
410
  }
686
411
 
687
- .apply-btn {
688
- background: var(--ag-selected-row-background-color, #2196f3);
412
+ .side-bar-button.active {
413
+ background: #2196f3;
689
414
  color: white;
690
415
  }
691
416
 
692
- .apply-btn:hover {
693
- background: #1976d2;
417
+ .tool-panel-content {
418
+ flex: 1;
419
+ overflow: auto;
420
+ background: white;
421
+ padding: 12px;
694
422
  }
695
423
 
696
- .filter-popup-input-wrapper {
424
+ .argent-grid-viewport {
425
+ flex: 1;
426
+ overflow: auto;
697
427
  position: relative;
698
- display: flex;
699
- align-items: center;
700
- }
701
-
702
- .filter-popup-clear {
703
- position: absolute;
704
- right: 8px;
705
- cursor: pointer;
706
- color: var(--ag-secondary-foreground-color, #999);
707
- font-size: 10px;
708
428
  }
709
429
 
710
- .filter-popup-input {
430
+ .argent-grid-canvas {
431
+ position: sticky;
432
+ top: 0;
433
+ left: 0;
711
434
  width: 100%;
712
- height: 28px;
713
- border: 1px solid var(--ag-border-color, #d0d0d0);
714
- border-radius: 2px;
715
- padding: 0 8px;
716
- font-size: 13px;
717
- outline: none;
718
- box-sizing: border-box;
719
- }
720
-
721
- .filter-popup-input:focus {
722
- border-color: var(--ag-selected-row-background-color, #2196f3);
435
+ height: 100%;
436
+ display: block;
723
437
  }
724
438
 
725
- @keyframes fadeIn {
726
- from {
727
- opacity: 0;
728
- transform: translateY(-5px);
729
- }
730
- to {
731
- opacity: 1;
732
- transform: translateY(0);
733
- }
439
+ .argent-grid-scroll-spacer {
440
+ position: absolute;
441
+ top: 0;
442
+ left: 0;
734
443
  }