argent-grid 0.1.0 → 0.2.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 (108) hide show
  1. package/.github/workflows/ci.yml +69 -0
  2. package/.github/workflows/pages.yml +6 -12
  3. package/.storybook/main.ts +20 -0
  4. package/.storybook/preview.ts +18 -0
  5. package/.storybook/tsconfig.json +24 -0
  6. package/AGENTS.md +2 -2
  7. package/README.md +51 -34
  8. package/angular.json +66 -0
  9. package/biome.json +66 -0
  10. package/demo-app/e2e/selection-screenshot.spec.ts +20 -0
  11. package/docs/AG-GRID-COMPARISON.md +725 -0
  12. package/docs/CELL-RENDERER-GUIDE.md +241 -0
  13. package/docs/CONTEXT-MENU-GUIDE.md +371 -0
  14. package/docs/LIVE-DATA-OPTIMIZATIONS.md +497 -0
  15. package/docs/PERFORMANCE-OPTIMIZATIONS-PHASE1.md +162 -0
  16. package/docs/PERFORMANCE-REVIEW.md +571 -0
  17. package/docs/RESEARCH-STATUS.md +234 -0
  18. package/docs/STATE-PERSISTENCE-GUIDE.md +370 -0
  19. package/docs/STORYBOOK-REFACTOR.md +215 -0
  20. package/docs/STORYBOOK-STATUS.md +156 -0
  21. package/docs/TEST-COVERAGE-REPORT.md +276 -0
  22. package/docs/THEME-API-GUIDE.md +445 -0
  23. package/docs/THEME-API-PLAN.md +364 -0
  24. package/e2e/advanced.spec.ts +109 -0
  25. package/e2e/argentgrid.spec.ts +65 -0
  26. package/e2e/benchmark.spec.ts +52 -0
  27. package/e2e/screenshots.spec.ts +52 -0
  28. package/e2e/theming.spec.ts +35 -0
  29. package/e2e/visual.spec.ts +91 -0
  30. package/e2e/visual.spec.ts-snapshots/grid-default.png +0 -0
  31. package/e2e/visual.spec.ts-snapshots/grid-empty-state.png +0 -0
  32. package/e2e/visual.spec.ts-snapshots/grid-filter-popup.png +0 -0
  33. package/e2e/visual.spec.ts-snapshots/grid-scroll-borders.png +0 -0
  34. package/e2e/visual.spec.ts-snapshots/grid-sidebar-buttons.png +0 -0
  35. package/e2e/visual.spec.ts-snapshots/grid-text-filter.png +0 -0
  36. package/e2e/visual.spec.ts-snapshots/grid-with-selection.png +0 -0
  37. package/package.json +20 -6
  38. package/plan.md +50 -18
  39. package/playwright.config.ts +38 -0
  40. package/setup-vitest.ts +10 -13
  41. package/src/lib/argent-grid.module.ts +10 -12
  42. package/src/lib/components/argent-grid.component.css +327 -76
  43. package/src/lib/components/argent-grid.component.html +186 -64
  44. package/src/lib/components/argent-grid.component.spec.ts +120 -160
  45. package/src/lib/components/argent-grid.component.ts +642 -189
  46. package/src/lib/components/argent-grid.selection.spec.ts +132 -0
  47. package/src/lib/components/set-filter/set-filter.component.ts +302 -0
  48. package/src/lib/directives/ag-grid-compatibility.directive.ts +16 -26
  49. package/src/lib/directives/click-outside.directive.ts +19 -0
  50. package/src/lib/rendering/canvas-renderer.spec.ts +366 -0
  51. package/src/lib/rendering/canvas-renderer.ts +418 -305
  52. package/src/lib/rendering/live-data-handler.ts +110 -0
  53. package/src/lib/rendering/live-data-optimizations.ts +133 -0
  54. package/src/lib/rendering/render/blit.spec.ts +16 -27
  55. package/src/lib/rendering/render/blit.ts +48 -36
  56. package/src/lib/rendering/render/cells.spec.ts +132 -0
  57. package/src/lib/rendering/render/cells.ts +46 -24
  58. package/src/lib/rendering/render/column-utils.ts +73 -0
  59. package/src/lib/rendering/render/hit-test.ts +55 -0
  60. package/src/lib/rendering/render/index.ts +79 -76
  61. package/src/lib/rendering/render/lines.ts +43 -43
  62. package/src/lib/rendering/render/primitives.ts +161 -0
  63. package/src/lib/rendering/render/theme.spec.ts +8 -12
  64. package/src/lib/rendering/render/theme.ts +7 -10
  65. package/src/lib/rendering/render/types.ts +2 -2
  66. package/src/lib/rendering/render/walk.spec.ts +35 -38
  67. package/src/lib/rendering/render/walk.ts +60 -50
  68. package/src/lib/rendering/utils/damage-tracker.spec.ts +8 -7
  69. package/src/lib/rendering/utils/damage-tracker.ts +6 -18
  70. package/src/lib/rendering/utils/index.ts +1 -1
  71. package/src/lib/services/grid.service.set-filter.spec.ts +219 -0
  72. package/src/lib/services/grid.service.spec.ts +1165 -201
  73. package/src/lib/services/grid.service.ts +819 -187
  74. package/src/lib/themes/parts/color-schemes.ts +132 -0
  75. package/src/lib/themes/parts/icon-sets.ts +258 -0
  76. package/src/lib/themes/theme-builder.ts +347 -0
  77. package/src/lib/themes/theme-quartz.ts +72 -0
  78. package/src/lib/themes/types.ts +238 -0
  79. package/src/lib/types/ag-grid-types.ts +73 -14
  80. package/src/public-api.ts +39 -9
  81. package/src/stories/Advanced.stories.ts +188 -0
  82. package/src/stories/ArgentGrid.stories.ts +277 -0
  83. package/src/stories/Benchmark.stories.ts +74 -0
  84. package/src/stories/CellRenderers.stories.ts +221 -0
  85. package/src/stories/Filtering.stories.ts +252 -0
  86. package/src/stories/Grouping.stories.ts +217 -0
  87. package/src/stories/Theming.stories.ts +124 -0
  88. package/src/stories/benchmark-wrapper.component.ts +315 -0
  89. package/tsconfig.storybook.json +10 -0
  90. package/vitest.config.ts +9 -9
  91. package/demo-app/README.md +0 -70
  92. package/demo-app/angular.json +0 -78
  93. package/demo-app/e2e/benchmark.spec.ts +0 -53
  94. package/demo-app/e2e/demo-page.spec.ts +0 -77
  95. package/demo-app/e2e/grid-features.spec.ts +0 -269
  96. package/demo-app/package-lock.json +0 -14023
  97. package/demo-app/package.json +0 -36
  98. package/demo-app/playwright-test-menu.js +0 -19
  99. package/demo-app/playwright.config.ts +0 -23
  100. package/demo-app/src/app/app.component.ts +0 -10
  101. package/demo-app/src/app/app.config.ts +0 -13
  102. package/demo-app/src/app/app.routes.ts +0 -7
  103. package/demo-app/src/app/demo-page/demo-page.component.css +0 -313
  104. package/demo-app/src/app/demo-page/demo-page.component.html +0 -124
  105. package/demo-app/src/app/demo-page/demo-page.component.ts +0 -366
  106. package/demo-app/src/index.html +0 -19
  107. package/demo-app/src/main.ts +0 -6
  108. package/demo-app/tsconfig.json +0 -31
