solfaces 2.2.0 → 2.3.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.
Files changed (64) hide show
  1. package/README.md +45 -19
  2. package/SKILL.md +2 -3
  3. package/dist/agent/index.cjs +13 -14
  4. package/dist/agent/index.js +3 -4
  5. package/dist/agent/mcp-server.cjs +326 -333
  6. package/dist/{chunk-5DT27HMT.js → chunk-2KW35VRI.js} +3 -3
  7. package/dist/{chunk-5DT27HMT.js.map → chunk-2KW35VRI.js.map} +1 -1
  8. package/dist/{chunk-PVJR3SFG.cjs → chunk-BI3GHRKQ.cjs} +14 -15
  9. package/dist/chunk-BI3GHRKQ.cjs.map +1 -0
  10. package/dist/{chunk-DRUSCLEF.js → chunk-MYUSB4LA.js} +28 -8
  11. package/dist/chunk-MYUSB4LA.js.map +1 -0
  12. package/dist/{chunk-3CE7Q44S.js → chunk-N5GDLCCL.js} +324 -110
  13. package/dist/chunk-N5GDLCCL.js.map +1 -0
  14. package/dist/{chunk-74CSG63X.js → chunk-O2IIBSQH.js} +6 -7
  15. package/dist/chunk-O2IIBSQH.js.map +1 -0
  16. package/dist/{chunk-6QRDULAO.cjs → chunk-PCSRDAWQ.cjs} +28 -7
  17. package/dist/chunk-PCSRDAWQ.cjs.map +1 -0
  18. package/dist/{chunk-WIXGHS77.cjs → chunk-T7HEUW2O.cjs} +6 -6
  19. package/dist/{chunk-WIXGHS77.cjs.map → chunk-T7HEUW2O.cjs.map} +1 -1
  20. package/dist/{chunk-F54WHRCE.cjs → chunk-W2U6ITMR.cjs} +328 -110
  21. package/dist/chunk-W2U6ITMR.cjs.map +1 -0
  22. package/dist/core/index.cjs +43 -44
  23. package/dist/core/index.d.cts +39 -5
  24. package/dist/core/index.d.ts +39 -5
  25. package/dist/core/index.js +2 -3
  26. package/dist/index.cjs +53 -50
  27. package/dist/index.d.cts +3 -3
  28. package/dist/index.d.ts +3 -3
  29. package/dist/index.js +4 -5
  30. package/dist/react/index.cjs +107 -120
  31. package/dist/react/index.cjs.map +1 -1
  32. package/dist/react/index.d.cts +23 -1
  33. package/dist/react/index.d.ts +23 -1
  34. package/dist/react/index.js +95 -108
  35. package/dist/react/index.js.map +1 -1
  36. package/dist/solfaces.cdn.global.js +2 -2
  37. package/dist/solfaces.cdn.global.js.map +1 -1
  38. package/dist/themes/index.cjs +18 -14
  39. package/dist/themes/index.d.cts +30 -4
  40. package/dist/themes/index.d.ts +30 -4
  41. package/dist/themes/index.js +1 -1
  42. package/dist/traits-D4tbtZIr.d.cts +259 -0
  43. package/dist/traits-D4tbtZIr.d.ts +259 -0
  44. package/dist/vanilla/index.cjs +6 -7
  45. package/dist/vanilla/index.cjs.map +1 -1
  46. package/dist/vanilla/index.d.cts +1 -1
  47. package/dist/vanilla/index.d.ts +1 -1
  48. package/dist/vanilla/index.js +2 -3
  49. package/dist/vanilla/index.js.map +1 -1
  50. package/package.json +4 -1
  51. package/python/solfaces.py +103 -119
  52. package/reference/integrations.md +1 -1
  53. package/dist/chunk-3CE7Q44S.js.map +0 -1
  54. package/dist/chunk-6QRDULAO.cjs.map +0 -1
  55. package/dist/chunk-74CSG63X.js.map +0 -1
  56. package/dist/chunk-CKHLRORB.js +0 -239
  57. package/dist/chunk-CKHLRORB.js.map +0 -1
  58. package/dist/chunk-DRUSCLEF.js.map +0 -1
  59. package/dist/chunk-F54WHRCE.cjs.map +0 -1
  60. package/dist/chunk-PVJR3SFG.cjs.map +0 -1
  61. package/dist/chunk-TYTBYDQU.cjs +0 -244
  62. package/dist/chunk-TYTBYDQU.cjs.map +0 -1
  63. package/dist/traits-sfe7rM9C.d.cts +0 -106
  64. package/dist/traits-sfe7rM9C.d.ts +0 -106
@@ -1,4 +1,4 @@
1
- import { generateTraits, SKIN_COLORS, EYE_COLORS, HAIR_COLORS, BG_COLORS, deriveSkinColors, blend, effectiveAccessory, renderSolFaceSVG, lighten, darken, buzzOpacity } from '../chunk-3CE7Q44S.js';
1
+ import { generateTraits, SKIN_COLORS, EYE_COLORS, HAIR_COLORS, BG_COLORS, deriveSkinColors, blend, effectiveAccessory, renderSolFaceSVG, solFaceAltText, lighten, darken } from '../chunk-N5GDLCCL.js';
2
2
  import { deriveName, deriveIdentity } from '../chunk-UTT764K6.js';
