pixelpeeps 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -5,6 +5,24 @@ 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" | "open" | "random";
15
+ glasses?: "none" | "round" | "square" | "random";
16
+ eyebrows?: boolean | "random";
17
+ blush?: boolean | "random";
18
+ freckles?: boolean | "random";
19
+ ears?: boolean | "random";
20
+ hat?: "none" | "beanie" | "cap" | "random";
21
+ outline?: boolean;
22
+ pupilColor?: string | "auto";
23
+ eyeShine?: boolean | "random";
24
+ rand: () => number;
25
+ };
8
26
  type AvatarProps = {
9
27
  name: string;
10
28
  size?: number;
@@ -18,10 +36,21 @@ type AvatarProps = {
18
36
  padding?: number;
19
37
  colors?: string | [string, string] | [string, string, string] | "random";
20
38
  variant?: Variant;
39
+ eyeShape?: FaceProps["eyeShape"];
40
+ mouthShape?: FaceProps["mouthShape"];
41
+ glasses?: FaceProps["glasses"];
42
+ eyebrows?: FaceProps["eyebrows"];
43
+ blush?: FaceProps["blush"];
44
+ freckles?: FaceProps["freckles"];
45
+ ears?: FaceProps["ears"];
46
+ hat?: FaceProps["hat"];
47
+ outline?: boolean;
48
+ pupilColor?: string | "auto";
49
+ eyeShine?: boolean;
21
50
  className?: string;
22
51
  style?: React.CSSProperties;
23
52
  title?: string;
24
53
  };
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;
54
+ declare function Avatar({ name, size, pixelSize, mirrored, bg, colors, headShape, square, alignX, alignY, padding, variant, className, style, title, eyeShape, mouthShape, glasses, eyebrows, blush, freckles, ears, hat, outline, pupilColor, eyeShine, }: AvatarProps): react_jsx_runtime.JSX.Element;
26
55
 
27
56
  export { Avatar, Avatar as default };
package/dist/index.d.ts CHANGED
@@ -5,6 +5,24 @@ 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" | "open" | "random";
15
+ glasses?: "none" | "round" | "square" | "random";
16
+ eyebrows?: boolean | "random";
17
+ blush?: boolean | "random";
18
+ freckles?: boolean | "random";
19
+ ears?: boolean | "random";
20
+ hat?: "none" | "beanie" | "cap" | "random";
21
+ outline?: boolean;
22
+ pupilColor?: string | "auto";
23
+ eyeShine?: boolean | "random";
24
+ rand: () => number;
25
+ };
8
26
  type AvatarProps = {
9
27
  name: string;
10
28
  size?: number;
@@ -18,10 +36,21 @@ type AvatarProps = {
18
36
  padding?: number;
19
37
  colors?: string | [string, string] | [string, string, string] | "random";
20
38
  variant?: Variant;
39
+ eyeShape?: FaceProps["eyeShape"];
40
+ mouthShape?: FaceProps["mouthShape"];
41
+ glasses?: FaceProps["glasses"];
42
+ eyebrows?: FaceProps["eyebrows"];
43
+ blush?: FaceProps["blush"];
44
+ freckles?: FaceProps["freckles"];
45
+ ears?: FaceProps["ears"];
46
+ hat?: FaceProps["hat"];
47
+ outline?: boolean;
48
+ pupilColor?: string | "auto";
49
+ eyeShine?: boolean;
21
50
  className?: string;
22
51
  style?: React.CSSProperties;
23
52
  title?: string;
24
53
  };
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;
54
+ declare function Avatar({ name, size, pixelSize, mirrored, bg, colors, headShape, square, alignX, alignY, padding, variant, className, style, title, eyeShape, mouthShape, glasses, eyebrows, blush, freckles, ears, hat, outline, pupilColor, eyeShine, }: AvatarProps): react_jsx_runtime.JSX.Element;
26
55
 
27
56
  export { Avatar, Avatar as default };
package/dist/index.js CHANGED
@@ -102,10 +102,7 @@ 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 : [
106
- // fallback single palette
107
- ["#73a9ff", "#fef3c7", "#ffd6a5", "#d4b4ff", "#a7f3d0"]
108
- ];
105
+ var NICE_PALETTES = import_nice_color_palettes.default && Array.isArray(import_nice_color_palettes.default) ? import_nice_color_palettes.default : [["#73a9ff", "#fef3c7", "#ffd6a5", "#d4b4ff", "#a7f3d0"]];
109
106
  function resolveBg(rand, bg) {
110
107
  if (!bg || bg === "random") {
111
108
  return pick(rand, NICE_PALETTES).slice(0, 2);
@@ -129,24 +126,230 @@ function resolveCharColors(rand, colors) {
129
126
  const a2 = colors[2] ?? shade(base, -0.2);
130
127
  return [base, a1, a2];
131
128
  }
132
- function Face({ cx, cy, r, color, rand }) {
129
+ function Face({
130
+ cx,
131
+ cy,
132
+ r,
133
+ color,
134
+ eyeShape: eyeShapeProp,
135
+ mouthShape: mouthShapeProp,
136
+ glasses: glassesProp,
137
+ eyebrows: eyebrowsProp,
138
+ blush: blushProp,
139
+ freckles: frecklesProp,
140
+ ears: earsProp,
141
+ hat: hatProp,
142
+ outline,
143
+ pupilColor,
144
+ eyeShine: eyeShineProp,
145
+ rand
146
+ }) {
147
+ const decide = (prop, opts) => {
148
+ if (prop === void 0 || prop === "random") return pick(rand, opts);
149
+ return prop;
150
+ };
151
+ const eyeShape = decide(eyeShapeProp ?? "random", ["circle", "ellipse", "line", "wink", "sleepy", "surprised"]);
152
+ const mouthShape = decide(mouthShapeProp ?? "random", ["smile", "frown", "flat", "zigzag", "open"]);
153
+ const glasses = decide(glassesProp ?? "random", ["none", "round", "square"]);
154
+ const eyebrows = decide(eyebrowsProp ?? "random", [true, false]);
155
+ const blush = decide(blushProp ?? "random", [true, false]);
156
+ const freckles = decide(frecklesProp ?? "random", [true, false]);
157
+ const ears = decide(earsProp ?? "random", [true, false]);
158
+ const hat = decide(hatProp ?? "random", ["none", "beanie", "cap"]);
159
+ const eyeShine = decide(eyeShineProp ?? "random", [true, false]);
133
160
  const eyeOffsetX = r * (0.34 + rand() * 0.06);
134
161
  const eyeOffsetY = r * (0.2 + rand() * 0.06);
135
162
  const eyeR = Math.max(2, Math.round(r * (0.08 + rand() * 0.02)));
163
+ const pupilR = Math.max(1, Math.round(eyeR * (0.45 + rand() * 0.25)));
136
164
  const mouthWidth = r * (0.7 + rand() * 0.3);
137
165
  const mouthLift = r * (0.18 + rand() * 0.16);
138
- const mouthCurve = (rand() - 0.5) * 0.8;
139
166
  const mouthStroke = Math.max(1, Math.round(r * 0.06));
167
+ let finalPupilColor = "#111827";
168
+ if (pupilColor && pupilColor !== "auto") finalPupilColor = pupilColor;
169
+ else finalPupilColor = yiq(color) > 150 ? "#111827" : "#ffffff";
140
170
  const x0 = cx - mouthWidth / 2;
141
171
  const x1 = cx + mouthWidth / 2;
142
172
  const my = cy + mouthLift;
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" })
173
+ const browY = cy - eyeOffsetY - eyeR * 1.6;
174
+ const browLen = eyeR * 2.2;
175
+ const mouthPathSmile = (() => {
176
+ const mouthCurve = (rand() - 0.5) * 0.8;
177
+ const cxQ = cx;
178
+ const cyQ = my + r * (-0.25 * mouthCurve - 0.1);
179
+ return `M ${x0} ${my} Q ${cxQ} ${cyQ} ${x1} ${my}`;
180
+ })();
181
+ const mouthPathFrown = (() => {
182
+ const mouthCurve = (rand() - 0.5) * 0.8;
183
+ const cxQ = cx;
184
+ const cyQ = my + r * (0.25 * mouthCurve + 0.08);
185
+ return `M ${x0} ${my} Q ${cxQ} ${cyQ} ${x1} ${my}`;
186
+ })();
187
+ const mouthPathZigzag = (() => {
188
+ const segs = 6;
189
+ const step = mouthWidth / (segs - 1);
190
+ let d = `M ${x0} ${my}`;
191
+ for (let i = 1; i < segs; i++) {
192
+ const px = x0 + step * i;
193
+ const py = my + (i % 2 === 0 ? -r * 0.08 : r * 0.08);
194
+ d += ` L ${px} ${py}`;
195
+ }
196
+ return d;
197
+ })();
198
+ const mouthOpen = (() => {
199
+ const w = mouthWidth;
200
+ const h = r * 0.26;
201
+ const rx = w / 2;
202
+ const ry = h / 2;
203
+ return { rx, ry, cy: my + ry * 0.25 };
204
+ })();
205
+ const frecklesCoords = [
206
+ { x: cx - eyeOffsetX * 1.1, y: cy + eyeOffsetY * 0.4 },
207
+ { x: cx - eyeOffsetX * 0.6, y: cy + eyeOffsetY * 0.6 },
208
+ { x: cx + eyeOffsetX * 1.1, y: cy + eyeOffsetY * 0.4 },
209
+ { x: cx + eyeOffsetX * 0.6, y: cy + eyeOffsetY * 0.6 }
210
+ ];
211
+ const eyes = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
212
+ (() => {
213
+ const ex = cx - eyeOffsetX;
214
+ const ey = cy - eyeOffsetY;
215
+ switch (eyeShape) {
216
+ case "ellipse":
217
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ellipse", { cx: ex, cy: ey, rx: eyeR * 1.1, ry: eyeR * 0.7, fill: color }, "le");
218
+ case "line":
219
+ 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");
220
+ case "wink":
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" }, "lw");
222
+ case "sleepy":
223
+ 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") });
224
+ case "surprised":
225
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: eyeR * 1.1, fill: color }, "lsp");
226
+ default:
227
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: eyeR, fill: color }, "lc");
228
+ }
229
+ })(),
230
+ (() => {
231
+ const ex = cx - eyeOffsetX;
232
+ const ey = cy - eyeOffsetY;
233
+ if (eyeShape === "line" || eyeShape === "wink") return null;
234
+ if (eyeShape === "sleepy") {
235
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: Math.max(1, pupilR * 0.6), fill: finalPupilColor }, "lps");
236
+ }
237
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
238
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: pupilR, fill: finalPupilColor }, "lp"),
239
+ 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
240
+ ] });
241
+ })(),
242
+ (() => {
243
+ const ex = cx + eyeOffsetX;
244
+ const ey = cy - eyeOffsetY;
245
+ switch (eyeShape) {
246
+ case "ellipse":
247
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ellipse", { cx: ex, cy: ey, rx: eyeR * 1.1, ry: eyeR * 0.7, fill: color }, "re");
248
+ case "line":
249
+ 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");
250
+ case "wink":
251
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: eyeR, fill: color }, "rw");
252
+ case "sleepy":
253
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ellipse", { cx: ex, cy: ey, rx: eyeR * 1.05, ry: eyeR * 0.45, fill: color }, "rs");
254
+ case "surprised":
255
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: eyeR * 1.1, fill: color }, "rsp");
256
+ default:
257
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: eyeR, fill: color }, "rc");
258
+ }
259
+ })(),
260
+ (() => {
261
+ const ex = cx + eyeOffsetX;
262
+ const ey = cy - eyeOffsetY;
263
+ if (eyeShape === "line" || eyeShape === "wink" && rand() > 0.2) {
264
+ if (eyeShape === "line") return null;
265
+ }
266
+ if (eyeShape === "sleepy") {
267
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: Math.max(1, pupilR * 0.6), fill: finalPupilColor }, "rps");
268
+ }
269
+ if (eyeShape === "wink") {
270
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
271
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: pupilR, fill: finalPupilColor }, "rp"),
272
+ 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
273
+ ] });
274
+ }
275
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
276
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: ex, cy: ey, r: pupilR, fill: finalPupilColor }, "rp"),
277
+ 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
278
+ ] });
279
+ })()
280
+ ] });
281
+ const brows = eyebrows ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
282
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: `M ${cx - eyeOffsetX - browLen / 2} ${browY} Q ${cx - eyeOffsetX} ${browY - eyeR * 0.4} ${cx - eyeOffsetX + browLen / 2} ${browY}`, stroke: color, strokeWidth: Math.max(1, Math.round(eyeR * 0.25)), strokeLinecap: "round", fill: "none" }),
283
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: `M ${cx + eyeOffsetX - browLen / 2} ${browY} Q ${cx + eyeOffsetX} ${browY - eyeR * 0.4} ${cx + eyeOffsetX + browLen / 2} ${browY}`, stroke: color, strokeWidth: Math.max(1, Math.round(eyeR * 0.25)), strokeLinecap: "round", fill: "none" })
284
+ ] }) : null;
285
+ const glassesEl = (() => {
286
+ if (glasses === "none") return null;
287
+ const gx = eyeOffsetX;
288
+ const gy = cy - eyeOffsetY;
289
+ const frameW = eyeR * 2.4;
290
+ const frameH = eyeR * 1.6;
291
+ const bridgeW = eyeR * 0.6;
292
+ if (glasses === "round") {
293
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
294
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: cx - gx, cy: gy, r: frameW / 2, fill: "transparent", stroke: finalPupilColor, strokeWidth: Math.max(1, Math.round(eyeR * 0.35)) }),
295
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: cx + gx, cy: gy, r: frameW / 2, fill: "transparent", stroke: finalPupilColor, strokeWidth: Math.max(1, Math.round(eyeR * 0.35)) }),
296
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: cx - bridgeW / 2, y1: gy, x2: cx + bridgeW / 2, y2: gy, stroke: finalPupilColor, strokeWidth: Math.max(1, Math.round(eyeR * 0.25)), strokeLinecap: "round" })
297
+ ] });
298
+ }
299
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
300
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: cx - gx - frameW / 2, y: gy - frameH / 2, width: frameW, height: frameH, rx: Math.max(1, eyeR * 0.25), fill: "transparent", stroke: finalPupilColor, strokeWidth: Math.max(1, Math.round(eyeR * 0.35)) }),
301
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: cx + gx - frameW / 2, y: gy - frameH / 2, width: frameW, height: frameH, rx: Math.max(1, eyeR * 0.25), fill: "transparent", stroke: finalPupilColor, strokeWidth: Math.max(1, Math.round(eyeR * 0.35)) }),
302
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: cx - bridgeW / 2, y1: gy, x2: cx + bridgeW / 2, y2: gy, stroke: finalPupilColor, strokeWidth: Math.max(1, Math.round(eyeR * 0.25)), strokeLinecap: "round" })
303
+ ] });
304
+ })();
305
+ const mouth = (() => {
306
+ switch (mouthShape) {
307
+ case "frown":
308
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: mouthPathFrown, stroke: color, strokeWidth: mouthStroke, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" });
309
+ case "flat":
310
+ 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" });
311
+ case "zigzag":
312
+ 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" });
313
+ case "open":
314
+ const open = mouthOpen;
315
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
316
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ellipse", { cx, cy: open.cy, rx: open.rx, ry: open.ry, fill: shade(color, -0.6) }),
317
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ellipse", { cx, cy: open.cy, rx: open.rx, ry: open.ry, fill: "none", stroke: color, strokeWidth: Math.max(1, Math.round(mouthStroke * 0.5)) }),
318
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: cx - open.rx * 0.6, y: open.cy, width: open.rx * 1.2, height: Math.max(1, open.ry * 0.25), rx: 1, fill: shade(color, -0.2) })
319
+ ] });
320
+ default:
321
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: mouthPathSmile, stroke: color, strokeWidth: mouthStroke, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" });
322
+ }
323
+ })();
324
+ const blushEl = blush ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
325
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: cx - eyeOffsetX * 0.9, cy: cy + eyeOffsetY * 0.6, r: Math.max(3, r * 0.12), fill: shade(color, -0.5), opacity: 0.16 }),
326
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: cx + eyeOffsetX * 0.9, cy: cy + eyeOffsetY * 0.6, r: Math.max(3, r * 0.12), fill: shade(color, -0.5), opacity: 0.16 })
327
+ ] }) : null;
328
+ const frecklesEl = freckles ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: frecklesCoords.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: f.x, cy: f.y, r: Math.max(0.8, r * 0.03 * (0.8 + i % 3 * 0.2)), fill: shade(color, -0.6), opacity: 0.9 }, `f${i}`)) }) : null;
329
+ const earsEl = ears ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
330
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: cx - r - r * 0.12, cy, r: r * 0.18, fill: color }),
331
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: cx + r + r * 0.12, cy, r: r * 0.18, fill: color })
332
+ ] }) : null;
333
+ const hatEl = (() => {
334
+ if (hat === "none") return null;
335
+ if (hat === "beanie") {
336
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: `M ${cx - r} ${cy - r * 0.55} Q ${cx} ${cy - r * 1.02} ${cx + r} ${cy - r * 0.55} L ${cx + r} ${cy - r * 0.85} L ${cx - r} ${cy - r * 0.85} Z`, fill: shade(color, 0.06), opacity: 0.98 });
337
+ }
338
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
339
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: `M ${cx - r * 0.75} ${cy - r * 0.6} Q ${cx} ${cy - r * 0.95} ${cx + r * 0.75} ${cy - r * 0.6} L ${cx + r * 0.75} ${cy - r * 0.9} L ${cx - r * 0.75} ${cy - r * 0.9} Z`, fill: shade(color, 0.06) }),
340
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: `M ${cx - r * 0.6} ${cy - r * 0.3} Q ${cx} ${cy - r * 0.05} ${cx + r * 0.6} ${cy - r * 0.3} L ${cx + r * 0.6} ${cy - r * 0.15} Q ${cx} ${cy - r * 0.02} ${cx - r * 0.6} ${cy - r * 0.15} Z`, fill: shade(color, -0.08) })
341
+ ] });
342
+ })();
343
+ const outlineStroke = outline ? { stroke: shade(color, -0.24), strokeWidth: Math.max(1, Math.round(r * 0.06)) } : {};
344
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("g", { children: [
345
+ earsEl,
346
+ hatEl,
347
+ blushEl,
348
+ frecklesEl,
349
+ brows,
350
+ eyes,
351
+ glassesEl,
352
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("g", { children: mouth })
150
353
  ] });