@@ -2,9 +2,20 @@
2
2
  box-sizing: border-box;
3
3
  position: relative;
4
4
  overflow: hidden;
5
- border: 1px solid #babed1;
6
- background: #fff;
7
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
5
+ border: 1px solid var(--ag-border-color, #babed1);
6
+ 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);
8
19
  display: flex;
9
20
  flex-direction: column;
10
21
  }
@@ -29,7 +40,7 @@
29
40
  right: 0;
30
41
  top: 0;
31
42
  bottom: 0;
32
- z-index: 15;
43
+ z-index: 25; /* Higher than header z-index (20) */
33
44
  background: transparent;
34
45
  display: flex;
35
46
  flex-direction: row-reverse;
@@ -48,7 +59,8 @@
48
59
  flex-direction: column;
49
60
  pointer-events: none;
50
61
  height: 100%;
51
- border-left: 1px solid #babed1;
62
+ border-left: 1px solid var(--ag-border-color, #babed1);
63
+ padding-top: 32px; /* Start below the header row */
52
64
  }
53
65
 
54
66
  .side-bar-button {
@@ -56,54 +68,49 @@
56
68
  padding: 12px 8px;
57
69
  cursor: pointer;
58
70
  font-size: 12px;
59
- color: #666;
60
- border-bottom: 1px solid #ddd;
61
- background: #f4f4f4;
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);
62
74
  pointer-events: auto;
