sliccy 3.41.1 → 3.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/ui/assets/{adobe-Bu7hjxDA.js → adobe-DyYfoGbB.js} +2 -2
  2. package/dist/ui/assets/{adobe-D1vCNkNC.js → adobe-bIneadbm.js} +1 -1
  3. package/dist/ui/assets/{agent-bridge-DxlscH16.js → agent-bridge-DXnWPXM_.js} +1 -1
  4. package/dist/ui/assets/{agent-message-to-chat-Lwy2EBHf.js → agent-message-to-chat-C9iFUc2K.js} +1 -1
  5. package/dist/ui/assets/{apps-rrb7uG8q.js → apps-CGvz_eSs.js} +1 -1
  6. package/dist/ui/assets/{azure-openai-CWatwGhy.js → azure-openai-BkhFFq9O.js} +1 -1
  7. package/dist/ui/assets/{azure-openai-By7hBR9A.js → azure-openai-DZYNE8jA.js} +1 -1
  8. package/dist/ui/assets/{bsh-watchdog-By4aO0HL.js → bsh-watchdog-E_2OMqEd.js} +1 -1
  9. package/dist/ui/assets/{cdp-DqXPKaXv.js → cdp-cl-6LRS-.js} +3 -3
  10. package/dist/ui/assets/{connect-surface-DBXUXM5q.js → connect-surface-CcPRZEFU.js} +1 -1
  11. package/dist/ui/assets/cost-command-Cg4O5jCH.js +1 -0
  12. package/dist/ui/assets/{dist-ZDMnSvWv.js → dist-BbjElUYU.js} +1 -1
  13. package/dist/ui/assets/{dist-DNED0MpT.js → dist-jGdNVYhi.js} +1 -1
  14. package/dist/ui/assets/{es-DDYPgR38.js → es-BtY_DX7h.js} +1 -1
  15. package/dist/ui/assets/{follower-sprinkle-bridge-D7dlYcU_.js → follower-sprinkle-bridge-B8BD5dCJ.js} +1 -1
  16. package/dist/ui/assets/{fs-BjCfDAl3.js → fs-Ce5nCWjM.js} +1 -1
  17. package/dist/ui/assets/{github-DZFG2HD0.js → github-Q2m9FVfW.js} +2 -2
  18. package/dist/ui/assets/{github-HeZgefH0.js → github-URfxjCX9.js} +1 -1
  19. package/dist/ui/assets/{github-copilot-B0rfuZBv.js → github-copilot-0iNSBtTR.js} +1 -1
  20. package/dist/ui/assets/{github-copilot-RufkWz5q.js → github-copilot-6ssJWycU.js} +1 -1
  21. package/dist/ui/assets/{kernel-worker-B0j_TfUN.js → kernel-worker-DffnLr7Z.js} +19 -19
  22. package/dist/ui/assets/{lick-ws-bridge-C8Hg3YGd.js → lick-ws-bridge-i6HVxxXm.js} +1 -1
  23. package/dist/ui/assets/{local-llm-GD2-Hw_4.js → local-llm-Bgs5kJ_t.js} +1 -1
  24. package/dist/ui/assets/{magick-wasm-C5DgLA2W.js → magick-wasm-B_cGQpkr.js} +1 -1
  25. package/dist/ui/assets/{main-DPxMZYuN.js → main-CcitfZkp.js} +6 -6
  26. package/dist/ui/assets/{main-cherry-C511hrS-.js → main-cherry-D2EeyQiT.js} +1 -1
  27. package/dist/ui/assets/{migration-run-2ugM_2Fv.js → migration-run-B9tVVu2A.js} +1 -1
  28. package/dist/ui/assets/{mount-jCn41ukO.js → mount-Czuj2WJd.js} +1 -1
  29. package/dist/ui/assets/{nuke-command-C9nOsofh.js → nuke-command-Cr6JkTOs.js} +1 -1
  30. package/dist/ui/assets/{oauth-bootstrap-C1ljExsp.js → oauth-bootstrap-CaXkbIdk.js} +2 -2
  31. package/dist/ui/assets/{oauth-service-BsWeJQx3.js → oauth-service-5c8VBACb.js} +1 -1
  32. package/dist/ui/assets/{offscreen-client-DMZqCIeY.js → offscreen-client-DHmb7D-_.js} +1 -1
  33. package/dist/ui/assets/{onboarding-orchestrator-DopqNUuE.js → onboarding-orchestrator-D05dB_am.js} +1 -1
  34. package/dist/ui/assets/{openai-codex-Cpj7DxYW.js → openai-codex-BfeVvrJz.js} +1 -1
  35. package/dist/ui/assets/{openai-codex-T1u9yQlc.js → openai-codex-C9IKfdo5.js} +1 -1
  36. package/dist/ui/assets/{panel-rpc-handlers-DatecaXs.js → panel-rpc-handlers-Dk_VNrC8.js} +1 -1
  37. package/dist/ui/assets/{provider-BQXZuE1Z.js → provider-D-UqE2HK.js} +1 -1
  38. package/dist/ui/assets/{provider-BLVEv2h5.js → provider-DH5jETfR.js} +2 -2
  39. package/dist/ui/assets/{provider-settings-C-u-tl4q.js → provider-settings-Dv6vKl47.js} +2 -2
  40. package/dist/ui/assets/provider-store-access-DBImU7-3.js +1 -0
  41. package/dist/ui/assets/provider-store-access-rIKVrQwg.js +1 -0
  42. package/dist/ui/assets/{providers-DoNm9KIu.js → providers-DmlUhX-j.js} +1 -1
  43. package/dist/ui/assets/{proxied-fetch-D7ScPbJc.js → proxied-fetch-_czX6FMK.js} +1 -1
  44. package/dist/ui/assets/{remote-terminal-view-DH0K--K7.js → remote-terminal-view-BUSzLqkw.js} +1 -1
  45. package/dist/ui/assets/{spawn-CB4gNb6v.js → spawn-CPNBUG5S.js} +1 -1
  46. package/dist/ui/assets/{store-_udr88Ai.js → store-BoygF8u6.js} +1 -1
  47. package/dist/ui/assets/{sudo-CXjYfUlr.js → sudo-DgcUZnhq.js} +1 -1
  48. package/dist/ui/assets/{tray-leave-runtime-iXXYB_7A.js → tray-leave-runtime-DX5ZtY_e.js} +1 -1
  49. package/dist/ui/assets/{upgrade-detection-BGpYGKDp.js → upgrade-detection-BgWGkQ-H.js} +1 -1
  50. package/dist/ui/assets/{xai-grok-GpZwWWPN.js → xai-grok-BdT1YNtR.js} +1 -1
  51. package/dist/ui/assets/{xai-grok-CYcKkuaJ.js → xai-grok-CgcNrsh0.js} +1 -1
  52. package/dist/ui/index.html +1 -1
  53. package/dist/ui/logos/error-logo-preview.html +503 -0
  54. package/dist/ui/logos/generate-error-variants.mjs +62 -0
  55. package/dist/ui/logos/sliccy-error-color-0scoops.svg +27 -0
  56. package/dist/ui/logos/sliccy-error-color-10scoops.svg +27 -0
  57. package/dist/ui/logos/sliccy-error-color-1scoops.svg +27 -0
  58. package/dist/ui/logos/sliccy-error-color-2scoops.svg +27 -0
  59. package/dist/ui/logos/sliccy-error-color-3scoops.svg +27 -0
  60. package/dist/ui/logos/sliccy-error-color-4scoops.svg +27 -0
  61. package/dist/ui/logos/sliccy-error-color-5scoops.svg +27 -0
  62. package/dist/ui/logos/sliccy-error-color-6scoops.svg +27 -0
  63. package/dist/ui/logos/sliccy-error-color-7scoops.svg +27 -0
  64. package/dist/ui/logos/sliccy-error-color-8scoops.svg +27 -0
  65. package/dist/ui/logos/sliccy-error-color-9scoops.svg +27 -0
  66. package/dist/ui/logos/sliccy-error-mono-dark-0scoops.svg +27 -0
  67. package/dist/ui/logos/sliccy-error-mono-dark-10scoops.svg +27 -0
  68. package/dist/ui/logos/sliccy-error-mono-dark-1scoops.svg +27 -0
  69. package/dist/ui/logos/sliccy-error-mono-dark-2scoops.svg +27 -0
  70. package/dist/ui/logos/sliccy-error-mono-dark-3scoops.svg +27 -0
  71. package/dist/ui/logos/sliccy-error-mono-dark-4scoops.svg +27 -0
  72. package/dist/ui/logos/sliccy-error-mono-dark-5scoops.svg +27 -0
  73. package/dist/ui/logos/sliccy-error-mono-dark-6scoops.svg +27 -0
  74. package/dist/ui/logos/sliccy-error-mono-dark-7scoops.svg +27 -0
  75. package/dist/ui/logos/sliccy-error-mono-dark-8scoops.svg +27 -0
  76. package/dist/ui/logos/sliccy-error-mono-dark-9scoops.svg +27 -0
  77. package/dist/ui/logos/sliccy-error-mono-light-0scoops.svg +27 -0
  78. package/dist/ui/logos/sliccy-error-mono-light-10scoops.svg +27 -0
  79. package/dist/ui/logos/sliccy-error-mono-light-1scoops.svg +27 -0
  80. package/dist/ui/logos/sliccy-error-mono-light-2scoops.svg +27 -0
  81. package/dist/ui/logos/sliccy-error-mono-light-3scoops.svg +27 -0
  82. package/dist/ui/logos/sliccy-error-mono-light-4scoops.svg +27 -0
  83. package/dist/ui/logos/sliccy-error-mono-light-5scoops.svg +27 -0
  84. package/dist/ui/logos/sliccy-error-mono-light-6scoops.svg +27 -0
  85. package/dist/ui/logos/sliccy-error-mono-light-7scoops.svg +27 -0
  86. package/dist/ui/logos/sliccy-error-mono-light-8scoops.svg +27 -0
  87. package/dist/ui/logos/sliccy-error-mono-light-9scoops.svg +27 -0
  88. package/dist/ui/packages/webapp/index.html +1 -1
  89. package/package.json +2 -2
  90. package/dist/ui/assets/cost-command-CeTme7kM.js +0 -1
  91. package/dist/ui/assets/provider-store-access-COJPysL3.js +0 -1
  92. package/dist/ui/assets/provider-store-access-_3VGtwXB.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(&quot;#scoop-gradient-color-10-0&quot;); 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(&quot;#scoop-gradient-color-10-1&quot;); 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(&quot;#scoop-gradient-color-10-2&quot;); 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(&quot;#scoop-gradient-color-10-3&quot;); 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(&quot;#scoop-gradient-color-10-4&quot;); 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(&quot;#scoop-gradient-color-10-5&quot;); 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(&quot;#scoop-gradient-color-10-6&quot;); 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(&quot;#scoop-gradient-color-10-7&quot;); 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(&quot;#scoop-gradient-color-10-8&quot;); 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(&quot;#scoop-gradient-color-10-9&quot;); 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>