@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.
- package/dist/assets/components.css.map +1 -1
- package/dist/assets/styles.css.map +1 -1
- package/dist/{button-colors-AvGh22Zn.js → button-colors-Cg6oxiz-.js} +126 -116
- package/dist/{button-colors-AvGh22Zn.js.map → button-colors-Cg6oxiz-.js.map} +1 -1
- package/dist/button-group.js +2 -2
- package/dist/button.js +17 -14
- package/dist/button.js.map +1 -1
- package/dist/canvas.js +126 -107
- package/dist/canvas.js.map +1 -1
- package/dist/custom-elements-jsdocs.json +665 -162
- package/dist/custom-elements.json +859 -326
- package/dist/{flow-designer-node-BWrPuxAR.js → flow-designer-node-9Bqyn6qx.js} +2 -1
- package/dist/flow-designer-node-9Bqyn6qx.js.map +1 -0
- package/dist/flow-designer-node.js +1 -1
- package/dist/flow-designer.js +3 -3
- package/dist/{icon-button-ohxHhy4t.js → icon-button-AdJBEoNy.js} +34 -30
- package/dist/icon-button-AdJBEoNy.js.map +1 -0
- package/dist/index.js +4 -4
- package/dist/{navigation-rail-CD7IrqbN.js → navigation-rail-DAUuJ_Yp.js} +735 -370
- package/dist/navigation-rail-DAUuJ_Yp.js.map +1 -0
- package/dist/peacock-loader.js +6 -3
- package/dist/peacock-loader.js.map +1 -1
- package/dist/popover-content.js +1 -1
- package/dist/popover-content.js.map +1 -1
- package/dist/search.js +11 -14
- package/dist/search.js.map +1 -1
- package/dist/src/canvas/canvas.d.ts +3 -3
- package/dist/src/field/field.d.ts +1 -0
- package/dist/src/flow-designer/flow-designer-node.d.ts +1 -0
- package/dist/src/image/image.d.ts +2 -2
- package/dist/src/index.d.ts +1 -0
- package/dist/src/input/input.d.ts +1 -3
- package/dist/src/item/index.d.ts +1 -0
- package/dist/src/item/item.d.ts +48 -0
- package/dist/src/menu/menu-item/menu-item.d.ts +8 -9
- package/dist/src/menu/sub-menu/sub-menu.d.ts +1 -0
- package/dist/src/navigation-rail/navigation-rail.d.ts +2 -6
- package/dist/src/popover/popover-content.d.ts +1 -1
- package/dist/src/search/search.d.ts +2 -6
- package/dist/test/item.test.d.ts +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/scss/mixin.scss +23 -0
- package/src/button/button/button-sizes.scss +11 -11
- package/src/button/button/button.scss +96 -122
- package/src/button/button/button.ts +37 -34
- package/src/button/icon-button/icon-button-sizes.scss +8 -8
- package/src/button/icon-button/icon-button.ts +23 -20
- package/src/canvas/canvas.scss +18 -6
- package/src/canvas/canvas.ts +125 -103
- package/src/chip/chip/chip.scss +1 -1
- package/src/empty-state/empty-state.scss +1 -0
- package/src/field/field.ts +6 -0
- package/src/flow-designer/flow-designer-node.ts +1 -0
- package/src/image/image.scss +21 -16
- package/src/image/image.ts +13 -14
- package/src/index.ts +1 -0
- package/src/input/input.ts +16 -25
- package/src/item/index.ts +1 -0
- package/src/item/item.scss +184 -0
- package/src/item/item.ts +340 -0
- package/src/menu/menu/menu.ts +5 -9
- package/src/menu/menu-item/menu-item.scss +30 -108
- package/src/menu/menu-item/menu-item.ts +89 -129
- package/src/menu/sub-menu/sub-menu.ts +6 -2
- package/src/navigation-rail/navigation-rail.ts +2 -6
- package/src/peacock-loader.ts +4 -0
- package/src/popover/popover-content.ts +1 -1
- package/src/search/search.ts +11 -16
- package/src/select/option.ts +1 -1
- package/src/select/select.scss +1 -10
- package/src/select/select.ts +2 -0
- package/dist/flow-designer-node-BWrPuxAR.js.map +0 -1
- package/dist/icon-button-ohxHhy4t.js.map +0 -1
- 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
|
-
|
|
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:
|
|
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
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
140
|
-
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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 *
|
|
157
|
-
cy=${cy *
|
|
158
|
-
r=${r *
|
|
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
|
-
|
|
168
|
-
|
|
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 *
|
|
177
|
-
y=${ry *
|
|
178
|
-
width=${w$1 *
|
|
179
|
-
height=${h *
|
|
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
|
-
|
|
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 *
|
|
212
|
+
let pathString = `M${start.x * GRID_GAP + GRID_DOT_RADIUS} ${start.y * GRID_GAP + GRID_DOT_RADIUS}`;
|
|
208
213
|
let current = { ...start };
|
|
209
|
-
|
|
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 *
|
|
221
|
+
pathString += ` L${point.x * GRID_GAP + GRID_DOT_RADIUS} ${point.y * GRID_GAP + GRID_DOT_RADIUS}`;
|
|
216
222
|
current = { ...point };
|
|
217
|
-
|
|
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 *
|
|
226
|
+
pathString += ` L${point.x * GRID_GAP + GRID_DOT_RADIUS} ${point.y * GRID_GAP + GRID_DOT_RADIUS}`;
|
|
221
227
|
current = { ...point };
|
|
222
|
-
|
|
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 *
|
|
231
|
+
pathString += ` L${endPoint.x * GRID_GAP + GRID_DOT_RADIUS} ${endPoint.y * GRID_GAP + GRID_DOT_RADIUS}`;
|
|
226
232
|
current = { ...endPoint };
|
|
227
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
270
|
-
computedViewbox
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
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
|
-
|
|
293
|
-
const
|
|
294
|
-
const
|
|
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
|
-
|
|
301
|
-
|
|
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
|
}
|
package/dist/canvas.js.map
CHANGED
|
@@ -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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"}
|