argent-grid 0.1.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 (53) hide show
  1. package/.github/workflows/pages.yml +68 -0
  2. package/AGENTS.md +179 -0
  3. package/README.md +222 -0
  4. package/demo-app/README.md +70 -0
  5. package/demo-app/angular.json +78 -0
  6. package/demo-app/e2e/benchmark.spec.ts +53 -0
  7. package/demo-app/e2e/demo-page.spec.ts +77 -0
  8. package/demo-app/e2e/grid-features.spec.ts +269 -0
  9. package/demo-app/package-lock.json +14023 -0
  10. package/demo-app/package.json +36 -0
  11. package/demo-app/playwright-test-menu.js +19 -0
  12. package/demo-app/playwright.config.ts +23 -0
  13. package/demo-app/src/app/app.component.ts +10 -0
  14. package/demo-app/src/app/app.config.ts +13 -0
  15. package/demo-app/src/app/app.routes.ts +7 -0
  16. package/demo-app/src/app/demo-page/demo-page.component.css +313 -0
  17. package/demo-app/src/app/demo-page/demo-page.component.html +124 -0
  18. package/demo-app/src/app/demo-page/demo-page.component.ts +366 -0
  19. package/demo-app/src/index.html +19 -0
  20. package/demo-app/src/main.ts +6 -0
  21. package/demo-app/tsconfig.json +31 -0
  22. package/ng-package.json +8 -0
  23. package/package.json +60 -0
  24. package/plan.md +131 -0
  25. package/setup-vitest.ts +18 -0
  26. package/src/lib/argent-grid.module.ts +21 -0
  27. package/src/lib/components/argent-grid.component.css +483 -0
  28. package/src/lib/components/argent-grid.component.html +320 -0
  29. package/src/lib/components/argent-grid.component.spec.ts +189 -0
  30. package/src/lib/components/argent-grid.component.ts +1188 -0
  31. package/src/lib/directives/ag-grid-compatibility.directive.ts +92 -0
  32. package/src/lib/rendering/canvas-renderer.ts +962 -0
  33. package/src/lib/rendering/render/blit.spec.ts +453 -0
  34. package/src/lib/rendering/render/blit.ts +393 -0
  35. package/src/lib/rendering/render/cells.ts +369 -0
  36. package/src/lib/rendering/render/index.ts +105 -0
  37. package/src/lib/rendering/render/lines.ts +363 -0
  38. package/src/lib/rendering/render/theme.spec.ts +282 -0
  39. package/src/lib/rendering/render/theme.ts +201 -0
  40. package/src/lib/rendering/render/types.ts +279 -0
  41. package/src/lib/rendering/render/walk.spec.ts +360 -0
  42. package/src/lib/rendering/render/walk.ts +360 -0
  43. package/src/lib/rendering/utils/damage-tracker.spec.ts +444 -0
  44. package/src/lib/rendering/utils/damage-tracker.ts +423 -0
  45. package/src/lib/rendering/utils/index.ts +7 -0
  46. package/src/lib/services/grid.service.spec.ts +1039 -0
  47. package/src/lib/services/grid.service.ts +1284 -0
  48. package/src/lib/types/ag-grid-types.ts +970 -0
  49. package/src/public-api.ts +22 -0
  50. package/tsconfig.json +32 -0
  51. package/tsconfig.lib.json +11 -0
  52. package/tsconfig.spec.json +8 -0
  53. package/vitest.config.ts +55 -0
