vastgrid 0.0.0-stage → 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 (80) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +24 -2
  3. package/dist/components/bars.d.ts +14 -0
  4. package/dist/components/bars.d.ts.map +1 -0
  5. package/dist/components/bars.js +67 -0
  6. package/dist/components/bars.js.map +1 -0
  7. package/dist/components/cell-inspector.d.ts +11 -0
  8. package/dist/components/cell-inspector.d.ts.map +1 -0
  9. package/dist/components/cell-inspector.js +37 -0
  10. package/dist/components/cell-inspector.js.map +1 -0
  11. package/dist/components/columns-panel.d.ts +12 -0
  12. package/dist/components/columns-panel.d.ts.map +1 -0
  13. package/dist/components/columns-panel.js +11 -0
  14. package/dist/components/columns-panel.js.map +1 -0
  15. package/dist/components/filter-panel.d.ts +17 -0
  16. package/dist/components/filter-panel.d.ts.map +1 -0
  17. package/dist/components/filter-panel.js +165 -0
  18. package/dist/components/filter-panel.js.map +1 -0
  19. package/dist/components/find-bar.d.ts +9 -0
  20. package/dist/components/find-bar.d.ts.map +1 -0
  21. package/dist/components/find-bar.js +46 -0
  22. package/dist/components/find-bar.js.map +1 -0
  23. package/dist/components/popover.d.ts +38 -0
  24. package/dist/components/popover.d.ts.map +1 -0
  25. package/dist/components/popover.js +104 -0
  26. package/dist/components/popover.js.map +1 -0
  27. package/dist/components/stats-panel.d.ts +12 -0
  28. package/dist/components/stats-panel.d.ts.map +1 -0
  29. package/dist/components/stats-panel.js +40 -0
  30. package/dist/components/stats-panel.js.map +1 -0
  31. package/dist/controller.d.ts +218 -0
  32. package/dist/controller.d.ts.map +1 -0
  33. package/dist/controller.js +788 -0
  34. package/dist/controller.js.map +1 -0
  35. package/dist/data-grid.d.ts +51 -0
  36. package/dist/data-grid.d.ts.map +1 -0
  37. package/dist/data-grid.js +698 -0
  38. package/dist/data-grid.js.map +1 -0
  39. package/dist/index.d.ts +7 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +7 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/labels.d.ts +9 -0
  44. package/dist/labels.d.ts.map +1 -0
  45. package/dist/labels.js +38 -0
  46. package/dist/labels.js.map +1 -0
  47. package/dist/messages.d.ts +99 -0
  48. package/dist/messages.d.ts.map +1 -0
  49. package/dist/messages.js +276 -0
  50. package/dist/messages.js.map +1 -0
  51. package/dist/renderer.d.ts +52 -0
  52. package/dist/renderer.d.ts.map +1 -0
  53. package/dist/renderer.js +522 -0
  54. package/dist/renderer.js.map +1 -0
  55. package/dist/styles.css +694 -0
  56. package/dist/text.d.ts +14 -0
  57. package/dist/text.d.ts.map +1 -0
  58. package/dist/text.js +63 -0
  59. package/dist/text.js.map +1 -0
  60. package/dist/theme.d.ts +32 -0
  61. package/dist/theme.d.ts.map +1 -0
  62. package/dist/theme.js +54 -0
  63. package/dist/theme.js.map +1 -0
  64. package/package.json +52 -4
  65. package/src/components/bars.tsx +179 -0
  66. package/src/components/cell-inspector.tsx +70 -0
  67. package/src/components/columns-panel.tsx +59 -0
  68. package/src/components/filter-panel.tsx +290 -0
  69. package/src/components/find-bar.tsx +104 -0
  70. package/src/components/popover.tsx +194 -0
  71. package/src/components/stats-panel.tsx +153 -0
  72. package/src/controller.ts +887 -0
  73. package/src/data-grid.tsx +1029 -0
  74. package/src/index.ts +13 -0
  75. package/src/labels.ts +46 -0
  76. package/src/messages.ts +390 -0
  77. package/src/renderer.ts +535 -0
  78. package/src/styles.css +694 -0
  79. package/src/text.ts +55 -0
  80. package/src/theme.ts +89 -0
