@redvars/peacock 3.6.2 → 3.6.3

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 (75) hide show
  1. package/dist/assets/components.css.map +1 -1
  2. package/dist/assets/styles.css.map +1 -1
  3. package/dist/{button-colors-AvGh22Zn.js → button-colors-Cg6oxiz-.js} +126 -116
  4. package/dist/{button-colors-AvGh22Zn.js.map → button-colors-Cg6oxiz-.js.map} +1 -1
  5. package/dist/button-group.js +2 -2
  6. package/dist/button.js +17 -14
  7. package/dist/button.js.map +1 -1
  8. package/dist/canvas.js +126 -107
  9. package/dist/canvas.js.map +1 -1
  10. package/dist/custom-elements-jsdocs.json +665 -162
  11. package/dist/custom-elements.json +859 -326
  12. package/dist/{flow-designer-node-BWrPuxAR.js → flow-designer-node-9Bqyn6qx.js} +2 -1
  13. package/dist/flow-designer-node-9Bqyn6qx.js.map +1 -0
  14. package/dist/flow-designer-node.js +1 -1
  15. package/dist/flow-designer.js +3 -3
  16. package/dist/{icon-button-ohxHhy4t.js → icon-button-AdJBEoNy.js} +34 -30
  17. package/dist/icon-button-AdJBEoNy.js.map +1 -0
  18. package/dist/index.js +4 -4
  19. package/dist/{navigation-rail-CD7IrqbN.js → navigation-rail-DAUuJ_Yp.js} +735 -370
  20. package/dist/navigation-rail-DAUuJ_Yp.js.map +1 -0
  21. package/dist/peacock-loader.js +6 -3
  22. package/dist/peacock-loader.js.map +1 -1
  23. package/dist/popover-content.js +1 -1
  24. package/dist/popover-content.js.map +1 -1
  25. package/dist/search.js +11 -14
  26. package/dist/search.js.map +1 -1
  27. package/dist/src/canvas/canvas.d.ts +3 -3
  28. package/dist/src/field/field.d.ts +1 -0
  29. package/dist/src/flow-designer/flow-designer-node.d.ts +1 -0
  30. package/dist/src/image/image.d.ts +2 -2
  31. package/dist/src/index.d.ts +1 -0
  32. package/dist/src/input/input.d.ts +1 -3
  33. package/dist/src/item/index.d.ts +1 -0
  34. package/dist/src/item/item.d.ts +48 -0
  35. package/dist/src/menu/menu-item/menu-item.d.ts +8 -9
  36. package/dist/src/menu/sub-menu/sub-menu.d.ts +1 -0
  37. package/dist/src/navigation-rail/navigation-rail.d.ts +2 -6
  38. package/dist/src/popover/popover-content.d.ts +1 -1
  39. package/dist/src/search/search.d.ts +2 -6
  40. package/dist/test/item.test.d.ts +1 -0
  41. package/dist/tsconfig.tsbuildinfo +1 -1
  42. package/package.json +1 -1
  43. package/scss/mixin.scss +23 -0
  44. package/src/button/button/button-sizes.scss +11 -11
  45. package/src/button/button/button.scss +96 -122
  46. package/src/button/button/button.ts +37 -34
  47. package/src/button/icon-button/icon-button-sizes.scss +8 -8
  48. package/src/button/icon-button/icon-button.ts +23 -20
  49. package/src/canvas/canvas.scss +18 -6
  50. package/src/canvas/canvas.ts +125 -103
  51. package/src/chip/chip/chip.scss +1 -1
  52. package/src/empty-state/empty-state.scss +1 -0
  53. package/src/field/field.ts +6 -0
  54. package/src/flow-designer/flow-designer-node.ts +1 -0
  55. package/src/image/image.scss +21 -16
  56. package/src/image/image.ts +13 -14
  57. package/src/index.ts +1 -0
  58. package/src/input/input.ts +16 -25
  59. package/src/item/index.ts +1 -0
  60. package/src/item/item.scss +184 -0
  61. package/src/item/item.ts +340 -0
  62. package/src/menu/menu/menu.ts +5 -9
  63. package/src/menu/menu-item/menu-item.scss +30 -108
  64. package/src/menu/menu-item/menu-item.ts +89 -129
  65. package/src/menu/sub-menu/sub-menu.ts +6 -2
  66. package/src/navigation-rail/navigation-rail.ts +2 -6
  67. package/src/peacock-loader.ts +4 -0
  68. package/src/popover/popover-content.ts +1 -1
  69. package/src/search/search.ts +11 -16
  70. package/src/select/option.ts +1 -1
  71. package/src/select/select.scss +1 -10
  72. package/src/select/select.ts +2 -0
  73. package/dist/flow-designer-node-BWrPuxAR.js.map +0 -1
  74. package/dist/icon-button-ohxHhy4t.js.map +0 -1
  75. package/dist/navigation-rail-CD7IrqbN.js.map +0 -1
package/dist/canvas.js CHANGED
@@ -21,8 +21,22 @@ var css_248z = i`* {
21
21
  }
22
22
 
23
23
  .canvas-wrapper {
24
+ position: relative;
24
25
  background: var(--canvas-background);
25
- border-radius: var(--shape-corner-medium);
26
+ }
27
+
28
+ .canvas {
29
+ display: block;
30
+ }
31
+
32
+ .canvas-background,
33
+ .canvas-shapes {
34
+ position: absolute;
35
+ inset: 0;
36
+ }
37
+
38
+ .canvas-background {
39
+ pointer-events: none;
26
40
  }
27
41
 
28
42
  #canvas-background circle {
@@ -31,14 +45,13 @@ var css_248z = i`* {
31
45
 
32
46
  #endarrow polyline {
33
47
  fill: none;
34
- stroke: var(--canvas-arrow-color);
48
+ stroke: context-stroke;
35
49
  vector-effect: non-scaling-stroke;
36
50
  stroke-width: 2;
51
+ stroke-linejoin: round;
52
+ stroke-linecap: round;
37
53
  }
38
54
 
39
- .line.no-color {
40
- stroke: var(--canvas-line-color);
41
- }
42
55
  .line.variant-dashed {
43
56
  stroke-dasharray: 6 6;
44
57
  }
@@ -64,6 +77,8 @@ var css_248z = i`* {
64
77
  }`;
65
78
 
66
79
  var Canvas_1;
