solfaces 2.3.2 → 2.3.3

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 (40) hide show
  1. package/README.md +3 -3
  2. package/dist/agent/index.cjs +13 -13
  3. package/dist/agent/index.js +3 -3
  4. package/dist/agent/mcp-server.cjs +24 -14
  5. package/dist/{chunk-PCSRDAWQ.cjs → chunk-375DBADY.cjs} +20 -14
  6. package/dist/chunk-375DBADY.cjs.map +1 -0
  7. package/dist/{chunk-MYUSB4LA.js → chunk-C44YBK6V.js} +20 -14
  8. package/dist/chunk-C44YBK6V.js.map +1 -0
  9. package/dist/{chunk-2KW35VRI.js → chunk-EFN2CSAI.js} +3 -3
  10. package/dist/{chunk-2KW35VRI.js.map → chunk-EFN2CSAI.js.map} +1 -1
  11. package/dist/{chunk-W2U6ITMR.cjs → chunk-FYZJEEBJ.cjs} +8 -4
  12. package/dist/chunk-FYZJEEBJ.cjs.map +1 -0
  13. package/dist/{chunk-T7HEUW2O.cjs → chunk-G4VYNQII.cjs} +6 -6
  14. package/dist/{chunk-T7HEUW2O.cjs.map → chunk-G4VYNQII.cjs.map} +1 -1
  15. package/dist/{chunk-O2IIBSQH.js → chunk-N4AP5NEL.js} +4 -4
  16. package/dist/{chunk-O2IIBSQH.js.map → chunk-N4AP5NEL.js.map} +1 -1
  17. package/dist/{chunk-BI3GHRKQ.cjs → chunk-QVCF45AC.cjs} +12 -12
  18. package/dist/{chunk-BI3GHRKQ.cjs.map → chunk-QVCF45AC.cjs.map} +1 -1
  19. package/dist/{chunk-N5GDLCCL.js → chunk-VWYO6SVB.js} +8 -4
  20. package/dist/chunk-VWYO6SVB.js.map +1 -0
  21. package/dist/core/index.cjs +30 -30
  22. package/dist/core/index.js +2 -2
  23. package/dist/index.cjs +37 -37
  24. package/dist/index.js +4 -4
  25. package/dist/react/index.cjs +23 -19
  26. package/dist/react/index.cjs.map +1 -1
  27. package/dist/react/index.js +9 -5
  28. package/dist/react/index.js.map +1 -1
  29. package/dist/solfaces.cdn.global.js +2 -2
  30. package/dist/solfaces.cdn.global.js.map +1 -1
  31. package/dist/themes/index.cjs +15 -15
  32. package/dist/themes/index.js +1 -1
  33. package/dist/vanilla/index.cjs +6 -6
  34. package/dist/vanilla/index.js +2 -2
  35. package/package.json +1 -1
  36. package/python/solfaces.py +8 -5
  37. package/dist/chunk-MYUSB4LA.js.map +0 -1
  38. package/dist/chunk-N5GDLCCL.js.map +0 -1
  39. package/dist/chunk-PCSRDAWQ.cjs.map +0 -1
  40. package/dist/chunk-W2U6ITMR.cjs.map +0 -1
@@ -1,64 +1,64 @@
1
1
  'use strict';
2
2
 
3
- var chunkPCSRDAWQ_cjs = require('../chunk-PCSRDAWQ.cjs');
3
+ var chunk375DBADY_cjs = require('../chunk-375DBADY.cjs');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "PRESET_THEMES", {
8
8
  enumerable: true,
9
- get: function () { return chunkPCSRDAWQ_cjs.PRESET_THEMES; }
9
+ get: function () { return chunk375DBADY_cjs.PRESET_THEMES; }
10
10
  });
11
11
  Object.defineProperty(exports, "createTheme", {
12
12
  enumerable: true,
13
- get: function () { return chunkPCSRDAWQ_cjs.createTheme; }
13
+ get: function () { return chunk375DBADY_cjs.createTheme; }
14
14
  });
15
15
  Object.defineProperty(exports, "darkTheme", {
16
16
  enumerable: true,
17
- get: function () { return chunkPCSRDAWQ_cjs.darkTheme; }
17
+ get: function () { return chunk375DBADY_cjs.darkTheme; }
18
18
  });
19
19
  Object.defineProperty(exports, "defaultTheme", {
20
20
  enumerable: true,
21
- get: function () { return chunkPCSRDAWQ_cjs.defaultTheme; }
21
+ get: function () { return chunk375DBADY_cjs.defaultTheme; }
22
22
  });
23
23
  Object.defineProperty(exports, "flatTheme", {
24
24
  enumerable: true,
25
- get: function () { return chunkPCSRDAWQ_cjs.flatTheme; }
25
+ get: function () { return chunk375DBADY_cjs.flatTheme; }
26
26
  });
27
27
  Object.defineProperty(exports, "getPresetTheme", {
28
28
  enumerable: true,
29
- get: function () { return chunkPCSRDAWQ_cjs.getPresetTheme; }
29
+ get: function () { return chunk375DBADY_cjs.getPresetTheme; }
30
30
  });
31
31
  Object.defineProperty(exports, "glassDarkTheme", {
32
32
  enumerable: true,
33
- get: function () { return chunkPCSRDAWQ_cjs.glassDarkTheme; }
33
+ get: function () { return chunk375DBADY_cjs.glassDarkTheme; }
34
34
  });
35
35
  Object.defineProperty(exports, "glassTheme", {
36
36
  enumerable: true,
37
- get: function () { return chunkPCSRDAWQ_cjs.glassTheme; }
37
+ get: function () { return chunk375DBADY_cjs.glassTheme; }
38
38
  });
39
39
  Object.defineProperty(exports, "lightTheme", {
40
40
  enumerable: true,
41
- get: function () { return chunkPCSRDAWQ_cjs.lightTheme; }
41
+ get: function () { return chunk375DBADY_cjs.lightTheme; }
42
42
  });
43
43
  Object.defineProperty(exports, "monoTheme", {
44
44
  enumerable: true,
45
- get: function () { return chunkPCSRDAWQ_cjs.monoTheme; }
45
+ get: function () { return chunk375DBADY_cjs.monoTheme; }
46
46
  });
47
47
  Object.defineProperty(exports, "pixelCleanTheme", {
48
48
  enumerable: true,
49
- get: function () { return chunkPCSRDAWQ_cjs.pixelCleanTheme; }
49
+ get: function () { return chunk375DBADY_cjs.pixelCleanTheme; }
50
50
  });
51
51
  Object.defineProperty(exports, "pixelRetroTheme", {
52
52
  enumerable: true,
53
- get: function () { return chunkPCSRDAWQ_cjs.pixelRetroTheme; }
53
+ get: function () { return chunk375DBADY_cjs.pixelRetroTheme; }
54
54
  });
55
55
  Object.defineProperty(exports, "pixelTheme", {
56
56
  enumerable: true,
57
- get: function () { return chunkPCSRDAWQ_cjs.pixelTheme; }
57
+ get: function () { return chunk375DBADY_cjs.pixelTheme; }
58
58
  });
59
59
  Object.defineProperty(exports, "transparentTheme", {
60
60
  enumerable: true,
61
- get: function () { return chunkPCSRDAWQ_cjs.transparentTheme; }
61
+ get: function () { return chunk375DBADY_cjs.transparentTheme; }
62
62
  });
63
63
  //# sourceMappingURL=index.cjs.map
64
64
  //# sourceMappingURL=index.cjs.map
@@ -1,3 +1,3 @@
1
- export { PRESET_THEMES, createTheme, darkTheme, defaultTheme, flatTheme, getPresetTheme, glassDarkTheme, glassTheme, lightTheme, monoTheme, pixelCleanTheme, pixelRetroTheme, pixelTheme, transparentTheme } from '../chunk-MYUSB4LA.js';
1
+ export { PRESET_THEMES, createTheme, darkTheme, defaultTheme, flatTheme, getPresetTheme, glassDarkTheme, glassTheme, lightTheme, monoTheme, pixelCleanTheme, pixelRetroTheme, pixelTheme, transparentTheme } from '../chunk-C44YBK6V.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkW2U6ITMR_cjs = require('../chunk-W2U6ITMR.cjs');
4
- var chunkPCSRDAWQ_cjs = require('../chunk-PCSRDAWQ.cjs');
3
+ var chunkFYZJEEBJ_cjs = require('../chunk-FYZJEEBJ.cjs');
4
+ var chunk375DBADY_cjs = require('../chunk-375DBADY.cjs');
5
5
 
6
6
  // src/vanilla/index.ts