@@ -0,0 +1,483 @@
1
+ .argent-grid-container {
2
+ box-sizing: border-box;
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;
8
+ display: flex;
9
+ flex-direction: column;
10
+ }
11
+
12
+ .argent-grid-main-layout {
13
+ display: flex;
14
+ flex: 1;
15
+ overflow: hidden;
16
+ width: 100%;
17
+ }
18
+
19
+ .argent-grid-content-area {
20
+ flex: 1;
21
+ display: flex;
22
+ flex-direction: column;
23
+ overflow: hidden;
24
+ min-width: 0;
25
+ }
26
+
27
+ .argent-grid-side-bar {
28
+ position: absolute;
29
+ right: 0;
30
+ top: 0;
31
+ bottom: 0;
32
+ z-index: 15;
33
+ background: transparent;
34
+ 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 */
43
+ }
44
+
45
+ .side-bar-buttons {
46
+ width: 32px;
47
+ display: flex;
48
+ flex-direction: column;
49
+ pointer-events: none;
50
+ height: 100%;
51
+ border-left: 1px solid #babed1;
52
+ }
53
+
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;
67
+ }
68
+
69
+ .side-bar-button.active {
70
+ background: #fff;
71
+ border-left: 2px solid #2196f3;
72
+ color: #2196f3;
73
+ font-weight: bold;
74
+ }
75
+
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);
84
+ }
85
+
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;
92
+ }
93
+
94
+ .column-list {
95
+ display: flex;
96
+ flex-direction: column;
97
+ gap: 8px;
98
+ }
99
+
100
+ .column-item {
101
+ 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
+ }
109
+
110
+ .column-item:last-child {
111
+ border-bottom: none;
112
+ }
113
+
114
+ .column-drag-handle {
115
+ cursor: grab;
116
+ color: #ccc;
117
+ font-size: 14px;
118
+ user-select: none;
119
+ display: flex;
120
+ align-items: center;
121
+ }
122
+
123
+ .column-drag-handle:active {
124
+ cursor: grabbing;
125
+ }
126
+
127
+ .column-label {
128
+ flex: 1;
129
+ font-size: 12px;
130
+ color: #333;
131
+ overflow: hidden;
132
+ text-overflow: ellipsis;
133
+ white-space: nowrap;
134
+ }
135
+
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);
143
+ display: flex;
144
+ 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;
162
+ }
163
+
164
+ .argent-grid-container *, .argent-grid-container *:before, .argent-grid-container *:after {
165
+ box-sizing: inherit;
166
+ }
167
+
168
+ .argent-grid-header {
169
+ border-bottom: 1px solid #babed1;
170
+ background: #f8f9fa;
171
+ font-weight: 600;
172
+ }
173
+
174
+ .argent-grid-header-row {
175
+ display: flex;
176
+ white-space: nowrap;
177
+ }
178
+
179
+ .argent-grid-header-scrollable {
180
+ overflow: hidden;
181
+ flex: 1;
182
+ }
183
+
184
+ .argent-grid-header-pinned-left-container,
185
+ .argent-grid-header-pinned-right-container {
186
+ display: flex;
187
+ }
188
+
189
+ .cdk-drag-preview {
190
+ box-sizing: border-box;
191
+ 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;
202
+ }
203
+
204
+ .cdk-drag-placeholder {
205
+ opacity: 0.3;
206
+ }
207
+
208
+ .cdk-drag-animating {
209
+ transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
210
+ }
211
+
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);
214
+ }
215
+
216
+ .argent-grid-header-cell {
217
+ padding: 8px 12px;
218
+ border-right: 1px solid #babed1;
219
+ display: flex;
220
+ 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%;
227
+ }
228
+
229
+ .argent-grid-header-cell:hover .argent-grid-header-menu-icon {
230
+ opacity: 1;
231
+ }
232
+
233
+ .argent-grid-header-content {
234
+ display: flex;
235
+ align-items: center;
236
+ overflow: hidden;
237
+ flex: 1;
238
+ height: 100%;
239
+ }
240
+
241
+ .header-text {
242
+ overflow: hidden;
243
+ text-overflow: ellipsis;
244
+ padding-right: 4px;
245
+ }
246
+
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;
254
+ }
255
+
256
+ .argent-grid-header-menu-icon:hover {
257
+ color: #000;
258
+ background: #e0e0e0;
259
+ border-radius: 4px;
260
+ }
261
+
262
+ .argent-grid-header-resize-handle {
263
+ 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;
271
+ }
272
+
273
+ .argent-grid-header-resize-handle:hover,
274
+ .argent-grid-header-resize-handle.resizing {
275
+ background-color: #2196f3;
276
+ }
277
+
278
+ .argent-grid-header-cell-pinned-left {
279
+ position: sticky;
280
+ left: 0;
281
+ z-index: 10;
282
+ background: #f8f9fa;
283
+ }
284
+
285
+ .argent-grid-header-cell-pinned-right {
286
+ position: sticky;
287
+ right: 0;
288
+ z-index: 10;
289
+ background: #f8f9fa;
290
+ }
291
+
292
+ .argent-grid-header-cell.sortable:hover {
293
+ background: #e8e8e8;
294
+ }
295
+
296
+ .sort-indicator {
297
+ margin-left: 4px;
298
+ font-size: 12px;
299
+ }
300
+
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;
308
+ }
309
+
310
+ .argent-grid-canvas {
311
+ position: sticky;
312
+ top: 0;
313
+ left: 0;
314
+ display: block;
315
+ 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;
328
+ }
329
+
330
+ .argent-grid-overlay {
331
+ position: absolute;
332
+ top: 0;
333
+ left: 0;
334
+ right: 0;
335
+ bottom: 0;
336
+ display: flex;
337
+ align-items: center;
338
+ justify-content: center;
339
+ background: rgba(255, 255, 255, 0.9);
340
+ z-index: 10;
341
+ }
342
+
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;
358
+ }
359
+
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;
371
+ }
372
+
373
+ .menu-item {
374
+ padding: 6px 12px;
375
+ cursor: pointer;
376
+ display: flex;
377
+ align-items: center;
378
+ position: relative;
379
+ transition: background-color 0.1s;
380
+ }
381
+
382
+ .menu-item:hover {
383
+ background-color: #f0f2f5;
384
+ }
385
+
386
+ .menu-item.disabled {
387
+ color: #999;
388
+ cursor: not-allowed;
389
+ }
390
+
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;
401
+ font-size: 10px;
402
+ color: #999;
403
+ }
404
+
405
+ /* Sub-menu styling */
406
+ .menu-item:hover > .sub-menu {
407
+ display: block;
408
+ }
409
+
410
+ .sub-menu {
411
+ display: none;
412
+ position: absolute;
413
+ left: 100%;
414
+ top: -5px;
415
+ margin-left: 1px;
416
+ }
417
+
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;
426
+ }
427
+
428
+ .menu-divider {
429
+ height: 1px;
430
+ background-color: #babed1;
431
+ margin: 4px 0;
432
+ opacity: 0.5;
433
+ }
434
+
435
+ .floating-filter-row {
436
+ background: #fafafa;
437
+ border-top: 1px solid #e0e0e0;
438
+ }
439
+
440
+ .floating-filter-container {
441
+ width: 100%;
442
+ padding: 2px 4px;
443
+ box-sizing: border-box;
444
+ position: relative;
445
+ display: flex;
446
+ align-items: center;
447
+ }
448
+
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;
458
+ }
459
+
460
+ .floating-filter-clear {
461
+ position: absolute;
462
+ right: 8px;
463
+ cursor: pointer;
464
+ color: #999;
465
+ font-size: 10px;
466
+ 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;
473
+ }
474
+
475
+ .floating-filter-clear:hover {
476
+ background-color: #eee;
477
+ color: #333;
478
+ }
479
+
480
+ .floating-filter-input:focus {
481
+ border-color: #2196f3;
482
+ box-shadow: 0 0 2px rgba(33, 150, 243, 0.2);
483
+ }