vastgrid 0.1.1 → 0.2.1

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 (312) hide show
  1. package/README.md +175 -13
  2. package/dist/canvas/geometry.d.ts +92 -0
  3. package/dist/canvas/geometry.d.ts.map +1 -0
  4. package/dist/canvas/geometry.js +197 -0
  5. package/dist/canvas/geometry.js.map +1 -0
  6. package/dist/canvas/grid-canvas.d.ts +161 -0
  7. package/dist/canvas/grid-canvas.d.ts.map +1 -0
  8. package/dist/canvas/grid-canvas.js +1146 -0
  9. package/dist/canvas/grid-canvas.js.map +1 -0
  10. package/dist/canvas/hooks.d.ts +61 -0
  11. package/dist/canvas/hooks.d.ts.map +1 -0
  12. package/dist/canvas/hooks.js +2 -0
  13. package/dist/canvas/hooks.js.map +1 -0
  14. package/dist/canvas/keys.d.ts +26 -0
  15. package/dist/canvas/keys.d.ts.map +1 -0
  16. package/dist/canvas/keys.js +133 -0
  17. package/dist/canvas/keys.js.map +1 -0
  18. package/dist/canvas/layout.d.ts +26 -0
  19. package/dist/canvas/layout.d.ts.map +1 -0
  20. package/dist/canvas/layout.js +73 -0
  21. package/dist/canvas/layout.js.map +1 -0
  22. package/dist/canvas/scroll.d.ts +31 -0
  23. package/dist/canvas/scroll.d.ts.map +1 -0
  24. package/dist/canvas/scroll.js +111 -0
  25. package/dist/canvas/scroll.js.map +1 -0
  26. package/dist/canvas/text.d.ts +23 -0
  27. package/dist/canvas/text.d.ts.map +1 -0
  28. package/dist/canvas/text.js +142 -0
  29. package/dist/canvas/text.js.map +1 -0
  30. package/dist/{theme.d.ts → canvas/theme.d.ts} +8 -0
  31. package/dist/canvas/theme.d.ts.map +1 -0
  32. package/dist/canvas/theme.js +62 -0
  33. package/dist/canvas/theme.js.map +1 -0
  34. package/dist/core/cache.d.ts +48 -0
  35. package/dist/core/cache.d.ts.map +1 -0
  36. package/dist/core/cache.js +222 -0
  37. package/dist/core/cache.js.map +1 -0
  38. package/dist/core/checked.d.ts +20 -0
  39. package/dist/core/checked.d.ts.map +1 -0
  40. package/dist/core/checked.js +61 -0
  41. package/dist/core/checked.js.map +1 -0
  42. package/dist/core/client.d.ts +33 -0
  43. package/dist/core/client.d.ts.map +1 -0
  44. package/dist/core/client.js +103 -0
  45. package/dist/core/client.js.map +1 -0
  46. package/dist/core/conditions.d.ts +48 -0
  47. package/dist/core/conditions.d.ts.map +1 -0
  48. package/dist/core/conditions.js +105 -0
  49. package/dist/core/conditions.js.map +1 -0
  50. package/dist/core/evaluate.d.ts +20 -0
  51. package/dist/core/evaluate.d.ts.map +1 -0
  52. package/dist/core/evaluate.js +210 -0
  53. package/dist/core/evaluate.js.map +1 -0
  54. package/dist/core/filters.d.ts +51 -0
  55. package/dist/core/filters.d.ts.map +1 -0
  56. package/dist/core/filters.js +303 -0
  57. package/dist/core/filters.js.map +1 -0
  58. package/dist/core/format.d.ts +14 -0
  59. package/dist/core/format.d.ts.map +1 -0
  60. package/dist/core/format.js +303 -0
  61. package/dist/core/format.js.map +1 -0
  62. package/dist/core/measures.d.ts +26 -0
  63. package/dist/core/measures.d.ts.map +1 -0
  64. package/dist/core/measures.js +105 -0
  65. package/dist/core/measures.js.map +1 -0
  66. package/dist/core/request-ids.d.ts +20 -0
  67. package/dist/core/request-ids.d.ts.map +1 -0
  68. package/dist/core/request-ids.js +55 -0
  69. package/dist/core/request-ids.js.map +1 -0
  70. package/dist/core/rows.d.ts +79 -0
  71. package/dist/core/rows.d.ts.map +1 -0
  72. package/dist/core/rows.js +173 -0
  73. package/dist/core/rows.js.map +1 -0
  74. package/dist/core/store.d.ts +233 -0
  75. package/dist/core/store.d.ts.map +1 -0
  76. package/dist/core/store.js +1162 -0
  77. package/dist/core/store.js.map +1 -0
  78. package/dist/core/totals.d.ts +24 -0
  79. package/dist/core/totals.d.ts.map +1 -0
  80. package/dist/core/totals.js +49 -0
  81. package/dist/core/totals.js.map +1 -0
  82. package/dist/core/trace.d.ts +7 -0
  83. package/dist/core/trace.d.ts.map +1 -0
  84. package/dist/core/trace.js +26 -0
  85. package/dist/core/trace.js.map +1 -0
  86. package/dist/core/transports.d.ts +50 -0
  87. package/dist/core/transports.d.ts.map +1 -0
  88. package/dist/core/transports.js +160 -0
  89. package/dist/core/transports.js.map +1 -0
  90. package/dist/core/types.d.ts +151 -0
  91. package/dist/core/types.d.ts.map +1 -0
  92. package/dist/core/types.js +45 -0
  93. package/dist/core/types.js.map +1 -0
  94. package/dist/core.d.ts +12 -0
  95. package/dist/core.d.ts.map +1 -0
  96. package/dist/core.js +11 -0
  97. package/dist/core.js.map +1 -0
  98. package/dist/index.d.ts +15 -6
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +13 -7
  101. package/dist/index.js.map +1 -1
  102. package/dist/react/accessible-rows.d.ts +13 -0
  103. package/dist/react/accessible-rows.d.ts.map +1 -0
  104. package/dist/react/accessible-rows.js +320 -0
  105. package/dist/react/accessible-rows.js.map +1 -0
  106. package/dist/react/cell-editor.d.ts +22 -0
  107. package/dist/react/cell-editor.d.ts.map +1 -0
  108. package/dist/react/cell-editor.js +431 -0
  109. package/dist/react/cell-editor.js.map +1 -0
  110. package/dist/react/cell-menu.d.ts +18 -0
  111. package/dist/react/cell-menu.d.ts.map +1 -0
  112. package/dist/react/cell-menu.js +299 -0
  113. package/dist/react/cell-menu.js.map +1 -0
  114. package/dist/react/column-menu.d.ts +16 -0
  115. package/dist/react/column-menu.d.ts.map +1 -0
  116. package/dist/react/column-menu.js +1311 -0
  117. package/dist/react/column-menu.js.map +1 -0
  118. package/dist/react/columns-menu.d.ts +7 -0
  119. package/dist/react/columns-menu.d.ts.map +1 -0
  120. package/dist/react/columns-menu.js +249 -0
  121. package/dist/react/columns-menu.js.map +1 -0
  122. package/dist/react/conditions-menu.d.ts +10 -0
  123. package/dist/react/conditions-menu.d.ts.map +1 -0
  124. package/dist/react/conditions-menu.js +795 -0
  125. package/dist/react/conditions-menu.js.map +1 -0
  126. package/dist/react/context.d.ts +29 -0
  127. package/dist/react/context.d.ts.map +1 -0
  128. package/dist/react/context.js +18 -0
  129. package/dist/react/context.js.map +1 -0
  130. package/dist/react/data-grid.d.ts +79 -0
  131. package/dist/react/data-grid.d.ts.map +1 -0
  132. package/dist/react/data-grid.js +653 -0
  133. package/dist/react/data-grid.js.map +1 -0
  134. package/dist/react/detail-panel.d.ts +22 -0
  135. package/dist/react/detail-panel.d.ts.map +1 -0
  136. package/dist/react/detail-panel.js +242 -0
  137. package/dist/react/detail-panel.js.map +1 -0
  138. package/dist/react/export-menu.d.ts +11 -0
  139. package/dist/react/export-menu.d.ts.map +1 -0
  140. package/dist/react/export-menu.js +304 -0
  141. package/dist/react/export-menu.js.map +1 -0
  142. package/dist/react/find-bar.d.ts +11 -0
  143. package/dist/react/find-bar.d.ts.map +1 -0
  144. package/dist/react/find-bar.js +303 -0
  145. package/dist/react/find-bar.js.map +1 -0
  146. package/dist/react/format-form.d.ts +12 -0
  147. package/dist/react/format-form.d.ts.map +1 -0
  148. package/dist/react/format-form.js +863 -0
  149. package/dist/react/format-form.js.map +1 -0
  150. package/dist/react/formula-menu.d.ts +6 -0
  151. package/dist/react/formula-menu.d.ts.map +1 -0
  152. package/dist/react/formula-menu.js +343 -0
  153. package/dist/react/formula-menu.js.map +1 -0
  154. package/dist/react/grid-body.d.ts +33 -0
  155. package/dist/react/grid-body.d.ts.map +1 -0
  156. package/dist/react/grid-body.js +1389 -0
  157. package/dist/react/grid-body.js.map +1 -0
  158. package/dist/react/group-menu.d.ts +7 -0
  159. package/dist/react/group-menu.d.ts.map +1 -0
  160. package/dist/react/group-menu.js +508 -0
  161. package/dist/react/group-menu.js.map +1 -0
  162. package/dist/react/hooks.d.ts +33 -0
  163. package/dist/react/hooks.d.ts.map +1 -0
  164. package/dist/react/hooks.js +161 -0
  165. package/dist/react/hooks.js.map +1 -0
  166. package/dist/react/messages.d.ts +180 -0
  167. package/dist/react/messages.d.ts.map +1 -0
  168. package/dist/react/messages.js +414 -0
  169. package/dist/react/messages.js.map +1 -0
  170. package/dist/react/save.d.ts +9 -0
  171. package/dist/react/save.d.ts.map +1 -0
  172. package/dist/react/save.js +102 -0
  173. package/dist/react/save.js.map +1 -0
  174. package/dist/react/static-rows.d.ts +9 -0
  175. package/dist/react/static-rows.d.ts.map +1 -0
  176. package/dist/react/static-rows.js +176 -0
  177. package/dist/react/static-rows.js.map +1 -0
  178. package/dist/react/status-bar.d.ts +12 -0
  179. package/dist/react/status-bar.d.ts.map +1 -0
  180. package/dist/react/status-bar.js +413 -0
  181. package/dist/react/status-bar.js.map +1 -0
  182. package/dist/react/toolbar-popover.d.ts +14 -0
  183. package/dist/react/toolbar-popover.d.ts.map +1 -0
  184. package/dist/react/toolbar-popover.js +143 -0
  185. package/dist/react/toolbar-popover.js.map +1 -0
  186. package/dist/react/toolbar.d.ts +13 -0
  187. package/dist/react/toolbar.d.ts.map +1 -0
  188. package/dist/react/toolbar.js +344 -0
  189. package/dist/react/toolbar.js.map +1 -0
  190. package/dist/server.d.ts +22 -0
  191. package/dist/server.d.ts.map +1 -0
  192. package/dist/server.js +45 -0
  193. package/dist/server.js.map +1 -0
  194. package/dist/styles.css +496 -316
  195. package/package.json +42 -17
  196. package/src/canvas/geometry.ts +197 -0
  197. package/src/canvas/grid-canvas.ts +1222 -0
  198. package/src/canvas/hooks.ts +61 -0
  199. package/src/canvas/keys.ts +96 -0
  200. package/src/canvas/layout.ts +77 -0
  201. package/src/canvas/scroll.ts +120 -0
  202. package/src/canvas/text.ts +155 -0
  203. package/src/{theme.ts → canvas/theme.ts} +14 -1
  204. package/src/core/cache.ts +247 -0
  205. package/src/core/checked.ts +64 -0
  206. package/src/core/client.ts +103 -0
  207. package/src/core/conditions.ts +89 -0
  208. package/src/core/evaluate.ts +221 -0
  209. package/src/core/filters.ts +268 -0
  210. package/src/core/format.ts +309 -0
  211. package/src/core/measures.ts +99 -0
  212. package/src/core/request-ids.ts +54 -0
  213. package/src/core/rows.ts +213 -0
  214. package/src/core/store.ts +1122 -0
  215. package/src/core/totals.ts +59 -0
  216. package/src/core/trace.ts +44 -0
  217. package/src/core/transports.ts +177 -0
  218. package/src/core/types.ts +169 -0
  219. package/src/core.ts +39 -0
  220. package/src/index.ts +24 -12
  221. package/src/react/accessible-rows.tsx +242 -0
  222. package/src/react/cell-editor.tsx +216 -0
  223. package/src/react/cell-menu.tsx +166 -0
  224. package/src/react/column-menu.tsx +619 -0
  225. package/src/react/columns-menu.tsx +116 -0
  226. package/src/react/conditions-menu.tsx +289 -0
  227. package/src/react/context.ts +33 -0
  228. package/src/react/data-grid.tsx +286 -0
  229. package/src/react/detail-panel.tsx +92 -0
  230. package/src/react/export-menu.tsx +112 -0
  231. package/src/react/find-bar.tsx +112 -0
  232. package/src/react/format-form.tsx +421 -0
  233. package/src/react/formula-menu.tsx +163 -0
  234. package/src/react/grid-body.tsx +744 -0
  235. package/src/react/group-menu.tsx +214 -0
  236. package/src/react/hooks.ts +104 -0
  237. package/src/react/messages.ts +556 -0
  238. package/src/react/save.ts +42 -0
  239. package/src/react/static-rows.tsx +59 -0
  240. package/src/react/status-bar.tsx +175 -0
  241. package/src/react/toolbar-popover.tsx +69 -0
  242. package/src/react/toolbar.tsx +152 -0
  243. package/src/server.ts +58 -0
  244. package/src/styles.css +496 -316
  245. package/dist/components/bars.d.ts +0 -14
  246. package/dist/components/bars.d.ts.map +0 -1
  247. package/dist/components/bars.js +0 -68
  248. package/dist/components/bars.js.map +0 -1
  249. package/dist/components/cell-inspector.d.ts +0 -11
  250. package/dist/components/cell-inspector.d.ts.map +0 -1
  251. package/dist/components/cell-inspector.js +0 -37
  252. package/dist/components/cell-inspector.js.map +0 -1
  253. package/dist/components/columns-panel.d.ts +0 -12
  254. package/dist/components/columns-panel.d.ts.map +0 -1
  255. package/dist/components/columns-panel.js +0 -11
  256. package/dist/components/columns-panel.js.map +0 -1
  257. package/dist/components/filter-panel.d.ts +0 -22
  258. package/dist/components/filter-panel.d.ts.map +0 -1
  259. package/dist/components/filter-panel.js +0 -169
  260. package/dist/components/filter-panel.js.map +0 -1
  261. package/dist/components/find-bar.d.ts +0 -9
  262. package/dist/components/find-bar.d.ts.map +0 -1
  263. package/dist/components/find-bar.js +0 -46
  264. package/dist/components/find-bar.js.map +0 -1
  265. package/dist/components/popover.d.ts +0 -38
  266. package/dist/components/popover.d.ts.map +0 -1
  267. package/dist/components/popover.js +0 -104
  268. package/dist/components/popover.js.map +0 -1
  269. package/dist/components/stats-panel.d.ts +0 -12
  270. package/dist/components/stats-panel.d.ts.map +0 -1
  271. package/dist/components/stats-panel.js +0 -40
  272. package/dist/components/stats-panel.js.map +0 -1
  273. package/dist/controller.d.ts +0 -227
  274. package/dist/controller.d.ts.map +0 -1
  275. package/dist/controller.js +0 -845
  276. package/dist/controller.js.map +0 -1
  277. package/dist/data-grid.d.ts +0 -51
  278. package/dist/data-grid.d.ts.map +0 -1
  279. package/dist/data-grid.js +0 -704
  280. package/dist/data-grid.js.map +0 -1
  281. package/dist/labels.d.ts +0 -9
  282. package/dist/labels.d.ts.map +0 -1
  283. package/dist/labels.js +0 -38
  284. package/dist/labels.js.map +0 -1
  285. package/dist/messages.d.ts +0 -99
  286. package/dist/messages.d.ts.map +0 -1
  287. package/dist/messages.js +0 -276
  288. package/dist/messages.js.map +0 -1
  289. package/dist/renderer.d.ts +0 -52
  290. package/dist/renderer.d.ts.map +0 -1
  291. package/dist/renderer.js +0 -522
  292. package/dist/renderer.js.map +0 -1
  293. package/dist/text.d.ts +0 -14
  294. package/dist/text.d.ts.map +0 -1
  295. package/dist/text.js +0 -63
  296. package/dist/text.js.map +0 -1
  297. package/dist/theme.d.ts.map +0 -1
  298. package/dist/theme.js +0 -54
  299. package/dist/theme.js.map +0 -1
  300. package/src/components/bars.tsx +0 -180
  301. package/src/components/cell-inspector.tsx +0 -70
  302. package/src/components/columns-panel.tsx +0 -59
  303. package/src/components/filter-panel.tsx +0 -293
  304. package/src/components/find-bar.tsx +0 -104
  305. package/src/components/popover.tsx +0 -194
  306. package/src/components/stats-panel.tsx +0 -153
  307. package/src/controller.ts +0 -945
  308. package/src/data-grid.tsx +0 -1035
  309. package/src/labels.ts +0 -46
  310. package/src/messages.ts +0 -390
  311. package/src/renderer.ts +0 -535
  312. package/src/text.ts +0 -55