151
354
  }
152
355
  function Overlays({
@@ -190,7 +393,6 @@ function Overlays({
190
393
  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 });
191
394
  case "wave":
192
395
  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)
194
396
  case "half": {
195
397
  const diag = rand() > 0.4;
196
398
  if (diag) {
@@ -219,7 +421,19 @@ function Avatar({
219
421
  variant = "auto",
220
422
  className,
221
423
  style,
222
- title
424
+ title,
425
+ // new feature props (pass these to control face features)
426
+ eyeShape,
427
+ mouthShape,
428
+ glasses,
429
+ eyebrows,
430
+ blush,
431
+ freckles,
432
+ ears,
433
+ hat,
434
+ outline = false,
435
+ pupilColor,
436
+ eyeShine
223
437
  }) {
224
438
  const shape = headShape ?? (square ? "square" : "circle");
225
439
  const rand = React.useMemo(() => rngFromSeed(String(name)), [name]);
@@ -261,6 +475,7 @@ function Avatar({
261
475
  const [a, b, c, d] = cyrb128(`pp-shape-${name}-${shape}-${r}`);
262
476
  return `pps-${a.toString(16)}${b.toString(16)}${c.toString(16)}${d.toString(16)}`;
263
477
  }, [name, shape, r]);
478
+ const headStrokeProps = outline ? { stroke: shade(base, -0.25), strokeWidth: Math.max(1, Math.round(r * 0.06)) } : {};
264
479
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
265
480
  "svg",
266
481
  {
@@ -277,10 +492,41 @@ function Avatar({
277
492
  cells,
278
493
  /* @__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 }) }) }),
279
494
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("g", { clipPath: `url(#${clipId})`, children: [
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 }),
495
+ shape === "square" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
496
+ "rect",
497
+ {
498
+ x: cx - r,
499
+ y: cy - r,
500
+ width: 2 * r,
501
+ height: 2 * r,
502
+ rx: Math.max(4, r * 0.12),
503
+ fill: base,
504
+ ...outline ? { stroke: shade(base, -0.25), strokeWidth: Math.max(1, Math.round(r * 0.06)) } : {}
505
+ }
506
+ ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx, cy, r, fill: base, ...outline ? { stroke: shade(base, -0.25), strokeWidth: Math.max(1, Math.round(r * 0.06)) } : {} }),
281
507
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Overlays, { cx, cy, r, a1, a2, variant: chosenVariant, shape, rand })
282
508
  ] }),
283
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Face, { cx, cy, r, color: faceColor, rand })
509
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
510
+ Face,
511
+ {
512
+ cx,
513
+ cy,
514
+ r,
515
+ color: faceColor,
516
+ eyeShape,
517
+ mouthShape,
518
+ glasses,
519
+ eyebrows,
520
+ blush,
521
+ freckles,
522
+ ears,
523
+ hat,
524
+ outline,
525
+ pupilColor: pupilColor ?? "auto",
526
+ eyeShine,
527
+ rand
528
+ }
529
+ )
284
530
  ]
285
531
  }
286
532
  );
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\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\"; // <-- new variant\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"]}
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\" | \"open\" | \"random\";\r\n glasses?: \"none\" | \"round\" | \"square\" | \"random\";\r\n eyebrows?: boolean | \"random\";\r\n blush?: boolean | \"random\";\r\n freckles?: boolean | \"random\";\r\n ears?: boolean | \"random\";\r\n hat?: \"none\" | \"beanie\" | \"cap\" | \"random\";\r\n outline?: boolean;\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 glasses?: FaceProps[\"glasses\"];\r\n eyebrows?: FaceProps[\"eyebrows\"];\r\n blush?: FaceProps[\"blush\"];\r\n freckles?: FaceProps[\"freckles\"];\r\n ears?: FaceProps[\"ears\"];\r\n hat?: FaceProps[\"hat\"];\r\n outline?: boolean;\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: extended 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 glasses: glassesProp,\r\n eyebrows: eyebrowsProp,\r\n blush: blushProp,\r\n freckles: frecklesProp,\r\n ears: earsProp,\r\n hat: hatProp,\r\n outline,\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\", \"open\"]);\r\n const glasses = decide(glassesProp ?? \"random\", [\"none\", \"round\", \"square\"]);\r\n const eyebrows = decide(eyebrowsProp ?? \"random\", [true, false]);\r\n const blush = decide(blushProp ?? \"random\", [true, false]);\r\n const freckles = decide(frecklesProp ?? \"random\", [true, false]);\r\n const ears = decide(earsProp ?? \"random\", [true, false]);\r\n const hat = decide(hatProp ?? \"random\", [\"none\", \"beanie\", \"cap\"]);\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 // eyebrow offsets\r\n const browY = cy - eyeOffsetY - eyeR * 1.6;\r\n const browLen = eyeR * 2.2;\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 const mouthOpen = (() => {\r\n // oval open mouth\r\n const w = mouthWidth;\r\n const h = r * 0.26;\r\n const rx = w / 2;\r\n const ry = h / 2;\r\n return { rx, ry, cy: my + ry * 0.25 };\r\n })();\r\n\r\n // freckles positions\r\n const frecklesCoords = [\r\n { x: cx - eyeOffsetX * 1.1, y: cy + eyeOffsetY * 0.4 },\r\n { x: cx - eyeOffsetX * 0.6, y: cy + eyeOffsetY * 0.6 },\r\n { x: cx + eyeOffsetX * 1.1, y: cy + eyeOffsetY * 0.4 },\r\n { x: cx + eyeOffsetX * 0.6, y: cy + eyeOffsetY * 0.6 },\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 // eyebrows\r\n const brows = eyebrows ? (\r\n <>\r\n <path d={`M ${cx - eyeOffsetX - browLen / 2} ${browY} Q ${cx - eyeOffsetX} ${browY - eyeR * 0.4} ${cx - eyeOffsetX + browLen / 2} ${browY}`} stroke={color} strokeWidth={Math.max(1, Math.round(eyeR * 0.25))} strokeLinecap=\"round\" fill=\"none\" />\r\n <path d={`M ${cx + eyeOffsetX - browLen / 2} ${browY} Q ${cx + eyeOffsetX} ${browY - eyeR * 0.4} ${cx + eyeOffsetX + browLen / 2} ${browY}`} stroke={color} strokeWidth={Math.max(1, Math.round(eyeR * 0.25))} strokeLinecap=\"round\" fill=\"none\" />\r\n </>\r\n ) : null;\r\n\r\n // glasses\r\n const glassesEl = (() => {\r\n if (glasses === \"none\") return null;\r\n const gx = eyeOffsetX;\r\n const gy = cy - eyeOffsetY;\r\n const frameW = eyeR * 2.4;\r\n const frameH = eyeR * 1.6;\r\n const bridgeW = eyeR * 0.6;\r\n if (glasses === \"round\") {\r\n return (\r\n <>\r\n <circle cx={cx - gx} cy={gy} r={frameW / 2} fill=\"transparent\" stroke={finalPupilColor} strokeWidth={Math.max(1, Math.round(eyeR * 0.35))} />\r\n <circle cx={cx + gx} cy={gy} r={frameW / 2} fill=\"transparent\" stroke={finalPupilColor} strokeWidth={Math.max(1, Math.round(eyeR * 0.35))} />\r\n <line x1={cx - bridgeW / 2} y1={gy} x2={cx + bridgeW / 2} y2={gy} stroke={finalPupilColor} strokeWidth={Math.max(1, Math.round(eyeR * 0.25))} strokeLinecap=\"round\" />\r\n </>\r\n );\r\n }\r\n // square\r\n return (\r\n <>\r\n <rect x={cx - gx - frameW / 2} y={gy - frameH / 2} width={frameW} height={frameH} rx={Math.max(1, eyeR * 0.25)} fill=\"transparent\" stroke={finalPupilColor} strokeWidth={Math.max(1, Math.round(eyeR * 0.35))} />\r\n <rect x={cx + gx - frameW / 2} y={gy - frameH / 2} width={frameW} height={frameH} rx={Math.max(1, eyeR * 0.25)} fill=\"transparent\" stroke={finalPupilColor} strokeWidth={Math.max(1, Math.round(eyeR * 0.35))} />\r\n <line x1={cx - bridgeW / 2} y1={gy} x2={cx + bridgeW / 2} y2={gy} stroke={finalPupilColor} strokeWidth={Math.max(1, Math.round(eyeR * 0.25))} strokeLinecap=\"round\" />\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 case \"open\":\r\n // filled oval with darker shade for open mouth\r\n const open = mouthOpen;\r\n return (\r\n <>\r\n <ellipse cx={cx} cy={open.cy} rx={open.rx} ry={open.ry} fill={shade(color, -0.6)} />\r\n <ellipse cx={cx} cy={open.cy} rx={open.rx} ry={open.ry} fill=\"none\" stroke={color} strokeWidth={Math.max(1, Math.round(mouthStroke * 0.5))} />\r\n <rect x={cx - open.rx * 0.6} y={open.cy} width={open.rx * 1.2} height={Math.max(1, open.ry * 0.25)} rx={1} fill={shade(color, -0.2)} />\r\n </>\r\n );\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 // blush\r\n const blushEl = blush ? (\r\n <>\r\n <circle cx={cx - eyeOffsetX * 0.9} cy={cy + eyeOffsetY * 0.6} r={Math.max(3, r * 0.12)} fill={shade(color, -0.5)} opacity={0.16} />\r\n <circle cx={cx + eyeOffsetX * 0.9} cy={cy + eyeOffsetY * 0.6} r={Math.max(3, r * 0.12)} fill={shade(color, -0.5)} opacity={0.16} />\r\n </>\r\n ) : null;\r\n\r\n // freckles\r\n const frecklesEl = freckles ? (\r\n <>\r\n {frecklesCoords.map((f, i) => (\r\n <circle key={`f${i}`} cx={f.x} cy={f.y} r={Math.max(0.8, r * 0.03 * (0.8 + (i % 3) * 0.2))} fill={shade(color, -0.6)} opacity={0.9} />\r\n ))}\r\n </>\r\n ) : null;\r\n\r\n // ears\r\n const earsEl =\r\n ears ? (\r\n <>\r\n <circle cx={cx - r - r * 0.12} cy={cy} r={r * 0.18} fill={color} />\r\n <circle cx={cx + r + r * 0.12} cy={cy} r={r * 0.18} fill={color} />\r\n </>\r\n ) : null;\r\n\r\n // hat (simple beanie / cap)\r\n const hatEl = (() => {\r\n if (hat === \"none\") return null;\r\n if (hat === \"beanie\") {\r\n return <path d={`M ${cx - r} ${cy - r * 0.55} Q ${cx} ${cy - r * 1.02} ${cx + r} ${cy - r * 0.55} L ${cx + r} ${cy - r * 0.85} L ${cx - r} ${cy - r * 0.85} Z`} fill={shade(color, 0.06)} opacity={0.98} />;\r\n }\r\n // cap\r\n return (\r\n <>\r\n <path d={`M ${cx - r * 0.75} ${cy - r * 0.6} Q ${cx} ${cy - r * 0.95} ${cx + r * 0.75} ${cy - r * 0.6} L ${cx + r * 0.75} ${cy - r * 0.9} L ${cx - r * 0.75} ${cy - r * 0.9} Z`} fill={shade(color, 0.06)} />\r\n <path d={`M ${cx - r * 0.6} ${cy - r * 0.3} Q ${cx} ${cy - r * 0.05} ${cx + r * 0.6} ${cy - r * 0.3} L ${cx + r * 0.6} ${cy - r * 0.15} Q ${cx} ${cy - r * 0.02} ${cx - r * 0.6} ${cy - r * 0.15} Z`} fill={shade(color, -0.08)} />\r\n </>\r\n );\r\n })();\r\n\r\n // outline stroke for head (if requested)\r\n const outlineStroke = outline ? { stroke: shade(color, -0.24), strokeWidth: Math.max(1, Math.round(r * 0.06)) } : {};\r\n\r\n return (\r\n <g>\r\n {/* ears are drawn behind head */}\r\n {earsEl}\r\n\r\n {/* head outline/stroke handled by parent clip group, but draw inner features */}\r\n {/* features */}\r\n {hatEl}\r\n {blushEl}\r\n {frecklesEl}\r\n {brows}\r\n {eyes}\r\n {glassesEl}\r\n <g>{mouth}</g>\r\n {/* outline is applied by parent when drawing head; here we can leave it as a hint */}\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 (extended props integrated)\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 // new feature props (pass these to control face features)\r\n eyeShape,\r\n mouthShape,\r\n glasses,\r\n eyebrows,\r\n blush,\r\n freckles,\r\n ears,\r\n hat,\r\n outline = false,\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 // head stroke if outline requested\r\n const headStrokeProps = outline ? { stroke: shade(base, -0.25), strokeWidth: Math.max(1, Math.round(r * 0.06)) } : {};\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 {...(outline ? { stroke: shade(base, -0.25), strokeWidth: Math.max(1, Math.round(r * 0.06)) } : {})}\r\n />\r\n ) : (\r\n <circle cx={cx} cy={cy} r={r} fill={base} {...(outline ? { stroke: shade(base, -0.25), strokeWidth: Math.max(1, Math.round(r * 0.06)) } : {})} />\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 glasses={glasses}\r\n eyebrows={eyebrows}\r\n blush={blush}\r\n freckles={freckles}\r\n ears={ears}\r\n hat={hat}\r\n outline={outline}\r\n pupilColor={pupilColor ?? \"auto\"}\r\n eyeShine={eyeShine}\r\n rand={rand}\r\n />\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,10 +66,7 @@ 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 : [
70
- // fallback single palette
71
- ["#73a9ff", "#fef3c7", "#ffd6a5", "#d4b4ff", "#a7f3d0"]
72
- ];
69
+ var NICE_PALETTES = palettes100 && Array.isArray(palettes100) ? palettes100 : [["#73a9ff", "#fef3c7", "#ffd6a5", "#d4b4ff", "#a7f3d0"]];
73
70
  function resolveBg(rand, bg) {
74
71
  if (!bg || bg === "random") {
75
72
  return pick(rand, NICE_PALETTES).slice(0, 2);
@@ -93,24 +90,230 @@ function resolveCharColors(rand, colors) {
93
90
  const a2 = colors[2] ?? shade(base, -0.2);
94
91
  return [base, a1, a2];
95
92
  }
96
- function Face({ cx, cy, r, color, rand }) {
93
+ function Face({
94
+ cx,
95
+ cy,
96
+ r,
97
+ color,
98
+ eyeShape: eyeShapeProp,
99
+ mouthShape: mouthShapeProp,
100
+ glasses: glassesProp,
101
+ eyebrows: eyebrowsProp,
102
+ blush: blushProp,
103
+ freckles: frecklesProp,
104
+ ears: earsProp,
105
+ hat: hatProp,
106
+ outline,
107
+ pupilColor,
108
+ eyeShine: eyeShineProp,
109
+ rand
110
+ }) {
111
+ const decide = (prop, opts) => {
112
+ if (prop === void 0 || prop === "random") return pick(rand, opts);
113
+ return prop;
114
+ };
115
+ const eyeShape = decide(eyeShapeProp ?? "random", ["circle", "ellipse", "line", "wink", "sleepy", "surprised"]);
116
+ const mouthShape = decide(mouthShapeProp ?? "random", ["smile", "frown", "flat", "zigzag", "open"]);
117
+ const glasses = decide(glassesProp ?? "random", ["none", "round", "square"]);
118
+ const eyebrows = decide(eyebrowsProp ?? "random", [true, false]);
119
+ const blush = decide(blushProp ?? "random", [true, false]);
120
+ const freckles = decide(frecklesProp ?? "random", [true, false]);
121
+ const ears = decide(earsProp ?? "random", [true, false]);
122
+ const hat = decide(hatProp ?? "random", ["none", "beanie", "cap"]);
123
+ const eyeShine = decide(eyeShineProp ?? "random", [true, false]);
97
124
  const eyeOffsetX = r * (0.34 + rand() * 0.06);
98
125
  const eyeOffsetY = r * (0.2 + rand() * 0.06);
99
126
  const eyeR = Math.max(2, Math.round(r * (0.08 + rand() * 0.02)));
127
+ const pupilR = Math.max(1, Math.round(eyeR * (0.45 + rand() * 0.25)));
100
128
  const mouthWidth = r * (0.7 + rand() * 0.3);
101
129
  const mouthLift = r * (0.18 + rand() * 0.16);
102
- const mouthCurve = (rand() - 0.5) * 0.8;
103
130
  const mouthStroke = Math.max(1, Math.round(r * 0.06));
131
+ let finalPupilColor = "#111827";
132
+ if (pupilColor && pupilColor !== "auto") finalPupilColor = pupilColor;
133
+ else finalPupilColor = yiq(color) > 150 ? "#111827" : "#ffffff";
104
134
  const x0 = cx - mouthWidth / 2;
105
135
  const x1 = cx + mouthWidth / 2;
106
136
  const my = cy + mouthLift;
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" })
137
+ const browY = cy - eyeOffsetY - eyeR * 1.6;
138
+ const browLen = eyeR * 2.2;
139
+ const mouthPathSmile = (() => {
140
+ const mouthCurve = (rand() - 0.5) * 0.8;
141
+ const cxQ = cx;
142
+ const cyQ = my + r * (-0.25 * mouthCurve - 0.1);
143
+ return `M ${x0} ${my} Q ${cxQ} ${cyQ} ${x1} ${my}`;
144
+ })();
145
+ const mouthPathFrown = (() => {
146
+ const mouthCurve = (rand() - 0.5) * 0.8;
147
+ const cxQ = cx;
148
+ const cyQ = my + r * (0.25 * mouthCurve + 0.08);
149
+ return `M ${x0} ${my} Q ${cxQ} ${cyQ} ${x1} ${my}`;
150
+ })();
151
+ const mouthPathZigzag = (() => {
152
+ const segs = 6;
153
+ const step = mouthWidth / (segs - 1);
154
+ let d = `M ${x0} ${my}`;
155
+ for (let i = 1; i < segs; i++) {
156
+ const px = x0 + step * i;
157
+ const py = my + (i % 2 === 0 ? -r * 0.08 : r * 0.08);
158
+ d += ` L ${px} ${py}`;
159
+ }
160
+ return d;
161
+ })();
162
+ const mouthOpen = (() => {
163
+ const w = mouthWidth;
164
+ const h = r * 0.26;
165
+ const rx = w / 2;
166
+ const ry = h / 2;
167
+ return { rx, ry, cy: my + ry * 0.25 };
168
+ })();
169
+ const frecklesCoords = [
170
+ { x: cx - eyeOffsetX * 1.1, y: cy + eyeOffsetY * 0.4 },
171
+ { x: cx - eyeOffsetX * 0.6, y: cy + eyeOffsetY * 0.6 },
172
+ { x: cx + eyeOffsetX * 1.1, y: cy + eyeOffsetY * 0.4 },
173
+ { x: cx + eyeOffsetX * 0.6, y: cy + eyeOffsetY * 0.6 }
174
+ ];
175
+ const eyes = /* @__PURE__ */ jsxs(Fragment, { children: [
176
+ (() => {
177
+ const ex = cx - eyeOffsetX;
178
+ const ey = cy - eyeOffsetY;
179
+ switch (eyeShape) {
180
+ case "ellipse":
181
+ return /* @__PURE__ */ jsx("ellipse", { cx: ex, cy: ey, rx: eyeR * 1.1, ry: eyeR * 0.7, fill: color }, "le");
182
+ case "line":
183
+ 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");
184
+ case "wink":
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" }, "lw");
186
+ case "sleepy":
187
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("ellipse", { cx: ex, cy: ey, rx: eyeR * 1.05, ry: eyeR * 0.45, fill: color }, "ls") });
188
+ case "surprised":
189
+ return /* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: eyeR * 1.1, fill: color }, "lsp");
190
+ default:
191
+ return /* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: eyeR, fill: color }, "lc");
192
+ }
193
+ })(),
194
+ (() => {
195
+ const ex = cx - eyeOffsetX;
196
+ const ey = cy - eyeOffsetY;
197
+ if (eyeShape === "line" || eyeShape === "wink") return null;
198
+ if (eyeShape === "sleepy") {
199
+ return /* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: Math.max(1, pupilR * 0.6), fill: finalPupilColor }, "lps");
200
+ }
201
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
202
+ /* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: pupilR, fill: finalPupilColor }, "lp"),
203
+ 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
204
+ ] });
205
+ })(),
206
+ (() => {
207
+ const ex = cx + eyeOffsetX;
208
+ const ey = cy - eyeOffsetY;
209
+ switch (eyeShape) {
210
+ case "ellipse":
211
+ return /* @__PURE__ */ jsx("ellipse", { cx: ex, cy: ey, rx: eyeR * 1.1, ry: eyeR * 0.7, fill: color }, "re");
212
+ case "line":
213
+ 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");
214
+ case "wink":
215
+ return /* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: eyeR, fill: color }, "rw");
216
+ case "sleepy":
217
+ return /* @__PURE__ */ jsx("ellipse", { cx: ex, cy: ey, rx: eyeR * 1.05, ry: eyeR * 0.45, fill: color }, "rs");
218
+ case "surprised":
219
+ return /* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: eyeR * 1.1, fill: color }, "rsp");
220
+ default:
221
+ return /* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: eyeR, fill: color }, "rc");
222
+ }
223
+ })(),
224
+ (() => {
225
+ const ex = cx + eyeOffsetX;
226
+ const ey = cy - eyeOffsetY;
227
+ if (eyeShape === "line" || eyeShape === "wink" && rand() > 0.2) {
228
+ if (eyeShape === "line") return null;
229
+ }
230
+ if (eyeShape === "sleepy") {
231
+ return /* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: Math.max(1, pupilR * 0.6), fill: finalPupilColor }, "rps");
232
+ }
233
+ if (eyeShape === "wink") {
234
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
235
+ /* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: pupilR, fill: finalPupilColor }, "rp"),
236
+ 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
237
+ ] });
238
+ }
239
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
240
+ /* @__PURE__ */ jsx("circle", { cx: ex, cy: ey, r: pupilR, fill: finalPupilColor }, "rp"),
241
+ 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
242
+ ] });
243
+ })()
244
+ ] });
245
+ const brows = eyebrows ? /* @__PURE__ */ jsxs(Fragment, { children: [
246
+ /* @__PURE__ */ jsx("path", { d: `M ${cx - eyeOffsetX - browLen / 2} ${browY} Q ${cx - eyeOffsetX} ${browY - eyeR * 0.4} ${cx - eyeOffsetX + browLen / 2} ${browY}`, stroke: color, strokeWidth: Math.max(1, Math.round(eyeR * 0.25)), strokeLinecap: "round", fill: "none" }),
247
+ /* @__PURE__ */ jsx("path", { d: `M ${cx + eyeOffsetX - browLen / 2} ${browY} Q ${cx + eyeOffsetX} ${browY - eyeR * 0.4} ${cx + eyeOffsetX + browLen / 2} ${browY}`, stroke: color, strokeWidth: Math.max(1, Math.round(eyeR * 0.25)), strokeLinecap: "round", fill: "none" })
248
+ ] }) : null;
249
+ const glassesEl = (() => {
250
+ if (glasses === "none") return null;
251
+ const gx = eyeOffsetX;
252
+ const gy = cy - eyeOffsetY;
253
+ const frameW = eyeR * 2.4;
254
+ const frameH = eyeR * 1.6;
255
+ const bridgeW = eyeR * 0.6;
256
+ if (glasses === "round") {
257
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
258
+ /* @__PURE__ */ jsx("circle", { cx: cx - gx, cy: gy, r: frameW / 2, fill: "transparent", stroke: finalPupilColor, strokeWidth: Math.max(1, Math.round(eyeR * 0.35)) }),
259
+ /* @__PURE__ */ jsx("circle", { cx: cx + gx, cy: gy, r: frameW / 2, fill: "transparent", stroke: finalPupilColor, strokeWidth: Math.max(1, Math.round(eyeR * 0.35)) }),
260
+ /* @__PURE__ */ jsx("line", { x1: cx - bridgeW / 2, y1: gy, x2: cx + bridgeW / 2, y2: gy, stroke: finalPupilColor, strokeWidth: Math.max(1, Math.round(eyeR * 0.25)), strokeLinecap: "round" })
261
+ ] });
262
+ }
263
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
264
+ /* @__PURE__ */ jsx("rect", { x: cx - gx - frameW / 2, y: gy - frameH / 2, width: frameW, height: frameH, rx: Math.max(1, eyeR * 0.25), fill: "transparent", stroke: finalPupilColor, strokeWidth: Math.max(1, Math.round(eyeR * 0.35)) }),
265
+ /* @__PURE__ */ jsx("rect", { x: cx + gx - frameW / 2, y: gy - frameH / 2, width: frameW, height: frameH, rx: Math.max(1, eyeR * 0.25), fill: "transparent", stroke: finalPupilColor, strokeWidth: Math.max(1, Math.round(eyeR * 0.35)) }),
266
+ /* @__PURE__ */ jsx("line", { x1: cx - bridgeW / 2, y1: gy, x2: cx + bridgeW / 2, y2: gy, stroke: finalPupilColor, strokeWidth: Math.max(1, Math.round(eyeR * 0.25)), strokeLinecap: "round" })
267
+ ] });
268
+ })();
269
+ const mouth = (() => {
270
+ switch (mouthShape) {
271
+ case "frown":
272
+ return /* @__PURE__ */ jsx("path", { d: mouthPathFrown, stroke: color, strokeWidth: mouthStroke, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" });
273
+ case "flat":
274
+ 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" });
275
+ case "zigzag":
276
+ return /* @__PURE__ */ jsx("path", { d: mouthPathZigzag, stroke: color, strokeWidth: Math.max(1, Math.round(mouthStroke * 0.9)), fill: "none", strokeLinecap: "round", strokeLinejoin: "round" });
277
+ case "open":
278
+ const open = mouthOpen;
279
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
280
+ /* @__PURE__ */ jsx("ellipse", { cx, cy: open.cy, rx: open.rx, ry: open.ry, fill: shade(color, -0.6) }),
281
+ /* @__PURE__ */ jsx("ellipse", { cx, cy: open.cy, rx: open.rx, ry: open.ry, fill: "none", stroke: color, strokeWidth: Math.max(1, Math.round(mouthStroke * 0.5)) }),
282
+ /* @__PURE__ */ jsx("rect", { x: cx - open.rx * 0.6, y: open.cy, width: open.rx * 1.2, height: Math.max(1, open.ry * 0.25), rx: 1, fill: shade(color, -0.2) })
283
+ ] });
284
+ default:
285
+ return /* @__PURE__ */ jsx("path", { d: mouthPathSmile, stroke: color, strokeWidth: mouthStroke, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" });
286
+ }
287
+ })();
288
+ const blushEl = blush ? /* @__PURE__ */ jsxs(Fragment, { children: [
289
+ /* @__PURE__ */ jsx("circle", { cx: cx - eyeOffsetX * 0.9, cy: cy + eyeOffsetY * 0.6, r: Math.max(3, r * 0.12), fill: shade(color, -0.5), opacity: 0.16 }),
290
+ /* @__PURE__ */ jsx("circle", { cx: cx + eyeOffsetX * 0.9, cy: cy + eyeOffsetY * 0.6, r: Math.max(3, r * 0.12), fill: shade(color, -0.5), opacity: 0.16 })
291
+ ] }) : null;
292
+ const frecklesEl = freckles ? /* @__PURE__ */ jsx(Fragment, { children: frecklesCoords.map((f, i) => /* @__PURE__ */ jsx("circle", { cx: f.x, cy: f.y, r: Math.max(0.8, r * 0.03 * (0.8 + i % 3 * 0.2)), fill: shade(color, -0.6), opacity: 0.9 }, `f${i}`)) }) : null;
293
+ const earsEl = ears ? /* @__PURE__ */ jsxs(Fragment, { children: [
294
+ /* @__PURE__ */ jsx("circle", { cx: cx - r - r * 0.12, cy, r: r * 0.18, fill: color }),
295
+ /* @__PURE__ */ jsx("circle", { cx: cx + r + r * 0.12, cy, r: r * 0.18, fill: color })
296
+ ] }) : null;
297
+ const hatEl = (() => {
298
+ if (hat === "none") return null;
299
+ if (hat === "beanie") {
300
+ return /* @__PURE__ */ jsx("path", { d: `M ${cx - r} ${cy - r * 0.55} Q ${cx} ${cy - r * 1.02} ${cx + r} ${cy - r * 0.55} L ${cx + r} ${cy - r * 0.85} L ${cx - r} ${cy - r * 0.85} Z`, fill: shade(color, 0.06), opacity: 0.98 });
301
+ }
302
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
303
+ /* @__PURE__ */ jsx("path", { d: `M ${cx - r * 0.75} ${cy - r * 0.6} Q ${cx} ${cy - r * 0.95} ${cx + r * 0.75} ${cy - r * 0.6} L ${cx + r * 0.75} ${cy - r * 0.9} L ${cx - r * 0.75} ${cy - r * 0.9} Z`, fill: shade(color, 0.06) }),
304
+ /* @__PURE__ */ jsx("path", { d: `M ${cx - r * 0.6} ${cy - r * 0.3} Q ${cx} ${cy - r * 0.05} ${cx + r * 0.6} ${cy - r * 0.3} L ${cx + r * 0.6} ${cy - r * 0.15} Q ${cx} ${cy - r * 0.02} ${cx - r * 0.6} ${cy - r * 0.15} Z`, fill: shade(color, -0.08) })
305
+ ] });
306
+ })();
307
+ const outlineStroke = outline ? { stroke: shade(color, -0.24), strokeWidth: Math.max(1, Math.round(r * 0.06)) } : {};
308
+ return /* @__PURE__ */ jsxs("g", { children: [
309
+ earsEl,
310
+ hatEl,
311
+ blushEl,
312
+ frecklesEl,
313
+ brows,
314
+ eyes,
315
+ glassesEl,
316
+ /* @__PURE__ */ jsx("g", { children: mouth })
114
317
  ] });