3
3
  import { useMemo } from 'react';
4
4
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -10,18 +10,8 @@ function djb2(str) {
10
10
  }
11
11
  return hash >>> 0;
12
12
  }
13
- function HairBack({ hi, id, flat }) {
14
- const fill = flat ? "currentColor" : `url(#${id}hg)`;
15
- switch (hi) {
16
- case 5:
17
- return /* @__PURE__ */ jsx("rect", { x: "10", y: "14", width: "44", height: "42", rx: "6", fill });
18
- case 6:
19
- return /* @__PURE__ */ jsx("rect", { x: "12", y: "14", width: "40", height: "32", rx: "8", fill });
20
- case 8:
21
- return /* @__PURE__ */ jsx("rect", { x: "11", y: "14", width: "42", height: "38", rx: "8", fill });
22
- default:
23
- return null;
24
- }
13
+ function HairBack(_props) {
14
+ return null;
25
15
  }
26
16
  function Ears({ earFill, earShadow }) {
27
17
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -40,55 +30,8 @@ function FaceOverlays({ id }) {
40
30
  /* @__PURE__ */ jsx("line", { x1: "20", y1: "50", x2: "44", y2: "50", stroke: "currentColor", strokeWidth: "0.3", opacity: "0.08", strokeLinecap: "round" })
41
31
  ] });
42
32
  }
43
- function HairFront({ hi, id, hairCol, skin, flat }) {
44
- const fill = flat ? hairCol : `url(#${id}hg)`;
45
- switch (hi) {
46
- case 0:
47
- return null;
48
- case 1:
49
- return /* @__PURE__ */ jsx("path", { d: "M14 28 Q14 14 32 12 Q50 14 50 28 L50 22 Q50 12 32 10 Q14 12 14 22 Z", fill });
50
- case 2:
51
- return /* @__PURE__ */ jsxs("g", { fill, children: [
52
- /* @__PURE__ */ jsx("circle", { cx: "20", cy: "14", r: "5" }),
53
- /* @__PURE__ */ jsx("circle", { cx: "28", cy: "11", r: "5.5" }),
54
- /* @__PURE__ */ jsx("circle", { cx: "36", cy: "11", r: "5.5" }),
55
- /* @__PURE__ */ jsx("circle", { cx: "44", cy: "14", r: "5" }),
56
- /* @__PURE__ */ jsx("circle", { cx: "16", cy: "20", r: "4" }),
57
- /* @__PURE__ */ jsx("circle", { cx: "48", cy: "20", r: "4" })
58
- ] });
59
- case 3:
60
- return /* @__PURE__ */ jsxs("g", { fill, children: [
61
- /* @__PURE__ */ jsx("path", { d: "M14 26 Q14 12 32 10 Q50 12 50 26 L50 20 Q50 10 32 8 Q14 10 14 20 Z" }),
62
- /* @__PURE__ */ jsx("path", { d: "M14 20 Q8 16 10 8 Q14 10 20 16 Z" })
63
- ] });
64
- case 4:
65
- return /* @__PURE__ */ jsx("ellipse", { cx: "32", cy: "10", rx: "14", ry: "8", fill });
66
- case 5:
67
- return /* @__PURE__ */ jsx("path", { d: "M14 28 Q14 12 32 10 Q50 12 50 28 L50 20 Q50 10 32 8 Q14 10 14 20 Z", fill });
68
- case 6:
69
- return /* @__PURE__ */ jsxs("g", { fill, children: [
70
- /* @__PURE__ */ jsx("path", { d: "M14 28 Q14 12 32 10 Q50 12 50 28 L50 20 Q50 10 32 8 Q14 10 14 20 Z" }),
71
- /* @__PURE__ */ jsx("rect", { x: "10", y: "28", width: "8", height: "14", rx: "4" }),
72
- /* @__PURE__ */ jsx("rect", { x: "46", y: "28", width: "8", height: "14", rx: "4" })
73
- ] });
74
- case 7: {
75
- const bOp = buzzOpacity(hairCol, skin);
76
- return /* @__PURE__ */ jsx("rect", { x: "15", y: "13", width: "34", height: "16", rx: "10", ry: "8", fill: hairCol, opacity: bOp });
77
- }
78
- case 8:
79
- return /* @__PURE__ */ jsxs("g", { children: [
80
- /* @__PURE__ */ jsx("path", { d: "M14 28 Q14 12 32 10 Q50 12 50 28 L50 20 Q50 10 32 8 Q14 10 14 20 Z", fill }),
81
- /* @__PURE__ */ jsx("path", { d: "M12 30 Q10 20 14 16", fill: "none", stroke: fill, strokeWidth: "4", strokeLinecap: "round" }),
82
- /* @__PURE__ */ jsx("path", { d: "M52 30 Q54 20 50 16", fill: "none", stroke: fill, strokeWidth: "4", strokeLinecap: "round" })
83
- ] });
84
- case 9:
85
- return /* @__PURE__ */ jsxs("g", { fill, children: [
86
- /* @__PURE__ */ jsx("path", { d: "M14 28 Q14 14 32 12 Q50 14 50 28 L50 22 Q50 12 32 10 Q14 12 14 22 Z" }),
87
- /* @__PURE__ */ jsx("ellipse", { cx: "32", cy: "6", rx: "6", ry: "5" })
88
- ] });
89
- default:
90
- return null;
91
- }
33
+ function HairFront(_props) {
34
+ return null;
92
35
  }
93
36
  function Eyes({ ei, eyeCol, eyeWhite, lidColor, full }) {
94
37
  const lx = 25, rx = 39, y = 33;
@@ -109,8 +52,10 @@ function Eyes({ ei, eyeCol, eyeWhite, lidColor, full }) {
109
52
  ] });