63
75
  }
64
76
 
65
77
  .side-bar-button:hover {
66
- background: #fff;
78
+ background: var(--ag-background-color, #fff);
67
79
  }
68
80
 
69
81
  .side-bar-button.active {
70
- background: #fff;
71
- border-left: 2px solid #2196f3;
72
- color: #2196f3;
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);
73
85
  font-weight: bold;
74
86
  }
75
87
 
76
88
  .tool-panel-content {
77
89
  width: 250px;
78
90
  padding: 12px;
91
+ padding-top: 32px; /* Start below the header row */
79
92
  overflow-y: auto;
80
- background: #fff;
93
+ background: var(--ag-background-color, #fff);
81
94
  pointer-events: auto;
82
- border-left: 1px solid #babed1;
95
+ border-left: 1px solid var(--ag-border-color, #babed1);
83
96
  box-shadow: -5px 0 10px rgba(0, 0, 0, 0.05);
84
97
  }
85
98
 
86
99
  .tool-panel-content h3 {
87
100
  margin: 0 0 12px 0;
88
101
  font-size: 14px;
89
- color: #333;
90
- border-bottom: 1px solid #eee;
102
+ color: var(--ag-foreground-color, #333);
103
+ border-bottom: 1px solid var(--ag-border-color, #eee);
91
104
  padding-bottom: 8px;
92
105
  }
93
106
 
94
- .column-list {
95
- display: flex;
96
- flex-direction: column;
97
- gap: 8px;
98
- }
99
-
100
107
  .column-item {
101
108
  display: flex;
102
109
  align-items: center;
103
110
  padding: 6px 8px;
104
111
  gap: 8px;
105
- background: #fff;
106
- border-bottom: 1px solid #f0f0f0;
112
+ background: var(--ag-background-color, #fff);
113
+ border-bottom: 1px solid var(--ag-border-color, #f0f0f0);
107
114
  cursor: default;
108
115
  }
109
116
 
@@ -113,7 +120,7 @@
113
120
 
114
121
  .column-drag-handle {
115
122
  cursor: grab;
116
- color: #ccc;
123
+ color: var(--ag-secondary-foreground-color, #ccc);
117
124
  font-size: 14px;
118
125
  user-select: none;
119
126
  display: flex;
@@ -127,7 +134,7 @@
127
134
  .column-label {
128
135
  flex: 1;
129
136
  font-size: 12px;
130
- color: #333;
137
+ color: var(--ag-foreground-color, #333);
131
138
  overflow: hidden;
132
139
  text-overflow: ellipsis;
133
140
  white-space: nowrap;
@@ -137,20 +144,22 @@
137
144
  .sidebar-drag-preview {
138
145
  box-sizing: border-box;
139
146
  border-radius: 4px;
140
- box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2),
141
- 0 8px 10px 1px rgba(0, 0, 0, 0.14),
142
- 0 3px 14px 2px rgba(0, 0, 0, 0.12);
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);
143
151
  display: flex;
144
152
  align-items: center;
145
153
  padding: 8px 12px;
146
- background: white;
154
+ background: var(--ag-background-color, white);
147
155
  z-index: 10001;
148
156
  gap: 8px;
157
+ color: var(--ag-foreground-color, #181d1f);
149
158
  }
150
159
 
151
160
  .sidebar-drag-placeholder {
152
161
  opacity: 0.3;
153
- background: #e0e0e0;
162
+ background: var(--ag-border-color, #e0e0e0);
154
163
  }
155
164
 
156
165
  .column-list.cdk-drop-list-dragging .column-item:not(.cdk-drag-placeholder) {
@@ -161,14 +170,21 @@
161
170
  margin: 0;
162
171
  }
163
172
 
164
- .argent-grid-container *, .argent-grid-container *:before, .argent-grid-container *:after {
173
+ .argent-grid-container *,
174
+ .argent-grid-container *:before,
175
+ .argent-grid-container *:after {
165
176
  box-sizing: inherit;
166
177
  }
167
178
 
168
179
  .argent-grid-header {
169
- border-bottom: 1px solid #babed1;
170
- background: #f8f9fa;
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);
171
183
  font-weight: 600;
184
+ position: relative;
185
+ z-index: 20;
186
+ display: flex;
187
+ flex-direction: column;
172
188
  }
173
189
 
174
190
  .argent-grid-header-row {
@@ -179,6 +195,11 @@
179
195
  .argent-grid-header-scrollable {
180
196
  overflow: hidden;
181
197
  flex: 1;
198
+ display: flex;
199
+ }
200
+
201
+ .argent-grid-header-scrollable .argent-grid-header-row {
202
+ flex: 1;
182
203
  }
183
204
 
184
205
  .argent-grid-header-pinned-left-container,
@@ -189,16 +210,18 @@
189
210
  .cdk-drag-preview {
190
211
  box-sizing: border-box;
191
212
  border-radius: 4px;
192
- box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2),
193
- 0 8px 10px 1px rgba(0, 0, 0, 0.14),
194
- 0 3px 14px 2px rgba(0, 0, 0, 0.12);
195
- background: #f5f5f5;
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);
196
218
  display: flex;
197
219
  align-items: center;
198
220
  justify-content: center;
199
221
  padding: 8px 12px;
200
222
  font-weight: 600;
201
223
  opacity: 0.8;
224
+ color: var(--ag-foreground-color, #181d1f);
202
225
  }
203
226
 
204
227
  .cdk-drag-placeholder {
@@ -209,13 +232,43 @@
209
232
  transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
210
233
  }
211
234
 
212
- .argent-grid-header-cell.cdk-drop-list-dragging .argent-grid-header-cell:not(.cdk-drag-placeholder) {
235
+ .argent-grid-header-cell.cdk-drop-list-dragging
236
+ .argent-grid-header-cell:not(.cdk-drag-placeholder) {
213
237
  transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
214
238
  }
215
239
 
240
+ .argent-grid-header-checkbox {
241
+ display: flex;
242
+ align-items: center;
243
+ justify-content: center;
244
+ margin-right: 8px;
245
+ flex-shrink: 0;
246
+ }
247
+
248
+ .argent-grid-header-cell.center-content .argent-grid-header-checkbox {
249
+ margin-right: 0;
250
+ }
251
+
252
+ .argent-grid-header-cell.center-content {
253
+ justify-content: center;
254
+ }
255
+
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%;
260
+ }
261
+
262
+ .argent-grid-header-checkbox input {
263
+ margin: 0;
264
+ cursor: pointer;
265
+ width: 14px;
266
+ height: 14px;
267
+ }
268
+
216
269
  .argent-grid-header-cell {
217
- padding: 8px 12px;
218
- border-right: 1px solid #babed1;
270
+ padding: 4px 12px;
271
+ border-right: 1px solid var(--ag-border-color, #babed1);
219
272
  display: flex;
220
273
  align-items: center;
221
274
  justify-content: space-between;
@@ -223,7 +276,8 @@
223
276
  user-select: none;
224
277
  flex-shrink: 0;
225
278
  position: relative;
226
- height: 100%;
279
+ min-height: 32px;
280
+ color: var(--ag-header-foreground-color, #181d1f);
227
281
  }
228
282
 
229
283
  .argent-grid-header-cell:hover .argent-grid-header-menu-icon {
@@ -235,7 +289,6 @@
235
289
  align-items: center;
236
290
  overflow: hidden;
237
291
  flex: 1;
238
- height: 100%;
239
292
  }
240
293
 
241
294
  .header-text {
@@ -247,15 +300,15 @@
247
300
  .argent-grid-header-menu-icon {
248
301
  opacity: 0;
249
302
  padding: 0 6px;
250
- color: #666;
303
+ color: var(--ag-secondary-foreground-color, #666);
251
304
  transition: opacity 0.2s;
252
305
  font-size: 16px;
253
306
  line-height: 1;
254
307
  }
255
308
 
256
309
  .argent-grid-header-menu-icon:hover {
257
- color: #000;
258
- background: #e0e0e0;
310
+ color: var(--ag-foreground-color, #000);
311
+ background: var(--ag-row-hover-color, #e0e0e0);
259
312
  border-radius: 4px;
260
313
  }
261
314
 
@@ -268,36 +321,37 @@
268
321
  cursor: col-resize;
269
322
  z-index: 5;
270
323
  transition: background-color 0.2s;
324
+ height: 100%;
271
325
  }
272
326
 
273
327
  .argent-grid-header-resize-handle:hover,
274
328
  .argent-grid-header-resize-handle.resizing {
275
- background-color: #2196f3;
329
+ background-color: var(--ag-selected-row-background-color, #2196f3);
276
330
  }
277
331
 
278
332
  .argent-grid-header-cell-pinned-left {
279
333
  position: sticky;
280
334
  left: 0;
281
335
  z-index: 10;
282
- background: #f8f9fa;
336
+ background: var(--ag-header-background-color, #f8f9fa);
283
337
  }
284
338
 
285
339
  .argent-grid-header-cell-pinned-right {
286
340
  position: sticky;
287
341
  right: 0;
288
342
  z-index: 10;
289
- background: #f8f9fa;
343
+ background: var(--ag-header-background-color, #f8f9fa);
290
344
  }
291
345
 
292
346
  .argent-grid-header-cell.sortable:hover {
293
- background: #e8e8e8;
347
+ background: var(--ag-row-hover-color, #e8e8e8);
294
348
  }
295
349
 
296
350
  .sort-indicator {
297
351
  margin-left: 4px;
298
352
  font-size: 12px;
353
+ color: var(--ag-foreground-color, #181d1f);
299
354
  }
300
-
301
355
  .argent-grid-viewport {
302
356
  position: relative;
303
357
  overflow: auto;
@@ -305,6 +359,7 @@
305
359
  will-change: scroll-position;
306
360
  flex: 1;
307
361
  min-height: 0;
362
+ background: var(--ag-background-color, #fff);
308
363
  }
309
364
 
310
365
  .argent-grid-canvas {
@@ -322,9 +377,9 @@
322
377
  position: absolute;
323
378
  top: 0;
324
379
  left: 0;
325
- width: 1px;
326
- visibility: hidden;
327
380
  pointer-events: none;
381
+ z-index: -1;
382
+ background: var(--ag-background-color, #fff);
328
383
  }
329
384
 
330
385
  .argent-grid-overlay {
@@ -336,7 +391,7 @@
336
391
  display: flex;
337
392
  align-items: center;
338
393
  justify-content: center;
339
- background: rgba(255, 255, 255, 0.9);
394
+ background: var(--ag-background-color, rgba(255, 255, 255, 0.9));
340
395
  z-index: 10;
341
396
  }
342
397
 
@@ -349,25 +404,28 @@
349
404
  .argent-grid-editor-input {
350
405
  width: 100%;
351
406
  height: 100%;
352
- border: 2px solid #2196f3;
407
+ border: 2px solid var(--ag-selected-row-background-color, #2196f3);
353
408
  outline: none;
354
409
  padding: 4px 8px;
355
- font-size: 13px;
356
- font-family: inherit;
410
+ font-size: var(--ag-font-size, 13px);
411
+ font-family: var(--ag-font-family, inherit);
357
412
  box-sizing: border-box;
413
+ background: var(--ag-background-color, #fff);
414
+ color: var(--ag-foreground-color, #181d1f);
358
415
  }
359
416
 
360
- .argent-grid-header-menu, .argent-grid-context-menu {
417
+ .argent-grid-header-menu,
418
+ .argent-grid-context-menu {
361
419
  position: fixed;
362
- background: #ffffff;
363
- border: 1px solid #babed1;
420
+ background: var(--ag-background-color, #ffffff);
421
+ border: 1px solid var(--ag-border-color, #babed1);
364
422
  box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.2);
365
423
  border-radius: 3px;
366
424
  padding: 4px 0;
367
425
  z-index: 10000;
368
426
  min-width: 200px;
369
427
  font-size: 13px;
370
- color: #181d1f;
428
+ color: var(--ag-foreground-color, #181d1f);
371
429
  }
372
430
 
373
431
  .menu-item {
@@ -380,11 +438,11 @@
380
438
  }
381
439
 
382
440
  .menu-item:hover {
383
- background-color: #f0f2f5;
441
+ background-color: var(--ag-row-hover-color, #f0f2f5);
384
442
  }
385
443
 
386
444
  .menu-item.disabled {
387
- color: #999;
445
+ color: var(--ag-secondary-foreground-color, #999);
388
446
  cursor: not-allowed;
389
447
  }
390
448
 
@@ -399,7 +457,7 @@
399
457
  .menu-arrow {
400
458
  margin-left: 8px;
401
459
  font-size: 10px;
402
- color: #999;
460
+ color: var(--ag-secondary-foreground-color, #999);
403
461
  }
404
462
 
405
463
  /* Sub-menu styling */
@@ -422,24 +480,33 @@
422
480
  align-items: center;
423
481
  margin-right: 8px;
424
482
  font-size: 14px;
425
- color: #555;
483
+ color: var(--ag-foreground-color, #555);
426
484
  }
427
485
 
428
486
  .menu-divider {
429
487
  height: 1px;
430
- background-color: #babed1;
488
+ background-color: var(--ag-border-color, #babed1);
431
489
  margin: 4px 0;
432
490
  opacity: 0.5;
433
491
  }
434
492
 
435
493
  .floating-filter-row {
436
- background: #fafafa;
437
- border-top: 1px solid #e0e0e0;
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;
438
505
  }
439
506
 
440
507
  .floating-filter-container {
441
508
  width: 100%;
442
- padding: 2px 4px;
509
+ padding: 1px 4px;
443
510
  box-sizing: border-box;
444
511
  position: relative;
445
512
  display: flex;
@@ -448,20 +515,22 @@
448
515
 
449
516
  .floating-filter-input {
450
517
  width: 100%;
451
- height: 24px;
452
- border: 1px solid #d0d0d0;
518
+ height: 22px;
519
+ border: 1px solid var(--ag-border-color, #d0d0d0);
453
520
  border-radius: 2px;
454
521
  padding: 0 20px 0 6px;
455
522
  font-size: 12px;
456
523
  outline: none;
457
524
  box-sizing: border-box;
525
+ background: var(--ag-background-color, #fff);
526
+ color: var(--ag-foreground-color, #181d1f);
458
527
  }
459
528
 
460
529
  .floating-filter-clear {
461
530
  position: absolute;
462
531
  right: 8px;
463
532
  cursor: pointer;
464
- color: #999;
533
+ color: var(--ag-secondary-foreground-color, #999);
465
534
  font-size: 10px;
466
535
  display: flex;
467
536
  align-items: center;
@@ -469,15 +538,197 @@
469
538
  width: 14px;
470
539
  height: 14px;
471
540
  border-radius: 50%;
472
- transition: background-color 0.2s, color 0.2s;
541
+ transition:
542
+ background-color 0.2s,
543
+ color 0.2s;
473
544
  }
474
545
 
475
546
  .floating-filter-clear:hover {
476
- background-color: #eee;
477
- color: #333;
547
+ background-color: var(--ag-row-hover-color, #eee);
548
+ color: var(--ag-foreground-color, #333);
478
549
  }
479
550
 
480
551
  .floating-filter-input:focus {
481
- border-color: #2196f3;
552
+ border-color: var(--ag-selected-row-background-color, #2196f3);
482
553
  box-shadow: 0 0 2px rgba(33, 150, 243, 0.2);
483
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;
595
+ }
596
+
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;
609
+ }
610
+
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;
617
+ 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;
630
+ }
631
+
632
+ .filter-popup-body {
633
+ display: flex;
634
+ flex-direction: column;
635
+ gap: 8px;
636
+ }
637
+
638
+ .filter-popup-row {
639
+ display: flex;
640
+ flex-direction: column;
641
+ }
642
+
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;
671
+ 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;
685
+ }
686
+
687
+ .apply-btn {
688
+ background: var(--ag-selected-row-background-color, #2196f3);
689
+ color: white;
690
+ }
691
+
692
+ .apply-btn:hover {
693
+ background: #1976d2;
694
+ }
695
+
696
+ .filter-popup-input-wrapper {
697
+ 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
+ }
709
+
710
+ .filter-popup-input {
711
+ 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);
723
+ }
724
+
725
+ @keyframes fadeIn {
726
+ from {
727
+ opacity: 0;
728
+ transform: translateY(-5px);
729
+ }
730
+ to {
731
+ opacity: 1;
732
+ transform: translateY(0);
733
+ }
734
+ }