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,522 @@
1
+ import { isNumericType, rangeContains, } from "vastgrid-core";
2
+ import { TextFitter } from "./text.js";
3
+ const PADDING = 8;
4
+ const ICON_SPACE = 18;
5
+ /** A short mark for the column type, drawn before the column name. */
6
+ function typeMark(type) {
7
+ switch (type) {
8
+ case "integer":
9
+ case "bigint":
10
+ case "float":
11
+ case "decimal":
12
+ return "#";
13
+ case "boolean":
14
+ return "✓";
15
+ case "date":
16
+ case "time":
17
+ case "timestamp":
18
+ case "timestamptz":
19
+ case "interval":
20
+ return "◷";
21
+ case "list":
22
+ case "struct":
23
+ case "map":
24
+ case "json":
25
+ return "{}";
26
+ case "string":
27
+ return "A";
28
+ default:
29
+ return "·";
30
+ }
31
+ }
32
+ /**
33
+ * Draws a `GridController` onto a canvas: cells, headers, row numbers, grid lines and the
34
+ * selection. Draws at most once per animation frame, only what is visible.
35
+ */
36
+ export class CanvasRenderer {
37
+ canvas;
38
+ controller;
39
+ context;
40
+ theme;
41
+ cellText;
42
+ headerText;
43
+ smallText;
44
+ frame = 0;
45
+ ratio = 1;
46
+ formatKey = "";
47
+ /** Widths numeric columns needed in the last frame. */
48
+ needed = new Map();
49
+ /** Durations of the last frames in milliseconds, for diagnostics (`timings()`). */
50
+ durations = [];
51
+ constructor(canvas, controller, theme) {
52
+ this.canvas = canvas;
53
+ this.controller = controller;
54
+ const context = canvas.getContext("2d", { alpha: false });
55
+ if (!context)
56
+ throw new Error("Canvas 2D is not available.");
57
+ this.context = context;
58
+ this.theme = theme;
59
+ this.setTheme(theme);
60
+ controller.measure = (text, header) => {
61
+ const fitter = header ? this.headerText : this.cellText;
62
+ this.context.font = fitter.font;
63
+ return fitter.width(text);
64
+ };
65
+ }
66
+ setTheme(theme) {
67
+ this.theme = theme;
68
+ this.cellText = new TextFitter(this.context, theme.font);
69
+ this.headerText = new TextFitter(this.context, theme.headerFont);
70
+ this.smallText = new TextFitter(this.context, theme.smallFont);
71
+ this.formatKey = "";
72
+ this.controller.updateLayout();
73
+ this.schedule();
74
+ }
75
+ schedule() {
76
+ if (this.frame)
77
+ return;
78
+ this.frame = requestAnimationFrame(() => {
79
+ this.frame = 0;
80
+ this.draw();
81
+ });
82
+ }
83
+ dispose() {
84
+ if (this.frame)
85
+ cancelAnimationFrame(this.frame);
86
+ this.frame = 0;
87
+ this.controller.measure = null;
88
+ }
89
+ /** A 1-device-pixel line position. */
90
+ snap(value) {
91
+ return (Math.round(value * this.ratio) + 0.5) / this.ratio;
92
+ }
93
+ resize() {
94
+ const { width, height } = this.controller;
95
+ const ratio = window.devicePixelRatio || 1;
96
+ const pixelWidth = Math.max(1, Math.round(width * ratio));
97
+ const pixelHeight = Math.max(1, Math.round(height * ratio));
98
+ if (this.canvas.width !== pixelWidth || this.canvas.height !== pixelHeight || this.ratio !== ratio) {
99
+ this.canvas.width = pixelWidth;
100
+ this.canvas.height = pixelHeight;
101
+ this.canvas.style.width = `${width}px`;
102
+ this.canvas.style.height = `${height}px`;
103
+ this.ratio = ratio;
104
+ }
105
+ this.context.setTransform(ratio, 0, 0, ratio, 0, 0);
106
+ }
107
+ /** Average and slowest draw time of the recent frames, in milliseconds. */
108
+ timings() {
109
+ const count = this.durations.length;
110
+ const total = this.durations.reduce((sum, value) => sum + value, 0);
111
+ return { frames: count, average: count ? total / count : 0, slowest: count ? Math.max(...this.durations) : 0 };
112
+ }
113
+ draw() {
114
+ const started = performance.now();
115
+ this.paint();
116
+ this.durations.push(performance.now() - started);
117
+ if (this.durations.length > 120)
118
+ this.durations.shift();
119
+ }
120
+ paint() {
121
+ const c = this.controller;
122
+ const ctx = this.context;
123
+ const t = this.theme;
124
+ this.resize();
125
+ ctx.fillStyle = t.background;
126
+ ctx.fillRect(0, 0, c.width, c.height);
127
+ if (!c.info || c.visible.length === 0)
128
+ return;
129
+ this.formatKey = String(c.formatVersion);
130
+ const [firstRow, lastRow] = c.visibleRows();
131
+ const [firstCol, lastCol] = c.visibleScrollColumns();
132
+ const wanted = [];
133
+ for (let col = 0; col < c.frozen; col++)
134
+ wanted.push(c.visible[col].index);
135
+ for (let col = firstCol; col <= lastCol; col++)
136
+ wanted.push(c.visible[col].index);
137
+ c.cache.want(firstRow, lastRow, wanted);
138
+ const headerHeight = c.options.headerHeight;
139
+ const scrollLeft = c.gutterWidth + c.frozenWidth;
140
+ // Scrollable columns.
141
+ this.clipped(scrollLeft, headerHeight, c.width - scrollLeft, c.height - headerHeight, () => {
142
+ for (let col = firstCol; col <= lastCol; col++)
143
+ this.drawCells(col, firstRow, lastRow);
144
+ this.drawLines(firstCol, lastCol, firstRow, lastRow);
145
+ this.drawSelection(false);
146
+ });
147
+ // Frozen columns.
148
+ if (c.frozen > 0) {
149
+ this.clipped(c.gutterWidth, headerHeight, c.frozenWidth, c.height - headerHeight, () => {
150
+ for (let col = 0; col < c.frozen; col++)
151
+ this.drawCells(col, firstRow, lastRow);
152
+ this.drawLines(0, c.frozen - 1, firstRow, lastRow);
153
+ this.drawSelection(true);
154
+ });
155
+ }
156
+ this.drawHeaders(firstCol, lastCol);
157
+ this.drawGutter(firstRow, lastRow);
158
+ this.drawCorner();
159
+ if (this.needed.size > 0) {
160
+ const needed = new Map(this.needed);
161
+ this.needed.clear();
162
+ c.growColumns(needed);
163
+ }
164
+ if (c.frozen > 0) {
165
+ ctx.strokeStyle = t.lineStrong;
166
+ ctx.lineWidth = 1;
167
+ ctx.beginPath();
168
+ const x = this.snap(scrollLeft) - 0.5 / this.ratio;
169
+ ctx.moveTo(x, 0);
170
+ ctx.lineTo(x, c.height);
171
+ ctx.stroke();
172
+ }
173
+ if (c.resizing >= 0) {
174
+ const x = c.columnX(c.resizing) + c.layout.width(c.resizing);
175
+ ctx.fillStyle = t.accent;
176
+ ctx.fillRect(x - 1, 0, 2, c.height);
177
+ }
178
+ }
179
+ clipped(x, y, width, height, draw) {
180
+ if (width <= 0 || height <= 0)
181
+ return;
182
+ const ctx = this.context;
183
+ ctx.save();
184
+ ctx.beginPath();
185
+ ctx.rect(x, y, width, height);
186
+ ctx.clip();
187
+ draw();
188
+ ctx.restore();
189
+ }
190
+ textOf(block, column, row, value, type) {
191
+ if (block.textKey !== this.formatKey || !block.text) {
192
+ block.text = block.columns.map(() => []);
193
+ block.textKey = this.formatKey;
194
+ }
195
+ const list = block.text[column - block.firstColumn];
196
+ const offset = row - block.start;
197
+ let text = list[offset];
198
+ if (text === undefined) {
199
+ text = this.controller.formatter.format(value, type);
200
+ list[offset] = text;
201
+ }
202
+ return text;
203
+ }
204
+ drawCells(col, firstRow, lastRow) {
205
+ const c = this.controller;
206
+ const ctx = this.context;
207
+ const t = this.theme;
208
+ const state = c.visible[col];
209
+ const schema = c.schema[state.index];
210
+ if (!schema)
211
+ return;
212
+ const x = c.columnX(col);
213
+ const width = c.layout.width(col);
214
+ const rowHeight = c.options.rowHeight;
215
+ const numeric = isNumericType(schema.type);
216
+ const textWidth = width - PADDING * 2;
217
+ const find = c.findText ? (c.findCaseSensitive ? c.findText : c.findText.toLowerCase()) : "";
218
+ ctx.save();
219
+ ctx.beginPath();
220
+ ctx.rect(x, c.options.headerHeight, width, c.height);
221
+ ctx.clip();
222
+ ctx.font = this.cellText.font;
223
+ ctx.textBaseline = "middle";
224
+ ctx.textAlign = numeric ? "right" : "left";
225
+ const textX = numeric ? x + width - PADDING : x + PADDING;
226
+ for (let row = firstRow; row < lastRow; row++) {
227
+ const y = c.rowY(row);
228
+ const block = c.cache.blockAt(row, state.index);
229
+ if (block?.state !== "ready" || !block.values || row >= block.end) {
230
+ if (row < c.readableRows && textWidth > 12) {
231
+ ctx.fillStyle = block?.state === "error" ? t.error : t.placeholder;
232
+ const length = Math.min(textWidth, 24 + ((row * 7919 + state.index * 104729) % 48));
233
+ ctx.fillRect(numeric ? x + width - PADDING - length : x + PADDING, y + rowHeight / 2 - 3, length, 6);
234
+ }
235
+ continue;
236
+ }
237
+ const value = block.values[state.index - block.firstColumn]?.[row - block.start] ?? null;
238
+ const text = this.textOf(block, state.index, row, value, schema.type);
239
+ if (find && text && (c.findCaseSensitive ? text : text.toLowerCase()).includes(find)) {
240
+ ctx.fillStyle = t.match;
241
+ ctx.fillRect(x, y, width, rowHeight);
242
+ }
243
+ if (text === "")
244
+ continue;
245
+ ctx.fillStyle = value === null ? t.nullText : t.text;
246
+ if (numeric && value !== null && !state.sized) {
247
+ const needed = this.cellText.width(text) + PADDING * 2 + 2;
248
+ if (needed > width && needed > (this.needed.get(col) ?? 0))
249
+ this.needed.set(col, needed);
250
+ }
251
+ ctx.fillText(this.cellText.fit(text, textWidth), textX, y + rowHeight / 2 + 0.5);
252
+ }
253
+ ctx.restore();
254
+ }
255
+ drawLines(firstCol, lastCol, firstRow, lastRow) {
256
+ const c = this.controller;
257
+ const ctx = this.context;
258
+ const top = c.options.headerHeight;
259
+ const bottom = Math.min(c.height, c.rowY(c.rowCount));
260
+ const left = firstCol < c.frozen ? c.gutterWidth : c.gutterWidth + c.frozenWidth;
261
+ const right = lastCol >= 0 ? Math.min(c.width, c.columnX(lastCol) + c.layout.width(lastCol)) : left;
262
+ ctx.strokeStyle = this.theme.line;
263
+ ctx.lineWidth = 1 / this.ratio;
264
+ ctx.beginPath();
265
+ for (let row = firstRow; row < lastRow; row++) {
266
+ const y = this.snap(c.rowY(row + 1)) - 1 / this.ratio;
267
+ ctx.moveTo(left, y);
268
+ ctx.lineTo(right, y);
269
+ }
270
+ for (let col = firstCol; col <= lastCol; col++) {
271
+ const x = this.snap(c.columnX(col) + c.layout.width(col)) - 1 / this.ratio;
272
+ ctx.moveTo(x, top);
273
+ ctx.lineTo(x, bottom);
274
+ }
275
+ ctx.stroke();
276
+ }
277
+ /** The screen rectangle of a range within the frozen or the scrollable columns, or null. */
278
+ rangeRect(range, frozen) {
279
+ const c = this.controller;
280
+ const left = frozen ? range.left : Math.max(range.left, c.frozen);
281
+ const right = frozen ? Math.min(range.right, c.frozen - 1) : range.right;
282
+ if (left > right)
283
+ return null;
284
+ const x0 = c.columnX(left);
285
+ const x1 = c.columnX(right) + c.layout.width(right);
286
+ const y0 = Math.max(c.options.headerHeight - 2, c.rowY(range.top));
287
+ const y1 = Math.min(c.height + 2, c.rowY(range.bottom + 1));
288
+ if (y1 <= y0)
289
+ return null;
290
+ return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };
291
+ }
292
+ drawSelection(frozen) {
293
+ const c = this.controller;
294
+ const ctx = this.context;
295
+ const t = this.theme;
296
+ if (c.rowCount === 0)
297
+ return;
298
+ const ranges = c.selection.ranges;
299
+ const active = c.selection.active;
300
+ const single = c.selection.single;
301
+ const activeRect = this.rangeRect({ top: active.row, bottom: active.row, left: active.col, right: active.col }, frozen);
302
+ if (!single) {
303
+ ctx.fillStyle = t.selection;
304
+ ranges.forEach((range) => {
305
+ const rect = this.rangeRect(range, frozen);
306
+ if (!rect)
307
+ return;
308
+ ctx.beginPath();
309
+ ctx.rect(rect.x, rect.y, rect.width, rect.height);
310
+ // The active cell stays unshaded inside the selection, as in spreadsheets.
311
+ if (activeRect && rangeContains(range, active.row, active.col)) {
312
+ ctx.rect(activeRect.x, activeRect.y, activeRect.width, activeRect.height);
313
+ }
314
+ ctx.fill("evenodd");
315
+ });
316
+ ctx.strokeStyle = t.selectionBorder;
317
+ ranges.forEach((range, index) => {
318
+ const rect = this.rangeRect(range, frozen);
319
+ if (!rect)
320
+ return;
321
+ ctx.lineWidth = index === ranges.length - 1 ? 2 : 1;
322
+ ctx.strokeRect(rect.x + 0.5, rect.y + 0.5, rect.width - 1, rect.height - 1);
323
+ });
324
+ }
325
+ if (activeRect) {
326
+ ctx.strokeStyle = t.activeBorder;
327
+ ctx.lineWidth = 2;
328
+ ctx.strokeRect(activeRect.x + 1, activeRect.y + 1, activeRect.width - 2, activeRect.height - 2);
329
+ }
330
+ }
331
+ drawHeaders(firstCol, lastCol) {
332
+ const c = this.controller;
333
+ const ctx = this.context;
334
+ const t = this.theme;
335
+ const height = c.options.headerHeight;
336
+ ctx.fillStyle = t.headerBackground;
337
+ ctx.fillRect(0, 0, c.width, height);
338
+ const scrollLeft = c.gutterWidth + c.frozenWidth;
339
+ this.clipped(scrollLeft, 0, c.width - scrollLeft, height, () => {
340
+ for (let col = firstCol; col <= lastCol; col++)
341
+ this.drawHeader(col);
342
+ });
343
+ this.clipped(c.gutterWidth, 0, c.frozenWidth, height, () => {
344
+ for (let col = 0; col < c.frozen; col++)
345
+ this.drawHeader(col);
346
+ });
347
+ ctx.strokeStyle = t.lineStrong;
348
+ ctx.lineWidth = 1 / this.ratio;
349
+ ctx.beginPath();
350
+ const y = this.snap(height) - 1 / this.ratio;
351
+ ctx.moveTo(0, y);
352
+ ctx.lineTo(c.width, y);
353
+ ctx.stroke();
354
+ }
355
+ drawHeader(col) {
356
+ const c = this.controller;
357
+ const ctx = this.context;
358
+ const t = this.theme;
359
+ const state = c.visible[col];
360
+ const schema = c.schema[state.index];
361
+ if (!schema)
362
+ return;
363
+ const x = c.columnX(col);
364
+ const width = c.layout.width(col);
365
+ const height = c.options.headerHeight;
366
+ const hovered = c.hover?.zone === "header" && c.hover.col === col;
367
+ if (c.selection.colSelected(col)) {
368
+ ctx.fillStyle = t.selection;
369
+ ctx.fillRect(x, 0, width, height);
370
+ }
371
+ else if (c.selection.colTouched(col) || hovered) {
372
+ ctx.fillStyle = t.headerActive;
373
+ ctx.fillRect(x, 0, width, height);
374
+ }
375
+ ctx.textBaseline = "middle";
376
+ ctx.textAlign = "left";
377
+ // Indicators on the right: menu (while hovered or active), filter, sort.
378
+ let right = x + width - 6;
379
+ const sort = c.sortOf(state.index);
380
+ const filtered = c.filterOf(state.index) !== null;
381
+ if (hovered || c.selection.active.col === col) {
382
+ if (hovered && c.hover?.menu) {
383
+ ctx.fillStyle = t.headerActive;
384
+ ctx.fillRect(right - 18, height / 2 - 9, 18, 18);
385
+ }
386
+ this.chevron(right - 9, height / 2, t.muted);
387
+ right -= 20;
388
+ }
389
+ if (filtered) {
390
+ this.funnel(right - 6, height / 2, t.accent);
391
+ right -= 16;
392
+ }
393
+ if (sort) {
394
+ this.triangle(right - 5, height / 2, sort.direction === "asc", t.accent);
395
+ right -= 14;
396
+ if ((c.query.sort?.length ?? 0) > 1) {
397
+ ctx.font = this.smallText.font;
398
+ ctx.fillStyle = t.accent;
399
+ ctx.textAlign = "right";
400
+ ctx.fillText(String(sort.order), right, height / 2 + 0.5);
401
+ ctx.textAlign = "left";
402
+ right -= 8;
403
+ }
404
+ right -= 2;
405
+ }
406
+ // The type mark gives way to the name in narrow columns.
407
+ let start = x + PADDING;
408
+ if (right - start - ICON_SPACE >= 28) {
409
+ ctx.font = this.smallText.font;
410
+ ctx.fillStyle = t.muted;
411
+ ctx.fillText(typeMark(schema.type), start, height / 2 + 0.5);
412
+ start += ICON_SPACE;
413
+ }
414
+ ctx.font = this.headerText.font;
415
+ ctx.fillStyle = t.headerText;
416
+ ctx.fillText(this.headerText.fit(schema.name, right - start), start, height / 2 + 0.5);
417
+ // Separator.
418
+ ctx.strokeStyle = t.line;
419
+ ctx.lineWidth = 1 / this.ratio;
420
+ ctx.beginPath();
421
+ const line = this.snap(x + width) - 1 / this.ratio;
422
+ ctx.moveTo(line, 6);
423
+ ctx.lineTo(line, height - 6);
424
+ ctx.stroke();
425
+ }
426
+ chevron(x, y, color) {
427
+ const ctx = this.context;
428
+ ctx.strokeStyle = color;
429
+ ctx.lineWidth = 1.5;
430
+ ctx.beginPath();
431
+ ctx.moveTo(x - 4, y - 2);
432
+ ctx.lineTo(x, y + 2);
433
+ ctx.lineTo(x + 4, y - 2);
434
+ ctx.stroke();
435
+ }
436
+ triangle(x, y, up, color) {
437
+ const ctx = this.context;
438
+ ctx.fillStyle = color;
439
+ ctx.beginPath();
440
+ if (up) {
441
+ ctx.moveTo(x - 4.5, y + 3);
442
+ ctx.lineTo(x + 4.5, y + 3);
443
+ ctx.lineTo(x, y - 4);
444
+ }
445
+ else {
446
+ ctx.moveTo(x - 4.5, y - 3);
447
+ ctx.lineTo(x + 4.5, y - 3);
448
+ ctx.lineTo(x, y + 4);
449
+ }
450
+ ctx.closePath();
451
+ ctx.fill();
452
+ }
453
+ funnel(x, y, color) {
454
+ const ctx = this.context;
455
+ ctx.fillStyle = color;
456
+ ctx.beginPath();
457
+ ctx.moveTo(x - 5.5, y - 5);
458
+ ctx.lineTo(x + 5.5, y - 5);
459
+ ctx.lineTo(x + 1.2, y);
460
+ ctx.lineTo(x + 1.2, y + 5);
461
+ ctx.lineTo(x - 1.2, y + 3.5);
462
+ ctx.lineTo(x - 1.2, y);
463
+ ctx.closePath();
464
+ ctx.fill();
465
+ }
466
+ drawGutter(firstRow, lastRow) {
467
+ const c = this.controller;
468
+ const ctx = this.context;
469
+ const t = this.theme;
470
+ const width = c.gutterWidth;
471
+ const top = c.options.headerHeight;
472
+ const rowHeight = c.options.rowHeight;
473
+ ctx.fillStyle = t.gutterBackground;
474
+ ctx.fillRect(0, top, width, c.height - top);
475
+ this.clipped(0, top, width, c.height - top, () => {
476
+ ctx.font = this.smallText.font;
477
+ ctx.textBaseline = "middle";
478
+ ctx.textAlign = "right";
479
+ const viewed = c.view.id !== null;
480
+ for (let row = firstRow; row < lastRow; row++) {
481
+ const y = c.rowY(row);
482
+ if (c.selection.rowSelected(row)) {
483
+ ctx.fillStyle = t.selection;
484
+ ctx.fillRect(0, y, width, rowHeight);
485
+ }
486
+ else if (c.selection.rowTouched(row)) {
487
+ ctx.fillStyle = t.headerActive;
488
+ ctx.fillRect(0, y, width, rowHeight);
489
+ }
490
+ const label = c.rowLabel(row);
491
+ if (label === null)
492
+ continue;
493
+ ctx.fillStyle = viewed ? t.gutterViewText : t.gutterText;
494
+ ctx.fillText(String(label), width - 8, y + rowHeight / 2 + 0.5);
495
+ }
496
+ });
497
+ ctx.strokeStyle = t.lineStrong;
498
+ ctx.lineWidth = 1 / this.ratio;
499
+ ctx.beginPath();
500
+ const x = this.snap(width) - 1 / this.ratio;
501
+ ctx.moveTo(x, 0);
502
+ ctx.lineTo(x, c.height);
503
+ ctx.stroke();
504
+ }
505
+ drawCorner() {
506
+ const c = this.controller;
507
+ const ctx = this.context;
508
+ const t = this.theme;
509
+ const width = c.gutterWidth;
510
+ const height = c.options.headerHeight;
511
+ ctx.fillStyle = c.hover?.zone === "corner" ? t.headerActive : t.headerBackground;
512
+ ctx.fillRect(0, 0, width, height);
513
+ ctx.fillStyle = t.muted;
514
+ ctx.beginPath();
515
+ ctx.moveTo(width - 6, height - 14);
516
+ ctx.lineTo(width - 6, height - 6);
517
+ ctx.lineTo(width - 14, height - 6);
518
+ ctx.closePath();
519
+ ctx.fill();
520
+ }
521
+ }
522
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}