110
53
  case 1:
111
54
  return /* @__PURE__ */ jsxs(Fragment, { children: [
112
- /* @__PURE__ */ jsx("circle", { cx: lx, cy: y, r: "2", fill: eyeCol }),
113
- /* @__PURE__ */ jsx("circle", { cx: rx, cy: y, r: "2", fill: eyeCol })
55
+ /* @__PURE__ */ jsx("circle", { cx: lx, cy: y, r: "2.2", fill: eyeCol }),
56
+ full && /* @__PURE__ */ jsx("circle", { cx: lx + 0.5, cy: y - 0.5, r: "0.5", fill: "white", opacity: "0.4" }),
57
+ /* @__PURE__ */ jsx("circle", { cx: rx, cy: y, r: "2.2", fill: eyeCol }),
58
+ full && /* @__PURE__ */ jsx("circle", { cx: rx + 0.5, cy: y - 0.5, r: "0.5", fill: "white", opacity: "0.4" })
114
59
  ] });
115
60
  case 2:
116
61
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -144,25 +89,17 @@ function Eyes({ ei, eyeCol, eyeWhite, lidColor, full }) {
144
89
  ] });
145
90
  case 5:
146
91
  return /* @__PURE__ */ jsxs(Fragment, { children: [
147
- /* @__PURE__ */ jsx("path", { d: `M${lx - 4} ${y} Q${lx} ${y + 4} ${lx + 4} ${y}`, fill: "none", stroke: eyeCol, strokeWidth: "1.8", strokeLinecap: "round" }),
148
- /* @__PURE__ */ jsx("path", { d: `M${rx - 4} ${y} Q${rx} ${y + 4} ${rx + 4} ${y}`, fill: "none", stroke: eyeCol, strokeWidth: "1.8", strokeLinecap: "round" })
92
+ /* @__PURE__ */ jsx("path", { d: `M${lx - 4} ${y} Q${lx} ${y + 4.5} ${lx + 4} ${y}`, fill: "none", stroke: eyeCol, strokeWidth: "2", strokeLinecap: "round" }),
93
+ /* @__PURE__ */ jsx("path", { d: `M${rx - 4} ${y} Q${rx} ${y + 4.5} ${rx + 4} ${y}`, fill: "none", stroke: eyeCol, strokeWidth: "2", strokeLinecap: "round" })
149
94
  ] });
150
95
  case 6:
151
96
  return /* @__PURE__ */ jsxs(Fragment, { children: [
152
97
  /* @__PURE__ */ jsx("circle", { cx: lx, cy: y, r: "3.5", fill: eyeWhite }),
153
98
  /* @__PURE__ */ jsx("circle", { cx: lx + 0.5, cy: y, r: "2", fill: eyeCol }),
154
99
  /* @__PURE__ */ jsx("circle", { cx: lx + 1.5, cy: y - 1, r: "1", fill: "white", opacity: "0.9" }),
155
- full && /* @__PURE__ */ jsxs(Fragment, { children: [
156
- /* @__PURE__ */ jsx("line", { x1: lx + 2.5, y1: y - 3.5, x2: lx + 4, y2: y - 5, stroke: eyeCol, strokeWidth: "0.8", strokeLinecap: "round" }),
157
- /* @__PURE__ */ jsx("line", { x1: lx + 3.5, y1: y - 2.5, x2: lx + 5, y2: y - 3.5, stroke: eyeCol, strokeWidth: "0.8", strokeLinecap: "round" })
158
- ] }),
159
100
  /* @__PURE__ */ jsx("circle", { cx: rx, cy: y, r: "3.5", fill: eyeWhite }),
160
101
  /* @__PURE__ */ jsx("circle", { cx: rx + 0.5, cy: y, r: "2", fill: eyeCol }),
161
102
  /* @__PURE__ */ jsx("circle", { cx: rx + 1.5, cy: y - 1, r: "1", fill: "white", opacity: "0.9" }),
162
- full && /* @__PURE__ */ jsxs(Fragment, { children: [
163
- /* @__PURE__ */ jsx("line", { x1: rx + 2.5, y1: y - 3.5, x2: rx + 4, y2: y - 5, stroke: eyeCol, strokeWidth: "0.8", strokeLinecap: "round" }),
164
- /* @__PURE__ */ jsx("line", { x1: rx + 3.5, y1: y - 2.5, x2: rx + 5, y2: y - 3.5, stroke: eyeCol, strokeWidth: "0.8", strokeLinecap: "round" })
165
- ] }),
166
103
  lids
167
104
  ] });