@@ -0,0 +1,694 @@
1
+ /*
2
+ * vastgrid styles. Every color, font and size is a custom property on `.vg-root`; override them in
3
+ * your own CSS (the canvas reads them, so changes apply to the cells as well). Colors use
4
+ * light-dark(), following the page's `color-scheme`.
5
+ */
6
+ .vg-root {
7
+ --vg-font-family: system-ui, -apple-system, "Segoe UI", "Hiragino Sans", "Noto Sans JP", sans-serif;
8
+ --vg-font-size: 13px;
9
+ --vg-row-height: 24px;
10
+ --vg-header-height: 32px;
11
+ --vg-radius: 6px;
12
+ --vg-bg: light-dark(#ffffff, #16161a);
13
+ --vg-fg: light-dark(#1f2328, #e6e6eb);
14
+ --vg-muted: light-dark(#656d76, #9a9aa6);
15
+ --vg-surface: light-dark(#ffffff, #1e1e24);
16
+ --vg-surface-muted: light-dark(#f6f8fa, #24242b);
17
+ --vg-border: light-dark(#d0d7de, #3a3a44);
18
+ --vg-header-bg: light-dark(#f6f8fa, #1d1d23);
19
+ --vg-header-fg: light-dark(#1f2328, #e6e6eb);
20
+ --vg-header-active-bg: light-dark(#eaeef2, #2b2b33);
21
+ --vg-gutter-bg: light-dark(#f6f8fa, #1b1b20);
22
+ --vg-gutter-fg: light-dark(#656d76, #8a8a96);
23
+ --vg-gutter-view-fg: light-dark(#0b57d0, #8ab4f8);
24
+ --vg-line: light-dark(#e6e9ed, #2a2a31);
25
+ --vg-line-strong: light-dark(#c8ced5, #3d3d47);
26
+ --vg-selection-bg: light-dark(rgb(11 87 208 / 12%), rgb(138 180 248 / 18%));
27
+ --vg-selection-border: light-dark(#0b57d0, #8ab4f8);
28
+ --vg-active-border: light-dark(#0b57d0, #8ab4f8);
29
+ --vg-accent: light-dark(#0b57d0, #8ab4f8);
30
+ --vg-accent-fg: light-dark(#ffffff, #0d1b33);
31
+ --vg-null-fg: light-dark(#8c959f, #6e6e7a);
32
+ --vg-placeholder: light-dark(#eef1f4, #26262d);
33
+ --vg-match-bg: light-dark(rgb(255 212 61 / 45%), rgb(255 212 61 / 28%));
34
+ --vg-error-fg: light-dark(#b42318, #ff8a80);
35
+ --vg-focus: light-dark(#0b57d0, #8ab4f8);
36
+ --vg-shadow: 0 8px 28px light-dark(rgb(31 35 40 / 18%), rgb(0 0 0 / 50%));
37
+
38
+ position: relative;
39
+ display: flex;
40
+ flex-direction: column;
41
+ min-width: 0;
42
+ min-height: 0;
43
+ height: 100%;
44
+ overflow: hidden;
45
+ background: var(--vg-bg);
46
+ color: var(--vg-fg);
47
+ font-family: var(--vg-font-family);
48
+ font-size: var(--vg-font-size);
49
+ line-height: 1.4;
50
+ }
51
+
52
+ .vg-root *,
53
+ .vg-root *::before,
54
+ .vg-root *::after {
55
+ box-sizing: border-box;
56
+ }
57
+
58
+ .vg-body {
59
+ position: relative;
60
+ flex: 1 1 auto;
61
+ min-height: 0;
62
+ overflow: hidden;
63
+ }
64
+
65
+ .vg-canvas {
66
+ position: absolute;
67
+ top: 0;
68
+ left: 0;
69
+ display: block;
70
+ }
71
+
72
+ .vg-scroller {
73
+ position: absolute;
74
+ inset: 0;
75
+ overflow: auto;
76
+ outline: none;
77
+ overscroll-behavior: contain;
78
+ touch-action: pan-x pan-y;
79
+ }
80
+
81
+ .vg-scroller:focus-visible {
82
+ box-shadow: inset 0 0 0 2px var(--vg-focus);
83
+ }
84
+
85
+ .vg-sizer {
86
+ pointer-events: none;
87
+ }
88
+
89
+ .vg-sr-only {
90
+ position: absolute;
91
+ width: 1px;
92
+ height: 1px;
93
+ margin: -1px;
94
+ padding: 0;
95
+ overflow: hidden;
96
+ clip-path: inset(50%);
97
+ white-space: nowrap;
98
+ border: 0;
99
+ }
100
+
101
+ /* Toolbar and status bar */
102
+
103
+ .vg-toolbar,
104
+ .vg-statusbar {
105
+ display: flex;
106
+ flex: none;
107
+ flex-wrap: wrap;
108
+ align-items: center;
109
+ gap: 6px;
110
+ padding: 6px 8px;
111
+ background: var(--vg-header-bg);
112
+ border-bottom: 1px solid var(--vg-line-strong);
113
+ }
114
+
115
+ .vg-statusbar {
116
+ flex-wrap: nowrap;
117
+ min-height: 28px;
118
+ padding-block: 3px;
119
+ overflow: hidden;
120
+ color: var(--vg-muted);
121
+ font-size: 0.92em;
122
+ white-space: nowrap;
123
+ border-top: 1px solid var(--vg-line-strong);
124
+ border-bottom: none;
125
+ }
126
+
127
+ .vg-toolbar__search {
128
+ flex: 0 1 260px;
129
+ min-width: 140px;
130
+ }
131
+
132
+ .vg-toolbar__spacer {
133
+ flex: 1 1 auto;
134
+ }
135
+
136
+ .vg-toolbar__count {
137
+ color: var(--vg-muted);
138
+ font-variant-numeric: tabular-nums;
139
+ white-space: nowrap;
140
+ }
141
+
142
+ .vg-statusbar__cell {
143
+ overflow: hidden;
144
+ color: var(--vg-fg);
145
+ text-overflow: ellipsis;
146
+ }
147
+
148
+ .vg-statusbar__muted,
149
+ .vg-statusbar__note {
150
+ overflow: hidden;
151
+ color: var(--vg-muted);
152
+ text-overflow: ellipsis;
153
+ }
154
+
155
+ .vg-statusbar__summary {
156
+ display: flex;
157
+ gap: 14px;
158
+ font-variant-numeric: tabular-nums;
159
+ }
160
+
161
+ .vg-progress {
162
+ position: relative;
163
+ flex: none;
164
+ height: 2px;
165
+ overflow: hidden;
166
+ background: var(--vg-line);
167
+ }
168
+
169
+ .vg-progress > span {
170
+ position: absolute;
171
+ inset: 0 auto 0 0;
172
+ width: 0;
173
+ background: var(--vg-accent);
174
+ transition: width 200ms linear;
175
+ }
176
+
177
+ .vg-progress > span[data-indeterminate] {
178
+ width: 30%;
179
+ animation: vg-indeterminate 1.1s ease-in-out infinite;
180
+ }
181
+
182
+ @keyframes vg-indeterminate {
183
+ from {
184
+ left: -30%;
185
+ }
186
+ to {
187
+ left: 100%;
188
+ }
189
+ }
190
+
191
+ /* Controls */
192
+
193
+ .vg-input {
194
+ min-height: 28px;
195
+ padding: 3px 8px;
196
+ color: var(--vg-fg);
197
+ font: inherit;
198
+ background: var(--vg-surface);
199
+ border: 1px solid var(--vg-border);
200
+ border-radius: var(--vg-radius);
201
+ }
202
+
203
+ .vg-input:focus-visible {
204
+ outline: 2px solid var(--vg-focus);
205
+ outline-offset: -1px;
206
+ }
207
+
208
+ .vg-input:disabled {
209
+ opacity: 0.6;
210
+ }
211
+
212
+ .vg-button,
213
+ .vg-icon-button {
214
+ display: inline-flex;
215
+ align-items: center;
216
+ justify-content: center;
217
+ min-height: 28px;
218
+ padding: 3px 10px;
219
+ color: var(--vg-fg);
220
+ font: inherit;
221
+ white-space: nowrap;
222
+ cursor: pointer;
223
+ background: var(--vg-surface);
224
+ border: 1px solid var(--vg-border);
225
+ border-radius: var(--vg-radius);
226
+ }
227
+
228
+ .vg-icon-button {
229
+ min-width: 28px;
230
+ padding: 0 6px;
231
+ border-color: transparent;
232
+ background: transparent;
233
+ }
234
+
235
+ .vg-button:hover:not(:disabled),
236
+ .vg-icon-button:hover:not(:disabled) {
237
+ background: var(--vg-header-active-bg);
238
+ }
239
+
240
+ .vg-button:focus-visible,
241
+ .vg-icon-button:focus-visible,
242
+ .vg-chip__remove:focus-visible,
243
+ .vg-menu__item:focus-visible {
244
+ outline: 2px solid var(--vg-focus);
245
+ outline-offset: -2px;
246
+ }
247
+
248
+ .vg-button:disabled {
249
+ cursor: default;
250
+ opacity: 0.55;
251
+ }
252
+
253
+ .vg-button--small {
254
+ min-height: 26px;
255
+ padding: 2px 8px;
256
+ }
257
+
258
+ .vg-button--primary {
259
+ color: var(--vg-accent-fg);
260
+ background: var(--vg-accent);
261
+ border-color: var(--vg-accent);
262
+ }
263
+
264
+ .vg-button--primary:hover:not(:disabled) {
265
+ background: var(--vg-accent);
266
+ filter: brightness(1.08);
267
+ }
268
+
269
+ .vg-chip {
270
+ display: inline-flex;
271
+ align-items: center;
272
+ max-width: 320px;
273
+ min-height: 26px;
274
+ padding: 1px 2px 1px 9px;
275
+ background: var(--vg-surface);
276
+ border: 1px solid var(--vg-border);
277
+ border-radius: 999px;
278
+ }
279
+
280
+ .vg-chip > span {
281
+ overflow: hidden;
282
+ text-overflow: ellipsis;
283
+ white-space: nowrap;
284
+ }
285
+
286
+ .vg-chip--filter {
287
+ border-color: var(--vg-accent);
288
+ }
289
+
290
+ .vg-chip__remove {
291
+ flex: none;
292
+ width: 22px;
293
+ height: 22px;
294
+ margin-left: 2px;
295
+ padding: 0;
296
+ color: var(--vg-muted);
297
+ font: inherit;
298
+ line-height: 1;
299
+ cursor: pointer;
300
+ background: transparent;
301
+ border: none;
302
+ border-radius: 999px;
303
+ }
304
+
305
+ .vg-chip__remove:hover {
306
+ color: var(--vg-fg);
307
+ background: var(--vg-header-active-bg);
308
+ }
309
+
310
+ /* Messages over the grid */
311
+
312
+ .vg-message {
313
+ position: absolute;
314
+ inset: 40% 16px auto;
315
+ display: flex;
316
+ flex-direction: column;
317
+ align-items: center;
318
+ gap: 10px;
319
+ color: var(--vg-muted);
320
+ text-align: center;
321
+ pointer-events: none;
322
+ }
323
+
324
+ .vg-message button {
325
+ pointer-events: auto;
326
+ }
327
+
328
+ .vg-root[data-status="error"] .vg-message {
329
+ color: var(--vg-error-fg);
330
+ }
331
+
332
+ .vg-toast {
333
+ position: absolute;
334
+ bottom: 12px;
335
+ left: 50%;
336
+ max-width: calc(100% - 32px);
337
+ padding: 6px 12px;
338
+ color: var(--vg-bg);
339
+ background: var(--vg-fg);
340
+ border-radius: var(--vg-radius);
341
+ box-shadow: var(--vg-shadow);
342
+ transform: translateX(-50%);
343
+ pointer-events: none;
344
+ }
345
+
346
+ /* Find */
347
+
348
+ .vg-find {
349
+ position: absolute;
350
+ top: calc(var(--vg-header-height) + 6px);
351
+ right: 18px;
352
+ z-index: 3;
353
+ display: flex;
354
+ align-items: center;
355
+ gap: 2px;
356
+ padding: 4px;
357
+ background: var(--vg-surface);
358
+ border: 1px solid var(--vg-border);
359
+ border-radius: var(--vg-radius);
360
+ box-shadow: var(--vg-shadow);
361
+ }
362
+
363
+ .vg-find .vg-input {
364
+ width: 200px;
365
+ }
366
+
367
+ .vg-find__status {
368
+ min-width: 0;
369
+ padding: 0 4px;
370
+ color: var(--vg-muted);
371
+ font-size: 0.92em;
372
+ white-space: nowrap;
373
+ }
374
+
375
+ .vg-find__case {
376
+ display: inline-flex;
377
+ align-items: center;
378
+ gap: 2px;
379
+ padding: 0 4px;
380
+ color: var(--vg-muted);
381
+ cursor: pointer;
382
+ }
383
+
384
+ /* Popovers, menus and panels */
385
+
386
+ .vg-popover {
387
+ position: absolute;
388
+ z-index: 10;
389
+ min-width: 200px;
390
+ max-width: min(420px, calc(100% - 8px));
391
+ max-height: calc(100% - 8px);
392
+ overflow: auto;
393
+ color: var(--vg-fg);
394
+ background: var(--vg-surface);
395
+ border: 1px solid var(--vg-border);
396
+ border-radius: var(--vg-radius);
397
+ box-shadow: var(--vg-shadow);
398
+ }
399
+
400
+ .vg-popover--panel {
401
+ width: 300px;
402
+ padding: 10px;
403
+ }
404
+
405
+ .vg-popover--wide {
406
+ width: min(560px, calc(100% - 8px));
407
+ }
408
+
409
+ .vg-menu {
410
+ padding: 4px;
411
+ }
412
+
413
+ .vg-menu__item {
414
+ display: flex;
415
+ align-items: center;
416
+ justify-content: space-between;
417
+ gap: 16px;
418
+ width: 100%;
419
+ min-height: 30px;
420
+ padding: 4px 10px;
421
+ color: inherit;
422
+ font: inherit;
423
+ text-align: left;
424
+ cursor: pointer;
425
+ background: transparent;
426
+ border: none;
427
+ border-radius: calc(var(--vg-radius) - 2px);
428
+ }
429
+
430
+ .vg-menu__item:hover:not(:disabled),
431
+ .vg-menu__item:focus-visible {
432
+ background: var(--vg-header-active-bg);
433
+ }
434
+
435
+ .vg-menu__item:disabled {
436
+ cursor: default;
437
+ opacity: 0.5;
438
+ }
439
+
440
+ .vg-menu__item[aria-checked="true"]::after {
441
+ content: "✓";
442
+ color: var(--vg-accent);
443
+ }
444
+
445
+ .vg-menu__item kbd {
446
+ color: var(--vg-muted);
447
+ font: inherit;
448
+ font-size: 0.9em;
449
+ }
450
+
451
+ .vg-menu__separator {
452
+ margin: 4px 6px;
453
+ border: none;
454
+ border-top: 1px solid var(--vg-line);
455
+ }
456
+
457
+ .vg-panel__title {
458
+ margin: 0 0 8px;
459
+ font-weight: 600;
460
+ overflow-wrap: anywhere;
461
+ }
462
+
463
+ .vg-panel__muted {
464
+ margin: 6px 0 0;
465
+ color: var(--vg-muted);
466
+ font-weight: 400;
467
+ }
468
+
469
+ .vg-panel__error {
470
+ margin: 6px 0 0;
471
+ color: var(--vg-error-fg);
472
+ }
473
+
474
+ .vg-panel__actions {
475
+ display: flex;
476
+ justify-content: flex-end;
477
+ gap: 6px;
478
+ margin-top: 10px;
479
+ }
480
+
481
+ .vg-filter,
482
+ .vg-columns {
483
+ display: flex;
484
+ flex-direction: column;
485
+ gap: 6px;
486
+ }
487
+
488
+ .vg-filter > .vg-input,
489
+ .vg-columns > .vg-input {
490
+ width: 100%;
491
+ }
492
+
493
+ .vg-filter__values {
494
+ min-inline-size: 0;
495
+ max-height: 260px;
496
+ margin: 0;
497
+ padding: 0;
498
+ overflow: auto;
499
+ border: 1px solid var(--vg-line);
500
+ border-radius: var(--vg-radius);
501
+ }
502
+
503
+ .vg-check {
504
+ display: flex;
505
+ align-items: center;
506
+ gap: 6px;
507
+ min-height: 26px;
508
+ padding: 2px 8px;
509
+ cursor: pointer;
510
+ }
511
+
512
+ .vg-check:hover {
513
+ background: var(--vg-header-active-bg);
514
+ }
515
+
516
+ .vg-check--all {
517
+ border-bottom: 1px solid var(--vg-line);
518
+ }
519
+
520
+ .vg-check__label {
521
+ flex: 1 1 auto;
522
+ overflow: hidden;
523
+ text-overflow: ellipsis;
524
+ white-space: nowrap;
525
+ }
526
+
527
+ .vg-check__count {
528
+ flex: none;
529
+ color: var(--vg-muted);
530
+ font-variant-numeric: tabular-nums;
531
+ }
532
+
533
+ .vg-filter__condition {
534
+ display: flex;
535
+ flex-wrap: wrap;
536
+ gap: 6px;
537
+ margin: 4px 0 0;
538
+ padding: 0;
539
+ border: none;
540
+ }
541
+
542
+ .vg-filter__condition legend {
543
+ margin-bottom: 4px;
544
+ padding: 0;
545
+ color: var(--vg-muted);
546
+ }
547
+
548
+ .vg-filter__condition .vg-input {
549
+ flex: 1 1 120px;
550
+ min-width: 0;
551
+ }
552
+
553
+ .vg-stats__list {
554
+ display: grid;
555
+ grid-template-columns: auto 1fr;
556
+ gap: 3px 12px;
557
+ margin: 0;
558
+ }
559
+
560
+ .vg-stats__list dt {
561
+ color: var(--vg-muted);
562
+ }
563
+
564
+ .vg-stats__list dd {
565
+ margin: 0;
566
+ overflow-wrap: anywhere;
567
+ font-variant-numeric: tabular-nums;
568
+ text-align: right;
569
+ }
570
+
571
+ .vg-stats__histogram,
572
+ .vg-stats__top {
573
+ margin: 12px 0 0;
574
+ }
575
+
576
+ .vg-stats__histogram figcaption,
577
+ .vg-stats__top figcaption {
578
+ margin-bottom: 6px;
579
+ color: var(--vg-muted);
580
+ }
581
+
582
+ .vg-stats__bars {
583
+ display: flex;
584
+ align-items: flex-end;
585
+ gap: 1px;
586
+ height: 64px;
587
+ border-bottom: 1px solid var(--vg-line-strong);
588
+ }
589
+
590
+ .vg-stats__bar {
591
+ flex: 1 1 0;
592
+ min-width: 2px;
593
+ background: var(--vg-accent);
594
+ border-radius: 2px 2px 0 0;
595
+ opacity: 0.8;
596
+ }
597
+
598
+ .vg-stats__axis {
599
+ display: flex;
600
+ justify-content: space-between;
601
+ gap: 8px;
602
+ margin-top: 2px;
603
+ color: var(--vg-muted);
604
+ font-size: 0.85em;
605
+ font-variant-numeric: tabular-nums;
606
+ }
607
+
608
+ .vg-stats__top ul {
609
+ display: flex;
610
+ flex-direction: column;
611
+ gap: 2px;
612
+ margin: 0;
613
+ padding: 0;
614
+ list-style: none;
615
+ }
616
+
617
+ .vg-stats__top li {
618
+ position: relative;
619
+ display: flex;
620
+ justify-content: space-between;
621
+ gap: 8px;
622
+ padding: 2px 6px;
623
+ }
624
+
625
+ .vg-stats__top-bar {
626
+ position: absolute;
627
+ inset: 0 auto 0 0;
628
+ background: var(--vg-selection-bg);
629
+ border-radius: 3px;
630
+ }
631
+
632
+ .vg-stats__top-label {
633
+ position: relative;
634
+ overflow: hidden;
635
+ text-overflow: ellipsis;
636
+ white-space: nowrap;
637
+ }
638
+
639
+ .vg-stats__top-count {
640
+ position: relative;
641
+ color: var(--vg-muted);
642
+ font-variant-numeric: tabular-nums;
643
+ }
644
+
645
+ .vg-inspector__value {
646
+ max-height: min(50vh, 420px);
647
+ margin: 0;
648
+ padding: 8px;
649
+ overflow: auto;
650
+ font-family: ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;
651
+ font-size: 0.95em;
652
+ white-space: pre-wrap;
653
+ overflow-wrap: anywhere;
654
+ background: var(--vg-surface-muted);
655
+ border-radius: var(--vg-radius);
656
+ }
657
+
658
+ .vg-inspector__value[data-null] {
659
+ color: var(--vg-null-fg);
660
+ }
661
+
662
+ @media (prefers-reduced-motion: reduce) {
663
+ .vg-progress > span {
664
+ transition: none;
665
+ }
666
+
667
+ .vg-progress > span[data-indeterminate] {
668
+ left: 0;
669
+ width: 100%;
670
+ opacity: 0.5;
671
+ animation: none;
672
+ }
673
+ }
674
+
675
+ @media (forced-colors: active) {
676
+ .vg-root {
677
+ --vg-bg: Canvas;
678
+ --vg-fg: CanvasText;
679
+ --vg-muted: GrayText;
680
+ --vg-surface: Canvas;
681
+ --vg-header-bg: Canvas;
682
+ --vg-header-fg: CanvasText;
683
+ --vg-gutter-bg: Canvas;
684
+ --vg-gutter-fg: CanvasText;
685
+ --vg-gutter-view-fg: LinkText;
686
+ --vg-line: GrayText;
687
+ --vg-line-strong: CanvasText;
688
+ --vg-selection-bg: transparent;
689
+ --vg-selection-border: Highlight;
690
+ --vg-active-border: Highlight;
691
+ --vg-accent: Highlight;
692
+ --vg-focus: Highlight;
693
+ }
694
+ }
package/dist/text.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ /** Measures and shortens text for one font, caching results because the same strings repeat a lot. */
2
+ export declare class TextFitter {
3
+ private readonly context;
4
+ readonly font: string;
5
+ private readonly widths;
6
+ private readonly fits;
7
+ private ellipsisWidth;
8
+ constructor(context: CanvasRenderingContext2D, font: string);
9
+ /** Width of `text`. The caller must have set `context.font` to this fitter's font. */
10
+ width(text: string): number;
11
+ /** `text`, shortened with "…" to fit in `maxWidth`. */
12
+ fit(text: string, maxWidth: number): string;
13
+ }
14
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"AAGA,sGAAsG;AACtG,qBAAa,UAAU;IAMnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM;IANvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6B;IAClD,OAAO,CAAC,aAAa,CAAM;IAE3B,YACmB,OAAO,EAAE,wBAAwB,EACzC,IAAI,EAAE,MAAM,EACnB;IAEJ,sFAAsF;IACtF,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ1B;IAED,uDAAuD;IACvD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2B1C;CACF"}