argent-grid 0.1.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 (122) 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 +70 -27
  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/cell-renderers.spec.ts +152 -0
  28. package/e2e/debug-streaming.spec.ts +31 -0
  29. package/e2e/dnd.spec.ts +73 -0
  30. package/e2e/screenshots.spec.ts +52 -0
  31. package/e2e/theming.spec.ts +35 -0
  32. package/e2e/visual.spec.ts +112 -0
  33. package/e2e/visual.spec.ts-snapshots/checkbox-renderer-mixed.png +0 -0
  34. package/e2e/visual.spec.ts-snapshots/debug.png +0 -0
  35. package/e2e/visual.spec.ts-snapshots/grid-column-group-headers.png +0 -0
  36. package/e2e/visual.spec.ts-snapshots/grid-default.png +0 -0
  37. package/e2e/visual.spec.ts-snapshots/grid-empty-state.png +0 -0
  38. package/e2e/visual.spec.ts-snapshots/grid-filter-popup.png +0 -0
  39. package/e2e/visual.spec.ts-snapshots/grid-scroll-borders.png +0 -0
  40. package/e2e/visual.spec.ts-snapshots/grid-sidebar-buttons.png +0 -0
  41. package/e2e/visual.spec.ts-snapshots/grid-text-filter.png +0 -0
  42. package/e2e/visual.spec.ts-snapshots/grid-with-selection.png +0 -0
  43. package/e2e/visual.spec.ts-snapshots/rating-renderer-varied.png +0 -0
  44. package/package.json +21 -7
  45. package/plan.md +56 -28
  46. package/playwright.config.ts +38 -0
  47. package/setup-vitest.ts +10 -13
  48. package/src/lib/argent-grid.module.ts +10 -12
  49. package/src/lib/components/argent-grid.component.css +281 -321
  50. package/src/lib/components/argent-grid.component.html +295 -207
  51. package/src/lib/components/argent-grid.component.spec.ts +120 -160
  52. package/src/lib/components/argent-grid.component.ts +1193 -290
  53. package/src/lib/components/argent-grid.regressions.spec.ts +301 -0
  54. package/src/lib/components/argent-grid.selection.spec.ts +132 -0
  55. package/src/lib/components/set-filter/set-filter.component.spec.ts +191 -0
  56. package/src/lib/components/set-filter/set-filter.component.ts +307 -0
  57. package/src/lib/directives/ag-grid-compatibility.directive.ts +16 -26
  58. package/src/lib/directives/click-outside.directive.ts +19 -0
  59. package/src/lib/rendering/canvas-renderer.spec.ts +513 -0
  60. package/src/lib/rendering/canvas-renderer.ts +456 -452
  61. package/src/lib/rendering/live-data-handler.ts +110 -0
  62. package/src/lib/rendering/live-data-optimizations.ts +133 -0
  63. package/src/lib/rendering/render/blit.spec.ts +16 -27
  64. package/src/lib/rendering/render/blit.ts +48 -36
  65. package/src/lib/rendering/render/cells.spec.ts +132 -0
  66. package/src/lib/rendering/render/cells.ts +167 -28
  67. package/src/lib/rendering/render/column-utils.ts +95 -0
  68. package/src/lib/rendering/render/hit-test.ts +50 -0
  69. package/src/lib/rendering/render/index.ts +88 -76
  70. package/src/lib/rendering/render/lines.ts +53 -47
  71. package/src/lib/rendering/render/primitives.ts +423 -0
  72. package/src/lib/rendering/render/theme.spec.ts +8 -12
  73. package/src/lib/rendering/render/theme.ts +7 -10
  74. package/src/lib/rendering/render/types.ts +3 -2
  75. package/src/lib/rendering/render/walk.spec.ts +35 -38
  76. package/src/lib/rendering/render/walk.ts +94 -64
  77. package/src/lib/rendering/utils/damage-tracker.spec.ts +8 -7
  78. package/src/lib/rendering/utils/damage-tracker.ts +6 -18
  79. package/src/lib/rendering/utils/index.ts +1 -1
  80. package/src/lib/services/grid.service.set-filter.spec.ts +219 -0
  81. package/src/lib/services/grid.service.spec.ts +1241 -201
  82. package/src/lib/services/grid.service.ts +1204 -235
  83. package/src/lib/themes/parts/color-schemes.ts +132 -0
  84. package/src/lib/themes/parts/icon-sets.ts +258 -0
  85. package/src/lib/themes/theme-builder.ts +347 -0
  86. package/src/lib/themes/theme-quartz.ts +72 -0
  87. package/src/lib/themes/types.ts +238 -0
  88. package/src/lib/types/ag-grid-types.ts +573 -14
  89. package/src/public-api.ts +39 -9
  90. package/src/stories/Advanced.stories.ts +249 -0
  91. package/src/stories/ArgentGrid.stories.ts +301 -0
  92. package/src/stories/Benchmark.stories.ts +76 -0
  93. package/src/stories/CellRenderers.stories.ts +395 -0
  94. package/src/stories/Filtering.stories.ts +292 -0
  95. package/src/stories/Grouping.stories.ts +290 -0
  96. package/src/stories/Streaming.stories.ts +57 -0
  97. package/src/stories/Theming.stories.ts +137 -0
  98. package/src/stories/Tooltips.stories.ts +381 -0
  99. package/src/stories/benchmark-wrapper.component.ts +355 -0
  100. package/src/stories/story-utils.ts +88 -0
  101. package/src/stories/streaming-wrapper.component.ts +441 -0
  102. package/tsconfig.json +1 -0
  103. package/tsconfig.storybook.json +10 -0
  104. package/vitest.config.ts +9 -9
  105. package/demo-app/README.md +0 -70
  106. package/demo-app/angular.json +0 -78
  107. package/demo-app/e2e/benchmark.spec.ts +0 -53
  108. package/demo-app/e2e/demo-page.spec.ts +0 -77
  109. package/demo-app/e2e/grid-features.spec.ts +0 -269
  110. package/demo-app/package-lock.json +0 -14023
  111. package/demo-app/package.json +0 -36
  112. package/demo-app/playwright-test-menu.js +0 -19
  113. package/demo-app/playwright.config.ts +0 -23
  114. package/demo-app/src/app/app.component.ts +0 -10
  115. package/demo-app/src/app/app.config.ts +0 -13
  116. package/demo-app/src/app/app.routes.ts +0 -7
  117. package/demo-app/src/app/demo-page/demo-page.component.css +0 -313
  118. package/demo-app/src/app/demo-page/demo-page.component.html +0 -124
  119. package/demo-app/src/app/demo-page/demo-page.component.ts +0 -366
  120. package/demo-app/src/index.html +0 -19
  121. package/demo-app/src/main.ts +0 -6
  122. package/demo-app/tsconfig.json +0 -31
