sliccy 3.41.1 → 3.42.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ui/assets/adobe-6HAbKcn4.js +2 -0
- package/dist/ui/assets/{adobe-D1vCNkNC.js → adobe-CFs49Ldo.js} +1 -1
- package/dist/ui/assets/{agent-bridge-DxlscH16.js → agent-bridge-CaTifIJb.js} +1 -1
- package/dist/ui/assets/{agent-message-to-chat-Lwy2EBHf.js → agent-message-to-chat-DBdPeIAw.js} +1 -1
- package/dist/ui/assets/{apps-rrb7uG8q.js → apps-C9HoJRHu.js} +1 -1
- package/dist/ui/assets/{azure-openai-By7hBR9A.js → azure-openai-BUupHoQH.js} +1 -1
- package/dist/ui/assets/{azure-openai-CWatwGhy.js → azure-openai-gbSUirDq.js} +1 -1
- package/dist/ui/assets/{bsh-watchdog-By4aO0HL.js → bsh-watchdog-D760c-sw.js} +1 -1
- package/dist/ui/assets/{cdp-DqXPKaXv.js → cdp-DNq0N1OZ.js} +3 -3
- package/dist/ui/assets/{connect-surface-DBXUXM5q.js → connect-surface-1FUWatlV.js} +1 -1
- package/dist/ui/assets/cost-command-Dra1U3jF.js +1 -0
- package/dist/ui/assets/{dist-DNED0MpT.js → dist-BCLHnlgq.js} +2 -2
- package/dist/ui/assets/{dist-DbTbRU9p2.js → dist-C6lFkA1A2.js} +1 -1
- package/dist/ui/assets/{dist-Cu5Yqq5d2.js → dist-CvzfEfDj2.js} +1 -1
- package/dist/ui/assets/{dist-ZDMnSvWv.js → dist-D7Q91ot4.js} +1 -1
- package/dist/ui/assets/{es-DDYPgR38.js → es-N4-H4LyA.js} +1 -1
- package/dist/ui/assets/{follower-sprinkle-bridge-D7dlYcU_.js → follower-sprinkle-bridge-C-chIyWh.js} +1 -1
- package/dist/ui/assets/{fs-BjCfDAl3.js → fs-B_Yiw-gA.js} +1 -1
- package/dist/ui/assets/{github-HeZgefH0.js → github-DXENDyDm.js} +1 -1
- package/dist/ui/assets/github-YMmsRSa5.js +2 -0
- package/dist/ui/assets/{github-copilot-RufkWz5q.js → github-copilot-BexWH_uC.js} +1 -1
- package/dist/ui/assets/{github-copilot-B0rfuZBv.js → github-copilot-CTrj2O90.js} +1 -1
- package/dist/ui/assets/{kernel-worker-B0j_TfUN.js → kernel-worker-D9uT30rZ.js} +19 -19
- package/dist/ui/assets/{lick-ws-bridge-C8Hg3YGd.js → lick-ws-bridge-CjOXgOAC.js} +1 -1
- package/dist/ui/assets/{local-llm-GD2-Hw_4.js → local-llm-DtrX5Uni.js} +1 -1
- package/dist/ui/assets/{magick-wasm-C5DgLA2W.js → magick-wasm-vsfBoBVf.js} +1 -1
- package/dist/ui/assets/main-COPO1-7A.js +1813 -0
- package/dist/ui/assets/{main-cherry-C511hrS-.js → main-cherry-CIlo3nad.js} +1 -1
- package/dist/ui/assets/{migration-run-2ugM_2Fv.js → migration-run-B4a5MEYh.js} +1 -1
- package/dist/ui/assets/{mount-jCn41ukO.js → mount-C4eQjArH.js} +1 -1
- package/dist/ui/assets/{nuke-command-C9nOsofh.js → nuke-command-BpUsw-m7.js} +1 -1
- package/dist/ui/assets/{oauth-bootstrap-C1ljExsp.js → oauth-bootstrap-rJr6mJXj.js} +2 -2
- package/dist/ui/assets/{oauth-service-BsWeJQx3.js → oauth-service-BbkAikCT.js} +1 -1
- package/dist/ui/assets/onboarding-orchestrator-o71LxZLt.js +1 -0
- package/dist/ui/assets/openai-codex-CAuyH7cW.js +1 -0
- package/dist/ui/assets/{openai-codex-T1u9yQlc.js → openai-codex-DndhWwHW.js} +1 -1
- package/dist/ui/assets/{panel-rpc-handlers-DatecaXs.js → panel-rpc-handlers-AngexUJX.js} +1 -1
- package/dist/ui/assets/{provider-BQXZuE1Z.js → provider-CF53ENSZ.js} +1 -1
- package/dist/ui/assets/{provider-settings-C-u-tl4q.js → provider-settings-gNr8eGBz.js} +2 -2
- package/dist/ui/assets/provider-store-access-B3i7FLFm.js +1 -0
- package/dist/ui/assets/provider-store-access-BR8F8wd6.js +1 -0
- package/dist/ui/assets/provider-wF_CzaeE.js +2 -0
- package/dist/ui/assets/{providers-DoNm9KIu.js → providers-BPe5laJG.js} +1 -1
- package/dist/ui/assets/{proxied-fetch-D7ScPbJc.js → proxied-fetch-B_AGBn4c.js} +1 -1
- package/dist/ui/assets/{remote-terminal-view-DH0K--K7.js → remote-terminal-view-CP8Lf876.js} +3 -3
- package/dist/ui/assets/{store-_udr88Ai.js → store-BS4j8ZLu.js} +1 -1
- package/dist/ui/assets/{sudo-CXjYfUlr.js → sudo-DSdWsBdi.js} +1 -1
- package/dist/ui/assets/{tray-leave-runtime-iXXYB_7A.js → tray-leave-runtime-D89qWVP0.js} +1 -1
- package/dist/ui/assets/{upgrade-detection-BGpYGKDp.js → upgrade-detection-DrqwHzzN.js} +1 -1
- package/dist/ui/assets/{xai-grok-GpZwWWPN.js → xai-grok-BQ9_isXE.js} +1 -1
- package/dist/ui/assets/xai-grok-BdtGxsQM.js +1 -0
- package/dist/ui/index.html +1 -1
- package/dist/ui/logos/error-logo-preview.html +503 -0
- package/dist/ui/logos/generate-error-variants.mjs +62 -0
- package/dist/ui/logos/sliccy-error-color-0scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-color-10scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-color-1scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-color-2scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-color-3scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-color-4scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-color-5scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-color-6scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-color-7scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-color-8scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-color-9scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-dark-0scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-dark-10scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-dark-1scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-dark-2scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-dark-3scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-dark-4scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-dark-5scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-dark-6scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-dark-7scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-dark-8scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-dark-9scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-light-0scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-light-10scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-light-1scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-light-2scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-light-3scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-light-4scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-light-5scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-light-6scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-light-7scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-light-8scoops.svg +27 -0
- package/dist/ui/logos/sliccy-error-mono-light-9scoops.svg +27 -0
- package/dist/ui/packages/webapp/index.html +1 -1
- package/package.json +4 -3
- package/dist/ui/assets/adobe-Bu7hjxDA.js +0 -2
- package/dist/ui/assets/cost-command-CeTme7kM.js +0 -1
- package/dist/ui/assets/github-DZFG2HD0.js +0 -2
- package/dist/ui/assets/main-DPxMZYuN.js +0 -1813
- package/dist/ui/assets/migration-splash-D-cAt2r9.js +0 -1
- package/dist/ui/assets/offscreen-client-DMZqCIeY.js +0 -1
- package/dist/ui/assets/onboarding-orchestrator-DopqNUuE.js +0 -1
- package/dist/ui/assets/openai-codex-Cpj7DxYW.js +0 -1
- package/dist/ui/assets/page-storage-sync-BMnuL0eG.js +0 -1
- package/dist/ui/assets/provider-BLVEv2h5.js +0 -2
- package/dist/ui/assets/provider-store-access-COJPysL3.js +0 -1
- package/dist/ui/assets/provider-store-access-_3VGtwXB.js +0 -1
- package/dist/ui/assets/spawn-CB4gNb6v.js +0 -1
- package/dist/ui/assets/xai-grok-CYcKkuaJ.js +0 -1
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>Sliccy Error Logo Preview</title>
|
|
7
|
+
<style>
|
|
8
|
+
* {
|
|
9
|
+
box-sizing: border-box;
|
|
10
|
+
margin: 0;
|
|
11
|
+
padding: 0;
|
|
12
|
+
}
|
|
13
|
+
body {
|
|
14
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
15
|
+
background: #f5f5f5;
|
|
16
|
+
color: #333;
|
|
17
|
+
min-height: 100vh;
|
|
18
|
+
padding: 20px;
|
|
19
|
+
}
|
|
20
|
+
h1 {
|
|
21
|
+
font-size: 1.4em;
|
|
22
|
+
margin-bottom: 20px;
|
|
23
|
+
}
|
|
24
|
+
.controls {
|
|
25
|
+
background: #fff;
|
|
26
|
+
border: 1px solid #ccc;
|
|
27
|
+
border-radius: 6px;
|
|
28
|
+
padding: 16px 20px;
|
|
29
|
+
margin-bottom: 24px;
|
|
30
|
+
max-width: 1000px;
|
|
31
|
+
}
|
|
32
|
+
.control-group {
|
|
33
|
+
margin-bottom: 12px;
|
|
34
|
+
}
|
|
35
|
+
.control-group:last-child {
|
|
36
|
+
margin-bottom: 0;
|
|
37
|
+
}
|
|
38
|
+
label {
|
|
39
|
+
display: block;
|
|
40
|
+
margin-bottom: 5px;
|
|
41
|
+
font-size: 0.9em;
|
|
42
|
+
}
|
|
43
|
+
input[type='range'] {
|
|
44
|
+
width: 100%;
|
|
45
|
+
max-width: 400px;
|
|
46
|
+
vertical-align: middle;
|
|
47
|
+
}
|
|
48
|
+
.value-display {
|
|
49
|
+
font-size: 0.85em;
|
|
50
|
+
color: #666;
|
|
51
|
+
margin-left: 8px;
|
|
52
|
+
}
|
|
53
|
+
.mode-section {
|
|
54
|
+
margin-bottom: 28px;
|
|
55
|
+
}
|
|
56
|
+
.mode-section h2 {
|
|
57
|
+
font-size: 1em;
|
|
58
|
+
margin-bottom: 10px;
|
|
59
|
+
padding-bottom: 4px;
|
|
60
|
+
border-bottom: 1px solid #ccc;
|
|
61
|
+
}
|
|
62
|
+
.tile-row {
|
|
63
|
+
display: flex;
|
|
64
|
+
gap: 10px;
|
|
65
|
+
flex-wrap: wrap;
|
|
66
|
+
}
|
|
67
|
+
.tile {
|
|
68
|
+
display: flex;
|
|
69
|
+
flex-direction: column;
|
|
70
|
+
align-items: center;
|
|
71
|
+
width: 140px;
|
|
72
|
+
}
|
|
73
|
+
.tile-label {
|
|
74
|
+
font-size: 0.75em;
|
|
75
|
+
margin-bottom: 4px;
|
|
76
|
+
opacity: 0.7;
|
|
77
|
+
}
|
|
78
|
+
.tile-canvas {
|
|
79
|
+
width: 140px;
|
|
80
|
+
height: 140px;
|
|
81
|
+
position: relative;
|
|
82
|
+
border: 1px dashed #ccc;
|
|
83
|
+
}
|
|
84
|
+
.mode-section.mono-dark .tile-canvas {
|
|
85
|
+
background: #1a1a1a;
|
|
86
|
+
border-color: #444;
|
|
87
|
+
}
|
|
88
|
+
.mode-section.mono-dark h2 {
|
|
89
|
+
color: #555;
|
|
90
|
+
}
|
|
91
|
+
.tile-canvas svg {
|
|
92
|
+
width: 100%;
|
|
93
|
+
height: 100%;
|
|
94
|
+
}
|
|
95
|
+
</style>
|
|
96
|
+
</head>
|
|
97
|
+
<body>
|
|
98
|
+
<h1>🍦 Sliccy Error Logo Preview (crossed-out eyes)</h1>
|
|
99
|
+
|
|
100
|
+
<div class="controls">
|
|
101
|
+
<div class="control-group">
|
|
102
|
+
<label
|
|
103
|
+
>Cross length (× eye radius):
|
|
104
|
+
<span class="value-display" id="cross-length-val">0.50</span></label
|
|
105
|
+
>
|
|
106
|
+
<input type="range" id="cross-length" min="0.5" max="2" step="0.05" value="0.5" />
|
|
107
|
+
</div>
|
|
108
|
+
<div class="control-group">
|
|
109
|
+
<label
|
|
110
|
+
>Cross thickness (SVG units):
|
|
111
|
+
<span class="value-display" id="cross-thickness-val">15</span></label
|
|
112
|
+
>
|
|
113
|
+
<input type="range" id="cross-thickness" min="4" max="40" step="1" value="15" />
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
|
|
117
|
+
<div class="mode-section" data-mode="color">
|
|
118
|
+
<h2>Color</h2>
|
|
119
|
+
<div class="tile-row" id="row-color"></div>
|
|
120
|
+
</div>
|
|
121
|
+
<div class="mode-section" data-mode="mono-light">
|
|
122
|
+
<h2>Mono Light</h2>
|
|
123
|
+
<div class="tile-row" id="row-mono-light"></div>
|
|
124
|
+
</div>
|
|
125
|
+
<div class="mode-section mono-dark" data-mode="mono-dark">
|
|
126
|
+
<h2>Mono Dark</h2>
|
|
127
|
+
<div class="tile-row" id="row-mono-dark"></div>
|
|
128
|
+
</div>
|
|
129
|
+
|
|
130
|
+
<script>
|
|
131
|
+
// Eye geometry (from Sliccy Logo.svg, reused from logo-editor.html).
|
|
132
|
+
const RIGHT_EYE_C = { x: 383.4, y: 216.12 };
|
|
133
|
+
const LEFT_EYE_C = { x: 175.1, y: 250.34 };
|
|
134
|
+
const EYE_RADIUS = 64.78;
|
|
135
|
+
|
|
136
|
+
// Palettes mirror logo-editor.html so the colors match across previews.
|
|
137
|
+
const coneColors = {
|
|
138
|
+
base: '#D2691E',
|
|
139
|
+
crosshatch: '#E8A75C',
|
|
140
|
+
outline: '#8B4513',
|
|
141
|
+
};
|
|
142
|
+
const scoopColors = [
|
|
143
|
+
{ base: '#FFB6C1', dark: '#E89AAB' },
|
|
144
|
+
{ base: '#98FB98', dark: '#7FD87F' },
|
|
145
|
+
{ base: '#87CEEB', dark: '#6BB6D8' },
|
|
146
|
+
{ base: '#DDA0DD', dark: '#C77DC7' },
|
|
147
|
+
{ base: '#F0E68C', dark: '#D4C970' },
|
|
148
|
+
{ base: '#FFD700', dark: '#E6C200' },
|
|
149
|
+
{ base: '#FFA07A', dark: '#E88A64' },
|
|
150
|
+
{ base: '#DEB887', dark: '#C8A277' },
|
|
151
|
+
{ base: '#F08080', dark: '#D86A6A' },
|
|
152
|
+
{ base: '#E0BBE4', dark: '#C9A5CD' },
|
|
153
|
+
];
|
|
154
|
+
|
|
155
|
+
// Fixed defaults from logo-editor.html so layout matches its previews.
|
|
156
|
+
const LAYOUT = {
|
|
157
|
+
offset: 95,
|
|
158
|
+
scaleDecay: 0.95,
|
|
159
|
+
wobble: 14,
|
|
160
|
+
angularWobble: 8,
|
|
161
|
+
conePush: -21,
|
|
162
|
+
midrangeScale: 1.0,
|
|
163
|
+
midrangeY: 0,
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
const MODES = ['color', 'mono-light', 'mono-dark'];
|
|
167
|
+
const SCOOP_COUNTS = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
|
|
168
|
+
|
|
169
|
+
let scoopTemplate = null;
|
|
170
|
+
let coneTemplate = null;
|
|
171
|
+
|
|
172
|
+
// Canonical wobble seeds derived from sliccy-color-10scoops.svg so the
|
|
173
|
+
// error variants line up scoop-for-scoop with the existing logos.
|
|
174
|
+
// Each entry is { x: (tx-288)/14, angle: rot/8 } from that file's
|
|
175
|
+
// scoop transforms; index 0 is the base scoop with no wobble.
|
|
176
|
+
const wobbleSeeds = [
|
|
177
|
+
{ x: 0, angle: 0 },
|
|
178
|
+
{ x: -0.310039355037763, angle: 0.1913388171901651 },
|
|
179
|
+
{ x: -0.8384358170484104, angle: 0.9362698756918275 },
|
|
180
|
+
{ x: 0.47107200968630586, angle: 0.4856391041079866 },
|
|
181
|
+
{ x: -0.41444869051984157, angle: -0.7088205120681517 },
|
|
182
|
+
{ x: 0.33928351181225885, angle: -0.08562223417652248 },
|
|
183
|
+
{ x: 0.10576171047799628, angle: 0.9003392078419594 },
|
|
184
|
+
{ x: 0.5975725564377277, angle: 0.7722797611907217 },
|
|
185
|
+
{ x: 0.5300881075925759, angle: 0.12269125761071353 },
|
|
186
|
+
{ x: 0.9181585249482599, angle: -0.21553873797191025 },
|
|
187
|
+
];
|
|
188
|
+
|
|
189
|
+
async function loadSVG() {
|
|
190
|
+
const response = await fetch('Sliccy Logo.svg');
|
|
191
|
+
const text = await response.text();
|
|
192
|
+
const svgDoc = new DOMParser().parseFromString(text, 'image/svg+xml');
|
|
193
|
+
scoopTemplate = {
|
|
194
|
+
outline: svgDoc.getElementById('Scoop_Outline').cloneNode(true),
|
|
195
|
+
rightEye: svgDoc.getElementById('Right_Eye').cloneNode(true),
|
|
196
|
+
leftEye: svgDoc.getElementById('Left_Eye').cloneNode(true),
|
|
197
|
+
};
|
|
198
|
+
coneTemplate = svgDoc.getElementById('Cone').cloneNode(true);
|
|
199
|
+
|
|
200
|
+
buildTiles();
|
|
201
|
+
render();
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function buildTiles() {
|
|
205
|
+
MODES.forEach((mode) => {
|
|
206
|
+
const row = document.getElementById(`row-${mode}`);
|
|
207
|
+
row.innerHTML = '';
|
|
208
|
+
SCOOP_COUNTS.forEach((count) => {
|
|
209
|
+
const tile = document.createElement('div');
|
|
210
|
+
tile.className = 'tile';
|
|
211
|
+
tile.innerHTML = `
|
|
212
|
+
<div class="tile-label">${count} scoop${count === 1 ? '' : 's'}</div>
|
|
213
|
+
<div class="tile-canvas" id="canvas-${mode}-${count}"></div>
|
|
214
|
+
`;
|
|
215
|
+
row.appendChild(tile);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function applyConeColors(cone, colorMode) {
|
|
221
|
+
if (colorMode === 'mono-light') {
|
|
222
|
+
cone.querySelectorAll('[style*="fill"]').forEach((e) => {
|
|
223
|
+
e.style.fill = e.id === 'Cone_Bottom' || e.id === 'Cone_Top' ? '#fff' : '#000';
|
|
224
|
+
});
|
|
225
|
+
cone
|
|
226
|
+
.querySelectorAll('path:not([style*="fill"]), rect:not([style*="fill"])')
|
|
227
|
+
.forEach((e) => {
|
|
228
|
+
e.style.fill = '#000';
|
|
229
|
+
});
|
|
230
|
+
cone.querySelectorAll('[style*="stroke"]').forEach((e) => {
|
|
231
|
+
e.style.stroke = '#000';
|
|
232
|
+
});
|
|
233
|
+
} else if (colorMode === 'mono-dark') {
|
|
234
|
+
cone.querySelectorAll('[style*="fill"]').forEach((e) => {
|
|
235
|
+
e.style.fill = e.id === 'Cone_Bottom' || e.id === 'Cone_Top' ? '#222' : '#fff';
|
|
236
|
+
});
|
|
237
|
+
cone
|
|
238
|
+
.querySelectorAll('path:not([style*="fill"]), rect:not([style*="fill"])')
|
|
239
|
+
.forEach((e) => {
|
|
240
|
+
e.style.fill = '#fff';
|
|
241
|
+
});
|
|
242
|
+
cone.querySelectorAll('[style*="stroke"]').forEach((e) => {
|
|
243
|
+
e.style.stroke = '#fff';
|
|
244
|
+
});
|
|
245
|
+
} else {
|
|
246
|
+
cone.querySelectorAll('[style*="fill"]').forEach((e) => {
|
|
247
|
+
e.style.fill =
|
|
248
|
+
e.id === 'Cone_Bottom' || e.id === 'Cone_Top'
|
|
249
|
+
? coneColors.base
|
|
250
|
+
: coneColors.crosshatch;
|
|
251
|
+
});
|
|
252
|
+
cone
|
|
253
|
+
.querySelectorAll('path:not([style*="fill"]), rect:not([style*="fill"])')
|
|
254
|
+
.forEach((e) => {
|
|
255
|
+
e.style.fill = coneColors.crosshatch;
|
|
256
|
+
});
|
|
257
|
+
cone.querySelectorAll('[style*="stroke"]').forEach((e) => {
|
|
258
|
+
e.style.stroke = coneColors.outline;
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function applyEyeColors(rightEye, leftEye, colorMode) {
|
|
264
|
+
[rightEye, leftEye].forEach((eye) => {
|
|
265
|
+
const outline = eye.querySelector('circle');
|
|
266
|
+
const pupil = eye.querySelector('path');
|
|
267
|
+
if (colorMode === 'mono-dark') {
|
|
268
|
+
if (outline) {
|
|
269
|
+
outline.style.fill = '#000';
|
|
270
|
+
outline.style.stroke = '#fff';
|
|
271
|
+
}
|
|
272
|
+
if (pupil) pupil.style.fill = '#fff';
|
|
273
|
+
} else {
|
|
274
|
+
// mono-light and color share the same eye palette in logo-editor
|
|
275
|
+
if (outline) {
|
|
276
|
+
outline.style.fill = '#fff';
|
|
277
|
+
outline.style.stroke = '#000';
|
|
278
|
+
}
|
|
279
|
+
if (pupil) pupil.style.fill = '#000';
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
function makeCross(center, arm, thickness, color) {
|
|
285
|
+
const group = document.createElementNS('http://www.w3.org/2000/svg', 'g');
|
|
286
|
+
const mkLine = (x1, y1, x2, y2) => {
|
|
287
|
+
const line = document.createElementNS('http://www.w3.org/2000/svg', 'line');
|
|
288
|
+
line.setAttribute('x1', x1);
|
|
289
|
+
line.setAttribute('y1', y1);
|
|
290
|
+
line.setAttribute('x2', x2);
|
|
291
|
+
line.setAttribute('y2', y2);
|
|
292
|
+
line.setAttribute('stroke', color);
|
|
293
|
+
line.setAttribute('stroke-width', thickness);
|
|
294
|
+
line.setAttribute('stroke-linecap', 'round');
|
|
295
|
+
return line;
|
|
296
|
+
};
|
|
297
|
+
// Diagonal from top-left to bottom-right
|
|
298
|
+
group.appendChild(
|
|
299
|
+
mkLine(center.x - arm, center.y - arm, center.x + arm, center.y + arm)
|
|
300
|
+
);
|
|
301
|
+
// Diagonal from bottom-left to top-right
|
|
302
|
+
group.appendChild(
|
|
303
|
+
mkLine(center.x - arm, center.y + arm, center.x + arm, center.y - arm)
|
|
304
|
+
);
|
|
305
|
+
return group;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function darkenColor(hex, percent = 20) {
|
|
309
|
+
const r = parseInt(hex.slice(1, 3), 16);
|
|
310
|
+
const g = parseInt(hex.slice(3, 5), 16);
|
|
311
|
+
const b = parseInt(hex.slice(5, 7), 16);
|
|
312
|
+
const f = (v) => Math.max(0, Math.floor(v * (1 - percent / 100)));
|
|
313
|
+
return `#${[f(r), f(g), f(b)].map((v) => v.toString(16).padStart(2, '0')).join('')}`;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
function applyScoopColors(outline, scoopIndex, colorMode, svgRoot, idPrefix) {
|
|
317
|
+
if (colorMode === 'mono-light') {
|
|
318
|
+
outline.style.fill = '#fff';
|
|
319
|
+
outline.style.stroke = '#000';
|
|
320
|
+
} else if (colorMode === 'mono-dark') {
|
|
321
|
+
outline.style.fill = '#222';
|
|
322
|
+
outline.style.stroke = '#fff';
|
|
323
|
+
} else {
|
|
324
|
+
const colorData = scoopColors[scoopIndex % scoopColors.length];
|
|
325
|
+
const baseColor = colorData.base;
|
|
326
|
+
const darkColor = colorData.dark;
|
|
327
|
+
const outlineColor = darkenColor(darkColor, 20);
|
|
328
|
+
|
|
329
|
+
// IDs must be unique across the page (33 SVGs in the same DOM),
|
|
330
|
+
// so namespace the gradient by mode + count + scoop index.
|
|
331
|
+
const gradientId = `scoop-gradient-${idPrefix}-${scoopIndex}`;
|
|
332
|
+
|
|
333
|
+
let defs = svgRoot.querySelector('defs');
|
|
334
|
+
if (!defs) {
|
|
335
|
+
defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');
|
|
336
|
+
svgRoot.insertBefore(defs, svgRoot.firstChild);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
const gradient = document.createElementNS(
|
|
340
|
+
'http://www.w3.org/2000/svg',
|
|
341
|
+
'linearGradient'
|
|
342
|
+
);
|
|
343
|
+
gradient.setAttribute('id', gradientId);
|
|
344
|
+
gradient.setAttribute('x1', '0%');
|
|
345
|
+
gradient.setAttribute('y1', '0%');
|
|
346
|
+
gradient.setAttribute('x2', '100%');
|
|
347
|
+
gradient.setAttribute('y2', '100%');
|
|
348
|
+
|
|
349
|
+
const stop1 = document.createElementNS('http://www.w3.org/2000/svg', 'stop');
|
|
350
|
+
stop1.setAttribute('offset', '0%');
|
|
351
|
+
stop1.setAttribute('style', `stop-color:${baseColor};stop-opacity:1`);
|
|
352
|
+
const stop2 = document.createElementNS('http://www.w3.org/2000/svg', 'stop');
|
|
353
|
+
stop2.setAttribute('offset', '100%');
|
|
354
|
+
stop2.setAttribute('style', `stop-color:${darkColor};stop-opacity:1`);
|
|
355
|
+
gradient.appendChild(stop1);
|
|
356
|
+
gradient.appendChild(stop2);
|
|
357
|
+
defs.appendChild(gradient);
|
|
358
|
+
|
|
359
|
+
outline.style.fill = `url(#${gradientId})`;
|
|
360
|
+
outline.style.stroke = outlineColor;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// Strip the pupil <path> from each eye and append two crossing <line>s
|
|
365
|
+
// so the error treatment scales with whatever parent group the eyes
|
|
366
|
+
// live in (cone group for count=0, top scoop group otherwise).
|
|
367
|
+
function applyErrorEyes(rightEye, leftEye, parent, armLength, thickness, crossColor) {
|
|
368
|
+
[rightEye, leftEye].forEach((eye) => {
|
|
369
|
+
eye.querySelectorAll('path').forEach((p) => p.remove());
|
|
370
|
+
});
|
|
371
|
+
parent.appendChild(makeCross(RIGHT_EYE_C, armLength, thickness, crossColor));
|
|
372
|
+
parent.appendChild(makeCross(LEFT_EYE_C, armLength, thickness, crossColor));
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// Ported from logo-editor.html renderLogo(), using the constant LAYOUT
|
|
376
|
+
// defaults and skipping the eye-transform / animation knobs (all 1.0 / 0).
|
|
377
|
+
function renderLogo(container, count, colorMode, idPrefix, armLength, thickness) {
|
|
378
|
+
const { offset, scaleDecay, wobble, angularWobble, conePush, midrangeScale, midrangeY } =
|
|
379
|
+
LAYOUT;
|
|
380
|
+
const crossColor = colorMode === 'mono-dark' ? '#fff' : '#000';
|
|
381
|
+
|
|
382
|
+
const t = count / 10;
|
|
383
|
+
let baseY = -175 + t * (512 - -175);
|
|
384
|
+
let overallScale = 1.25 + t * (1.1 - 1.25);
|
|
385
|
+
|
|
386
|
+
if (count >= 1 && count <= 9) {
|
|
387
|
+
let scaleFactor;
|
|
388
|
+
if (count <= 2) {
|
|
389
|
+
scaleFactor = 0.9;
|
|
390
|
+
} else if (count <= 5) {
|
|
391
|
+
scaleFactor = 0.9 + ((count - 2) * (0.95 - 0.9)) / (5 - 2);
|
|
392
|
+
} else {
|
|
393
|
+
scaleFactor = 0.95 + (Math.min(count - 5, 2) * (1.0 - 0.95)) / (7 - 5);
|
|
394
|
+
}
|
|
395
|
+
let yOffset;
|
|
396
|
+
if (count === 1) yOffset = 100;
|
|
397
|
+
else if (count <= 5) yOffset = 120;
|
|
398
|
+
else if (count === 6) yOffset = 115;
|
|
399
|
+
else if (count === 7) yOffset = 110;
|
|
400
|
+
else if (count === 8) yOffset = 80;
|
|
401
|
+
else yOffset = 50;
|
|
402
|
+
overallScale *= scaleFactor * midrangeScale;
|
|
403
|
+
baseY += yOffset + midrangeY;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
const viewBoxWidth = 1024;
|
|
407
|
+
const viewBoxHeight = 1024;
|
|
408
|
+
const contentWidth = 576.75;
|
|
409
|
+
const xOffset = (viewBoxWidth - contentWidth) / 2;
|
|
410
|
+
|
|
411
|
+
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
|
|
412
|
+
svg.setAttribute('viewBox', `0 0 ${viewBoxWidth} ${viewBoxHeight}`);
|
|
413
|
+
svg.setAttribute('width', '100%');
|
|
414
|
+
svg.setAttribute('height', '100%');
|
|
415
|
+
|
|
416
|
+
const mainGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');
|
|
417
|
+
const conePushTotal = (count - 1) * conePush;
|
|
418
|
+
const totalHeight = 887.3 + (count - 1) * offset + conePushTotal;
|
|
419
|
+
const sf = Math.min(1, 900 / totalHeight) * overallScale;
|
|
420
|
+
const translateY = (viewBoxHeight - totalHeight * sf) / 2 + baseY;
|
|
421
|
+
const translateX = xOffset + (contentWidth - contentWidth * sf) / 2;
|
|
422
|
+
mainGroup.setAttribute('transform', `translate(${translateX}, ${translateY}) scale(${sf})`);
|
|
423
|
+
|
|
424
|
+
const coneGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');
|
|
425
|
+
coneGroup.setAttribute('transform', `translate(0, ${conePushTotal})`);
|
|
426
|
+
const cone = coneTemplate.cloneNode(true);
|
|
427
|
+
applyConeColors(cone, colorMode);
|
|
428
|
+
coneGroup.appendChild(cone);
|
|
429
|
+
|
|
430
|
+
// 0 scoops: eyes sit on the cone itself — that's the "error" target here.
|
|
431
|
+
if (count === 0) {
|
|
432
|
+
const rightEye = scoopTemplate.rightEye.cloneNode(true);
|
|
433
|
+
const leftEye = scoopTemplate.leftEye.cloneNode(true);
|
|
434
|
+
applyEyeColors(rightEye, leftEye, colorMode);
|
|
435
|
+
coneGroup.appendChild(rightEye);
|
|
436
|
+
coneGroup.appendChild(leftEye);
|
|
437
|
+
applyErrorEyes(rightEye, leftEye, coneGroup, armLength, thickness, crossColor);
|
|
438
|
+
}
|
|
439
|
+
mainGroup.appendChild(coneGroup);
|
|
440
|
+
|
|
441
|
+
for (let i = 0; i < count; i++) {
|
|
442
|
+
const scoopGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');
|
|
443
|
+
const scoopsAbove = count - 1 - i;
|
|
444
|
+
const pushDown = scoopsAbove * conePush;
|
|
445
|
+
const scoopY = -i * offset + pushDown;
|
|
446
|
+
const scoopX = i > 0 ? wobbleSeeds[i].x * wobble : 0;
|
|
447
|
+
const scoopAngle = i > 0 ? wobbleSeeds[i].angle * angularWobble : 0;
|
|
448
|
+
const scoopScale = Math.pow(scaleDecay, i);
|
|
449
|
+
const centerX = 288;
|
|
450
|
+
const centerY = 250;
|
|
451
|
+
scoopGroup.setAttribute(
|
|
452
|
+
'transform',
|
|
453
|
+
`translate(${centerX + scoopX}, ${centerY + scoopY}) rotate(${scoopAngle}) scale(${scoopScale}) translate(${-centerX}, ${-centerY})`
|
|
454
|
+
);
|
|
455
|
+
|
|
456
|
+
const outline = scoopTemplate.outline.cloneNode(true);
|
|
457
|
+
applyScoopColors(outline, i, colorMode, svg, idPrefix);
|
|
458
|
+
scoopGroup.appendChild(outline);
|
|
459
|
+
|
|
460
|
+
// Eyes (and the X) only on the top scoop.
|
|
461
|
+
if (i === count - 1) {
|
|
462
|
+
const rightEye = scoopTemplate.rightEye.cloneNode(true);
|
|
463
|
+
const leftEye = scoopTemplate.leftEye.cloneNode(true);
|
|
464
|
+
applyEyeColors(rightEye, leftEye, colorMode);
|
|
465
|
+
scoopGroup.appendChild(rightEye);
|
|
466
|
+
scoopGroup.appendChild(leftEye);
|
|
467
|
+
applyErrorEyes(rightEye, leftEye, scoopGroup, armLength, thickness, crossColor);
|
|
468
|
+
}
|
|
469
|
+
mainGroup.appendChild(scoopGroup);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
svg.appendChild(mainGroup);
|
|
473
|
+
container.innerHTML = '';
|
|
474
|
+
container.appendChild(svg);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
function render() {
|
|
478
|
+
if (!coneTemplate) return;
|
|
479
|
+
const lengthMult = parseFloat(document.getElementById('cross-length').value);
|
|
480
|
+
const thickness = parseInt(document.getElementById('cross-thickness').value);
|
|
481
|
+
const armLength = EYE_RADIUS * lengthMult;
|
|
482
|
+
MODES.forEach((mode) => {
|
|
483
|
+
SCOOP_COUNTS.forEach((count) => {
|
|
484
|
+
const container = document.getElementById(`canvas-${mode}-${count}`);
|
|
485
|
+
renderLogo(container, count, mode, `${mode}-${count}`, armLength, thickness);
|
|
486
|
+
});
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
document.getElementById('cross-length').addEventListener('input', (e) => {
|
|
491
|
+
document.getElementById('cross-length-val').textContent =
|
|
492
|
+
parseFloat(e.target.value).toFixed(2);
|
|
493
|
+
render();
|
|
494
|
+
});
|
|
495
|
+
document.getElementById('cross-thickness').addEventListener('input', (e) => {
|
|
496
|
+
document.getElementById('cross-thickness-val').textContent = e.target.value;
|
|
497
|
+
render();
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
loadSVG();
|
|
501
|
+
</script>
|
|
502
|
+
</body>
|
|
503
|
+
</html>
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Render error-logo-preview.html once via headless Chrome, extract each
|
|
3
|
+
// tile's <svg> outerHTML, and write the 33 sliccy-error-*-*scoops.svg files.
|
|
4
|
+
// Run with a static server already serving this folder at PORT (default 8765).
|
|
5
|
+
// Override the Chrome binary with the CHROME_PATH env var if needed.
|
|
6
|
+
|
|
7
|
+
import { execFileSync } from 'node:child_process';
|
|
8
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { dirname, join } from 'node:path';
|
|
10
|
+
import { fileURLToPath } from 'node:url';
|
|
11
|
+
|
|
12
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
13
|
+
const CHROME =
|
|
14
|
+
process.env.CHROME_PATH || '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome';
|
|
15
|
+
const PORT = process.env.PORT || '8765';
|
|
16
|
+
const URL = `http://127.0.0.1:${PORT}/error-logo-preview.html`;
|
|
17
|
+
|
|
18
|
+
const MODES = ['color', 'mono-light', 'mono-dark'];
|
|
19
|
+
const COUNTS = Array.from({ length: 11 }, (_, i) => i);
|
|
20
|
+
|
|
21
|
+
const dom = execFileSync(
|
|
22
|
+
CHROME,
|
|
23
|
+
[
|
|
24
|
+
'--headless=new',
|
|
25
|
+
'--disable-gpu',
|
|
26
|
+
'--no-sandbox',
|
|
27
|
+
'--hide-scrollbars',
|
|
28
|
+
'--virtual-time-budget=8000',
|
|
29
|
+
'--dump-dom',
|
|
30
|
+
URL,
|
|
31
|
+
],
|
|
32
|
+
{ encoding: 'utf8', maxBuffer: 64 * 1024 * 1024, timeout: 30000 }
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
mkdirSync(HERE, { recursive: true });
|
|
36
|
+
|
|
37
|
+
let written = 0;
|
|
38
|
+
for (const mode of MODES) {
|
|
39
|
+
for (const count of COUNTS) {
|
|
40
|
+
const id = `canvas-${mode}-${count}`;
|
|
41
|
+
// The tile <div id="canvas-mode-count"> wraps the rendered <svg>.
|
|
42
|
+
const openIdx = dom.indexOf(`id="${id}"`);
|
|
43
|
+
if (openIdx === -1) throw new Error(`tile not found: ${id}`);
|
|
44
|
+
const svgStart = dom.indexOf('<svg', openIdx);
|
|
45
|
+
if (svgStart === -1) throw new Error(`<svg> not found inside ${id}`);
|
|
46
|
+
const svgEnd = dom.indexOf('</svg>', svgStart);
|
|
47
|
+
if (svgEnd === -1) throw new Error(`</svg> not found inside ${id}`);
|
|
48
|
+
let svg = dom.slice(svgStart, svgEnd + '</svg>'.length);
|
|
49
|
+
// The preview builds the SVG with createElementNS, but the dumped DOM
|
|
50
|
+
// serialization drops xmlns on the root element. Inject it so the file
|
|
51
|
+
// renders standalone (file:// in browsers, image viewers, etc.).
|
|
52
|
+
if (!/^<svg[^>]*\sxmlns=/.test(svg)) {
|
|
53
|
+
svg = svg.replace('<svg', '<svg xmlns="http://www.w3.org/2000/svg"');
|
|
54
|
+
}
|
|
55
|
+
const out = `<?xml version="1.0" encoding="UTF-8"?>\n${svg}\n`;
|
|
56
|
+
const file = join(HERE, `sliccy-error-${mode}-${count}scoops.svg`);
|
|
57
|
+
writeFileSync(file, out);
|
|
58
|
+
written++;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
console.log(`Wrote ${written} files to ${HERE}`);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"><g transform="translate(151.53125, -171.3125) scale(1.25)"><g transform="translate(0, 21)"><g id="Cone">
|
|
3
|
+
<path id="Cone_Bottom" data-name="Cone Bottom" d="M108.22,414.88l189.84,460.03c1.36,3.3,6.09,3.16,7.25-.22l159.34-463.34c.87-2.53-1.03-5.16-3.7-5.13l-349.18,3.32c-2.74.03-4.59,2.82-3.55,5.35Z" style="fill: rgb(210, 105, 30); stroke: rgb(139, 69, 19); stroke-linejoin: round; stroke-width: 20px;"></path>
|
|
4
|
+
<g id="Waffle_Cross-Hatch" data-name="Waffle Cross-Hatch">
|
|
5
|
+
<path d="M261.93,482.48h0c15.03-15.03,4.46-40.72-16.79-40.83h0c-21.37-.11-32.14,25.72-17.03,40.83h0c9.34,9.34,24.48,9.34,33.82,0Z" style="fill: rgb(232, 167, 92);"></path>
|
|
6
|
+
<path d="M384.85,527.49l-51.82,51.82c-2.24,2.24-2.24,5.86,0,8.1l55.71,55.71c2.24,2.24,5.86,2.24,8.1,0h0c.62-.62,1.08-1.36,1.37-2.19l26.52-77.11c.71-2.07.18-4.36-1.37-5.91l-30.41-30.41c-2.24-2.24-5.86-2.24-8.1,0Z" style="fill: rgb(232, 167, 92);"></path>
|
|
7
|
+
<rect x="274.59" y="463.59" width="84.73" height="95.66" rx="42.36" ry="42.36" transform="translate(-268.79 373.91) rotate(-45)" style="fill: rgb(232, 167, 92);"></rect>
|
|
8
|
+
<rect x="291.06" y="603.84" width="72.24" height="90.24" rx="36.12" ry="36.12" transform="translate(-363.06 421.43) rotate(-45)" style="fill: rgb(232, 167, 92);"></rect>
|
|
9
|
+
<path d="M371.7,684.58l-25.94,25.94c-2.24,2.24-2.24,5.86,0,8.1l12.67,12.67c2.99,2.99,8.09,1.82,9.46-2.19l13.28-38.61c1.97-5.74-5.17-10.2-9.46-5.91Z" style="fill: rgb(232, 167, 92);"></path>
|
|
10
|
+
<path d="M159.42,564.14l2.73,6.83c1.52,3.82,6.46,4.83,9.37,1.93l2.05-2.05c2.24-2.24,2.24-5.86,0-8.1l-4.78-4.78c-4.4-4.4-11.67.39-9.37,6.17Z" style="fill: rgb(232, 167, 92);"></path>
|
|
11
|
+
<path d="M243.92,633.11l-48.65-48.65c-5.24-5.24-13.74-5.24-18.99,0h0c-3.8,3.8-4.97,9.49-2.98,14.47l27.77,69.54c3.58,8.95,15.14,11.33,21.96,4.51l20.89-20.89c5.24-5.24,5.24-13.74,0-18.99Z" style="fill: rgb(232, 167, 92);"></path>
|
|
12
|
+
<path d="M211.32,533.1h0c14.11-14.11,14.11-36.98,0-51.08l-34.94-34.94c-.72-.72-.72-1.89,0-2.62h0c1.16-1.16.34-3.15-1.3-3.16l-11.23-.06c-25.62-.13-43.23,25.72-33.73,49.51l5.37,13.45c1.82,4.55,4.54,8.68,8,12.15l16.74,16.74c14.11,14.11,36.98,14.11,51.08,0Z" style="fill: rgb(232, 167, 92);"></path>
|
|
13
|
+
<path d="M263.74,792.53h0c-5.69,5.69-7.45,14.23-4.46,21.71l22.5,56.36c6.92,17.34,31.68,16.74,37.75-.92l8.66-25.2c2.5-7.28.64-15.35-4.8-20.79l-31.17-31.17c-7.87-7.87-20.62-7.87-28.48,0Z" style="fill: rgb(232, 167, 92);"></path>
|
|
14
|
+
<path d="M392.94,503.07l40.81-40.81c2.24-2.24,5.86-2.24,8.1,0l.06.06c2.24,2.24,2.24,5.86,0,8.1l-40.81,40.81c-2.24,2.24-2.24,5.86,0,8.1l22.48,22.48c2.99,2.99,8.09,1.82,9.46-2.19l30.71-89.32c1.27-3.71-1.47-7.57-5.39-7.59l-120.63-.6c-5.11-.03-7.69,6.16-4.08,9.77l51.18,51.18c2.24,2.24,5.86,2.24,8.1,0Z" style="fill: rgb(232, 167, 92);"></path>
|
|
15
|
+
<rect x="217.18" y="527.25" width="72.24" height="95.66" rx="36.12" ry="36.12" transform="translate(-332.45 347.55) rotate(-45)" style="fill: rgb(232, 167, 92);"></rect>
|
|
16
|
+
<path d="M350.28,739.46h0c-9.24-9.24-24.22-9.24-33.46,0l-13.94,13.94c-9.24,9.24-9.24,24.22,0,33.46l6.81,6.81c12.37,12.37,33.42,7.5,39.1-9.04l7.13-20.75c2.94-8.55.75-18.03-5.64-24.42Z" style="fill: rgb(232, 167, 92);"></path>
|
|
17
|
+
<path d="M234.18,749.12l13.2,33.06c1.52,3.82,6.46,4.83,9.37,1.93l9.93-9.93c2.24-2.24,2.24-5.86,0-8.1l-23.13-23.13c-4.4-4.4-11.67.39-9.37,6.17Z" style="fill: rgb(232, 167, 92);"></path>
|
|
18
|
+
<rect x="236.26" y="661.25" width="67.04" height="90.24" rx="33.52" ry="33.52" transform="translate(-420.46 397.65) rotate(-45)" style="fill: rgb(232, 167, 92);"></rect>
|
|
19
|
+
</g>
|
|
20
|
+
<ellipse id="Cone_Top" data-name="Cone Top" cx="288.37" cy="404.38" rx="182.34" ry="67.01" style="fill: rgb(210, 105, 30); stroke: rgb(139, 69, 19); stroke-miterlimit: 10; stroke-width: 20px;"></ellipse>
|
|
21
|
+
</g><g id="Right_Eye" data-name="Right Eye">
|
|
22
|
+
<circle id="Left_Eye_Outline" data-name="Left Eye Outline" cx="383.4" cy="216.12" r="64.78" style="fill: #fff; stroke: #000; stroke-miterlimit: 10; stroke-width: 6px;"></circle>
|
|
23
|
+
|
|
24
|
+
</g><g id="Left_Eye" data-name="Left Eye">
|
|
25
|
+
<circle id="Right_Eye_Outline" data-name="Right Eye Outline" cx="175.1" cy="250.34" r="64.78" style="fill: #fff; stroke: #000; stroke-miterlimit: 10; stroke-width: 6px;"></circle>
|
|
26
|
+
|
|
27
|
+
</g><g><line x1="351.01" y1="183.73000000000002" x2="415.78999999999996" y2="248.51" stroke="#000" stroke-width="15" stroke-linecap="round"></line><line x1="351.01" y1="248.51" x2="415.78999999999996" y2="183.73000000000002" stroke="#000" stroke-width="15" stroke-linecap="round"></line></g><g><line x1="142.70999999999998" y1="217.95" x2="207.49" y2="282.73" stroke="#000" stroke-width="15" stroke-linecap="round"></line><line x1="142.70999999999998" y1="282.73" x2="207.49" y2="217.95" stroke="#000" stroke-width="15" stroke-linecap="round"></line></g></g></g></svg>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"><defs><linearGradient id="scoop-gradient-color-10-0" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#FFB6C1;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#E89AAB;stop-opacity:1"></stop></linearGradient><linearGradient id="scoop-gradient-color-10-1" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#98FB98;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#7FD87F;stop-opacity:1"></stop></linearGradient><linearGradient id="scoop-gradient-color-10-2" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#87CEEB;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#6BB6D8;stop-opacity:1"></stop></linearGradient><linearGradient id="scoop-gradient-color-10-3" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#DDA0DD;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#C77DC7;stop-opacity:1"></stop></linearGradient><linearGradient id="scoop-gradient-color-10-4" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#F0E68C;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#D4C970;stop-opacity:1"></stop></linearGradient><linearGradient id="scoop-gradient-color-10-5" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#FFD700;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#E6C200;stop-opacity:1"></stop></linearGradient><linearGradient id="scoop-gradient-color-10-6" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#FFA07A;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#E88A64;stop-opacity:1"></stop></linearGradient><linearGradient id="scoop-gradient-color-10-7" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#DEB887;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#C8A277;stop-opacity:1"></stop></linearGradient><linearGradient id="scoop-gradient-color-10-8" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#F08080;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#D86A6A;stop-opacity:1"></stop></linearGradient><linearGradient id="scoop-gradient-color-10-9" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#E0BBE4;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#C9A5CD;stop-opacity:1"></stop></linearGradient></defs><g transform="translate(328.2034056524818, 529) scale(0.6373527328912638)"><g transform="translate(0, -189)"><g id="Cone">
|
|
3
|
+
<path id="Cone_Bottom" data-name="Cone Bottom" d="M108.22,414.88l189.84,460.03c1.36,3.3,6.09,3.16,7.25-.22l159.34-463.34c.87-2.53-1.03-5.16-3.7-5.13l-349.18,3.32c-2.74.03-4.59,2.82-3.55,5.35Z" style="fill: rgb(210, 105, 30); stroke: rgb(139, 69, 19); stroke-linejoin: round; stroke-width: 20px;"></path>
|
|
4
|
+
<g id="Waffle_Cross-Hatch" data-name="Waffle Cross-Hatch">
|
|
5
|
+
<path d="M261.93,482.48h0c15.03-15.03,4.46-40.72-16.79-40.83h0c-21.37-.11-32.14,25.72-17.03,40.83h0c9.34,9.34,24.48,9.34,33.82,0Z" style="fill: rgb(232, 167, 92);"></path>
|
|
6
|
+
<path d="M384.85,527.49l-51.82,51.82c-2.24,2.24-2.24,5.86,0,8.1l55.71,55.71c2.24,2.24,5.86,2.24,8.1,0h0c.62-.62,1.08-1.36,1.37-2.19l26.52-77.11c.71-2.07.18-4.36-1.37-5.91l-30.41-30.41c-2.24-2.24-5.86-2.24-8.1,0Z" style="fill: rgb(232, 167, 92);"></path>
|
|
7
|
+
<rect x="274.59" y="463.59" width="84.73" height="95.66" rx="42.36" ry="42.36" transform="translate(-268.79 373.91) rotate(-45)" style="fill: rgb(232, 167, 92);"></rect>
|
|
8
|
+
<rect x="291.06" y="603.84" width="72.24" height="90.24" rx="36.12" ry="36.12" transform="translate(-363.06 421.43) rotate(-45)" style="fill: rgb(232, 167, 92);"></rect>
|
|
9
|
+
<path d="M371.7,684.58l-25.94,25.94c-2.24,2.24-2.24,5.86,0,8.1l12.67,12.67c2.99,2.99,8.09,1.82,9.46-2.19l13.28-38.61c1.97-5.74-5.17-10.2-9.46-5.91Z" style="fill: rgb(232, 167, 92);"></path>
|
|
10
|
+
<path d="M159.42,564.14l2.73,6.83c1.52,3.82,6.46,4.83,9.37,1.93l2.05-2.05c2.24-2.24,2.24-5.86,0-8.1l-4.78-4.78c-4.4-4.4-11.67.39-9.37,6.17Z" style="fill: rgb(232, 167, 92);"></path>
|
|
11
|
+
<path d="M243.92,633.11l-48.65-48.65c-5.24-5.24-13.74-5.24-18.99,0h0c-3.8,3.8-4.97,9.49-2.98,14.47l27.77,69.54c3.58,8.95,15.14,11.33,21.96,4.51l20.89-20.89c5.24-5.24,5.24-13.74,0-18.99Z" style="fill: rgb(232, 167, 92);"></path>
|
|
12
|
+
<path d="M211.32,533.1h0c14.11-14.11,14.11-36.98,0-51.08l-34.94-34.94c-.72-.72-.72-1.89,0-2.62h0c1.16-1.16.34-3.15-1.3-3.16l-11.23-.06c-25.62-.13-43.23,25.72-33.73,49.51l5.37,13.45c1.82,4.55,4.54,8.68,8,12.15l16.74,16.74c14.11,14.11,36.98,14.11,51.08,0Z" style="fill: rgb(232, 167, 92);"></path>
|
|
13
|
+
<path d="M263.74,792.53h0c-5.69,5.69-7.45,14.23-4.46,21.71l22.5,56.36c6.92,17.34,31.68,16.74,37.75-.92l8.66-25.2c2.5-7.28.64-15.35-4.8-20.79l-31.17-31.17c-7.87-7.87-20.62-7.87-28.48,0Z" style="fill: rgb(232, 167, 92);"></path>
|
|
14
|
+
<path d="M392.94,503.07l40.81-40.81c2.24-2.24,5.86-2.24,8.1,0l.06.06c2.24,2.24,2.24,5.86,0,8.1l-40.81,40.81c-2.24,2.24-2.24,5.86,0,8.1l22.48,22.48c2.99,2.99,8.09,1.82,9.46-2.19l30.71-89.32c1.27-3.71-1.47-7.57-5.39-7.59l-120.63-.6c-5.11-.03-7.69,6.16-4.08,9.77l51.18,51.18c2.24,2.24,5.86,2.24,8.1,0Z" style="fill: rgb(232, 167, 92);"></path>
|
|
15
|
+
<rect x="217.18" y="527.25" width="72.24" height="95.66" rx="36.12" ry="36.12" transform="translate(-332.45 347.55) rotate(-45)" style="fill: rgb(232, 167, 92);"></rect>
|
|
16
|
+
<path d="M350.28,739.46h0c-9.24-9.24-24.22-9.24-33.46,0l-13.94,13.94c-9.24,9.24-9.24,24.22,0,33.46l6.81,6.81c12.37,12.37,33.42,7.5,39.1-9.04l7.13-20.75c2.94-8.55.75-18.03-5.64-24.42Z" style="fill: rgb(232, 167, 92);"></path>
|
|
17
|
+
<path d="M234.18,749.12l13.2,33.06c1.52,3.82,6.46,4.83,9.37,1.93l9.93-9.93c2.24-2.24,2.24-5.86,0-8.1l-23.13-23.13c-4.4-4.4-11.67.39-9.37,6.17Z" style="fill: rgb(232, 167, 92);"></path>
|
|
18
|
+
<rect x="236.26" y="661.25" width="67.04" height="90.24" rx="33.52" ry="33.52" transform="translate(-420.46 397.65) rotate(-45)" style="fill: rgb(232, 167, 92);"></rect>
|
|
19
|
+
</g>
|
|
20
|
+
<ellipse id="Cone_Top" data-name="Cone Top" cx="288.37" cy="404.38" rx="182.34" ry="67.01" style="fill: rgb(210, 105, 30); stroke: rgb(139, 69, 19); stroke-miterlimit: 10; stroke-width: 20px;"></ellipse>
|
|
21
|
+
</g></g><g transform="translate(288, 61) rotate(0) scale(1) translate(-288, -250)"><path id="Scoop_Outline" data-name="Scoop Outline" d="M566.75,340.67c0-29.85-12.97-56.87-33.96-76.47,4.8-9.98,7.44-20.71,7.44-31.9,0-38.29-30.62-71.33-74.92-86.77.33-3.07.51-6.17.51-9.3,0-69.72-84.29-126.24-188.26-126.24s-188.26,56.52-188.26,126.24c0,4,.29,7.95.83,11.86-34.94,15.4-58.48,44.25-58.48,77.34,0,18.21,7.15,35.15,19.39,49.26-25.1,19.88-41.05,49.47-41.05,82.54,0,59.85,52.15,108.37,116.49,108.37,10.83,0,21.3-1.4,31.26-3.98,31.42,41.91,83.55,69.34,142.55,69.34,64.73,0,121.2-33,151.11-81.94,63.8-.57,115.34-48.85,115.34-108.34Z" style="fill: url("#scoop-gradient-color-10-0"); stroke: rgb(185, 123, 136); stroke-miterlimit: 10; stroke-width: 20px;"></path></g><g transform="translate(283.6594490294713, -13) rotate(1.5307105375213208) scale(0.95) translate(-288, -250)"><path id="Scoop_Outline" data-name="Scoop Outline" d="M566.75,340.67c0-29.85-12.97-56.87-33.96-76.47,4.8-9.98,7.44-20.71,7.44-31.9,0-38.29-30.62-71.33-74.92-86.77.33-3.07.51-6.17.51-9.3,0-69.72-84.29-126.24-188.26-126.24s-188.26,56.52-188.26,126.24c0,4,.29,7.95.83,11.86-34.94,15.4-58.48,44.25-58.48,77.34,0,18.21,7.15,35.15,19.39,49.26-25.1,19.88-41.05,49.47-41.05,82.54,0,59.85,52.15,108.37,116.49,108.37,10.83,0,21.3-1.4,31.26-3.98,31.42,41.91,83.55,69.34,142.55,69.34,64.73,0,121.2-33,151.11-81.94,63.8-.57,115.34-48.85,115.34-108.34Z" style="fill: url("#scoop-gradient-color-10-1"); stroke: rgb(101, 172, 101); stroke-miterlimit: 10; stroke-width: 20px;"></path></g><g transform="translate(276.26189856132225, -87) rotate(7.49015900553462) scale(0.9025) translate(-288, -250)"><path id="Scoop_Outline" data-name="Scoop Outline" d="M566.75,340.67c0-29.85-12.97-56.87-33.96-76.47,4.8-9.98,7.44-20.71,7.44-31.9,0-38.29-30.62-71.33-74.92-86.77.33-3.07.51-6.17.51-9.3,0-69.72-84.29-126.24-188.26-126.24s-188.26,56.52-188.26,126.24c0,4,.29,7.95.83,11.86-34.94,15.4-58.48,44.25-58.48,77.34,0,18.21,7.15,35.15,19.39,49.26-25.1,19.88-41.05,49.47-41.05,82.54,0,59.85,52.15,108.37,116.49,108.37,10.83,0,21.3-1.4,31.26-3.98,31.42,41.91,83.55,69.34,142.55,69.34,64.73,0,121.2-33,151.11-81.94,63.8-.57,115.34-48.85,115.34-108.34Z" style="fill: url("#scoop-gradient-color-10-2"); stroke: rgb(85, 145, 172); stroke-miterlimit: 10; stroke-width: 20px;"></path></g><g transform="translate(294.5950081356083, -161) rotate(3.885112832863893) scale(0.8573749999999999) translate(-288, -250)"><path id="Scoop_Outline" data-name="Scoop Outline" d="M566.75,340.67c0-29.85-12.97-56.87-33.96-76.47,4.8-9.98,7.44-20.71,7.44-31.9,0-38.29-30.62-71.33-74.92-86.77.33-3.07.51-6.17.51-9.3,0-69.72-84.29-126.24-188.26-126.24s-188.26,56.52-188.26,126.24c0,4,.29,7.95.83,11.86-34.94,15.4-58.48,44.25-58.48,77.34,0,18.21,7.15,35.15,19.39,49.26-25.1,19.88-41.05,49.47-41.05,82.54,0,59.85,52.15,108.37,116.49,108.37,10.83,0,21.3-1.4,31.26-3.98,31.42,41.91,83.55,69.34,142.55,69.34,64.73,0,121.2-33,151.11-81.94,63.8-.57,115.34-48.85,115.34-108.34Z" style="fill: url("#scoop-gradient-color-10-3"); stroke: rgb(159, 100, 159); stroke-miterlimit: 10; stroke-width: 20px;"></path></g><g transform="translate(282.1977183327222, -235) rotate(-5.670564096545213) scale(0.8145062499999999) translate(-288, -250)"><path id="Scoop_Outline" data-name="Scoop Outline" d="M566.75,340.67c0-29.85-12.97-56.87-33.96-76.47,4.8-9.98,7.44-20.71,7.44-31.9,0-38.29-30.62-71.33-74.92-86.77.33-3.07.51-6.17.51-9.3,0-69.72-84.29-126.24-188.26-126.24s-188.26,56.52-188.26,126.24c0,4,.29,7.95.83,11.86-34.94,15.4-58.48,44.25-58.48,77.34,0,18.21,7.15,35.15,19.39,49.26-25.1,19.88-41.05,49.47-41.05,82.54,0,59.85,52.15,108.37,116.49,108.37,10.83,0,21.3-1.4,31.26-3.98,31.42,41.91,83.55,69.34,142.55,69.34,64.73,0,121.2-33,151.11-81.94,63.8-.57,115.34-48.85,115.34-108.34Z" style="fill: url("#scoop-gradient-color-10-4"); stroke: rgb(169, 160, 89); stroke-miterlimit: 10; stroke-width: 20px;"></path></g><g transform="translate(292.7499691653716, -309) rotate(-0.6849778734121799) scale(0.7737809374999998) translate(-288, -250)"><path id="Scoop_Outline" data-name="Scoop Outline" d="M566.75,340.67c0-29.85-12.97-56.87-33.96-76.47,4.8-9.98,7.44-20.71,7.44-31.9,0-38.29-30.62-71.33-74.92-86.77.33-3.07.51-6.17.51-9.3,0-69.72-84.29-126.24-188.26-126.24s-188.26,56.52-188.26,126.24c0,4,.29,7.95.83,11.86-34.94,15.4-58.48,44.25-58.48,77.34,0,18.21,7.15,35.15,19.39,49.26-25.1,19.88-41.05,49.47-41.05,82.54,0,59.85,52.15,108.37,116.49,108.37,10.83,0,21.3-1.4,31.26-3.98,31.42,41.91,83.55,69.34,142.55,69.34,64.73,0,121.2-33,151.11-81.94,63.8-.57,115.34-48.85,115.34-108.34Z" style="fill: url("#scoop-gradient-color-10-5"); stroke: rgb(184, 155, 0); stroke-miterlimit: 10; stroke-width: 20px;"></path></g><g transform="translate(289.48066394669195, -383) rotate(7.202713662735675) scale(0.7350918906249998) translate(-288, -250)"><path id="Scoop_Outline" data-name="Scoop Outline" d="M566.75,340.67c0-29.85-12.97-56.87-33.96-76.47,4.8-9.98,7.44-20.71,7.44-31.9,0-38.29-30.62-71.33-74.92-86.77.33-3.07.51-6.17.51-9.3,0-69.72-84.29-126.24-188.26-126.24s-188.26,56.52-188.26,126.24c0,4,.29,7.95.83,11.86-34.94,15.4-58.48,44.25-58.48,77.34,0,18.21,7.15,35.15,19.39,49.26-25.1,19.88-41.05,49.47-41.05,82.54,0,59.85,52.15,108.37,116.49,108.37,10.83,0,21.3-1.4,31.26-3.98,31.42,41.91,83.55,69.34,142.55,69.34,64.73,0,121.2-33,151.11-81.94,63.8-.57,115.34-48.85,115.34-108.34Z" style="fill: url("#scoop-gradient-color-10-6"); stroke: rgb(185, 110, 80); stroke-miterlimit: 10; stroke-width: 20px;"></path></g><g transform="translate(296.3660157901282, -457) rotate(6.178238089525774) scale(0.6983372960937497) translate(-288, -250)"><path id="Scoop_Outline" data-name="Scoop Outline" d="M566.75,340.67c0-29.85-12.97-56.87-33.96-76.47,4.8-9.98,7.44-20.71,7.44-31.9,0-38.29-30.62-71.33-74.92-86.77.33-3.07.51-6.17.51-9.3,0-69.72-84.29-126.24-188.26-126.24s-188.26,56.52-188.26,126.24c0,4,.29,7.95.83,11.86-34.94,15.4-58.48,44.25-58.48,77.34,0,18.21,7.15,35.15,19.39,49.26-25.1,19.88-41.05,49.47-41.05,82.54,0,59.85,52.15,108.37,116.49,108.37,10.83,0,21.3-1.4,31.26-3.98,31.42,41.91,83.55,69.34,142.55,69.34,64.73,0,121.2-33,151.11-81.94,63.8-.57,115.34-48.85,115.34-108.34Z" style="fill: url("#scoop-gradient-color-10-7"); stroke: rgb(160, 129, 95); stroke-miterlimit: 10; stroke-width: 20px;"></path></g><g transform="translate(295.42123350629606, -531) rotate(0.9815300608857083) scale(0.6634204312890623) translate(-288, -250)"><path id="Scoop_Outline" data-name="Scoop Outline" d="M566.75,340.67c0-29.85-12.97-56.87-33.96-76.47,4.8-9.98,7.44-20.71,7.44-31.9,0-38.29-30.62-71.33-74.92-86.77.33-3.07.51-6.17.51-9.3,0-69.72-84.29-126.24-188.26-126.24s-188.26,56.52-188.26,126.24c0,4,.29,7.95.83,11.86-34.94,15.4-58.48,44.25-58.48,77.34,0,18.21,7.15,35.15,19.39,49.26-25.1,19.88-41.05,49.47-41.05,82.54,0,59.85,52.15,108.37,116.49,108.37,10.83,0,21.3-1.4,31.26-3.98,31.42,41.91,83.55,69.34,142.55,69.34,64.73,0,121.2-33,151.11-81.94,63.8-.57,115.34-48.85,115.34-108.34Z" style="fill: url("#scoop-gradient-color-10-8"); stroke: rgb(172, 84, 84); stroke-miterlimit: 10; stroke-width: 20px;"></path></g><g transform="translate(300.85421934927564, -605) rotate(-1.724309903775282) scale(0.6302494097246091) translate(-288, -250)"><path id="Scoop_Outline" data-name="Scoop Outline" d="M566.75,340.67c0-29.85-12.97-56.87-33.96-76.47,4.8-9.98,7.44-20.71,7.44-31.9,0-38.29-30.62-71.33-74.92-86.77.33-3.07.51-6.17.51-9.3,0-69.72-84.29-126.24-188.26-126.24s-188.26,56.52-188.26,126.24c0,4,.29,7.95.83,11.86-34.94,15.4-58.48,44.25-58.48,77.34,0,18.21,7.15,35.15,19.39,49.26-25.1,19.88-41.05,49.47-41.05,82.54,0,59.85,52.15,108.37,116.49,108.37,10.83,0,21.3-1.4,31.26-3.98,31.42,41.91,83.55,69.34,142.55,69.34,64.73,0,121.2-33,151.11-81.94,63.8-.57,115.34-48.85,115.34-108.34Z" style="fill: url("#scoop-gradient-color-10-9"); stroke: rgb(160, 132, 164); stroke-miterlimit: 10; stroke-width: 20px;"></path><g id="Right_Eye" data-name="Right Eye">
|
|
22
|
+
<circle id="Left_Eye_Outline" data-name="Left Eye Outline" cx="383.4" cy="216.12" r="64.78" style="fill: #fff; stroke: #000; stroke-miterlimit: 10; stroke-width: 6px;"></circle>
|
|
23
|
+
|
|
24
|
+
</g><g id="Left_Eye" data-name="Left Eye">
|
|
25
|
+
<circle id="Right_Eye_Outline" data-name="Right Eye Outline" cx="175.1" cy="250.34" r="64.78" style="fill: #fff; stroke: #000; stroke-miterlimit: 10; stroke-width: 6px;"></circle>
|
|
26
|
+
|
|
27
|
+
</g><g><line x1="351.01" y1="183.73000000000002" x2="415.78999999999996" y2="248.51" stroke="#000" stroke-width="15" stroke-linecap="round"></line><line x1="351.01" y1="248.51" x2="415.78999999999996" y2="183.73000000000002" stroke="#000" stroke-width="15" stroke-linecap="round"></line></g><g><line x1="142.70999999999998" y1="217.95" x2="207.49" y2="282.73" stroke="#000" stroke-width="15" stroke-linecap="round"></line><line x1="142.70999999999998" y1="282.73" x2="207.49" y2="217.95" stroke="#000" stroke-width="15" stroke-linecap="round"></line></g></g></g></svg>
|