80
+ const GRID_GAP = 10;
81
+ const GRID_DOT_RADIUS = 1;
67
82
  /**
68
83
  * @label Canvas
69
84
  * @tag wc-canvas
@@ -101,8 +116,6 @@ let Canvas = Canvas_1 = class Canvas extends i$1 {
101
116
  * Zoom multiplier for the canvas dimensions.
102
117
  */
103
118
  this.zoom = 1;
104
- this.unitSize = 1;
105
- this.gap = this.unitSize * 10;
106
119
  }
107
120
  static getNextPoint(point, direction, length) {
108
121
  if (direction === 'down')
@@ -115,47 +128,44 @@ let Canvas = Canvas_1 = class Canvas extends i$1 {
115
128
  return { x: point.x + length, y: point.y };
116
129
  return { x: point.x, y: point.y };
117
130
  }
118
- static updateComputationArea(point, area) {
119
- const nextArea = { ...area };
120
- if (point.x > nextArea.width)
121
- nextArea.width = point.x;
122
- else if (point.x < nextArea.x)
123
- nextArea.x = point.x;
124
- if (point.y > nextArea.height)
125
- nextArea.height = point.y;
126
- else if (point.y < nextArea.y)
127
- nextArea.y = point.y;
128
- return nextArea;
131
+ static updateExtents(extents, x, y) {
132
+ if (x < extents.minX)
133
+ extents.minX = x;
134
+ if (x > extents.maxX)
135
+ extents.maxX = x;
136
+ if (y < extents.minY)
137
+ extents.minY = y;
138
+ if (y > extents.maxY)
139
+ extents.maxY = y;
129
140
  }
130
141
  static getStrokeVariantClasses(variant) {
131
142
  return {
132
143
  line: true,
133
- 'no-color': false,
134
144
  'variant-dashed': variant === 'dashed' || variant === 'animated-dashed',
135
145
  'variant-animated-dashed': variant === 'animated-dashed',
136
146
  };
137
147
  }
138
148
  computeShapes(initialBounds) {
139
- const dotRadius = this.unitSize;
140
- let computedViewbox = { ...initialBounds };
149
+ // Track world-space bounds (grid units) as shapes are processed.
150
+ const extents = {
151
+ minX: initialBounds.x,
152
+ minY: initialBounds.y,
153
+ maxX: initialBounds.x + initialBounds.width,
154
+ maxY: initialBounds.y + initialBounds.height,
155
+ };
141
156
  const shapes = this.shapes.map(shape => {
142
157
  switch (shape.type) {
143
158
  case 'circle': {
144
159
  const r = shape.radius || 1;
145
160
  const cx = shape.x || 0;
146
161
  const cy = shape.y || 0;
147
- if (cx + Math.ceil(r) > computedViewbox.width)
148
- computedViewbox.width = cx + Math.ceil(r);
149
- if (cx - Math.ceil(r) < computedViewbox.x)
150
- computedViewbox.x = cx - Math.ceil(r);
151
- if (cy + Math.ceil(r) > computedViewbox.height)
152
- computedViewbox.height = cy + Math.ceil(r);
153
- if (cy - Math.ceil(r) < computedViewbox.y)
154
- computedViewbox.y = cy - Math.ceil(r);
162
+ Canvas_1.updateExtents(extents, cx - r, cy - r);
163
+ Canvas_1.updateExtents(extents, cx + r, cy + r);
164
+ // Convert from grid units to SVG pixels using the fixed gap.
155
165
  return w `<circle
156
- cx=${cx * this.gap + dotRadius}
157
- cy=${cy * this.gap + dotRadius}
158
- r=${r * this.gap}
166
+ cx=${cx * GRID_GAP + GRID_DOT_RADIUS}
167
+ cy=${cy * GRID_GAP + GRID_DOT_RADIUS}
168
+ r=${r * GRID_GAP}
159
169
  fill=${shape.color || 'var(--canvas-line-color, var(--color-on-surface))'}
160
170
  />`;
161
171
  }
@@ -164,33 +174,28 @@ let Canvas = Canvas_1 = class Canvas extends i$1 {
164
174
  const h = shape.height || 1;
165
175
  const rx = shape.x || 0;
166
176
  const ry = shape.y || 0;
167
- if (rx + Math.ceil(w$1) > computedViewbox.width)
168
- computedViewbox.width = rx + Math.ceil(w$1);
169
- if (rx - Math.ceil(w$1) < computedViewbox.x)
170
- computedViewbox.x = rx - Math.ceil(w$1);
171
- if (ry + Math.ceil(h) > computedViewbox.height)
172
- computedViewbox.height = ry + Math.ceil(h);
173
- if (ry - Math.ceil(h) < computedViewbox.y)
174
- computedViewbox.y = ry - Math.ceil(h);
177
+ Canvas_1.updateExtents(extents, rx, ry);
178
+ Canvas_1.updateExtents(extents, rx + w$1, ry + h);
175
179
  return w `<rect
176
- x=${rx * this.gap + dotRadius}
177
- y=${ry * this.gap}
178
- width=${w$1 * this.gap + dotRadius}
179
- height=${h * this.gap + dotRadius}
180
+ x=${rx * GRID_GAP + GRID_DOT_RADIUS}
181
+ y=${ry * GRID_GAP}
182
+ width=${w$1 * GRID_GAP + GRID_DOT_RADIUS}
183
+ height=${h * GRID_GAP + GRID_DOT_RADIUS}
180
184
  fill=${shape.color || 'var(--canvas-line-color, var(--color-on-surface))'}
181
185
  />`;
182
186
  }
183
187
  case 'line': {
184
188
  const start = shape.start || { x: 0, y: 0 };
185
189
  const end = shape.end || { x: 0, y: 0 };
186
- const pathString = `M${start.x * this.gap + dotRadius} ${start.y * this.gap + dotRadius} L${end.x * this.gap + dotRadius} ${end.y * this.gap + dotRadius}`;
190
+ Canvas_1.updateExtents(extents, start.x, start.y);
191
+ Canvas_1.updateExtents(extents, end.x, end.y);
192
+ const pathString = `M${start.x * GRID_GAP + GRID_DOT_RADIUS} ${start.y * GRID_GAP + GRID_DOT_RADIUS} L${end.x * GRID_GAP + GRID_DOT_RADIUS} ${end.y * GRID_GAP + GRID_DOT_RADIUS}`;
187
193
  const strokeColor = shape.color ||
188
194
  'var(--canvas-line-color, var(--color-on-surface))';
189
195
  return w `<path
190
196
  class=${e({
191
197
  ...Canvas_1.getStrokeVariantClasses(shape.variant),
192
198
  clickable: !!shape.clickable,
193
- 'no-color': !shape.color,
194
199
  })}
195
200
  stroke-width="2"
196
201
  stroke-linecap="round"
@@ -204,35 +209,38 @@ let Canvas = Canvas_1 = class Canvas extends i$1 {
204
209
  }
205
210
  case 'connector': {
206
211
  const start = shape.start || { x: 0, y: 0 };
207
- let pathString = `M${start.x * this.gap + dotRadius} ${start.y * this.gap + dotRadius}`;
212
+ let pathString = `M${start.x * GRID_GAP + GRID_DOT_RADIUS} ${start.y * GRID_GAP + GRID_DOT_RADIUS}`;
208
213
  let current = { ...start };
209
- computedViewbox = Canvas_1.updateComputationArea(current, computedViewbox);
214
+ Canvas_1.updateExtents(extents, current.x, current.y);
210
215
  const pathSegments = shape.path || [];
211
216
  for (let i = 0; i < pathSegments.length; i += 1) {
212
217
  const path = pathSegments[i];
213
218
  if (i === 0) {
219
+ // Move one unit first so curved corner joins don't overlap start.
214
220
  const point = Canvas_1.getNextPoint(current, path.direction, 1);
215
- pathString += ` L${point.x * this.gap + dotRadius} ${point.y * this.gap + dotRadius}`;
221
+ pathString += ` L${point.x * GRID_GAP + GRID_DOT_RADIUS} ${point.y * GRID_GAP + GRID_DOT_RADIUS}`;
216
222
  current = { ...point };
217
- computedViewbox = Canvas_1.updateComputationArea(current, computedViewbox);
223
+ Canvas_1.updateExtents(extents, current.x, current.y);
218
224
  }
219
225
  const point = Canvas_1.getNextPoint(current, path.direction, path.length - 2);
220
- pathString += ` L${point.x * this.gap + dotRadius} ${point.y * this.gap + dotRadius}`;
226
+ pathString += ` L${point.x * GRID_GAP + GRID_DOT_RADIUS} ${point.y * GRID_GAP + GRID_DOT_RADIUS}`;
221
227
  current = { ...point };
222
- computedViewbox = Canvas_1.updateComputationArea(current, computedViewbox);
228
+ Canvas_1.updateExtents(extents, current.x, current.y);
223
229
  if (i === pathSegments.length - 1) {
224
230
  const endPoint = Canvas_1.getNextPoint(current, path.direction, 1);
225
- pathString += ` L${endPoint.x * this.gap + dotRadius} ${endPoint.y * this.gap + dotRadius}`;
231
+ pathString += ` L${endPoint.x * GRID_GAP + GRID_DOT_RADIUS} ${endPoint.y * GRID_GAP + GRID_DOT_RADIUS}`;
226
232
  current = { ...endPoint };
227
- computedViewbox = Canvas_1.updateComputationArea(current, computedViewbox);
233
+ Canvas_1.updateExtents(extents, current.x, current.y);
228
234
  }
229
235
  else {
230
236
  const nextPath = pathSegments[i + 1];
231
237
  const midPoint = Canvas_1.getNextPoint(current, path.direction, 1);
238
+ Canvas_1.updateExtents(extents, midPoint.x, midPoint.y);
232
239
  const nextPoint = Canvas_1.getNextPoint(midPoint, nextPath.direction, 1);
233
- pathString += ` Q ${midPoint.x * this.gap + dotRadius} ${midPoint.y * this.gap + dotRadius} ${nextPoint.x * this.gap + dotRadius} ${nextPoint.y * this.gap + dotRadius}`;
240
+ // Use a quadratic segment to round corners between directions.
241
+ pathString += ` Q ${midPoint.x * GRID_GAP + GRID_DOT_RADIUS} ${midPoint.y * GRID_GAP + GRID_DOT_RADIUS} ${nextPoint.x * GRID_GAP + GRID_DOT_RADIUS} ${nextPoint.y * GRID_GAP + GRID_DOT_RADIUS}`;
234
242
  current = { ...nextPoint };
235
- computedViewbox = Canvas_1.updateComputationArea(current, computedViewbox);
243
+ Canvas_1.updateExtents(extents, current.x, current.y);
236
244
  }
237
245
  }
238
246
  const strokeColor = shape.color ||
@@ -241,7 +249,6 @@ let Canvas = Canvas_1 = class Canvas extends i$1 {
241
249
  <path
242
250
  class=${e({
243
251
  ...Canvas_1.getStrokeVariantClasses(shape.variant),
244
- 'no-color': !shape.color,
245
252
  })}
246
253
  stroke-width="2"
247
254
  stroke-linecap="round"
@@ -266,17 +273,64 @@ let Canvas = Canvas_1 = class Canvas extends i$1 {
266
273
  return A;
267
274
  }
268
275
  });
269
- // Padding
270
- computedViewbox.x -= this.padding;
271
- computedViewbox.y -= this.padding;
272
- computedViewbox.width += this.padding;
273
- computedViewbox.height += this.padding;
274
- computedViewbox.width -= computedViewbox.x;
275
- computedViewbox.height -= computedViewbox.y;
276
+ // Expand bounds with padding so shapes are not flush to the edge.
277
+ const computedViewbox = {
278
+ x: extents.minX - this.padding,
279
+ y: extents.minY - this.padding,
280
+ width: Math.max(extents.maxX - extents.minX + this.padding * 2, 0),
281
+ height: Math.max(extents.maxY - extents.minY + this.padding * 2, 0),
282
+ };
276
283
  return { shapes, computedViewbox };
277
284
  }
285
+ renderBackgroundSvg(computedViewBox, svgViewBox) {
286
+ return b `
287
+ <svg
288
+ class="canvas canvas-background"
289
+ height="100%"
290
+ width="100%"
291
+ viewBox=${svgViewBox}
292
+ aria-hidden="true"
293
+ >
294
+ <defs>
295
+ <pattern
296
+ id="canvas-background"
297
+ patternUnits="userSpaceOnUse"
298
+ width=${GRID_GAP}
299
+ height=${GRID_GAP}
300
+ >
301
+ <circle cx="1" cy="1" r=${GRID_DOT_RADIUS} />
302
+ </pattern>
303
+ </defs>
304
+
305
+ <rect
306
+ x=${computedViewBox.x * GRID_GAP}
307
+ y=${computedViewBox.y * GRID_GAP}
308
+ width="100%"
309
+ height="100%"
310
+ fill="url(#canvas-background)"
311
+ />
312
+ </svg>
313
+ `;
314
+ }
315
+ renderShapesSvg(shapes, svgViewBox) {
316
+ return b `
317
+ <svg
318
+ class="canvas canvas-shapes"
319
+ height="100%"
320
+ width="100%"
321
+ viewBox=${svgViewBox}
322
+ >
323
+ <defs>
324
+ <marker id="endarrow" markerWidth="10" markerHeight="10" refX="5" refY="5" markerUnits="strokeWidth" orient="auto">
325
+ <polyline points="0 2, 5 5, 0 8"></polyline>
326
+ </marker>
327
+ </defs>
328
+
329
+ ${shapes}
330
+ </svg>
331
+ `;
332
+ }
278
333
  render() {
279
- const dotRadius = this.unitSize;
280
334
  let computedViewBox = { width: 0, height: 0, x: 0, y: 0 };
281
335
  const { shapes, computedViewbox } = this.computeShapes(computedViewBox);
282
336
  computedViewBox = computedViewbox;
@@ -289,53 +343,18 @@ let Canvas = Canvas_1 = class Canvas extends i$1 {
289
343
  height: parseInt(viewBox[3], 10),
290
344
  };
291
345
  }
292
- const wrapperWidth = (computedViewBox.width * this.gap + 2) * dotRadius * this.zoom;
293
- const wrapperHeight = (computedViewBox.height * this.gap + 2) * dotRadius * this.zoom;
294
- const svgViewBox = `${computedViewBox.x * this.gap} ${computedViewBox.y * this.gap} ${computedViewBox.width * this.gap + 2 * dotRadius} ${computedViewBox.height * this.gap + 2 * dotRadius}`;
346
+ // Zoom scales the outer viewport size while the SVG viewBox stays in world units.
347
+ const wrapperWidth = (computedViewBox.width * GRID_GAP + 2) * GRID_DOT_RADIUS * this.zoom;
348
+ const wrapperHeight = (computedViewBox.height * GRID_GAP + 2) * GRID_DOT_RADIUS * this.zoom;
349
+ // viewBox maps world-space extents into the internal SVG coordinate system.
350
+ const svgViewBox = `${computedViewBox.x * GRID_GAP} ${computedViewBox.y * GRID_GAP} ${computedViewBox.width * GRID_GAP + 2 * GRID_DOT_RADIUS} ${computedViewBox.height * GRID_GAP + 2 * GRID_DOT_RADIUS}`;
295
351
  return b `
296
352
  <div
297
353
  class="canvas-wrapper"
298
354
  style="width: ${wrapperWidth}px; height: ${wrapperHeight}px;"
299
355
  >
300
- <svg
301
- class="canvas"
302
- height="100%"
303
- width="100%"
304
- viewBox=${svgViewBox}
305
- >
306
- <defs>
307
- <pattern
308
- id="canvas-background"
309
- patternUnits="userSpaceOnUse"
310
- width=${this.gap}
311
- height=${this.gap}
312
- >
313
- <circle cx="1" cy="1" r=${dotRadius} />
314
- </pattern>
315
-
316
- <marker
317
- id="endarrow"
318
- markerWidth="15"
319
- markerHeight="22.5"
320
- refX="9"
321
- refY="15"
322
- markerUnits="userSpaceOnUse"
323
- orient="auto"
324
- >
325
- <polyline points="0 22.5, 7.5 15, 0 7.5"></polyline>
326
- </marker>
327
- </defs>
328
-
329
- <rect
330
- x=${computedViewBox.x * this.gap}
331
- y=${computedViewBox.y * this.gap}
332
- width="100%"
333
- height="100%"
334
- fill="url(#canvas-background)"
335
- />
336
-
337
- ${shapes}
338
- </svg>
356
+ ${this.renderBackgroundSvg(computedViewBox, svgViewBox)}
357
+ ${this.renderShapesSvg(shapes, svgViewBox)}
339
358
  </div>
340
359
  `;
341
360
  }
@@ -1 +1 @@
1
- {"version":3,"file":"canvas.js","sources":["../../src/canvas/canvas.ts"],"sourcesContent":["import { html, LitElement, svg, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport IndividualComponent from '@/IndividualComponent.js';\nimport styles from './canvas.scss';\n\nexport type CanvasDirection = 'up' | 'down' | 'left' | 'right';\n\nexport type CanvasStrokeVariant = 'solid' | 'dashed' | 'animated-dashed';\n\nexport interface CanvasPoint {\n x: number;\n y: number;\n}\n\nexport interface CanvasPathSegment {\n direction: CanvasDirection;\n length: number;\n}\n\ninterface BaseCanvasShape {\n color?: string;\n}\n\ninterface BaseCanvasStrokeShape extends BaseCanvasShape {\n variant?: CanvasStrokeVariant;\n showArrow?: boolean;\n clickable?: boolean;\n}\n\nexport interface CanvasCircleShape extends BaseCanvasShape {\n type: 'circle';\n x?: number;\n y?: number;\n radius?: number;\n}\n\nexport interface CanvasRectShape extends BaseCanvasShape {\n type: 'rect';\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n}\n\nexport interface CanvasLineShape extends BaseCanvasStrokeShape {\n type: 'line';\n start?: CanvasPoint;\n end?: CanvasPoint;\n}\n\nexport interface CanvasConnectorShape extends BaseCanvasStrokeShape {\n type: 'connector';\n start?: CanvasPoint;\n path?: CanvasPathSegment[];\n}\n\nexport type CanvasShape =\n | CanvasCircleShape\n | CanvasRectShape\n | CanvasLineShape\n | CanvasConnectorShape;\n\ninterface CanvasBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * @label Canvas\n * @tag wc-canvas\n * @rawTag canvas\n * @summary A Material 3 inspired SVG canvas for drawing shapes, lines, and connectors on a dotted grid.\n *\n * @cssprop --canvas-background - Background color for the canvas wrapper. Defaults to surface-container-low.\n * @cssprop --canvas-dot-color - Color of the background grid dots. Defaults to outline-variant.\n * @cssprop --canvas-line-color - Default stroke color for lines and connectors. Defaults to on-surface.\n * @cssprop --canvas-hover-color - Stroke color on hover for clickable shapes. Defaults to primary.\n * @cssprop --canvas-arrow-color - Stroke color for arrow markers. Defaults to on-surface.\n *\n * @example\n * ```html\n * <wc-canvas id=\"my-canvas\"></wc-canvas>\n * <script>\n * document.querySelector('#my-canvas').shapes = [\n * { type: 'circle', x: 0, y: 0, radius: 0.25, color: 'red' },\n * ];\n * </script>\n * ```\n */\n@IndividualComponent\nexport class Canvas extends LitElement {\n static styles = [styles];\n\n /**\n * Array of shape objects to render on the canvas.\n */\n @property({ type: Array })\n shapes: CanvasShape[] = [];\n\n /**\n * Padding around the computed viewbox (in grid units).\n */\n @property({ type: Number, reflect: true })\n padding: number = 1;\n\n /**\n * Zoom multiplier for the canvas dimensions.\n */\n @property({ type: Number, reflect: true })\n zoom: number = 1;\n\n /**\n * Optional viewbox override string (e.g. \"0 0 100 100\").\n */\n @property({ type: String })\n viewbox?: string;\n\n private unitSize: number = 1;\n\n private gap: number = this.unitSize * 10;\n\n private static getNextPoint(\n point: CanvasPoint,\n direction: CanvasDirection,\n length: number,\n ): CanvasPoint {\n if (direction === 'down') return { x: point.x, y: point.y + length };\n if (direction === 'up') return { x: point.x, y: point.y - length };\n if (direction === 'left') return { x: point.x - length, y: point.y };\n if (direction === 'right') return { x: point.x + length, y: point.y };\n return { x: point.x, y: point.y };\n }\n\n private static updateComputationArea(\n point: CanvasPoint,\n area: CanvasBounds,\n ): CanvasBounds {\n const nextArea = { ...area };\n if (point.x > nextArea.width) nextArea.width = point.x;\n else if (point.x < nextArea.x) nextArea.x = point.x;\n if (point.y > nextArea.height) nextArea.height = point.y;\n else if (point.y < nextArea.y) nextArea.y = point.y;\n return nextArea;\n }\n\n private static getStrokeVariantClasses(variant?: CanvasStrokeVariant) {\n return {\n line: true,\n 'no-color': false,\n 'variant-dashed': variant === 'dashed' || variant === 'animated-dashed',\n 'variant-animated-dashed': variant === 'animated-dashed',\n };\n }\n\n private computeShapes(initialBounds: CanvasBounds) {\n const dotRadius = this.unitSize;\n let computedViewbox = { ...initialBounds };\n\n const shapes = this.shapes.map(shape => {\n switch (shape.type) {\n case 'circle': {\n const r = shape.radius || 1;\n const cx = shape.x || 0;\n const cy = shape.y || 0;\n if (cx + Math.ceil(r) > computedViewbox.width)\n computedViewbox.width = cx + Math.ceil(r);\n if (cx - Math.ceil(r) < computedViewbox.x)\n computedViewbox.x = cx - Math.ceil(r);\n if (cy + Math.ceil(r) > computedViewbox.height)\n computedViewbox.height = cy + Math.ceil(r);\n if (cy - Math.ceil(r) < computedViewbox.y)\n computedViewbox.y = cy - Math.ceil(r);\n\n return svg`<circle\n cx=${cx * this.gap + dotRadius}\n cy=${cy * this.gap + dotRadius}\n r=${r * this.gap}\n fill=${shape.color || 'var(--canvas-line-color, var(--color-on-surface))'}\n />`;\n }\n case 'rect': {\n const w = shape.width || 1;\n const h = shape.height || 1;\n const rx = shape.x || 0;\n const ry = shape.y || 0;\n if (rx + Math.ceil(w) > computedViewbox.width)\n computedViewbox.width = rx + Math.ceil(w);\n if (rx - Math.ceil(w) < computedViewbox.x)\n computedViewbox.x = rx - Math.ceil(w);\n if (ry + Math.ceil(h) > computedViewbox.height)\n computedViewbox.height = ry + Math.ceil(h);\n if (ry - Math.ceil(h) < computedViewbox.y)\n computedViewbox.y = ry - Math.ceil(h);\n\n return svg`<rect\n x=${rx * this.gap + dotRadius}\n y=${ry * this.gap}\n width=${w * this.gap + dotRadius}\n height=${h * this.gap + dotRadius}\n fill=${shape.color || 'var(--canvas-line-color, var(--color-on-surface))'}\n />`;\n }\n case 'line': {\n const start = shape.start || { x: 0, y: 0 };\n const end = shape.end || { x: 0, y: 0 };\n const pathString = `M${start.x * this.gap + dotRadius} ${start.y * this.gap + dotRadius} L${end.x * this.gap + dotRadius} ${end.y * this.gap + dotRadius}`;\n const strokeColor =\n shape.color ||\n 'var(--canvas-line-color, var(--color-on-surface))';\n\n return svg`<path\n class=${classMap({\n ...Canvas.getStrokeVariantClasses(shape.variant),\n clickable: !!shape.clickable,\n 'no-color': !shape.color,\n })}\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke=${strokeColor}\n marker-end=${shape.showArrow ? 'url(#endarrow)' : ''}\n d=${pathString}\n stroke-dasharray=${shape.variant === 'dashed' || shape.variant === 'animated-dashed' ? '6,6' : nothing}\n fill=\"none\"\n />`;\n }\n case 'connector': {\n const start = shape.start || { x: 0, y: 0 };\n let pathString = `M${start.x * this.gap + dotRadius} ${start.y * this.gap + dotRadius}`;\n let current = { ...start };\n computedViewbox = Canvas.updateComputationArea(current, computedViewbox);\n\n const pathSegments = shape.path || [];\n for (let i = 0; i < pathSegments.length; i += 1) {\n const path = pathSegments[i];\n\n if (i === 0) {\n const point = Canvas.getNextPoint(current, path.direction, 1);\n pathString += ` L${point.x * this.gap + dotRadius} ${point.y * this.gap + dotRadius}`;\n current = { ...point };\n computedViewbox = Canvas.updateComputationArea(current, computedViewbox);\n }\n\n const point = Canvas.getNextPoint(\n current,\n path.direction,\n path.length - 2,\n );\n pathString += ` L${point.x * this.gap + dotRadius} ${point.y * this.gap + dotRadius}`;\n current = { ...point };\n computedViewbox = Canvas.updateComputationArea(current, computedViewbox);\n\n if (i === pathSegments.length - 1) {\n const endPoint = Canvas.getNextPoint(current, path.direction, 1);\n pathString += ` L${endPoint.x * this.gap + dotRadius} ${endPoint.y * this.gap + dotRadius}`;\n current = { ...endPoint };\n computedViewbox = Canvas.updateComputationArea(current, computedViewbox);\n } else {\n const nextPath = pathSegments[i + 1];\n const midPoint = Canvas.getNextPoint(current, path.direction, 1);\n const nextPoint = Canvas.getNextPoint(\n midPoint,\n nextPath.direction,\n 1,\n );\n pathString += ` Q ${midPoint.x * this.gap + dotRadius} ${midPoint.y * this.gap + dotRadius} ${nextPoint.x * this.gap + dotRadius} ${nextPoint.y * this.gap + dotRadius}`;\n current = { ...nextPoint };\n computedViewbox = Canvas.updateComputationArea(current, computedViewbox);\n }\n }\n\n const strokeColor =\n shape.color ||\n 'var(--canvas-line-color, var(--color-on-surface))';\n\n return svg`<g class=${classMap({ clickable: !!shape.clickable })}>\n <path\n class=${classMap({\n ...Canvas.getStrokeVariantClasses(shape.variant),\n 'no-color': !shape.color,\n })}\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke=${strokeColor}\n marker-end=${shape.showArrow ? 'url(#endarrow)' : ''}\n d=${pathString}\n stroke-dasharray=${shape.variant === 'dashed' || shape.variant === 'animated-dashed' ? '6,6' : nothing}\n fill=\"none\"\n />\n <path\n stroke-width=\"10\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke=\"transparent\"\n d=${pathString}\n fill=\"none\"\n />\n </g>`;\n }\n default:\n return nothing;\n }\n });\n\n // Padding\n computedViewbox.x -= this.padding;\n computedViewbox.y -= this.padding;\n computedViewbox.width += this.padding;\n computedViewbox.height += this.padding;\n computedViewbox.width -= computedViewbox.x;\n computedViewbox.height -= computedViewbox.y;\n\n return { shapes, computedViewbox };\n }\n\n protected render() {\n const dotRadius = this.unitSize;\n let computedViewBox = { width: 0, height: 0, x: 0, y: 0 };\n\n const { shapes, computedViewbox } = this.computeShapes(computedViewBox);\n computedViewBox = computedViewbox;\n\n if (this.viewbox) {\n const viewBox = this.viewbox.split(' ');\n computedViewBox = {\n x: parseInt(viewBox[0], 10),\n y: parseInt(viewBox[1], 10),\n width: parseInt(viewBox[2], 10),\n height: parseInt(viewBox[3], 10),\n };\n }\n\n const wrapperWidth =\n (computedViewBox.width * this.gap + 2) * dotRadius * this.zoom;\n const wrapperHeight =\n (computedViewBox.height * this.gap + 2) * dotRadius * this.zoom;\n\n const svgViewBox = `${computedViewBox.x * this.gap} ${computedViewBox.y * this.gap} ${computedViewBox.width * this.gap + 2 * dotRadius} ${computedViewBox.height * this.gap + 2 * dotRadius}`;\n\n return html`\n <div\n class=\"canvas-wrapper\"\n style=\"width: ${wrapperWidth}px; height: ${wrapperHeight}px;\"\n >\n <svg\n class=\"canvas\"\n height=\"100%\"\n width=\"100%\"\n viewBox=${svgViewBox}\n >\n <defs>\n <pattern\n id=\"canvas-background\"\n patternUnits=\"userSpaceOnUse\"\n width=${this.gap}\n height=${this.gap}\n >\n <circle cx=\"1\" cy=\"1\" r=${dotRadius} />\n </pattern>\n\n <marker\n id=\"endarrow\"\n markerWidth=\"15\"\n markerHeight=\"22.5\"\n refX=\"9\"\n refY=\"15\"\n markerUnits=\"userSpaceOnUse\"\n orient=\"auto\"\n >\n <polyline points=\"0 22.5, 7.5 15, 0 7.5\"></polyline>\n </marker>\n </defs>\n\n <rect\n x=${computedViewBox.x * this.gap}\n y=${computedViewBox.y * this.gap}\n width=\"100%\"\n height=\"100%\"\n fill=\"url(#canvas-background)\"\n />\n\n ${shapes}\n </svg>\n </div>\n `;\n }\n}\n"],"names":["LitElement","svg","w","classMap","nothing","html","styles","property"],"mappings":"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"}
1
+ {"version":3,"file":"canvas.js","sources":["../../src/canvas/canvas.ts"],"sourcesContent":["import { html, LitElement, svg, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport IndividualComponent from '@/IndividualComponent.js';\nimport styles from './canvas.scss';\n\nexport type CanvasDirection = 'up' | 'down' | 'left' | 'right';\n\nexport type CanvasStrokeVariant = 'solid' | 'dashed' | 'animated-dashed';\n\nexport interface CanvasPoint {\n x: number;\n y: number;\n}\n\nexport interface CanvasPathSegment {\n direction: CanvasDirection;\n length: number;\n}\n\ninterface BaseCanvasShape {\n color?: string;\n}\n\ninterface BaseCanvasStrokeShape extends BaseCanvasShape {\n variant?: CanvasStrokeVariant;\n showArrow?: boolean;\n clickable?: boolean;\n}\n\nexport interface CanvasCircleShape extends BaseCanvasShape {\n type: 'circle';\n x?: number;\n y?: number;\n radius?: number;\n}\n\nexport interface CanvasRectShape extends BaseCanvasShape {\n type: 'rect';\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n}\n\nexport interface CanvasLineShape extends BaseCanvasStrokeShape {\n type: 'line';\n start?: CanvasPoint;\n end?: CanvasPoint;\n}\n\nexport interface CanvasConnectorShape extends BaseCanvasStrokeShape {\n type: 'connector';\n start?: CanvasPoint;\n path?: CanvasPathSegment[];\n}\n\nexport type CanvasShape =\n | CanvasCircleShape\n | CanvasRectShape\n | CanvasLineShape\n | CanvasConnectorShape;\n\nconst GRID_GAP = 10;\nconst GRID_DOT_RADIUS = 1;\n\ninterface CanvasBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ninterface CanvasExtents {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\ninterface CanvasViewBox {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * @label Canvas\n * @tag wc-canvas\n * @rawTag canvas\n * @summary A Material 3 inspired SVG canvas for drawing shapes, lines, and connectors on a dotted grid.\n *\n * @cssprop --canvas-background - Background color for the canvas wrapper. Defaults to surface-container-low.\n * @cssprop --canvas-dot-color - Color of the background grid dots. Defaults to outline-variant.\n * @cssprop --canvas-line-color - Default stroke color for lines and connectors. Defaults to on-surface.\n * @cssprop --canvas-hover-color - Stroke color on hover for clickable shapes. Defaults to primary.\n * @cssprop --canvas-arrow-color - Stroke color for arrow markers. Defaults to on-surface.\n *\n * @example\n * ```html\n * <wc-canvas id=\"my-canvas\"></wc-canvas>\n * <script>\n * document.querySelector('#my-canvas').shapes = [\n * { type: 'circle', x: 0, y: 0, radius: 0.25, color: 'red' },\n * ];\n * </script>\n * ```\n */\n@IndividualComponent\nexport class Canvas extends LitElement {\n static styles = [styles];\n\n /**\n * Array of shape objects to render on the canvas.\n */\n @property({ type: Array })\n shapes: CanvasShape[] = [];\n\n /**\n * Padding around the computed viewbox (in grid units).\n */\n @property({ type: Number, reflect: true })\n padding: number = 1;\n\n /**\n * Zoom multiplier for the canvas dimensions.\n */\n @property({ type: Number, reflect: true })\n zoom: number = 1;\n\n /**\n * Optional viewbox override string (e.g. \"0 0 100 100\").\n */\n @property({ type: String })\n viewbox?: string;\n\n private static getNextPoint(\n point: CanvasPoint,\n direction: CanvasDirection,\n length: number,\n ): CanvasPoint {\n if (direction === 'down') return { x: point.x, y: point.y + length };\n if (direction === 'up') return { x: point.x, y: point.y - length };\n if (direction === 'left') return { x: point.x - length, y: point.y };\n if (direction === 'right') return { x: point.x + length, y: point.y };\n return { x: point.x, y: point.y };\n }\n\n private static updateExtents(\n extents: CanvasExtents,\n x: number,\n y: number,\n ) {\n if (x < extents.minX) extents.minX = x;\n if (x > extents.maxX) extents.maxX = x;\n if (y < extents.minY) extents.minY = y;\n if (y > extents.maxY) extents.maxY = y;\n }\n\n private static getStrokeVariantClasses(variant?: CanvasStrokeVariant) {\n return {\n line: true,\n 'variant-dashed': variant === 'dashed' || variant === 'animated-dashed',\n 'variant-animated-dashed': variant === 'animated-dashed',\n };\n }\n\n private computeShapes(initialBounds: CanvasBounds) {\n // Track world-space bounds (grid units) as shapes are processed.\n const extents: CanvasExtents = {\n minX: initialBounds.x,\n minY: initialBounds.y,\n maxX: initialBounds.x + initialBounds.width,\n maxY: initialBounds.y + initialBounds.height,\n };\n\n const shapes = this.shapes.map(shape => {\n switch (shape.type) {\n case 'circle': {\n const r = shape.radius || 1;\n const cx = shape.x || 0;\n const cy = shape.y || 0;\n Canvas.updateExtents(extents, cx - r, cy - r);\n Canvas.updateExtents(extents, cx + r, cy + r);\n\n // Convert from grid units to SVG pixels using the fixed gap.\n return svg`<circle\n cx=${cx * GRID_GAP + GRID_DOT_RADIUS}\n cy=${cy * GRID_GAP + GRID_DOT_RADIUS}\n r=${r * GRID_GAP}\n fill=${shape.color || 'var(--canvas-line-color, var(--color-on-surface))'}\n />`;\n }\n case 'rect': {\n const w = shape.width || 1;\n const h = shape.height || 1;\n const rx = shape.x || 0;\n const ry = shape.y || 0;\n Canvas.updateExtents(extents, rx, ry);\n Canvas.updateExtents(extents, rx + w, ry + h);\n\n return svg`<rect\n x=${rx * GRID_GAP + GRID_DOT_RADIUS}\n y=${ry * GRID_GAP}\n width=${w * GRID_GAP + GRID_DOT_RADIUS}\n height=${h * GRID_GAP + GRID_DOT_RADIUS}\n fill=${shape.color || 'var(--canvas-line-color, var(--color-on-surface))'}\n />`;\n }\n case 'line': {\n const start = shape.start || { x: 0, y: 0 };\n const end = shape.end || { x: 0, y: 0 };\n Canvas.updateExtents(extents, start.x, start.y);\n Canvas.updateExtents(extents, end.x, end.y);\n const pathString = `M${start.x * GRID_GAP + GRID_DOT_RADIUS} ${start.y * GRID_GAP + GRID_DOT_RADIUS} L${end.x * GRID_GAP + GRID_DOT_RADIUS} ${end.y * GRID_GAP + GRID_DOT_RADIUS}`;\n const strokeColor =\n shape.color ||\n 'var(--canvas-line-color, var(--color-on-surface))';\n\n return svg`<path\n class=${classMap({\n ...Canvas.getStrokeVariantClasses(shape.variant),\n clickable: !!shape.clickable,\n })}\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke=${strokeColor}\n marker-end=${shape.showArrow ? 'url(#endarrow)' : ''}\n d=${pathString}\n stroke-dasharray=${shape.variant === 'dashed' || shape.variant === 'animated-dashed' ? '6,6' : nothing}\n fill=\"none\"\n />`;\n }\n case 'connector': {\n const start = shape.start || { x: 0, y: 0 };\n let pathString = `M${start.x * GRID_GAP + GRID_DOT_RADIUS} ${start.y * GRID_GAP + GRID_DOT_RADIUS}`;\n let current = { ...start };\n Canvas.updateExtents(extents, current.x, current.y);\n\n const pathSegments = shape.path || [];\n for (let i = 0; i < pathSegments.length; i += 1) {\n const path = pathSegments[i];\n\n if (i === 0) {\n // Move one unit first so curved corner joins don't overlap start.\n const point = Canvas.getNextPoint(current, path.direction, 1);\n pathString += ` L${point.x * GRID_GAP + GRID_DOT_RADIUS} ${point.y * GRID_GAP + GRID_DOT_RADIUS}`;\n current = { ...point };\n Canvas.updateExtents(extents, current.x, current.y);\n }\n\n const point = Canvas.getNextPoint(\n current,\n path.direction,\n path.length - 2,\n );\n pathString += ` L${point.x * GRID_GAP + GRID_DOT_RADIUS} ${point.y * GRID_GAP + GRID_DOT_RADIUS}`;\n current = { ...point };\n Canvas.updateExtents(extents, current.x, current.y);\n\n if (i === pathSegments.length - 1) {\n const endPoint = Canvas.getNextPoint(current, path.direction, 1);\n pathString += ` L${endPoint.x * GRID_GAP + GRID_DOT_RADIUS} ${endPoint.y * GRID_GAP + GRID_DOT_RADIUS}`;\n current = { ...endPoint };\n Canvas.updateExtents(extents, current.x, current.y);\n } else {\n const nextPath = pathSegments[i + 1];\n const midPoint = Canvas.getNextPoint(current, path.direction, 1);\n Canvas.updateExtents(extents, midPoint.x, midPoint.y);\n const nextPoint = Canvas.getNextPoint(\n midPoint,\n nextPath.direction,\n 1,\n );\n // Use a quadratic segment to round corners between directions.\n pathString += ` Q ${midPoint.x * GRID_GAP + GRID_DOT_RADIUS} ${midPoint.y * GRID_GAP + GRID_DOT_RADIUS} ${nextPoint.x * GRID_GAP + GRID_DOT_RADIUS} ${nextPoint.y * GRID_GAP + GRID_DOT_RADIUS}`;\n current = { ...nextPoint };\n Canvas.updateExtents(extents, current.x, current.y);\n }\n }\n\n const strokeColor =\n shape.color ||\n 'var(--canvas-line-color, var(--color-on-surface))';\n\n return svg`<g class=${classMap({ clickable: !!shape.clickable })}>\n <path\n class=${classMap({\n ...Canvas.getStrokeVariantClasses(shape.variant),\n })}\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke=${strokeColor}\n marker-end=${shape.showArrow ? 'url(#endarrow)' : ''}\n d=${pathString}\n stroke-dasharray=${shape.variant === 'dashed' || shape.variant === 'animated-dashed' ? '6,6' : nothing}\n fill=\"none\"\n />\n <path\n stroke-width=\"10\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke=\"transparent\"\n d=${pathString}\n fill=\"none\"\n />\n </g>`;\n }\n default:\n return nothing;\n }\n });\n\n // Expand bounds with padding so shapes are not flush to the edge.\n const computedViewbox = {\n x: extents.minX - this.padding,\n y: extents.minY - this.padding,\n width: Math.max(extents.maxX - extents.minX + this.padding * 2, 0),\n height: Math.max(extents.maxY - extents.minY + this.padding * 2, 0),\n };\n\n return { shapes, computedViewbox };\n }\n\n private renderBackgroundSvg(computedViewBox: CanvasViewBox, svgViewBox: string) {\n return html`\n <svg\n class=\"canvas canvas-background\"\n height=\"100%\"\n width=\"100%\"\n viewBox=${svgViewBox}\n aria-hidden=\"true\"\n >\n <defs>\n <pattern\n id=\"canvas-background\"\n patternUnits=\"userSpaceOnUse\"\n width=${GRID_GAP}\n height=${GRID_GAP}\n >\n <circle cx=\"1\" cy=\"1\" r=${GRID_DOT_RADIUS} />\n </pattern>\n </defs>\n\n <rect\n x=${computedViewBox.x * GRID_GAP}\n y=${computedViewBox.y * GRID_GAP}\n width=\"100%\"\n height=\"100%\"\n fill=\"url(#canvas-background)\"\n />\n </svg>\n `;\n }\n\n private renderShapesSvg(shapes: unknown[], svgViewBox: string) {\n return html`\n <svg\n class=\"canvas canvas-shapes\"\n height=\"100%\"\n width=\"100%\"\n viewBox=${svgViewBox}\n >\n <defs>\n <marker id=\"endarrow\" markerWidth=\"10\" markerHeight=\"10\" refX=\"5\" refY=\"5\" markerUnits=\"strokeWidth\" orient=\"auto\">\n <polyline points=\"0 2, 5 5, 0 8\"></polyline>\n </marker>\n </defs>\n\n ${shapes}\n </svg>\n `;\n }\n\n protected render() {\n let computedViewBox = { width: 0, height: 0, x: 0, y: 0 };\n\n const { shapes, computedViewbox } = this.computeShapes(computedViewBox);\n computedViewBox = computedViewbox;\n\n if (this.viewbox) {\n const viewBox = this.viewbox.split(' ');\n computedViewBox = {\n x: parseInt(viewBox[0], 10),\n y: parseInt(viewBox[1], 10),\n width: parseInt(viewBox[2], 10),\n height: parseInt(viewBox[3], 10),\n };\n }\n\n // Zoom scales the outer viewport size while the SVG viewBox stays in world units.\n const wrapperWidth =\n (computedViewBox.width * GRID_GAP + 2) * GRID_DOT_RADIUS * this.zoom;\n const wrapperHeight =\n (computedViewBox.height * GRID_GAP + 2) * GRID_DOT_RADIUS * this.zoom;\n\n // viewBox maps world-space extents into the internal SVG coordinate system.\n const svgViewBox = `${computedViewBox.x * GRID_GAP} ${computedViewBox.y * GRID_GAP} ${computedViewBox.width * GRID_GAP + 2 * GRID_DOT_RADIUS} ${computedViewBox.height * GRID_GAP + 2 * GRID_DOT_RADIUS}`;\n\n return html`\n <div\n class=\"canvas-wrapper\"\n style=\"width: ${wrapperWidth}px; height: ${wrapperHeight}px;\"\n >\n ${this.renderBackgroundSvg(computedViewBox, svgViewBox)}\n ${this.renderShapesSvg(shapes, svgViewBox)}\n </div>\n `;\n }\n}\n"],"names":["LitElement","svg","w","classMap","nothing","html","styles","property"],"mappings":"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"}