168
105
  case 7:
@@ -173,6 +110,16 @@ function Eyes({ ei, eyeCol, eyeWhite, lidColor, full }) {
173
110
  /* @__PURE__ */ jsx("ellipse", { cx: rx + 0.5, cy: y, rx: "2.2", ry: "1.2", fill: eyeCol }),
174
111
  lids
175
112
  ] });
113
+ case 8:
114
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
115
+ /* @__PURE__ */ jsx("circle", { cx: lx, cy: y, r: "3.5", fill: eyeWhite }),
116
+ /* @__PURE__ */ jsx("circle", { cx: lx - 1, cy: y, r: "2", fill: eyeCol }),
117
+ full && /* @__PURE__ */ jsx("circle", { cx: lx - 0.3, cy: y - 0.8, r: "0.7", fill: "white", opacity: "0.8" }),
118
+ /* @__PURE__ */ jsx("circle", { cx: rx, cy: y, r: "3.5", fill: eyeWhite }),
119
+ /* @__PURE__ */ jsx("circle", { cx: rx - 1, cy: y, r: "2", fill: eyeCol }),
120
+ full && /* @__PURE__ */ jsx("circle", { cx: rx - 0.3, cy: y - 0.8, r: "0.7", fill: "white", opacity: "0.8" }),
121
+ lids
122
+ ] });
176
123
  default:
177
124
  return /* @__PURE__ */ jsxs(Fragment, { children: [
178
125
  /* @__PURE__ */ jsx("circle", { cx: lx, cy: y, r: "3.5", fill: eyeWhite }),
@@ -183,7 +130,7 @@ function Eyes({ ei, eyeCol, eyeWhite, lidColor, full }) {
183
130
  ] });
184
131
  }
185
132
  }
186
- function Eyebrows({ bi, browColor }) {
133
+ function Eyebrows({ bi, browColor, full = true }) {
187
134
  const lx = 25, rx = 39, y = 27;
188
135
  switch (bi) {
189
136
  case 0:
@@ -211,6 +158,23 @@ function Eyebrows({ bi, browColor }) {
211
158
  /* @__PURE__ */ jsx("polyline", { points: `${lx - 3},${y + 1} ${lx},${y - 2} ${lx + 3},${y}`, fill: "none", stroke: browColor, strokeWidth: "1.2", strokeLinecap: "round", strokeLinejoin: "round" }),
212
159
  /* @__PURE__ */ jsx("polyline", { points: `${rx - 3},${y} ${rx},${y - 2} ${rx + 3},${y + 1}`, fill: "none", stroke: browColor, strokeWidth: "1.2", strokeLinecap: "round", strokeLinejoin: "round" })
213
160
  ] });
161
+ case 5:
162
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
163
+ /* @__PURE__ */ jsx("line", { x1: lx - 3, y1: y - 1, x2: lx + 3, y2: y + 1, stroke: browColor, strokeWidth: "1.1", strokeLinecap: "round" }),
164
+ /* @__PURE__ */ jsx("line", { x1: rx - 3, y1: y + 1, x2: rx + 3, y2: y - 1, stroke: browColor, strokeWidth: "1.1", strokeLinecap: "round" })
165
+ ] });
166
+ case 6: {
167
+ const bw = full ? "2.0" : "1.5";
168
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
169
+ /* @__PURE__ */ jsx("path", { d: `M${lx - 4} ${y + 0.5} Q${lx} ${y - 2} ${lx + 4} ${y + 0.5}`, fill: "none", stroke: browColor, strokeWidth: bw, strokeLinecap: "round" }),
170
+ /* @__PURE__ */ jsx("path", { d: `M${rx - 4} ${y + 0.5} Q${rx} ${y - 2} ${rx + 4} ${y + 0.5}`, fill: "none", stroke: browColor, strokeWidth: bw, strokeLinecap: "round" })
171
+ ] });
172
+ }
173
+ case 7:
174
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
175
+ /* @__PURE__ */ jsx("path", { d: `M${lx - 3.5} ${y} Q${lx} ${y - 1.5} ${lx + 3.5} ${y}`, fill: "none", stroke: browColor, strokeWidth: "0.5", strokeLinecap: "round" }),
176
+ /* @__PURE__ */ jsx("path", { d: `M${rx - 3.5} ${y} Q${rx} ${y - 1.5} ${rx + 3.5} ${y}`, fill: "none", stroke: browColor, strokeWidth: "0.5", strokeLinecap: "round" })
177
+ ] });
214
178
  default:
215
179
  return null;
216
180
  }
@@ -229,6 +193,17 @@ function Nose({ ni, noseFill }) {
229
193
  /* @__PURE__ */ jsx("circle", { cx: cx - 1.8, cy: y, r: "1.2", fill: noseFill, opacity: "0.4" }),
230
194
  /* @__PURE__ */ jsx("circle", { cx: cx + 1.8, cy: y, r: "1.2", fill: noseFill, opacity: "0.4" })
231
195
  ] });
196
+ case 4:
197
+ return /* @__PURE__ */ jsx("path", { d: `M${cx} ${y - 2} L${cx - 2} ${y + 1.5} L${cx + 2} ${y + 1.5} Z`, fill: noseFill, opacity: "0.4" });
198
+ case 5:
199
+ return /* @__PURE__ */ jsx("ellipse", { cx, cy: y, rx: "3.5", ry: "1.5", fill: noseFill, opacity: "0.35" });
200
+ case 6:
201
+ return /* @__PURE__ */ jsx("line", { x1: cx, y1: y - 3, x2: cx, y2: y + 1, stroke: noseFill, strokeWidth: "1.2", strokeLinecap: "round", opacity: "0.4" });
202
+ case 7:
203
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
204
+ /* @__PURE__ */ jsx("circle", { cx, cy: y + 0.5, r: "2", fill: noseFill, opacity: "0.35" }),
205
+ /* @__PURE__ */ jsx("ellipse", { cx, cy: y - 0.5, rx: "1", ry: "0.5", fill: noseFill, opacity: "0.15" })
206
+ ] });
232
207
  default:
233
208
  return /* @__PURE__ */ jsx("ellipse", { cx, cy: y, rx: "2", ry: "1.2", fill: noseFill, opacity: "0.35" });
234
209
  }
@@ -253,7 +228,7 @@ function Mouth({ mi, lipColor, isDark }) {
253
228
  /* @__PURE__ */ jsx("line", { x1: cx - 4, y1: y + 1.5, x2: cx + 4, y2: y + 1.5, stroke: lipColor, strokeWidth: "0.3", opacity: "0.3" })
254
229
  ] });
255
230
  case 6:
256
- return /* @__PURE__ */ jsx("line", { x1: cx - 4, y1: y + 1, x2: cx + 4, y2: y + 1, stroke: lipColor, strokeWidth: "1.5", strokeLinecap: "round" });
231
+ return /* @__PURE__ */ jsx("path", { d: `M${cx - 4} ${y + 0.5} Q${cx} ${y + 1.5} ${cx + 4} ${y + 0.5}`, fill: "none", stroke: lipColor, strokeWidth: "1.4", strokeLinecap: "round" });
257
232
  case 7:
