vastgrid 0.1.1 → 0.2.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 (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 +150 -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 +168 -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/styles.css CHANGED
@@ -1,13 +1,24 @@
1
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`.
2
+ * vastgrid styles. Every color, font and size is a custom property on `.vg-root`; override them in your own
3
+ * CSS (the canvas reads them, so changes apply to the cells as well). Colors use light-dark().
5
4
  */
5
+
6
+ /*
7
+ * The grid follows the system's light or dark mode; `.vg-root { color-scheme: light }` keeps it light. It is
8
+ * declared here, without specificity, because bundlers that turn light-dark() into variables for older browsers
9
+ * (Lightning CSS, which Vite uses) need a `color-scheme` declaration to set them: without one, every color is
10
+ * invalid and the canvas draws black.
11
+ */
12
+ :where(.vg-root) {
13
+ color-scheme: light dark;
14
+ }
15
+
6
16
  .vg-root {
7
17
  --vg-font-family: system-ui, -apple-system, "Segoe UI", "Hiragino Sans", "Noto Sans JP", sans-serif;
8
18
  --vg-font-size: 13px;
9
19
  --vg-row-height: 24px;
10
20
  --vg-header-height: 32px;
21
+ --vg-group-header-height: 24px;
11
22
  --vg-radius: 6px;
12
23
  --vg-bg: light-dark(#ffffff, #16161a);
13
24
  --vg-fg: light-dark(#1f2328, #e6e6eb);
@@ -28,13 +39,19 @@
28
39
  --vg-active-border: light-dark(#0b57d0, #8ab4f8);
29
40
  --vg-accent: light-dark(#0b57d0, #8ab4f8);
30
41
  --vg-accent-fg: light-dark(#ffffff, #0d1b33);
42
+ --vg-checked-row-bg: light-dark(rgb(11 87 208 / 6%), rgb(138 180 248 / 9%));
31
43
  --vg-null-fg: light-dark(#8c959f, #6e6e7a);
32
44
  --vg-placeholder: light-dark(#eef1f4, #26262d);
33
45
  --vg-match-bg: light-dark(rgb(255 212 61 / 45%), rgb(255 212 61 / 28%));
34
46
  --vg-error-fg: light-dark(#b42318, #ff8a80);
47
+ --vg-link-fg: light-dark(#0b57d0, #8ab4f8);
35
48
  --vg-focus: light-dark(#0b57d0, #8ab4f8);
36
49
  --vg-shadow: 0 8px 28px light-dark(rgb(31 35 40 / 18%), rgb(0 0 0 / 50%));
50
+ /* The detail panel: its width beside the grid, its height below a grid narrower than 640px. */
51
+ --vg-detail-width: 340px;
52
+ --vg-detail-height: 45%;
37
53
 
54
+ container: vg-root / inline-size;
38
55
  position: relative;
39
56
  display: flex;
40
57
  flex-direction: column;
@@ -152,6 +169,24 @@
152
169
  text-overflow: ellipsis;
153
170
  }
154
171
 
172
+ .vg-statusbar__failed {
173
+ display: flex;
174
+ align-items: center;
175
+ gap: 6px;
176
+ min-width: 0;
177
+ }
178
+
179
+ .vg-statusbar__error {
180
+ overflow: hidden;
181
+ color: var(--vg-error-fg);
182
+ text-overflow: ellipsis;
183
+ }
184
+
185
+ .vg-statusbar__unsaved {
186
+ color: var(--vg-fg);
187
+ font-variant-numeric: tabular-nums;
188
+ }
189
+
155
190
  .vg-statusbar__summary {
156
191
  display: flex;
157
192
  gap: 14px;
@@ -205,490 +240,635 @@
205
240
  outline-offset: -1px;
206
241
  }
207
242
 
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;
243
+ .vg-button {
217
244
  min-height: 28px;
218
- padding: 3px 10px;
245
+ padding: 3px 12px;
219
246
  color: var(--vg-fg);
220
247
  font: inherit;
221
- white-space: nowrap;
222
- cursor: pointer;
223
248
  background: var(--vg-surface);
224
249
  border: 1px solid var(--vg-border);
225
250
  border-radius: var(--vg-radius);
251
+ cursor: pointer;
226
252
  }
227
253
 
228
- .vg-icon-button {
229
- min-width: 28px;
230
- padding: 0 6px;
231
- border-color: transparent;
232
- background: transparent;
254
+ .vg-button:disabled {
255
+ color: var(--vg-muted);
256
+ cursor: default;
233
257
  }
234
258
 
235
- .vg-button:hover:not(:disabled),
236
- .vg-icon-button:hover:not(:disabled) {
237
- background: var(--vg-header-active-bg);
259
+ /* The export menu: a popover under its button. */
260
+
261
+ .vg-menu {
262
+ position: fixed;
263
+ inset: auto;
264
+ min-width: 200px;
265
+ margin: 0;
266
+ padding: 6px;
267
+ color: var(--vg-fg);
268
+ font: inherit;
269
+ background: var(--vg-surface);
270
+ border: 1px solid var(--vg-border);
271
+ border-radius: var(--vg-radius);
272
+ box-shadow: 0 6px 20px rgb(0 0 0 / 0.25);
238
273
  }
239
274
 
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;
275
+ .vg-menu__group {
276
+ display: flex;
277
+ flex-direction: column;
278
+ gap: 4px;
279
+ margin: 0 0 6px;
280
+ padding: 2px 4px 8px;
281
+ border: none;
282
+ border-bottom: 1px solid var(--vg-line);
246
283
  }
247
284
 
248
- .vg-button:disabled {
249
- cursor: default;
250
- opacity: 0.55;
285
+ .vg-menu__group label {
286
+ display: flex;
287
+ gap: 6px;
288
+ align-items: center;
251
289
  }
252
290
 
253
- .vg-button--small {
254
- min-height: 26px;
255
- padding: 2px 8px;
291
+ .vg-menu__item {
292
+ display: block;
293
+ width: 100%;
294
+ padding: 5px 8px;
295
+ color: inherit;
296
+ font: inherit;
297
+ text-align: left;
298
+ background: none;
299
+ border: none;
300
+ border-radius: var(--vg-radius);
301
+ cursor: pointer;
256
302
  }
257
303
 
258
- .vg-button--primary {
259
- color: var(--vg-accent-fg);
260
- background: var(--vg-accent);
261
- border-color: var(--vg-accent);
304
+ .vg-menu__item:hover,
305
+ .vg-menu__item:focus-visible {
306
+ background: var(--vg-line);
307
+ outline: none;
262
308
  }
263
309
 
264
- .vg-button--primary:hover:not(:disabled) {
265
- background: var(--vg-accent);
266
- filter: brightness(1.08);
310
+ /* The formula menu: a row per derived column, then one for a new column. */
311
+
312
+ .vg-formulas {
313
+ width: min(640px, calc(100vw - 16px));
267
314
  }
268
315
 
269
- .vg-chip {
270
- display: inline-flex;
316
+ .vg-formulas__row {
317
+ display: flex;
318
+ flex-wrap: wrap;
319
+ gap: 6px;
271
320
  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;
321
+ padding: 4px 2px;
278
322
  }
279
323
 
280
- .vg-chip > span {
281
- overflow: hidden;
282
- text-overflow: ellipsis;
283
- white-space: nowrap;
324
+ .vg-formulas__row + .vg-formulas__row {
325
+ border-top: 1px solid var(--vg-line);
284
326
  }
285
327
 
286
- .vg-chip--filter {
287
- border-color: var(--vg-accent);
328
+ .vg-formulas__name {
329
+ flex: 0 1 9em;
330
+ min-width: 6em;
288
331
  }
289
332
 
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;
333
+ .vg-formulas__formula {
334
+ flex: 1 1 16em;
335
+ min-width: 10em;
336
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
303
337
  }
304
338
 
305
- .vg-chip__remove:hover {
306
- color: var(--vg-fg);
307
- background: var(--vg-header-active-bg);
339
+ .vg-formulas__error {
340
+ flex-basis: 100%;
341
+ margin: 0;
342
+ color: var(--vg-error-fg);
343
+ }
344
+
345
+ .vg-button:focus-visible {
346
+ outline: 2px solid var(--vg-focus);
347
+ outline-offset: 1px;
308
348
  }
309
349
 
310
- /* Messages over the grid */
350
+ /* The cell editor: in the page while no cell is edited, so that typing moves into it (§6.5 of the specification). */
311
351
 
312
- .vg-message {
352
+ .vg-editor {
313
353
  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;
354
+ top: 0;
355
+ left: 0;
356
+ width: 1px;
357
+ height: 1px;
358
+ overflow: hidden;
359
+ opacity: 0;
322
360
  }
323
361
 
324
- .vg-message button {
362
+ .vg-editor[data-open] {
363
+ z-index: 2;
364
+ width: auto;
365
+ height: auto;
366
+ overflow: visible;
367
+ opacity: 1;
325
368
  pointer-events: auto;
326
369
  }
327
370
 
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);
371
+ .vg-editor-input {
372
+ display: block;
373
+ box-sizing: border-box;
374
+ width: 100%;
375
+ min-width: inherit;
376
+ max-width: min(640px, 80vw);
377
+ height: var(--vg-editor-height, var(--vg-row-height));
378
+ min-height: var(--vg-editor-height, var(--vg-row-height));
379
+ max-height: 240px;
380
+ margin: 0;
381
+ padding: 3px 7px;
382
+ color: var(--vg-fg);
383
+ font: inherit;
384
+ line-height: 1.35;
385
+ white-space: pre-wrap;
386
+ resize: none;
387
+ background: var(--vg-surface);
388
+ border: 2px solid var(--vg-active-border);
389
+ border-radius: 0;
390
+ outline: none;
341
391
  box-shadow: var(--vg-shadow);
342
- transform: translateX(-50%);
343
- pointer-events: none;
344
392
  }
345
393
 
346
- /* Find */
394
+ .vg-editor[data-invalid] .vg-editor-input {
395
+ border-color: var(--vg-error-fg);
396
+ }
347
397
 
348
- .vg-find {
349
- position: absolute;
350
- top: calc(var(--vg-header-height) + 6px);
351
- right: 18px;
352
- z-index: 3;
398
+ .vg-editor-note {
353
399
  display: flex;
354
- align-items: center;
400
+ flex-direction: column;
355
401
  gap: 2px;
356
- padding: 4px;
402
+ max-width: min(420px, 80vw);
403
+ padding: 4px 8px;
404
+ color: var(--vg-muted);
405
+ font-size: 0.88em;
357
406
  background: var(--vg-surface);
358
407
  border: 1px solid var(--vg-border);
359
- border-radius: var(--vg-radius);
408
+ border-top: none;
360
409
  box-shadow: var(--vg-shadow);
361
410
  }
362
411
 
363
- .vg-find .vg-input {
364
- width: 200px;
412
+ .vg-editor-error {
413
+ color: var(--vg-error-fg);
365
414
  }
366
415
 
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;
416
+ /* The accessibility rows (§6.4 of react.md): over the cells they stand for, drawn by the canvas instead. */
417
+
418
+ .vg-a11y {
419
+ position: absolute;
420
+ inset: 0 auto auto 0;
421
+ width: 0;
422
+ height: 0;
423
+ color: transparent;
424
+ pointer-events: none;
373
425
  }
374
426
 
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;
427
+ .vg-a11y [role="gridcell"],
428
+ .vg-a11y [role="columnheader"] {
429
+ position: absolute;
430
+ overflow: hidden;
431
+ white-space: nowrap;
382
432
  }
383
433
 
384
- /* Popovers, menus and panels */
434
+ /* The first rows as HTML, which the server sends in place of the canvas (§7 of react.md). */
385
435
 
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);
436
+ .vg-static {
437
+ width: 100%;
438
+ border-collapse: collapse;
439
+ font-variant-numeric: tabular-nums;
440
+ }
441
+
442
+ .vg-static th,
443
+ .vg-static td {
444
+ height: var(--vg-row-height);
445
+ max-width: 360px;
446
+ padding: 0 8px;
447
+ overflow: hidden;
448
+ text-align: left;
449
+ text-overflow: ellipsis;
450
+ white-space: nowrap;
451
+ border-right: 1px solid var(--vg-line);
452
+ border-bottom: 1px solid var(--vg-line);
398
453
  }
399
454
 
400
- .vg-popover--panel {
401
- width: 300px;
402
- padding: 10px;
455
+ .vg-static th {
456
+ height: var(--vg-header-height);
457
+ font-weight: 600;
458
+ background: var(--vg-header-bg);
459
+ border-bottom-color: var(--vg-line-strong);
403
460
  }
404
461
 
405
- .vg-popover--wide {
406
- width: min(560px, calc(100% - 8px));
462
+ .vg-static .vg-static__number {
463
+ text-align: right;
407
464
  }
408
465
 
409
- .vg-menu {
410
- padding: 4px;
466
+ @media (prefers-reduced-motion: reduce) {
467
+ .vg-root * {
468
+ animation-duration: 0s;
469
+ transition-duration: 0s;
470
+ }
411
471
  }
412
472
 
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);
473
+ /* The column menu: a popover at its header, with the filter of the column. */
474
+
475
+ .vg-column-menu {
476
+ min-width: 220px;
477
+ max-width: min(320px, calc(100vw - 16px));
428
478
  }
429
479
 
430
- .vg-menu__item:hover:not(:disabled),
431
- .vg-menu__item:focus-visible {
432
- background: var(--vg-header-active-bg);
480
+ .vg-menu__item[aria-checked="true"]::before {
481
+ content: "✓ ";
433
482
  }
434
483
 
435
484
  .vg-menu__item:disabled {
485
+ color: var(--vg-muted);
436
486
  cursor: default;
437
- opacity: 0.5;
438
487
  }
439
488
 
440
- .vg-menu__item[aria-checked="true"]::after {
441
- content: "✓";
442
- color: var(--vg-accent);
489
+ .vg-menu__line {
490
+ margin: 4px 0;
491
+ border: none;
492
+ border-top: 1px solid var(--vg-line);
493
+ }
494
+
495
+ .vg-filter {
496
+ display: flex;
497
+ flex-direction: column;
498
+ gap: 6px;
499
+ padding: 2px;
500
+ }
501
+
502
+ .vg-filter__title {
503
+ margin: 0;
504
+ font-weight: 600;
505
+ }
506
+
507
+ .vg-filter__values {
508
+ min-width: 0;
509
+ max-height: 240px;
510
+ margin: 0;
511
+ padding: 4px;
512
+ overflow: auto;
513
+ border: 1px solid var(--vg-line);
514
+ border-radius: var(--vg-radius);
443
515
  }
444
516
 
445
- .vg-menu__item kbd {
517
+ .vg-filter__value {
518
+ display: flex;
519
+ gap: 6px;
520
+ align-items: center;
521
+ padding: 2px 0;
522
+ }
523
+
524
+ .vg-filter__label {
525
+ flex: 1;
526
+ min-width: 0;
527
+ overflow: hidden;
528
+ white-space: nowrap;
529
+ text-overflow: ellipsis;
530
+ }
531
+
532
+ .vg-filter__count {
446
533
  color: var(--vg-muted);
447
- font: inherit;
448
- font-size: 0.9em;
534
+ font-variant-numeric: tabular-nums;
449
535
  }
450
536
 
451
- .vg-menu__separator {
452
- margin: 4px 6px;
537
+ .vg-filter__condition {
538
+ display: flex;
539
+ flex-direction: column;
540
+ gap: 4px;
541
+ margin: 0;
542
+ padding: 0;
453
543
  border: none;
454
- border-top: 1px solid var(--vg-line);
455
544
  }
456
545
 
457
- .vg-panel__title {
458
- margin: 0 0 8px;
459
- font-weight: 600;
460
- overflow-wrap: anywhere;
546
+ .vg-filter__condition legend {
547
+ margin-bottom: 4px;
461
548
  }
462
549
 
463
- .vg-panel__muted {
464
- margin: 6px 0 0;
550
+ .vg-filter__note {
551
+ margin: 0;
465
552
  color: var(--vg-muted);
466
- font-weight: 400;
467
553
  }
468
554
 
469
- .vg-panel__error {
470
- margin: 6px 0 0;
555
+ .vg-filter__error {
556
+ margin: 0;
471
557
  color: var(--vg-error-fg);
472
558
  }
473
559
 
474
- .vg-panel__actions {
560
+ .vg-filter__actions {
475
561
  display: flex;
476
- justify-content: flex-end;
477
562
  gap: 6px;
478
- margin-top: 10px;
563
+ justify-content: flex-end;
479
564
  }
480
565
 
481
- .vg-filter,
482
- .vg-columns {
566
+ .vg-button--primary {
567
+ color: var(--vg-accent-fg);
568
+ background: var(--vg-accent);
569
+ border-color: var(--vg-accent);
570
+ }
571
+
572
+ /* Column statistics, in the column menu. */
573
+
574
+ .vg-statistics__list {
575
+ display: grid;
576
+ gap: 2px;
577
+ margin: 6px 0 0;
578
+ }
579
+
580
+ .vg-statistics__list div {
581
+ display: flex;
582
+ gap: 12px;
583
+ justify-content: space-between;
584
+ }
585
+
586
+ .vg-statistics__list dt {
587
+ color: var(--vg-muted);
588
+ }
589
+
590
+ .vg-statistics__list dd {
591
+ margin: 0;
592
+ font-variant-numeric: tabular-nums;
593
+ }
594
+
595
+ /* The group menu: the keys and the measures of the groups. */
596
+
597
+ .vg-groups {
598
+ width: min(360px, calc(100vw - 16px));
599
+ }
600
+
601
+ .vg-groups__part {
483
602
  display: flex;
484
603
  flex-direction: column;
485
604
  gap: 6px;
605
+ margin: 0 0 8px;
606
+ padding: 0;
607
+ border: none;
486
608
  }
487
609
 
488
- .vg-filter > .vg-input,
489
- .vg-columns > .vg-input {
490
- width: 100%;
610
+ .vg-groups__part legend {
611
+ margin-bottom: 4px;
612
+ font-weight: 600;
491
613
  }
492
614
 
493
- .vg-filter__values {
494
- min-inline-size: 0;
495
- max-height: 260px;
615
+ .vg-groups__list {
616
+ display: flex;
617
+ flex-wrap: wrap;
618
+ gap: 4px;
496
619
  margin: 0;
497
620
  padding: 0;
498
- overflow: auto;
621
+ list-style: none;
622
+ }
623
+
624
+ .vg-groups__list li {
625
+ display: flex;
626
+ gap: 4px;
627
+ align-items: center;
628
+ padding: 1px 2px 1px 8px;
629
+ background: var(--vg-surface-muted);
499
630
  border: 1px solid var(--vg-line);
500
631
  border-radius: var(--vg-radius);
501
632
  }
502
633
 
503
- .vg-check {
634
+ .vg-groups__add {
504
635
  display: flex;
505
- align-items: center;
506
636
  gap: 6px;
507
- min-height: 26px;
508
- padding: 2px 8px;
509
- cursor: pointer;
510
637
  }
511
638
 
512
- .vg-check:hover {
513
- background: var(--vg-header-active-bg);
639
+ .vg-groups__add .vg-input {
640
+ flex: 1;
641
+ min-width: 0;
514
642
  }
515
643
 
516
- .vg-check--all {
517
- border-bottom: 1px solid var(--vg-line);
644
+ .vg-button--small {
645
+ min-height: 22px;
646
+ padding: 0 6px;
518
647
  }
519
648
 
520
- .vg-check__label {
521
- flex: 1 1 auto;
522
- overflow: hidden;
523
- text-overflow: ellipsis;
524
- white-space: nowrap;
649
+ /* The columns menu: each column of the view, shown or hidden, with buttons that move it. */
650
+
651
+ .vg-columns {
652
+ width: min(320px, calc(100vw - 16px));
525
653
  }
526
654
 
527
- .vg-check__count {
528
- flex: none;
529
- color: var(--vg-muted);
530
- font-variant-numeric: tabular-nums;
655
+ .vg-columns__list {
656
+ max-height: 320px;
657
+ margin: 6px 0;
658
+ padding: 0;
659
+ overflow: auto;
660
+ list-style: none;
531
661
  }
532
662
 
533
- .vg-filter__condition {
663
+ .vg-columns__item {
534
664
  display: flex;
535
- flex-wrap: wrap;
665
+ gap: 4px;
666
+ align-items: center;
667
+ padding: 2px 0;
668
+ }
669
+
670
+ .vg-columns__item label {
671
+ display: flex;
672
+ flex: 1;
536
673
  gap: 6px;
537
- margin: 4px 0 0;
674
+ align-items: center;
675
+ min-width: 0;
676
+ }
677
+
678
+ /* The conditions menu: groups of conditions, nested. */
679
+
680
+ .vg-conditions {
681
+ width: min(640px, calc(100vw - 16px));
682
+ max-height: min(70vh, 600px);
683
+ overflow: auto;
684
+ }
685
+
686
+ .vg-conditions__group {
687
+ margin: 0 0 6px;
688
+ padding: 6px 8px;
689
+ border: 1px solid var(--vg-line);
690
+ border-radius: var(--vg-radius);
691
+ }
692
+
693
+ .vg-conditions__group--top {
538
694
  padding: 0;
539
695
  border: none;
540
696
  }
541
697
 
542
- .vg-filter__condition legend {
543
- margin-bottom: 4px;
698
+ .vg-conditions__items {
699
+ display: flex;
700
+ flex-direction: column;
701
+ gap: 4px;
702
+ margin: 4px 0;
544
703
  padding: 0;
545
- color: var(--vg-muted);
704
+ list-style: none;
546
705
  }
547
706
 
548
- .vg-filter__condition .vg-input {
549
- flex: 1 1 120px;
707
+ .vg-conditions__row {
708
+ display: flex;
709
+ flex-wrap: wrap;
710
+ gap: 4px;
711
+ align-items: center;
712
+ }
713
+
714
+ .vg-conditions__row .vg-input {
715
+ flex: 1 1 8em;
550
716
  min-width: 0;
551
717
  }
552
718
 
553
- .vg-stats__list {
554
- display: grid;
555
- grid-template-columns: auto 1fr;
556
- gap: 3px 12px;
557
- margin: 0;
719
+ .vg-conditions__expression {
720
+ flex: 1;
721
+ overflow-wrap: anywhere;
558
722
  }
559
723
 
560
- .vg-stats__list dt {
561
- color: var(--vg-muted);
724
+ .vg-conditions__add {
725
+ display: flex;
726
+ gap: 4px;
562
727
  }
563
728
 
564
- .vg-stats__list dd {
565
- margin: 0;
566
- overflow-wrap: anywhere;
567
- font-variant-numeric: tabular-nums;
568
- text-align: right;
729
+ /* A column's format, in the column menu. */
730
+
731
+ .vg-format {
732
+ max-height: min(70vh, 560px);
733
+ overflow: auto;
569
734
  }
570
735
 
571
- .vg-stats__histogram,
572
- .vg-stats__top {
573
- margin: 12px 0 0;
736
+ .vg-column-menu:has(.vg-format) {
737
+ max-width: min(420px, calc(100vw - 16px));
574
738
  }
575
739
 
576
- .vg-stats__histogram figcaption,
577
- .vg-stats__top figcaption {
578
- margin-bottom: 6px;
579
- color: var(--vg-muted);
740
+ .vg-format__field {
741
+ display: flex;
742
+ flex-direction: column;
743
+ gap: 2px;
580
744
  }
581
745
 
582
- .vg-stats__bars {
746
+ .vg-format__group {
583
747
  display: flex;
584
- align-items: flex-end;
585
- gap: 1px;
586
- height: 64px;
587
- border-bottom: 1px solid var(--vg-line-strong);
748
+ flex-direction: column;
749
+ gap: 4px;
750
+ margin: 0;
751
+ padding: 6px 8px;
752
+ border: 1px solid var(--vg-line);
753
+ border-radius: var(--vg-radius);
588
754
  }
589
755
 
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;
756
+ .vg-format__rule {
757
+ display: flex;
758
+ flex-direction: column;
759
+ gap: 4px;
760
+ padding-bottom: 6px;
761
+ border-bottom: 1px solid var(--vg-line);
596
762
  }
597
763
 
598
- .vg-stats__axis {
764
+ /* The grid's body and the detail panel beside it. */
765
+
766
+ .vg-main {
599
767
  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;
768
+ flex: 1 1 auto;
769
+ min-height: 0;
606
770
  }
607
771
 
608
- .vg-stats__top ul {
772
+ .vg-main > .vg-body {
773
+ flex: 1 1 auto;
774
+ min-width: 0;
775
+ }
776
+
777
+ .vg-detail {
609
778
  display: flex;
779
+ flex: 0 0 min(var(--vg-detail-width), 50%);
610
780
  flex-direction: column;
611
- gap: 2px;
612
- margin: 0;
613
- padding: 0;
614
- list-style: none;
781
+ min-height: 0;
782
+ overflow: auto;
783
+ border-left: 1px solid var(--vg-border);
784
+ background: var(--vg-surface);
615
785
  }
616
786
 
617
- .vg-stats__top li {
618
- position: relative;
787
+ .vg-detail__header {
788
+ position: sticky;
789
+ top: 0;
619
790
  display: flex;
791
+ align-items: center;
620
792
  justify-content: space-between;
621
- gap: 8px;
622
- padding: 2px 6px;
793
+ padding: 6px 8px 6px 12px;
794
+ background: var(--vg-surface);
795
+ border-bottom: 1px solid var(--vg-line);
623
796
  }
624
797
 
625
- .vg-stats__top-bar {
626
- position: absolute;
627
- inset: 0 auto 0 0;
628
- background: var(--vg-selection-bg);
629
- border-radius: 3px;
798
+ .vg-detail__title {
799
+ margin: 0;
800
+ font-size: inherit;
801
+ font-weight: 600;
630
802
  }
631
803
 
632
- .vg-stats__top-label {
633
- position: relative;
634
- overflow: hidden;
635
- text-overflow: ellipsis;
636
- white-space: nowrap;
804
+ .vg-detail__list {
805
+ margin: 0;
806
+ padding: 6px 12px 12px;
637
807
  }
638
808
 
639
- .vg-stats__top-count {
640
- position: relative;
809
+ .vg-detail__item {
810
+ padding: 6px 0;
811
+ border-bottom: 1px solid var(--vg-line);
812
+ }
813
+
814
+ .vg-detail__item dt {
641
815
  color: var(--vg-muted);
642
- font-variant-numeric: tabular-nums;
816
+ font-size: 0.9em;
643
817
  }
644
818
 
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;
819
+ .vg-detail__item dd {
820
+ margin: 2px 0 0;
652
821
  white-space: pre-wrap;
653
822
  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
823
  }
661
824
 
662
- @media (prefers-reduced-motion: reduce) {
663
- .vg-progress > span {
664
- transition: none;
825
+ @container vg-root (max-width: 640px) {
826
+ .vg-main {
827
+ flex-direction: column;
665
828
  }
666
829
 
667
- .vg-progress > span[data-indeterminate] {
668
- left: 0;
669
- width: 100%;
670
- opacity: 0.5;
671
- animation: none;
830
+ .vg-detail {
831
+ flex-basis: var(--vg-detail-height);
832
+ border-top: 1px solid var(--vg-border);
833
+ border-left: none;
672
834
  }
673
835
  }
674
836
 
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
- }
837
+ /* The find bar (⌘F), under the toolbar. */
838
+
839
+ .vg-find {
840
+ display: flex;
841
+ flex: 0 0 auto;
842
+ flex-wrap: wrap;
843
+ gap: 6px;
844
+ align-items: center;
845
+ padding: 4px 8px;
846
+ border-bottom: 1px solid var(--vg-line);
847
+ }
848
+
849
+ .vg-find__input {
850
+ flex: 1 1 12em;
851
+ min-width: 8em;
852
+ }
853
+
854
+ .vg-find__status {
855
+ color: var(--vg-muted);
856
+ }
857
+
858
+ /* The cell menu, and a value shown in full. */
859
+
860
+ .vg-cell-menu {
861
+ max-width: min(480px, calc(100vw - 16px));
862
+ }
863
+
864
+ .vg-cell-menu__value {
865
+ max-height: min(50vh, 360px);
866
+ margin: 6px 0;
867
+ padding: 6px 8px;
868
+ overflow: auto;
869
+ font: inherit;
870
+ white-space: pre-wrap;
871
+ overflow-wrap: anywhere;
872
+ background: var(--vg-surface-muted);
873
+ border-radius: var(--vg-radius);
694
874
  }