idicon 0.0.0-stage → 0.1.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.
@@ -0,0 +1,501 @@
1
+ import { inkFor, pickRoles, sanitizePalette } from "./palettes.js";
2
+ import { createRng, hashText } from "./random.js";
3
+ // Everything is drawn on a 120x120 canvas and returned as a plain SVG string
4
+ // built only from palette colors, numbers and fixed markup. The id itself is
5
+ // never written into the SVG, so it can be any user text without escaping.
6
+ //
7
+ // Within a layer, the order of rng calls is part of the contract: reordering or
8
+ // adding a call changes that layer for every existing avatar. Do that only on
9
+ // purpose.
10
+ const VIEW = 120;
11
+ const n = (v) => Number(v.toFixed(2));
12
+ // A personality is a pool of expressions that go together; picking one then
13
+ // picking inside it gives "same mood, different face" rather than random noise.
14
+ const PERSONALITIES = [
15
+ { eyes: ["dot", "happy", "oval"], mouth: ["smile", "grin"], brows: ["none", "raised"], cheeks: 0.5 }, // cheerful
16
+ { eyes: ["sleepy", "happy"], mouth: ["smile", "flat", "o"], brows: ["none"], cheeks: 0.3 }, // calm
17
+ { eyes: ["dot", "oval", "glasses"], mouth: ["o"], brows: ["raised"], cheeks: 0.2 }, // surprised
18
+ { eyes: ["wink", "dot"], mouth: ["smirk", "grin"], brows: ["arch", "raised"], cheeks: 0.2 }, // mischievous
19
+ { eyes: ["dot", "oval"], mouth: ["flat", "frown"], brows: ["angry"], cheeks: 0 }, // angry
20
+ { eyes: ["dot", "oval"], mouth: ["frown", "o"], brows: ["sad"], cheeks: 0.4 }, // sad
21
+ { eyes: ["shades"], mouth: ["smirk", "smile", "grin"], brows: ["none"], cheeks: 0 }, // cool
22
+ { eyes: ["oval", "glasses", "dot"], mouth: ["o", "flat", "smirk"], brows: ["arch"], cheeks: 0.1 }, // curious
23
+ { eyes: ["dot"], mouth: ["smile", "flat"], brows: ["sad", "none"], cheeks: 1 }, // shy
24
+ { eyes: ["happy"], mouth: ["smile", "grin"], brows: ["none"], cheeks: 0.7 }, // dreamy
25
+ ];
26
+ /**
27
+ * Draws a face centered on (cx, cy); `s` is roughly its half-width. Features
28
+ * are nudged sideways ("turn") and pupils shifted ("gaze") so the same
29
+ * personality can look straight ahead or glance away.
30
+ */
31
+ function face(rng, cx0, cy, s, ink, cheekColor) {
32
+ const p = rng.pick(PERSONALITIES);
33
+ const eyes = rng.pick(p.eyes);
34
+ const mouth = rng.pick(p.mouth);
35
+ const brows = rng.pick(p.brows);
36
+ const cheeks = rng.chance(p.cheeks);
37
+ const cx = cx0 + rng.pick([-0.18, -0.09, 0, 0, 0.09, 0.18]) * s;
38
+ const gaze = rng.pick([-1, 0, 0, 1]) * s * 0.05;
39
+ const ex = s * 0.36;
40
+ const ey = cy - s * 0.08;
41
+ const sw = n(s * 0.07);
42
+ const stroke = `fill="none" stroke="${ink}" stroke-width="${sw}" stroke-linecap="round" stroke-linejoin="round"`;
43
+ const dot = (x) => `<circle cx="${n(x + gaze)}" cy="${n(ey)}" r="${n(s * 0.09)}" fill="${ink}"/>`;
44
+ const oval = (x) => `<ellipse cx="${n(x + gaze)}" cy="${n(ey)}" rx="${n(s * 0.075)}" ry="${n(s * 0.12)}" fill="${ink}"/>`;
45
+ const happy = (x) => `<path d="M${n(x - s * 0.1)} ${n(ey + s * 0.05)}Q${n(x)} ${n(ey - s * 0.13)} ${n(x + s * 0.1)} ${n(ey + s * 0.05)}" ${stroke}/>`;
46
+ const sleepy = (x) => `<path d="M${n(x - s * 0.1)} ${n(ey)}h${n(s * 0.2)}" ${stroke}/>`;
47
+ const glass = (x) => `<circle cx="${n(x)}" cy="${n(ey)}" r="${n(s * 0.17)}" ${stroke}/>${dot(x)}`;
48
+ const shade = (x) => `<rect x="${n(x - s * 0.19)}" y="${n(ey - s * 0.11)}" width="${n(s * 0.38)}" height="${n(s * 0.24)}" rx="${n(s * 0.09)}" fill="${ink}"/>`;
49
+ let eyeMarkup;
50
+ switch (eyes) {
51
+ case "dot":
52
+ eyeMarkup = dot(cx - ex) + dot(cx + ex);
53
+ break;
54
+ case "oval":
55
+ eyeMarkup = oval(cx - ex) + oval(cx + ex);
56
+ break;
57
+ case "happy":
58
+ eyeMarkup = happy(cx - ex) + happy(cx + ex);
59
+ break;
60
+ case "wink":
61
+ eyeMarkup = dot(cx - ex) + happy(cx + ex);
62
+ break;
63
+ case "sleepy":
64
+ eyeMarkup = sleepy(cx - ex) + sleepy(cx + ex);
65
+ break;
66
+ case "glasses":
67
+ eyeMarkup =
68
+ glass(cx - ex) +
69
+ glass(cx + ex) +
70
+ `<path d="M${n(cx - ex + s * 0.17)} ${n(ey)}H${n(cx + ex - s * 0.17)}" ${stroke}/>`;
71
+ break;
72
+ case "shades":
73
+ eyeMarkup =
74
+ shade(cx - ex) +
75
+ shade(cx + ex) +
76
+ `<path d="M${n(cx - ex + s * 0.19)} ${n(ey)}H${n(cx + ex - s * 0.19)}" ${stroke}/>`;
77
+ break;
78
+ }
79
+ // Brows sit above the eyes; "arch" raises only one side for a skeptical look.
80
+ const by = ey - s * 0.27;
81
+ const brow = (x, side, kind) => {
82
+ const inner = x - side * s * 0.12; // end nearest the nose
83
+ const outer = x + side * s * 0.12;
84
+ const lift = kind === "angry" ? 0.07 : kind === "sad" ? -0.07 : 0;
85
+ const raise = kind === "raised" || (kind === "arch" && side === 1) ? -s * 0.07 : 0;
86
+ return `<path d="M${n(outer)} ${n(by + raise - lift * s)}L${n(inner)} ${n(by + raise + lift * s)}" ${stroke}/>`;
87
+ };
88
+ const browMarkup = brows === "none" || eyes === "shades" ? "" : brow(cx - ex, -1, brows) + brow(cx + ex, 1, brows);
89
+ const my = cy + s * 0.3;
90
+ let mouthMarkup;
91
+ switch (mouth) {
92
+ case "smile":
93
+ mouthMarkup = `<path d="M${n(cx - s * 0.22)} ${n(my)}Q${n(cx)} ${n(my + s * 0.24)} ${n(cx + s * 0.22)} ${n(my)}" ${stroke}/>`;
94
+ break;
95
+ case "frown":
96
+ mouthMarkup = `<path d="M${n(cx - s * 0.2)} ${n(my + s * 0.12)}Q${n(cx)} ${n(my - s * 0.08)} ${n(cx + s * 0.2)} ${n(my + s * 0.12)}" ${stroke}/>`;
97
+ break;
98
+ case "grin":
99
+ // Half-disc: flat edge on top, bowl below.
100
+ mouthMarkup = `<path d="M${n(cx - s * 0.2)} ${n(my - s * 0.02)}H${n(cx + s * 0.2)}A${n(s * 0.2)} ${n(s * 0.2)} 0 0 1 ${n(cx - s * 0.2)} ${n(my - s * 0.02)}Z" fill="${ink}"/>`;
101
+ break;
102
+ case "flat":
103
+ mouthMarkup = `<path d="M${n(cx - s * 0.16)} ${n(my + s * 0.04)}h${n(s * 0.32)}" ${stroke}/>`;
104
+ break;
105
+ case "o":
106
+ mouthMarkup = `<ellipse cx="${n(cx)}" cy="${n(my + s * 0.05)}" rx="${n(s * 0.075)}" ry="${n(s * 0.095)}" fill="${ink}"/>`;
107
+ break;
108
+ case "smirk":
109
+ mouthMarkup = `<path d="M${n(cx - s * 0.2)} ${n(my + s * 0.06)}Q${n(cx + s * 0.06)} ${n(my + s * 0.2)} ${n(cx + s * 0.22)} ${n(my - s * 0.08)}" ${stroke}/>`;
110
+ break;
111
+ }
112
+ const cheekMarkup = cheeks
113
+ ? [-1, 1]
114
+ .map((side) => `<circle cx="${n(cx + side * s * 0.62)}" cy="${n(cy + s * 0.24)}" r="${n(s * 0.11)}" fill="${cheekColor}" fill-opacity=".55"/>`)
115
+ .join("")
116
+ : "";
117
+ return cheekMarkup + browMarkup + eyeMarkup + mouthMarkup;
118
+ }
119
+ const POSES = ["none", "none", "wave", "cheer", "out", "hips"];
120
+ /**
121
+ * Stick arms with a round hand, drawn BEFORE the body so the shoulder end
122
+ * disappears under it. `left` / `right` are the shoulder anchors.
123
+ */
124
+ function arms(rng, color, hand, left, right) {
125
+ const pose = rng.pick(POSES);
126
+ const waveSide = rng.chance(0.5) ? -1 : 1;
127
+ const limb = (from, side, kind) => {
128
+ const [x, y] = from;
129
+ let ctrl;
130
+ let end;
131
+ switch (kind) {
132
+ case "wave":
133
+ case "cheer":
134
+ ctrl = [x + side * 18, y - 8];
135
+ end = [x + side * 10, y - 36];
136
+ break;
137
+ case "out":
138
+ ctrl = [x + side * 12, y];
139
+ end = [x + side * 16, y + 14];
140
+ break;
141
+ default: // hips: elbow out, hand back to the waist
142
+ ctrl = [x + side * 22, y + 6];
143
+ end = [x + side * 4, y + 20];
144
+ }
145
+ return (`<path d="M${x} ${y}Q${ctrl[0]} ${ctrl[1]} ${end[0]} ${end[1]}" fill="none" stroke="${color}" stroke-width="9" stroke-linecap="round"/>` +
146
+ `<circle cx="${end[0]}" cy="${end[1]}" r="6" fill="${hand}"/>`);
147
+ };
148
+ switch (pose) {
149
+ case "none":
150
+ return "";
151
+ case "wave":
152
+ return waveSide === 1 ? limb(right, 1, "wave") : limb(left, -1, "wave");
153
+ default:
154
+ return limb(left, -1, pose) + limb(right, 1, pose);
155
+ }
156
+ }
157
+ export const PATTERNS = ["rings", "stripes", "blobs", "dots", "horizon"];
158
+ function background(rng, c, choice) {
159
+ const base = `<rect width="${VIEW}" height="${VIEW}" fill="${c.bg}"/>`;
160
+ const picked = rng.pick(PATTERNS);
161
+ switch (choice === "random" ? picked : choice) {
162
+ case "plain":
163
+ return base;
164
+ case "rings": {
165
+ const cx = 20 + rng.int(80);
166
+ const cy = 20 + rng.int(80);
167
+ return (base +
168
+ [70, 50, 30]
169
+ .map((r) => `<circle cx="${cx}" cy="${cy}" r="${r}" fill="none" stroke="${c.bg2}" stroke-width="7" stroke-opacity=".5"/>`)
170
+ .join(""));
171
+ }
172
+ case "stripes": {
173
+ const angle = rng.pick([-45, 45, 0, 90]);
174
+ let bands = "";
175
+ for (let i = -2; i < 7; i++)
176
+ bands += `<rect x="${-20 + i * 28}" y="-40" width="14" height="200" fill="${c.bg2}" fill-opacity=".5"/>`;
177
+ return base + `<g transform="rotate(${angle} 60 60)">${bands}</g>`;
178
+ }
179
+ case "blobs": {
180
+ const flip = rng.chance(0.5) ? 1 : -1;
181
+ return (base +
182
+ `<circle cx="${60 - flip * 46}" cy="22" r="42" fill="${c.bg2}" fill-opacity=".55"/>` +
183
+ `<circle cx="${60 + flip * 50}" cy="104" r="34" fill="${c.bg2}" fill-opacity=".55"/>`);
184
+ }
185
+ case "dots": {
186
+ let dots = "";
187
+ for (let y = 10; y < VIEW; y += 20)
188
+ for (let x = 10; x < VIEW; x += 20)
189
+ dots += `<circle cx="${x}" cy="${y}" r="3.2" fill="${c.bg2}" fill-opacity=".6"/>`;
190
+ return base + dots;
191
+ }
192
+ case "horizon":
193
+ return base + `<rect y="${rng.pick([64, 74, 84])}" width="${VIEW}" height="${VIEW}" fill="${c.bg2}" fill-opacity=".5"/>`;
194
+ }
195
+ }
196
+ const HAIRS = ["short", "bun", "long", "cap", "bald", "curly", "mohawk"];
197
+ const DETAILS = ["tie", "notch", "lanyard", "bowtie"];
198
+ function person(rng, c) {
199
+ const hair = rng.pick(HAIRS);
200
+ const detail = rng.pick(DETAILS);
201
+ const headset = rng.chance(0.3);
202
+ const wide = rng.pick([16, 20, 24]);
203
+ const cx = 60;
204
+ const cy = 50;
205
+ const r = 26;
206
+ const ink = inkFor(c.face);
207
+ const limbs = arms(rng, c.body, c.face, [wide + 14, 98], [106 - wide, 98]);
208
+ const hairBack = hair === "long"
209
+ ? `<path d="M${cx - r - 3} ${cy}A${r + 3} ${r + 3} 0 0 1 ${cx + r + 3} ${cy}L${cx + r + 6} 88H${cx - r - 6}Z" fill="${c.accent}"/>`
210
+ : "";
211
+ // The torso runs far past the bottom edge: the pose transform tilts and
212
+ // shrinks the character, and a body that stopped at the frame would show
213
+ // the background underneath at some angles.
214
+ const shoulders = `<path d="M${wide - 6} 220V124C${wide - 6} 90 ${wide + 18} 80 60 80S${126 - wide} 90 ${126 - wide} 124V220Z" fill="${c.body}"/>`;
215
+ let detailMarkup;
216
+ switch (detail) {
217
+ case "tie":
218
+ detailMarkup = `<path d="M60 80 54 87 60 92 66 87Z" fill="${c.accent}"/><path d="M60 92 54 118H66Z" fill="${c.accent}"/>`;
219
+ break;
220
+ case "notch":
221
+ detailMarkup = `<path d="M50 80 60 94 70 80Z" fill="${c.face}"/>`;
222
+ break;
223
+ case "lanyard":
224
+ detailMarkup =
225
+ `<path d="M50 80 60 104 70 80" fill="none" stroke="${c.accent}" stroke-width="3"/>` +
226
+ `<rect x="53" y="102" width="14" height="16" rx="3" fill="${c.accent}"/>`;
227
+ break;
228
+ case "bowtie":
229
+ detailMarkup = `<path d="M60 86 48 80V92ZM60 86 72 80V92Z" fill="${c.accent}"/>`;
230
+ break;
231
+ }
232
+ const head = `<circle cx="${cx}" cy="${cy}" r="${r}" fill="${c.face}"/>`;
233
+ let hairFront = "";
234
+ switch (hair) {
235
+ case "short":
236
+ hairFront = `<path d="M${cx - r} ${cy}A${r} ${r} 0 0 1 ${cx + r} ${cy}Q${cx + 14} ${cy - 14} ${cx} ${cy - 12}Q${cx - 14} ${cy - 14} ${cx - r} ${cy}Z" fill="${c.accent}"/>`;
237
+ break;
238
+ case "bun":
239
+ hairFront =
240
+ `<circle cx="${cx}" cy="${cy - r - 4}" r="9" fill="${c.accent}"/>` +
241
+ `<path d="M${cx - r} ${cy}A${r} ${r} 0 0 1 ${cx + r} ${cy}Q${cx + 10} ${cy - 16} ${cx - 4} ${cy - 11}Q${cx - 18} ${cy - 8} ${cx - r} ${cy}Z" fill="${c.accent}"/>`;
242
+ break;
243
+ case "long":
244
+ hairFront = `<path d="M${cx - r} ${cy + 2}A${r} ${r} 0 0 1 ${cx + r} ${cy + 2}Q${cx + 4} ${cy - 18} ${cx - r} ${cy + 2}Z" fill="${c.accent}"/>`;
245
+ break;
246
+ case "cap":
247
+ hairFront =
248
+ `<path d="M${cx - r - 2} ${cy - 6}A${r + 2} ${r + 2} 0 0 1 ${cx + r + 2} ${cy - 6}Z" fill="${c.accent}"/>` +
249
+ `<rect x="${cx - r - 8}" y="${cy - 8}" width="${2 * r + 16}" height="7" rx="3.5" fill="${c.accent}"/>`;
250
+ break;
251
+ case "curly":
252
+ for (const deg of [-165, -138, -111, -84, -57, -30, -15]) {
253
+ const a = (deg * Math.PI) / 180;
254
+ hairFront += `<circle cx="${n(cx + Math.cos(a) * (r - 1))}" cy="${n(cy + Math.sin(a) * (r - 1))}" r="10" fill="${c.accent}"/>`;
255
+ }
256
+ break;
257
+ case "mohawk":
258
+ hairFront = `<path d="M${cx - 8} ${cy - r + 3}Q${cx - 4} ${cy - r - 22} ${cx + 2} ${cy - r - 20}Q${cx + 8} ${cy - r - 14} ${cx + 8} ${cy - r + 3}Z" fill="${c.accent}"/>`;
259
+ break;
260
+ case "bald":
261
+ break;
262
+ }
263
+ const headsetMarkup = headset
264
+ ? `<path d="M${cx - r - 2} ${cy + 2}A${r + 2} ${r + 2} 0 0 1 ${cx + r + 2} ${cy + 2}" fill="none" stroke="${c.body}" stroke-width="5" stroke-linecap="round"/>` +
265
+ `<rect x="${cx - r - 6}" y="${cy - 2}" width="9" height="17" rx="4.5" fill="${c.body}"/>` +
266
+ `<rect x="${cx + r - 3}" y="${cy - 2}" width="9" height="17" rx="4.5" fill="${c.body}"/>` +
267
+ `<path d="M${cx - r - 2} ${cy + 14}Q${cx - r + 2} ${cy + 32} ${cx - 8} ${cy + 29}" fill="none" stroke="${c.body}" stroke-width="3" stroke-linecap="round"/>`
268
+ : "";
269
+ return (limbs + hairBack + shoulders + detailMarkup + head + hairFront + headsetMarkup + face(rng, cx, cy + 4, 24, ink, c.accent));
270
+ }
271
+ function robot(rng, c) {
272
+ const ink = inkFor(c.face);
273
+ return (arms(rng, c.accent, c.accent, [24, 70], [96, 70]) +
274
+ `<path d="M60 26V14" stroke="${c.body}" stroke-width="4" stroke-linecap="round"/>` +
275
+ `<circle cx="60" cy="11" r="5" fill="${c.accent}"/>` +
276
+ `<rect x="30" y="94" width="60" height="34" rx="14" fill="${c.accent}"/>` +
277
+ `<rect x="52" y="86" width="16" height="12" fill="${c.body}"/>` +
278
+ `<rect x="17" y="46" width="12" height="26" rx="6" fill="${c.accent}"/>` +
279
+ `<rect x="91" y="46" width="12" height="26" rx="6" fill="${c.accent}"/>` +
280
+ `<rect x="24" y="26" width="72" height="62" rx="18" fill="${c.body}"/>` +
281
+ `<rect x="33" y="37" width="54" height="40" rx="12" fill="${c.face}"/>` +
282
+ face(rng, 60, 57, 22, ink, c.accent));
283
+ }
284
+ function box(rng, c) {
285
+ const ink = inkFor(c.body);
286
+ return (arms(rng, c.accent, c.accent, [28, 80], [92, 80]) +
287
+ `<rect x="26" y="42" width="68" height="64" rx="10" fill="${c.body}"/>` +
288
+ `<rect x="19" y="28" width="82" height="22" rx="8" fill="${c.accent}"/>` +
289
+ `<rect x="51" y="28" width="18" height="22" fill="${c.face}"/>` +
290
+ face(rng, 60, 80, 24, ink, c.accent));
291
+ }
292
+ function cloud(rng, c) {
293
+ const ink = inkFor(c.body);
294
+ return (`<path d="M96 30l3 7 7 3-7 3-3 7-3-7-7-3 7-3z" fill="${c.accent}"/>` +
295
+ `<circle cx="22" cy="44" r="4" fill="${c.accent}"/>` +
296
+ `<circle cx="38" cy="76" r="19" fill="${c.body}"/>` +
297
+ `<circle cx="60" cy="58" r="27" fill="${c.body}"/>` +
298
+ `<circle cx="84" cy="72" r="21" fill="${c.body}"/>` +
299
+ `<rect x="38" y="70" width="48" height="26" rx="13" fill="${c.body}"/>` +
300
+ `<rect x="30" y="100" width="60" height="6" rx="3" fill="${c.accent}" fill-opacity=".8"/>` +
301
+ face(rng, 62, 72, 21, ink, c.accent));
302
+ }
303
+ function bulb(rng, c) {
304
+ const ink = inkFor(c.body);
305
+ let rays = "";
306
+ for (const deg of [-155, -125, -90, -55, -25]) {
307
+ const a = (deg * Math.PI) / 180;
308
+ rays += `<path d="M${n(60 + Math.cos(a) * 40)} ${n(48 + Math.sin(a) * 40)}L${n(60 + Math.cos(a) * 49)} ${n(48 + Math.sin(a) * 49)}" stroke="${c.accent}" stroke-width="4" stroke-linecap="round"/>`;
309
+ }
310
+ return (rays +
311
+ `<path d="M42 68Q47 82 49 90H71Q73 82 78 68Z" fill="${c.body}"/>` +
312
+ `<circle cx="60" cy="50" r="30" fill="${c.body}"/>` +
313
+ `<rect x="47" y="88" width="26" height="9" rx="3.5" fill="${c.accent}"/>` +
314
+ `<rect x="51" y="99" width="18" height="8" rx="4" fill="${c.accent}"/>` +
315
+ face(rng, 60, 52, 24, ink, c.accent));
316
+ }
317
+ const ROCKET_BODY = "M60 10C84 30 88 64 80 98H40C32 64 36 30 60 10Z";
318
+ function rocket(rng, c) {
319
+ const ink = inkFor(c.body);
320
+ return (`<path d="M50 98H70L60 120Z" fill="${c.accent}"/>` +
321
+ `<path d="M44 72 24 96V108L48 96ZM76 72 96 96V108L72 96Z" fill="${c.accent}"/>` +
322
+ `<path d="${ROCKET_BODY}" fill="${c.body}"/>` +
323
+ // The nose cone is a flat band clipped by the body outline, so it follows the curve exactly.
324
+ `<clipPath id="rocket-body"><path d="${ROCKET_BODY}"/></clipPath>` +
325
+ `<rect x="30" y="0" width="60" height="38" fill="${c.accent}" clip-path="url(#rocket-body)"/>` +
326
+ face(rng, 60, 66, 17, ink, c.accent));
327
+ }
328
+ function cat(rng, c) {
329
+ const ink = inkFor(c.body);
330
+ return (`<path d="M26 60 28 22 56 40ZM94 60 92 22 64 40Z" fill="${c.body}"/>` +
331
+ `<path d="M33 48 34 31 48 39ZM87 48 86 31 72 39Z" fill="${c.accent}"/>` +
332
+ `<path d="M24 68H8M24 76 9 82M96 68H112M96 76 111 82" stroke="${c.accent}" stroke-width="3" stroke-linecap="round"/>` +
333
+ `<ellipse cx="60" cy="68" rx="40" ry="34" fill="${c.body}"/>` +
334
+ face(rng, 60, 70, 26, ink, c.accent));
335
+ }
336
+ function owl(rng, c) {
337
+ const ink = inkFor(c.body);
338
+ return (`<rect x="42" y="104" width="12" height="7" rx="3.5" fill="${c.accent}"/>` +
339
+ `<rect x="66" y="104" width="12" height="7" rx="3.5" fill="${c.accent}"/>` +
340
+ `<path d="M33 52 33 14 60 38ZM87 52 87 14 60 38Z" fill="${c.body}"/>` +
341
+ `<ellipse cx="60" cy="66" rx="36" ry="42" fill="${c.body}"/>` +
342
+ `<ellipse cx="60" cy="92" rx="20" ry="14" fill="${c.face}"/>` +
343
+ `<path d="M31 58Q14 84 35 102ZM89 58Q106 84 85 102Z" fill="${c.accent}"/>` +
344
+ face(rng, 60, 56, 22, ink, c.accent));
345
+ }
346
+ function ghost(rng, c) {
347
+ const ink = inkFor(c.body);
348
+ return (arms(rng, c.body, c.body, [28, 72], [92, 72]) +
349
+ `<circle cx="98" cy="26" r="4" fill="${c.accent}"/>` +
350
+ `<circle cx="22" cy="34" r="3" fill="${c.accent}"/>` +
351
+ `<path d="M26 106V52A34 34 0 0 1 94 52V106L83 97 72 106 60 97 48 106 37 97Z" fill="${c.body}"/>` +
352
+ face(rng, 60, 56, 24, ink, c.accent));
353
+ }
354
+ function monster(rng, c) {
355
+ const ink = inkFor(c.body);
356
+ return (arms(rng, c.body, c.accent, [26, 74], [94, 74]) +
357
+ `<path d="M36 40 28 12 54 30ZM84 40 92 12 66 30Z" fill="${c.accent}"/>` +
358
+ `<rect x="36" y="100" width="18" height="11" rx="5.5" fill="${c.accent}"/>` +
359
+ `<rect x="66" y="100" width="18" height="11" rx="5.5" fill="${c.accent}"/>` +
360
+ `<rect x="24" y="30" width="72" height="78" rx="34" fill="${c.body}"/>` +
361
+ `<ellipse cx="60" cy="97" rx="24" ry="11" fill="${c.face}"/>` +
362
+ face(rng, 60, 62, 26, ink, c.accent));
363
+ }
364
+ function plant(rng, c) {
365
+ const ink = inkFor(c.body);
366
+ const leaves = rng
367
+ .pick([[-40, 0, 40], [-25, 25], [-50, -15, 15, 50]])
368
+ .map((a) => `<ellipse cx="60" cy="36" rx="10" ry="22" fill="${c.accent}" transform="rotate(${a} 60 58)"/>`)
369
+ .join("");
370
+ return (leaves +
371
+ `<path d="M36 62H84L78 108H42Z" fill="${c.body}"/>` +
372
+ `<rect x="30" y="54" width="60" height="13" rx="5" fill="${c.accent}"/>` +
373
+ face(rng, 60, 86, 16, ink, c.accent));
374
+ }
375
+ function mug(rng, c) {
376
+ const ink = inkFor(c.body);
377
+ return (`<path d="M46 26Q40 20 46 14M62 26Q56 20 62 14" fill="none" stroke="${c.accent}" stroke-width="4" stroke-linecap="round"/>` +
378
+ `<path d="M84 52H98Q106 52 106 66Q106 80 98 80H84" fill="none" stroke="${c.accent}" stroke-width="9" stroke-linecap="round"/>` +
379
+ `<path d="M26 38H86V84Q86 106 66 106H46Q26 106 26 84Z" fill="${c.body}"/>` +
380
+ `<rect x="22" y="34" width="68" height="10" rx="5" fill="${c.accent}"/>` +
381
+ face(rng, 56, 72, 21, ink, c.accent));
382
+ }
383
+ const SHAPES = ["hexagon", "triangle", "diamond", "square", "star", "heart", "drop", "pill"];
384
+ /** Closed path through the given points. */
385
+ const poly = (pts) => `M${pts.map(([x, y]) => `${n(x)} ${n(y)}`).join("L")}Z`;
386
+ function polygon(rng, c) {
387
+ const ink = inkFor(c.body);
388
+ const kind = rng.pick(SHAPES);
389
+ let d;
390
+ let fy = 62;
391
+ let s = 24;
392
+ switch (kind) {
393
+ case "hexagon":
394
+ d = poly(Array.from({ length: 6 }, (_, k) => {
395
+ const a = (Math.PI / 3) * k + Math.PI / 6;
396
+ return [60 + Math.cos(a) * 40, 62 + Math.sin(a) * 40];
397
+ }));
398
+ s = 26;
399
+ break;
400
+ case "star":
401
+ d = poly(Array.from({ length: 10 }, (_, k) => {
402
+ const a = (Math.PI / 5) * k - Math.PI / 2;
403
+ const rad = k % 2 === 0 ? 46 : 27;
404
+ return [60 + Math.cos(a) * rad, 64 + Math.sin(a) * rad];
405
+ }));
406
+ fy = 66;
407
+ s = 19;
408
+ break;
409
+ case "triangle":
410
+ d = poly([[60, 26], [98, 94], [22, 94]]);
411
+ fy = 72;
412
+ s = 20;
413
+ break;
414
+ case "diamond":
415
+ d = poly([[60, 20], [102, 62], [60, 104], [18, 62]]);
416
+ s = 23;
417
+ break;
418
+ case "square":
419
+ d = poly([[28, 28], [92, 28], [92, 92], [28, 92]]);
420
+ fy = 60;
421
+ break;
422
+ case "heart":
423
+ d = "M60 100C20 72 18 38 40 34C52 32 58 40 60 46C62 40 68 32 80 34C102 38 100 72 60 100Z";
424
+ fy = 62;
425
+ s = 22;
426
+ break;
427
+ case "drop":
428
+ d = "M60 18C80 46 94 60 94 76A34 34 0 0 1 26 76C26 60 40 46 60 18Z";
429
+ fy = 78;
430
+ break;
431
+ case "pill":
432
+ d = "M36 42A24 24 0 0 1 84 42V82A24 24 0 0 1 36 82Z";
433
+ s = 20;
434
+ break;
435
+ }
436
+ // Rounded joins come from a same-color stroke; the accent copy is a flat offset shadow.
437
+ const shape = (dx, fill) => `<path d="${d}" transform="translate(${dx} ${dx})" fill="${fill}" stroke="${fill}" stroke-width="12" stroke-linejoin="round"/>`;
438
+ return shape(6, c.accent) + shape(0, c.body) + face(rng, 60, fy, s, ink, c.accent);
439
+ }
440
+ // Order matters for "random": it is the original list, kept so existing ids
441
+ // keep their character.
442
+ const CHARACTERS = [
443
+ person, robot, box, cloud, bulb, polygon,
444
+ rocket, cat, owl, ghost, monster, plant, mug,
445
+ ];
446
+ export const SUBJECTS = ["random", "person", "character", "object", "shape", "none"];
447
+ export const PATTERN_CHOICES = ["random", "plain", ...PATTERNS];
448
+ const SUBJECT_POOLS = {
449
+ person: [person],
450
+ character: [robot, cat, owl, ghost, monster],
451
+ object: [box, cloud, bulb, rocket, plant, mug],
452
+ shape: [polygon],
453
+ };
454
+ // -------------------------------------------------------------- public
455
+ /**
456
+ * Version of the drawing itself. Bump it (together with the package's major
457
+ * version) whenever any change makes an existing id render differently:
458
+ * a new character, palette or pattern, or a reordered rng call. The design
459
+ * lock test (design-lock.test.ts) fails on such a change until it is
460
+ * accepted on purpose.
461
+ */
462
+ export const DESIGN_VERSION = 1;
463
+ /** The avatar for `id`, as a standalone SVG document string. */
464
+ export function generateAvatarSvg(id, options = {}) {
465
+ const { subject = "random", pattern = "random", size = 256 } = options;
466
+ const key = id.trim().normalize("NFC");
467
+ // Each layer draws from its own stream, all derived from the id. With one
468
+ // shared stream, changing the pattern or palette changed how many values
469
+ // were consumed and so reshuffled everything drawn after it (a different
470
+ // character, pose and face). Now an option only changes its own layer.
471
+ const stream = (layer) => createRng(`${key}\u0000${layer}`);
472
+ const roles = pickRoles(stream("palette"), sanitizePalette(options.palette));
473
+ const bg = background(stream("pattern"), roles, pattern);
474
+ const pool = subject === "random" ? CHARACTERS : subject === "none" ? [] : SUBJECT_POOLS[subject];
475
+ const characterRng = stream("character");
476
+ const character = pool.length ? characterRng.pick(pool)(characterRng, roles) : "";
477
+ // The whole character leans, mirrors and shrinks a little around the
478
+ // canvas center: cheap, and it makes neighbours in a list look different.
479
+ const poseRng = stream("pose");
480
+ const tilt = poseRng.pick([-12, -8, -5, 0, 0, 5, 8, 12]);
481
+ const flip = poseRng.chance(0.5) ? -1 : 1;
482
+ const scale = poseRng.pick([0.9, 0.95, 1]);
483
+ const pose = `translate(60 64) rotate(${tilt}) scale(${flip * scale} ${scale}) translate(-60 -64)`;
484
+ // Unique per id so several inline avatars on one page never share a clipPath.
485
+ const clip = `av-${hashText(key)}`;
486
+ // Square, right-angled corners. The clip keeps tilted characters inside the
487
+ // square even when the SVG is embedded somewhere that lets overflow show.
488
+ const frame = `<rect width="${VIEW}" height="${VIEW}"/>`;
489
+ return (`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${VIEW} ${VIEW}" width="${size}" height="${size}" role="img" data-idicon-design="${DESIGN_VERSION}">` +
490
+ `<defs><clipPath id="${clip}">${frame}</clipPath></defs>` +
491
+ `<g clip-path="url(#${clip})">${bg}<g transform="${pose}">${character}</g></g>` +
492
+ `</svg>`);
493
+ }
494
+ /**
495
+ * The same avatar as a `data:` URL, ready for an <img src> or a CSS
496
+ * background-image, for pages that cannot inline SVG markup.
497
+ */
498
+ export function avatarDataUri(id, options = {}) {
499
+ return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(generateAvatarSvg(id, options))}`;
500
+ }
501
+ //# sourceMappingURL=avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../src/lib/avatar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { Rng } from "./random.js";
2
+ export declare const PALETTES: readonly (readonly string[])[];
3
+ export declare const INK_DARK = "#16213A";
4
+ export declare const INK_LIGHT = "#FFFFFF";
5
+ export declare function contrastRatio(a: string, b: string): number;
6
+ /** Dark or white, whichever reads better on top of `fill`. */
7
+ export declare function inkFor(fill: string): string;
8
+ export interface Roles {
9
+ /** Frame background. */
10
+ bg: string;
11
+ /** Background pattern; the only role allowed to sit close to the others. */
12
+ bg2: string;
13
+ /** Main body of the character or object. */
14
+ body: string;
15
+ /** Head / screen / skin-like surface. */
16
+ face: string;
17
+ /** Hair, tie, antenna, shadow: the pop of color. */
18
+ accent: string;
19
+ }
20
+ /** The colors if they form a usable manual palette (exactly 5 #rrggbb), otherwise undefined. */
21
+ export declare function sanitizePalette(colors: readonly string[] | undefined): readonly string[] | undefined;
22
+ /**
23
+ * Picks a palette and assigns its colors to roles, keeping overlapping roles
24
+ * distinguishable. A manual `override` replaces the automatic choice, but
25
+ * the automatic pick is still drawn so nothing downstream shifts.
26
+ */
27
+ export declare function pickRoles(rng: Rng, override?: readonly string[]): Roles;
28
+ //# sourceMappingURL=palettes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"palettes.d.ts","sourceRoot":"","sources":["../../src/lib/palettes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAMvC,eAAO,MAAM,QAAQ,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAalD,CAAC;AAEF,eAAO,MAAM,QAAQ,YAAY,CAAC;AAClC,eAAO,MAAM,SAAS,YAAY,CAAC;AAUnC,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,8DAA8D;AAC9D,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI3C;AAED,MAAM,WAAW,KAAK;IACpB,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,4EAA4E;IAC5E,GAAG,EAAE,MAAM,CAAC;IACZ,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;CAChB;AAgBD,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAEpG;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,KAAK,CAkBvE"}