258
233
  return /* @__PURE__ */ jsxs(Fragment, { children: [
259
234
  /* @__PURE__ */ jsx("ellipse", { cx, cy: y + 1, rx: "3.5", ry: "2", fill: lipColor, opacity: "0.25" }),
@@ -263,12 +238,12 @@ function Mouth({ mi, lipColor, isDark }) {
263
238
  return /* @__PURE__ */ jsx("path", { d: `M${cx - 4} ${y} Q${cx} ${y + 4} ${cx + 4} ${y}`, fill: "none", stroke: lipColor, strokeWidth: "1.4", strokeLinecap: "round" });
264
239
  }
265
240
  }
266
- function Accessory({ ai, glassesColor, earringColor, headbandColor }) {
241
+ function Accessory({ ai, accessoryColor: _accessoryColor, glassesColor, earringColor, headbandColor, beautyMarkColor = "#3a2a2a", freckleColor = "#a0785a", skinColor = "#E8BA8B" }) {
267
242
  switch (ai) {
268
243
  case 0:
269
244
  return null;
270
245
  case 1:
271
- return /* @__PURE__ */ jsx("circle", { cx: "40", cy: "44", r: "0.8", fill: "#3a2a2a" });
246
+ return /* @__PURE__ */ jsx("circle", { cx: "40", cy: "44", r: "0.8", fill: beautyMarkColor });
272
247
  case 2:
273
248
  return /* @__PURE__ */ jsxs("g", { fill: "none", stroke: glassesColor, strokeWidth: "1", children: [
274
249
  /* @__PURE__ */ jsx("circle", { cx: "25", cy: "33", r: "5.5" }),
@@ -293,7 +268,7 @@ function Accessory({ ai, glassesColor, earringColor, headbandColor }) {
293
268
  case 5:
294
269
  return /* @__PURE__ */ jsx("rect", { x: "13", y: "20", width: "38", height: "3.5", rx: "1.5", fill: headbandColor, opacity: "0.85" });
295
270
  case 6:
296
- return /* @__PURE__ */ jsxs("g", { fill: "#a0785a", opacity: "0.35", children: [
271
+ return /* @__PURE__ */ jsxs("g", { fill: freckleColor, opacity: "0.35", children: [
297
272
  /* @__PURE__ */ jsx("circle", { cx: "21", cy: "40", r: "0.6" }),
298
273
  /* @__PURE__ */ jsx("circle", { cx: "23", cy: "42", r: "0.5" }),
299
274
  /* @__PURE__ */ jsx("circle", { cx: "19", cy: "41.5", r: "0.5" }),
@@ -316,30 +291,34 @@ function Accessory({ ai, glassesColor, earringColor, headbandColor }) {
316
291
  ] });
317
292
  case 9:
318
293
  return /* @__PURE__ */ jsxs("g", { children: [
319
- /* @__PURE__ */ jsx("rect", { x: "38", y: "38", width: "8", height: "4", rx: "1", fill: "#f0d0a0", transform: "rotate(-15 42 40)" }),
320
- /* @__PURE__ */ jsx("line", { x1: "40", y1: "39", x2: "40", y2: "41", stroke: "#c0a080", strokeWidth: "0.4", transform: "rotate(-15 42 40)" }),
321
- /* @__PURE__ */ jsx("line", { x1: "42", y1: "39", x2: "42", y2: "41", stroke: "#c0a080", strokeWidth: "0.4", transform: "rotate(-15 42 40)" }),
322
- /* @__PURE__ */ jsx("line", { x1: "44", y1: "39", x2: "44", y2: "41", stroke: "#c0a080", strokeWidth: "0.4", transform: "rotate(-15 42 40)" })
294
+ /* @__PURE__ */ jsx("rect", { x: "38", y: "38", width: "9", height: "4.5", rx: "1.2", fill: "#f0d0a0", transform: "rotate(-15 42 40)" }),
295
+ /* @__PURE__ */ jsx("rect", { x: "39.5", y: "38.5", width: "6", height: "3.5", rx: "0.8", fill: "#f5ddb5", transform: "rotate(-15 42 40)" }),
296
+ /* @__PURE__ */ jsx("circle", { cx: "42.5", cy: "40.25", r: "0.5", fill: "#d4b898", transform: "rotate(-15 42 40)" })
323
297
  ] });
298
+ case 10:
299
+ return /* @__PURE__ */ jsx("line", { x1: "23", y1: "24.8", x2: "23.8", y2: "29.2", stroke: skinColor, strokeWidth: "1.3", strokeLinecap: "butt" });
300
+ case 11:
301
+ return /* @__PURE__ */ jsx("line", { x1: "41", y1: "24.8", x2: "40.2", y2: "29.2", stroke: skinColor, strokeWidth: "1.3", strokeLinecap: "butt" });
324
302
  default:
325
303
  return null;
326
304
  }
327
305
  }
328
- function PixelWrapper({ svgString, size, theme }) {
306
+ function PixelWrapper({ svgString, size, theme, alt = "" }) {
307
+ const scale = size / 64;
329
308
  const density = theme._pixelDensity ?? 16;
330
309
  const rounded = theme._pixelRounded ?? true;
331
310
  const outline = theme._pixelOutline ?? false;
332
311
  const outlineColor = theme._pixelOutlineColor ?? "#000";
333
- const outlineWidth = theme._pixelOutlineWidth ?? 1;
312
+ const outlineWidth = Math.max(1, Math.round((theme._pixelOutlineWidth ?? 1) * scale));
334
313
  const scanlines = theme._pixelScanlines ?? false;
335
314
  const scanlineOpacity = theme._pixelScanlineOpacity ?? 0.08;
336
- const scanlineSpacing = theme._pixelScanlineSpacing ?? 2;
315
+ const scanlineSpacing = Math.max(1, Math.round((theme._pixelScanlineSpacing ?? 2) * scale));
337
316
  const grid = theme._pixelGrid ?? false;
338
317
  const gridOpacity = theme._pixelGridOpacity ?? 0.06;
339
318
  const gridColor = theme._pixelGridColor ?? "#000";
340
319
  const shadow = theme._pixelShadow ?? false;
341
320
  const shadowColor = theme._pixelShadowColor ?? "rgba(0,0,0,0.3)";
342
- const shadowOffset = theme._pixelShadowOffset ?? 2;
321
+ const shadowOffset = Math.max(1, Math.round((theme._pixelShadowOffset ?? 2) * scale));
343
322
  const contrast = theme._pixelContrast;
344
323
  const saturation = theme._pixelSaturation;
345
324
  const brightness = theme._pixelBrightness;
@@ -365,7 +344,7 @@ function PixelWrapper({ svgString, size, theme }) {
365
344
  border: outline ? `${outlineWidth}px solid ${outlineColor}` : "none"
366
345
  };
367
346
  return /* @__PURE__ */ jsxs("div", { style: containerStyle, children: [
368
- /* @__PURE__ */ jsx("img", { src: dataUri, width: density, height: density, style: imgStyle, alt: "" }),
347
+ /* @__PURE__ */ jsx("img", { src: dataUri, width: density, height: density, style: imgStyle, alt }),
369
348
  scanlines && /* @__PURE__ */ jsx("div", { style: {
370
349
  position: "absolute",
371
350
  inset: 0,
@@ -384,20 +363,24 @@ function PixelWrapper({ svgString, size, theme }) {
384
363
  ] });
385
364
  }
386
365
  function GlassWrapper({ children, size, theme }) {
387
- const blurRadius = theme._blurRadius ?? 12;
366
+ const scale = size / 64;
367
+ const blurRadius = (theme._blurRadius ?? 12) * scale;
388
368
  const saturate = theme._saturate ?? 1.8;
389
369
  const tintOpacity = theme._tintOpacity ?? 0.12;
390
370
  const tintColor = theme._tintColor ?? "rgba(255,255,255,1)";
391
371
  const borderOpacity = theme._borderOpacity ?? 0.25;
392
- const borderWidth = theme._borderWidth ?? 1;
372
+ const borderWidth = Math.max(0.5, (theme._borderWidth ?? 1) * scale);
393
373
  const borderColor = theme._borderColor ?? `rgba(255,255,255,${borderOpacity})`;
394
374
  const specularOpacity = theme._specularOpacity ?? 0.25;
395
375
  const specularColor = theme._specularColor ?? "rgba(255,255,255,1)";
396
376
  const specularEnd = theme._specularEnd ?? 50;
397
377
  const lightAngle = theme._lightAngle ?? 135;
398
378
  const rimIntensity = theme._rimIntensity ?? 0.08;
399
- const shadowStr = theme._shadow ?? "0 8px 32px rgba(0,0,0,0.12)";
400
- const bgRadius = theme.bgRadius ?? 16;
379
+ const shadowY = Math.round((theme._shadowY ?? 8) * scale);
380
+ const shadowBlurR = Math.round((theme._shadowBlur ?? 32) * scale);
381
+ const shadowOpacity = theme._shadowOpacity ?? 0.12;
382
+ const shadowStr = theme._shadow ?? `0 ${shadowY}px ${shadowBlurR}px rgba(0,0,0,${shadowOpacity})`;
383
+ const bgRadius = (theme.bgRadius ?? 16) * scale;
401
384
  const containerStyle = {
402
385
  position: "relative",
403
386
  width: size,
@@ -476,6 +459,11 @@ function SolFace({
476
459
  const glassesColor = theme?.glassesColor ?? "#4a4a5a";
477
460
  const earringColor = theme?.earringColor ?? blend(skin, "#d4a840", 0.4);
478
461
  const headbandColor = theme?.headbandColor ?? blend(hairCol, "#c04040", 0.5);
462
+ const accColor = colorOverrides?.accessory ?? theme?.accessoryColor ?? derived.accessoryColor;
463
+ const earFillFinal = theme?.earColor ?? derived.earFill;
464
+ const lidFinal = theme?.lidColor ?? derived.lidColor;
465
+ const beautyMarkColor = theme?.beautyMarkColor ?? "#3a2a2a";
466
+ const freckleColor = theme?.freckleColor ?? "#a0785a";
479
467
  const id = useMemo(() => "sf" + djb2(walletAddress).toString(36), [walletAddress]);
480
468
  const cheekEnabled = theme?.cheekEnabled ?? true;
481
469
  const cheekColor = theme?.cheekColor ?? derived.cheekColor;
@@ -496,7 +484,7 @@ function SolFace({
496
484
  colorOverrides,
497
485
  detail: detailProp
498
486
  });
499
- return /* @__PURE__ */ jsx(PixelWrapper, { svgString: pixelSvg, size, theme });
487
+ return /* @__PURE__ */ jsx(PixelWrapper, { svgString: pixelSvg, size, theme, alt: solFaceAltText(walletAddress) });
500
488
  }
501
489
  const svgElement = /* @__PURE__ */ jsxs(
502
490
  "svg",
@@ -507,24 +495,23 @@ function SolFace({
507
495
  height: size,
508
496
  className,
509
497
  style: { display: "block", ...style },
498
+ role: "img",
499
+ "aria-label": solFaceAltText(walletAddress),
510
500
  ...rest,
511
501
  children: [
512
502
  !flat && /* @__PURE__ */ jsxs("defs", { children: [
513
503
  /* @__PURE__ */ jsxs("linearGradient", { id: `${id}sg`, x1: "0", y1: "0", x2: "0", y2: "1", children: [
514
504
  /* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: derived.skinHi }),
505
+ /* @__PURE__ */ jsx("stop", { offset: "50%", stopColor: skin }),
515
506
  /* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: derived.skinLo })
516
507
  ] }),
517
- /* @__PURE__ */ jsxs("linearGradient", { id: `${id}hg`, x1: "0", y1: "0", x2: "0", y2: "1", children: [
518
- /* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: lighten(hairCol, 0.15) }),
519
- /* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: darken(hairCol, 0.15) })
520
- ] }),
521
508
  /* @__PURE__ */ jsxs("linearGradient", { id: `${id}bg`, x1: "0", y1: "0", x2: "1", y2: "1", children: [
522
509
  /* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: lighten(bgCol, 0.12) }),
523
510
  /* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: darken(bgCol, 0.12) })
524
511
  ] }),
525
512
  full && cheekEnabled && /* @__PURE__ */ jsxs(Fragment, { children: [
526
513
  /* @__PURE__ */ jsxs("radialGradient", { id: `${id}glow`, cx: "0.5", cy: "0.28", r: "0.45", children: [
527
- /* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: "#ffffff", stopOpacity: 0.1 }),
514
+ /* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: "#ffffff", stopOpacity: theme?.glowIntensity ?? 0.1 }),
528
515
  /* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: "#ffffff", stopOpacity: 0 })
529
516
  ] }),
530
517
  /* @__PURE__ */ jsxs("radialGradient", { id: `${id}chin`, cx: "0.5", cy: "0.85", r: "0.35", children: [
@@ -552,17 +539,17 @@ function SolFace({
552
539
  }
553
540
  ` }),
554
541
  /* @__PURE__ */ jsx("rect", { x: "0", y: "0", width: "64", height: "64", fill: bgFill, opacity: bgOpacity, rx: bgRadius }),
555
- /* @__PURE__ */ jsx(HairBack, { hi, id, flat }),
556
- /* @__PURE__ */ jsx(Ears, { earFill: derived.earFill, earShadow: derived.earShadow }),
557
- /* @__PURE__ */ jsx("rect", { x: "14", y: "16", width: "36", height: "38", rx: "12", ry: "12", fill: skinFill }),
558
- full && cheekEnabled && !flat && /* @__PURE__ */ jsx(FaceOverlays, { id }),
559
- ai === 5 && /* @__PURE__ */ jsx(Accessory, { ai: 5, glassesColor, earringColor, headbandColor }),
560
- /* @__PURE__ */ jsx(HairFront, { hi, id, hairCol, skin, flat }),
561
- /* @__PURE__ */ jsx("g", { className: blinkEnabled ? `${id}-eyes` : void 0, children: /* @__PURE__ */ jsx(Eyes, { ei: traits.eyeStyle % 8, eyeCol, eyeWhite, lidColor: derived.lidColor, full }) }),
562
- /* @__PURE__ */ jsx(Eyebrows, { bi: traits.eyebrows % 5, browColor }),
563
- /* @__PURE__ */ jsx(Nose, { ni: traits.nose % 4, noseFill }),
542
+ theme?.hairEnabled !== false && /* @__PURE__ */ jsx(HairBack, { hi, id, flat }),
543
+ theme?.earsEnabled !== false && /* @__PURE__ */ jsx(Ears, { earFill: earFillFinal, earShadow: derived.earShadow }),
544
+ /* @__PURE__ */ jsx("rect", { x: "14", y: "16", width: "36", height: "38", rx: "12", ry: "12", fill: skinFill, opacity: theme?.skinOpacity ?? 1 }),
545
+ full && cheekEnabled && !flat && (theme?.shadowEnabled ?? true) && /* @__PURE__ */ jsx(FaceOverlays, { id }),
546
+ theme?.hairEnabled !== false && /* @__PURE__ */ jsx(HairFront, { hi, id, hairCol, flat }),
547
+ ai === 5 && theme?.accessoriesEnabled !== false && /* @__PURE__ */ jsx(Accessory, { ai: 5, accessoryColor: accColor, glassesColor, earringColor, headbandColor, beautyMarkColor, freckleColor, skinColor: skin }),
548
+ /* @__PURE__ */ jsx("g", { className: blinkEnabled ? `${id}-eyes` : void 0, children: /* @__PURE__ */ jsx(Eyes, { ei: traits.eyeStyle % 9, eyeCol, eyeWhite, lidColor: lidFinal, full }) }),
549
+ theme?.eyebrowsEnabled !== false && /* @__PURE__ */ jsx(Eyebrows, { bi: traits.eyebrows % 8, browColor, full }),
550
+ theme?.noseEnabled !== false && /* @__PURE__ */ jsx(Nose, { ni: traits.nose % 8, noseFill }),
564
551
  /* @__PURE__ */ jsx(Mouth, { mi: traits.mouth % 8, lipColor, isDark: derived.isDark }),
565
- ai !== 0 && ai !== 5 && /* @__PURE__ */ jsx(Accessory, { ai, glassesColor, earringColor, headbandColor }),
552
+ ai !== 0 && ai !== 5 && theme?.accessoriesEnabled !== false && /* @__PURE__ */ jsx(Accessory, { ai, accessoryColor: accColor, glassesColor, earringColor, headbandColor, beautyMarkColor, freckleColor, skinColor: skin }),
566
553
  theme?.border && /* @__PURE__ */ jsx("rect", { x: "0", y: "0", width: "64", height: "64", fill: "none", stroke: theme.border.color, strokeWidth: theme.border.width, rx: bgRadius })
567
554
  ]
568
555
  }