pixelpeeps 1.0.4 → 1.0.5
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/index.d.mts +1 -16
- package/dist/index.d.ts +1 -16
- package/dist/index.js +17 -162
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +17 -162
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
@@ -5,17 +5,6 @@ type HeadShape = "circle" | "square";
|
|
5
5
|
type Variant = "auto" | "plain" | "split" | "swoop" | "diagonal" | "cap" | "crescent" | "band" | "corner" | "ring" | "arc" | "wave" | "half";
|
6
6
|
type AlignX = "left" | "center" | "right";
|
7
7
|
type AlignY = "top" | "center" | "bottom";
|
8
|
-
type FaceProps = {
|
9
|
-
cx: number;
|
10
|
-
cy: number;
|
11
|
-
r: number;
|
12
|
-
color: string;
|
13
|
-
eyeShape?: "circle" | "ellipse" | "line" | "wink" | "sleepy" | "surprised" | "random";
|
14
|
-
mouthShape?: "smile" | "frown" | "flat" | "zigzag" | "random";
|
15
|
-
pupilColor?: string | "auto";
|
16
|
-
eyeShine?: boolean | "random";
|
17
|
-
rand: () => number;
|
18
|
-
};
|
19
8
|
type AvatarProps = {
|
20
9
|
name: string;
|
21
10
|
size?: number;
|
@@ -29,14 +18,10 @@ type AvatarProps = {
|
|
29
18
|
padding?: number;
|
30
19
|
colors?: string | [string, string] | [string, string, string] | "random";
|
31
20
|
variant?: Variant;
|
32
|
-
eyeShape?: FaceProps["eyeShape"];
|
33
|
-
mouthShape?: FaceProps["mouthShape"];
|
34
|
-
pupilColor?: string | "auto";
|
35
|
-
eyeShine?: boolean;
|
36
21
|
className?: string;
|
37
22
|
style?: React.CSSProperties;
|
38
23
|
title?: string;
|
39
24
|
};
|
40
|
-
declare function Avatar({ name, size, pixelSize, mirrored, bg, colors, headShape, square, alignX, alignY, padding, variant, className, style, title,
|
25
|
+
declare function Avatar({ name, size, pixelSize, mirrored, bg, colors, headShape, square, alignX, alignY, padding, variant, className, style, title, }: AvatarProps): react_jsx_runtime.JSX.Element;
|
41
26
|
|
42
27
|
export { Avatar, Avatar as default };
|
package/dist/index.d.ts
CHANGED
@@ -5,17 +5,6 @@ type HeadShape = "circle" | "square";
|
|
5
5
|
type Variant = "auto" | "plain" | "split" | "swoop" | "diagonal" | "cap" | "crescent" | "band" | "corner" | "ring" | "arc" | "wave" | "half";
|
6
6
|
type AlignX = "left" | "center" | "right";
|
7
7
|
type AlignY = "top" | "center" | "bottom";
|
8
|
-
type FaceProps = {
|
9
|
-
cx: number;
|
10
|
-
cy: number;
|
11
|
-
r: number;
|
12
|
-
color: string;
|
13
|
-
eyeShape?: "circle" | "ellipse" | "line" | "wink" | "sleepy" | "surprised" | "random";
|
14
|
-
mouthShape?: "smile" | "frown" | "flat" | "zigzag" | "random";
|
15
|
-
pupilColor?: string | "auto";
|
16
|
-
eyeShine?: boolean | "random";
|
17
|
-
rand: () => number;
|
18
|
-
};
|
19
8
|
type AvatarProps = {
|
20
9
|
name: string;
|
21
10
|
size?: number;
|
@@ -29,14 +18,10 @@ type AvatarProps = {
|
|
29
18
|
padding?: number;
|
30
19
|
colors?: string | [string, string] | [string, string, string] | "random";
|
31
20
|
variant?: Variant;
|
32
|
-
eyeShape?: FaceProps["eyeShape"];
|
33
|
-
mouthShape?: FaceProps["mouthShape"];
|
34
|
-
pupilColor?: string | "auto";
|
35
|
-
eyeShine?: boolean;
|
36
21
|
className?: string;
|
37
22
|
style?: React.CSSProperties;
|
38
23
|
title?: string;
|
39
24
|
};
|
40
|
-
declare function Avatar({ name, size, pixelSize, mirrored, bg, colors, headShape, square, alignX, alignY, padding, variant, className, style, title,
|
25
|
+
declare function Avatar({ name, size, pixelSize, mirrored, bg, colors, headShape, square, alignX, alignY, padding, variant, className, style, title, }: AvatarProps): react_jsx_runtime.JSX.Element;
|
41
26
|
|
42
27
|
export { Avatar, Avatar as default };
|
package/dist/index.js
CHANGED
@@ -102,7 +102,10 @@ function yiq(hex) {
|
|
102
102
|
function bestFeatureColor(base) {
|
103
103
|
return yiq(base) > 150 ? "#111827" : "#ffffff";
|
104
104
|
}
|
105
|
-
var NICE_PALETTES = import_nice_color_palettes.default && Array.isArray(import_nice_color_palettes.default) ? import_nice_color_palettes.default : [
|
105
|
+
var NICE_PALETTES = import_nice_color_palettes.default && Array.isArray(import_nice_color_palettes.default) ? import_nice_color_palettes.default : [
|
106
|
+
// fallback single palette
|
107
|
+
["#73a9ff", "#fef3c7", "#ffd6a5", "#d4b4ff", "#a7f3d0"]
|
108
|
+
];
|
106
109
|
function resolveBg(rand, bg) {
|
107
110
|
if (!bg || bg === "random") {
|
108
111
|
return pick(rand, NICE_PALETTES).slice(0, 2);
|
@@ -126,145 +129,24 @@ function resolveCharColors(rand, colors) {
|
|
126
129
|
const a2 = colors[2] ?? shade(base, -0.2);
|
127
130
|
return [base, a1, a2];
|
128
131
|
}
|
129
|
-
function Face({
|
130
|
-
cx,
|
131
|
-
cy,
|
132
|
-
r,
|
133
|
-
color,
|
134
|
-
eyeShape: eyeShapeProp,
|
135
|
-
mouthShape: mouthShapeProp,
|
136
|
-
pupilColor,
|
137
|
-
eyeShine: eyeShineProp,
|
138
|
-
rand
|
139
|
-
}) {
|
140
|
-
const decide = (prop, opts) => {
|
141
|
-
if (prop === void 0 || prop === "random") return pick(rand, opts);
|
142
|
-
return prop;
|
143
|
-
};
|
144
|
-
const eyeShape = decide(eyeShapeProp ?? "random", ["circle", "ellipse", "line", "wink", "sleepy", "surprised"]);
|
145
|
-
const mouthShape = decide(mouthShapeProp ?? "random", ["smile", "frown", "flat", "zigzag"]);
|
146
|
-
const eyeShine = decide(eyeShineProp ?? "random", [true, false]);
|
132
|
+
function Face({ cx, cy, r, color, rand }) {
|
147
133
|
const eyeOffsetX = r * (0.34 + rand() * 0.06);
|
148
134
|
const eyeOffsetY = r * (0.2 + rand() * 0.06);
|
149
135
|
const eyeR = Math.max(2, Math.round(r * (0.08 + rand() * 0.02)));
|
150
|
-
const pupilR = Math.max(1, Math.round(eyeR * (0.45 + rand() * 0.25)));
|
151
136
|
const mouthWidth = r * (0.7 + rand() * 0.3);
|
152
137
|
const mouthLift = r * (0.18 + rand() * 0.16);
|
138
|
+
const mouthCurve = (rand() - 0.5) * 0.8;
|
153
139
|
const mouthStroke = Math.max(1, Math.round(r * 0.06));
|
154
|
-
let finalPupilColor = "#111827";
|
155
|
-
if (pupilColor && pupilColor !== "auto") finalPupilColor = pupilColor;
|
156
|
-
else finalPupilColor = yiq(color) > 150 ? "#111827" : "#ffffff";
|
157
140
|
const x0 = cx - mouthWidth / 2;
|
158
141
|
const x1 = cx + mouthWidth / 2;
|
159
142
|
const my = cy + mouthLift;
|
160
|
-
const
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
const mouthCurve = (rand() - 0.5) * 0.8;
|
168
|
-
const cxQ = cx;
|
169
|
-
const cyQ = my + r * (0.25 * mouthCurve + 0.08);
|
170
|
-
return `M ${x0} ${my} Q ${cxQ} ${cyQ} ${x1} ${my}`;
|
171
|
-
})();
|
172
|
-
const mouthPathZigzag = (() => {
|
173
|
-
const segs = 6;
|
174
|
-
const step = mouthWidth / (segs - 1);
|
175
|
-
let d = `M ${x0} ${my}`;
|
176
|
-
for (let i = 1; i < segs; i++) {
|
177
|
-
const px = x0 + step * i;
|
178
|
-
const py = my + (i % 2 === 0 ? -r * 0.08 : r * 0.08);
|
179
|
-
d += ` L ${px} ${py}`;
|
180
|
-
}
|
181
|
-
return d;
|
182
|
-
})();
|
183
|
-
const eyes = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
184
|
-
(() => {
|
185
|
-
const ex = cx - eyeOffsetX;
|
186
|
-
const ey = cy - eyeOffsetY;
|
187
|
-
switch (eyeShape) {
|
188
|
-
case "ellipse":
|
189
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ellipse", { cx: ex, cy: ey, rx: eyeR * 1.1, ry: eyeR * 0.7, fill: color }, "le");
|
190
|
-
case "line":
|
191
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: ex - eyeR, y1: ey, x2: ex + eyeR, y2: ey, stroke: color, strokeWidth: Math.max(1, Math.round(eyeR * 0.4)), strokeLinecap: "round" }, "ll");
|
192
|
-
case "wink":
|
193
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: ex - eyeR, y1: ey, x2: ex + eyeR, y2: ey, stroke: color, strokeWidth: Math.max(1, Math.round(eyeR * 0.4)), strokeLinecap: "round" }, "lw");
|
194
|
-
case "sleepy":
|
195
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ellipse", { cx: ex, cy: ey, rx: eyeR * 1.05, ry: eyeR * 0.45, fill: color }, "ls") });
|
196
|
-
case "surprised":
|
197
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: eyeR * 1.1, fill: color }, "lsp");
|
198
|
-
default:
|
199
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: eyeR, fill: color }, "lc");
|
200
|
-
}
|
201
|
-
})(),
|
202
|
-
(() => {
|
203
|
-
const ex = cx - eyeOffsetX;
|
204
|
-
const ey = cy - eyeOffsetY;
|
205
|
-
if (eyeShape === "line" || eyeShape === "wink") return null;
|
206
|
-
if (eyeShape === "sleepy") {
|
207
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: Math.max(1, pupilR * 0.6), fill: finalPupilColor }, "lps");
|
208
|
-
}
|
209
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
210
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: pupilR, fill: finalPupilColor }, "lp"),
|
211
|
-
eyeShine ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex - pupilR * 0.4, cy: ey - pupilR * 0.6, r: Math.max(0.6, pupilR * 0.35), fill: "#ffffff", opacity: 0.8 }, "lshine") : null
|
212
|
-
] });
|
213
|
-
})(),
|
214
|
-
(() => {
|
215
|
-
const ex = cx + eyeOffsetX;
|
216
|
-
const ey = cy - eyeOffsetY;
|
217
|
-
switch (eyeShape) {
|
218
|
-
case "ellipse":
|
219
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ellipse", { cx: ex, cy: ey, rx: eyeR * 1.1, ry: eyeR * 0.7, fill: color }, "re");
|
220
|
-
case "line":
|
221
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: ex - eyeR, y1: ey, x2: ex + eyeR, y2: ey, stroke: color, strokeWidth: Math.max(1, Math.round(eyeR * 0.4)), strokeLinecap: "round" }, "rl");
|
222
|
-
case "wink":
|
223
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: eyeR, fill: color }, "rw");
|
224
|
-
case "sleepy":
|
225
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ellipse", { cx: ex, cy: ey, rx: eyeR * 1.05, ry: eyeR * 0.45, fill: color }, "rs");
|
226
|
-
case "surprised":
|
227
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: eyeR * 1.1, fill: color }, "rsp");
|
228
|
-
default:
|
229
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: eyeR, fill: color }, "rc");
|
230
|
-
}
|
231
|
-
})(),
|
232
|
-
(() => {
|
233
|
-
const ex = cx + eyeOffsetX;
|
234
|
-
const ey = cy - eyeOffsetY;
|
235
|
-
if (eyeShape === "line" || eyeShape === "wink" && rand() > 0.2) {
|
236
|
-
if (eyeShape === "line") return null;
|
237
|
-
}
|
238
|
-
if (eyeShape === "sleepy") {
|
239
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: Math.max(1, pupilR * 0.6), fill: finalPupilColor }, "rps");
|
240
|
-
}
|
241
|
-
if (eyeShape === "wink") {
|
242
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
243
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: pupilR, fill: finalPupilColor }, "rp"),
|
244
|
-
eyeShine ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex - pupilR * 0.4, cy: ey - pupilR * 0.6, r: Math.max(0.6, pupilR * 0.35), fill: "#ffffff", opacity: 0.8 }, "rshine") : null
|
245
|
-
] });
|
246
|
-
}
|
247
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
248
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: pupilR, fill: finalPupilColor }, "rp"),
|
249
|
-
eyeShine ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex - pupilR * 0.4, cy: ey - pupilR * 0.6, r: Math.max(0.6, pupilR * 0.35), fill: "#ffffff", opacity: 0.8 }, "rshine2") : null
|
250
|
-
] });
|
251
|
-
})()
|
252
|
-
] });
|
253
|
-
const mouth = (() => {
|
254
|
-
switch (mouthShape) {
|
255
|
-
case "frown":
|
256
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: mouthPathFrown, stroke: color, strokeWidth: mouthStroke, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" });
|
257
|
-
case "flat":
|
258
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: x0, y1: my, x2: x1, y2: my, stroke: color, strokeWidth: Math.max(1, Math.round(mouthStroke * 0.9)), strokeLinecap: "round" });
|
259
|
-
case "zigzag":
|
260
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: mouthPathZigzag, stroke: color, strokeWidth: Math.max(1, Math.round(mouthStroke * 0.9)), fill: "none", strokeLinecap: "round", strokeLinejoin: "round" });
|
261
|
-
default:
|
262
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: mouthPathSmile, stroke: color, strokeWidth: mouthStroke, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" });
|
263
|
-
}
|
264
|
-
})();
|
265
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("g", { children: [
|
266
|
-
eyes,
|
267
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("g", { children: mouth })
|
143
|
+
const cxQ = cx;
|
144
|
+
const cyQ = my + r * (-0.25 * mouthCurve - 0.1);
|
145
|
+
const d = `M ${x0} ${my} Q ${cxQ} ${cyQ} ${x1} ${my}`;
|
146
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
147
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: cx - eyeOffsetX, cy: cy - eyeOffsetY, r: eyeR, fill: color }),
|
148
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: cx + eyeOffsetX, cy: cy - eyeOffsetY, r: eyeR, fill: color }),
|
149
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d, stroke: color, strokeWidth: mouthStroke, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" })
|
268
150
|
] });
|
269
151
|
}
|
270
152
|
function Overlays({
|
@@ -308,6 +190,7 @@ function Overlays({
|
|
308
190
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: `M ${x0} ${cy - r * 0.2} A ${r} ${r} 0 0 1 ${x1} ${cy - r * 0.2} L ${x1} ${cy + r * 0.15} A ${r} ${r} 0 0 0 ${x0} ${cy + r * 0.15} Z`, fill: a1 });
|
309
191
|
case "wave":
|
310
192
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: `M ${x0} ${cy - r * 0.3} C ${cx - r * 0.6} ${cy - r * 0.8}, ${cx - r * 0.2} ${cy + r * 0.1}, ${cx} ${cy} S ${cx + r * 0.6} ${cy + r * 0.8}, ${x1} ${cy + r * 0.3} L ${x1} ${y1} L ${x0} ${y1} Z`, fill: a1 });
|
193
|
+
// NEW variant: large half/diagonal cut (looks like attached image)
|
311
194
|
case "half": {
|
312
195
|
const diag = rand() > 0.4;
|
313
196
|
if (diag) {
|
@@ -336,12 +219,7 @@ function Avatar({
|
|
336
219
|
variant = "auto",
|
337
220
|
className,
|
338
221
|
style,
|
339
|
-
title
|
340
|
-
// simplified feature props
|
341
|
-
eyeShape,
|
342
|
-
mouthShape,
|
343
|
-
pupilColor,
|
344
|
-
eyeShine
|
222
|
+
title
|
345
223
|
}) {
|
346
224
|
const shape = headShape ?? (square ? "square" : "circle");
|
347
225
|
const rand = React.useMemo(() => rngFromSeed(String(name)), [name]);
|
@@ -399,33 +277,10 @@ function Avatar({
|
|
399
277
|
cells,
|
400
278
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("clipPath", { id: clipId, children: shape === "square" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: cx - r, y: cy - r, width: 2 * r, height: 2 * r, rx: Math.max(4, r * 0.12) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx, cy, r }) }) }),
|
401
279
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("g", { clipPath: `url(#${clipId})`, children: [
|
402
|
-
shape === "square" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
403
|
-
"rect",
|
404
|
-
{
|
405
|
-
x: cx - r,
|
406
|
-
y: cy - r,
|
407
|
-
width: 2 * r,
|
408
|
-
height: 2 * r,
|
409
|
-
rx: Math.max(4, r * 0.12),
|
410
|
-
fill: base
|
411
|
-
}
|
412
|
-
) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx, cy, r, fill: base }),
|
280
|
+
shape === "square" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: cx - r, y: cy - r, width: 2 * r, height: 2 * r, rx: Math.max(4, r * 0.12), fill: base }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx, cy, r, fill: base }),
|
413
281
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Overlays, { cx, cy, r, a1, a2, variant: chosenVariant, shape, rand })
|
414
282
|
] }),
|
415
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
416
|
-
Face,
|
417
|
-
{
|
418
|
-
cx,
|
419
|
-
cy,
|
420
|
-
r,
|
421
|
-
color: faceColor,
|
422
|
-
eyeShape,
|
423
|
-
mouthShape,
|
424
|
-
pupilColor: pupilColor ?? "auto",
|
425
|
-
eyeShine,
|
426
|
-
rand
|
427
|
-
}
|
428
|
-
)
|
283
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Face, { cx, cy, r, color: faceColor, rand })
|
429
284
|
]
|
430
285
|
}
|
431
286
|
);
|
package/dist/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/Avatar.tsx"],"sourcesContent":["export { default as Avatar } from \"./Avatar\";\r\nexport { default } from \"./Avatar\";\r\n","import * as React from \"react\";\r\nimport palettes100 from \"nice-color-palettes\";\r\n\r\nexport type HeadShape = \"circle\" | \"square\";\r\nexport type Variant =\r\n | \"auto\"\r\n | \"plain\"\r\n | \"split\"\r\n | \"swoop\"\r\n | \"diagonal\"\r\n | \"cap\"\r\n | \"crescent\"\r\n | \"band\"\r\n | \"corner\"\r\n | \"ring\"\r\n | \"arc\"\r\n | \"wave\"\r\n | \"half\";\r\nexport type AlignX = \"left\" | \"center\" | \"right\";\r\nexport type AlignY = \"top\" | \"center\" | \"bottom\";\r\n\r\nexport type FaceProps = {\r\n cx: number;\r\n cy: number;\r\n r: number;\r\n color: string;\r\n eyeShape?: \"circle\" | \"ellipse\" | \"line\" | \"wink\" | \"sleepy\" | \"surprised\" | \"random\";\r\n mouthShape?: \"smile\" | \"frown\" | \"flat\" | \"zigzag\" | \"random\";\r\n pupilColor?: string | \"auto\";\r\n eyeShine?: boolean | \"random\";\r\n rand: () => number;\r\n};\r\n\r\nexport type AvatarProps = {\r\n name: string;\r\n\r\n // pixel background\r\n size?: number;\r\n pixelSize?: number;\r\n mirrored?: boolean;\r\n bg?: [string, string] | string | \"random\";\r\n\r\n // character controls\r\n headShape?: HeadShape;\r\n square?: boolean; // deprecated\r\n alignX?: AlignX;\r\n alignY?: AlignY;\r\n padding?: number;\r\n\r\n colors?: string | [string, string] | [string, string, string] | \"random\";\r\n variant?: Variant;\r\n\r\n // new feature props (optional)\r\n eyeShape?: FaceProps[\"eyeShape\"];\r\n mouthShape?: FaceProps[\"mouthShape\"];\r\n pupilColor?: string | \"auto\";\r\n eyeShine?: boolean;\r\n\r\n // styling/a11y\r\n className?: string;\r\n style?: React.CSSProperties;\r\n title?: string;\r\n};\r\n\r\n//\r\n// Deterministic RNG (seeded)\r\n// (unchanged from original)\r\nfunction cyrb128(str: string) {\r\n let h1 = 1779033703,\r\n h2 = 3144134277,\r\n h3 = 1013904242,\r\n h4 = 2773480762;\r\n for (let i = 0, k; i < str.length; i++) {\r\n k = str.charCodeAt(i);\r\n h1 = h2 ^ Math.imul(h1 ^ k, 597399067);\r\n h2 = h3 ^ Math.imul(h2 ^ k, 2869860233);\r\n h3 = h4 ^ Math.imul(h3 ^ k, 951274213);\r\n h4 = h1 ^ Math.imul(h4 ^ k, 2716044179);\r\n }\r\n h1 = Math.imul(h3 ^ (h1 >>> 18), 597399067);\r\n h2 = Math.imul(h4 ^ (h2 >>> 22), 2869860233);\r\n h3 = Math.imul(h1 ^ (h3 >>> 17), 951274213);\r\n h4 = Math.imul(h2 ^ (h4 >>> 19), 2716044179);\r\n return [(h1 ^ h2 ^ h3 ^ h4) >>> 0, (h2 ^ h1) >>> 0, (h3 ^ h1) >>> 0, (h4 ^ h1) >>> 0];\r\n}\r\nfunction sfc32(a: number, b: number, c: number, d: number) {\r\n return function () {\r\n a >>>= 0;\r\n b >>>= 0;\r\n c >>>= 0;\r\n d >>>= 0;\r\n let t = (a + b) | 0;\r\n a = b ^ (b >>> 9);\r\n b = (c + (c << 3)) | 0;\r\n c = (c << 21) | (c >>> 11);\r\n d = (d + 1) | 0;\r\n t = (t + d) | 0;\r\n c = (c + t) | 0;\r\n return (t >>> 0) / 4294967296;\r\n };\r\n}\r\nfunction rngFromSeed(seed: string) {\r\n const [a, b, c, d] = cyrb128(seed || \"pixelpeeps\");\r\n return sfc32(a, b, c, d);\r\n}\r\nfunction pick<T>(rand: () => number, arr: T[]) {\r\n return arr[Math.floor(rand() * arr.length)];\r\n}\r\n\r\n//\r\n// Color helpers (unchanged)\r\n//\r\nfunction hexToRgb(hex: string) {\r\n const h = hex.replace(\"#\", \"\");\r\n const full = h.length === 3 ? h.split(\"\").map((c) => c + c).join(\"\") : h;\r\n const n = parseInt(full, 16);\r\n return { r: (n >> 16) & 255, g: (n >> 8) & 255, b: n & 255 };\r\n}\r\nfunction rgbToHex(r: number, g: number, b: number) {\r\n return \"#\" + [r, g, b].map((v) => v.toString(16).padStart(2, \"0\")).join(\"\");\r\n}\r\nfunction shade(hex: string, percent: number) {\r\n const { r, g, b } = hexToRgb(hex);\r\n const t = percent < 0 ? 0 : 255;\r\n const p = Math.abs(percent);\r\n return rgbToHex(\r\n Math.round((t - r) * p) + r,\r\n Math.round((t - g) * p) + g,\r\n Math.round((t - b) * p) + b\r\n );\r\n}\r\nfunction yiq(hex: string) {\r\n const { r, g, b } = hexToRgb(hex);\r\n return (r * 299 + g * 587 + b * 114) / 1000;\r\n}\r\nfunction bestFeatureColor(base: string) {\r\n return yiq(base) > 150 ? \"#111827\" : \"#ffffff\";\r\n}\r\n\r\n//\r\n// Palettes: use nice-color-palettes (top 100)\r\n//\r\nconst NICE_PALETTES: string[][] =\r\n palettes100 && Array.isArray(palettes100) ? (palettes100 as string[][]) : [[\"#73a9ff\", \"#fef3c7\", \"#ffd6a5\", \"#d4b4ff\", \"#a7f3d0\"]];\r\n\r\nfunction resolveBg(rand: () => number, bg?: AvatarProps[\"bg\"]): [string, string] {\r\n if (!bg || bg === \"random\") {\r\n return pick(rand, NICE_PALETTES).slice(0, 2) as [string, string];\r\n }\r\n if (Array.isArray(bg)) return [bg[0], bg[1] ?? bg[0]];\r\n return [shade(bg, 0.12), shade(bg, -0.06)];\r\n}\r\nfunction resolveCharColors(rand: () => number, colors?: AvatarProps[\"colors\"]): [string, string, string] {\r\n if (!colors || colors === \"random\") {\r\n const pal = pick(rand, NICE_PALETTES);\r\n const base = pal[0];\r\n const a1 = pal[1] ?? shade(base, 0.25);\r\n const a2 = pal[2] ?? shade(base, -0.2);\r\n return [base, a1, a2];\r\n }\r\n if (typeof colors === \"string\") {\r\n return [colors, shade(colors, 0.25), shade(colors, -0.2)];\r\n }\r\n const base = (colors as string[])[0];\r\n const a1 = (colors as string[])[1] ?? shade(base, 0.25);\r\n const a2 = (colors as string[])[2] ?? shade(base, -0.2);\r\n return [base, a1, a2];\r\n}\r\n\r\n//\r\n// Face component: simplified features\r\n//\r\nfunction Face({\r\n cx,\r\n cy,\r\n r,\r\n color,\r\n eyeShape: eyeShapeProp,\r\n mouthShape: mouthShapeProp,\r\n pupilColor,\r\n eyeShine: eyeShineProp,\r\n rand,\r\n}: FaceProps) {\r\n // 🌿 deterministic pick helpers\r\n const decide = <T,>(prop: T | \"random\" | undefined, opts: T[]) => {\r\n if (prop === undefined || prop === \"random\") return pick(rand, opts as any) as T;\r\n return prop as T;\r\n };\r\n\r\n // pick features deterministically if prop is \"random\"/undefined\r\n const eyeShape = decide(eyeShapeProp ?? \"random\", [\"circle\", \"ellipse\", \"line\", \"wink\", \"sleepy\", \"surprised\"]);\r\n const mouthShape = decide(mouthShapeProp ?? \"random\", [\"smile\", \"frown\", \"flat\", \"zigzag\"]);\r\n const eyeShine = decide(eyeShineProp ?? \"random\", [true, false]);\r\n\r\n // geometry\r\n const eyeOffsetX = r * (0.34 + rand() * 0.06);\r\n const eyeOffsetY = r * (0.20 + rand() * 0.06);\r\n const eyeR = Math.max(2, Math.round(r * (0.08 + rand() * 0.02)));\r\n const pupilR = Math.max(1, Math.round(eyeR * (0.45 + rand() * 0.25)));\r\n const mouthWidth = r * (0.7 + rand() * 0.3);\r\n const mouthLift = r * (0.18 + rand() * 0.16);\r\n const mouthStroke = Math.max(1, Math.round(r * 0.06));\r\n\r\n // pupil color\r\n let finalPupilColor = \"#111827\";\r\n if (pupilColor && pupilColor !== \"auto\") finalPupilColor = pupilColor;\r\n else finalPupilColor = yiq(color) > 150 ? \"#111827\" : \"#ffffff\";\r\n\r\n // helper positions\r\n const x0 = cx - mouthWidth / 2;\r\n const x1 = cx + mouthWidth / 2;\r\n const my = cy + mouthLift;\r\n\r\n // small helpers to draw various mouth shapes\r\n const mouthPathSmile = (() => {\r\n const mouthCurve = (rand() - 0.5) * 0.8;\r\n const cxQ = cx;\r\n const cyQ = my + r * (-0.25 * mouthCurve - 0.1);\r\n return `M ${x0} ${my} Q ${cxQ} ${cyQ} ${x1} ${my}`;\r\n })();\r\n\r\n const mouthPathFrown = (() => {\r\n const mouthCurve = (rand() - 0.5) * 0.8;\r\n const cxQ = cx;\r\n const cyQ = my + r * (0.25 * mouthCurve + 0.08); // control point below -> frown\r\n return `M ${x0} ${my} Q ${cxQ} ${cyQ} ${x1} ${my}`;\r\n })();\r\n\r\n const mouthPathZigzag = (() => {\r\n // create small zigzag across mouth width\r\n const segs = 6;\r\n const step = mouthWidth / (segs - 1);\r\n let d = `M ${x0} ${my}`;\r\n for (let i = 1; i < segs; i++) {\r\n const px = x0 + step * i;\r\n const py = my + (i % 2 === 0 ? -r * 0.08 : r * 0.08);\r\n d += ` L ${px} ${py}`;\r\n }\r\n return d;\r\n })();\r\n\r\n // build JSX pieces\r\n const eyes = (\r\n <>\r\n {/* left eye */}\r\n {(() => {\r\n const ex = cx - eyeOffsetX;\r\n const ey = cy - eyeOffsetY;\r\n\r\n switch (eyeShape) {\r\n case \"ellipse\":\r\n return (\r\n <ellipse cx={ex} cy={ey} rx={eyeR * 1.1} ry={eyeR * 0.7} fill={color} key=\"le\" />\r\n );\r\n case \"line\":\r\n return <line x1={ex - eyeR} y1={ey} x2={ex + eyeR} y2={ey} stroke={color} strokeWidth={Math.max(1, Math.round(eyeR * 0.4))} strokeLinecap=\"round\" key=\"ll\" />;\r\n case \"wink\":\r\n // wink left = closed (line)\r\n return <line x1={ex - eyeR} y1={ey} x2={ex + eyeR} y2={ey} stroke={color} strokeWidth={Math.max(1, Math.round(eyeR * 0.4))} strokeLinecap=\"round\" key=\"lw\" />;\r\n case \"sleepy\":\r\n return (\r\n <>\r\n <ellipse cx={ex} cy={ey} rx={eyeR * 1.05} ry={eyeR * 0.45} fill={color} key=\"ls\" />\r\n </>\r\n );\r\n case \"surprised\":\r\n return <circle cx={ex} cy={ey} r={eyeR * 1.1} fill={color} key=\"lsp\" />;\r\n default:\r\n // circle\r\n return <circle cx={ex} cy={ey} r={eyeR} fill={color} key=\"lc\" />;\r\n }\r\n })()}\r\n\r\n {/* left pupil */}\r\n {(() => {\r\n const ex = cx - eyeOffsetX;\r\n const ey = cy - eyeOffsetY;\r\n // if line/wink (closed) skip pupil\r\n if (eyeShape === \"line\" || eyeShape === \"wink\") return null;\r\n if (eyeShape === \"sleepy\") {\r\n // smaller pupil\r\n return <circle cx={ex} cy={ey} r={Math.max(1, pupilR * 0.6)} fill={finalPupilColor} key=\"lps\" />;\r\n }\r\n return (\r\n <>\r\n <circle cx={ex} cy={ey} r={pupilR} fill={finalPupilColor} key=\"lp\" />\r\n {eyeShine ? <circle cx={ex - pupilR * 0.4} cy={ey - pupilR * 0.6} r={Math.max(0.6, pupilR * 0.35)} fill=\"#ffffff\" opacity={0.8} key=\"lshine\" /> : null}\r\n </>\r\n );\r\n })()}\r\n\r\n {/* right eye */}\r\n {(() => {\r\n const ex = cx + eyeOffsetX;\r\n const ey = cy - eyeOffsetY;\r\n\r\n switch (eyeShape) {\r\n case \"ellipse\":\r\n return (\r\n <ellipse cx={ex} cy={ey} rx={eyeR * 1.1} ry={eyeR * 0.7} fill={color} key=\"re\" />\r\n );\r\n case \"line\":\r\n return <line x1={ex - eyeR} y1={ey} x2={ex + eyeR} y2={ey} stroke={color} strokeWidth={Math.max(1, Math.round(eyeR * 0.4))} strokeLinecap=\"round\" key=\"rl\" />;\r\n case \"wink\":\r\n // wink right -> keep open; variety: one eye wink looks cute\r\n return <circle cx={ex} cy={ey} r={eyeR} fill={color} key=\"rw\" />;\r\n case \"sleepy\":\r\n return <ellipse cx={ex} cy={ey} rx={eyeR * 1.05} ry={eyeR * 0.45} fill={color} key=\"rs\" />;\r\n case \"surprised\":\r\n return <circle cx={ex} cy={ey} r={eyeR * 1.1} fill={color} key=\"rsp\" />;\r\n default:\r\n return <circle cx={ex} cy={ey} r={eyeR} fill={color} key=\"rc\" />;\r\n }\r\n })()}\r\n\r\n {/* right pupil */}\r\n {(() => {\r\n const ex = cx + eyeOffsetX;\r\n const ey = cy - eyeOffsetY;\r\n if (eyeShape === \"line\" || (eyeShape === \"wink\" && rand() > 0.2)) {\r\n // sometimes wink will be left eye closed; we've drawn right open earlier; if right is closed skip\r\n if (eyeShape === \"line\") return null;\r\n }\r\n if (eyeShape === \"sleepy\") {\r\n return <circle cx={ex} cy={ey} r={Math.max(1, pupilR * 0.6)} fill={finalPupilColor} key=\"rps\" />;\r\n }\r\n if (eyeShape === \"wink\") {\r\n // keep pupil\r\n return (\r\n <>\r\n <circle cx={ex} cy={ey} r={pupilR} fill={finalPupilColor} key=\"rp\" />\r\n {eyeShine ? <circle cx={ex - pupilR * 0.4} cy={ey - pupilR * 0.6} r={Math.max(0.6, pupilR * 0.35)} fill=\"#ffffff\" opacity={0.8} key=\"rshine\" /> : null}\r\n </>\r\n );\r\n }\r\n return (\r\n <>\r\n <circle cx={ex} cy={ey} r={pupilR} fill={finalPupilColor} key=\"rp\" />\r\n {eyeShine ? <circle cx={ex - pupilR * 0.4} cy={ey - pupilR * 0.6} r={Math.max(0.6, pupilR * 0.35)} fill=\"#ffffff\" opacity={0.8} key=\"rshine2\" /> : null}\r\n </>\r\n );\r\n })()}\r\n </>\r\n );\r\n\r\n // mouth drawing based on mouthShape\r\n const mouth = (() => {\r\n switch (mouthShape) {\r\n case \"frown\":\r\n return <path d={mouthPathFrown} stroke={color} strokeWidth={mouthStroke} fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />;\r\n case \"flat\":\r\n return <line x1={x0} y1={my} x2={x1} y2={my} stroke={color} strokeWidth={Math.max(1, Math.round(mouthStroke * 0.9))} strokeLinecap=\"round\" />;\r\n case \"zigzag\":\r\n return <path d={mouthPathZigzag} stroke={color} strokeWidth={Math.max(1, Math.round(mouthStroke * 0.9))} fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />;\r\n default:\r\n return <path d={mouthPathSmile} stroke={color} strokeWidth={mouthStroke} fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />;\r\n }\r\n })();\r\n\r\n return (\r\n <g>\r\n {eyes}\r\n <g>{mouth}</g>\r\n </g>\r\n );\r\n}\r\n\r\n//\r\n// Overlays (variants) -- unchanged, but kept in file\r\n//\r\nfunction Overlays({\r\n cx,\r\n cy,\r\n r,\r\n a1,\r\n a2,\r\n variant,\r\n shape,\r\n rand,\r\n}: {\r\n cx: number;\r\n cy: number;\r\n r: number;\r\n a1: string;\r\n a2: string;\r\n variant: Exclude<Variant, \"auto\">;\r\n shape: HeadShape;\r\n rand: () => number;\r\n}) {\r\n const x0 = cx - r,\r\n y0 = cy - r,\r\n x1 = cx + r,\r\n y1 = cy + r;\r\n\r\n // deterministic options\r\n const left = rand() > 0.5;\r\n const tlbr = rand() > 0.5;\r\n const horiz = rand() > 0.5;\r\n const cornerTL = rand() > 0.5;\r\n\r\n switch (variant) {\r\n case \"plain\":\r\n return null;\r\n\r\n case \"split\":\r\n return <rect x={left ? x0 : cx} y={y0} width={r} height={2 * r} fill={a1} />;\r\n\r\n case \"diagonal\":\r\n return tlbr ? <polygon points={`${x0},${y0} ${x1},${y0} ${x1},${y1}`} fill={a1} /> : <polygon points={`${x0},${y0} ${x0},${y1} ${x1},${y1}`} fill={a1} />;\r\n\r\n case \"cap\":\r\n return <path d={`M ${x0} ${y0 + r * 0.25} L ${x1} ${y0} L ${x1} ${y0 + r * 0.6} Q ${cx} ${y0 + r * 0.85} ${x0} ${y0 + r * 0.6} Z`} fill={a1} />;\r\n\r\n case \"swoop\":\r\n return <path d={`M ${x0} ${cy - r * 0.55} Q ${cx} ${cy - r * 1.1} ${x1} ${cy - r * 0.35} L ${x1} ${y1} Q ${cx} ${cy + r * 0.95} ${x0} ${y1} Z`} fill={a1} />;\r\n\r\n case \"crescent\":\r\n return (\r\n <>\r\n <circle cx={left ? cx - r * 0.55 : cx + r * 0.55} cy={cy} r={r * 0.95} fill={a2} />\r\n <circle cx={left ? cx - r * 0.52 : cx + r * 0.52} cy={cy} r={r * 0.75} fill=\"transparent\" stroke={shade(a2, -0.25)} strokeWidth={r * 0.08} />\r\n </>\r\n );\r\n\r\n case \"band\":\r\n return horiz ? <rect x={x0} y={cy - r * 0.35} width={2 * r} height={r * 0.5} fill={a1} /> : <rect x={cx - r * 0.35} y={y0} width={r * 0.5} height={2 * r} fill={a1} />;\r\n\r\n case \"corner\":\r\n return cornerTL ? <polygon points={`${x0},${y0} ${x0 + r * 0.9},${y0} ${x0},${y0 + r * 0.9}`} fill={a1} /> : <polygon points={`${x1},${y0} ${x1 - r * 0.9},${y0} ${x1},${y0 + r * 0.9}`} fill={a1} />;\r\n\r\n case \"ring\":\r\n return shape === \"circle\" ? <circle cx={cx} cy={cy} r={r * 0.86} fill=\"none\" stroke={a1} strokeWidth={r * 0.18} /> : <rect x={cx - r * 0.86} y={cy - r * 0.86} width={2 * r * 0.86} height={2 * r * 0.86} rx={r * 0.18} fill=\"none\" stroke={a1} strokeWidth={r * 0.18} />;\r\n\r\n case \"arc\":\r\n return <path d={`M ${x0} ${cy - r * 0.2} A ${r} ${r} 0 0 1 ${x1} ${cy - r * 0.2} L ${x1} ${cy + r * 0.15} A ${r} ${r} 0 0 0 ${x0} ${cy + r * 0.15} Z`} fill={a1} />;\r\n\r\n case \"wave\":\r\n return <path d={`M ${x0} ${cy - r * 0.3} C ${cx - r * 0.6} ${cy - r * 0.8}, ${cx - r * 0.2} ${cy + r * 0.1}, ${cx} ${cy} S ${cx + r * 0.6} ${cy + r * 0.8}, ${x1} ${cy + r * 0.3} L ${x1} ${y1} L ${x0} ${y1} Z`} fill={a1} />;\r\n\r\n case \"half\": {\r\n const diag = rand() > 0.4;\r\n if (diag) {\r\n return <polygon points={`${x0},${y0} ${x1},${y0} ${x1},${cy + (left ? r * 0.1 : -r * 0.1)}`} fill={a1} />;\r\n } else {\r\n const offset = left ? -r * 0.18 : r * 0.18;\r\n return <circle cx={cx + offset} cy={cy} r={r * 0.95} fill={a1} />;\r\n }\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\n//\r\n// Main component (simplified props)\r\n//\r\nexport default function Avatar({\r\n name,\r\n size = 128,\r\n pixelSize = 12,\r\n mirrored = true,\r\n bg,\r\n colors,\r\n headShape,\r\n square,\r\n alignX = \"center\",\r\n alignY = \"center\",\r\n padding,\r\n variant = \"auto\",\r\n className,\r\n style,\r\n title,\r\n\r\n // simplified feature props\r\n eyeShape,\r\n mouthShape,\r\n pupilColor,\r\n eyeShine,\r\n}: AvatarProps) {\r\n const shape: HeadShape = headShape ?? (square ? \"square\" : \"circle\");\r\n const rand = React.useMemo(() => rngFromSeed(String(name)), [name]);\r\n\r\n // colors\r\n const [bg1, bg2] = React.useMemo(() => resolveBg(rand, bg), [rand, bg]);\r\n const [base, a1, a2] = React.useMemo(() => resolveCharColors(rand, colors), [rand, colors]);\r\n const faceColor = bestFeatureColor(base);\r\n\r\n // Pixel grid\r\n const grid = Math.max(6, Math.floor(size / pixelSize));\r\n const tile = Math.ceil(size / grid);\r\n\r\n // geometry\r\n const autoPad = Math.max(4, Math.round(size * (0.06 + rand() * 0.02)));\r\n const pad = padding ?? autoPad;\r\n const baseR = Math.floor(size * (0.36 + rand() * 0.04));\r\n const maxR = Math.floor(size / 2 - pad);\r\n const r = Math.max(8, Math.min(baseR, maxR));\r\n\r\n let cx = size / 2;\r\n let cy = size / 2;\r\n if (alignX === \"left\") cx = r + pad;\r\n if (alignX === \"right\") cx = size - (r + pad);\r\n if (alignY === \"top\") cy = r + pad;\r\n if (alignY === \"bottom\") cy = size - (r + pad);\r\n\r\n // pixel pattern\r\n const cells: React.ReactElement[] = [];\r\n const cols = mirrored ? Math.ceil(grid / 2) : grid;\r\n for (let y = 0; y < grid; y++) {\r\n for (let x = 0; x < cols; x++) {\r\n const use = rand() > 0.5;\r\n const fill = use ? bg1 : bg2;\r\n const px = x * tile;\r\n const py = y * tile;\r\n cells.push(<rect key={`L${x},${y}`} x={px} y={py} width={tile} height={tile} fill={fill} />);\r\n if (mirrored) {\r\n const mx = grid - x - 1;\r\n const mpx = mx * tile;\r\n cells.push(<rect key={`R${mx},${y}`} x={mpx} y={py} width={tile} height={tile} fill={fill} />);\r\n }\r\n }\r\n }\r\n\r\n // variants\r\n const variants: Exclude<Variant, \"auto\">[] = [\"split\", \"swoop\", \"diagonal\", \"cap\", \"crescent\", \"band\", \"corner\", \"ring\", \"arc\", \"wave\", \"plain\", \"half\"];\r\n const chosenVariant: Exclude<Variant, \"auto\"> = variant === \"auto\" ? pick(rand, variants) : (variant as Exclude<Variant, \"auto\">);\r\n\r\n // clip path id\r\n const clipId = React.useMemo(() => {\r\n const [a, b, c, d] = cyrb128(`pp-shape-${name}-${shape}-${r}`);\r\n return `pps-${a.toString(16)}${b.toString(16)}${c.toString(16)}${d.toString(16)}`;\r\n }, [name, shape, r]);\r\n\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox={`0 0 ${size} ${size}`}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n role=\"img\"\r\n aria-label={title ?? `Avatar ${name}`}\r\n className={className}\r\n style={{ display: \"inline-block\", borderRadius: 12, ...style }}\r\n >\r\n {/* background grid */}\r\n <rect width={size} height={size} fill={bg1} />\r\n {cells}\r\n\r\n <defs>\r\n <clipPath id={clipId}>\r\n {shape === \"square\" ? (\r\n <rect x={cx - r} y={cy - r} width={2 * r} height={2 * r} rx={Math.max(4, r * 0.12)} />\r\n ) : (\r\n <circle cx={cx} cy={cy} r={r} />\r\n )}\r\n </clipPath>\r\n </defs>\r\n\r\n {/* head + overlays */}\r\n <g clipPath={`url(#${clipId})`}>\r\n {shape === \"square\" ? (\r\n <rect\r\n x={cx - r}\r\n y={cy - r}\r\n width={2 * r}\r\n height={2 * r}\r\n rx={Math.max(4, r * 0.12)}\r\n fill={base}\r\n />\r\n ) : (\r\n <circle cx={cx} cy={cy} r={r} fill={base} />\r\n )}\r\n\r\n <Overlays cx={cx} cy={cy} r={r} a1={a1} a2={a2} variant={chosenVariant} shape={shape} rand={rand} />\r\n </g>\r\n\r\n {/* facial features: pass randomized or explicit props */}\r\n <Face\r\n cx={cx}\r\n cy={cy}\r\n r={r}\r\n color={faceColor}\r\n eyeShape={eyeShape}\r\n mouthShape={mouthShape}\r\n pupilColor={pupilColor ?? \"auto\"}\r\n eyeShine={eyeShine}\r\n rand={rand}\r\n />\r\n </svg>\r\n );\r\n}"],"mappings":"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","names":["palettes100","base","a1","a2"]}
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/Avatar.tsx"],"sourcesContent":["export { default as Avatar } from \"./Avatar\";\r\nexport { default } from \"./Avatar\";\r\n","import * as React from \"react\";\r\nimport palettes100 from \"nice-color-palettes\";\r\nexport type HeadShape = \"circle\" | \"square\";\r\nexport type Variant =\r\n | \"auto\"\r\n | \"plain\"\r\n | \"split\"\r\n | \"swoop\"\r\n | \"diagonal\"\r\n | \"cap\"\r\n | \"crescent\"\r\n | \"band\"\r\n | \"corner\"\r\n | \"ring\"\r\n | \"arc\"\r\n | \"wave\"\r\n | \"half\"; \r\nexport type AlignX = \"left\" | \"center\" | \"right\";\r\nexport type AlignY = \"top\" | \"center\" | \"bottom\";\r\n\r\nexport type AvatarProps = {\r\n name: string;\r\n\r\n // pixel background\r\n size?: number;\r\n pixelSize?: number;\r\n mirrored?: boolean;\r\n bg?: [string, string] | string | \"random\";\r\n\r\n // character controls\r\n headShape?: HeadShape;\r\n square?: boolean; // deprecated\r\n alignX?: AlignX;\r\n alignY?: AlignY;\r\n padding?: number;\r\n\r\n colors?: string | [string, string] | [string, string, string] | \"random\";\r\n variant?: Variant;\r\n\r\n // styling/a11y\r\n className?: string;\r\n style?: React.CSSProperties;\r\n title?: string;\r\n};\r\n\r\n//\r\n// Deterministic RNG (seeded)\r\n//\r\nfunction cyrb128(str: string) {\r\n let h1 = 1779033703, h2 = 3144134277, h3 = 1013904242, h4 = 2773480762;\r\n for (let i = 0, k; i < str.length; i++) {\r\n k = str.charCodeAt(i);\r\n h1 = h2 ^ Math.imul(h1 ^ k, 597399067);\r\n h2 = h3 ^ Math.imul(h2 ^ k, 2869860233);\r\n h3 = h4 ^ Math.imul(h3 ^ k, 951274213);\r\n h4 = h1 ^ Math.imul(h4 ^ k, 2716044179);\r\n }\r\n h1 = Math.imul(h3 ^ (h1 >>> 18), 597399067);\r\n h2 = Math.imul(h4 ^ (h2 >>> 22), 2869860233);\r\n h3 = Math.imul(h1 ^ (h3 >>> 17), 951274213);\r\n h4 = Math.imul(h2 ^ (h4 >>> 19), 2716044179);\r\n return [(h1 ^ h2 ^ h3 ^ h4) >>> 0, (h2 ^ h1) >>> 0, (h3 ^ h1) >>> 0, (h4 ^ h1) >>> 0];\r\n}\r\nfunction sfc32(a: number, b: number, c: number, d: number) {\r\n return function () {\r\n a >>>= 0; b >>>= 0; c >>>= 0; d >>>= 0;\r\n let t = (a + b) | 0;\r\n a = b ^ (b >>> 9);\r\n b = (c + (c << 3)) | 0;\r\n c = (c << 21) | (c >>> 11);\r\n d = (d + 1) | 0;\r\n t = (t + d) | 0;\r\n c = (c + t) | 0;\r\n return (t >>> 0) / 4294967296;\r\n };\r\n}\r\nfunction rngFromSeed(seed: string) {\r\n const [a, b, c, d] = cyrb128(seed || \"pixelpeeps\");\r\n return sfc32(a, b, c, d);\r\n}\r\nfunction pick<T>(rand: () => number, arr: T[]) {\r\n return arr[Math.floor(rand() * arr.length)];\r\n}\r\n\r\n//\r\n// Color helpers\r\n//\r\nfunction hexToRgb(hex: string) {\r\n const h = hex.replace(\"#\", \"\");\r\n const full = h.length === 3 ? h.split(\"\").map(c => c + c).join(\"\") : h;\r\n const n = parseInt(full, 16);\r\n return { r: (n >> 16) & 255, g: (n >> 8) & 255, b: n & 255 };\r\n}\r\nfunction rgbToHex(r: number, g: number, b: number) {\r\n return \"#\" + [r, g, b].map(v => v.toString(16).padStart(2, \"0\")).join(\"\");\r\n}\r\nfunction shade(hex: string, percent: number) {\r\n const { r, g, b } = hexToRgb(hex);\r\n const t = percent < 0 ? 0 : 255;\r\n const p = Math.abs(percent);\r\n return rgbToHex(\r\n Math.round((t - r) * p) + r,\r\n Math.round((t - g) * p) + g,\r\n Math.round((t - b) * p) + b\r\n );\r\n}\r\nfunction yiq(hex: string) {\r\n const { r, g, b } = hexToRgb(hex);\r\n return (r * 299 + g * 587 + b * 114) / 1000;\r\n}\r\nfunction bestFeatureColor(base: string) {\r\n return yiq(base) > 150 ? \"#111827\" : \"#ffffff\";\r\n}\r\n\r\n//\r\n// Palettes: use nice-color-palettes (top 100)\r\n//\r\nconst NICE_PALETTES: string[][] = (palettes100 && Array.isArray(palettes100)) ? palettes100 as string[][] : [\r\n // fallback single palette\r\n [\"#73a9ff\", \"#fef3c7\", \"#ffd6a5\", \"#d4b4ff\", \"#a7f3d0\"]\r\n];\r\n\r\nfunction resolveBg(rand: () => number, bg?: AvatarProps[\"bg\"]): [string, string] {\r\n if (!bg || bg === \"random\") {\r\n return pick(rand, NICE_PALETTES).slice(0, 2) as [string, string];\r\n }\r\n if (Array.isArray(bg)) return [bg[0], bg[1] ?? bg[0]];\r\n // single hex -> auto shade pair\r\n return [shade(bg, 0.12), shade(bg, -0.06)];\r\n}\r\nfunction resolveCharColors(rand: () => number, colors?: AvatarProps[\"colors\"]): [string, string, string] {\r\n if (!colors || colors === \"random\") {\r\n const pal = pick(rand, NICE_PALETTES);\r\n const base = pal[0];\r\n const a1 = pal[1] ?? shade(base, 0.25);\r\n const a2 = pal[2] ?? shade(base, -0.2);\r\n return [base, a1, a2];\r\n }\r\n if (typeof colors === \"string\") {\r\n return [colors, shade(colors, 0.25), shade(colors, -0.2)];\r\n }\r\n const base = (colors as string[])[0];\r\n const a1 = (colors as string[])[1] ?? shade(base, 0.25);\r\n const a2 = (colors as string[])[2] ?? shade(base, -0.2);\r\n return [base, a1, a2];\r\n}\r\n\r\n//\r\n// Small face subcomponent: parametric mouth (fixed nice curve)\r\n//\r\nfunction Face({ cx, cy, r, color, rand }: { cx: number; cy: number; r: number; color: string; rand: () => number }) {\r\n const eyeOffsetX = r * (0.34 + rand() * 0.06); // small variation from seed\r\n const eyeOffsetY = r * (0.20 + rand() * 0.06);\r\n const eyeR = Math.max(2, Math.round(r * (0.08 + rand() * 0.02)));\r\n // Parametric mouth values from seed:\r\n const mouthWidth = r * (0.7 + rand() * 0.3); // 70-100%\r\n const mouthLift = r * (0.18 + rand() * 0.16); // 18-34%\r\n const mouthCurve = (rand() - 0.5) * 0.8; // -0.4..0.4 adjusts curvature (smile vs big smile)\r\n const mouthStroke = Math.max(1, Math.round(r * 0.06));\r\n\r\n // compute coordinates\r\n const x0 = cx - mouthWidth / 2;\r\n const x1 = cx + mouthWidth / 2;\r\n const my = cy + mouthLift;\r\n\r\n // quadratic control point to make a smooth curve (smile)\r\n const cxQ = cx;\r\n const cyQ = my + r * (-0.25 * mouthCurve - 0.1); // move control up or down by mouthCurve\r\n\r\n const d = `M ${x0} ${my} Q ${cxQ} ${cyQ} ${x1} ${my}`;\r\n\r\n return (\r\n <>\r\n <circle cx={cx - eyeOffsetX} cy={cy - eyeOffsetY} r={eyeR} fill={color} />\r\n <circle cx={cx + eyeOffsetX} cy={cy - eyeOffsetY} r={eyeR} fill={color} />\r\n <path d={d} stroke={color} strokeWidth={mouthStroke} fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n </>\r\n );\r\n}\r\n\r\n//\r\n// Overlays (variants) including new `half` variant\r\n//\r\nfunction Overlays({\r\n cx, cy, r, a1, a2, variant, shape, rand\r\n}: {\r\n cx: number; cy: number; r: number;\r\n a1: string; a2: string;\r\n variant: Exclude<Variant, \"auto\">;\r\n shape: HeadShape;\r\n rand: () => number;\r\n}) {\r\n const x0 = cx - r, y0 = cy - r, x1 = cx + r, y1 = cy + r;\r\n\r\n // deterministic options\r\n const left = rand() > 0.5;\r\n const tlbr = rand() > 0.5;\r\n const horiz = rand() > 0.5;\r\n const cornerTL = rand() > 0.5;\r\n\r\n switch (variant) {\r\n case \"plain\": return null;\r\n\r\n case \"split\":\r\n return <rect x={left ? x0 : cx} y={y0} width={r} height={2 * r} fill={a1} />;\r\n\r\n case \"diagonal\":\r\n return tlbr ? (\r\n <polygon points={`${x0},${y0} ${x1},${y0} ${x1},${y1}`} fill={a1} />\r\n ) : (\r\n <polygon points={`${x0},${y0} ${x0},${y1} ${x1},${y1}`} fill={a1} />\r\n );\r\n\r\n case \"cap\":\r\n return (\r\n <path d={`M ${x0} ${y0 + r * 0.25} L ${x1} ${y0} L ${x1} ${y0 + r * 0.6} Q ${cx} ${y0 + r * 0.85} ${x0} ${y0 + r * 0.6} Z`} fill={a1} />\r\n );\r\n\r\n case \"swoop\":\r\n return (\r\n <path d={`M ${x0} ${cy - r * 0.55} Q ${cx} ${cy - r * 1.1} ${x1} ${cy - r * 0.35} L ${x1} ${y1} Q ${cx} ${cy + r * 0.95} ${x0} ${y1} Z`} fill={a1} />\r\n );\r\n\r\n case \"crescent\":\r\n return (\r\n <>\r\n <circle cx={left ? cx - r * 0.55 : cx + r * 0.55} cy={cy} r={r * 0.95} fill={a2} />\r\n <circle cx={left ? cx - r * 0.52 : cx + r * 0.52} cy={cy} r={r * 0.75} fill=\"transparent\" stroke={shade(a2, -0.25)} strokeWidth={r * 0.08} />\r\n </>\r\n );\r\n\r\n case \"band\":\r\n return horiz ? (\r\n <rect x={x0} y={cy - r * 0.35} width={2 * r} height={r * 0.5} fill={a1} />\r\n ) : (\r\n <rect x={cx - r * 0.35} y={y0} width={r * 0.5} height={2 * r} fill={a1} />\r\n );\r\n\r\n case \"corner\":\r\n return cornerTL ? (\r\n <polygon points={`${x0},${y0} ${x0 + r * 0.9},${y0} ${x0},${y0 + r * 0.9}`} fill={a1} />\r\n ) : (\r\n <polygon points={`${x1},${y0} ${x1 - r * 0.9},${y0} ${x1},${y0 + r * 0.9}`} fill={a1} />\r\n );\r\n\r\n case \"ring\":\r\n return shape === \"circle\" ? (\r\n <circle cx={cx} cy={cy} r={r * 0.86} fill=\"none\" stroke={a1} strokeWidth={r * 0.18} />\r\n ) : (\r\n <rect x={cx - r * 0.86} y={cy - r * 0.86} width={2 * r * 0.86} height={2 * r * 0.86} rx={r * 0.18} fill=\"none\" stroke={a1} strokeWidth={r * 0.18} />\r\n );\r\n\r\n case \"arc\":\r\n return <path d={`M ${x0} ${cy - r * 0.2} A ${r} ${r} 0 0 1 ${x1} ${cy - r * 0.2} L ${x1} ${cy + r * 0.15} A ${r} ${r} 0 0 0 ${x0} ${cy + r * 0.15} Z`} fill={a1} />;\r\n\r\n case \"wave\":\r\n return <path d={`M ${x0} ${cy - r * 0.3} C ${cx - r * 0.6} ${cy - r * 0.8}, ${cx - r * 0.2} ${cy + r * 0.1}, ${cx} ${cy} S ${cx + r * 0.6} ${cy + r * 0.8}, ${x1} ${cy + r * 0.3} L ${x1} ${y1} L ${x0} ${y1} Z`} fill={a1} />;\r\n\r\n // NEW variant: large half/diagonal cut (looks like attached image)\r\n case \"half\": {\r\n // choose diag or simple half using rand\r\n const diag = rand() > 0.4;\r\n if (diag) {\r\n // diagonal wedge\r\n return <polygon points={`${x0},${y0} ${x1},${y0} ${x1},${cy + (left ? r * 0.1 : -r * 0.1)}`} fill={a1} />;\r\n } else {\r\n // simple semicircle overlay offset to left/right for crescent effect\r\n const offset = left ? -r * 0.18 : r * 0.18;\r\n return <circle cx={cx + offset} cy={cy} r={r * 0.95} fill={a1} />;\r\n }\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\n//\r\n// Main component\r\n//\r\nexport default function Avatar({\r\n name,\r\n size = 128,\r\n pixelSize = 12,\r\n mirrored = true,\r\n bg,\r\n colors,\r\n headShape,\r\n square,\r\n alignX = \"center\",\r\n alignY = \"center\",\r\n padding,\r\n variant = \"auto\",\r\n className,\r\n style,\r\n title,\r\n}: AvatarProps) {\r\n const shape: HeadShape = headShape ?? (square ? \"square\" : \"circle\");\r\n // single RNG for everything derived from seed (deterministic)\r\n const rand = React.useMemo(() => rngFromSeed(String(name)), [name]);\r\n\r\n // background and character colors chosen from nice palettes\r\n const [bg1, bg2] = React.useMemo(() => resolveBg(rand, bg), [rand, bg]);\r\n const [base, a1, a2] = React.useMemo(() => resolveCharColors(rand, colors), [rand, colors]);\r\n const faceColor = bestFeatureColor(base);\r\n\r\n // Pixel grid\r\n const grid = Math.max(6, Math.floor(size / pixelSize));\r\n const tile = Math.ceil(size / grid);\r\n\r\n // geometry/calculations (all derived from rand)\r\n const autoPad = Math.max(4, Math.round(size * (0.06 + rand() * 0.02)));\r\n const pad = padding ?? autoPad;\r\n const baseR = Math.floor(size * (0.36 + rand() * 0.04)); // slight variation\r\n const maxR = Math.floor(size / 2 - pad);\r\n const r = Math.max(8, Math.min(baseR, maxR));\r\n\r\n let cx = size / 2;\r\n let cy = size / 2;\r\n if (alignX === \"left\") cx = r + pad;\r\n if (alignX === \"right\") cx = size - (r + pad);\r\n if (alignY === \"top\") cy = r + pad;\r\n if (alignY === \"bottom\") cy = size - (r + pad);\r\n\r\n // Pixel pattern generation -> uses rand sequentially; deterministic for seed\r\n const cells: React.ReactElement[] = [];\r\n const cols = mirrored ? Math.ceil(grid / 2) : grid;\r\n for (let y = 0; y < grid; y++) {\r\n for (let x = 0; x < cols; x++) {\r\n const use = rand() > 0.5;\r\n const fill = use ? bg1 : bg2;\r\n const px = x * tile;\r\n const py = y * tile;\r\n cells.push(<rect key={`L${x},${y}`} x={px} y={py} width={tile} height={tile} fill={fill} />);\r\n if (mirrored) {\r\n const mx = grid - x - 1;\r\n const mpx = mx * tile;\r\n cells.push(<rect key={`R${mx},${y}`} x={mpx} y={py} width={tile} height={tile} fill={fill} />);\r\n }\r\n }\r\n }\r\n\r\n // pick variant deterministically\r\n const variants: Exclude<Variant, \"auto\">[] = [\"split\", \"swoop\", \"diagonal\", \"cap\", \"crescent\", \"band\", \"corner\", \"ring\", \"arc\", \"wave\", \"plain\", \"half\"];\r\n const chosenVariant: Exclude<Variant, \"auto\"> = variant === \"auto\" ? pick(rand, variants) : (variant as Exclude<Variant, \"auto\">);\r\n\r\n // clip path id (stable-ish)\r\n const clipId = React.useMemo(() => {\r\n const [a, b, c, d] = cyrb128(`pp-shape-${name}-${shape}-${r}`);\r\n return `pps-${a.toString(16)}${b.toString(16)}${c.toString(16)}${d.toString(16)}`;\r\n }, [name, shape, r]);\r\n\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox={`0 0 ${size} ${size}`}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n role=\"img\"\r\n aria-label={title ?? `Avatar ${name}`}\r\n className={className}\r\n style={{ display: \"inline-block\", borderRadius: 12, ...style }}\r\n >\r\n {/* background grid */}\r\n <rect width={size} height={size} fill={bg1} />\r\n {cells}\r\n\r\n <defs>\r\n <clipPath id={clipId}>\r\n {shape === \"square\" ? (\r\n <rect x={cx - r} y={cy - r} width={2 * r} height={2 * r} rx={Math.max(4, r * 0.12)} />\r\n ) : (\r\n <circle cx={cx} cy={cy} r={r} />\r\n )}\r\n </clipPath>\r\n </defs>\r\n\r\n {/* head + overlays */}\r\n <g clipPath={`url(#${clipId})`}>\r\n {shape === \"square\" ? (\r\n <rect x={cx - r} y={cy - r} width={2 * r} height={2 * r} rx={Math.max(4, r * 0.12)} fill={base} />\r\n ) : (\r\n <circle cx={cx} cy={cy} r={r} fill={base} />\r\n )}\r\n\r\n <Overlays cx={cx} cy={cy} r={r} a1={a1} a2={a2} variant={chosenVariant} shape={shape} rand={rand} />\r\n </g>\r\n\r\n {/* facial features */}\r\n <Face cx={cx} cy={cy} r={r} color={faceColor} rand={rand} />\r\n </svg>\r\n );\r\n}\r\n"],"mappings":"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","names":["palettes100","base","a1","a2"]}
|
package/dist/index.mjs
CHANGED
@@ -66,7 +66,10 @@ function yiq(hex) {
|
|
66
66
|
function bestFeatureColor(base) {
|
67
67
|
return yiq(base) > 150 ? "#111827" : "#ffffff";
|
68
68
|
}
|
69
|
-
var NICE_PALETTES = palettes100 && Array.isArray(palettes100) ? palettes100 : [
|
69
|
+
var NICE_PALETTES = palettes100 && Array.isArray(palettes100) ? palettes100 : [
|
70
|
+
// fallback single palette
|
71
|
+
["#73a9ff", "#fef3c7", "#ffd6a5", "#d4b4ff", "#a7f3d0"]
|
72
|
+
];
|
70
73
|
function resolveBg(rand, bg) {
|
71
74
|
if (!bg || bg === "random") {
|
72
75
|
return pick(rand, NICE_PALETTES).slice(0, 2);
|
@@ -90,145 +93,24 @@ function resolveCharColors(rand, colors) {
|
|
90
93
|
const a2 = colors[2] ?? shade(base, -0.2);
|
91
94
|
return [base, a1, a2];
|
92
95
|
}
|
93
|
-
function Face({
|
94
|
-
cx,
|
95
|
-
cy,
|
96
|
-
r,
|
97
|
-
color,
|
98
|
-
eyeShape: eyeShapeProp,
|
99
|
-
mouthShape: mouthShapeProp,
|
100
|
-
pupilColor,
|
101
|
-
eyeShine: eyeShineProp,
|
102
|
-
rand
|
103
|
-
}) {
|
104
|
-
const decide = (prop, opts) => {
|
105
|
-
if (prop === void 0 || prop === "random") return pick(rand, opts);
|
106
|
-
return prop;
|
107
|
-
};
|
108
|
-
const eyeShape = decide(eyeShapeProp ?? "random", ["circle", "ellipse", "line", "wink", "sleepy", "surprised"]);
|
109
|
-
const mouthShape = decide(mouthShapeProp ?? "random", ["smile", "frown", "flat", "zigzag"]);
|
110
|
-
const eyeShine = decide(eyeShineProp ?? "random", [true, false]);
|
96
|
+
function Face({ cx, cy, r, color, rand }) {
|
111
97
|
const eyeOffsetX = r * (0.34 + rand() * 0.06);
|
112
98
|
const eyeOffsetY = r * (0.2 + rand() * 0.06);
|
113
99
|
const eyeR = Math.max(2, Math.round(r * (0.08 + rand() * 0.02)));
|
114
|
-
const pupilR = Math.max(1, Math.round(eyeR * (0.45 + rand() * 0.25)));
|
115
100
|
const mouthWidth = r * (0.7 + rand() * 0.3);
|
116
101
|
const mouthLift = r * (0.18 + rand() * 0.16);
|
102
|
+
const mouthCurve = (rand() - 0.5) * 0.8;
|
117
103
|
const mouthStroke = Math.max(1, Math.round(r * 0.06));
|
118
|
-
let finalPupilColor = "#111827";
|
119
|
-
if (pupilColor && pupilColor !== "auto") finalPupilColor = pupilColor;
|
120
|
-
else finalPupilColor = yiq(color) > 150 ? "#111827" : "#ffffff";
|
121
104
|
const x0 = cx - mouthWidth / 2;
|
122
105
|
const x1 = cx + mouthWidth / 2;
|
123
106
|
const my = cy + mouthLift;
|
124
|
-
const
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
const mouthCurve = (rand() - 0.5) * 0.8;
|
132
|
-
const cxQ = cx;
|
133
|
-
const cyQ = my + r * (0.25 * mouthCurve + 0.08);
|
134
|
-
return `M ${x0} ${my} Q ${cxQ} ${cyQ} ${x1} ${my}`;
|
135
|
-
})();
|
136
|
-
const mouthPathZigzag = (() => {
|
137
|
-
const segs = 6;
|
138
|
-
const step = mouthWidth / (segs - 1);
|
139
|
-
let d = `M ${x0} ${my}`;
|
140
|
-
for (let i = 1; i < segs; i++) {
|
141
|
-
const px = x0 + step * i;
|
142
|
-
const py = my + (i % 2 === 0 ? -r * 0.08 : r * 0.08);
|
143
|
-
d += ` L ${px} ${py}`;
|
144
|
-
}
|
145
|
-
return d;
|
146
|
-
})();
|
147
|
-
const eyes = /* @__PURE__ */ jsxs(Fragment, { children: [
|
148
|
-
(() => {
|
149
|
-
const ex = cx - eyeOffsetX;
|
150
|
-
const ey = cy - eyeOffsetY;
|
151
|
-
switch (eyeShape) {
|
152
|
-
case "ellipse":
|
153
|
-
return /* @__PURE__ */ jsx("ellipse", { cx: ex, cy: ey, rx: eyeR * 1.1, ry: eyeR * 0.7, fill: color }, "le");
|
154
|
-
case "line":
|
155
|
-
return /* @__PURE__ */ jsx("line", { x1: ex - eyeR, y1: ey, x2: ex + eyeR, y2: ey, stroke: color, strokeWidth: Math.max(1, Math.round(eyeR * 0.4)), strokeLinecap: "round" }, "ll");
|
156
|
-
case "wink":
|
157
|
-
return /* @__PURE__ */ jsx("line", { x1: ex - eyeR, y1: ey, x2: ex + eyeR, y2: ey, stroke: color, strokeWidth: Math.max(1, Math.round(eyeR * 0.4)), strokeLinecap: "round" }, "lw");
|
158
|
-
case "sleepy":
|
159
|
-
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("ellipse", { cx: ex, cy: ey, rx: eyeR * 1.05, ry: eyeR * 0.45, fill: color }, "ls") });
|
160
|
-
case "surprised":
|
161
|
-
return /* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: eyeR * 1.1, fill: color }, "lsp");
|
162
|
-
default:
|
163
|
-
return /* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: eyeR, fill: color }, "lc");
|
164
|
-
}
|
165
|
-
})(),
|
166
|
-
(() => {
|
167
|
-
const ex = cx - eyeOffsetX;
|
168
|
-
const ey = cy - eyeOffsetY;
|
169
|
-
if (eyeShape === "line" || eyeShape === "wink") return null;
|
170
|
-
if (eyeShape === "sleepy") {
|
171
|
-
return /* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: Math.max(1, pupilR * 0.6), fill: finalPupilColor }, "lps");
|
172
|
-
}
|
173
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
174
|
-
/* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: pupilR, fill: finalPupilColor }, "lp"),
|
175
|
-
eyeShine ? /* @__PURE__ */ jsx("circle", { cx: ex - pupilR * 0.4, cy: ey - pupilR * 0.6, r: Math.max(0.6, pupilR * 0.35), fill: "#ffffff", opacity: 0.8 }, "lshine") : null
|
176
|
-
] });
|
177
|
-
})(),
|
178
|
-
(() => {
|
179
|
-
const ex = cx + eyeOffsetX;
|
180
|
-
const ey = cy - eyeOffsetY;
|
181
|
-
switch (eyeShape) {
|
182
|
-
case "ellipse":
|
183
|
-
return /* @__PURE__ */ jsx("ellipse", { cx: ex, cy: ey, rx: eyeR * 1.1, ry: eyeR * 0.7, fill: color }, "re");
|
184
|
-
case "line":
|
185
|
-
return /* @__PURE__ */ jsx("line", { x1: ex - eyeR, y1: ey, x2: ex + eyeR, y2: ey, stroke: color, strokeWidth: Math.max(1, Math.round(eyeR * 0.4)), strokeLinecap: "round" }, "rl");
|
186
|
-
case "wink":
|
187
|
-
return /* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: eyeR, fill: color }, "rw");
|
188
|
-
case "sleepy":
|
189
|
-
return /* @__PURE__ */ jsx("ellipse", { cx: ex, cy: ey, rx: eyeR * 1.05, ry: eyeR * 0.45, fill: color }, "rs");
|
190
|
-
case "surprised":
|
191
|
-
return /* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: eyeR * 1.1, fill: color }, "rsp");
|
192
|
-
default:
|
193
|
-
return /* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: eyeR, fill: color }, "rc");
|
194
|
-
}
|
195
|
-
})(),
|
196
|
-
(() => {
|
197
|
-
const ex = cx + eyeOffsetX;
|
198
|
-
const ey = cy - eyeOffsetY;
|
199
|
-
if (eyeShape === "line" || eyeShape === "wink" && rand() > 0.2) {
|
200
|
-
if (eyeShape === "line") return null;
|
201
|
-
}
|
202
|
-
if (eyeShape === "sleepy") {
|
203
|
-
return /* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: Math.max(1, pupilR * 0.6), fill: finalPupilColor }, "rps");
|
204
|
-
}
|
205
|
-
if (eyeShape === "wink") {
|
206
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
207
|
-
/* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: pupilR, fill: finalPupilColor }, "rp"),
|
208
|
-
eyeShine ? /* @__PURE__ */ jsx("circle", { cx: ex - pupilR * 0.4, cy: ey - pupilR * 0.6, r: Math.max(0.6, pupilR * 0.35), fill: "#ffffff", opacity: 0.8 }, "rshine") : null
|
209
|
-
] });
|
210
|
-
}
|
211
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
212
|
-
/* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: pupilR, fill: finalPupilColor }, "rp"),
|
213
|
-
eyeShine ? /* @__PURE__ */ jsx("circle", { cx: ex - pupilR * 0.4, cy: ey - pupilR * 0.6, r: Math.max(0.6, pupilR * 0.35), fill: "#ffffff", opacity: 0.8 }, "rshine2") : null
|
214
|
-
] });
|
215
|
-
})()
|
216
|
-
] });
|
217
|
-
const mouth = (() => {
|
218
|
-
switch (mouthShape) {
|
219
|
-
case "frown":
|
220
|
-
return /* @__PURE__ */ jsx("path", { d: mouthPathFrown, stroke: color, strokeWidth: mouthStroke, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" });
|
221
|
-
case "flat":
|
222
|
-
return /* @__PURE__ */ jsx("line", { x1: x0, y1: my, x2: x1, y2: my, stroke: color, strokeWidth: Math.max(1, Math.round(mouthStroke * 0.9)), strokeLinecap: "round" });
|
223
|
-
case "zigzag":
|
224
|
-
return /* @__PURE__ */ jsx("path", { d: mouthPathZigzag, stroke: color, strokeWidth: Math.max(1, Math.round(mouthStroke * 0.9)), fill: "none", strokeLinecap: "round", strokeLinejoin: "round" });
|
225
|
-
default:
|
226
|
-
return /* @__PURE__ */ jsx("path", { d: mouthPathSmile, stroke: color, strokeWidth: mouthStroke, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" });
|
227
|
-
}
|
228
|
-
})();
|
229
|
-
return /* @__PURE__ */ jsxs("g", { children: [
|
230
|
-
eyes,
|
231
|
-
/* @__PURE__ */ jsx("g", { children: mouth })
|
107
|
+
const cxQ = cx;
|
108
|
+
const cyQ = my + r * (-0.25 * mouthCurve - 0.1);
|
109
|
+
const d = `M ${x0} ${my} Q ${cxQ} ${cyQ} ${x1} ${my}`;
|
110
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
111
|
+
/* @__PURE__ */ jsx("circle", { cx: cx - eyeOffsetX, cy: cy - eyeOffsetY, r: eyeR, fill: color }),
|
112
|
+
/* @__PURE__ */ jsx("circle", { cx: cx + eyeOffsetX, cy: cy - eyeOffsetY, r: eyeR, fill: color }),
|
113
|
+
/* @__PURE__ */ jsx("path", { d, stroke: color, strokeWidth: mouthStroke, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" })
|
232
114
|
] });
|
233
115
|
}
|
234
116
|
function Overlays({
|
@@ -272,6 +154,7 @@ function Overlays({
|
|
272
154
|
return /* @__PURE__ */ jsx("path", { d: `M ${x0} ${cy - r * 0.2} A ${r} ${r} 0 0 1 ${x1} ${cy - r * 0.2} L ${x1} ${cy + r * 0.15} A ${r} ${r} 0 0 0 ${x0} ${cy + r * 0.15} Z`, fill: a1 });
|
273
155
|
case "wave":
|
274
156
|
return /* @__PURE__ */ jsx("path", { d: `M ${x0} ${cy - r * 0.3} C ${cx - r * 0.6} ${cy - r * 0.8}, ${cx - r * 0.2} ${cy + r * 0.1}, ${cx} ${cy} S ${cx + r * 0.6} ${cy + r * 0.8}, ${x1} ${cy + r * 0.3} L ${x1} ${y1} L ${x0} ${y1} Z`, fill: a1 });
|
157
|
+
// NEW variant: large half/diagonal cut (looks like attached image)
|
275
158
|
case "half": {
|
276
159
|
const diag = rand() > 0.4;
|
277
160
|
if (diag) {
|
@@ -300,12 +183,7 @@ function Avatar({
|
|
300
183
|
variant = "auto",
|
301
184
|
className,
|
302
185
|
style,
|
303
|
-
title
|
304
|
-
// simplified feature props
|
305
|
-
eyeShape,
|
306
|
-
mouthShape,
|
307
|
-
pupilColor,
|
308
|
-
eyeShine
|
186
|
+
title
|
309
187
|
}) {
|
310
188
|
const shape = headShape ?? (square ? "square" : "circle");
|
311
189
|
const rand = React.useMemo(() => rngFromSeed(String(name)), [name]);
|
@@ -363,33 +241,10 @@ function Avatar({
|
|
363
241
|
cells,
|
364
242
|
/* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx("clipPath", { id: clipId, children: shape === "square" ? /* @__PURE__ */ jsx("rect", { x: cx - r, y: cy - r, width: 2 * r, height: 2 * r, rx: Math.max(4, r * 0.12) }) : /* @__PURE__ */ jsx("circle", { cx, cy, r }) }) }),
|
365
243
|
/* @__PURE__ */ jsxs("g", { clipPath: `url(#${clipId})`, children: [
|
366
|
-
shape === "square" ? /* @__PURE__ */ jsx(
|
367
|
-
"rect",
|
368
|
-
{
|
369
|
-
x: cx - r,
|
370
|
-
y: cy - r,
|
371
|
-
width: 2 * r,
|
372
|
-
height: 2 * r,
|
373
|
-
rx: Math.max(4, r * 0.12),
|
374
|
-
fill: base
|
375
|
-
}
|
376
|
-
) : /* @__PURE__ */ jsx("circle", { cx, cy, r, fill: base }),
|
244
|
+
shape === "square" ? /* @__PURE__ */ jsx("rect", { x: cx - r, y: cy - r, width: 2 * r, height: 2 * r, rx: Math.max(4, r * 0.12), fill: base }) : /* @__PURE__ */ jsx("circle", { cx, cy, r, fill: base }),
|
377
245
|
/* @__PURE__ */ jsx(Overlays, { cx, cy, r, a1, a2, variant: chosenVariant, shape, rand })
|
378
246
|
] }),
|
379
|
-
/* @__PURE__ */ jsx(
|
380
|
-
Face,
|
381
|
-
{
|
382
|
-
cx,
|
383
|
-
cy,
|
384
|
-
r,
|
385
|
-
color: faceColor,
|
386
|
-
eyeShape,
|
387
|
-
mouthShape,
|
388
|
-
pupilColor: pupilColor ?? "auto",
|
389
|
-
eyeShine,
|
390
|
-
rand
|
391
|
-
}
|
392
|
-
)
|
247
|
+
/* @__PURE__ */ jsx(Face, { cx, cy, r, color: faceColor, rand })
|
393
248
|
]
|
394
249
|
}
|
395
250
|
);
|
package/dist/index.mjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/Avatar.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport palettes100 from \"nice-color-palettes\";\r\n\r\nexport type HeadShape = \"circle\" | \"square\";\r\nexport type Variant =\r\n | \"auto\"\r\n | \"plain\"\r\n | \"split\"\r\n | \"swoop\"\r\n | \"diagonal\"\r\n | \"cap\"\r\n | \"crescent\"\r\n | \"band\"\r\n | \"corner\"\r\n | \"ring\"\r\n | \"arc\"\r\n | \"wave\"\r\n | \"half\";\r\nexport type AlignX = \"left\" | \"center\" | \"right\";\r\nexport type AlignY = \"top\" | \"center\" | \"bottom\";\r\n\r\nexport type FaceProps = {\r\n cx: number;\r\n cy: number;\r\n r: number;\r\n color: string;\r\n eyeShape?: \"circle\" | \"ellipse\" | \"line\" | \"wink\" | \"sleepy\" | \"surprised\" | \"random\";\r\n mouthShape?: \"smile\" | \"frown\" | \"flat\" | \"zigzag\" | \"random\";\r\n pupilColor?: string | \"auto\";\r\n eyeShine?: boolean | \"random\";\r\n rand: () => number;\r\n};\r\n\r\nexport type AvatarProps = {\r\n name: string;\r\n\r\n // pixel background\r\n size?: number;\r\n pixelSize?: number;\r\n mirrored?: boolean;\r\n bg?: [string, string] | string | \"random\";\r\n\r\n // character controls\r\n headShape?: HeadShape;\r\n square?: boolean; // deprecated\r\n alignX?: AlignX;\r\n alignY?: AlignY;\r\n padding?: number;\r\n\r\n colors?: string | [string, string] | [string, string, string] | \"random\";\r\n variant?: Variant;\r\n\r\n // new feature props (optional)\r\n eyeShape?: FaceProps[\"eyeShape\"];\r\n mouthShape?: FaceProps[\"mouthShape\"];\r\n pupilColor?: string | \"auto\";\r\n eyeShine?: boolean;\r\n\r\n // styling/a11y\r\n className?: string;\r\n style?: React.CSSProperties;\r\n title?: string;\r\n};\r\n\r\n//\r\n// Deterministic RNG (seeded)\r\n// (unchanged from original)\r\nfunction cyrb128(str: string) {\r\n let h1 = 1779033703,\r\n h2 = 3144134277,\r\n h3 = 1013904242,\r\n h4 = 2773480762;\r\n for (let i = 0, k; i < str.length; i++) {\r\n k = str.charCodeAt(i);\r\n h1 = h2 ^ Math.imul(h1 ^ k, 597399067);\r\n h2 = h3 ^ Math.imul(h2 ^ k, 2869860233);\r\n h3 = h4 ^ Math.imul(h3 ^ k, 951274213);\r\n h4 = h1 ^ Math.imul(h4 ^ k, 2716044179);\r\n }\r\n h1 = Math.imul(h3 ^ (h1 >>> 18), 597399067);\r\n h2 = Math.imul(h4 ^ (h2 >>> 22), 2869860233);\r\n h3 = Math.imul(h1 ^ (h3 >>> 17), 951274213);\r\n h4 = Math.imul(h2 ^ (h4 >>> 19), 2716044179);\r\n return [(h1 ^ h2 ^ h3 ^ h4) >>> 0, (h2 ^ h1) >>> 0, (h3 ^ h1) >>> 0, (h4 ^ h1) >>> 0];\r\n}\r\nfunction sfc32(a: number, b: number, c: number, d: number) {\r\n return function () {\r\n a >>>= 0;\r\n b >>>= 0;\r\n c >>>= 0;\r\n d >>>= 0;\r\n let t = (a + b) | 0;\r\n a = b ^ (b >>> 9);\r\n b = (c + (c << 3)) | 0;\r\n c = (c << 21) | (c >>> 11);\r\n d = (d + 1) | 0;\r\n t = (t + d) | 0;\r\n c = (c + t) | 0;\r\n return (t >>> 0) / 4294967296;\r\n };\r\n}\r\nfunction rngFromSeed(seed: string) {\r\n const [a, b, c, d] = cyrb128(seed || \"pixelpeeps\");\r\n return sfc32(a, b, c, d);\r\n}\r\nfunction pick<T>(rand: () => number, arr: T[]) {\r\n return arr[Math.floor(rand() * arr.length)];\r\n}\r\n\r\n//\r\n// Color helpers (unchanged)\r\n//\r\nfunction hexToRgb(hex: string) {\r\n const h = hex.replace(\"#\", \"\");\r\n const full = h.length === 3 ? h.split(\"\").map((c) => c + c).join(\"\") : h;\r\n const n = parseInt(full, 16);\r\n return { r: (n >> 16) & 255, g: (n >> 8) & 255, b: n & 255 };\r\n}\r\nfunction rgbToHex(r: number, g: number, b: number) {\r\n return \"#\" + [r, g, b].map((v) => v.toString(16).padStart(2, \"0\")).join(\"\");\r\n}\r\nfunction shade(hex: string, percent: number) {\r\n const { r, g, b } = hexToRgb(hex);\r\n const t = percent < 0 ? 0 : 255;\r\n const p = Math.abs(percent);\r\n return rgbToHex(\r\n Math.round((t - r) * p) + r,\r\n Math.round((t - g) * p) + g,\r\n Math.round((t - b) * p) + b\r\n );\r\n}\r\nfunction yiq(hex: string) {\r\n const { r, g, b } = hexToRgb(hex);\r\n return (r * 299 + g * 587 + b * 114) / 1000;\r\n}\r\nfunction bestFeatureColor(base: string) {\r\n return yiq(base) > 150 ? \"#111827\" : \"#ffffff\";\r\n}\r\n\r\n//\r\n// Palettes: use nice-color-palettes (top 100)\r\n//\r\nconst NICE_PALETTES: string[][] =\r\n palettes100 && Array.isArray(palettes100) ? (palettes100 as string[][]) : [[\"#73a9ff\", \"#fef3c7\", \"#ffd6a5\", \"#d4b4ff\", \"#a7f3d0\"]];\r\n\r\nfunction resolveBg(rand: () => number, bg?: AvatarProps[\"bg\"]): [string, string] {\r\n if (!bg || bg === \"random\") {\r\n return pick(rand, NICE_PALETTES).slice(0, 2) as [string, string];\r\n }\r\n if (Array.isArray(bg)) return [bg[0], bg[1] ?? bg[0]];\r\n return [shade(bg, 0.12), shade(bg, -0.06)];\r\n}\r\nfunction resolveCharColors(rand: () => number, colors?: AvatarProps[\"colors\"]): [string, string, string] {\r\n if (!colors || colors === \"random\") {\r\n const pal = pick(rand, NICE_PALETTES);\r\n const base = pal[0];\r\n const a1 = pal[1] ?? shade(base, 0.25);\r\n const a2 = pal[2] ?? shade(base, -0.2);\r\n return [base, a1, a2];\r\n }\r\n if (typeof colors === \"string\") {\r\n return [colors, shade(colors, 0.25), shade(colors, -0.2)];\r\n }\r\n const base = (colors as string[])[0];\r\n const a1 = (colors as string[])[1] ?? shade(base, 0.25);\r\n const a2 = (colors as string[])[2] ?? shade(base, -0.2);\r\n return [base, a1, a2];\r\n}\r\n\r\n//\r\n// Face component: simplified features\r\n//\r\nfunction Face({\r\n cx,\r\n cy,\r\n r,\r\n color,\r\n eyeShape: eyeShapeProp,\r\n mouthShape: mouthShapeProp,\r\n pupilColor,\r\n eyeShine: eyeShineProp,\r\n rand,\r\n}: FaceProps) {\r\n // 🌿 deterministic pick helpers\r\n const decide = <T,>(prop: T | \"random\" | undefined, opts: T[]) => {\r\n if (prop === undefined || prop === \"random\") return pick(rand, opts as any) as T;\r\n return prop as T;\r\n };\r\n\r\n // pick features deterministically if prop is \"random\"/undefined\r\n const eyeShape = decide(eyeShapeProp ?? \"random\", [\"circle\", \"ellipse\", \"line\", \"wink\", \"sleepy\", \"surprised\"]);\r\n const mouthShape = decide(mouthShapeProp ?? \"random\", [\"smile\", \"frown\", \"flat\", \"zigzag\"]);\r\n const eyeShine = decide(eyeShineProp ?? \"random\", [true, false]);\r\n\r\n // geometry\r\n const eyeOffsetX = r * (0.34 + rand() * 0.06);\r\n const eyeOffsetY = r * (0.20 + rand() * 0.06);\r\n const eyeR = Math.max(2, Math.round(r * (0.08 + rand() * 0.02)));\r\n const pupilR = Math.max(1, Math.round(eyeR * (0.45 + rand() * 0.25)));\r\n const mouthWidth = r * (0.7 + rand() * 0.3);\r\n const mouthLift = r * (0.18 + rand() * 0.16);\r\n const mouthStroke = Math.max(1, Math.round(r * 0.06));\r\n\r\n // pupil color\r\n let finalPupilColor = \"#111827\";\r\n if (pupilColor && pupilColor !== \"auto\") finalPupilColor = pupilColor;\r\n else finalPupilColor = yiq(color) > 150 ? \"#111827\" : \"#ffffff\";\r\n\r\n // helper positions\r\n const x0 = cx - mouthWidth / 2;\r\n const x1 = cx + mouthWidth / 2;\r\n const my = cy + mouthLift;\r\n\r\n // small helpers to draw various mouth shapes\r\n const mouthPathSmile = (() => {\r\n const mouthCurve = (rand() - 0.5) * 0.8;\r\n const cxQ = cx;\r\n const cyQ = my + r * (-0.25 * mouthCurve - 0.1);\r\n return `M ${x0} ${my} Q ${cxQ} ${cyQ} ${x1} ${my}`;\r\n })();\r\n\r\n const mouthPathFrown = (() => {\r\n const mouthCurve = (rand() - 0.5) * 0.8;\r\n const cxQ = cx;\r\n const cyQ = my + r * (0.25 * mouthCurve + 0.08); // control point below -> frown\r\n return `M ${x0} ${my} Q ${cxQ} ${cyQ} ${x1} ${my}`;\r\n })();\r\n\r\n const mouthPathZigzag = (() => {\r\n // create small zigzag across mouth width\r\n const segs = 6;\r\n const step = mouthWidth / (segs - 1);\r\n let d = `M ${x0} ${my}`;\r\n for (let i = 1; i < segs; i++) {\r\n const px = x0 + step * i;\r\n const py = my + (i % 2 === 0 ? -r * 0.08 : r * 0.08);\r\n d += ` L ${px} ${py}`;\r\n }\r\n return d;\r\n })();\r\n\r\n // build JSX pieces\r\n const eyes = (\r\n <>\r\n {/* left eye */}\r\n {(() => {\r\n const ex = cx - eyeOffsetX;\r\n const ey = cy - eyeOffsetY;\r\n\r\n switch (eyeShape) {\r\n case \"ellipse\":\r\n return (\r\n <ellipse cx={ex} cy={ey} rx={eyeR * 1.1} ry={eyeR * 0.7} fill={color} key=\"le\" />\r\n );\r\n case \"line\":\r\n return <line x1={ex - eyeR} y1={ey} x2={ex + eyeR} y2={ey} stroke={color} strokeWidth={Math.max(1, Math.round(eyeR * 0.4))} strokeLinecap=\"round\" key=\"ll\" />;\r\n case \"wink\":\r\n // wink left = closed (line)\r\n return <line x1={ex - eyeR} y1={ey} x2={ex + eyeR} y2={ey} stroke={color} strokeWidth={Math.max(1, Math.round(eyeR * 0.4))} strokeLinecap=\"round\" key=\"lw\" />;\r\n case \"sleepy\":\r\n return (\r\n <>\r\n <ellipse cx={ex} cy={ey} rx={eyeR * 1.05} ry={eyeR * 0.45} fill={color} key=\"ls\" />\r\n </>\r\n );\r\n case \"surprised\":\r\n return <circle cx={ex} cy={ey} r={eyeR * 1.1} fill={color} key=\"lsp\" />;\r\n default:\r\n // circle\r\n return <circle cx={ex} cy={ey} r={eyeR} fill={color} key=\"lc\" />;\r\n }\r\n })()}\r\n\r\n {/* left pupil */}\r\n {(() => {\r\n const ex = cx - eyeOffsetX;\r\n const ey = cy - eyeOffsetY;\r\n // if line/wink (closed) skip pupil\r\n if (eyeShape === \"line\" || eyeShape === \"wink\") return null;\r\n if (eyeShape === \"sleepy\") {\r\n // smaller pupil\r\n return <circle cx={ex} cy={ey} r={Math.max(1, pupilR * 0.6)} fill={finalPupilColor} key=\"lps\" />;\r\n }\r\n return (\r\n <>\r\n <circle cx={ex} cy={ey} r={pupilR} fill={finalPupilColor} key=\"lp\" />\r\n {eyeShine ? <circle cx={ex - pupilR * 0.4} cy={ey - pupilR * 0.6} r={Math.max(0.6, pupilR * 0.35)} fill=\"#ffffff\" opacity={0.8} key=\"lshine\" /> : null}\r\n </>\r\n );\r\n })()}\r\n\r\n {/* right eye */}\r\n {(() => {\r\n const ex = cx + eyeOffsetX;\r\n const ey = cy - eyeOffsetY;\r\n\r\n switch (eyeShape) {\r\n case \"ellipse\":\r\n return (\r\n <ellipse cx={ex} cy={ey} rx={eyeR * 1.1} ry={eyeR * 0.7} fill={color} key=\"re\" />\r\n );\r\n case \"line\":\r\n return <line x1={ex - eyeR} y1={ey} x2={ex + eyeR} y2={ey} stroke={color} strokeWidth={Math.max(1, Math.round(eyeR * 0.4))} strokeLinecap=\"round\" key=\"rl\" />;\r\n case \"wink\":\r\n // wink right -> keep open; variety: one eye wink looks cute\r\n return <circle cx={ex} cy={ey} r={eyeR} fill={color} key=\"rw\" />;\r\n case \"sleepy\":\r\n return <ellipse cx={ex} cy={ey} rx={eyeR * 1.05} ry={eyeR * 0.45} fill={color} key=\"rs\" />;\r\n case \"surprised\":\r\n return <circle cx={ex} cy={ey} r={eyeR * 1.1} fill={color} key=\"rsp\" />;\r\n default:\r\n return <circle cx={ex} cy={ey} r={eyeR} fill={color} key=\"rc\" />;\r\n }\r\n })()}\r\n\r\n {/* right pupil */}\r\n {(() => {\r\n const ex = cx + eyeOffsetX;\r\n const ey = cy - eyeOffsetY;\r\n if (eyeShape === \"line\" || (eyeShape === \"wink\" && rand() > 0.2)) {\r\n // sometimes wink will be left eye closed; we've drawn right open earlier; if right is closed skip\r\n if (eyeShape === \"line\") return null;\r\n }\r\n if (eyeShape === \"sleepy\") {\r\n return <circle cx={ex} cy={ey} r={Math.max(1, pupilR * 0.6)} fill={finalPupilColor} key=\"rps\" />;\r\n }\r\n if (eyeShape === \"wink\") {\r\n // keep pupil\r\n return (\r\n <>\r\n <circle cx={ex} cy={ey} r={pupilR} fill={finalPupilColor} key=\"rp\" />\r\n {eyeShine ? <circle cx={ex - pupilR * 0.4} cy={ey - pupilR * 0.6} r={Math.max(0.6, pupilR * 0.35)} fill=\"#ffffff\" opacity={0.8} key=\"rshine\" /> : null}\r\n </>\r\n );\r\n }\r\n return (\r\n <>\r\n <circle cx={ex} cy={ey} r={pupilR} fill={finalPupilColor} key=\"rp\" />\r\n {eyeShine ? <circle cx={ex - pupilR * 0.4} cy={ey - pupilR * 0.6} r={Math.max(0.6, pupilR * 0.35)} fill=\"#ffffff\" opacity={0.8} key=\"rshine2\" /> : null}\r\n </>\r\n );\r\n })()}\r\n </>\r\n );\r\n\r\n // mouth drawing based on mouthShape\r\n const mouth = (() => {\r\n switch (mouthShape) {\r\n case \"frown\":\r\n return <path d={mouthPathFrown} stroke={color} strokeWidth={mouthStroke} fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />;\r\n case \"flat\":\r\n return <line x1={x0} y1={my} x2={x1} y2={my} stroke={color} strokeWidth={Math.max(1, Math.round(mouthStroke * 0.9))} strokeLinecap=\"round\" />;\r\n case \"zigzag\":\r\n return <path d={mouthPathZigzag} stroke={color} strokeWidth={Math.max(1, Math.round(mouthStroke * 0.9))} fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />;\r\n default:\r\n return <path d={mouthPathSmile} stroke={color} strokeWidth={mouthStroke} fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />;\r\n }\r\n })();\r\n\r\n return (\r\n <g>\r\n {eyes}\r\n <g>{mouth}</g>\r\n </g>\r\n );\r\n}\r\n\r\n//\r\n// Overlays (variants) -- unchanged, but kept in file\r\n//\r\nfunction Overlays({\r\n cx,\r\n cy,\r\n r,\r\n a1,\r\n a2,\r\n variant,\r\n shape,\r\n rand,\r\n}: {\r\n cx: number;\r\n cy: number;\r\n r: number;\r\n a1: string;\r\n a2: string;\r\n variant: Exclude<Variant, \"auto\">;\r\n shape: HeadShape;\r\n rand: () => number;\r\n}) {\r\n const x0 = cx - r,\r\n y0 = cy - r,\r\n x1 = cx + r,\r\n y1 = cy + r;\r\n\r\n // deterministic options\r\n const left = rand() > 0.5;\r\n const tlbr = rand() > 0.5;\r\n const horiz = rand() > 0.5;\r\n const cornerTL = rand() > 0.5;\r\n\r\n switch (variant) {\r\n case \"plain\":\r\n return null;\r\n\r\n case \"split\":\r\n return <rect x={left ? x0 : cx} y={y0} width={r} height={2 * r} fill={a1} />;\r\n\r\n case \"diagonal\":\r\n return tlbr ? <polygon points={`${x0},${y0} ${x1},${y0} ${x1},${y1}`} fill={a1} /> : <polygon points={`${x0},${y0} ${x0},${y1} ${x1},${y1}`} fill={a1} />;\r\n\r\n case \"cap\":\r\n return <path d={`M ${x0} ${y0 + r * 0.25} L ${x1} ${y0} L ${x1} ${y0 + r * 0.6} Q ${cx} ${y0 + r * 0.85} ${x0} ${y0 + r * 0.6} Z`} fill={a1} />;\r\n\r\n case \"swoop\":\r\n return <path d={`M ${x0} ${cy - r * 0.55} Q ${cx} ${cy - r * 1.1} ${x1} ${cy - r * 0.35} L ${x1} ${y1} Q ${cx} ${cy + r * 0.95} ${x0} ${y1} Z`} fill={a1} />;\r\n\r\n case \"crescent\":\r\n return (\r\n <>\r\n <circle cx={left ? cx - r * 0.55 : cx + r * 0.55} cy={cy} r={r * 0.95} fill={a2} />\r\n <circle cx={left ? cx - r * 0.52 : cx + r * 0.52} cy={cy} r={r * 0.75} fill=\"transparent\" stroke={shade(a2, -0.25)} strokeWidth={r * 0.08} />\r\n </>\r\n );\r\n\r\n case \"band\":\r\n return horiz ? <rect x={x0} y={cy - r * 0.35} width={2 * r} height={r * 0.5} fill={a1} /> : <rect x={cx - r * 0.35} y={y0} width={r * 0.5} height={2 * r} fill={a1} />;\r\n\r\n case \"corner\":\r\n return cornerTL ? <polygon points={`${x0},${y0} ${x0 + r * 0.9},${y0} ${x0},${y0 + r * 0.9}`} fill={a1} /> : <polygon points={`${x1},${y0} ${x1 - r * 0.9},${y0} ${x1},${y0 + r * 0.9}`} fill={a1} />;\r\n\r\n case \"ring\":\r\n return shape === \"circle\" ? <circle cx={cx} cy={cy} r={r * 0.86} fill=\"none\" stroke={a1} strokeWidth={r * 0.18} /> : <rect x={cx - r * 0.86} y={cy - r * 0.86} width={2 * r * 0.86} height={2 * r * 0.86} rx={r * 0.18} fill=\"none\" stroke={a1} strokeWidth={r * 0.18} />;\r\n\r\n case \"arc\":\r\n return <path d={`M ${x0} ${cy - r * 0.2} A ${r} ${r} 0 0 1 ${x1} ${cy - r * 0.2} L ${x1} ${cy + r * 0.15} A ${r} ${r} 0 0 0 ${x0} ${cy + r * 0.15} Z`} fill={a1} />;\r\n\r\n case \"wave\":\r\n return <path d={`M ${x0} ${cy - r * 0.3} C ${cx - r * 0.6} ${cy - r * 0.8}, ${cx - r * 0.2} ${cy + r * 0.1}, ${cx} ${cy} S ${cx + r * 0.6} ${cy + r * 0.8}, ${x1} ${cy + r * 0.3} L ${x1} ${y1} L ${x0} ${y1} Z`} fill={a1} />;\r\n\r\n case \"half\": {\r\n const diag = rand() > 0.4;\r\n if (diag) {\r\n return <polygon points={`${x0},${y0} ${x1},${y0} ${x1},${cy + (left ? r * 0.1 : -r * 0.1)}`} fill={a1} />;\r\n } else {\r\n const offset = left ? -r * 0.18 : r * 0.18;\r\n return <circle cx={cx + offset} cy={cy} r={r * 0.95} fill={a1} />;\r\n }\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\n//\r\n// Main component (simplified props)\r\n//\r\nexport default function Avatar({\r\n name,\r\n size = 128,\r\n pixelSize = 12,\r\n mirrored = true,\r\n bg,\r\n colors,\r\n headShape,\r\n square,\r\n alignX = \"center\",\r\n alignY = \"center\",\r\n padding,\r\n variant = \"auto\",\r\n className,\r\n style,\r\n title,\r\n\r\n // simplified feature props\r\n eyeShape,\r\n mouthShape,\r\n pupilColor,\r\n eyeShine,\r\n}: AvatarProps) {\r\n const shape: HeadShape = headShape ?? (square ? \"square\" : \"circle\");\r\n const rand = React.useMemo(() => rngFromSeed(String(name)), [name]);\r\n\r\n // colors\r\n const [bg1, bg2] = React.useMemo(() => resolveBg(rand, bg), [rand, bg]);\r\n const [base, a1, a2] = React.useMemo(() => resolveCharColors(rand, colors), [rand, colors]);\r\n const faceColor = bestFeatureColor(base);\r\n\r\n // Pixel grid\r\n const grid = Math.max(6, Math.floor(size / pixelSize));\r\n const tile = Math.ceil(size / grid);\r\n\r\n // geometry\r\n const autoPad = Math.max(4, Math.round(size * (0.06 + rand() * 0.02)));\r\n const pad = padding ?? autoPad;\r\n const baseR = Math.floor(size * (0.36 + rand() * 0.04));\r\n const maxR = Math.floor(size / 2 - pad);\r\n const r = Math.max(8, Math.min(baseR, maxR));\r\n\r\n let cx = size / 2;\r\n let cy = size / 2;\r\n if (alignX === \"left\") cx = r + pad;\r\n if (alignX === \"right\") cx = size - (r + pad);\r\n if (alignY === \"top\") cy = r + pad;\r\n if (alignY === \"bottom\") cy = size - (r + pad);\r\n\r\n // pixel pattern\r\n const cells: React.ReactElement[] = [];\r\n const cols = mirrored ? Math.ceil(grid / 2) : grid;\r\n for (let y = 0; y < grid; y++) {\r\n for (let x = 0; x < cols; x++) {\r\n const use = rand() > 0.5;\r\n const fill = use ? bg1 : bg2;\r\n const px = x * tile;\r\n const py = y * tile;\r\n cells.push(<rect key={`L${x},${y}`} x={px} y={py} width={tile} height={tile} fill={fill} />);\r\n if (mirrored) {\r\n const mx = grid - x - 1;\r\n const mpx = mx * tile;\r\n cells.push(<rect key={`R${mx},${y}`} x={mpx} y={py} width={tile} height={tile} fill={fill} />);\r\n }\r\n }\r\n }\r\n\r\n // variants\r\n const variants: Exclude<Variant, \"auto\">[] = [\"split\", \"swoop\", \"diagonal\", \"cap\", \"crescent\", \"band\", \"corner\", \"ring\", \"arc\", \"wave\", \"plain\", \"half\"];\r\n const chosenVariant: Exclude<Variant, \"auto\"> = variant === \"auto\" ? pick(rand, variants) : (variant as Exclude<Variant, \"auto\">);\r\n\r\n // clip path id\r\n const clipId = React.useMemo(() => {\r\n const [a, b, c, d] = cyrb128(`pp-shape-${name}-${shape}-${r}`);\r\n return `pps-${a.toString(16)}${b.toString(16)}${c.toString(16)}${d.toString(16)}`;\r\n }, [name, shape, r]);\r\n\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox={`0 0 ${size} ${size}`}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n role=\"img\"\r\n aria-label={title ?? `Avatar ${name}`}\r\n className={className}\r\n style={{ display: \"inline-block\", borderRadius: 12, ...style }}\r\n >\r\n {/* background grid */}\r\n <rect width={size} height={size} fill={bg1} />\r\n {cells}\r\n\r\n <defs>\r\n <clipPath id={clipId}>\r\n {shape === \"square\" ? (\r\n <rect x={cx - r} y={cy - r} width={2 * r} height={2 * r} rx={Math.max(4, r * 0.12)} />\r\n ) : (\r\n <circle cx={cx} cy={cy} r={r} />\r\n )}\r\n </clipPath>\r\n </defs>\r\n\r\n {/* head + overlays */}\r\n <g clipPath={`url(#${clipId})`}>\r\n {shape === \"square\" ? (\r\n <rect\r\n x={cx - r}\r\n y={cy - r}\r\n width={2 * r}\r\n height={2 * r}\r\n rx={Math.max(4, r * 0.12)}\r\n fill={base}\r\n />\r\n ) : (\r\n <circle cx={cx} cy={cy} r={r} fill={base} />\r\n )}\r\n\r\n <Overlays cx={cx} cy={cy} r={r} a1={a1} a2={a2} variant={chosenVariant} shape={shape} rand={rand} />\r\n </g>\r\n\r\n {/* facial features: pass randomized or explicit props */}\r\n <Face\r\n cx={cx}\r\n cy={cy}\r\n r={r}\r\n color={faceColor}\r\n eyeShape={eyeShape}\r\n mouthShape={mouthShape}\r\n pupilColor={pupilColor ?? \"auto\"}\r\n eyeShine={eyeShine}\r\n rand={rand}\r\n />\r\n </svg>\r\n );\r\n}"],"mappings":"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","names":["base","a1","a2"]}
|
1
|
+
{"version":3,"sources":["../src/Avatar.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport palettes100 from \"nice-color-palettes\";\r\nexport type HeadShape = \"circle\" | \"square\";\r\nexport type Variant =\r\n | \"auto\"\r\n | \"plain\"\r\n | \"split\"\r\n | \"swoop\"\r\n | \"diagonal\"\r\n | \"cap\"\r\n | \"crescent\"\r\n | \"band\"\r\n | \"corner\"\r\n | \"ring\"\r\n | \"arc\"\r\n | \"wave\"\r\n | \"half\"; \r\nexport type AlignX = \"left\" | \"center\" | \"right\";\r\nexport type AlignY = \"top\" | \"center\" | \"bottom\";\r\n\r\nexport type AvatarProps = {\r\n name: string;\r\n\r\n // pixel background\r\n size?: number;\r\n pixelSize?: number;\r\n mirrored?: boolean;\r\n bg?: [string, string] | string | \"random\";\r\n\r\n // character controls\r\n headShape?: HeadShape;\r\n square?: boolean; // deprecated\r\n alignX?: AlignX;\r\n alignY?: AlignY;\r\n padding?: number;\r\n\r\n colors?: string | [string, string] | [string, string, string] | \"random\";\r\n variant?: Variant;\r\n\r\n // styling/a11y\r\n className?: string;\r\n style?: React.CSSProperties;\r\n title?: string;\r\n};\r\n\r\n//\r\n// Deterministic RNG (seeded)\r\n//\r\nfunction cyrb128(str: string) {\r\n let h1 = 1779033703, h2 = 3144134277, h3 = 1013904242, h4 = 2773480762;\r\n for (let i = 0, k; i < str.length; i++) {\r\n k = str.charCodeAt(i);\r\n h1 = h2 ^ Math.imul(h1 ^ k, 597399067);\r\n h2 = h3 ^ Math.imul(h2 ^ k, 2869860233);\r\n h3 = h4 ^ Math.imul(h3 ^ k, 951274213);\r\n h4 = h1 ^ Math.imul(h4 ^ k, 2716044179);\r\n }\r\n h1 = Math.imul(h3 ^ (h1 >>> 18), 597399067);\r\n h2 = Math.imul(h4 ^ (h2 >>> 22), 2869860233);\r\n h3 = Math.imul(h1 ^ (h3 >>> 17), 951274213);\r\n h4 = Math.imul(h2 ^ (h4 >>> 19), 2716044179);\r\n return [(h1 ^ h2 ^ h3 ^ h4) >>> 0, (h2 ^ h1) >>> 0, (h3 ^ h1) >>> 0, (h4 ^ h1) >>> 0];\r\n}\r\nfunction sfc32(a: number, b: number, c: number, d: number) {\r\n return function () {\r\n a >>>= 0; b >>>= 0; c >>>= 0; d >>>= 0;\r\n let t = (a + b) | 0;\r\n a = b ^ (b >>> 9);\r\n b = (c + (c << 3)) | 0;\r\n c = (c << 21) | (c >>> 11);\r\n d = (d + 1) | 0;\r\n t = (t + d) | 0;\r\n c = (c + t) | 0;\r\n return (t >>> 0) / 4294967296;\r\n };\r\n}\r\nfunction rngFromSeed(seed: string) {\r\n const [a, b, c, d] = cyrb128(seed || \"pixelpeeps\");\r\n return sfc32(a, b, c, d);\r\n}\r\nfunction pick<T>(rand: () => number, arr: T[]) {\r\n return arr[Math.floor(rand() * arr.length)];\r\n}\r\n\r\n//\r\n// Color helpers\r\n//\r\nfunction hexToRgb(hex: string) {\r\n const h = hex.replace(\"#\", \"\");\r\n const full = h.length === 3 ? h.split(\"\").map(c => c + c).join(\"\") : h;\r\n const n = parseInt(full, 16);\r\n return { r: (n >> 16) & 255, g: (n >> 8) & 255, b: n & 255 };\r\n}\r\nfunction rgbToHex(r: number, g: number, b: number) {\r\n return \"#\" + [r, g, b].map(v => v.toString(16).padStart(2, \"0\")).join(\"\");\r\n}\r\nfunction shade(hex: string, percent: number) {\r\n const { r, g, b } = hexToRgb(hex);\r\n const t = percent < 0 ? 0 : 255;\r\n const p = Math.abs(percent);\r\n return rgbToHex(\r\n Math.round((t - r) * p) + r,\r\n Math.round((t - g) * p) + g,\r\n Math.round((t - b) * p) + b\r\n );\r\n}\r\nfunction yiq(hex: string) {\r\n const { r, g, b } = hexToRgb(hex);\r\n return (r * 299 + g * 587 + b * 114) / 1000;\r\n}\r\nfunction bestFeatureColor(base: string) {\r\n return yiq(base) > 150 ? \"#111827\" : \"#ffffff\";\r\n}\r\n\r\n//\r\n// Palettes: use nice-color-palettes (top 100)\r\n//\r\nconst NICE_PALETTES: string[][] = (palettes100 && Array.isArray(palettes100)) ? palettes100 as string[][] : [\r\n // fallback single palette\r\n [\"#73a9ff\", \"#fef3c7\", \"#ffd6a5\", \"#d4b4ff\", \"#a7f3d0\"]\r\n];\r\n\r\nfunction resolveBg(rand: () => number, bg?: AvatarProps[\"bg\"]): [string, string] {\r\n if (!bg || bg === \"random\") {\r\n return pick(rand, NICE_PALETTES).slice(0, 2) as [string, string];\r\n }\r\n if (Array.isArray(bg)) return [bg[0], bg[1] ?? bg[0]];\r\n // single hex -> auto shade pair\r\n return [shade(bg, 0.12), shade(bg, -0.06)];\r\n}\r\nfunction resolveCharColors(rand: () => number, colors?: AvatarProps[\"colors\"]): [string, string, string] {\r\n if (!colors || colors === \"random\") {\r\n const pal = pick(rand, NICE_PALETTES);\r\n const base = pal[0];\r\n const a1 = pal[1] ?? shade(base, 0.25);\r\n const a2 = pal[2] ?? shade(base, -0.2);\r\n return [base, a1, a2];\r\n }\r\n if (typeof colors === \"string\") {\r\n return [colors, shade(colors, 0.25), shade(colors, -0.2)];\r\n }\r\n const base = (colors as string[])[0];\r\n const a1 = (colors as string[])[1] ?? shade(base, 0.25);\r\n const a2 = (colors as string[])[2] ?? shade(base, -0.2);\r\n return [base, a1, a2];\r\n}\r\n\r\n//\r\n// Small face subcomponent: parametric mouth (fixed nice curve)\r\n//\r\nfunction Face({ cx, cy, r, color, rand }: { cx: number; cy: number; r: number; color: string; rand: () => number }) {\r\n const eyeOffsetX = r * (0.34 + rand() * 0.06); // small variation from seed\r\n const eyeOffsetY = r * (0.20 + rand() * 0.06);\r\n const eyeR = Math.max(2, Math.round(r * (0.08 + rand() * 0.02)));\r\n // Parametric mouth values from seed:\r\n const mouthWidth = r * (0.7 + rand() * 0.3); // 70-100%\r\n const mouthLift = r * (0.18 + rand() * 0.16); // 18-34%\r\n const mouthCurve = (rand() - 0.5) * 0.8; // -0.4..0.4 adjusts curvature (smile vs big smile)\r\n const mouthStroke = Math.max(1, Math.round(r * 0.06));\r\n\r\n // compute coordinates\r\n const x0 = cx - mouthWidth / 2;\r\n const x1 = cx + mouthWidth / 2;\r\n const my = cy + mouthLift;\r\n\r\n // quadratic control point to make a smooth curve (smile)\r\n const cxQ = cx;\r\n const cyQ = my + r * (-0.25 * mouthCurve - 0.1); // move control up or down by mouthCurve\r\n\r\n const d = `M ${x0} ${my} Q ${cxQ} ${cyQ} ${x1} ${my}`;\r\n\r\n return (\r\n <>\r\n <circle cx={cx - eyeOffsetX} cy={cy - eyeOffsetY} r={eyeR} fill={color} />\r\n <circle cx={cx + eyeOffsetX} cy={cy - eyeOffsetY} r={eyeR} fill={color} />\r\n <path d={d} stroke={color} strokeWidth={mouthStroke} fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n </>\r\n );\r\n}\r\n\r\n//\r\n// Overlays (variants) including new `half` variant\r\n//\r\nfunction Overlays({\r\n cx, cy, r, a1, a2, variant, shape, rand\r\n}: {\r\n cx: number; cy: number; r: number;\r\n a1: string; a2: string;\r\n variant: Exclude<Variant, \"auto\">;\r\n shape: HeadShape;\r\n rand: () => number;\r\n}) {\r\n const x0 = cx - r, y0 = cy - r, x1 = cx + r, y1 = cy + r;\r\n\r\n // deterministic options\r\n const left = rand() > 0.5;\r\n const tlbr = rand() > 0.5;\r\n const horiz = rand() > 0.5;\r\n const cornerTL = rand() > 0.5;\r\n\r\n switch (variant) {\r\n case \"plain\": return null;\r\n\r\n case \"split\":\r\n return <rect x={left ? x0 : cx} y={y0} width={r} height={2 * r} fill={a1} />;\r\n\r\n case \"diagonal\":\r\n return tlbr ? (\r\n <polygon points={`${x0},${y0} ${x1},${y0} ${x1},${y1}`} fill={a1} />\r\n ) : (\r\n <polygon points={`${x0},${y0} ${x0},${y1} ${x1},${y1}`} fill={a1} />\r\n );\r\n\r\n case \"cap\":\r\n return (\r\n <path d={`M ${x0} ${y0 + r * 0.25} L ${x1} ${y0} L ${x1} ${y0 + r * 0.6} Q ${cx} ${y0 + r * 0.85} ${x0} ${y0 + r * 0.6} Z`} fill={a1} />\r\n );\r\n\r\n case \"swoop\":\r\n return (\r\n <path d={`M ${x0} ${cy - r * 0.55} Q ${cx} ${cy - r * 1.1} ${x1} ${cy - r * 0.35} L ${x1} ${y1} Q ${cx} ${cy + r * 0.95} ${x0} ${y1} Z`} fill={a1} />\r\n );\r\n\r\n case \"crescent\":\r\n return (\r\n <>\r\n <circle cx={left ? cx - r * 0.55 : cx + r * 0.55} cy={cy} r={r * 0.95} fill={a2} />\r\n <circle cx={left ? cx - r * 0.52 : cx + r * 0.52} cy={cy} r={r * 0.75} fill=\"transparent\" stroke={shade(a2, -0.25)} strokeWidth={r * 0.08} />\r\n </>\r\n );\r\n\r\n case \"band\":\r\n return horiz ? (\r\n <rect x={x0} y={cy - r * 0.35} width={2 * r} height={r * 0.5} fill={a1} />\r\n ) : (\r\n <rect x={cx - r * 0.35} y={y0} width={r * 0.5} height={2 * r} fill={a1} />\r\n );\r\n\r\n case \"corner\":\r\n return cornerTL ? (\r\n <polygon points={`${x0},${y0} ${x0 + r * 0.9},${y0} ${x0},${y0 + r * 0.9}`} fill={a1} />\r\n ) : (\r\n <polygon points={`${x1},${y0} ${x1 - r * 0.9},${y0} ${x1},${y0 + r * 0.9}`} fill={a1} />\r\n );\r\n\r\n case \"ring\":\r\n return shape === \"circle\" ? (\r\n <circle cx={cx} cy={cy} r={r * 0.86} fill=\"none\" stroke={a1} strokeWidth={r * 0.18} />\r\n ) : (\r\n <rect x={cx - r * 0.86} y={cy - r * 0.86} width={2 * r * 0.86} height={2 * r * 0.86} rx={r * 0.18} fill=\"none\" stroke={a1} strokeWidth={r * 0.18} />\r\n );\r\n\r\n case \"arc\":\r\n return <path d={`M ${x0} ${cy - r * 0.2} A ${r} ${r} 0 0 1 ${x1} ${cy - r * 0.2} L ${x1} ${cy + r * 0.15} A ${r} ${r} 0 0 0 ${x0} ${cy + r * 0.15} Z`} fill={a1} />;\r\n\r\n case \"wave\":\r\n return <path d={`M ${x0} ${cy - r * 0.3} C ${cx - r * 0.6} ${cy - r * 0.8}, ${cx - r * 0.2} ${cy + r * 0.1}, ${cx} ${cy} S ${cx + r * 0.6} ${cy + r * 0.8}, ${x1} ${cy + r * 0.3} L ${x1} ${y1} L ${x0} ${y1} Z`} fill={a1} />;\r\n\r\n // NEW variant: large half/diagonal cut (looks like attached image)\r\n case \"half\": {\r\n // choose diag or simple half using rand\r\n const diag = rand() > 0.4;\r\n if (diag) {\r\n // diagonal wedge\r\n return <polygon points={`${x0},${y0} ${x1},${y0} ${x1},${cy + (left ? r * 0.1 : -r * 0.1)}`} fill={a1} />;\r\n } else {\r\n // simple semicircle overlay offset to left/right for crescent effect\r\n const offset = left ? -r * 0.18 : r * 0.18;\r\n return <circle cx={cx + offset} cy={cy} r={r * 0.95} fill={a1} />;\r\n }\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\n//\r\n// Main component\r\n//\r\nexport default function Avatar({\r\n name,\r\n size = 128,\r\n pixelSize = 12,\r\n mirrored = true,\r\n bg,\r\n colors,\r\n headShape,\r\n square,\r\n alignX = \"center\",\r\n alignY = \"center\",\r\n padding,\r\n variant = \"auto\",\r\n className,\r\n style,\r\n title,\r\n}: AvatarProps) {\r\n const shape: HeadShape = headShape ?? (square ? \"square\" : \"circle\");\r\n // single RNG for everything derived from seed (deterministic)\r\n const rand = React.useMemo(() => rngFromSeed(String(name)), [name]);\r\n\r\n // background and character colors chosen from nice palettes\r\n const [bg1, bg2] = React.useMemo(() => resolveBg(rand, bg), [rand, bg]);\r\n const [base, a1, a2] = React.useMemo(() => resolveCharColors(rand, colors), [rand, colors]);\r\n const faceColor = bestFeatureColor(base);\r\n\r\n // Pixel grid\r\n const grid = Math.max(6, Math.floor(size / pixelSize));\r\n const tile = Math.ceil(size / grid);\r\n\r\n // geometry/calculations (all derived from rand)\r\n const autoPad = Math.max(4, Math.round(size * (0.06 + rand() * 0.02)));\r\n const pad = padding ?? autoPad;\r\n const baseR = Math.floor(size * (0.36 + rand() * 0.04)); // slight variation\r\n const maxR = Math.floor(size / 2 - pad);\r\n const r = Math.max(8, Math.min(baseR, maxR));\r\n\r\n let cx = size / 2;\r\n let cy = size / 2;\r\n if (alignX === \"left\") cx = r + pad;\r\n if (alignX === \"right\") cx = size - (r + pad);\r\n if (alignY === \"top\") cy = r + pad;\r\n if (alignY === \"bottom\") cy = size - (r + pad);\r\n\r\n // Pixel pattern generation -> uses rand sequentially; deterministic for seed\r\n const cells: React.ReactElement[] = [];\r\n const cols = mirrored ? Math.ceil(grid / 2) : grid;\r\n for (let y = 0; y < grid; y++) {\r\n for (let x = 0; x < cols; x++) {\r\n const use = rand() > 0.5;\r\n const fill = use ? bg1 : bg2;\r\n const px = x * tile;\r\n const py = y * tile;\r\n cells.push(<rect key={`L${x},${y}`} x={px} y={py} width={tile} height={tile} fill={fill} />);\r\n if (mirrored) {\r\n const mx = grid - x - 1;\r\n const mpx = mx * tile;\r\n cells.push(<rect key={`R${mx},${y}`} x={mpx} y={py} width={tile} height={tile} fill={fill} />);\r\n }\r\n }\r\n }\r\n\r\n // pick variant deterministically\r\n const variants: Exclude<Variant, \"auto\">[] = [\"split\", \"swoop\", \"diagonal\", \"cap\", \"crescent\", \"band\", \"corner\", \"ring\", \"arc\", \"wave\", \"plain\", \"half\"];\r\n const chosenVariant: Exclude<Variant, \"auto\"> = variant === \"auto\" ? pick(rand, variants) : (variant as Exclude<Variant, \"auto\">);\r\n\r\n // clip path id (stable-ish)\r\n const clipId = React.useMemo(() => {\r\n const [a, b, c, d] = cyrb128(`pp-shape-${name}-${shape}-${r}`);\r\n return `pps-${a.toString(16)}${b.toString(16)}${c.toString(16)}${d.toString(16)}`;\r\n }, [name, shape, r]);\r\n\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox={`0 0 ${size} ${size}`}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n role=\"img\"\r\n aria-label={title ?? `Avatar ${name}`}\r\n className={className}\r\n style={{ display: \"inline-block\", borderRadius: 12, ...style }}\r\n >\r\n {/* background grid */}\r\n <rect width={size} height={size} fill={bg1} />\r\n {cells}\r\n\r\n <defs>\r\n <clipPath id={clipId}>\r\n {shape === \"square\" ? (\r\n <rect x={cx - r} y={cy - r} width={2 * r} height={2 * r} rx={Math.max(4, r * 0.12)} />\r\n ) : (\r\n <circle cx={cx} cy={cy} r={r} />\r\n )}\r\n </clipPath>\r\n </defs>\r\n\r\n {/* head + overlays */}\r\n <g clipPath={`url(#${clipId})`}>\r\n {shape === \"square\" ? (\r\n <rect x={cx - r} y={cy - r} width={2 * r} height={2 * r} rx={Math.max(4, r * 0.12)} fill={base} />\r\n ) : (\r\n <circle cx={cx} cy={cy} r={r} fill={base} />\r\n )}\r\n\r\n <Overlays cx={cx} cy={cy} r={r} a1={a1} a2={a2} variant={chosenVariant} shape={shape} rand={rand} />\r\n </g>\r\n\r\n {/* facial features */}\r\n <Face cx={cx} cy={cy} r={r} color={faceColor} rand={rand} />\r\n </svg>\r\n );\r\n}\r\n"],"mappings":"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","names":["base","a1","a2"]}
|