@@ -1,10 +1,10 @@
1
1
  .argent-grid-container {
2
2
  box-sizing: border-box;
3
3
  position: relative;
4
- overflow: hidden;
5
- border: 1px solid #babed1;
6
- background: #fff;
7
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
4
+ border: 1px solid var(--ag-border-color, #babed1);
5
+ background: var(--ag-background-color, #fff);
6
+ font-family: sans-serif;
7
+ font-size: 14px;
8
8
  display: flex;
9
9
  flex-direction: column;
10
10
  }
@@ -13,7 +13,6 @@
13
13
  display: flex;
14
14
  flex: 1;
15
15
  overflow: hidden;
16
- width: 100%;
17
16
  }
18
17
 
19
18
  .argent-grid-content-area {
@@ -21,463 +20,424 @@
21
20
  display: flex;
22
21
  flex-direction: column;
23
22
  overflow: hidden;
24
- min-width: 0;
25
23
  }
26
24
 
27
- .argent-grid-side-bar {
28
- position: absolute;
29
- right: 0;
30
- top: 0;
31
- bottom: 0;
32
- z-index: 15;
33
- background: transparent;
25
+ .argent-grid-row-group-panel {
26
+ background: #f8f9fa;
27
+ border-bottom: 1px solid #babed1;
28
+ padding: 8px;
29
+ min-height: 40px;
34
30
  display: flex;
35
- flex-direction: row-reverse;
36
- transition: width 0.2s ease-in-out;
37
- pointer-events: none;
38
- width: 32px;
39
- }
40
-
41
- .argent-grid-side-bar.has-active-panel {
42
- width: 282px; /* 250px panel + 32px buttons */
31
+ gap: 8px;
32
+ align-items: center;
43
33
  }
44
34
 
45
- .side-bar-buttons {
46
- width: 32px;
35
+ .row-group-pill {
36
+ background: #2196f3;
37
+ color: white;
38
+ padding: 4px 8px;
39
+ border-radius: 4px;
47
40
  display: flex;
48
- flex-direction: column;
49
- pointer-events: none;
50
- height: 100%;
51
- border-left: 1px solid #babed1;
41
+ gap: 4px;
52
42
  }
53
43
 
54
- .side-bar-button {
55
- writing-mode: vertical-rl;
56
- padding: 12px 8px;
57
- cursor: pointer;
58
- font-size: 12px;
59
- color: #666;
60
- border-bottom: 1px solid #ddd;
61
- background: #f4f4f4;
62
- pointer-events: auto;
63
- }
64
-
65
- .side-bar-button:hover {
66
- background: #fff;
44
+ .argent-grid-header {
45
+ background: #f8f9fa;
46
+ border-bottom: 1px solid #babed1;
47
+ box-sizing: border-box;
67
48
  }
68
49
 
69
- .side-bar-button.active {
70
- background: #fff;
71
- border-left: 2px solid #2196f3;
72
- color: #2196f3;
73
- font-weight: bold;
50
+ .argent-grid-header * {
51
+ box-sizing: border-box;
74
52
  }
75
53
 
76
- .tool-panel-content {
77
- width: 250px;
78
- padding: 12px;
79
- overflow-y: auto;
80
- background: #fff;
81
- pointer-events: auto;
82
- border-left: 1px solid #babed1;
83
- box-shadow: -5px 0 10px rgba(0, 0, 0, 0.05);
54
+ .argent-grid-header-main {
55
+ display: flex;
84
56
  }
85
57
 
86
- .tool-panel-content h3 {
87
- margin: 0 0 12px 0;
88
- font-size: 14px;
89
- color: #333;
90
- border-bottom: 1px solid #eee;
91
- padding-bottom: 8px;
58
+ .argent-grid-header-pinned-left-container {
59
+ display: flex;
92
60
  }
93
61
 
94
- .column-list {
62
+ .argent-grid-header-pinned-right-container {
95
63
  display: flex;
96
- flex-direction: column;
97
- gap: 8px;
98
64
  }
99
65
 
100
- .column-item {
66
+ .argent-grid-header-scrollable {
67
+ flex: 1;
68
+ overflow: hidden;
101
69
  display: flex;
102
- align-items: center;
103
- padding: 6px 8px;
104
- gap: 8px;
105
- background: #fff;
106
- border-bottom: 1px solid #f0f0f0;
107
- cursor: default;
108
70
  }
109
71
 
110
- .column-item:last-child {
111
- border-bottom: none;
72
+ .argent-grid-header-scrollable-content {
73
+ display: flex;
112
74
  }
113
75
 
114
- .column-drag-handle {
115
- cursor: grab;
116
- color: #ccc;
117
- 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;
118
83
  user-select: none;
119
84
  display: flex;
120
85
  align-items: center;
86
+ position: relative;
87
+ overflow: visible;
121
88
  }
122
89
 
123
- .column-drag-handle:active {
124
- cursor: grabbing;
90
+ .argent-grid-header-cell.sortable {
91
+ cursor: pointer;
125
92
  }
126
93
 
127
- .column-label {
128
- flex: 1;
129
- font-size: 12px;
130
- color: #333;
131
- overflow: hidden;
132
- text-overflow: ellipsis;
133
- white-space: nowrap;
94
+ .argent-grid-header-group-cell {
95
+ border-bottom: 1px solid #babed1;
96
+ font-weight: 600;
97
+ justify-content: center;
134
98
  }
135
99
 
136
- /* CDK Drag & Drop Sidebar Styles */
137
- .sidebar-drag-preview {
138
- box-sizing: border-box;
139
- 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);
100
+ .argent-grid-header-content {
101
+ flex: 1;
143
102
  display: flex;
144
103
  align-items: center;
145
- padding: 8px 12px;
146
- background: white;
147
- z-index: 10001;
148
- gap: 8px;
149
- }
150
-
151
- .sidebar-drag-placeholder {
152
- opacity: 0.3;
153
- background: #e0e0e0;
154
- }
155
-
156
- .column-list.cdk-drop-list-dragging .column-item:not(.cdk-drag-placeholder) {
157
- transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
158
- }
159
-
160
- .column-item input {
161
- margin: 0;
104
+ overflow: hidden;
105
+ gap: 4px;
162
106
  }
163
107
 
164
- .argent-grid-container *, .argent-grid-container *:before, .argent-grid-container *:after {
165
- box-sizing: inherit;
108
+ .argent-grid-floating-filter-cell {
109
+ box-sizing: border-box;
110
+ padding: 4px;
111
+ border-right: 1px solid #babed1;
166
112
  }
167
113
 
168
- .argent-grid-header {
169
- border-bottom: 1px solid #babed1;
114
+ .floating-filter-row {
115
+ display: flex;
116
+ border-top: 1px solid #babed1;
170
117
  background: #f8f9fa;
171
- font-weight: 600;
172
118
  }
173
119
 
174
120
  .argent-grid-header-row {
175
121
  display: flex;
176
- white-space: nowrap;
177
- }
178
-
179
- .argent-grid-header-scrollable {
180
- overflow: hidden;
181
- flex: 1;
182
122
  }
183
123
 
184
- .argent-grid-header-pinned-left-container,
185
- .argent-grid-header-pinned-right-container {
124
+ .floating-filter-container {
125
+ width: 100%;
126
+ height: 100%;
186
127
  display: flex;
128
+ align-items: center;
129
+ position: relative;
187
130
  }
188
131
 
189
- .cdk-drag-preview {
132
+ .floating-filter-input {
133
+ width: 100%;
134
+ height: 24px;
190
135
  box-sizing: border-box;
136
+ padding: 2px 20px 2px 4px;
137
+ border: 1px solid #ccc;
191
138
  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;
196
- display: flex;
197
- align-items: center;
198
- justify-content: center;
199
- padding: 8px 12px;
200
- font-weight: 600;
201
- opacity: 0.8;
139
+ font-size: 12px;
202
140
  }
203
141
 
204
- .cdk-drag-placeholder {
205
- opacity: 0.3;
142
+ .floating-filter-clear {
143
+ position: absolute;
144
+ right: 6px;
145
+ cursor: pointer;
146
+ color: #999;
147
+ font-size: 12px;
206
148
  }
207
149
 
208
- .cdk-drag-animating {
209
- transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
150
+ .floating-filter-btn {
151
+ width: 100%;
152
+ height: 24px;
153
+ display: flex;
154
+ justify-content: space-between;
155
+ align-items: center;
156
+ padding: 0 8px;
157
+ background: white;
158
+ border: 1px solid #ccc;
159
+ border-radius: 4px;
160
+ font-size: 12px;
161
+ cursor: pointer;
210
162
  }
211
163
 
212
- .argent-grid-header-cell.cdk-drop-list-dragging .argent-grid-header-cell:not(.cdk-drag-placeholder) {
213
- transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
164
+ .argent-grid-header-scrollbar-spacer {
165
+ background: #f8f9fa;
166
+ border-left: 1px solid #babed1;
167
+ flex-shrink: 0;
214
168
  }
215
169
 
216
- .argent-grid-header-cell {
217
- padding: 8px 12px;
218
- border-right: 1px solid #babed1;
170
+ .argent-grid-header-menu-icon {
171
+ padding: 0 4px;
172
+ cursor: pointer;
173
+ color: #666;
174
+ font-size: 16px;
219
175
  display: flex;
220
176
  align-items: center;
221
- justify-content: space-between;
222
- cursor: pointer;
223
- user-select: none;
224
- flex-shrink: 0;
225
- position: relative;
226
- height: 100%;
177
+ justify-content: center;
178
+ border-radius: 2px;
179
+ z-index: 2;
227
180
  }
228
181
 
229
- .argent-grid-header-cell:hover .argent-grid-header-menu-icon {
230
- opacity: 1;
182
+ .argent-grid-header-menu-icon:hover {
183
+ background: #eee;
231
184
  }
232
185
 
233
- .argent-grid-header-content {
186
+ .argent-grid-header-filter-icon {
187
+ padding: 0 4px;
188
+ cursor: pointer;
189
+ color: #999;
234
190
  display: flex;
235
191
  align-items: center;
236
- overflow: hidden;
237
- flex: 1;
238
- height: 100%;
192
+ justify-content: center;
193
+ border-radius: 2px;
194
+ z-index: 2;
195
+ flex-shrink: 0;
239
196
  }
240
197
 
241
- .header-text {
242
- overflow: hidden;
243
- text-overflow: ellipsis;
244
- padding-right: 4px;
198
+ .argent-grid-header-filter-icon:hover {
199
+ background: #eee;
200
+ color: #333;
245
201
  }
246
202
 
247
- .argent-grid-header-menu-icon {
248
- opacity: 0;
249
- padding: 0 6px;
250
- color: #666;
251
- transition: opacity 0.2s;
252
- font-size: 16px;
253
- line-height: 1;
203
+ .argent-grid-header-filter-icon.active {
204
+ color: #2563eb;
254
205
  }
255
206
 
256
- .argent-grid-header-menu-icon:hover {
257
- color: #000;
258
- background: #e0e0e0;
259
- border-radius: 4px;
207
+ .argent-grid-header-filter-icon.active:hover {
208
+ background: #dbeafe;
209
+ color: #1d4ed8;
260
210
  }
261
211
 
262
- .argent-grid-header-resize-handle {
212
+ .argent-grid-header-menu {
263
213
  position: absolute;
264
- right: 0;
265
- top: 0;
266
- bottom: 0;
267
- width: 4px;
268
- cursor: col-resize;
269
- z-index: 5;
270
- transition: background-color 0.2s;
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;
271
220
  }
272
221
 
273
- .argent-grid-header-resize-handle:hover,
274
- .argent-grid-header-resize-handle.resizing {
275
- background-color: #2196f3;
222
+ .set-filter-popup {
223
+ position: absolute;
224
+ background: white;
225
+ border: 1px solid #babed1;
226
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
227
+ z-index: 1000;
276
228
  }
277
229
 
278
- .argent-grid-header-cell-pinned-left {
279
- position: sticky;
280
- left: 0;
281
- z-index: 10;
282
- background: #f8f9fa;
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;
283
238
  }
284
239
 
285
- .argent-grid-header-cell-pinned-right {
286
- position: sticky;
287
- right: 0;
288
- z-index: 10;
289
- background: #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;
290
248
  }
291
249
 
292
- .argent-grid-header-cell.sortable:hover {
293
- background: #e8e8e8;
250
+ .filter-popup-header {
251
+ font-weight: bold;
252
+ margin-bottom: 8px;
253
+ color: #333;
294
254
  }
295
255
 
296
- .sort-indicator {
297
- margin-left: 4px;
298
- font-size: 12px;
256
+ .filter-operator-select {
257
+ width: 100%;
258
+ padding: 4px;
259
+ margin-bottom: 8px;
260
+ border: 1px solid #ccc;
261
+ border-radius: 4px;
299
262
  }
300
263
 
301
- .argent-grid-viewport {
302
- position: relative;
303
- overflow: auto;
304
- contain: strict;
305
- will-change: scroll-position;
306
- flex: 1;
307
- min-height: 0;
264
+ .filter-input-container {
265
+ margin-bottom: 8px;
308
266
  }
309
267
 
310
- .argent-grid-canvas {
311
- position: sticky;
312
- top: 0;
313
- left: 0;
314
- display: block;
268
+ .filter-input {
315
269
  width: 100%;
316
- image-rendering: -webkit-optimize-contrast;
317
- image-rendering: crisp-edges;
318
- z-index: 1;
319
- }
320
-
321
- .argent-grid-scroll-spacer {
322
- position: absolute;
323
- top: 0;
324
- left: 0;
325
- width: 1px;
326
- visibility: hidden;
327
- pointer-events: none;
270
+ padding: 6px;
271
+ box-sizing: border-box;
272
+ border: 1px solid #ccc;
273
+ border-radius: 4px;
328
274
  }
329
275
 
330
- .argent-grid-overlay {
331
- position: absolute;
332
- top: 0;
333
- left: 0;
334
- right: 0;
335
- bottom: 0;
276
+ .filter-popup-footer {
277
+ margin-top: 12px;
336
278
  display: flex;
337
- align-items: center;
338
- justify-content: center;
339
- background: rgba(255, 255, 255, 0.9);
340
- z-index: 10;
279
+ justify-content: flex-end;
341
280
  }
342
281
 
343
- .argent-grid-cell-editor {
344
- position: absolute;
345
- z-index: 100;
346
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
347
- }
348
-
349
- .argent-grid-editor-input {
350
- width: 100%;
351
- height: 100%;
352
- border: 2px solid #2196f3;
353
- outline: none;
354
- padding: 4px 8px;
355
- font-size: 13px;
356
- font-family: inherit;
357
- box-sizing: border-box;
282
+ .filter-clear-btn {
283
+ padding: 4px 12px;
284
+ background: #f0f0f0;
285
+ border: 1px solid #ccc;
286
+ border-radius: 4px;
287
+ cursor: pointer;
358
288
  }
359
289
 
360
- .argent-grid-header-menu, .argent-grid-context-menu {
361
- position: fixed;
362
- background: #ffffff;
363
- border: 1px solid #babed1;
364
- box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.2);
365
- border-radius: 3px;
366
- padding: 4px 0;
367
- z-index: 10000;
368
- min-width: 200px;
369
- font-size: 13px;
370
- color: #181d1f;
290
+ .filter-clear-btn:hover {
291
+ background: #e0e0e0;
371
292
  }
372
293
 
373
294
  .menu-item {
374
- padding: 6px 12px;
295
+ padding: 8px 12px;
375
296
  cursor: pointer;
376
297
  display: flex;
377
298
  align-items: center;
378
- position: relative;
379
- transition: background-color 0.1s;
299
+ gap: 8px;
300
+ white-space: nowrap;
380
301
  }
381
302
 
382
303
  .menu-item:hover {
383
- background-color: #f0f2f5;
304
+ background: #f0f0f0;
384
305
  }
385
306
 
386
307
  .menu-item.disabled {
387
- color: #999;
308
+ color: #ccc;
388
309
  cursor: not-allowed;
389
310
  }
390
311
 
391
- .menu-item.disabled:hover {
392
- background-color: transparent;
393
- }
394
-
395
- .menu-text {
396
- flex: 1;
397
- }
398
-
399
- .menu-arrow {
400
- margin-left: 8px;
312
+ .menu-chevron {
313
+ margin-left: auto;
314
+ padding-left: 8px;
401
315
  font-size: 10px;
402
- color: #999;
316
+ color: #888;
403
317
  }
404
318
 
405
- /* Sub-menu styling */
406
- .menu-item:hover > .sub-menu {
407
- display: block;
319
+ .menu-item.has-submenu {
320
+ position: relative;
408
321
  }
409
322
 
410
323
  .sub-menu {
411
324
  display: none;
412
325
  position: absolute;
413
326
  left: 100%;
414
- top: -5px;
415
- 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;
416
334
  }
417
335
 
418
- .menu-icon {
419
- width: 24px;
420
- display: flex;
421
- justify-content: center;
422
- align-items: center;
423
- margin-right: 8px;
424
- font-size: 14px;
425
- color: #555;
336
+ .menu-item.has-submenu:hover > .sub-menu {
337
+ display: block;
426
338
  }
427
339
 
428
340
  .menu-divider {
429
341
  height: 1px;
430
- background-color: #babed1;
342
+ background: #eee;
431
343
  margin: 4px 0;
432
- opacity: 0.5;
433
344
  }
434
345
 
435
- .floating-filter-row {
436
- background: #fafafa;
437
- border-top: 1px solid #e0e0e0;
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;
356
+ font-size: 12px;
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;
438
363
  }
439
364
 
440
- .floating-filter-container {
441
- width: 100%;
442
- padding: 2px 4px;
443
- box-sizing: border-box;
444
- position: relative;
365
+ .argent-grid-header-resize-handle {
366
+ position: absolute;
367
+ right: -3px;
368
+ top: 0;
369
+ bottom: 0;
370
+ width: 6px;
371
+ cursor: col-resize;
372
+ z-index: 100;
373
+ }
374
+
375
+ .argent-grid-header-resize-handle:hover,
376
+ .argent-grid-header-resize-handle.resizing {
377
+ background: #2196f3;
378
+ cursor: col-resize;
379
+ }
380
+
381
+ .argent-grid-side-bar {
445
382
  display: flex;
446
- align-items: center;
383
+ background: #f8f9fa;
384
+ border-left: 1px solid #babed1;
385
+ transition: width 0.2s;
386
+ flex-basis: 40px;
387
+ width: 40px;
447
388
  }
448
389
 
449
- .floating-filter-input {
450
- width: 100%;
451
- height: 24px;
452
- border: 1px solid #d0d0d0;
453
- border-radius: 2px;
454
- padding: 0 20px 0 6px;
455
- font-size: 12px;
456
- outline: none;
457
- box-sizing: border-box;
390
+ .argent-grid-side-bar.has-active-panel {
391
+ flex-basis: 250px;
392
+ width: 250px;
458
393
  }
459
394
 
460
- .floating-filter-clear {
461
- position: absolute;
462
- right: 8px;
463
- cursor: pointer;
464
- color: #999;
465
- font-size: 10px;
395
+ .side-bar-buttons {
396
+ flex-basis: 40px;
397
+ width: 40px;
466
398
  display: flex;
467
- align-items: center;
468
- justify-content: center;
469
- width: 14px;
470
- height: 14px;
471
- border-radius: 50%;
472
- transition: background-color 0.2s, color 0.2s;
399
+ flex-direction: column;
400
+ border-right: 1px solid #babed1;
473
401
  }
474
402
 
475
- .floating-filter-clear:hover {
476
- background-color: #eee;
477
- color: #333;
403
+ .side-bar-button {
404
+ writing-mode: vertical-rl;
405
+ padding: 12px 8px;
406
+ cursor: pointer;
407
+ border-bottom: 1px solid #babed1;
408
+ background: white;
409
+ user-select: none;
410
+ }
411
+
412
+ .side-bar-button.active {
413
+ background: #2196f3;
414
+ color: white;
415
+ }
416
+
417
+ .tool-panel-content {
418
+ flex: 1;
419
+ overflow: auto;
420
+ background: white;
421
+ padding: 12px;
478
422
  }
479
423
 
480
- .floating-filter-input:focus {
481
- border-color: #2196f3;
482
- box-shadow: 0 0 2px rgba(33, 150, 243, 0.2);
424
+ .argent-grid-viewport {
425
+ flex: 1;
426
+ overflow: auto;
427
+ position: relative;
428
+ }
429
+
430
+ .argent-grid-canvas {
431
+ position: sticky;
432
+ top: 0;
433
+ left: 0;
434
+ width: 100%;
435
+ height: 100%;
436
+ display: block;
437
+ }
438
+
439
+ .argent-grid-scroll-spacer {
440
+ position: absolute;
441
+ top: 0;
442
+ left: 0;
483
443
  }