7
7
  function mountSolFace(element, walletAddress, options) {
@@ -11,7 +11,7 @@ function mountSolFace(element, walletAddress, options) {
11
11
  return () => {
12
12
  };
13
13
  }
14
- el.innerHTML = chunkW2U6ITMR_cjs.renderSolFaceSVG(walletAddress, options);
14
+ el.innerHTML = chunkFYZJEEBJ_cjs.renderSolFaceSVG(walletAddress, options);
15
15
  return () => {
16
16
  el.innerHTML = "";
17
17
  };
@@ -19,8 +19,8 @@ function mountSolFace(element, walletAddress, options) {
19
19
  function setSolFaceImg(img, walletAddress, options) {
20
20
  const el = typeof img === "string" ? document.querySelector(img) : img;
21
21
  if (!el) return;
22
- el.src = chunkW2U6ITMR_cjs.renderSolFaceDataURI(walletAddress, options);
23
- el.alt = chunkW2U6ITMR_cjs.solFaceAltText(walletAddress);
22
+ el.src = chunkFYZJEEBJ_cjs.renderSolFaceDataURI(walletAddress, options);
23
+ el.alt = chunkFYZJEEBJ_cjs.solFaceAltText(walletAddress);
24
24
  }
25
25
  function autoInit(root = document) {
26
26
  const elements = root.querySelectorAll("[data-solface]");
@@ -32,7 +32,7 @@ function autoInit(root = document) {
32
32
  const themeName = el.getAttribute("data-solface-theme");
33
33
  const flat = el.getAttribute("data-solface-flat") === "true";
34
34
  const detail = el.getAttribute("data-solface-detail");
35
- let theme = themeName && themeName in chunkPCSRDAWQ_cjs.PRESET_THEMES ? chunkPCSRDAWQ_cjs.PRESET_THEMES[themeName] : void 0;
35
+ let theme = themeName && themeName in chunk375DBADY_cjs.PRESET_THEMES ? chunk375DBADY_cjs.PRESET_THEMES[themeName] : void 0;
36
36
  if (flat && theme) {
37
37
  theme = { ...theme, flat: true };
38
38
  } else if (flat) {
@@ -1,5 +1,5 @@
1
- import { renderSolFaceSVG, renderSolFaceDataURI, solFaceAltText } from '../chunk-N5GDLCCL.js';
2
- import { PRESET_THEMES } from '../chunk-MYUSB4LA.js';
1
+ import { renderSolFaceSVG, renderSolFaceDataURI, solFaceAltText } from '../chunk-VWYO6SVB.js';
2
+ import { PRESET_THEMES } from '../chunk-C44YBK6V.js';
3
3
 
4
4
  // src/vanilla/index.ts
5
5
  function mountSolFace(element, walletAddress, options) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "solfaces",
3
- "version": "2.3.2",
3
+ "version": "2.3.3",
4
4
  "description": "Deterministic wallet avatars and names for the Solana ecosystem. SHA-256 name derivation, zero-dependency trait engine with React, vanilla JS, and server-side rendering support.",
5
5
  "author": "https://github.com/jorger3301",
6
6
  "license": "MIT",
@@ -525,11 +525,14 @@ def _render_accessory(ai: int, acc_color: str, glasses_color: str, earring_color
525
525
  '<line x1="19" y1="31" x2="14" y2="29"/>'
526
526
  '<line x1="45" y1="31" x2="50" y2="29"/></g>')
527
527
  if ai == 9:
528
- return ('<g>'
529
- '<rect x="38" y="38" width="9" height="4.5" rx="1.2" fill="#f0d0a0" transform="rotate(-15 42 40)"/>'
530
- '<rect x="39.5" y="38.5" width="6" height="3.5" rx="0.8" fill="#f5ddb5" transform="rotate(-15 42 40)"/>'
531
- '<circle cx="42.5" cy="40.25" r="0.5" fill="#d4b898" transform="rotate(-15 42 40)"/>'
532
- '</g>')
528
+ band_base = lighten(skin_color, 0.3)
529
+ band_pad = lighten(skin_color, 0.4)
530
+ band_dot = darken(skin_color, 0.1)
531
+ return (f'<g>'
532
+ f'<rect x="38" y="38" width="9" height="4.5" rx="1.2" fill="{band_base}" transform="rotate(-15 42 40)"/>'
533
+ f'<rect x="39.5" y="38.5" width="6" height="3.5" rx="0.8" fill="{band_pad}" transform="rotate(-15 42 40)"/>'
534
+ f'<circle cx="42.5" cy="40.25" r="0.5" fill="{band_dot}" transform="rotate(-15 42 40)"/>'
535
+ f'</g>')
533
536
  if ai == 10: # Left Eyebrow Slit
534
537
  return f'<line x1="23" y1="24.8" x2="23.8" y2="29.2" stroke="{skin_color}" stroke-width="1.3" stroke-linecap="butt"/>'
535
538
  if ai == 11: # Right Eyebrow Slit
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/themes/presets.ts"],"names":[],"mappings":"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","file":"chunk-MYUSB4LA.js","sourcesContent":["// ═══════════════════════════════════════════════════════════════\n// SOLFACES v2 — Preset Themes\n// ═══════════════════════════════════════════════════════════════\n\nimport type { SolFaceTheme } from \"../core/traits\";\n\n// ─── Default (base look — gradients, no overrides) ─\n\nexport const defaultTheme: SolFaceTheme = {};\n\n// ─── Base Themes ────────────────────────────────\n\nexport const darkTheme: SolFaceTheme = {\n bgColors: [\"#1a1b23\", \"#1e1428\", \"#0a1e38\", \"#1b2838\", \"#201028\",\n \"#141a28\", \"#18122a\", \"#1a2020\", \"#221822\", \"#1e1020\",\n \"#1c1228\", \"#0e201a\"],\n eyeWhiteColor: \"#d8d0c8\",\n bgOpacity: 1,\n bgRadius: 4,\n border: { color: \"#333340\", width: 0.5 },\n};\n\nexport const lightTheme: SolFaceTheme = {\n bgColors: [\"#f5e8ea\", \"#f0f0d8\", \"#e4f0e6\", \"#d8f0e8\", \"#e0ece8\",\n \"#dce8f0\", \"#e0e4f0\", \"#e0d8f0\", \"#f0e0ee\", \"#f0d8e4\",\n \"#e8d8f0\", \"#d8f0e8\"],\n bgOpacity: 1,\n bgRadius: 8,\n};\n\nexport const monoTheme: SolFaceTheme = {\n skinColors: [\"#e8e8e8\", \"#d4d4d4\", \"#c0c0c0\", \"#a8a8a8\", \"#909090\",\n \"#787878\", \"#606060\", \"#505050\", \"#404040\", \"#303030\"],\n eyeColors: [\"#333\", \"#555\", \"#777\", \"#999\", \"#bbb\"],\n hairColors: [\"#1a1a1a\", \"#2a2a2a\", \"#404040\", \"#555\", \"#707070\",\n \"#888\", \"#a0a0a0\", \"#b8b8b8\", \"#d0d0d0\", \"#e0e0e0\"],\n bgColors: [\"#e8e0e0\", \"#e0e0d0\", \"#d8e0d8\", \"#d0e0d8\", \"#d8e0e0\",\n \"#d0d8e0\", \"#d4d4e0\", \"#d4d0e0\", \"#e0d8e0\", \"#e0d0d8\",\n \"#d8d0e0\", \"#d0e0d8\"],\n mouthColor: \"#666\",\n eyebrowColor: \"#555\",\n accessoryColor: \"#777\",\n eyeWhiteColor: \"#f0f0f0\",\n bgOpacity: 0.5,\n bgRadius: 4,\n};\n\nexport const flatTheme: SolFaceTheme = {\n flat: true,\n};\n\nexport const transparentTheme: SolFaceTheme = {\n flat: true,\n bgOpacity: 0,\n};\n\n// ─── React-Only: Liquid Glass ───────────────────\n\nexport const glassTheme: SolFaceTheme = {\n bgOpacity: 0.15,\n bgRadius: 16,\n _glass: true,\n _blurRadius: 12,\n _saturate: 1.8,\n _tintOpacity: 0.12,\n _tintColor: \"rgba(255,255,255,1)\",\n _borderOpacity: 0.25,\n _borderWidth: 1,\n _borderColor: \"rgba(255,255,255,0.25)\",\n _specularOpacity: 0.25,\n _specularColor: \"rgba(255,255,255,1)\",\n _specularEnd: 50,\n _lightAngle: 135,\n _rimIntensity: 0.08,\n _shadowY: 8,\n _shadowBlur: 32,\n _shadowOpacity: 0.12,\n};\n\nexport const glassDarkTheme: SolFaceTheme = {\n bgOpacity: 0.2,\n bgRadius: 16,\n _glass: true,\n _blurRadius: 16,\n _saturate: 2.0,\n _tintOpacity: 0.08,\n _tintColor: \"rgba(0,0,0,1)\",\n _borderOpacity: 0.15,\n _borderWidth: 1,\n _borderColor: \"rgba(255,255,255,0.15)\",\n _specularOpacity: 0.15,\n _specularColor: \"rgba(255,255,255,1)\",\n _specularEnd: 40,\n _lightAngle: 135,\n _rimIntensity: 0.05,\n _shadowY: 8,\n _shadowBlur: 32,\n _shadowOpacity: 0.25,\n};\n\n// ─── React-Only: Pixel Art ──────────────────────\n\nexport const pixelTheme: SolFaceTheme = {\n flat: true,\n _pixel: true,\n _pixelDensity: 16,\n _pixelRounded: true,\n _pixelOutline: true,\n _pixelOutlineColor: \"#222\",\n _pixelOutlineWidth: 2,\n};\n\nexport const pixelRetroTheme: SolFaceTheme = {\n flat: true,\n _pixel: true,\n _pixelDensity: 12,\n _pixelRounded: false,\n _pixelOutline: true,\n _pixelOutlineColor: \"#000\",\n _pixelOutlineWidth: 2,\n _pixelScanlines: true,\n _pixelScanlineOpacity: 0.1,\n _pixelScanlineSpacing: 2,\n _pixelShadow: true,\n _pixelShadowColor: \"rgba(0,0,0,0.4)\",\n _pixelShadowOffset: 3,\n};\n\nexport const pixelCleanTheme: SolFaceTheme = {\n flat: true,\n _pixel: true,\n _pixelDensity: 24,\n _pixelRounded: true,\n _pixelOutline: false,\n};\n\n// ─── Theme Map ──────────────────────────────────\n\n/** Names of all built-in preset themes. */\nexport type PresetThemeName = \"default\" | \"dark\" | \"light\" | \"mono\" | \"flat\" | \"transparent\" | \"glass\" | \"glassDark\" | \"pixel\" | \"pixelRetro\" | \"pixelClean\";\n\n/** Map of all built-in preset themes, keyed by name. */\nexport const PRESET_THEMES: Record<PresetThemeName, SolFaceTheme> = {\n default: defaultTheme,\n dark: darkTheme,\n light: lightTheme,\n mono: monoTheme,\n flat: flatTheme,\n transparent: transparentTheme,\n glass: glassTheme,\n glassDark: glassDarkTheme,\n pixel: pixelTheme,\n pixelRetro: pixelRetroTheme,\n pixelClean: pixelCleanTheme,\n};\n\n/**\n * Look up a built-in preset theme by name, optionally merging overrides.\n *\n * @param name Preset theme name (e.g. \"glass\", \"dark\", \"pixelRetro\").\n * @param overrides Optional partial theme to merge on top of the preset.\n * @returns The resolved theme object.\n */\nexport function getPresetTheme(\n name: PresetThemeName,\n overrides?: Partial<SolFaceTheme>,\n): SolFaceTheme {\n const base = PRESET_THEMES[name];\n if (!base) return (overrides as SolFaceTheme) ?? {};\n return overrides ? { ...base, ...overrides } : base;\n}\n\n/**\n * Build a custom theme by starting from a preset mode and merging your overrides.\n * All SolFaceTheme properties are available for IntelliSense-driven customization.\n *\n * @param options Theme options. Use `mode` to start from a preset base, then override any property.\n * @returns A fully resolved SolFaceTheme object.\n *\n * @example\n * ```ts\n * const myTheme = createTheme({ mode: \"dark\", bgRadius: 12, flat: true });\n * ```\n */\nexport function createTheme(\n options: Partial<SolFaceTheme> & {\n /** Start from a preset mode. Default: none (default gradient theme). */\n mode?: \"light\" | \"dark\" | \"transparent\" | \"mono\" | \"flat\";\n } = {},\n): SolFaceTheme {\n const { mode, ...rest } = options;\n let base: SolFaceTheme = {};\n\n if (mode === \"dark\") base = { ...darkTheme };\n else if (mode === \"light\") base = { ...lightTheme };\n else if (mode === \"transparent\") base = { ...transparentTheme };\n else if (mode === \"mono\") base = { ...monoTheme };\n else if (mode === \"flat\") base = { ...flatTheme };\n\n return { ...base, ...rest };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/traits.ts","../src/core/colors.ts","../src/core/describe.ts","../src/core/renderer.ts"],"names":["djb2"],"mappings":"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","file":"chunk-N5GDLCCL.js","sourcesContent":["// ═══════════════════════════════════════════════════\n// SOLFACES v2 — Deterministic avatar trait engine\n// ═══════════════════════════════════════════════════\n\n// ─── Types ────────────────────────────────────────\n\n/** Deterministic trait indices generated from a wallet address. Each index selects a visual variant. */\nexport interface SolFaceTraits {\n /** Face shape variant (0–3). Consumed for PRNG ordering; all faces render as squircle. */\n faceShape: number;\n /** Skin tone index (0–9). Maps to: Porcelain, Ivory, Fair, Light, Sand, Golden, Warm, Caramel, Brown, Deep. */\n skinColor: number;\n /** Eye shape variant (0–8). Maps to: Round, Minimal, Almond, Wide, Relaxed, Joyful, Bright, Gentle, Side-look. */\n eyeStyle: number;\n /** Eye iris color index (0–7). Maps to: Chocolate, Sky, Emerald, Hazel, Storm, Amber, Violet, Gray. */\n eyeColor: number;\n /** Eyebrow style (0–7). Maps to: Wispy, Straight, Natural, Arched, Angled, Worried, Bushy, Thin. */\n eyebrows: number;\n /** Nose variant (0–7). Maps to: Shadow, Button, Soft, Nostrils, Pointed, Wide, Bridge, Snub. */\n nose: number;\n /** Mouth expression (0–7). Maps to: Smile, Calm, Happy, Oh, Smirk, Grin, Flat, Pout. */\n mouth: number;\n /** Hair style (0–9). Maps to: Bald, Crew, Curly, Side Part, Long, Buzz, Beanie, Cap, Mohawk, Bun. */\n hairStyle: number;\n /** Hair color index (0–9). Maps to: Black, Espresso, Walnut, Honey, Copper, Silver, Charcoal, Burgundy, Strawberry, Ginger. */\n hairColor: number;\n /** Accessory (0–11). Maps to: None, Beauty Mark, Round Glasses, Rect Glasses, Earring, Headband, Freckles, Stud Earrings, Aviators, Band-Aid, Left Eyebrow Slit, Right Eyebrow Slit. */\n accessory: number;\n /** Background color index (0–11). Maps to: Rose, Olive, Sage, Fern, Mint, Ocean, Sky, Lavender, Orchid, Blush, Lilac, Seafoam. */\n bgColor: number;\n}\n\nexport interface SolFaceTheme {\n // ── Palette overrides ──────────────────────────\n\n /** Override the 10 skin tone colors. Default: natural palette from porcelain (#faeae5) to deep brown (#4b2d25). */\n skinColors?: string[];\n /** Override the 8 eye iris colors. Default: chocolate, sky, emerald, hazel, storm, amber, violet, gray. */\n eyeColors?: string[];\n /** Override the 10 hair colors. Default: black through ginger. */\n hairColors?: string[];\n /** Override the 12 background colors. Default: muted earth tones (rose, olive, sage, ..., lilac, seafoam). */\n bgColors?: string[];\n\n // ── Single-color overrides ─────────────────────\n\n /** Override mouth/lip color for all faces. Default: derived from skin luminance. */\n mouthColor?: string;\n /** Override eyebrow color for all faces. Default: derived from skin luminance. */\n eyebrowColor?: string;\n /** Override accessory accent color. Default: skin-warm neutral derived from skin. */\n accessoryColor?: string;\n /** Override eye white (sclera) color. Default: adapted to skin luminance (#EDE8E0 → #FBF8F2). */\n eyeWhiteColor?: string;\n /** Override nose shadow/fill color. Default: derived from skin luminance. */\n noseColor?: string;\n /** Override glasses frame color. Default: \"#4a4a5a\". */\n glassesColor?: string;\n /** Override earring color. Default: skin–gold blend. */\n earringColor?: string;\n /** Override headband color. Default: hair–red blend. */\n headbandColor?: string;\n /** Override ear fill color. Default: derived blend of skin highlight and shadow. */\n earColor?: string;\n /** Override eyelid color. Default: derived from skin luminance. */\n lidColor?: string;\n /** Override freckle dot color. Default: \"#a0785a\". */\n freckleColor?: string;\n /** Override beauty mark color. Default: \"#3a2a2a\". */\n beautyMarkColor?: string;\n\n // ── Layout ─────────────────────────────────────\n\n /** Background opacity (0 = transparent, 1 = solid). Default: 1. */\n bgOpacity?: number;\n /** Background corner radius in SVG units (viewBox is 64×64). Default: 4. */\n bgRadius?: number;\n /** Optional border around the avatar. */\n border?: { color: string; width: number };\n\n // ── Rendering options ──────────────────────────\n\n /** Flat rendering — disables all gradients. Default: false. */\n flat?: boolean;\n /** Show cheek blush overlays (full detail only). Default: true. */\n cheekEnabled?: boolean;\n /** Override cheek blush color. Default: derived warm blush from skin. */\n cheekColor?: string;\n /** Cheek blush opacity (0–1). Default: derived from skin luminance (~0.15–0.33). */\n cheekOpacity?: number;\n /** Face skin opacity (0–1). Default: 1. */\n skinOpacity?: number;\n /** Show chin shadow and glow overlays (full detail only). Default: true. */\n shadowEnabled?: boolean;\n /** Face glow highlight intensity (0–1). Default: 0.10. */\n glowIntensity?: number;\n\n // ── Feature visibility toggles ─────────────────\n\n /** Show/hide ears. Default: true. */\n earsEnabled?: boolean;\n /** Show/hide eyebrows. Default: true. */\n eyebrowsEnabled?: boolean;\n /** Show/hide nose. Default: true. */\n noseEnabled?: boolean;\n /** Show/hide accessories (glasses, earrings, headband, etc.). Default: true. */\n accessoriesEnabled?: boolean;\n /** Show/hide hair (front and back). Default: true. */\n hairEnabled?: boolean;\n\n // ── React-only: pixel art mode ─────────────────\n\n /** Enable pixel art rendering mode. Default: false. */\n _pixel?: boolean;\n /** Pixel grid resolution (source canvas size). Lower = blockier. Default: 16. */\n _pixelDensity?: number;\n /** Round pixel art corners (12% border-radius). Default: true. */\n _pixelRounded?: boolean;\n /** Show pixel outline border. Default: false. */\n _pixelOutline?: boolean;\n /** Pixel outline color. Default: \"#000\". */\n _pixelOutlineColor?: string;\n /** Pixel outline width at 64px reference size. Scales proportionally. Default: 1. */\n _pixelOutlineWidth?: number;\n /** CSS contrast filter (1.0 = normal). */\n _pixelContrast?: number;\n /** CSS saturate filter (1.0 = normal). */\n _pixelSaturation?: number;\n /** CSS brightness filter (1.0 = normal). */\n _pixelBrightness?: number;\n /** Show CRT-style scanline overlay. Default: false. */\n _pixelScanlines?: boolean;\n /** Scanline overlay opacity (0–1). Default: 0.08. */\n _pixelScanlineOpacity?: number;\n /** Scanline spacing in px at 64px reference size. Scales proportionally. Default: 2. */\n _pixelScanlineSpacing?: number;\n /** Show pixel grid overlay. Default: false. */\n _pixelGrid?: boolean;\n /** Grid overlay opacity (0–1). Default: 0.06. */\n _pixelGridOpacity?: number;\n /** Grid line color. Default: \"#000\". */\n _pixelGridColor?: string;\n /** Enable drop shadow on pixel art. Default: false. */\n _pixelShadow?: boolean;\n /** Pixel shadow color. Default: \"rgba(0,0,0,0.3)\". */\n _pixelShadowColor?: string;\n /** Pixel shadow offset at 64px reference size. Scales proportionally. Default: 2. */\n _pixelShadowOffset?: number;\n\n // ── React-only: liquid glass mode ──────────────\n\n /** Enable liquid glass rendering mode. Default: false. */\n _glass?: boolean;\n /** Backdrop blur radius at 64px reference size. Scales proportionally. Default: 12. */\n _blurRadius?: number;\n /** Backdrop saturation multiplier (1.0 = normal). Default: 1.8. */\n _saturate?: number;\n /** Color tint overlay opacity (0–1). Default: 0.12. */\n _tintOpacity?: number;\n /** Color tint overlay color. Default: \"rgba(255,255,255,1)\". */\n _tintColor?: string;\n /** Glass border opacity (0–1). Default: 0.25. */\n _borderOpacity?: number;\n /** Glass border width at 64px reference size. Scales proportionally. Min 0.5px. Default: 1. */\n _borderWidth?: number;\n /** Glass border color. Default: rgba(255,255,255,{_borderOpacity}). */\n _borderColor?: string;\n /** Specular highlight opacity (0–1). Default: 0.25. */\n _specularOpacity?: number;\n /** Specular highlight color. Default: \"rgba(255,255,255,1)\". */\n _specularColor?: string;\n /** Specular gradient end position (%). Default: 50. */\n _specularEnd?: number;\n /** Light angle for specular gradient (degrees). Default: 135. */\n _lightAngle?: number;\n /** Inner rim highlight intensity (0–1). Default: 0.08. */\n _rimIntensity?: number;\n /** @deprecated Use _shadowY, _shadowBlur, _shadowOpacity for size-proportional shadows. Raw CSS shadow string — not scaled with size. */\n _shadow?: string;\n /** Shadow Y offset at 64px reference size. Scales proportionally. Default: 8. */\n _shadowY?: number;\n /** Shadow blur radius at 64px reference size. Scales proportionally. Default: 32. */\n _shadowBlur?: number;\n /** Shadow opacity (0–1). Default: 0.12. */\n _shadowOpacity?: number;\n}\n\n/** Options for rendering a SolFace avatar (shared by string renderer and React component). */\nexport interface RenderOptions {\n /** Avatar size in CSS pixels (width and height). Default: 64. */\n size?: number;\n /** Theme configuration for colors, layout, and rendering style. */\n theme?: SolFaceTheme;\n /** Override specific trait indices. Merged on top of the deterministic traits. */\n traitOverrides?: Partial<SolFaceTraits>;\n /** Enable blink animation. Pass `true` for defaults, or an object for custom timing. Default: false. */\n enableBlink?: boolean | {\n /** Interval between blinks in seconds. Default: 4. */\n duration?: number;\n /** Initial delay before first blink in seconds. Default: 0. */\n delay?: number;\n };\n /** CSS class name applied to the root SVG element. */\n className?: string;\n /** Detail level. \"full\" renders all overlays; \"simplified\" omits gradients and blush; \"auto\" uses full at size ≥ 48px. Default: \"auto\". */\n detail?: \"full\" | \"simplified\" | \"auto\";\n /** Per-instance color overrides (hex strings). Takes precedence over theme color settings and derived colors. */\n colorOverrides?: {\n /** Override skin color (hex). */\n skin?: string;\n /** Override eye iris color (hex). */\n eyes?: string;\n /** Override hair color (hex). */\n hair?: string;\n /** Override background color (hex). */\n bg?: string;\n /** Override mouth/lip color (hex). */\n mouth?: string;\n /** Override eyebrow color (hex). */\n eyebrow?: string;\n /** Override accessory accent color (hex). */\n accessory?: string;\n /** Override nose shadow/fill color (hex). */\n nose?: string;\n /** Override eye white (sclera) color (hex). */\n eyeWhite?: string;\n };\n}\n\n// ─── Color Palettes ──────────────────────────────\n\n/** Default 10 skin tone hex colors, from porcelain to deep brown. */\nexport const SKIN_COLORS = [\n \"#faeae5\", \"#efd6c8\", \"#e4c5aa\", \"#d5b590\", \"#c59e77\",\n \"#b4875f\", \"#9d6d4d\", \"#805742\", \"#654134\", \"#4b2d25\",\n];\n\n/** Default 8 eye iris hex colors: chocolate, sky, emerald, hazel, storm, amber, violet, gray. */\nexport const EYE_COLORS = [\n \"#382414\", \"#3868A8\", \"#38784C\", \"#808838\", \"#586878\",\n \"#A06830\", \"#685898\", \"#889898\",\n];\n\n/** Default 10 hair hex colors: black, espresso, walnut, honey, copper, silver, charcoal, burgundy, strawberry, ginger. */\nexport const HAIR_COLORS = [\n \"#1A1A24\", \"#4C3428\", \"#887058\", \"#D4B868\", \"#A84830\",\n \"#C0C0CC\", \"#484858\", \"#783850\", \"#D8B0A0\", \"#C08048\",\n];\n\n/** Default 12 background hex colors: rose, olive, sage, fern, mint, ocean, sky, lavender, orchid, blush, lilac, seafoam. */\nexport const BG_COLORS = [\n \"#b98387\", \"#a9a360\", \"#9eb785\", \"#69ab79\", \"#81bbb0\",\n \"#6499af\", \"#7f8bbd\", \"#8869ab\", \"#b785b3\", \"#ab6984\",\n \"#a07ab5\", \"#74b5a0\",\n];\n\n// ─── Hashing (djb2) ─────────────────────────────\n\nfunction djb2(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;\n }\n return hash >>> 0;\n}\n\n// ─── PRNG (mulberry32) ──────────────────────────\n\nfunction mulberry32(seed: number): () => number {\n let s = seed | 0;\n return () => {\n s = (s + 0x6d2b79f5) | 0;\n let t = Math.imul(s ^ (s >>> 15), 1 | s);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n// ─── Trait Generation ───────────────────────────\n\n/**\n * Deterministically generate avatar traits from a wallet address using djb2 + mulberry32 PRNG.\n * The same wallet always produces the same traits (~53M visually unique combinations).\n *\n * @param walletAddress Base58 Solana wallet address.\n * @param overrides Optional partial traits to force specific values.\n * @returns Complete trait set with all 11 indices (10 visual + faceShape for PRNG ordering).\n */\nexport function generateTraits(\n walletAddress: string,\n overrides?: Partial<SolFaceTraits>\n): SolFaceTraits {\n const seed = djb2(walletAddress);\n const rand = mulberry32(seed);\n\n // IMPORTANT: Order must NEVER change — shifts all downstream values.\n // faceShape is consumed for PRNG ordering but unused in rendering (all squircle).\n const traits: SolFaceTraits = {\n faceShape: Math.floor(rand() * 4),\n skinColor: Math.floor(rand() * 10),\n eyeStyle: Math.floor(rand() * 9),\n eyeColor: Math.floor(rand() * 8),\n eyebrows: Math.floor(rand() * 8),\n nose: Math.floor(rand() * 8),\n mouth: Math.floor(rand() * 8),\n hairStyle: Math.floor(rand() * 10),\n hairColor: Math.floor(rand() * 10),\n accessory: Math.floor(rand() * 12),\n bgColor: Math.floor(rand() * 12),\n };\n\n return overrides ? { ...traits, ...overrides } : traits;\n}\n\n// ─── Effective Accessory ────────────────────────\n\n/**\n * Resolve the effective accessory index.\n *\n * @param traits Complete trait set.\n * @returns Effective accessory index (0–11).\n */\nexport function effectiveAccessory(traits: SolFaceTraits): number {\n const ai = traits.accessory % 12;\n return ai;\n}\n\n// ─── Trait Labels ───────────────────────────────\n\nconst FACE_LABELS = [\"Squircle\"];\nconst SKIN_LABELS = [\n \"Porcelain\", \"Ivory\", \"Fair\", \"Light\", \"Sand\",\n \"Golden\", \"Warm\", \"Caramel\", \"Brown\", \"Deep\",\n];\nconst EYE_STYLE_LABELS = [\"Round\", \"Minimal\", \"Almond\", \"Wide\", \"Relaxed\", \"Joyful\", \"Bright\", \"Gentle\", \"Side-look\"];\nconst EYE_COLOR_LABELS = [\"Chocolate\", \"Sky\", \"Emerald\", \"Hazel\", \"Storm\", \"Amber\", \"Violet\", \"Gray\"];\nconst BROW_LABELS = [\"Wispy\", \"Straight\", \"Natural\", \"Arched\", \"Angled\", \"Worried\", \"Bushy\", \"Thin\"];\nconst NOSE_LABELS = [\"Shadow\", \"Button\", \"Soft\", \"Nostrils\", \"Pointed\", \"Wide\", \"Bridge\", \"Snub\"];\nconst MOUTH_LABELS = [\"Smile\", \"Calm\", \"Happy\", \"Oh\", \"Smirk\", \"Grin\", \"Flat\", \"Pout\"];\nconst HAIR_STYLE_LABELS = [\n \"Bald\", \"Crew\", \"Curly\", \"Side Part\", \"Long\",\n \"Buzz\", \"Beanie\", \"Cap\", \"Mohawk\", \"Bun\",\n];\nconst HAIR_COLOR_LABELS = [\n \"Black\", \"Espresso\", \"Walnut\", \"Honey\", \"Copper\",\n \"Silver\", \"Charcoal\", \"Burgundy\", \"Strawberry\", \"Ginger\",\n];\nconst ACCESSORY_LABELS = [\n \"None\", \"Beauty Mark\", \"Round Glasses\", \"Rect Glasses\", \"Earring\",\n \"Headband\", \"Freckles\", \"Stud Earrings\", \"Aviators\", \"Band-Aid\",\n \"Left Eyebrow Slit\", \"Right Eyebrow Slit\",\n];\nconst BG_COLOR_LABELS = [\n \"Rose\", \"Olive\", \"Sage\", \"Fern\", \"Mint\",\n \"Ocean\", \"Sky\", \"Lavender\", \"Orchid\", \"Blush\",\n \"Lilac\", \"Seafoam\",\n];\n\n/**\n * Convert numeric trait indices to human-readable label strings.\n *\n * @param traits Complete trait set.\n * @returns A record mapping each trait name to its display label (e.g. `{ skinColor: \"Golden\", hairStyle: \"Curly\" }`).\n */\nexport function getTraitLabels(traits: SolFaceTraits): Record<string, string> {\n return {\n faceShape: FACE_LABELS[0],\n skinColor: SKIN_LABELS[traits.skinColor] ?? \"Fair\",\n eyeStyle: EYE_STYLE_LABELS[traits.eyeStyle] ?? \"Round\",\n eyeColor: EYE_COLOR_LABELS[traits.eyeColor] ?? \"Chocolate\",\n eyebrows: BROW_LABELS[traits.eyebrows] ?? \"Wispy\",\n nose: NOSE_LABELS[traits.nose] ?? \"Shadow\",\n mouth: MOUTH_LABELS[traits.mouth] ?? \"Smile\",\n hairStyle: HAIR_STYLE_LABELS[traits.hairStyle] ?? \"Bald\",\n hairColor: HAIR_COLOR_LABELS[traits.hairColor] ?? \"Black\",\n accessory: ACCESSORY_LABELS[effectiveAccessory(traits)] ?? \"None\",\n bgColor: BG_COLOR_LABELS[traits.bgColor] ?? \"Rose\",\n };\n}\n\n// ─── Trait Hash ─────────────────────────────────\n\n/**\n * Compute a short hex hash (8 characters) from a wallet address. Useful as a compact identity fingerprint.\n *\n * @param walletAddress Base58 Solana wallet address.\n * @returns 8-character lowercase hex string.\n */\nexport function traitHash(walletAddress: string): string {\n return (djb2(walletAddress) >>> 0).toString(16).padStart(8, \"0\");\n}\n\n// ─── Theme Utilities ────────────────────────────\n\n/**\n * Look up a theme by name from a theme registry.\n *\n * @param themeName Theme name to look up.\n * @param themes Registry of available themes.\n * @returns The matching theme, or `undefined` if not found.\n */\nexport function resolveTheme(\n themeName?: string,\n themes?: Record<string, SolFaceTheme>\n): SolFaceTheme | undefined {\n if (!themeName || !themes) return undefined;\n return themes[themeName];\n}\n\n/**\n * Shallow-merge two themes. Overrides take precedence over the base.\n *\n * @param base Base theme (or null/undefined).\n * @param overrides Theme overrides (or null/undefined).\n * @returns Merged theme, or null if both inputs are nullish.\n */\nexport function mergeTheme(\n base: SolFaceTheme | null | undefined,\n overrides: SolFaceTheme | null | undefined\n): SolFaceTheme | null {\n if (!base) return overrides || null;\n if (!overrides) return base;\n return { ...base, ...overrides };\n}\n","// ═══════════════════════════════════════════════════════════════\n// Color math utilities for SolFaces v2\n// Shared by renderer.ts (string) and SolFace.tsx (React)\n// ═══════════════════════════════════════════════════════════════\n\n/** Parse a hex color string (with or without `#`) into an [R, G, B] tuple (0–255). */\nexport function hexToRgb(hex: string): [number, number, number] {\n const h = hex.replace(\"#\", \"\");\n return [\n parseInt(h.slice(0, 2), 16),\n parseInt(h.slice(2, 4), 16),\n parseInt(h.slice(4, 6), 16),\n ];\n}\n\n/** Convert R, G, B values (0–255) to a lowercase hex color string (e.g. `\"#ff8040\"`). Values are clamped to 0–255. */\nexport function rgbToHex(r: number, g: number, b: number): string {\n return (\n \"#\" +\n [r, g, b]\n .map((v) =>\n Math.max(0, Math.min(255, Math.round(v)))\n .toString(16)\n .padStart(2, \"0\")\n )\n .join(\"\")\n );\n}\n\n/** Darken a hex color by a percentage (0–1). Default: 12%. */\nexport function darken(hex: string, pct = 0.12): string {\n const [r, g, b] = hexToRgb(hex);\n return rgbToHex(r * (1 - pct), g * (1 - pct), b * (1 - pct));\n}\n\n/** Lighten a hex color by a percentage (0–1). Default: 15%. */\nexport function lighten(hex: string, pct = 0.15): string {\n const [r, g, b] = hexToRgb(hex);\n return rgbToHex(r + (255 - r) * pct, g + (255 - g) * pct, b + (255 - b) * pct);\n}\n\n/** Linearly blend two hex colors. `t=0` returns `a`, `t=1` returns `b`. Default: 50%. */\nexport function blend(a: string, b: string, t = 0.5): string {\n const [r1, g1, b1] = hexToRgb(a);\n const [r2, g2, b2] = hexToRgb(b);\n return rgbToHex(\n r1 + (r2 - r1) * t,\n g1 + (g2 - g1) * t,\n b1 + (b2 - b1) * t\n );\n}\n\n/** Compute perceptual luminance (0–255) using ITU-R BT.601 weights. Used internally for skin-relative color derivation. */\nexport function luminance(hex: string): number {\n const [r, g, b] = hexToRgb(hex);\n return 0.299 * r + 0.587 * g + 0.114 * b;\n}\n\n/** WCAG 2.0 relative luminance for contrast ratio computation. */\nfunction relativeLuminance(hex: string): number {\n const [r, g, b] = hexToRgb(hex).map(c => {\n const s = c / 255;\n return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/** Compute WCAG 2.0 contrast ratio between two hex colors (1–21). */\nexport function contrastRatio(hex1: string, hex2: string): number {\n const l1 = relativeLuminance(hex1);\n const l2 = relativeLuminance(hex2);\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\nexport interface DerivedColors {\n skinHi: string;\n skinLo: string;\n skinMid: string;\n isDark: boolean;\n cheekColor: string;\n cheekOpacity: number;\n lipColor: string;\n noseFill: string;\n browColor: string;\n earFill: string;\n earShadow: string;\n eyeWhiteAdapted: string;\n lidColor: string;\n accessoryColor: string;\n}\n\n/**\n * Derive all secondary face colors (lips, cheeks, brows, ears, etc.) from a skin hex color.\n * Uses luminance-adaptive formulas to ensure natural appearance across all skin tones.\n *\n * @param skin Base skin hex color.\n * @returns Object with all derived colors and metadata (isDark, cheekOpacity, etc.).\n */\nexport function deriveSkinColors(skin: string): DerivedColors {\n const sL = luminance(skin);\n const isDark = sL < 100;\n\n const skinHi = lighten(skin, 0.10);\n const skinLo = darken(skin, 0.22);\n const skinMid = darken(skin, 0.05);\n\n // Cheek: warm blush relative to skin\n const [sr, sg, sb] = hexToRgb(skin);\n let cheekColor: string;\n if (sL > 120) {\n const rB = sL > 180 ? 0.03 : 0.06;\n const gD = sL > 180 ? 0.30 : 0.28;\n const bD = sL > 180 ? 0.25 : 0.22;\n cheekColor = rgbToHex(\n Math.min(255, sr + sr * rB),\n Math.max(0, sg - sg * gD),\n Math.max(0, sb - sb * bD)\n );\n } else {\n cheekColor = rgbToHex(\n Math.min(255, sr + 50),\n Math.max(0, sg - 10),\n Math.max(0, sb - 5)\n );\n }\n const cheekOpacity = 0.15 + 0.18 * (1 - Math.min(1, sL / 240));\n\n // Lips: smooth skin-relative gradient\n const lipT = Math.max(0, Math.min(1, (sL - 60) / 180));\n const lipBase = blend(\"#D89090\", \"#A83848\", lipT);\n const midBoost = 1 - Math.abs(sL - 140) / 80;\n const lipBlend = (isDark ? 0.70 : 0.62) + Math.max(0, midBoost) * 0.12;\n const lipRaw = blend(skin, lipBase, Math.min(0.82, lipBlend));\n const [lr, lg, lb] = hexToRgb(lipRaw);\n const lipD = Math.abs(sr - lr) + Math.abs(sg - lg) + Math.abs(sb - lb);\n let lipColor = lipD < 60 ? blend(skin, lipBase, 0.78) : lipRaw;\n // Ensure minimum lip/skin contrast for readability\n let attempts = 0;\n while (contrastRatio(lipColor, skin) < 1.8 && attempts < 12) {\n lipColor = darken(lipColor, 0.06);\n attempts++;\n }\n\n // Features\n const browColor = isDark\n ? lighten(skin, sL < 80 ? 0.35 : sL < 100 ? 0.32 : 0.25)\n : darken(skin, 0.55);\n const noseShift = 0.20 + 0.06 * (1 - Math.abs(sL - 100) / 140);\n const noseFill = isDark ? lighten(skin, noseShift) : darken(skin, noseShift);\n const earT = Math.max(0, Math.min(1, (sL - 100) / 60));\n let earFill = blend(lighten(skin, 0.08), skinMid, earT);\n // Ensure ears are at least slightly visible\n if (contrastRatio(earFill, skin) < 1.05) {\n earFill = isDark ? lighten(earFill, 0.06) : darken(earFill, 0.06);\n }\n const earShadow = darken(skin, 0.10 + 0.06 * (1 - Math.min(1, sL / 160)));\n const lidColor = isDark ? lighten(skin, 0.18) : darken(skin, 0.15);\n\n // Eye white: adapted to skin luminance\n const ewT = Math.max(0, Math.min(1, (sL - 60) / 180));\n const eyeWhiteAdapted = blend(\"#EDE8E0\", \"#FBF8F2\", ewT);\n\n // Accessory color: skin-warm neutral\n const warmth = sL > 140 ? 0.3 : sL > 100 ? 0.5 : 0.7;\n const accessoryColor = blend(\"#808890\", blend(skin, \"#B0A898\", 0.3), warmth);\n\n return {\n skinHi, skinLo, skinMid, isDark,\n cheekColor, cheekOpacity,\n lipColor, noseFill, browColor,\n earFill, earShadow,\n eyeWhiteAdapted, lidColor,\n accessoryColor,\n };\n}\n","// ═══════════════════════════════════════════════════════════════\n// SOLFACES v2 — AI Agent Description Generator\n// Produces natural language descriptions of a wallet's SolFace\n// for use in system prompts, bios, and self-reference.\n// ═══════════════════════════════════════════════════════════════\n\nimport { generateTraits, effectiveAccessory, type SolFaceTraits } from \"./traits\";\n\n// ─── Vocabulary Maps ─────────────────────────────────────────\n\nconst SKIN_TONES: Record<number, string> = {\n 0: \"porcelain\",\n 1: \"ivory\",\n 2: \"fair\",\n 3: \"light\",\n 4: \"sand\",\n 5: \"golden\",\n 6: \"warm\",\n 7: \"caramel\",\n 8: \"brown\",\n 9: \"deep\",\n};\n\nconst EYE_STYLES: Record<number, string> = {\n 0: \"round, wide-open\",\n 1: \"small and minimal\",\n 2: \"almond-shaped\",\n 3: \"wide and expressive\",\n 4: \"relaxed, half-lidded\",\n 5: \"joyful, crescent-shaped\",\n 6: \"bright and sparkling\",\n 7: \"gentle and narrow\",\n 8: \"side-looking, shifted\",\n};\n\nconst EYE_COLORS_DESC: Record<number, string> = {\n 0: \"dark brown\",\n 1: \"blue\",\n 2: \"green\",\n 3: \"hazel\",\n 4: \"gray\",\n 5: \"amber\",\n 6: \"violet\",\n 7: \"steel gray\",\n};\n\nconst EYEBROW_STYLES: Record<number, string> = {\n 0: \"wispy\",\n 1: \"straight\",\n 2: \"natural\",\n 3: \"elegantly arched\",\n 4: \"sharply angled\",\n 5: \"worried, furrowed\",\n 6: \"bushy\",\n 7: \"thin, delicate\",\n};\n\nconst NOSE_STYLES: Record<number, string> = {\n 0: \"a subtle shadow nose\",\n 1: \"a small button nose\",\n 2: \"a soft curved nose\",\n 3: \"a button nose with visible nostrils\",\n 4: \"a pointed nose\",\n 5: \"a wide, broad nose\",\n 6: \"a nose with a visible bridge\",\n 7: \"a small snub nose\",\n};\n\nconst MOUTH_STYLES: Record<number, string> = {\n 0: \"a gentle smile\",\n 1: \"a calm, neutral expression\",\n 2: \"a happy grin\",\n 3: \"a surprised O-shaped mouth\",\n 4: \"a confident smirk\",\n 5: \"a wide, toothy grin\",\n 6: \"a flat, straight expression\",\n 7: \"a soft pout\",\n};\n\nconst ACCESSORY_DESC: Record<number, string> = {\n 0: \"\",\n 1: \"a beauty mark\",\n 2: \"round glasses\",\n 3: \"rectangular glasses\",\n 4: \"a dangling earring\",\n 5: \"a headband\",\n 6: \"freckles\",\n 7: \"stud earrings\",\n 8: \"aviator sunglasses\",\n 9: \"a band-aid\",\n 10: \"a left eyebrow slit\",\n 11: \"a right eyebrow slit\",\n};\n\nconst BG_COLORS_DESC: Record<number, string> = {\n 0: \"rose\",\n 1: \"olive\",\n 2: \"sage\",\n 3: \"fern\",\n 4: \"mint\",\n 5: \"ocean\",\n 6: \"sky\",\n 7: \"lavender\",\n 8: \"orchid\",\n 9: \"blush\",\n 10: \"lilac\",\n 11: \"seafoam\",\n};\n\n// ─── Description Builder ─────────────────────────────────────\n\nexport interface DescribeOptions {\n includeBackground?: boolean;\n format?: \"paragraph\" | \"structured\" | \"compact\";\n perspective?: \"first\" | \"third\";\n name?: string;\n}\n\nexport function describeAppearance(\n walletAddress: string,\n options?: DescribeOptions,\n): string {\n const traits = generateTraits(walletAddress);\n const {\n includeBackground = true,\n format = \"paragraph\",\n perspective = \"third\",\n name,\n } = options ?? {};\n\n if (format === \"structured\") return buildStructured(traits, includeBackground);\n if (format === \"compact\") return buildCompact(traits);\n return buildParagraph(traits, perspective, name, includeBackground);\n}\n\nexport function describeTraits(\n traits: SolFaceTraits,\n options?: DescribeOptions,\n): string {\n const {\n includeBackground = true,\n format = \"paragraph\",\n perspective = \"third\",\n name,\n } = options ?? {};\n\n if (format === \"structured\") return buildStructured(traits, includeBackground);\n if (format === \"compact\") return buildCompact(traits);\n return buildParagraph(traits, perspective, name, includeBackground);\n}\n\n// ─── Builders ────────────────────────────────────────────────\n\nfunction buildParagraph(\n t: SolFaceTraits,\n perspective: \"first\" | \"third\",\n name?: string,\n includeBg?: boolean,\n): string {\n const parts: string[] = [];\n const ai = effectiveAccessory(t);\n\n const subject = perspective === \"first\"\n ? (name ? `I'm ${name}. I have` : \"I have\")\n : (name ? `${name} has` : \"This SolFace has\");\n\n const im = perspective === \"first\" ? \"I'm\" : \"They're\";\n\n // Face + skin (all squircle now)\n parts.push(`${subject} a squircle face with ${SKIN_TONES[t.skinColor] ?? \"warm\"} skin`);\n\n // Eyes\n const eyeStyle = EYE_STYLES[t.eyeStyle] ?? \"round\";\n const eyeColor = EYE_COLORS_DESC[t.eyeColor] ?? \"dark\";\n parts.push(`${eyeStyle} ${eyeColor} eyes`);\n\n // Eyebrows\n const brows = EYEBROW_STYLES[t.eyebrows];\n if (brows) parts.push(`${brows} eyebrows`);\n\n // Hair (all styles render as bald)\n parts.push(perspective === \"first\" ? \"and am bald\" : \"and is bald\");\n\n // Build main sentence\n let desc = parts[0];\n if (parts.length > 2) {\n desc += \", \" + parts.slice(1, -1).join(\", \") + \", \" + parts[parts.length - 1];\n } else if (parts.length === 2) {\n desc += \" and \" + parts[1];\n }\n desc += \".\";\n\n // Nose\n const nose = NOSE_STYLES[t.nose];\n if (nose) {\n const noseSubject = perspective === \"first\"\n ? \"I have\"\n : (name ?? \"They\") + (name ? \" has\" : \" have\");\n desc += ` ${noseSubject} ${nose}.`;\n }\n\n // Accessory\n const acc = ACCESSORY_DESC[ai];\n if (acc) {\n desc += ` ${im} wearing ${acc}.`;\n }\n\n // Mouth\n const mouth = MOUTH_STYLES[t.mouth] ?? \"a smile\";\n const mouthVerb = perspective === \"first\"\n ? \"I have\"\n : (name ?? \"They\") + (name ? \" has\" : \" have\");\n desc += ` ${mouthVerb} ${mouth}.`;\n\n // Background\n if (includeBg) {\n const bg = BG_COLORS_DESC[t.bgColor] ?? \"colorful\";\n desc += ` The background is ${bg}.`;\n }\n\n return desc;\n}\n\nfunction buildStructured(t: SolFaceTraits, includeBg: boolean): string {\n const ai = effectiveAccessory(t);\n const lines: string[] = [\n `Face: squircle`,\n `Skin: ${SKIN_TONES[t.skinColor] ?? \"warm\"}`,\n `Eyes: ${EYE_STYLES[t.eyeStyle] ?? \"round\"}, ${EYE_COLORS_DESC[t.eyeColor] ?? \"dark\"}`,\n `Eyebrows: ${EYEBROW_STYLES[t.eyebrows] ?? \"wispy\"}`,\n ];\n\n const nose = NOSE_STYLES[t.nose];\n if (nose) lines.push(`Nose: ${nose.replace(/^a /, \"\")}`);\n\n lines.push(`Mouth: ${MOUTH_STYLES[t.mouth] ?? \"smile\"}`);\n\n lines.push(\"Hair: bald\");\n\n const acc = ACCESSORY_DESC[ai];\n if (acc) lines.push(`Accessory: ${acc}`);\n\n if (includeBg) {\n lines.push(`Background: ${BG_COLORS_DESC[t.bgColor] ?? \"colorful\"}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildCompact(t: SolFaceTraits): string {\n const ai = effectiveAccessory(t);\n const parts: string[] = [];\n\n parts.push(`squircle face`);\n parts.push(`${SKIN_TONES[t.skinColor] ?? \"warm\"} skin`);\n parts.push(`${EYE_COLORS_DESC[t.eyeColor] ?? \"dark\"} ${EYE_STYLES[t.eyeStyle] ?? \"round\"} eyes`);\n\n parts.push(\"bald\");\n\n const acc = ACCESSORY_DESC[ai];\n if (acc) parts.push(acc);\n\n parts.push((MOUTH_STYLES[t.mouth] ?? \"smiling\").replace(/^a /, \"\"));\n\n return parts.join(\", \");\n}\n\n// ─── Alt Text Helper ─────────────────────────────────────────\n\nexport function solFaceAltText(walletAddress: string): string {\n return `SolFace avatar: ${describeAppearance(walletAddress, { format: \"compact\", includeBackground: false })}`;\n}\n\n// ─── System Prompt Helper ────────────────────────────────────\n\nexport function agentAppearancePrompt(\n walletAddress: string,\n agentName?: string,\n): string {\n const desc = describeAppearance(walletAddress, {\n perspective: \"first\",\n name: agentName,\n includeBackground: false,\n format: \"paragraph\",\n });\n\n const hash = (djb2Simple(walletAddress) >>> 0).toString(16).padStart(8, \"0\");\n\n return `My visual identity is a SolFace avatar (ID: ${hash}) derived from my wallet address. ${desc} This appearance is deterministic — anyone who looks up my wallet will see the same face.`;\n}\n\n// Inline djb2 to avoid circular dependency\nfunction djb2Simple(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;\n }\n return hash >>> 0;\n}\n","// ═══════════════════════════════════════════════════════════════\n// SOLFACES v2 — SVG String Renderer\n// Gradient-rich, skin-luminance-driven avatar rendering.\n// Generates SVG markup as strings for server-side and non-React use.\n// ═══════════════════════════════════════════════════════════════\n\nimport {\n generateTraits,\n effectiveAccessory,\n SKIN_COLORS,\n EYE_COLORS,\n HAIR_COLORS,\n BG_COLORS,\n type RenderOptions,\n} from \"./traits\";\nimport { deriveSkinColors, darken, lighten, blend } from \"./colors\";\nimport { solFaceAltText } from \"./describe\";\n\nexport type { RenderOptions } from \"./traits\";\n\n// ─── Helpers ────────────────────────────────────\n\nfunction djb2(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;\n }\n return hash >>> 0;\n}\n\n// ─── Gradient Defs ──────────────────────────────\n\nfunction buildDefs(\n id: string,\n skin: string,\n skinHi: string,\n skinLo: string,\n hairCol: string,\n bgCol: string,\n cheekColor: string,\n cheekOpacity: number,\n flat: boolean,\n full: boolean,\n glowIntensity: number,\n): string {\n if (flat) return \"\";\n\n let d = \"<defs>\";\n\n // Skin gradient (top → bottom, 3-stop for smoother curve)\n d += `<linearGradient id=\"${id}sg\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">`;\n d += `<stop offset=\"0%\" stop-color=\"${skinHi}\"/>`;\n d += `<stop offset=\"50%\" stop-color=\"${skin}\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"${skinLo}\"/>`;\n d += `</linearGradient>`;\n\n // BG gradient\n d += `<linearGradient id=\"${id}bg\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">`;\n d += `<stop offset=\"0%\" stop-color=\"${lighten(bgCol, 0.12)}\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"${darken(bgCol, 0.12)}\"/>`;\n d += `</linearGradient>`;\n\n if (full) {\n // Glow (radial, top center)\n d += `<radialGradient id=\"${id}glow\" cx=\"0.5\" cy=\"0.28\" r=\"0.45\">`;\n d += `<stop offset=\"0%\" stop-color=\"#ffffff\" stop-opacity=\"${glowIntensity}\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"#ffffff\" stop-opacity=\"0\"/>`;\n d += `</radialGradient>`;\n\n // Chin shadow\n d += `<radialGradient id=\"${id}chin\" cx=\"0.5\" cy=\"0.85\" r=\"0.35\">`;\n d += `<stop offset=\"0%\" stop-color=\"${skinLo}\" stop-opacity=\"0.30\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"${skinLo}\" stop-opacity=\"0\"/>`;\n d += `</radialGradient>`;\n\n // Cheek L\n d += `<radialGradient id=\"${id}cL\" cx=\"0.5\" cy=\"0.5\" r=\"0.5\">`;\n d += `<stop offset=\"0%\" stop-color=\"${cheekColor}\" stop-opacity=\"${cheekOpacity.toFixed(2)}\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"${cheekColor}\" stop-opacity=\"0\"/>`;\n d += `</radialGradient>`;\n\n // Cheek R\n d += `<radialGradient id=\"${id}cR\" cx=\"0.5\" cy=\"0.5\" r=\"0.5\">`;\n d += `<stop offset=\"0%\" stop-color=\"${cheekColor}\" stop-opacity=\"${cheekOpacity.toFixed(2)}\"/>`;\n d += `<stop offset=\"100%\" stop-color=\"${cheekColor}\" stop-opacity=\"0\"/>`;\n d += `</radialGradient>`;\n }\n\n d += \"</defs>\";\n return d;\n}\n\n// ─── Hair Back (behind face) ────────────────────\n\nfunction renderHairBack(_hi: number, _id: string, _flat: boolean): string {\n return \"\";\n}\n\n// ─── Ears ───────────────────────────────────────\n\nfunction renderEars(earFill: string, earShadow: string): string {\n return (\n `<ellipse cx=\"11\" cy=\"34\" rx=\"4\" ry=\"5\" fill=\"${earFill}\"/>` +\n `<ellipse cx=\"11\" cy=\"34\" rx=\"2.5\" ry=\"3.5\" fill=\"${earShadow}\" opacity=\"0.3\"/>` +\n `<ellipse cx=\"53\" cy=\"34\" rx=\"4\" ry=\"5\" fill=\"${earFill}\"/>` +\n `<ellipse cx=\"53\" cy=\"34\" rx=\"2.5\" ry=\"3.5\" fill=\"${earShadow}\" opacity=\"0.3\"/>`\n );\n}\n\n// ─── Face ───────────────────────────────────────\n\nfunction renderFace(id: string, skin: string, flat: boolean, opacity: number = 1): string {\n const fill = flat ? skin : `url(#${id}sg)`;\n const opAttr = opacity < 1 ? ` opacity=\"${opacity}\"` : \"\";\n return `<rect x=\"14\" y=\"16\" width=\"36\" height=\"38\" rx=\"12\" ry=\"12\" fill=\"${fill}\"${opAttr}/>`;\n}\n\n// ─── Face Overlays (full detail) ────────────────\n\nfunction renderFaceOverlays(id: string, flat: boolean): string {\n if (flat) return \"\";\n return (\n `<rect x=\"14\" y=\"16\" width=\"36\" height=\"38\" rx=\"12\" ry=\"12\" fill=\"url(#${id}glow)\"/>` +\n `<rect x=\"14\" y=\"16\" width=\"36\" height=\"38\" rx=\"12\" ry=\"12\" fill=\"url(#${id}chin)\"/>` +\n `<ellipse cx=\"22\" cy=\"42\" rx=\"5\" ry=\"3.5\" fill=\"url(#${id}cL)\"/>` +\n `<ellipse cx=\"42\" cy=\"42\" rx=\"5\" ry=\"3.5\" fill=\"url(#${id}cR)\"/>` +\n `<line x1=\"20\" y1=\"50\" x2=\"44\" y2=\"50\" stroke=\"currentColor\" stroke-width=\"0.3\" opacity=\"0.08\" stroke-linecap=\"round\"/>`\n );\n}\n\n// ─── Hair Front ─────────────────────────────────\n\nfunction renderHairFront(_hi: number, _id: string, _hairCol: string, _skin: string, _flat: boolean): string {\n return \"\";\n}\n\n// ─── Eyes ───────────────────────────────────────\n\nfunction renderEyes(\n ei: number,\n eyeCol: string,\n eyeWhite: string,\n lidColor: string,\n full: boolean,\n): string {\n const lx = 25, rx = 39, y = 33;\n let s = \"\";\n\n switch (ei) {\n case 0: // Round\n s += `<circle cx=\"${lx}\" cy=\"${y}\" r=\"4\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${lx + 0.8}\" cy=\"${y}\" r=\"2.2\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${lx + 1.5}\" cy=\"${y - 1}\" r=\"0.7\" fill=\"white\" opacity=\"0.8\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y}\" r=\"4\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${rx + 0.8}\" cy=\"${y}\" r=\"2.2\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${rx + 1.5}\" cy=\"${y - 1}\" r=\"0.7\" fill=\"white\" opacity=\"0.8\"/>`;\n break;\n case 1: // Minimal\n s += `<circle cx=\"${lx}\" cy=\"${y}\" r=\"2.2\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${lx + 0.5}\" cy=\"${y - 0.5}\" r=\"0.5\" fill=\"white\" opacity=\"0.4\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y}\" r=\"2.2\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${rx + 0.5}\" cy=\"${y - 0.5}\" r=\"0.5\" fill=\"white\" opacity=\"0.4\"/>`;\n break;\n case 2: // Almond\n s += `<ellipse cx=\"${lx}\" cy=\"${y}\" rx=\"4.5\" ry=\"2.8\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${lx + 0.5}\" cy=\"${y}\" r=\"1.8\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${lx + 1.2}\" cy=\"${y - 0.8}\" r=\"0.6\" fill=\"white\" opacity=\"0.7\"/>`;\n s += `<ellipse cx=\"${rx}\" cy=\"${y}\" rx=\"4.5\" ry=\"2.8\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${rx + 0.5}\" cy=\"${y}\" r=\"1.8\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${rx + 1.2}\" cy=\"${y - 0.8}\" r=\"0.6\" fill=\"white\" opacity=\"0.7\"/>`;\n break;\n case 3: // Wide\n s += `<circle cx=\"${lx}\" cy=\"${y}\" r=\"5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${lx}\" cy=\"${y + 0.5}\" r=\"2.8\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${lx + 1.5}\" cy=\"${y - 1}\" r=\"0.8\" fill=\"white\" opacity=\"0.8\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y}\" r=\"5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y + 0.5}\" r=\"2.8\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${rx + 1.5}\" cy=\"${y - 1}\" r=\"0.8\" fill=\"white\" opacity=\"0.8\"/>`;\n break;\n case 4: // Relaxed\n s += `<ellipse cx=\"${lx}\" cy=\"${y + 1}\" rx=\"4\" ry=\"2.2\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${lx}\" cy=\"${y + 1}\" r=\"1.5\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<line x1=\"${lx - 4.5}\" y1=\"${y - 0.5}\" x2=\"${lx + 4.5}\" y2=\"${y - 0.5}\" stroke=\"${lidColor}\" stroke-width=\"0.8\" stroke-linecap=\"round\"/>`;\n s += `<ellipse cx=\"${rx}\" cy=\"${y + 1}\" rx=\"4\" ry=\"2.2\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y + 1}\" r=\"1.5\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<line x1=\"${rx - 4.5}\" y1=\"${y - 0.5}\" x2=\"${rx + 4.5}\" y2=\"${y - 0.5}\" stroke=\"${lidColor}\" stroke-width=\"0.8\" stroke-linecap=\"round\"/>`;\n break;\n case 5: // Joyful\n s += `<path d=\"M${lx - 4} ${y} Q${lx} ${y + 4.5} ${lx + 4} ${y}\" fill=\"none\" stroke=\"${eyeCol}\" stroke-width=\"2\" stroke-linecap=\"round\"/>`;\n s += `<path d=\"M${rx - 4} ${y} Q${rx} ${y + 4.5} ${rx + 4} ${y}\" fill=\"none\" stroke=\"${eyeCol}\" stroke-width=\"2\" stroke-linecap=\"round\"/>`;\n break;\n case 6: // Bright\n s += `<circle cx=\"${lx}\" cy=\"${y}\" r=\"3.5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${lx + 0.5}\" cy=\"${y}\" r=\"2\" fill=\"${eyeCol}\"/>`;\n s += `<circle cx=\"${lx + 1.5}\" cy=\"${y - 1}\" r=\"1\" fill=\"white\" opacity=\"0.9\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y}\" r=\"3.5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${rx + 0.5}\" cy=\"${y}\" r=\"2\" fill=\"${eyeCol}\"/>`;\n s += `<circle cx=\"${rx + 1.5}\" cy=\"${y - 1}\" r=\"1\" fill=\"white\" opacity=\"0.9\"/>`;\n break;\n case 7: // Gentle\n s += `<ellipse cx=\"${lx}\" cy=\"${y}\" rx=\"4.5\" ry=\"1.5\" fill=\"${eyeWhite}\"/>`;\n s += `<ellipse cx=\"${lx + 0.5}\" cy=\"${y}\" rx=\"2.2\" ry=\"1.2\" fill=\"${eyeCol}\"/>`;\n s += `<ellipse cx=\"${rx}\" cy=\"${y}\" rx=\"4.5\" ry=\"1.5\" fill=\"${eyeWhite}\"/>`;\n s += `<ellipse cx=\"${rx + 0.5}\" cy=\"${y}\" rx=\"2.2\" ry=\"1.2\" fill=\"${eyeCol}\"/>`;\n break;\n case 8: // Side-look — pupils shifted left\n s += `<circle cx=\"${lx}\" cy=\"${y}\" r=\"3.5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${lx - 1}\" cy=\"${y}\" r=\"2\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${lx - 0.3}\" cy=\"${y - 0.8}\" r=\"0.7\" fill=\"white\" opacity=\"0.8\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y}\" r=\"3.5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${rx - 1}\" cy=\"${y}\" r=\"2\" fill=\"${eyeCol}\"/>`;\n if (full) s += `<circle cx=\"${rx - 0.3}\" cy=\"${y - 0.8}\" r=\"0.7\" fill=\"white\" opacity=\"0.8\"/>`;\n break;\n default:\n s += `<circle cx=\"${lx}\" cy=\"${y}\" r=\"3.5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${lx + 0.8}\" cy=\"${y}\" r=\"2\" fill=\"${eyeCol}\"/>`;\n s += `<circle cx=\"${rx}\" cy=\"${y}\" r=\"3.5\" fill=\"${eyeWhite}\"/>`;\n s += `<circle cx=\"${rx + 0.8}\" cy=\"${y}\" r=\"2\" fill=\"${eyeCol}\"/>`;\n }\n\n // Eyelid strokes in full detail (except joyful/minimal)\n if (full && ei !== 1 && ei !== 5) {\n s += `<path d=\"M${lx - 4} ${y - 1.5} Q${lx} ${y - 4} ${lx + 4} ${y - 1.5}\" fill=\"none\" stroke=\"${lidColor}\" stroke-width=\"0.5\" opacity=\"0.4\"/>`;\n s += `<path d=\"M${rx - 4} ${y - 1.5} Q${rx} ${y - 4} ${rx + 4} ${y - 1.5}\" fill=\"none\" stroke=\"${lidColor}\" stroke-width=\"0.5\" opacity=\"0.4\"/>`;\n }\n\n return s;\n}\n\n// ─── Eyebrows ───────────────────────────────────\n\nfunction renderEyebrows(bi: number, browColor: string, full: boolean = true): string {\n const lx = 25, rx = 39, y = 27;\n switch (bi) {\n case 0: // Wispy\n return (\n `<line x1=\"${lx - 3}\" y1=\"${y}\" x2=\"${lx + 3}\" y2=\"${y - 0.5}\" stroke=\"${browColor}\" stroke-width=\"0.7\" stroke-linecap=\"round\"/>` +\n `<line x1=\"${rx - 3}\" y1=\"${y - 0.5}\" x2=\"${rx + 3}\" y2=\"${y}\" stroke=\"${browColor}\" stroke-width=\"0.7\" stroke-linecap=\"round\"/>`\n );\n case 1: // Straight\n return (\n `<line x1=\"${lx - 3.5}\" y1=\"${y}\" x2=\"${lx + 3.5}\" y2=\"${y}\" stroke=\"${browColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>` +\n `<line x1=\"${rx - 3.5}\" y1=\"${y}\" x2=\"${rx + 3.5}\" y2=\"${y}\" stroke=\"${browColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>`\n );\n case 2: // Natural\n return (\n `<path d=\"M${lx - 3.5} ${y + 0.5} Q${lx} ${y - 1.5} ${lx + 3.5} ${y + 0.5}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>` +\n `<path d=\"M${rx - 3.5} ${y + 0.5} Q${rx} ${y - 1.5} ${rx + 3.5} ${y + 0.5}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>`\n );\n case 3: // Arched\n return (\n `<path d=\"M${lx - 4} ${y + 1} Q${lx} ${y - 3} ${lx + 4} ${y + 1}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"1\" stroke-linecap=\"round\"/>` +\n `<path d=\"M${rx - 4} ${y + 1} Q${rx} ${y - 3} ${rx + 4} ${y + 1}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"1\" stroke-linecap=\"round\"/>`\n );\n case 4: // Angled\n return (\n `<polyline points=\"${lx - 3},${y + 1} ${lx},${y - 2} ${lx + 3},${y}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n `<polyline points=\"${rx - 3},${y} ${rx},${y - 2} ${rx + 3},${y + 1}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`\n );\n case 5: // Worried\n return (\n `<line x1=\"${lx - 3}\" y1=\"${y - 1}\" x2=\"${lx + 3}\" y2=\"${y + 1}\" stroke=\"${browColor}\" stroke-width=\"1.1\" stroke-linecap=\"round\"/>` +\n `<line x1=\"${rx - 3}\" y1=\"${y + 1}\" x2=\"${rx + 3}\" y2=\"${y - 1}\" stroke=\"${browColor}\" stroke-width=\"1.1\" stroke-linecap=\"round\"/>`\n );\n case 6: { // Bushy\n const bw = full ? \"2.0\" : \"1.5\";\n return (\n `<path d=\"M${lx - 4} ${y + 0.5} Q${lx} ${y - 2} ${lx + 4} ${y + 0.5}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"${bw}\" stroke-linecap=\"round\"/>` +\n `<path d=\"M${rx - 4} ${y + 0.5} Q${rx} ${y - 2} ${rx + 4} ${y + 0.5}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"${bw}\" stroke-linecap=\"round\"/>`\n );\n }\n case 7: // Thin\n return (\n `<path d=\"M${lx - 3.5} ${y} Q${lx} ${y - 1.5} ${lx + 3.5} ${y}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"0.5\" stroke-linecap=\"round\"/>` +\n `<path d=\"M${rx - 3.5} ${y} Q${rx} ${y - 1.5} ${rx + 3.5} ${y}\" fill=\"none\" stroke=\"${browColor}\" stroke-width=\"0.5\" stroke-linecap=\"round\"/>`\n );\n default:\n return \"\";\n }\n}\n\n// ─── Nose ───────────────────────────────────────\n\nfunction renderNose(ni: number, noseFill: string): string {\n const cx = 32, y = 39;\n switch (ni) {\n case 0: // Shadow\n return `<ellipse cx=\"${cx}\" cy=\"${y}\" rx=\"2\" ry=\"1.2\" fill=\"${noseFill}\" opacity=\"0.35\"/>`;\n case 1: // Button\n return `<circle cx=\"${cx}\" cy=\"${y}\" r=\"1.8\" fill=\"${noseFill}\" opacity=\"0.5\"/>`;\n case 2: // Soft\n return `<path d=\"M${cx - 2} ${y + 1} Q${cx} ${y - 2} ${cx + 2} ${y + 1}\" fill=\"none\" stroke=\"${noseFill}\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.5\"/>`;\n case 3: // Nostrils\n return (\n `<circle cx=\"${cx - 1.8}\" cy=\"${y}\" r=\"1.2\" fill=\"${noseFill}\" opacity=\"0.4\"/>` +\n `<circle cx=\"${cx + 1.8}\" cy=\"${y}\" r=\"1.2\" fill=\"${noseFill}\" opacity=\"0.4\"/>`\n );\n case 4: // Pointed\n return `<path d=\"M${cx} ${y - 2} L${cx - 2} ${y + 1.5} L${cx + 2} ${y + 1.5} Z\" fill=\"${noseFill}\" opacity=\"0.4\"/>`;\n case 5: // Wide\n return `<ellipse cx=\"${cx}\" cy=\"${y}\" rx=\"3.5\" ry=\"1.5\" fill=\"${noseFill}\" opacity=\"0.35\"/>`;\n case 6: // Bridge\n return `<line x1=\"${cx}\" y1=\"${y - 3}\" x2=\"${cx}\" y2=\"${y + 1}\" stroke=\"${noseFill}\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.4\"/>`;\n case 7: // Snub\n return (\n `<circle cx=\"${cx}\" cy=\"${y + 0.5}\" r=\"2\" fill=\"${noseFill}\" opacity=\"0.35\"/>` +\n `<ellipse cx=\"${cx}\" cy=\"${y - 0.5}\" rx=\"1\" ry=\"0.5\" fill=\"${noseFill}\" opacity=\"0.15\"/>`\n );\n default:\n return `<ellipse cx=\"${cx}\" cy=\"${y}\" rx=\"2\" ry=\"1.2\" fill=\"${noseFill}\" opacity=\"0.35\"/>`;\n }\n}\n\n// ─── Mouth ──────────────────────────────────────\n\nfunction renderMouth(mi: number, lipColor: string, isDark: boolean): string {\n const cx = 32, y = 45;\n const teethCol = isDark ? \"#e8e0d8\" : \"#ffffff\";\n switch (mi) {\n case 0: // Smile\n return `<path d=\"M${cx - 4} ${y} Q${cx} ${y + 4} ${cx + 4} ${y}\" fill=\"none\" stroke=\"${lipColor}\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>`;\n case 1: // Calm\n return `<line x1=\"${cx - 3}\" y1=\"${y + 1}\" x2=\"${cx + 3}\" y2=\"${y + 1}\" stroke=\"${lipColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>`;\n case 2: // Happy\n return `<path d=\"M${cx - 5} ${y} Q${cx} ${y + 5} ${cx + 5} ${y}\" fill=\"none\" stroke=\"${lipColor}\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`;\n case 3: // Oh\n return `<ellipse cx=\"${cx}\" cy=\"${y + 1}\" rx=\"2.5\" ry=\"3\" fill=\"${lipColor}\" opacity=\"0.7\"/>`;\n case 4: // Smirk\n return `<path d=\"M${cx - 4} ${y + 1} Q${cx + 1} ${y + 1} ${cx + 4} ${y - 1.5}\" fill=\"none\" stroke=\"${lipColor}\" stroke-width=\"1.3\" stroke-linecap=\"round\"/>`;\n case 5: // Grin\n return (\n `<path d=\"M${cx - 5} ${y} Q${cx} ${y + 6} ${cx + 5} ${y}\" fill=\"${teethCol}\" stroke=\"${lipColor}\" stroke-width=\"1\"/>` +\n `<line x1=\"${cx - 4}\" y1=\"${y + 1.5}\" x2=\"${cx + 4}\" y2=\"${y + 1.5}\" stroke=\"${lipColor}\" stroke-width=\"0.3\" opacity=\"0.3\"/>`\n );\n case 6: // Flat\n return `<path d=\"M${cx - 4} ${y + 0.5} Q${cx} ${y + 1.5} ${cx + 4} ${y + 0.5}\" fill=\"none\" stroke=\"${lipColor}\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>`;\n case 7: // Pout\n return (\n `<ellipse cx=\"${cx}\" cy=\"${y + 1}\" rx=\"3.5\" ry=\"2\" fill=\"${lipColor}\" opacity=\"0.25\"/>` +\n `<path d=\"M${cx - 3} ${y} Q${cx} ${y + 2.5} ${cx + 3} ${y}\" fill=\"none\" stroke=\"${lipColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>`\n );\n default:\n return `<path d=\"M${cx - 4} ${y} Q${cx} ${y + 4} ${cx + 4} ${y}\" fill=\"none\" stroke=\"${lipColor}\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>`;\n }\n}\n\n// ─── Accessories ────────────────────────────────\n\nfunction renderAccessory(\n ai: number,\n accessoryColor: string,\n glassesColor: string,\n earringColor: string,\n headbandColor: string,\n beautyMarkColor: string = \"#3a2a2a\",\n freckleColor: string = \"#a0785a\",\n skinColor: string = \"#E8BA8B\",\n): string {\n switch (ai) {\n case 0: return \"\"; // None\n case 1: // Beauty mark\n return `<circle cx=\"40\" cy=\"44\" r=\"0.8\" fill=\"${beautyMarkColor}\"/>`;\n case 2: // Round glasses\n return (\n `<g fill=\"none\" stroke=\"${glassesColor}\" stroke-width=\"1\">` +\n `<circle cx=\"25\" cy=\"33\" r=\"5.5\"/>` +\n `<circle cx=\"39\" cy=\"33\" r=\"5.5\"/>` +\n `<line x1=\"30.5\" y1=\"33\" x2=\"33.5\" y2=\"33\"/>` +\n `<line x1=\"19.5\" y1=\"33\" x2=\"14\" y2=\"31\"/>` +\n `<line x1=\"44.5\" y1=\"33\" x2=\"50\" y2=\"31\"/>` +\n `</g>`\n );\n case 3: // Rect glasses\n return (\n `<g fill=\"none\" stroke=\"${glassesColor}\" stroke-width=\"1\">` +\n `<rect x=\"19\" y=\"29\" width=\"12\" height=\"8\" rx=\"1.5\"/>` +\n `<rect x=\"33\" y=\"29\" width=\"12\" height=\"8\" rx=\"1.5\"/>` +\n `<line x1=\"31\" y1=\"33\" x2=\"33\" y2=\"33\"/>` +\n `<line x1=\"19\" y1=\"33\" x2=\"14\" y2=\"31\"/>` +\n `<line x1=\"45\" y1=\"33\" x2=\"50\" y2=\"31\"/>` +\n `</g>`\n );\n case 4: // Earring\n return (\n `<circle cx=\"10\" cy=\"38\" r=\"1.5\" fill=\"${earringColor}\"/>` +\n `<circle cx=\"10\" cy=\"41\" r=\"2\" fill=\"${earringColor}\" opacity=\"0.8\"/>`\n );\n case 5: // Headband\n return `<rect x=\"13\" y=\"20\" width=\"38\" height=\"3.5\" rx=\"1.5\" fill=\"${headbandColor}\" opacity=\"0.85\"/>`;\n case 6: // Freckles\n return (\n `<g fill=\"${freckleColor}\" opacity=\"0.35\">` +\n `<circle cx=\"21\" cy=\"40\" r=\"0.6\"/>` +\n `<circle cx=\"23\" cy=\"42\" r=\"0.5\"/>` +\n `<circle cx=\"19\" cy=\"41.5\" r=\"0.5\"/>` +\n `<circle cx=\"43\" cy=\"40\" r=\"0.6\"/>` +\n `<circle cx=\"41\" cy=\"42\" r=\"0.5\"/>` +\n `<circle cx=\"45\" cy=\"41.5\" r=\"0.5\"/>` +\n `</g>`\n );\n case 7: // Stud earrings\n return (\n `<circle cx=\"10\" cy=\"37\" r=\"1.2\" fill=\"${earringColor}\"/>` +\n `<circle cx=\"54\" cy=\"37\" r=\"1.2\" fill=\"${earringColor}\"/>`\n );\n case 8: // Aviators\n return (\n `<g fill=\"none\" stroke=\"${glassesColor}\" stroke-width=\"1.2\">` +\n `<path d=\"M19 30 Q19 28 25 28 Q31 28 31 33 Q31 38 25 38 Q19 38 19 33 Z\" fill=\"${glassesColor}\" fill-opacity=\"0.15\"/>` +\n `<path d=\"M33 30 Q33 28 39 28 Q45 28 45 33 Q45 38 39 38 Q33 38 33 33 Z\" fill=\"${glassesColor}\" fill-opacity=\"0.15\"/>` +\n `<line x1=\"31\" y1=\"32\" x2=\"33\" y2=\"32\"/>` +\n `<line x1=\"19\" y1=\"31\" x2=\"14\" y2=\"29\"/>` +\n `<line x1=\"45\" y1=\"31\" x2=\"50\" y2=\"29\"/>` +\n `</g>`\n );\n case 9: // Band-Aid\n return (\n `<g>` +\n `<rect x=\"38\" y=\"38\" width=\"9\" height=\"4.5\" rx=\"1.2\" fill=\"#f0d0a0\" transform=\"rotate(-15 42 40)\"/>` +\n `<rect x=\"39.5\" y=\"38.5\" width=\"6\" height=\"3.5\" rx=\"0.8\" fill=\"#f5ddb5\" transform=\"rotate(-15 42 40)\"/>` +\n `<circle cx=\"42.5\" cy=\"40.25\" r=\"0.5\" fill=\"#d4b898\" transform=\"rotate(-15 42 40)\"/>` +\n `</g>`\n );\n case 10: // Left Eyebrow Slit\n return `<line x1=\"23\" y1=\"24.8\" x2=\"23.8\" y2=\"29.2\" stroke=\"${skinColor}\" stroke-width=\"1.3\" stroke-linecap=\"butt\"/>`;\n case 11: // Right Eyebrow Slit\n return `<line x1=\"41\" y1=\"24.8\" x2=\"40.2\" y2=\"29.2\" stroke=\"${skinColor}\" stroke-width=\"1.3\" stroke-linecap=\"butt\"/>`;\n default:\n return \"\";\n }\n}\n\n// ─── Main Render Functions ──────────────────────\n\n/**\n * Render a SolFace avatar as an SVG string. Deterministic — same wallet always produces the same SVG.\n *\n * @param walletAddress Base58 Solana wallet address.\n * @param options Render options (size, theme, detail level, color overrides, etc.).\n * @returns Complete SVG markup string.\n */\nexport function renderSolFaceSVG(\n walletAddress: string,\n options?: RenderOptions,\n): string {\n const { size = 64, theme, traitOverrides, enableBlink, className, colorOverrides } = options ?? {};\n const traits = generateTraits(walletAddress, traitOverrides);\n\n // Resolve detail level\n const detailOpt = options?.detail ?? \"auto\";\n const full = detailOpt === \"full\" || (detailOpt === \"auto\" && size >= 48);\n const flat = theme?.flat ?? false;\n\n // Color palettes\n const skinColors = theme?.skinColors ?? SKIN_COLORS;\n const eyeColors = theme?.eyeColors ?? EYE_COLORS;\n const hairColors = theme?.hairColors ?? HAIR_COLORS;\n const bgColors = theme?.bgColors ?? BG_COLORS;\n\n const skin = colorOverrides?.skin ?? skinColors[traits.skinColor % skinColors.length];\n const eyeCol = colorOverrides?.eyes ?? eyeColors[traits.eyeColor % eyeColors.length];\n const hairCol = colorOverrides?.hair ?? hairColors[traits.hairColor % hairColors.length];\n const bgCol = colorOverrides?.bg ?? bgColors[traits.bgColor % bgColors.length];\n\n // Derived skin colors\n const derived = deriveSkinColors(skin);\n\n const bgOpacity = theme?.bgOpacity ?? 1;\n const bgRadius = theme?.bgRadius ?? 4;\n const browColor = colorOverrides?.eyebrow ?? theme?.eyebrowColor ?? derived.browColor;\n const noseFill = colorOverrides?.nose ?? theme?.noseColor ?? derived.noseFill;\n const lipColor = colorOverrides?.mouth ?? theme?.mouthColor ?? derived.lipColor;\n const accColor = colorOverrides?.accessory ?? theme?.accessoryColor ?? derived.accessoryColor;\n const eyeWhite = colorOverrides?.eyeWhite ?? theme?.eyeWhiteColor ?? derived.eyeWhiteAdapted;\n const glassesColor = theme?.glassesColor ?? \"#4a4a5a\";\n const earringColor = theme?.earringColor ?? blend(skin, \"#d4a840\", 0.4);\n const headbandColor = theme?.headbandColor ?? blend(hairCol, \"#c04040\", 0.5);\n const beautyMarkColor = theme?.beautyMarkColor ?? \"#3a2a2a\";\n const freckleColor = theme?.freckleColor ?? \"#a0785a\";\n\n // Unique gradient ID prefix (collision-resistant)\n const id = \"sf\" + djb2(walletAddress).toString(36);\n\n // Cheek\n const cheekEnabled = theme?.cheekEnabled ?? true;\n const cheekColor = theme?.cheekColor ?? derived.cheekColor;\n const cheekOpacity = theme?.cheekOpacity ?? derived.cheekOpacity;\n\n const hi = traits.hairStyle % 10;\n const ai = effectiveAccessory(traits);\n\n const classAttr = className ? ` class=\"${className}\"` : \"\";\n const altText = solFaceAltText(walletAddress).replace(/\"/g, \"&quot;\");\n let svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 64\" width=\"${size}\" height=\"${size}\"${classAttr} role=\"img\" aria-label=\"${altText}\">`;\n\n // Defs\n const glowIntensity = theme?.glowIntensity ?? 0.10;\n svg += buildDefs(id, skin, derived.skinHi, derived.skinLo, hairCol, bgCol, cheekColor, cheekOpacity, flat, full && cheekEnabled, glowIntensity);\n\n // Blink animation\n const blinkEnabled = !!enableBlink;\n const blinkDuration = typeof enableBlink === \"object\" ? (enableBlink.duration ?? 4) : 4;\n const blinkDelay = typeof enableBlink === \"object\" ? (enableBlink.delay ?? 0) : 0;\n if (blinkEnabled) {\n const uid = `sf-${walletAddress.slice(0, 8)}`;\n const delayStr = blinkDelay ? ` ${blinkDelay}s` : \"\";\n svg += `<style>@keyframes ${uid}-blink{0%,90%,100%{transform:scaleY(1)}95%{transform:scaleY(0.1)}}.${uid}-eyes{animation:${uid}-blink ${blinkDuration}s ease-in-out${delayStr} infinite;transform-origin:32px 33px}</style>`;\n }\n\n // Background\n const bgFill = flat ? bgCol : `url(#${id}bg)`;\n svg += `<rect x=\"0\" y=\"0\" width=\"64\" height=\"64\" fill=\"${bgFill}\" opacity=\"${bgOpacity}\" rx=\"${bgRadius}\"/>`;\n\n // Hair back (unused — all styles bald)\n if (theme?.hairEnabled !== false) svg += renderHairBack(hi, id, flat);\n\n // Ears\n if (theme?.earsEnabled !== false) svg += renderEars(theme?.earColor ?? derived.earFill, derived.earShadow);\n\n // Face\n const skinOpacity = theme?.skinOpacity ?? 1;\n svg += renderFace(id, skin, flat, skinOpacity);\n\n // Face overlays (glow, chin shadow, cheeks, jawline) — full detail only\n const shadowEnabled = theme?.shadowEnabled ?? true;\n if (full && cheekEnabled && shadowEnabled) {\n svg += renderFaceOverlays(id, flat);\n }\n\n // Hair front (unused — all styles bald)\n if (theme?.hairEnabled !== false) svg += renderHairFront(hi, id, hairCol, skin, flat);\n\n // Headband (renders after hair front so it's visible)\n if (ai === 5 && theme?.accessoriesEnabled !== false) {\n svg += renderAccessory(5, accColor, glassesColor, earringColor, headbandColor, beautyMarkColor, freckleColor, skin);\n }\n\n // Eyes\n if (blinkEnabled) {\n const uid = `sf-${walletAddress.slice(0, 8)}`;\n svg += `<g class=\"${uid}-eyes\">`;\n }\n svg += renderEyes(traits.eyeStyle % 9, eyeCol, eyeWhite, theme?.lidColor ?? derived.lidColor, full);\n if (blinkEnabled) svg += `</g>`;\n\n // Eyebrows\n if (theme?.eyebrowsEnabled !== false) svg += renderEyebrows(traits.eyebrows % 8, browColor, full);\n\n // Nose\n if (theme?.noseEnabled !== false) svg += renderNose(traits.nose % 8, noseFill);\n\n // Mouth\n svg += renderMouth(traits.mouth % 8, lipColor, derived.isDark);\n\n // Accessories (except headband, already rendered)\n if (ai !== 0 && ai !== 5 && theme?.accessoriesEnabled !== false) {\n svg += renderAccessory(ai, accColor, glassesColor, earringColor, headbandColor, beautyMarkColor, freckleColor, skin);\n }\n\n // Border\n if (theme?.border) {\n svg += `<rect x=\"0\" y=\"0\" width=\"64\" height=\"64\" fill=\"none\" stroke=\"${theme.border.color}\" stroke-width=\"${theme.border.width}\" rx=\"${bgRadius}\"/>`;\n }\n\n svg += `</svg>`;\n return svg;\n}\n\n/**\n * Render a SolFace avatar as a `data:image/svg+xml` URI (URL-encoded). Suitable for `<img src>` attributes.\n *\n * @param walletAddress Base58 Solana wallet address.\n * @param options Render options.\n * @returns Data URI string.\n */\nexport function renderSolFaceDataURI(\n walletAddress: string,\n options?: RenderOptions,\n): string {\n const svg = renderSolFaceSVG(walletAddress, options);\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\n/**\n * Render a SolFace avatar as a base64-encoded `data:image/svg+xml` URI. Suitable for environments that don't support URL-encoded SVGs.\n *\n * @param walletAddress Base58 Solana wallet address.\n * @param options Render options.\n * @returns Base64 data URI string.\n */\nexport function renderSolFaceBase64(\n walletAddress: string,\n options?: RenderOptions,\n): string {\n const svg = renderSolFaceSVG(walletAddress, options);\n return `data:image/svg+xml;base64,${btoa(svg)}`;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/themes/presets.ts"],"names":[],"mappings":";;;AAQO,IAAM,eAA6B;AAInC,IAAM,SAAA,GAA0B;AAAA,EACrC,QAAA,EAAU;AAAA,IAAC,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAC5C,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAC5C,SAAA;AAAA,IAAW;AAAA,GAAS;AAAA,EAC/B,aAAA,EAAe,SAAA;AAAA,EACf,SAAA,EAAW,CAAA;AAAA,EACX,QAAA,EAAU,CAAA;AAAA,EACV,MAAA,EAAQ,EAAE,KAAA,EAAO,SAAA,EAAW,OAAO,GAAA;AACrC;AAEO,IAAM,UAAA,GAA2B;AAAA,EACtC,QAAA,EAAU;AAAA,IAAC,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAC5C,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAC5C,SAAA;AAAA,IAAW;AAAA,GAAS;AAAA,EAC/B,SAAA,EAAW,CAAA;AAAA,EACX,QAAA,EAAU;AACZ;AAEO,IAAM,SAAA,GAA0B;AAAA,EACrC,UAAA,EAAY;AAAA,IAAC,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAC5C,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW;AAAA,GAAS;AAAA,EAClE,WAAW,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAAA,EAClD,UAAA,EAAY;AAAA,IAAC,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,MAAA;AAAA,IAAQ,SAAA;AAAA,IACzC,MAAA;AAAA,IAAQ,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW;AAAA,GAAS;AAAA,EAC/D,QAAA,EAAU;AAAA,IAAC,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAC5C,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IAC5C,SAAA;AAAA,IAAW;AAAA,GAAS;AAAA,EAC/B,UAAA,EAAY,MAAA;AAAA,EACZ,YAAA,EAAc,MAAA;AAAA,EACd,cAAA,EAAgB,MAAA;AAAA,EAChB,aAAA,EAAe,SAAA;AAAA,EACf,SAAA,EAAW,GAAA;AAAA,EACX,QAAA,EAAU;AACZ;AAEO,IAAM,SAAA,GAA0B;AAAA,EACrC,IAAA,EAAM;AACR;AAEO,IAAM,gBAAA,GAAiC;AAAA,EAC5C,IAAA,EAAM,IAAA;AAAA,EACN,SAAA,EAAW;AACb;AAIO,IAAM,UAAA,GAA2B;AAAA,EACtC,SAAA,EAAW,IAAA;AAAA,EACX,QAAA,EAAU,EAAA;AAAA,EACV,MAAA,EAAQ,IAAA;AAAA,EACR,WAAA,EAAa,EAAA;AAAA,EACb,SAAA,EAAW,GAAA;AAAA,EACX,YAAA,EAAc,IAAA;AAAA,EACd,UAAA,EAAY,qBAAA;AAAA,EACZ,cAAA,EAAgB,IAAA;AAAA,EAChB,YAAA,EAAc,CAAA;AAAA,EACd,YAAA,EAAc,wBAAA;AAAA,EACd,gBAAA,EAAkB,IAAA;AAAA,EAClB,cAAA,EAAgB,qBAAA;AAAA,EAChB,YAAA,EAAc,EAAA;AAAA,EACd,WAAA,EAAa,GAAA;AAAA,EACb,aAAA,EAAe,IAAA;AAAA,EACf,QAAA,EAAU,CAAA;AAAA,EACV,WAAA,EAAa,EAAA;AAAA,EACb,cAAA,EAAgB;AAClB;AAEO,IAAM,cAAA,GAA+B;AAAA,EAC1C,SAAA,EAAW,GAAA;AAAA,EACX,QAAA,EAAU,EAAA;AAAA,EACV,MAAA,EAAQ,IAAA;AAAA,EACR,WAAA,EAAa,EAAA;AAAA,EACb,SAAA,EAAW,CAAA;AAAA,EACX,YAAA,EAAc,IAAA;AAAA,EACd,UAAA,EAAY,eAAA;AAAA,EACZ,cAAA,EAAgB,IAAA;AAAA,EAChB,YAAA,EAAc,CAAA;AAAA,EACd,YAAA,EAAc,wBAAA;AAAA,EACd,gBAAA,EAAkB,IAAA;AAAA,EAClB,cAAA,EAAgB,qBAAA;AAAA,EAChB,YAAA,EAAc,EAAA;AAAA,EACd,WAAA,EAAa,GAAA;AAAA,EACb,aAAA,EAAe,IAAA;AAAA,EACf,QAAA,EAAU,CAAA;AAAA,EACV,WAAA,EAAa,EAAA;AAAA,EACb,cAAA,EAAgB;AAClB;AAIO,IAAM,UAAA,GAA2B;AAAA,EACtC,IAAA,EAAM,IAAA;AAAA,EACN,MAAA,EAAQ,IAAA;AAAA,EACR,aAAA,EAAe,EAAA;AAAA,EACf,aAAA,EAAe,IAAA;AAAA,EACf,aAAA,EAAe,IAAA;AAAA,EACf,kBAAA,EAAoB,MAAA;AAAA,EACpB,kBAAA,EAAoB;AACtB;AAEO,IAAM,eAAA,GAAgC;AAAA,EAC3C,IAAA,EAAM,IAAA;AAAA,EACN,MAAA,EAAQ,IAAA;AAAA,EACR,aAAA,EAAe,EAAA;AAAA,EACf,aAAA,EAAe,KAAA;AAAA,EACf,aAAA,EAAe,IAAA;AAAA,EACf,kBAAA,EAAoB,MAAA;AAAA,EACpB,kBAAA,EAAoB,CAAA;AAAA,EACpB,eAAA,EAAiB,IAAA;AAAA,EACjB,qBAAA,EAAuB,GAAA;AAAA,EACvB,qBAAA,EAAuB,CAAA;AAAA,EACvB,YAAA,EAAc,IAAA;AAAA,EACd,iBAAA,EAAmB,iBAAA;AAAA,EACnB,kBAAA,EAAoB;AACtB;AAEO,IAAM,eAAA,GAAgC;AAAA,EAC3C,IAAA,EAAM,IAAA;AAAA,EACN,MAAA,EAAQ,IAAA;AAAA,EACR,aAAA,EAAe,EAAA;AAAA,EACf,aAAA,EAAe,IAAA;AAAA,EACf,aAAA,EAAe;AACjB;AAQO,IAAM,aAAA,GAAuD;AAAA,EAClE,OAAA,EAAS,YAAA;AAAA,EACT,IAAA,EAAM,SAAA;AAAA,EACN,KAAA,EAAO,UAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,IAAA,EAAM,SAAA;AAAA,EACN,WAAA,EAAa,gBAAA;AAAA,EACb,KAAA,EAAO,UAAA;AAAA,EACP,SAAA,EAAW,cAAA;AAAA,EACX,KAAA,EAAO,UAAA;AAAA,EACP,UAAA,EAAY,eAAA;AAAA,EACZ,UAAA,EAAY;AACd;AASO,SAAS,cAAA,CACd,MACA,SAAA,EACc;AACd,EAAA,MAAM,IAAA,GAAO,cAAc,IAAI,CAAA;AAC/B,EAAA,IAAI,CAAC,IAAA,EAAM,OAAQ,SAAA,IAA8B,EAAC;AAClD,EAAA,OAAO,YAAY,EAAE,GAAG,IAAA,EAAM,GAAG,WAAU,GAAI,IAAA;AACjD;AAcO,SAAS,WAAA,CACd,OAAA,GAGI,EAAC,EACS;AACd,EAAA,MAAM,EAAE,IAAA,EAAM,GAAG,IAAA,EAAK,GAAI,OAAA;AAC1B,EAAA,IAAI,OAAqB,EAAC;AAE1B,EAAA,IAAI,IAAA,KAAS,MAAA,EAAQ,IAAA,GAAO,EAAE,GAAG,SAAA,EAAU;AAAA,OAAA,IAClC,IAAA,KAAS,OAAA,EAAS,IAAA,GAAO,EAAE,GAAG,UAAA,EAAW;AAAA,OAAA,IACzC,IAAA,KAAS,aAAA,EAAe,IAAA,GAAO,EAAE,GAAG,gBAAA,EAAiB;AAAA,OAAA,IACrD,IAAA,KAAS,MAAA,EAAQ,IAAA,GAAO,EAAE,GAAG,SAAA,EAAU;AAAA,OAAA,IACvC,IAAA,KAAS,MAAA,EAAQ,IAAA,GAAO,EAAE,GAAG,SAAA,EAAU;AAEhD,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,GAAG,IAAA,EAAK;AAC5B","file":"chunk-PCSRDAWQ.cjs","sourcesContent":["// ═══════════════════════════════════════════════════════════════\n// SOLFACES v2 — Preset Themes\n// ═══════════════════════════════════════════════════════════════\n\nimport type { SolFaceTheme } from \"../core/traits\";\n\n// ─── Default (base look — gradients, no overrides) ─\n\nexport const defaultTheme: SolFaceTheme = {};\n\n// ─── Base Themes ────────────────────────────────\n\nexport const darkTheme: SolFaceTheme = {\n bgColors: [\"#1a1b23\", \"#1e1428\", \"#0a1e38\", \"#1b2838\", \"#201028\",\n \"#141a28\", \"#18122a\", \"#1a2020\", \"#221822\", \"#1e1020\",\n \"#1c1228\", \"#0e201a\"],\n eyeWhiteColor: \"#d8d0c8\",\n bgOpacity: 1,\n bgRadius: 4,\n border: { color: \"#333340\", width: 0.5 },\n};\n\nexport const lightTheme: SolFaceTheme = {\n bgColors: [\"#f5e8ea\", \"#f0f0d8\", \"#e4f0e6\", \"#d8f0e8\", \"#e0ece8\",\n \"#dce8f0\", \"#e0e4f0\", \"#e0d8f0\", \"#f0e0ee\", \"#f0d8e4\",\n \"#e8d8f0\", \"#d8f0e8\"],\n bgOpacity: 1,\n bgRadius: 8,\n};\n\nexport const monoTheme: SolFaceTheme = {\n skinColors: [\"#e8e8e8\", \"#d4d4d4\", \"#c0c0c0\", \"#a8a8a8\", \"#909090\",\n \"#787878\", \"#606060\", \"#505050\", \"#404040\", \"#303030\"],\n eyeColors: [\"#333\", \"#555\", \"#777\", \"#999\", \"#bbb\"],\n hairColors: [\"#1a1a1a\", \"#2a2a2a\", \"#404040\", \"#555\", \"#707070\",\n \"#888\", \"#a0a0a0\", \"#b8b8b8\", \"#d0d0d0\", \"#e0e0e0\"],\n bgColors: [\"#e8e0e0\", \"#e0e0d0\", \"#d8e0d8\", \"#d0e0d8\", \"#d8e0e0\",\n \"#d0d8e0\", \"#d4d4e0\", \"#d4d0e0\", \"#e0d8e0\", \"#e0d0d8\",\n \"#d8d0e0\", \"#d0e0d8\"],\n mouthColor: \"#666\",\n eyebrowColor: \"#555\",\n accessoryColor: \"#777\",\n eyeWhiteColor: \"#f0f0f0\",\n bgOpacity: 0.5,\n bgRadius: 4,\n};\n\nexport const flatTheme: SolFaceTheme = {\n flat: true,\n};\n\nexport const transparentTheme: SolFaceTheme = {\n flat: true,\n bgOpacity: 0,\n};\n\n// ─── React-Only: Liquid Glass ───────────────────\n\nexport const glassTheme: SolFaceTheme = {\n bgOpacity: 0.15,\n bgRadius: 16,\n _glass: true,\n _blurRadius: 12,\n _saturate: 1.8,\n _tintOpacity: 0.12,\n _tintColor: \"rgba(255,255,255,1)\",\n _borderOpacity: 0.25,\n _borderWidth: 1,\n _borderColor: \"rgba(255,255,255,0.25)\",\n _specularOpacity: 0.25,\n _specularColor: \"rgba(255,255,255,1)\",\n _specularEnd: 50,\n _lightAngle: 135,\n _rimIntensity: 0.08,\n _shadowY: 8,\n _shadowBlur: 32,\n _shadowOpacity: 0.12,\n};\n\nexport const glassDarkTheme: SolFaceTheme = {\n bgOpacity: 0.2,\n bgRadius: 16,\n _glass: true,\n _blurRadius: 16,\n _saturate: 2.0,\n _tintOpacity: 0.08,\n _tintColor: \"rgba(0,0,0,1)\",\n _borderOpacity: 0.15,\n _borderWidth: 1,\n _borderColor: \"rgba(255,255,255,0.15)\",\n _specularOpacity: 0.15,\n _specularColor: \"rgba(255,255,255,1)\",\n _specularEnd: 40,\n _lightAngle: 135,\n _rimIntensity: 0.05,\n _shadowY: 8,\n _shadowBlur: 32,\n _shadowOpacity: 0.25,\n};\n\n// ─── React-Only: Pixel Art ──────────────────────\n\nexport const pixelTheme: SolFaceTheme = {\n flat: true,\n _pixel: true,\n _pixelDensity: 16,\n _pixelRounded: true,\n _pixelOutline: true,\n _pixelOutlineColor: \"#222\",\n _pixelOutlineWidth: 2,\n};\n\nexport const pixelRetroTheme: SolFaceTheme = {\n flat: true,\n _pixel: true,\n _pixelDensity: 12,\n _pixelRounded: false,\n _pixelOutline: true,\n _pixelOutlineColor: \"#000\",\n _pixelOutlineWidth: 2,\n _pixelScanlines: true,\n _pixelScanlineOpacity: 0.1,\n _pixelScanlineSpacing: 2,\n _pixelShadow: true,\n _pixelShadowColor: \"rgba(0,0,0,0.4)\",\n _pixelShadowOffset: 3,\n};\n\nexport const pixelCleanTheme: SolFaceTheme = {\n flat: true,\n _pixel: true,\n _pixelDensity: 24,\n _pixelRounded: true,\n _pixelOutline: false,\n};\n\n// ─── Theme Map ──────────────────────────────────\n\n/** Names of all built-in preset themes. */\nexport type PresetThemeName = \"default\" | \"dark\" | \"light\" | \"mono\" | \"flat\" | \"transparent\" | \"glass\" | \"glassDark\" | \"pixel\" | \"pixelRetro\" | \"pixelClean\";\n\n/** Map of all built-in preset themes, keyed by name. */\nexport const PRESET_THEMES: Record<PresetThemeName, SolFaceTheme> = {\n default: defaultTheme,\n dark: darkTheme,\n light: lightTheme,\n mono: monoTheme,\n flat: flatTheme,\n transparent: transparentTheme,\n glass: glassTheme,\n glassDark: glassDarkTheme,\n pixel: pixelTheme,\n pixelRetro: pixelRetroTheme,\n pixelClean: pixelCleanTheme,\n};\n\n/**\n * Look up a built-in preset theme by name, optionally merging overrides.\n *\n * @param name Preset theme name (e.g. \"glass\", \"dark\", \"pixelRetro\").\n * @param overrides Optional partial theme to merge on top of the preset.\n * @returns The resolved theme object.\n */\nexport function getPresetTheme(\n name: PresetThemeName,\n overrides?: Partial<SolFaceTheme>,\n): SolFaceTheme {\n const base = PRESET_THEMES[name];\n if (!base) return (overrides as SolFaceTheme) ?? {};\n return overrides ? { ...base, ...overrides } : base;\n}\n\n/**\n * Build a custom theme by starting from a preset mode and merging your overrides.\n * All SolFaceTheme properties are available for IntelliSense-driven customization.\n *\n * @param options Theme options. Use `mode` to start from a preset base, then override any property.\n * @returns A fully resolved SolFaceTheme object.\n *\n * @example\n * ```ts\n * const myTheme = createTheme({ mode: \"dark\", bgRadius: 12, flat: true });\n * ```\n */\nexport function createTheme(\n options: Partial<SolFaceTheme> & {\n /** Start from a preset mode. Default: none (default gradient theme). */\n mode?: \"light\" | \"dark\" | \"transparent\" | \"mono\" | \"flat\";\n } = {},\n): SolFaceTheme {\n const { mode, ...rest } = options;\n let base: SolFaceTheme = {};\n\n if (mode === \"dark\") base = { ...darkTheme };\n else if (mode === \"light\") base = { ...lightTheme };\n else if (mode === \"transparent\") base = { ...transparentTheme };\n else if (mode === \"mono\") base = { ...monoTheme };\n else if (mode === \"flat\") base = { ...flatTheme };\n\n return { ...base, ...rest };\n}\n"]}