115
318
  }
116
319
  function Overlays({
@@ -154,7 +357,6 @@ function Overlays({
154
357
  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 });
155
358
  case "wave":
156
359
  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)
158
360
  case "half": {
159
361
  const diag = rand() > 0.4;
160
362
  if (diag) {
@@ -183,7 +385,19 @@ function Avatar({
183
385
  variant = "auto",
184
386
  className,
185
387
  style,
186
- title
388
+ title,
389
+ // new feature props (pass these to control face features)
390
+ eyeShape,
391
+ mouthShape,
392
+ glasses,
393
+ eyebrows,
394
+ blush,
395
+ freckles,
396
+ ears,
397
+ hat,
398
+ outline = false,
399
+ pupilColor,
400
+ eyeShine
187
401
  }) {
188
402
  const shape = headShape ?? (square ? "square" : "circle");
189
403
  const rand = React.useMemo(() => rngFromSeed(String(name)), [name]);
@@ -225,6 +439,7 @@ function Avatar({
225
439
  const [a, b, c, d] = cyrb128(`pp-shape-${name}-${shape}-${r}`);
226
440
  return `pps-${a.toString(16)}${b.toString(16)}${c.toString(16)}${d.toString(16)}`;
227
441
  }, [name, shape, r]);
442
+ const headStrokeProps = outline ? { stroke: shade(base, -0.25), strokeWidth: Math.max(1, Math.round(r * 0.06)) } : {};
228
443
  return /* @__PURE__ */ jsxs(
229
444
  "svg",
230
445
  {
@@ -241,10 +456,41 @@ function Avatar({
241
456
  cells,
242
457
  /* @__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 }) }) }),
243
458
  /* @__PURE__ */ jsxs("g", { clipPath: `url(#${clipId})`, children: [
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 }),
459
+ shape === "square" ? /* @__PURE__ */ jsx(
460
+ "rect",
461
+ {
462
+ x: cx - r,
463
+ y: cy - r,
464
+ width: 2 * r,
465
+ height: 2 * r,
466
+ rx: Math.max(4, r * 0.12),
467
+ fill: base,
468
+ ...outline ? { stroke: shade(base, -0.25), strokeWidth: Math.max(1, Math.round(r * 0.06)) } : {}
469
+ }
470
+ ) : /* @__PURE__ */ jsx("circle", { cx, cy, r, fill: base, ...outline ? { stroke: shade(base, -0.25), strokeWidth: Math.max(1, Math.round(r * 0.06)) } : {} }),
245
471
  /* @__PURE__ */ jsx(Overlays, { cx, cy, r, a1, a2, variant: chosenVariant, shape, rand })
246
472
  ] }),
247
- /* @__PURE__ */ jsx(Face, { cx, cy, r, color: faceColor, rand })
473
+ /* @__PURE__ */ jsx(
474
+ Face,
475
+ {
476
+ cx,
477
+ cy,
478
+ r,
479
+ color: faceColor,
480
+ eyeShape,
481
+ mouthShape,
482
+ glasses,
483
+ eyebrows,
484
+ blush,
485
+ freckles,
486
+ ears,
487
+ hat,
488
+ outline,
489
+ pupilColor: pupilColor ?? "auto",
490
+ eyeShine,
491
+ rand
492
+ }
493
+ )
248
494
  ]
249
495
  }
250
496
  );
@@ -1 +1 @@
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\"; // <-- new variant\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"]}
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\" | \"open\" | \"random\";\r\n glasses?: \"none\" | \"round\" | \"square\" | \"random\";\r\n eyebrows?: boolean | \"random\";\r\n blush?: boolean | \"random\";\r\n freckles?: boolean | \"random\";\r\n ears?: boolean | \"random\";\r\n hat?: \"none\" | \"beanie\" | \"cap\" | \"random\";\r\n outline?: boolean;\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 glasses?: FaceProps[\"glasses\"];\r\n eyebrows?: FaceProps[\"eyebrows\"];\r\n blush?: FaceProps[\"blush\"];\r\n freckles?: FaceProps[\"freckles\"];\r\n ears?: FaceProps[\"ears\"];\r\n hat?: FaceProps[\"hat\"];\r\n outline?: boolean;\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: extended 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 glasses: glassesProp,\r\n eyebrows: eyebrowsProp,\r\n blush: blushProp,\r\n freckles: frecklesProp,\r\n ears: earsProp,\r\n hat: hatProp,\r\n outline,\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\", \"open\"]);\r\n const glasses = decide(glassesProp ?? \"random\", [\"none\", \"round\", \"square\"]);\r\n const eyebrows = decide(eyebrowsProp ?? \"random\", [true, false]);\r\n const blush = decide(blushProp ?? \"random\", [true, false]);\r\n const freckles = decide(frecklesProp ?? \"random\", [true, false]);\r\n const ears = decide(earsProp ?? \"random\", [true, false]);\r\n const hat = decide(hatProp ?? \"random\", [\"none\", \"beanie\", \"cap\"]);\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 // eyebrow offsets\r\n const browY = cy - eyeOffsetY - eyeR * 1.6;\r\n const browLen = eyeR * 2.2;\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 const mouthOpen = (() => {\r\n // oval open mouth\r\n const w = mouthWidth;\r\n const h = r * 0.26;\r\n const rx = w / 2;\r\n const ry = h / 2;\r\n return { rx, ry, cy: my + ry * 0.25 };\r\n })();\r\n\r\n // freckles positions\r\n const frecklesCoords = [\r\n { x: cx - eyeOffsetX * 1.1, y: cy + eyeOffsetY * 0.4 },\r\n { x: cx - eyeOffsetX * 0.6, y: cy + eyeOffsetY * 0.6 },\r\n { x: cx + eyeOffsetX * 1.1, y: cy + eyeOffsetY * 0.4 },\r\n { x: cx + eyeOffsetX * 0.6, y: cy + eyeOffsetY * 0.6 },\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 // eyebrows\r\n const brows = eyebrows ? (\r\n <>\r\n <path d={`M ${cx - eyeOffsetX - browLen / 2} ${browY} Q ${cx - eyeOffsetX} ${browY - eyeR * 0.4} ${cx - eyeOffsetX + browLen / 2} ${browY}`} stroke={color} strokeWidth={Math.max(1, Math.round(eyeR * 0.25))} strokeLinecap=\"round\" fill=\"none\" />\r\n <path d={`M ${cx + eyeOffsetX - browLen / 2} ${browY} Q ${cx + eyeOffsetX} ${browY - eyeR * 0.4} ${cx + eyeOffsetX + browLen / 2} ${browY}`} stroke={color} strokeWidth={Math.max(1, Math.round(eyeR * 0.25))} strokeLinecap=\"round\" fill=\"none\" />\r\n </>\r\n ) : null;\r\n\r\n // glasses\r\n const glassesEl = (() => {\r\n if (glasses === \"none\") return null;\r\n const gx = eyeOffsetX;\r\n const gy = cy - eyeOffsetY;\r\n const frameW = eyeR * 2.4;\r\n const frameH = eyeR * 1.6;\r\n const bridgeW = eyeR * 0.6;\r\n if (glasses === \"round\") {\r\n return (\r\n <>\r\n <circle cx={cx - gx} cy={gy} r={frameW / 2} fill=\"transparent\" stroke={finalPupilColor} strokeWidth={Math.max(1, Math.round(eyeR * 0.35))} />\r\n <circle cx={cx + gx} cy={gy} r={frameW / 2} fill=\"transparent\" stroke={finalPupilColor} strokeWidth={Math.max(1, Math.round(eyeR * 0.35))} />\r\n <line x1={cx - bridgeW / 2} y1={gy} x2={cx + bridgeW / 2} y2={gy} stroke={finalPupilColor} strokeWidth={Math.max(1, Math.round(eyeR * 0.25))} strokeLinecap=\"round\" />\r\n </>\r\n );\r\n }\r\n // square\r\n return (\r\n <>\r\n <rect x={cx - gx - frameW / 2} y={gy - frameH / 2} width={frameW} height={frameH} rx={Math.max(1, eyeR * 0.25)} fill=\"transparent\" stroke={finalPupilColor} strokeWidth={Math.max(1, Math.round(eyeR * 0.35))} />\r\n <rect x={cx + gx - frameW / 2} y={gy - frameH / 2} width={frameW} height={frameH} rx={Math.max(1, eyeR * 0.25)} fill=\"transparent\" stroke={finalPupilColor} strokeWidth={Math.max(1, Math.round(eyeR * 0.35))} />\r\n <line x1={cx - bridgeW / 2} y1={gy} x2={cx + bridgeW / 2} y2={gy} stroke={finalPupilColor} strokeWidth={Math.max(1, Math.round(eyeR * 0.25))} strokeLinecap=\"round\" />\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 case \"open\":\r\n // filled oval with darker shade for open mouth\r\n const open = mouthOpen;\r\n return (\r\n <>\r\n <ellipse cx={cx} cy={open.cy} rx={open.rx} ry={open.ry} fill={shade(color, -0.6)} />\r\n <ellipse cx={cx} cy={open.cy} rx={open.rx} ry={open.ry} fill=\"none\" stroke={color} strokeWidth={Math.max(1, Math.round(mouthStroke * 0.5))} />\r\n <rect x={cx - open.rx * 0.6} y={open.cy} width={open.rx * 1.2} height={Math.max(1, open.ry * 0.25)} rx={1} fill={shade(color, -0.2)} />\r\n </>\r\n );\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 // blush\r\n const blushEl = blush ? (\r\n <>\r\n <circle cx={cx - eyeOffsetX * 0.9} cy={cy + eyeOffsetY * 0.6} r={Math.max(3, r * 0.12)} fill={shade(color, -0.5)} opacity={0.16} />\r\n <circle cx={cx + eyeOffsetX * 0.9} cy={cy + eyeOffsetY * 0.6} r={Math.max(3, r * 0.12)} fill={shade(color, -0.5)} opacity={0.16} />\r\n </>\r\n ) : null;\r\n\r\n // freckles\r\n const frecklesEl = freckles ? (\r\n <>\r\n {frecklesCoords.map((f, i) => (\r\n <circle key={`f${i}`} cx={f.x} cy={f.y} r={Math.max(0.8, r * 0.03 * (0.8 + (i % 3) * 0.2))} fill={shade(color, -0.6)} opacity={0.9} />\r\n ))}\r\n </>\r\n ) : null;\r\n\r\n // ears\r\n const earsEl =\r\n ears ? (\r\n <>\r\n <circle cx={cx - r - r * 0.12} cy={cy} r={r * 0.18} fill={color} />\r\n <circle cx={cx + r + r * 0.12} cy={cy} r={r * 0.18} fill={color} />\r\n </>\r\n ) : null;\r\n\r\n // hat (simple beanie / cap)\r\n const hatEl = (() => {\r\n if (hat === \"none\") return null;\r\n if (hat === \"beanie\") {\r\n return <path d={`M ${cx - r} ${cy - r * 0.55} Q ${cx} ${cy - r * 1.02} ${cx + r} ${cy - r * 0.55} L ${cx + r} ${cy - r * 0.85} L ${cx - r} ${cy - r * 0.85} Z`} fill={shade(color, 0.06)} opacity={0.98} />;\r\n }\r\n // cap\r\n return (\r\n <>\r\n <path d={`M ${cx - r * 0.75} ${cy - r * 0.6} Q ${cx} ${cy - r * 0.95} ${cx + r * 0.75} ${cy - r * 0.6} L ${cx + r * 0.75} ${cy - r * 0.9} L ${cx - r * 0.75} ${cy - r * 0.9} Z`} fill={shade(color, 0.06)} />\r\n <path d={`M ${cx - r * 0.6} ${cy - r * 0.3} Q ${cx} ${cy - r * 0.05} ${cx + r * 0.6} ${cy - r * 0.3} L ${cx + r * 0.6} ${cy - r * 0.15} Q ${cx} ${cy - r * 0.02} ${cx - r * 0.6} ${cy - r * 0.15} Z`} fill={shade(color, -0.08)} />\r\n </>\r\n );\r\n })();\r\n\r\n // outline stroke for head (if requested)\r\n const outlineStroke = outline ? { stroke: shade(color, -0.24), strokeWidth: Math.max(1, Math.round(r * 0.06)) } : {};\r\n\r\n return (\r\n <g>\r\n {/* ears are drawn behind head */}\r\n {earsEl}\r\n\r\n {/* head outline/stroke handled by parent clip group, but draw inner features */}\r\n {/* features */}\r\n {hatEl}\r\n {blushEl}\r\n {frecklesEl}\r\n {brows}\r\n {eyes}\r\n {glassesEl}\r\n <g>{mouth}</g>\r\n {/* outline is applied by parent when drawing head; here we can leave it as a hint */}\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 (extended props integrated)\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 // new feature props (pass these to control face features)\r\n eyeShape,\r\n mouthShape,\r\n glasses,\r\n eyebrows,\r\n blush,\r\n freckles,\r\n ears,\r\n hat,\r\n outline = false,\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 // head stroke if outline requested\r\n const headStrokeProps = outline ? { stroke: shade(base, -0.25), strokeWidth: Math.max(1, Math.round(r * 0.06)) } : {};\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 {...(outline ? { stroke: shade(base, -0.25), strokeWidth: Math.max(1, Math.round(r * 0.06)) } : {})}\r\n />\r\n ) : (\r\n <circle cx={cx} cy={cy} r={r} fill={base} {...(outline ? { stroke: shade(base, -0.25), strokeWidth: Math.max(1, Math.round(r * 0.06)) } : {})} />\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 glasses={glasses}\r\n eyebrows={eyebrows}\r\n blush={blush}\r\n freckles={freckles}\r\n ears={ears}\r\n hat={hat}\r\n outline={outline}\r\n pupilColor={pupilColor ?? \"auto\"}\r\n eyeShine={eyeShine}\r\n rand={rand}\r\n />\r\n </svg>\r\n );\r\n}\r\n"],"mappings":"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","names":["base","a1","a2"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pixelpeeps",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Deterministic, cute pixel avatars for React. Zero deps. SVG output.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -32,7 +32,8 @@
32
32
  "react": ">=17"
33
33
  },
34
34
  "dependencies": {
35
- "nice-color-palettes": "^4.0.0"
35
+ "nice-color-palettes": "^4.0.0",
36
+ "pixelpeeps": "^1.0.0"
36
37
  },
37
38
  "devDependencies": {
38
39
  "@types/react": "^19.2.2",