package/dist/renderer.js DELETED
@@ -1,522 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
package/dist/text.d.ts DELETED
@@ -1,14 +0,0 @@
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
@@ -1 +0,0 @@
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"}
package/dist/text.js DELETED
@@ -1,63 +0,0 @@
1
- const ELLIPSIS = "…";
2
- const MAX_ENTRIES = 20_000;
3
- /** Measures and shortens text for one font, caching results because the same strings repeat a lot. */
4
- export class TextFitter {
5
- context;
6
- font;
7
- widths = new Map();
8
- fits = new Map();
9
- ellipsisWidth = -1;
10
- constructor(context, font) {
11
- this.context = context;
12
- this.font = font;
13
- }
14
- /** Width of `text`. The caller must have set `context.font` to this fitter's font. */
15
- width(text) {
16
- let width = this.widths.get(text);
17
- if (width === undefined) {
18
- width = this.context.measureText(text).width;
19
- if (this.widths.size > MAX_ENTRIES)
20
- this.widths.clear();
21
- this.widths.set(text, width);
22
- }
23
- return width;
24
- }
25
- /** `text`, shortened with "…" to fit in `maxWidth`. */
26
- fit(text, maxWidth) {
27
- if (maxWidth <= 0 || text === "")
28
- return "";
29
- // Cells never show more than a few hundred characters; skip measuring the rest.
30
- const source = text.length > 400 ? text.slice(0, 400) : text;
31
- if (source === text && this.width(text) <= maxWidth)
32
- return text;
33
- const key = `${Math.floor(maxWidth)}\u0001${source}`;
34
- const cached = this.fits.get(key);
35
- if (cached !== undefined)
36
- return cached;
37
- if (this.ellipsisWidth < 0)
38
- this.ellipsisWidth = this.context.measureText(ELLIPSIS).width;
39
- let result = "";
40
- if (this.ellipsisWidth <= maxWidth) {
41
- const full = this.context.measureText(source).width;
42
- let low = 0;
43
- let high = Math.min(source.length, Math.ceil((source.length * maxWidth) / Math.max(1, full)) + 4);
44
- while (low < high) {
45
- const middle = (low + high + 1) >> 1;
46
- if (this.context.measureText(source.slice(0, middle)).width + this.ellipsisWidth <= maxWidth)
47
- low = middle;
48
- else
49
- high = middle - 1;
50
- }
51
- // Do not split a surrogate pair.
52
- const code = source.charCodeAt(low - 1);
53
- if (low > 0 && code >= 0xd800 && code <= 0xdbff)
54
- low--;
55
- result = `${source.slice(0, low)}${ELLIPSIS}`;
56
- }
57
- if (this.fits.size > MAX_ENTRIES)
58
- this.fits.clear();
59
- this.fits.set(key, result);
60
- return result;
61
- }
62
- }
63
- //# sourceMappingURL=text.js.map
package/dist/text.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"text.js","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA,uGAAuG;AACvG,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AA2BD,gHAAgH;AAChH,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,CA4BzD;AAED,+DAA+D;AAC/D,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAG3E"}