@botharness/pixel-avatar 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/index.d.ts +46 -6
- package/dist/index.js +1576 -1482
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["INK","channels","mix"],"sources":["../src/figure.ts","../src/random.ts","../src/recipe.ts","../src/svg.ts","../src/symbols.ts"],"sourcesContent":["import { escapeAttribute, type PixelCell } from '@botharness/pixel-morph';\nimport type { PixelAvatarRecipe } from './recipe.js';\n\ntype Cell = string | undefined;\ntype Grid = Cell[][];\ntype Mask = (x: number, y: number) => boolean;\ntype Point = readonly [number, number];\n\nconst N = 32;\nconst C = 16;\nconst INK = '#2a2230';\nconst WHITE = '#ffffff';\nconst BLUSH = '#f4879a';\nconst MOUTH = '#7a2a38';\nconst MOUTH_INSIDE = '#b8415a';\nconst TONGUE = '#ef6f84';\nconst GOLD = '#efb93f';\n\nexport type PixelGrid = Grid;\nconst blank = (): Grid => Array.from({ length: N }, () => Array<Cell>(N).fill(undefined));\nconst ellipse =\n (cx: number, cy: number, rx: number, ry: number): Mask =>\n (x, y) =>\n ((x + 0.5 - cx) / rx) ** 2 + ((y + 0.5 - cy) / ry) ** 2 <= 1;\n\nfunction channels(color: string): number[] {\n const n = Number.parseInt(color.slice(1), 16);\n return [16, 8, 0].map((bit) => (n >> bit) & 255);\n}\nfunction hex(values: number[]): string {\n return `#${values\n .map((v) =>\n Math.min(255, Math.max(0, Math.round(v)))\n .toString(16)\n .padStart(2, '0'),\n )\n .join('')}`;\n}\nconst shade = (color: string, k: number) => hex(channels(color).map((v) => v * k));\nconst mix = (base: string, tint: string, k: number) => {\n const t = channels(tint);\n return hex(channels(base).map((v, i) => v * (1 - k) + t[i]! * k));\n};\nfunction paint(grid: Grid, test: Mask, color: string): void {\n for (let y = 0; y < N; y++) for (let x = 0; x < N; x++) if (test(x, y)) grid[y]![x] = color;\n}\nfunction sprite(\n grid: Grid,\n rows: readonly string[],\n ox: number,\n oy: number,\n pal: Record<string, string>,\n flip = false,\n): void {\n rows.forEach((row, y) =>\n [...row].forEach((code, i) => {\n const c = pal[code];\n const x = ox + (flip ? row.length - 1 - i : i);\n if (c && x >= 0 && x < N && oy + y >= 0 && oy + y < N) grid[oy + y]![x] = c;\n }),\n );\n}\nfunction outline(grid: Grid): Grid {\n const out = grid.map((row) => [...row]);\n for (let y = 0; y < N; y++)\n for (let x = 0; x < N; x++) {\n if (grid[y]![x]) continue;\n const n = [grid[y]?.[x - 1], grid[y]?.[x + 1], grid[y - 1]?.[x], grid[y + 1]?.[x]].find(\n Boolean,\n );\n if (n) out[y]![x] = mix(shade(n, 0.3), INK, 0.62);\n }\n return out;\n}\nconst R = 6;\nconst inTile: Mask = (x, y) => {\n const clamp = (v: number) => Math.min(Math.max(v, R), N - R);\n return (x + 0.5 - clamp(x + 0.5)) ** 2 + (y + 0.5 - clamp(y + 0.5)) ** 2 <= R * R;\n};\nconst clip = (g: Grid): Grid =>\n g.map((row, y) => row.map((c, x) => (inTile(x, y) ? c : undefined)));\nfunction rects(grid: Grid): string {\n let m = '';\n for (let y = 0; y < N; y++) {\n let x = 0;\n while (x < N) {\n const c = grid[y]![x];\n if (!c) {\n x++;\n continue;\n }\n let w = 1;\n while (x + w < N && grid[y]![x + w] === c) w++;\n m += `<rect x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"1\" fill=\"${escapeAttribute(c)}\"/>`;\n x += w;\n }\n }\n return m;\n}\n\ntype Recipe = PixelAvatarRecipe;\n\nconst FACE: Record<Recipe['head'], (s: number) => Mask> = {\n round: (s) => ellipse(C + s, 16.6, 8.6, 7.6),\n oval: (s) => ellipse(C + s, 16.6, 8, 8),\n chubby: (s) => ellipse(C + s, 17, 9.4, 7.2),\n long: (s) => ellipse(C + s, 16.6, 7.8, 8.4),\n square: (s) => (x, y) => {\n if (y < 8 || y > 23) return false;\n const dx = Math.abs(x + 0.5 - C - s);\n const r = 3;\n if (y <= 20) return dx <= 8.5;\n return dx <= 8.5 - (y - 20) ** 1.3 * 1.1 + 0.3 - (y === 23 ? 1 : 0) || dx <= 8.5 - r;\n },\n heart: (s) => taper(ellipse(C + s, 15.8, 9, 7.4), 16.5, 9, 2.6, 24.4, s),\n vchin: (s) => taper(ellipse(C + s, 15.8, 8.6, 7.4), 17.5, 8.6, 2.2, 24.4, s),\n diamond: (s) =>\n taper(\n (x, y) => y >= 9 && Math.abs(x + 0.5 - C - s) <= 6.4 + (y - 9) * 0.45,\n 15.8,\n 9.2,\n 2.6,\n 24.4,\n s,\n ),\n};\nfunction taper(top: Mask, from: number, width: number, end: number, chin: number, s: number): Mask {\n return (x, y) => {\n const cy = y + 0.5;\n if (cy <= from) return top(x, y);\n if (cy > chin) return false;\n const t = (cy - from) / (chin - from);\n return Math.abs(x + 0.5 - C - s) <= width - (width - end) * t ** 1.5;\n };\n}\n\nconst EYES: Record<Recipe['eyes'], readonly string[]> = {\n round: ['KKKK', 'DWDD', 'IDDI', 'LIIL'],\n dot: ['....', '.KK.', '.KK.', '....'],\n sparkle: ['KKKK', 'DWDW', 'IDDI', 'LIWL'],\n lashes: ['KKKKK', 'K.DWD', '..IDD', '..LII'],\n sleepy: ['....', 'KKKK', 'IDDI', 'LIIL'],\n happy: ['....', '.KK.', 'K..K', '....'],\n wink: ['KKKK', 'DWDD', 'IDDI', 'LIIL'],\n sharp: ['KK..', '.KKK', '.DWD', '..LI'],\n};\nconst CLOSED = ['....', '....', 'KKKK', '....'];\nconst BROWS: Record<Recipe['brows'], readonly string[]> = {\n soft: ['.BBB'],\n thick: ['BBBB'],\n raised: ['.BB.'],\n angry: ['BB..', '..BB'],\n worried: ['..BB', 'BB..'],\n none: [],\n};\nconst MOUTHS: Record<Recipe['mouth'], readonly string[]> = {\n smile: ['K..K', '.KK.'],\n grin: ['KWWK', '.KK.'],\n open: ['KKK', 'MTM'],\n flat: ['.KK.'],\n smirk: ['...K', '.KK.'],\n cat: ['K.K.K', '.K.K.'],\n tongue: ['KKKK', '.TT.'],\n o: ['.K.', 'KMK', '.K.'],\n};\n\nfunction hair(\n recipe: Recipe,\n s: number,\n b: number,\n): { back: Mask; front: Mask; ties?: Point[]; bands?: boolean } {\n const none: Mask = () => false;\n const cap = ellipse(C + s, 14, 11, 10.6);\n const tip = (x: number, depth = 1) => [0, depth, depth + 1, depth][(x + 40 - s) % 4]!;\n const bangs =\n (line: number, depth = 1, sides = 22): Mask =>\n (x, y) => {\n if (!cap(x, Math.min(y, 13))) return false;\n const dx = x + 0.5 - C - s;\n if (Math.abs(dx) >= 7) return y <= sides - [0, 1, 0, 2][(x + 40 - s) % 4]!;\n return y <= line + tip(x, depth) - (Math.abs(dx) > 6 ? 0 : 0);\n };\n const longBack =\n (bottom: number, width = 11.4): Mask =>\n (x, y) =>\n (ellipse(C + b, 14, width + 0.4, 11)(x, y) && y <= 16) ||\n (y > 15 && y <= bottom && Math.abs(x + 0.5 - C - b) <= width - (y > bottom - 2 ? 1 : 0));\n switch (recipe.hair) {\n case 'none':\n return { back: none, front: none };\n case 'buzz':\n return { back: none, front: (x, y) => cap(x, y) && y <= 7 };\n case 'crop':\n return { back: none, front: bangs(10, 1, 15) };\n case 'sweep':\n return {\n back: none,\n front: (x, y) =>\n cap(x, Math.min(y, 13)) &&\n (y <= 9 + Math.max(0, (x - 6 - s) * 0.45) || (Math.abs(x + 0.5 - C - s) >= 7 && y <= 16)),\n };\n case 'spiky':\n return {\n back: none,\n front: (x, y) =>\n cap(x, Math.max(y, 6)) &&\n y >= [1, 3, 5, 3][(x + 40 - s) % 4]! &&\n bangs(11, 2, 15)(x, Math.max(y, 6)),\n };\n case 'curly': {\n const bumps: Point[] = Array.from({ length: 9 }, (_, i) => {\n const a = Math.PI * (1.02 + (i * 0.96) / 8);\n return [C + s + 11.5 * Math.cos(a), 14 + 11 * Math.sin(a)] as Point;\n });\n return {\n back: none,\n front: (x, y) =>\n bangs(11, 1, 18)(x, y) ||\n (y <= 18 && bumps.some(([bx, by]) => (x + 0.5 - bx) ** 2 + (y + 0.5 - by) ** 2 <= 6.5)),\n };\n }\n case 'mohawk':\n return { back: none, front: (x, y) => Math.abs(x + 0.5 - C - s) <= 2 && y >= 1 && y <= 9 };\n case 'bob':\n return { back: longBack(25), front: bangs(13, 1, 24) };\n case 'long':\n return { back: longBack(31), front: bangs(13, 1, 26) };\n case 'bun':\n return {\n back: none,\n front: (x, y) => bangs(12, 1, 18)(x, y) || ellipse(C + s, 2.6, 4, 2.6)(x, y),\n };\n case 'pigtails':\n return {\n back: (x, y) =>\n ellipse(C + s - 11.5, 21, 3, 4.4)(x, y) || ellipse(C + s + 11.5, 21, 3, 4.4)(x, y),\n front: bangs(13, 1, 21),\n ties: [\n [C + s - 12, 16],\n [C + s + 11, 16],\n ],\n };\n case 'afro':\n return { back: ellipse(C + b, 12, 15, 11.5), front: (x, y) => cap(x, y) && y <= 8 };\n case 'twintails':\n case 'drills':\n return {\n back: (x, y) =>\n y >= 8 &&\n (ellipse(C + s - 13.2, 20, 2.3, 12)(x, y) || ellipse(C + s + 13.2, 20, 2.3, 12)(x, y)),\n front: bangs(13, 1, 24),\n ties: [\n [C + s - 13, 9],\n [C + s - 12, 9],\n [C + s + 11, 9],\n [C + s + 12, 9],\n ],\n bands: recipe.hair === 'drills',\n };\n case 'ponytail':\n return {\n back: (x, y) => ellipse(C + s + 11.5, 19, 3, 9)(x, y) && y >= 8,\n front: bangs(12, 1, 20),\n ties: [\n [C + s + 10, 9],\n [C + s + 11, 9],\n ],\n };\n case 'sidetail':\n return {\n back: (x, y) => ellipse(C + s - 11.5, 21, 3, 8)(x, y) && y >= 12,\n front: (x, y) =>\n cap(x, Math.min(y, 13)) &&\n (y <= 9 + Math.max(0, (C + s - x) * 0.45) || (Math.abs(x + 0.5 - C - s) >= 7 && y <= 18)),\n ties: [\n [C + s - 13, 13],\n [C + s - 12, 13],\n ],\n };\n case 'hime':\n return {\n back: longBack(31),\n front: (x, y) =>\n cap(x, Math.min(y, 13)) && (y <= 12 || (Math.abs(x + 0.5 - C - s) >= 6.5 && y <= 24)),\n };\n case 'odango':\n return {\n back: none,\n front: (x, y) =>\n bangs(12, 1, 18)(x, y) ||\n ellipse(C + s - 8, 3.5, 3.3, 3)(x, y) ||\n ellipse(C + s + 8, 3.5, 3.3, 3)(x, y),\n };\n case 'messy':\n return {\n back: none,\n front: (x, y) =>\n cap(x, Math.max(y, 4)) &&\n y >= [2, 0, 3, 1, 2][(x + 50 - s) % 5]! &&\n bangs(11, 2, 17)(x, Math.max(y, 4)),\n };\n case 'wavy':\n return {\n back: (x, y) =>\n longBack(30)(x, y) ||\n (y >= 16 && y <= 30 && Math.abs(x + 0.5 - C - b) <= 12.4 + Math.sin(y * 0.9) * 0.9),\n front: bangs(12, 2, 25),\n };\n case 'braids':\n return {\n back: none,\n front: (x, y) =>\n bangs(13, 1, 20)(x, y) ||\n [C + s - 9.5, C + s + 9.5].some(\n (bx) =>\n y >= 20 && y <= 30 && Math.abs(x + 0.5 - bx) <= 1.6 - ((y + 1) % 3 === 0 ? 0.6 : 0),\n ),\n ties: [\n [C + s - 10, 30],\n [C + s + 9, 30],\n ],\n };\n case 'wolf':\n return {\n back: (x, y) => longBack(24, 11.8)(x, y) && (y < 20 || (x + y) % 3 !== 0),\n front: (x, y) =>\n cap(x, Math.max(y, 5)) &&\n y >= [1, 2, 0, 2][(x + 40 - s) % 4]! &&\n bangs(12, 2, 21)(x, Math.max(y, 5)),\n };\n case 'ahoge':\n return {\n back: longBack(23),\n front: (x, y) =>\n bangs(13, 1, 22)(x, y) ||\n [\n [0, 0],\n [1, 0],\n [1, 1],\n [2, 1],\n [2, 2],\n [1, 2],\n ].some(([ax, ay]) => x === Math.round(C + s) + ax! && y === ay! + 1),\n };\n }\n}\n\nfunction detailedHair(\n recipe: Recipe,\n s: number,\n b: number,\n): { back: Mask; front: Mask; ties?: Point[]; bands?: boolean } {\n const of = (style: Recipe['hair'] | undefined) =>\n hair({ ...recipe, hair: style ?? 'none' }, s, b);\n const bangs = of(recipe.bangs);\n const side = of(recipe.sideHair);\n const back = of(recipe.backHair);\n const length = (recipe.hairLength ?? 0) * 2;\n const lengthen =\n (mask: Mask): Mask =>\n (x, y) =>\n mask(x, y > 18 ? Math.round(y - length) : y);\n return {\n front: (x, y) =>\n y <= 7\n ? bangs.front(x, y) || back.front(x, y)\n : Math.abs(x + 0.5 - C - s) < 7\n ? bangs.front(x, y)\n : lengthen(side.front)(x, y),\n back: length === 0 ? back.back : lengthen(back.back),\n ...(back.ties ? { ties: back.ties } : {}),\n ...(back.bands ? { bands: back.bands } : {}),\n };\n}\n\nfunction outfit(recipe: Recipe, g: Grid, s: number): void {\n const shirt = recipe.shirtColor;\n const skin = recipe.skinColor;\n const dark = shade(shirt, 0.75);\n const light = mix(shirt, WHITE, 0.8);\n const half = (y: number) => 6.5 + (y - 24) * 1.15;\n const torso: Mask = (x, y) => y >= 24 && Math.abs(x + 0.5 - C - s * 0.5) <= half(y);\n const dx = (x: number) => x + 0.5 - C - s * 0.5;\n paint(g, (x, y) => y >= 22 && y <= 25 && Math.abs(dx(x)) <= 2.5, shade(skin, 0.85));\n paint(g, torso, shirt);\n const v =\n (depth: number, w: number): Mask =>\n (x, y) =>\n y >= 24 && y <= 24 + depth && Math.abs(dx(x)) <= w - (y - 24) * (w / (depth + 1));\n switch (recipe.outfit) {\n case 'tee':\n paint(g, v(1, 2.5), shade(skin, 0.85));\n break;\n case 'shirttie':\n paint(g, v(3, 4), light);\n paint(g, (x, y) => y >= 24 && Math.abs(dx(x)) <= 0.5 && y <= 28, '#d22a5a');\n break;\n case 'hoodie':\n paint(g, (x, y) => torso(x, y) && y === 24 && Math.abs(dx(x)) >= 3, dark);\n paint(\n g,\n (x, y) =>\n y >= 25 && y <= 27 && (Math.abs(dx(x) + 1.5) <= 0.5 || Math.abs(dx(x) - 1.5) <= 0.5),\n WHITE,\n );\n break;\n case 'turtleneck':\n paint(g, (x, y) => y >= 22 && y <= 25 && Math.abs(dx(x)) <= 3, shade(shirt, 0.88));\n break;\n case 'sailor':\n paint(g, (x, y) => torso(x, y) && y <= 26 && Math.abs(dx(x)) >= 2, '#2f3a5a');\n paint(g, (x, y) => torso(x, y) && y === 26 && Math.abs(dx(x)) >= 3, WHITE);\n sprite(g, ['R.R', '.R.'], Math.round(C + s * 0.5) - 2, 26, { R: '#e2565f' });\n break;\n case 'blazer':\n paint(g, v(4, 4), light);\n paint(\n g,\n (x, y) => torso(x, y) && y >= 24 && Math.abs(Math.abs(dx(x)) - (4 - (y - 24) * 0.8)) <= 0.5,\n dark,\n );\n sprite(g, ['G'], Math.round(C + s * 0.5), 28, { G: GOLD });\n break;\n case 'overalls':\n paint(g, torso, light);\n paint(g, (x, y) => torso(x, y) && (y >= 27 || Math.abs(Math.abs(dx(x)) - 4) <= 0.6), shirt);\n sprite(g, ['G....G'], Math.round(C + s * 0.5) - 3, 27, { G: GOLD });\n break;\n case 'dress':\n paint(g, (x, y) => torso(x, y) && y <= 25 && Math.abs(dx(x)) <= 4.5, WHITE);\n paint(\n g,\n (x, y) => torso(x, y) && y === 25 && Math.abs(dx(x)) <= 4.5 && x % 2 === 0,\n shade(WHITE, 0.86),\n );\n sprite(g, ['RR.RR', '.RRR.', 'R...R'], Math.round(C + s * 0.5) - 2, 25, { R: '#e5566a' });\n paint(g, (x, y) => torso(x, y) && y === 29, mix(shirt, WHITE, 0.5));\n break;\n case 'kimono':\n paint(\n g,\n (x, y) => torso(x, y) && y <= 28 && Math.abs(Math.abs(dx(x)) - (y - 23.5)) <= 0.6,\n WHITE,\n );\n paint(g, (x, y) => torso(x, y) && y >= 28, '#e2565f');\n paint(g, (x, y) => torso(x, y) && y === 28 && x % 3 === 0, GOLD);\n paint(\n g,\n (x, y) => torso(x, y) && y <= 27 && (x * 3 + y * 2) % 7 === 0,\n mix(shirt, WHITE, 0.45),\n );\n break;\n case 'cardigan':\n paint(g, v(5, 3.5), light);\n paint(g, (x, y) => torso(x, y) && Math.abs(Math.abs(dx(x)) - 2) <= 0.5 && y >= 25, dark);\n sprite(g, ['W', '.', 'W', '.', 'W'], Math.round(C + s * 0.5) - 3, 25, { W: WHITE });\n paint(g, (x, y) => torso(x, y) && y === 29, dark);\n break;\n case 'maid':\n paint(g, (x, y) => torso(x, y), '#2f2a3a');\n paint(g, (x, y) => torso(x, y) && y >= 25 && Math.abs(dx(x)) <= 4 - (y - 25) * 0.2, WHITE);\n paint(g, (x, y) => y === 24 && Math.abs(dx(x)) <= 4.5, WHITE);\n sprite(g, ['RR.RR', '.RRR.'], Math.round(C + s * 0.5) - 2, 24, { R: shirt });\n break;\n case 'jacket':\n paint(g, v(6, 4.5), WHITE);\n paint(\n g,\n (x, y) => torso(x, y) && Math.abs(Math.abs(dx(x)) - (4.5 - (y - 24) * 0.6)) <= 0.6,\n dark,\n );\n paint(g, (x, y) => torso(x, y) && y >= 27 && Math.abs(dx(x)) <= 0.5, '#9aa3ad');\n paint(\n g,\n (x, y) => torso(x, y) && y === 28 && Math.abs(dx(x)) >= half(y) - 2.5,\n mix(shirt, WHITE, 0.6),\n );\n break;\n }\n const neck = shade(skin, 0.85);\n for (let y = 24; y < N; y++)\n for (let x = 0; x < N; x++) {\n const cell = g[y]![x];\n if (!cell || cell === neck || !torso(x, y)) continue;\n const d = dx(x);\n const edge = half(y) - Math.abs(d);\n if (y === 24 && Math.abs(d) <= 4.5) g[y]![x] = shade(cell, 0.78);\n else if (y >= 26 && edge >= 1.6 && edge < 2.6) g[y]![x] = shade(cell, 0.82);\n else if (d > 0 && edge < 1.6) g[y]![x] = shade(cell, 0.84);\n else if (d < 0 && edge < 1.6 && y <= 26) g[y]![x] = mix(cell, WHITE, 0.28);\n else if (d < -2 && y <= 25) g[y]![x] = mix(cell, WHITE, 0.14);\n }\n}\n\nfunction accessory(recipe: Recipe, g: Grid, s: number, face: Mask): void {\n const shirt = recipe.shirtColor;\n const cap = ellipse(C + s, 14, 11.6, 11.2);\n switch (recipe.accessory) {\n case 'none':\n return;\n case 'beanie':\n paint(g, (x, y) => cap(x, y) && y <= 8, shirt);\n paint(g, (x, y) => cap(x, y) && (y === 8 || y === 9), shade(shirt, 0.78));\n paint(g, ellipse(C + s, 1.6, 2.2, 1.8), WHITE);\n return;\n case 'cap':\n paint(g, (x, y) => cap(x, y) && y <= 8, shirt);\n paint(\n g,\n (x, y) => y === 9 && x + 0.5 >= C + s - 10 && x + 0.5 <= C + s + 13,\n shade(shirt, 0.72),\n );\n return;\n case 'headphones': {\n const band = (x: number, y: number) =>\n ellipse(C + s, 14, 12, 11.6)(x, y) && !ellipse(C + s, 14, 10.8, 10.4)(x, y) && y <= 13;\n paint(g, band, '#5d5b66');\n paint(\n g,\n (x, y) =>\n y >= 12 &&\n y <= 19 &&\n (Math.abs(x + 0.5 - (C + s - 11)) <= 1.6 || Math.abs(x + 0.5 - (C + s + 11)) <= 1.6),\n '#e25d6a',\n );\n return;\n }\n case 'flower':\n sprite(g, ['.P.P.', 'PPYPP', '.PPP.'], Math.round(C + s) + 6, 3, { P: '#f59fba', Y: GOLD });\n return;\n case 'bow':\n sprite(g, ['RR.RR', 'RRrRR', 'RR.RR'], Math.round(C + s) + 6, 3, {\n R: '#e5566a',\n r: '#b83a50',\n });\n return;\n case 'earring': {\n const xs = [...Array(N).keys()].filter((x) => face(x, 19));\n if (xs.length) {\n sprite(g, ['G', 'G'], xs[0]! - 1, 20, { G: GOLD });\n sprite(g, ['G', 'G'], xs.at(-1)! + 1, 20, { G: GOLD });\n }\n return;\n }\n case 'crown':\n sprite(g, ['G.G.G.G', 'GGGGGGG', 'GrGbGrG'], Math.round(C + s) - 3, 0, {\n G: GOLD,\n r: '#e5566a',\n b: '#5a9be0',\n });\n return;\n case 'halo':\n paint(\n g,\n (x, y) => ellipse(C + s, 1.6, 6.5, 1.8)(x, y) && !ellipse(C + s, 1.6, 4.4, 0.8)(x, y),\n GOLD,\n );\n return;\n case 'catears': {\n const ear = ['X...', 'XX..', 'XPX.', 'XXXX'];\n sprite(g, ear, Math.round(C + s) - 9, 2, { X: recipe.hairColor, P: '#f4a3b5' });\n sprite(g, ear, Math.round(C + s) + 5, 2, { X: recipe.hairColor, P: '#f4a3b5' }, true);\n return;\n }\n case 'hairclip':\n sprite(g, ['CC.CC', '.CCC.'], Math.round(C + s) + 3, 9, { C: '#e5566a' });\n return;\n case 'horns': {\n const horn = ['.H', 'HH', 'Hh'];\n sprite(g, horn, Math.round(C + s) - 8, 1, { H: '#5b3a6e', h: '#7d5694' });\n sprite(g, horn, Math.round(C + s) + 6, 1, { H: '#5b3a6e', h: '#7d5694' }, true);\n return;\n }\n case 'beret':\n paint(g, (x, y) => ellipse(C + s + 1.5, 4.6, 10.5, 3.6)(x, y), shirt);\n paint(g, (x, y) => ellipse(C + s + 1.5, 4.6, 10.5, 3.6)(x, y) && y >= 6, shade(shirt, 0.78));\n paint(\n g,\n (x, y) => ellipse(C + s + 1.5, 4.6, 10.5, 3.6)(x, y) && y <= 2 && x + 0.5 < C + s,\n mix(shirt, WHITE, 0.3),\n );\n sprite(g, ['S'], Math.round(C + s) + 1, 0, { S: shade(shirt, 0.6) });\n return;\n case 'ribbon':\n sprite(g, ['RRR.RRR', 'RrRRRrR', 'RRR.RRR', '.R...R.'], Math.round(C + s) - 3, 0, {\n R: '#e5566a',\n r: '#f49aa8',\n });\n return;\n case 'headband':\n paint(\n g,\n (x, y) =>\n ellipse(C + s, 14, 11.2, 10.8)(x, y) && !ellipse(C + s, 14.2, 10.2, 9.8)(x, y) && y <= 8,\n shirt,\n );\n paint(\n g,\n (x, y) =>\n ellipse(C + s, 14, 11.2, 10.8)(x, y) && !ellipse(C + s, 14.2, 10.2, 9.8)(x, y) && y <= 5,\n mix(shirt, WHITE, 0.35),\n );\n return;\n case 'bunnyears': {\n const ear = ['WW', 'WP', 'WP', 'WP', 'WW'];\n sprite(g, ear, Math.round(C + s) - 6, 0, { W: '#f4f1ec', P: '#f4a3b5' });\n sprite(g, ear, Math.round(C + s) + 4, 0, { W: '#f4f1ec', P: '#f4a3b5' }, true);\n return;\n }\n case 'horseears': {\n const ear = ['.X.', 'XPX', 'XPX', 'XXX'];\n sprite(g, ear, Math.round(C + s) - 9, 1, { X: shade(recipe.hairColor, 0.9), P: '#f4a3b5' });\n sprite(g, ear, Math.round(C + s) + 6, 1, { X: shade(recipe.hairColor, 0.9), P: '#f4a3b5' });\n sprite(g, ['BB', 'BB'], Math.round(C + s) + 3, 7, { B: '#5a9be0' });\n return;\n }\n case 'flowercrown':\n for (const [fx, color] of [\n [-8, '#f59fba'],\n [-4, GOLD],\n [0, '#f4f1ec'],\n [4, '#f59fba'],\n [8, GOLD],\n ] as const)\n sprite(\n g,\n ['.F.', 'FCF', '.F.'],\n Math.round(C + s) + fx - 1,\n 4 + Math.round(Math.abs(fx) / 4),\n {\n F: color,\n C: color === GOLD ? '#e2565f' : GOLD,\n },\n );\n paint(\n g,\n (x, y) =>\n y === 6 + Math.round(Math.abs(x + 0.5 - C - s) / 4) &&\n Math.abs(x + 0.5 - C - s) <= 9 &&\n x % 2 === 1,\n '#5aa36b',\n );\n return;\n case 'witch':\n paint(g, (x, y) => y >= 6 && y <= 7 && Math.abs(x + 0.5 - C - s) <= 13, '#3a2f52');\n paint(\n g,\n (x, y) => y <= 6 && Math.abs(x + 0.5 - C - s - (6 - y) * 0.5) <= 1 + y * 0.9,\n '#4b3d6b',\n );\n paint(g, (x, y) => y === 5 && Math.abs(x + 0.5 - C - s - 0.5) <= 5.2, '#efb93f');\n return;\n case 'pins':\n sprite(g, ['Y.Y', '.Y.', 'Y.Y', '...', 'B.B', '.B.', 'B.B'], Math.round(C + s) + 6, 7, {\n Y: GOLD,\n B: '#5a9be0',\n });\n return;\n }\n}\n\nexport function pixelTileColor(hair: string): string {\n const [r, g, b] = channels(hair).map((v) => v / 255) as [number, number, number];\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const lightness = (max + min) / 2;\n const chroma = max - min;\n const saturation = chroma === 0 ? 0 : chroma / (1 - Math.abs(2 * lightness - 1));\n if (saturation < 0.18 || lightness > 0.86 || lightness < 0.16) return '#ece8e1';\n const hue =\n max === r\n ? ((g - b) / chroma + 6) % 6\n : max === g\n ? (b - r) / chroma + 2\n : (r - g) / chroma + 4;\n const s = Math.min(0.55, Math.max(0.35, saturation * 0.6));\n const l = 0.88;\n const f = (n: number) => {\n const k = (n + hue * 2) % 12;\n return l - s * Math.min(l, 1 - l) * Math.max(-1, Math.min(k - 3, 9 - k, 1));\n };\n return hex([f(0), f(8), f(4)].map((v) => v * 255));\n}\n\nexport function pixelFigure(\n recipe: Recipe,\n yawDeg: number,\n): { tile: string; body: string; head: string; cells: PixelCell[] } {\n const yaw = (yawDeg * Math.PI) / 180;\n const sinY = Math.sin(yaw);\n const s = Math.round(sinY * 3);\n const fs = Math.round(sinY * 10);\n const b = -Math.round(sinY * 3.5);\n const turned = Math.abs(sinY) >= 0.3;\n const d = Math.sign(sinY);\n const skin = recipe.skinColor;\n const hairColor = recipe.hairColor;\n const front = FACE[recipe.head](s * 0.5);\n const face: Mask = turned\n ? (x, y) => {\n const dx = x + 0.5 - C;\n const tuck = y >= 17 && d * dx > 4 ? Math.min(2, (y - 16) * 0.35) : 0;\n return front(x - Math.round(d * (1 + Math.max(0, y - 20) * 0.4) - d * tuck), y);\n }\n : front;\n const masks = recipe.bangs === undefined ? hair(recipe, s, b) : detailedHair(recipe, s, b);\n\n const body = blank();\n outfit(recipe, body, s);\n\n const back = blank();\n paint(back, masks.back, shade(hairColor, 0.82));\n if (masks.bands)\n paint(\n back,\n (x, y) => masks.back(x, y) && (y + Math.floor(x / 2)) % 4 === 0,\n shade(hairColor, 0.68),\n );\n\n const head = blank();\n paint(head, face, skin);\n const earY = 15;\n const edge = (side: number) => {\n const xs = [...Array(N).keys()].filter((x) => face(x, earY));\n return side < 0 ? xs[0]! - 1 : xs.at(-1)! + 1;\n };\n if (!turned)\n for (const ex of [-1, 1])\n sprite(head, ['E', 'E', 'e'], edge(ex), earY, { E: skin, e: shade(skin, 0.86) });\n else\n sprite(head, ['EE', 'Ee', 'Ee', 'E.'], d > 0 ? edge(-d) - 1 : edge(-d), earY, {\n E: skin,\n e: shade(skin, 0.8),\n });\n paint(head, masks.front, hairColor);\n for (const [x, y] of masks.ties ?? [])\n sprite(back, ['T'], Math.round(x), y, { T: shade(recipe.shirtColor, 0.8) });\n accessory(recipe, head, s, face);\n\n const shadeHair = (g: Grid) => {\n const out = g.map((r) => [...r]);\n const cells = g.flatMap((row, y) => row.flatMap((c, x) => (c === hairColor ? [[x, y]] : [])));\n const xs = cells.map(([x]) => x!);\n const ys = cells.map(([, y]) => y!);\n const left = Math.min(...xs);\n const right = Math.max(...xs);\n const top = Math.min(...ys);\n const mid = (left + right) / 2;\n const span = Math.max(1, (right - left) / 2);\n const light = mix(hairColor, WHITE, 0.2);\n const dark = shade(hairColor, 0.8);\n const middle = shade(hairColor, 0.9);\n for (const [x, y] of cells) {\n const side = (x! + 0.5 - mid) / span + (y! - top) * 0.025;\n if (side > 0.72) out[y!]![x!] = dark;\n else if (side > 0.42) out[y!]![x!] = middle;\n else if (side < -0.2 && y! <= top + 4) out[y!]![x!] = light;\n }\n for (const [x, y] of cells) {\n const nearFace = g[y!]![x! - 1] === skin || g[y!]![x! + 1] === skin;\n if (nearFace && y! >= 14) out[y!]![x!] = shade(hairColor, 0.74);\n else if (Math.abs(x! + 0.5 - C - s) >= 7.5 && y! >= 14 && (x! + 40 - s) % 3 === 0)\n out[y!]![x!] = shade(out[y!]![x!]!, 0.86);\n }\n for (let y = 1; y < N; y++)\n for (let x = 0; x < N; x++) {\n if (g[y]![x] !== skin) continue;\n if (g[y - 1]![x] === hairColor) out[y]![x] = mix(shade(skin, 0.84), BLUSH, 0.12);\n else if (x + 1 < N && g[y]![x + 1] !== skin && g[y]![x + 1] !== undefined && x > C + s)\n out[y]![x] = shade(skin, 0.9);\n else if (x + 1 < N && g[y]![x + 1] === undefined && x > C + s)\n out[y]![x] = shade(skin, 0.9);\n }\n for (let y = 0; y < N - 1; y++)\n for (let x = 0; x < N; x++)\n if (g[y]![x] === hairColor && g[y + 1]![x] === skin) out[y]![x] = shade(hairColor, 0.62);\n for (let x = 0; x < N; x++)\n for (let y = 3; y < N; y++)\n if (g[y]![x] === hairColor && g[y + 1]?.[x] === skin && (x + 40 - s) % 4 === 0)\n for (let k = 1; k <= 3; k++)\n if (g[y - k]?.[x] === hairColor) out[y - k]![x] = shade(hairColor, 0.72);\n const ring = mix(hairColor, WHITE, 0.45);\n for (let x = Math.round(C + s) - 7; x <= Math.round(C + s) + 3; x++) {\n const first = g.findIndex((row) => row[x] === hairColor);\n if (first < 0) continue;\n const y = first + 2 + Math.round(Math.abs(x + 0.5 - (C + s - 2)) / 4);\n if (g[y]?.[x] === hairColor && x % 3 !== 0) out[y]![x] = ring;\n }\n return out;\n };\n\n const figure = blank();\n for (const layer of [back, body, shadeHair(head)])\n for (let y = 0; y < N; y++)\n for (let x = 0; x < N; x++) if (layer[y]![x]) figure[y]![x] = layer[y]![x];\n\n const features = blank();\n const eyes = blank();\n const closed = blank();\n const glasses = blank();\n const sp = recipe.spacing ?? 0;\n const h = recipe.height ?? 0;\n const eyeTop = 15 + h;\n const eyeW = (side: -1 | 1) => (turned && Math.sign(fs) === side ? 3 : 4);\n const eyeX = (side: -1 | 1) => {\n const w = eyeW(side);\n return side < 0\n ? Math.round(C + fs * 0.6) - 6 - sp - (w === 3 ? -1 : 0)\n : Math.round(C + fs * 0.6) + 2 + sp;\n };\n const left = { x: eyeX(-1), w: eyeW(-1) };\n const right = { x: eyeX(1), w: eyeW(1) };\n const fit = (rows: readonly string[], w: number) =>\n rows.map((r) => r.slice(Math.max(0, r.length - w)));\n const pal = {\n K: INK,\n W: WHITE,\n D: shade(recipe.eyeColor, 0.55),\n I: recipe.eyeColor,\n L: mix(recipe.eyeColor, WHITE, 0.45),\n };\n const style = EYES[recipe.eyes];\n const extra = style[0]!.length - 4;\n sprite(eyes, fit(style, left.w + extra), left.x - extra, eyeTop, pal);\n sprite(\n eyes,\n recipe.eyes === 'wink' ? fit(CLOSED, right.w) : fit(style, right.w + extra),\n right.x,\n eyeTop,\n pal,\n true,\n );\n sprite(closed, fit(CLOSED, left.w), left.x, eyeTop, pal);\n sprite(closed, fit(CLOSED, right.w), right.x, eyeTop, pal, true);\n const browRows = BROWS[recipe.brows];\n if (browRows.length) {\n sprite(features, fit(browRows, left.w), left.x, eyeTop - 2, { B: shade(hairColor, 0.55) });\n sprite(\n features,\n fit(browRows, right.w),\n right.x,\n eyeTop - 2,\n { B: shade(hairColor, 0.55) },\n true,\n );\n }\n const cx = Math.round(C + fs * (turned ? 0.85 : 0.6));\n if (recipe.nose === 'dot') sprite(features, ['N'], cx, 18 + h, { N: shade(skin, 0.78) });\n if (recipe.nose === 'button') sprite(features, ['N'], cx, 18 + h, { N: shade(skin, 0.88) });\n if (recipe.nose === 'line') sprite(features, ['N', 'N'], cx, 17 + h, { N: shade(skin, 0.82) });\n const mouth = MOUTHS[recipe.mouth];\n const mx = C - 0.5 + fs * 0.6;\n sprite(features, mouth, Math.round(mx - (mouth[0]!.length - 1) / 2), 20 + h, {\n K: MOUTH,\n M: MOUTH_INSIDE,\n T: TONGUE,\n W: WHITE,\n });\n if (recipe.cheeks === 'blush') {\n sprite(features, ['PP'], left.x - 1, 19 + h, { P: mix(BLUSH, skin, 0.25) });\n sprite(features, ['PP'], right.x + right.w - 1, 19 + h, { P: mix(BLUSH, skin, 0.25) });\n }\n if (recipe.cheeks === 'freckles') {\n sprite(features, ['F.F'], left.x, 19 + h, { F: shade(skin, 0.7) });\n sprite(features, ['F.F'], right.x + 1, 19 + h, { F: shade(skin, 0.7) });\n }\n const frame = (fx: number, w: number, round: boolean) =>\n paint(\n glasses,\n (x, y) => {\n const inside = x >= fx && x < fx + w && y >= eyeTop && y <= eyeTop + 3;\n const box = x >= fx - 1 && x <= fx + w && y >= eyeTop - 1 && y <= eyeTop + 4;\n const corner = (x === fx - 1 || x === fx + w) && (y === eyeTop - 1 || y === eyeTop + 4);\n return box && !inside && !(round && corner);\n },\n INK,\n );\n if (recipe.glasses === 'round' || recipe.glasses === 'square') {\n frame(left.x, left.w, recipe.glasses === 'round');\n frame(right.x, right.w, recipe.glasses === 'round');\n paint(glasses, (x, y) => y === eyeTop + 1 && x > left.x + left.w && x < right.x - 1, INK);\n }\n if (recipe.glasses === 'shades') {\n for (const e of [left, right])\n paint(\n glasses,\n (x, y) => x >= e.x - 1 && x <= e.x + e.w && y >= eyeTop && y <= eyeTop + 2,\n INK,\n );\n paint(glasses, (x, y) => y === eyeTop && x > left.x + left.w && x < right.x - 1, INK);\n for (const e of [left, right]) sprite(glasses, ['W'], e.x, eyeTop, { W: '#7d7b88' });\n }\n if (recipe.glasses === 'monocle') {\n frame(right.x, right.w, true);\n sprite(glasses, ['G', 'G', 'G'], right.x + right.w, eyeTop + 5, { G: GOLD });\n }\n\n const full = clip(outline(figure));\n const bodyCells = blank();\n const headCells = blank();\n for (let y = 0; y < N; y++)\n for (let x = 0; x < N; x++) {\n const c = full[y]![x];\n if (!c) continue;\n if (y >= 22 && !head[y]![x] && !back[y]![x]) bodyCells[y]![x] = c;\n else headCells[y]![x] = c;\n }\n const cells: PixelCell[] = [];\n for (let y = 0; y < N; y++)\n for (let x = 0; x < N; x++) {\n const c = glasses[y]![x] ?? eyes[y]![x] ?? features[y]![x] ?? full[y]![x];\n if (c) cells.push({ x, y, c });\n }\n return {\n cells,\n tile: `<rect width=\"32\" height=\"32\" rx=\"6\" fill=\"${pixelTileColor(recipe.hairColor)}\"/>`,\n body: `<g class=\"bh-illustrated-body\">${rects(bodyCells)}</g>`,\n head: [\n `<g class=\"bh-illustrated-head\">${rects(headCells)}`,\n `<g class=\"bh-illustrated-face\">${rects(features)}`,\n `<g class=\"bh-illustrated-gaze\">${rects(eyes)}</g>`,\n `<g class=\"bh-illustrated-blink\" opacity=\"0\">${rects(closed)}</g>`,\n `${rects(glasses)}</g></g>`,\n ].join(''),\n };\n}\n","export function seededRandom(seed: string): () => number {\n let h = 2166136261;\n for (const char of seed) {\n h ^= char.codePointAt(0)!;\n h = Math.imul(h, 16777619);\n }\n return () => {\n h = Math.imul(h ^ (h >>> 15), 2246822507);\n h = Math.imul(h ^ (h >>> 13), 3266489909);\n h ^= h >>> 16;\n return (h >>> 0) / 4294967296;\n };\n}\n","import { seededRandom } from './random.js';\n\nexport const AVATAR_PARTS = {\n head: ['round', 'oval', 'square', 'long', 'heart', 'vchin', 'chubby', 'diamond'],\n pose: ['front', 'left', 'right'],\n hair: [\n 'crop',\n 'sweep',\n 'spiky',\n 'buzz',\n 'curly',\n 'mohawk',\n 'bob',\n 'long',\n 'bun',\n 'pigtails',\n 'afro',\n 'twintails',\n 'drills',\n 'ponytail',\n 'sidetail',\n 'hime',\n 'odango',\n 'messy',\n 'wavy',\n 'braids',\n 'wolf',\n 'ahoge',\n 'none',\n ],\n eyes: ['round', 'dot', 'sparkle', 'lashes', 'sleepy', 'happy', 'wink', 'sharp'],\n brows: ['soft', 'thick', 'raised', 'angry', 'worried', 'none'],\n nose: ['button', 'dot', 'line', 'none'],\n mouth: ['smile', 'grin', 'open', 'flat', 'smirk', 'cat', 'tongue', 'o'],\n cheeks: ['blush', 'freckles', 'none'],\n glasses: ['none', 'round', 'square', 'shades', 'monocle'],\n outfit: [\n 'tee',\n 'shirttie',\n 'hoodie',\n 'turtleneck',\n 'sailor',\n 'blazer',\n 'overalls',\n 'dress',\n 'kimono',\n 'cardigan',\n 'maid',\n 'jacket',\n ],\n backdrop: ['sparkles', 'hearts', 'stars', 'dots', 'none'],\n accessory: [\n 'none',\n 'beanie',\n 'cap',\n 'headphones',\n 'flower',\n 'bow',\n 'earring',\n 'crown',\n 'halo',\n 'catears',\n 'hairclip',\n 'horns',\n 'beret',\n 'ribbon',\n 'headband',\n 'bunnyears',\n 'horseears',\n 'flowercrown',\n 'witch',\n 'pins',\n ],\n} as const;\n\nexport const AVATAR_HAIR_PARTS = {\n bangs: [\n 'crop',\n 'bob',\n 'sweep',\n 'spiky',\n 'curly',\n 'messy',\n 'wolf',\n 'wavy',\n 'ahoge',\n 'hime',\n 'buzz',\n 'mohawk',\n 'none',\n ],\n sideHair: ['crop', 'bun', 'bob', 'long', 'hime', 'curly', 'braids', 'none'],\n backHair: [\n 'none',\n 'bob',\n 'long',\n 'wavy',\n 'wolf',\n 'bun',\n 'odango',\n 'pigtails',\n 'twintails',\n 'drills',\n 'ponytail',\n 'sidetail',\n 'afro',\n ],\n} as const satisfies Record<string, readonly (typeof AVATAR_PARTS)['hair'][number][]>;\nconst HAIR_SPLIT: Record<\n (typeof AVATAR_PARTS)['hair'][number],\n { [P in AvatarHairPart]: (typeof AVATAR_HAIR_PARTS)[P][number] }\n> = {\n crop: { bangs: 'crop', sideHair: 'crop', backHair: 'none' },\n sweep: { bangs: 'sweep', sideHair: 'crop', backHair: 'none' },\n spiky: { bangs: 'spiky', sideHair: 'crop', backHair: 'none' },\n buzz: { bangs: 'buzz', sideHair: 'none', backHair: 'none' },\n curly: { bangs: 'curly', sideHair: 'curly', backHair: 'none' },\n mohawk: { bangs: 'mohawk', sideHair: 'none', backHair: 'none' },\n bob: { bangs: 'bob', sideHair: 'bob', backHair: 'bob' },\n long: { bangs: 'bob', sideHair: 'long', backHair: 'long' },\n bun: { bangs: 'bob', sideHair: 'bun', backHair: 'bun' },\n pigtails: { bangs: 'bob', sideHair: 'bun', backHair: 'pigtails' },\n afro: { bangs: 'buzz', sideHair: 'none', backHair: 'afro' },\n twintails: { bangs: 'bob', sideHair: 'bob', backHair: 'twintails' },\n drills: { bangs: 'bob', sideHair: 'bob', backHair: 'drills' },\n ponytail: { bangs: 'bob', sideHair: 'bun', backHair: 'ponytail' },\n sidetail: { bangs: 'sweep', sideHair: 'bun', backHair: 'sidetail' },\n hime: { bangs: 'hime', sideHair: 'hime', backHair: 'long' },\n odango: { bangs: 'bob', sideHair: 'bun', backHair: 'odango' },\n messy: { bangs: 'messy', sideHair: 'bun', backHair: 'none' },\n wavy: { bangs: 'wavy', sideHair: 'long', backHair: 'wavy' },\n braids: { bangs: 'bob', sideHair: 'braids', backHair: 'none' },\n wolf: { bangs: 'wolf', sideHair: 'bun', backHair: 'wolf' },\n ahoge: { bangs: 'ahoge', sideHair: 'bob', backHair: 'bob' },\n none: { bangs: 'none', sideHair: 'none', backHair: 'none' },\n};\nexport const AVATAR_RANGES = {\n spacing: [-1, 1],\n height: [-1, 1],\n hairLength: [-2, 2],\n} as const;\nexport type AvatarHairPart = keyof typeof AVATAR_HAIR_PARTS;\nexport type AvatarRange = keyof typeof AVATAR_RANGES;\nconst DETAIL_KEYS = [\n ...(Object.keys(AVATAR_HAIR_PARTS) as AvatarHairPart[]),\n ...(Object.keys(AVATAR_RANGES) as AvatarRange[]),\n] as const;\n\nexport type AvatarPart = keyof typeof AVATAR_PARTS;\nexport const AVATAR_COLORS = ['skinColor', 'hairColor', 'eyeColor', 'shirtColor'] as const;\nexport type AvatarColor = (typeof AVATAR_COLORS)[number];\n\nexport type PixelAvatarRecipe = {\n schemaVersion: 1;\n family: 'illustrated';\n assetVersion: 1;\n rigVersion: 1;\n} & { [P in AvatarPart]: (typeof AVATAR_PARTS)[P][number] } & Record<AvatarColor, string> & {\n [P in AvatarHairPart]?: (typeof AVATAR_PARTS)['hair'][number];\n } & { [P in AvatarRange]?: number };\n\nexport const DEFAULT_RECIPE: PixelAvatarRecipe = {\n schemaVersion: 1,\n family: 'illustrated',\n assetVersion: 1,\n rigVersion: 1,\n head: 'round',\n pose: 'front',\n hair: 'crop',\n eyes: 'round',\n brows: 'soft',\n nose: 'button',\n mouth: 'smile',\n cheeks: 'blush',\n glasses: 'none',\n outfit: 'tee',\n backdrop: 'sparkles',\n accessory: 'none',\n skinColor: '#f2c9a8',\n hairColor: '#5a3a2a',\n eyeColor: '#3f7fbf',\n shirtColor: '#5b8bd6',\n};\n\nconst PART_KEYS = Object.keys(AVATAR_PARTS) as AvatarPart[];\n\nexport function isPixelAvatarRecipe(value: unknown): value is PixelAvatarRecipe {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const r = value as Record<string, unknown>;\n const detailed = DETAIL_KEYS.filter((key) => Object.hasOwn(r, key)).length;\n if (detailed !== 0 && detailed !== DETAIL_KEYS.length) return false;\n if (Object.keys(r).length !== Object.keys(DEFAULT_RECIPE).length + detailed) return false;\n return (\n (detailed === 0 ||\n ((Object.keys(AVATAR_HAIR_PARTS) as AvatarHairPart[]).every(\n (key) =>\n typeof r[key] === 'string' &&\n (AVATAR_HAIR_PARTS[key] as readonly string[]).includes(r[key]),\n ) &&\n (Object.keys(AVATAR_RANGES) as AvatarRange[]).every((key) => {\n const v = r[key];\n const [min, max] = AVATAR_RANGES[key];\n return typeof v === 'number' && Number.isInteger(v) && v >= min && v <= max;\n }))) &&\n r['schemaVersion'] === 1 &&\n r['family'] === 'illustrated' &&\n r['assetVersion'] === 1 &&\n r['rigVersion'] === 1 &&\n PART_KEYS.every(\n (key) =>\n typeof r[key] === 'string' && (AVATAR_PARTS[key] as readonly string[]).includes(r[key]),\n ) &&\n AVATAR_COLORS.every((key) => typeof r[key] === 'string' && /^#[\\da-f]{6}$/iu.test(r[key]))\n );\n}\n\nexport function canonicalRecipe(recipe: PixelAvatarRecipe): PixelAvatarRecipe {\n const canonical: Record<string, unknown> = {\n schemaVersion: 1,\n family: 'illustrated',\n assetVersion: 1,\n rigVersion: 1,\n };\n for (const key of PART_KEYS) canonical[key] = recipe[key];\n for (const key of AVATAR_COLORS) canonical[key] = recipe[key].toLowerCase();\n if (recipe.bangs !== undefined) for (const key of DETAIL_KEYS) canonical[key] = recipe[key];\n return canonical as PixelAvatarRecipe;\n}\n\nexport function detailedRecipe(recipe: PixelAvatarRecipe): PixelAvatarRecipe {\n if (recipe.bangs !== undefined) return recipe;\n const pick = <P extends AvatarHairPart>(part: P) =>\n (AVATAR_HAIR_PARTS[part] as readonly string[]).includes(recipe.hair)\n ? (recipe.hair as (typeof AVATAR_HAIR_PARTS)[P][number])\n : HAIR_SPLIT[recipe.hair][part];\n return {\n ...recipe,\n bangs: pick('bangs'),\n sideHair: pick('sideHair'),\n backHair: pick('backHair'),\n spacing: 0,\n height: 0,\n hairLength: 0,\n };\n}\n\nexport const AVATAR_SWATCHES: Record<AvatarColor, readonly string[]> = {\n skinColor: [\n '#ffe3cf',\n '#f2c9a8',\n '#e0a87e',\n '#c68863',\n '#9a6142',\n '#6e4129',\n '#4a2c1c',\n '#f4f1ec',\n ],\n hairColor: [\n '#1d1b22',\n '#5a3a2a',\n '#8a5a36',\n '#e2b04a',\n '#c4452f',\n '#d9475a',\n '#f06292',\n '#3fc1b8',\n '#5a7be0',\n '#9aa3ad',\n '#f4f1ec',\n ],\n eyeColor: [\n '#3f7fbf',\n '#5a3a2a',\n '#2f9e8f',\n '#4c8a3c',\n '#8a5ad0',\n '#d0533f',\n '#d9a13a',\n '#2a2230',\n ],\n shirtColor: [\n '#5b8bd6',\n '#e07a5f',\n '#3d9970',\n '#7a5cc7',\n '#f2c14e',\n '#2f3a4a',\n '#e2565f',\n '#9ad0c2',\n ],\n};\n\nconst SEEDED_CHOICES: { [P in AvatarPart]: readonly (typeof AVATAR_PARTS)[P][number][] } = {\n head: ['round', 'oval', 'square', 'long', 'heart', 'vchin', 'chubby', 'diamond'],\n pose: ['front'],\n hair: AVATAR_PARTS.hair.filter((hair) => hair !== 'none'),\n eyes: ['round', 'round', 'sparkle', 'lashes', 'dot', 'happy', 'sharp'],\n brows: ['soft', 'soft', 'thick', 'raised'],\n nose: ['button', 'dot', 'none'],\n mouth: ['smile', 'smile', 'grin', 'open', 'cat'],\n cheeks: ['blush', 'blush', 'freckles', 'none'],\n glasses: ['none', 'none', 'none', 'none', 'round', 'square'],\n accessory: [\n 'none',\n 'none',\n 'none',\n 'flower',\n 'bow',\n 'hairclip',\n 'catears',\n 'headphones',\n 'beanie',\n 'cap',\n ],\n outfit: AVATAR_PARTS.outfit,\n backdrop: ['sparkles', 'hearts', 'stars', 'dots'],\n};\n\n/**\n * Returns a name-seeded recipe factory. Different namespaces give different faces for the same\n * name; the factory takes the name only, so it is safe to pass straight to `Array.map`.\n */\nexport function createSeededRecipe(namespace: string): (seed: string) => PixelAvatarRecipe {\n return (seed) => {\n const random = seededRandom(`${namespace}:${seed.trim().toLowerCase()}`);\n const pick = <T>(values: readonly T[]) => values[Math.floor(random() * values.length)]!;\n const recipe: Record<string, unknown> = {\n schemaVersion: 1,\n family: 'illustrated',\n assetVersion: 1,\n rigVersion: 1,\n };\n for (const part of Object.keys(AVATAR_PARTS) as AvatarPart[])\n recipe[part] = pick(SEEDED_CHOICES[part]);\n for (const color of AVATAR_COLORS) recipe[color] = pick(AVATAR_SWATCHES[color].slice(0, 7));\n return recipe as PixelAvatarRecipe;\n };\n}\n\n/** The same name always gives the same face (BotHarness's namespace). */\nexport const seededRecipe: (seed: string) => PixelAvatarRecipe =\n createSeededRecipe('botharness-avatar');\n\nconst preset = (parts: Partial<PixelAvatarRecipe>): PixelAvatarRecipe => ({\n ...DEFAULT_RECIPE,\n ...parts,\n});\n\nexport const AVATAR_PRESETS: readonly PixelAvatarRecipe[] = [\n preset({\n hair: 'wavy',\n eyes: 'lashes',\n accessory: 'beret',\n outfit: 'dress',\n skinColor: '#ffe3cf',\n hairColor: '#e2b04a',\n eyeColor: '#3f7fbf',\n shirtColor: '#e2565f',\n backdrop: 'stars',\n }),\n preset({\n hair: 'braids',\n accessory: 'flowercrown',\n outfit: 'cardigan',\n skinColor: '#ffe3cf',\n hairColor: '#8a5a36',\n eyeColor: '#4c8a3c',\n shirtColor: '#9ad0c2',\n backdrop: 'hearts',\n }),\n preset({\n hair: 'twintails',\n eyes: 'sparkle',\n accessory: 'ribbon',\n outfit: 'maid',\n skinColor: '#ffe3cf',\n hairColor: '#3fc1b8',\n eyeColor: '#2f9e8f',\n shirtColor: '#e2565f',\n backdrop: 'stars',\n }),\n preset({\n hair: 'long',\n accessory: 'horseears',\n outfit: 'jacket',\n skinColor: '#ffe3cf',\n hairColor: '#8a5a36',\n eyeColor: '#d0533f',\n shirtColor: '#5b8bd6',\n backdrop: 'dots',\n }),\n preset({\n hair: 'hime',\n eyes: 'sleepy',\n accessory: 'pins',\n outfit: 'kimono',\n skinColor: '#f4f1ec',\n hairColor: '#1d1b22',\n eyeColor: '#d0533f',\n shirtColor: '#7a5cc7',\n backdrop: 'none',\n }),\n preset({\n hair: 'ahoge',\n accessory: 'headband',\n outfit: 'sailor',\n skinColor: '#ffe3cf',\n hairColor: '#f06292',\n eyeColor: '#2f9e8f',\n shirtColor: '#f4f1ec',\n backdrop: 'hearts',\n }),\n preset({\n hair: 'wolf',\n eyes: 'sharp',\n outfit: 'jacket',\n skinColor: '#e0a87e',\n hairColor: '#9aa3ad',\n eyeColor: '#5a7be0',\n shirtColor: '#2f3a4a',\n backdrop: 'stars',\n }),\n preset({\n hair: 'wavy',\n eyes: 'sparkle',\n accessory: 'witch',\n outfit: 'dress',\n skinColor: '#ffe3cf',\n hairColor: '#8a5ad0',\n eyeColor: '#d9a13a',\n shirtColor: '#2f3a4a',\n backdrop: 'sparkles',\n }),\n preset({\n hair: 'bob',\n eyes: 'happy',\n accessory: 'bunnyears',\n outfit: 'cardigan',\n skinColor: '#ffe3cf',\n hairColor: '#f4f1ec',\n eyeColor: '#d9475a',\n shirtColor: '#f2c14e',\n backdrop: 'hearts',\n }),\n preset({\n hair: 'spiky',\n glasses: 'round',\n accessory: 'headphones',\n outfit: 'hoodie',\n backdrop: 'dots',\n }),\n preset({\n hair: 'odango',\n eyes: 'lashes',\n accessory: 'bow',\n outfit: 'kimono',\n hairColor: '#e2b04a',\n shirtColor: '#5b8bd6',\n backdrop: 'sparkles',\n }),\n preset({\n hair: 'crop',\n accessory: 'cap',\n outfit: 'shirttie',\n skinColor: '#9a6142',\n hairColor: '#1d1b22',\n shirtColor: '#3d9970',\n backdrop: 'dots',\n }),\n];\n","import type { PixelCell } from '@botharness/pixel-morph';\nimport { pixelFigure } from './figure.js';\nimport { isPixelAvatarRecipe, type PixelAvatarRecipe } from './recipe.js';\n\nconst YAW = { front: 0, left: -25, right: 25 } as const;\n\n/** Head-turn offsets (degrees) the thinking animation cycles through. */\nexport const AVATAR_TURNS = [-14, -7, 7, 14] as const;\n\nexport interface PixelAvatarSvgOptions {\n /** Extra yaw offsets to pre-render as hidden `[data-avatar-turn]` layers. */\n turns?: readonly number[];\n /** Class prefix for the rig layers (`-body`, `-head`, `-face`, `-gaze`, `-blink`). */\n classPrefix?: string;\n}\n\n/** Every visible pixel of the face at its pose, in paint order, for morphing. */\nexport function faceCells(recipe: PixelAvatarRecipe): PixelCell[] {\n return pixelFigure(recipe, YAW[recipe.pose]).cells;\n}\n\n/** A 32×32 SVG of the avatar: tile, body, head rig, optional turn layers and an empty morph layer. */\nexport function pixelAvatarSvg(\n recipe: PixelAvatarRecipe,\n options: PixelAvatarSvgOptions = {},\n): string {\n if (!isPixelAvatarRecipe(recipe)) throw new Error('invalid Avatar recipe');\n const base = pixelFigure(recipe, YAW[recipe.pose]);\n const turns = (options.turns ?? [])\n .map((delta) => {\n const figure = pixelFigure(recipe, YAW[recipe.pose] + delta);\n const layers = `${figure.body}${figure.head}`.replaceAll(\n 'class=\"bh-illustrated-',\n 'data-turn-part=\"',\n );\n return `<g data-avatar-turn=\"${delta}\" opacity=\"0\">${layers}</g>`;\n })\n .join('');\n const svg = [\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\" width=\"512\" height=\"512\" shape-rendering=\"crispEdges\" aria-hidden=\"true\">',\n base.tile,\n base.body,\n base.head,\n turns,\n '<g data-avatar-pixel-morph=\"\"></g>',\n '</svg>',\n ].join('');\n const prefix = options.classPrefix;\n return prefix === undefined || prefix === 'bh-illustrated'\n ? svg\n : svg.replaceAll('class=\"bh-illustrated-', `class=\"${prefix}-`);\n}\n","import type { PixelCell } from '@botharness/pixel-morph';\n\nconst SYMBOLS = {\n thinking: [\n '........................',\n '........................',\n '........................',\n '...........AAAA.........',\n '..........AAAAAA........',\n '.........AAAAAAAA.......',\n '.......AAAAAAAAAAA......',\n '.....AAAAAAAAAAAAA......',\n '....AAAAAAAAAAAAAAAA....',\n '....AAAAAAAAAAAAAAAAA...',\n '...AAAAAAAAAAAAAAAAAAA..',\n '...AAAAHHAAAHHAAAHHAAA..',\n '....AAAHHAAAHHAAAHHAAA..',\n '....AAAAAAAAAAAAAAAAAA..',\n '.....AAAAAAAAAAAAAAAA...',\n '.....AAAAAAAAAAAAAAA....',\n '.......AAAAAAAAAAA......',\n '........................',\n '....AA..................',\n '...AAAA.................',\n '...AAAA.................',\n '..A.AA..................',\n '.AAA....................',\n '..A.....................',\n ],\n ask: [\n '........................',\n '........................',\n '...........AAA..........',\n '........AAAAAAAA........',\n '.......AAAAAAAAAA.......',\n '.......AAAAAAAAAA.......',\n '......AAAAA...AAAA......',\n '......AAAA....AAAA......',\n '......AAA.....AAAA......',\n '......AAA.....AAAA......',\n '..............AAAA......',\n '.............AAAAA......',\n '............AAAAA.......',\n '...........AAAAA........',\n '...........AAA..........',\n '..........AAAA..........',\n '..........AAAA..........',\n '...........AA...........',\n '........................',\n '..........AAAA..........',\n '..........AAAA..........',\n '..........AAAA..........',\n '...........AA...........',\n '........................',\n ],\n read: [\n '........................',\n '........................',\n '........................',\n '........................',\n '..AAAAAAA......AAAAAAA..',\n '.AAAAAAAAAA..AAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAHHHHHAAAAAAHHHHHAAA.',\n '.AAAHHHHHAAAAAAHHHHHAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAHHHHHAAAAAAHHHHHAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '...........AA...........',\n '........................',\n '........................',\n '........................',\n '........................',\n '........................',\n ],\n write: [\n '........................',\n '.....AAAAAAAAAA.........',\n '....AAAAAAAAAAAA........',\n '....AAAAAAAAAAAAA.......',\n '....AAAAAAAAAAAAAA......',\n '....AAAAAAAAAAAAAAA.....',\n '....AAAAAAAAAAAAAAAA....',\n '....AAAAAAAAAAAAAAAA....',\n '....AAAAAAAAAAAAAAAA....',\n '....AAAAAAAHHAAAAAAA....',\n '....AAAAAAAHHAAAAAAA....',\n '....AAAAAAAHHAAAAAAA....',\n '....AAAAAAAHHAAAAAAA....',\n '....AAAHHHHHHHHHHAAA....',\n '....AAAAAAAHHAAAAAAA....',\n '....AAAAAAAHHAAAAAAA....',\n '....AAAAAAAHHAAAAAAA....',\n '....AAAAAAAHHAAAAAAA....',\n '....AAAAAAAAAAAAAAAA....',\n '....AAAAAAAAAAAAAAAA....',\n '....AAAAAAAAAAAAAAAA....',\n '....AAAAAAAAAAAAAAAA....',\n '.....AAAAAAAAAAAAAA.....',\n '........................',\n ],\n edit: [\n '........................',\n '........................',\n '........................',\n '...............AA.......',\n '.............HHAAA......',\n '.............HHHAAA.....',\n '............AAHHHAAA....',\n '...........AAAAHHHAAA...',\n '..........AAAAAAHHHAA...',\n '.........AAAAAAAAHHH....',\n '........AAAAAAAAAAHH....',\n '.......AAAAAAAAAAA......',\n '......AAAAAAAAAAA.......',\n '.....AAAAAAAAAAA........',\n '....AAAAAAAAAAA.........',\n '...AAAAAAAAAAA..........',\n '...AAHHAAAAAA...........',\n '...AAHHHAAAA............',\n '...AAAHHAAA.............',\n '...AAAAAAA..............',\n '...AAAAAA...............',\n '........................',\n '........................',\n '........................',\n ],\n bash: [\n '........................',\n '........................',\n '........................',\n '....AAAAAAAAAAAAAAAA....',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAHHAAAAAAAAAAAAAAAA.',\n '.AAAAHHHAAAAAAAAAAAAAAA.',\n '.AAAAAHHHAAAAAAAAAAAAAA.',\n '.AAAAAAHHHAAAAAAAAAAAAA.',\n '.AAAAAAHHHAAAAAAAAAAAAA.',\n '.AAAAAHHHAAAAAAAAAAAAAA.',\n '.AAAAHHHAAAAAAAAAAAAAAA.',\n '.AAAAHHAAAAHHHHHHHAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '....AAAAAAAAAAAAAAAA....',\n '........................',\n '........................',\n '........................',\n ],\n search: [\n '........................',\n '........................',\n '.......AAAAAA...........',\n '......AAAAAAAA..........',\n '....AAAAAAAAAAAA........',\n '....AAAAAAAAAAAA........',\n '...AAAA......AAAA.......',\n '..AAAA........AAAA......',\n '..AAAA........AAAA......',\n '..AAAA........AAAA......',\n '..AAAA........AAAA......',\n '..AAAA........AAAA......',\n '..AAAA........AAAA......',\n '...AAAA......AAAA.......',\n '....AAAAAAAAAAAAA.......',\n '....AAAAAAAAAAAAAA......',\n '......AAAAAAAAAAAAA.....',\n '.......AAAAAA..AAAAA....',\n '................AAAAA...',\n '.................AAAAA..',\n '..................AAAAA.',\n '...................AAAA.',\n '....................AA..',\n '........................',\n ],\n web: [\n '........................',\n '........................',\n '.........AHHHHA.........',\n '.......AAHHHHHHAA.......',\n '.....AAAAHHAAHHAAAA.....',\n '....AAAAHHAAAAHHAAAA....',\n '....HHHHHHHHHHHHHHHH....',\n '...AHHHHHHHHHHHHHHHHA...',\n '...AAAAAHAAAAAAHAAAAA...',\n '..AAAAAHHAAAAAAHAAAAAA..',\n '..AAAAAHHAAAAAAHHAAAAA..',\n '..HHHHHHHHHHHHHHHHHHHH..',\n '..HHHHHHHHHHHHHHHHHHHH..',\n '..AAAAAHHAAAAAAHHAAAAA..',\n '..AAAAAHHAAAAAAHAAAAAA..',\n '...AAAAAHAAAAAAHAAAAA...',\n '...AHHHHHHHHHHHHHHHHA...',\n '....HHHHHHHHHHHHHHHH....',\n '....AAAAHHAAAAHHAAAA....',\n '.....AAAAHHAAHHAAAA.....',\n '.......AAHHHHHHAA.......',\n '.........AHHHHA.........',\n '........................',\n '........................',\n ],\n fetch: [\n '........................',\n '..........AAA...........',\n '..........AAAA..........',\n '..........AAAA..........',\n '..........AAAA..........',\n '..........AAAA..........',\n '..........AAAA..........',\n '.....AA...AAAA...AA.....',\n '....AAAA..AAAA..AAAA....',\n '....AAAAA.AAAA.AAAAA....',\n '.....AAAAAAAAAAAAAA.....',\n '......AAAAAAAAAAAA......',\n '.......AAAAAAAAAA.......',\n '........AAAAAAAA........',\n '.........AAAAAA.........',\n '..AAA.....AAAA.....AAA..',\n '..AAA......AA......AAA..',\n '..AAA..............AAA..',\n '..AAA..............AAA..',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '...AAAAAAAAAAAAAAAAAA...',\n '........................',\n ],\n todo: [\n '........................',\n '........................',\n '....AAAAAAAAAAAAAAAA....',\n '....AAAAAAAAAAAAAAAA....',\n '...AAAAAAAAAAAAAAAAAA...',\n '...AAAAAAAAAAAAAAAAAA...',\n '...AAAAAAAAHAAAAAAAAA...',\n '...AAAAAAAHHAAAAAAAAA...',\n '...AAAHHAHHAAHHHHHAAA...',\n '...AAAAHHHAAAHHHHHAAA...',\n '...AAAAAHAAAAAAAAAAAA...',\n '...AAAAAAAAAAAAAAAAAA...',\n '...AAAAAAAAAAAAAAAAAA...',\n '...AAAAAAAAHAAAAAAAAA...',\n '...AAAAAAAHHAAAAAAAAA...',\n '...AAAHHAHHAAHHHHHAAA...',\n '...AAAAHHHAAAHHHHHAAA...',\n '...AAAAAHAAAAAAAAAAAA...',\n '...AAAAAAAAAAAAAAAAAA...',\n '...AAAAAAAAAAAAAAAAAA...',\n '...AAAAAAAAAAAAAAAAAA...',\n '....AAAAAAAAAAAAAAAA....',\n '.....AAAAAAAAAAAAAA.....',\n '........................',\n ],\n subagent: [\n '........................',\n '........................',\n '........................',\n '........................',\n '.....AAAA......AAAA.....',\n '....AAAAAA....AAAAAA....',\n '....AAAAAAA..AAAAAAA....',\n '....AAAAAAA..AAAAAAA....',\n '....AAAAAAA..AAAAAAA....',\n '....AAAAAA...AAAAAAA....',\n '.....AAAAA....AAAAA.....',\n '........................',\n '........................',\n '........................',\n '.......A................',\n '....AAAAAAA..AAAAAAA....',\n '...AAAAAAAAAAAAAAAAAA...',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '........................',\n '........................',\n '........................',\n ],\n workflow: [\n '........................',\n '........................',\n '........................',\n '..AAAAAA.........AAAAA..',\n '..AAAAAA........AAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAA....AAA.AAAAAAA.',\n '..AAAAAA....AAA..AAAAA..',\n '............AAA.........',\n '............AAA.........',\n '............AAA.........',\n '............AAA.........',\n '............AAA..AAAAA..',\n '............AAA.AAAAAAA.',\n '.............AAAAAAAAAA.',\n '.............AAAAAAAAAA.',\n '...............AAAAAAAA.',\n '................AAAAAAA.',\n '.................AAAAA..',\n '........................',\n '........................',\n '........................',\n ],\n goal: [\n '........................',\n '....AA..................',\n '...AAAA.................',\n '...AAAAAAAAAAAAAAAAA....',\n '...AAAAAAAAAAAAAAAA.....',\n '...AAAAAAAAAAAAAAA......',\n '...AAAAAAAAAAAAAAA......',\n '...AAAAAAAAAAAAAA.......',\n '...AAAAAAAAAAAAAA.......',\n '...AAAAAAAAAAAAAAA......',\n '...AAAAAAAAAAAAAAAA.....',\n '...AAAAAAAAAAAAAAAAA....',\n '...AAAA.................',\n '...AAAA.................',\n '...AAAA.................',\n '...AAAA.................',\n '...AAAA.................',\n '...AAAA.................',\n '...AAAA.................',\n '...AAAA.................',\n '...AAAA.................',\n '...AAAA.................',\n '...AAAA.................',\n '....AA..................',\n ],\n present: [\n '........................',\n '........................',\n '...AAAAAAAAAAAAAAAAAA...',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAHAAAA.',\n '.AAAAAAAAAAAAAAAAAHAAAA.',\n '.AAAAAAAAAHAAAAAAAHAAAA.',\n '.AAAAAAAAAHAAAHAAAHAAAA.',\n '.AAAAAHAAAHAAAHAAAHAAAA.',\n '.AAAAAHAAAHAAAHAAAHAAAA.',\n '.AAAAAHAAAHAAAHAAAHAAAA.',\n '.AAAAAHAAAHAAAHAAAHAAAA.',\n '.AAAAAHAAAHAAAHAAAHAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '...AAAAAAAAAAAAAAAAAA...',\n '.........AAAAAA.........',\n '........AAAAAAAA........',\n '........AAA..AAA........',\n '.......AAA....AAA.......',\n '.......AAA....AAA.......',\n '.......AA......AA.......',\n '........................',\n ],\n approval: [\n '........................',\n '........................',\n '.........AAAAAA.........',\n '......AAAAAAAAAAAA......',\n '....AAAAAAAAAAAAAAAA....',\n '...AAAAAAAAHHAAAAAAAA...',\n '...AAAAAAAAHHAAAAAAAA...',\n '...AAAAAAAAHHAAAAAAAA...',\n '...AAAAAAAAHHAAAAAAAA...',\n '...AAAAAAAAHHAAAAAAAA...',\n '...AAAAAAAAHHAAAAAAAA...',\n '...AAAAAAAAHHAAAAAAAA...',\n '...AAAAAAAAHHAAAAAAAA...',\n '....AAAAAAAHHAAAAAAA....',\n '....AAAAAAAAAAAAAAAA....',\n '....AAAAAAAAAAAAAAAA....',\n '.....AAAAAAHHAAAAAA.....',\n '.....AAAAAAHHAAAAAA.....',\n '......AAAAAAAAAAAA......',\n '.......AAAAAAAAAA.......',\n '........AAAAAAAA........',\n '.........AAAAA..........',\n '...........AA...........',\n '........................',\n ],\n other: [\n '........................',\n '........................',\n '........................',\n '...........AA...........',\n '...........AA...........',\n '..........AAAA..........',\n '..........AAAA..........',\n '..........AAAA..........',\n '.........AAAAAA.........',\n '........AAAAAAAA........',\n '.....AAAAAAAAAAAAAA.....',\n '...AAAAAAAAAAAAAAAAAA...',\n '...AAAAAAAAAAAAAAAAAA...',\n '.....AAAAAAAAAAAAAA.....',\n '........AAAAAAAA........',\n '.........AAAAAA.........',\n '..........AAAA..........',\n '..........AAAA..........',\n '..........AAAA..........',\n '...........AA...........',\n '...........AA...........',\n '........................',\n '........................',\n '........................',\n ],\n} as const satisfies Record<string, readonly string[]>;\n\nexport type PixelSymbol = keyof typeof SYMBOLS;\nexport const PIXEL_SYMBOLS = Object.keys(SYMBOLS) as PixelSymbol[];\n\nconst INK = '#2a2230';\nconst channels = (color: string) => {\n const n = Number.parseInt(color.slice(1), 16);\n return [16, 8, 0].map((bit) => (n >> bit) & 255);\n};\nconst mix = (base: string, tint: string, k: number) => {\n const t = channels(tint);\n return `#${channels(base)\n .map((v, i) =>\n Math.round(v * (1 - k) + t[i]! * k)\n .toString(16)\n .padStart(2, '0'),\n )\n .join('')}`;\n};\n\nexport function pixelSymbolCells(symbol: PixelSymbol, color: string): PixelCell[] {\n return symbolArtCells(SYMBOLS[symbol], color);\n}\n\n/**\n * Colours a 24×24 character-art symbol (`A` body, `H` highlight, anything else empty) into\n * cells on the 32 grid: the body in `color`, highlights lighter, the lower-right edge darker,\n * and a one-pixel ink outline. This is how every built-in symbol is drawn, so a host can add\n * its own symbols in the same style without touching the package.\n */\nexport function symbolArtCells(rows: readonly string[], color: string): PixelCell[] {\n const body = new Map<string, 'A' | 'H'>();\n rows.forEach((row, y) =>\n [...row].forEach((code, x) => {\n if (code === 'A' || code === 'H') body.set(`${x + 4},${y + 4}`, code);\n }),\n );\n const light = mix(color, '#ffffff', 0.75);\n const low = mix(color, INK, 0.25);\n const cells: PixelCell[] = [];\n for (const [key, code] of body) {\n const [x, y] = key.split(',').map(Number) as [number, number];\n const edge = x + y > 34 && !body.has(`${x + 1},${y + 1}`);\n cells.push({ x, y, c: code === 'H' ? light : edge ? low : color });\n }\n const outline = new Set<string>();\n for (const key of body.keys()) {\n const [x, y] = key.split(',').map(Number) as [number, number];\n for (const [dx, dy] of [\n [1, 0],\n [-1, 0],\n [0, 1],\n [0, -1],\n ] as const) {\n const next = `${x + dx},${y + dy}`;\n if (body.has(next) || outline.has(next)) continue;\n outline.add(next);\n cells.push({ x: x + dx, y: y + dy, c: INK });\n }\n }\n return cells;\n}\n"],"mappings":"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AM,UAAU;CACd,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,KAAK;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,KAAK;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACF;AAGD,MAAa,gBAAgB,OAAO,KAAK,QAAQ;AAEjD,MAAM,MAAM;AACZ,MAAM,YAAY,UAAkB;CAClC,MAAM,IAAI,OAAO,SAAS,MAAM,MAAM,EAAE,EAAE,GAAG;AAC7C,QAAO;EAAC;EAAI;EAAG;EAAE,CAAC,KAAK,QAAS,KAAK,MAAO,IAAI;;AAElD,MAAM,OAAO,MAAc,MAAc,MAAc;CACrD,MAAM,IAAI,SAAS,KAAK;AACxB,QAAO,IAAI,SAAS,KAAK,CACtB,KAAK,GAAG,MACP,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,KAAM,EAAE,CAChC,SAAS,GAAG,CACZ,SAAS,GAAG,IAAI,CACpB,CACA,KAAK,GAAG;;AAGb,SAAgB,iBAAiB,QAAqB,OAA4B;AAChF,QAAO,eAAe,QAAQ,SAAS,MAAM;;;;;;;;AAS/C,SAAgB,eAAe,MAAyB,OAA4B;CAClF,MAAM,uBAAO,IAAI,KAAwB;AACzC,MAAK,SAAS,KAAK,MACjB,CAAC,GAAG,IAAI,CAAC,SAAS,MAAM,MAAM;AAC5B,MAAI,SAAS,OAAO,SAAS,IAAK,MAAK,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,KAAK,KAAK;GACrE,CACH;CACD,MAAM,QAAQ,IAAI,OAAO,WAAW,IAAK;CACzC,MAAM,MAAM,IAAI,OAAO,KAAK,IAAK;CACjC,MAAM,QAAqB,EAAE;AAC7B,MAAK,MAAM,CAAC,KAAK,SAAS,MAAM;EAC9B,MAAM,CAAC,GAAG,KAAK,IAAI,MAAM,IAAI,CAAC,IAAI,OAAO;EACzC,MAAM,OAAO,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI;AACzD,QAAM,KAAK;GAAE;GAAG;GAAG,GAAG,SAAS,MAAM,QAAQ,OAAO,MAAM;GAAO,CAAC;;CAEpE,MAAM,0BAAU,IAAI,KAAa;AACjC,MAAK,MAAM,OAAO,KAAK,MAAM,EAAE;EAC7B,MAAM,CAAC,GAAG,KAAK,IAAI,MAAM,IAAI,CAAC,IAAI,OAAO;AACzC,OAAK,MAAM,CAAC,IAAI,OAAO;GACrB,CAAC,GAAG,EAAE;GACN,CAAC,IAAI,EAAE;GACP,CAAC,GAAG,EAAE;GACN,CAAC,GAAG,GAAG;GACR,EAAW;GACV,MAAM,OAAO,GAAG,IAAI,GAAG,GAAG,IAAI;AAC9B,OAAI,KAAK,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,CAAE;AACzC,WAAQ,IAAI,KAAK;AACjB,SAAM,KAAK;IAAE,GAAG,IAAI;IAAI,GAAG,IAAI;IAAI,GAAG;IAAK,CAAC;;;AAGhD,QAAO"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["INK","channels","mix"],"sources":["../src/random.ts","../src/recipe.ts","../src/figure.ts","../src/svg.ts","../src/symbols.ts"],"sourcesContent":["export function seededRandom(seed: string): () => number {\n let h = 2166136261;\n for (const char of seed) {\n h ^= char.codePointAt(0)!;\n h = Math.imul(h, 16777619);\n }\n return () => {\n h = Math.imul(h ^ (h >>> 15), 2246822507);\n h = Math.imul(h ^ (h >>> 13), 3266489909);\n h ^= h >>> 16;\n return (h >>> 0) / 4294967296;\n };\n}\n","import { seededRandom } from './random.js';\n\nexport const AVATAR_PARTS = {\n head: ['round', 'oval', 'square', 'long', 'heart', 'vchin', 'chubby', 'diamond'],\n pose: ['front', 'left', 'right'],\n hair: [\n 'crop',\n 'sweep',\n 'spiky',\n 'buzz',\n 'curly',\n 'mohawk',\n 'bob',\n 'long',\n 'bun',\n 'pigtails',\n 'afro',\n 'twintails',\n 'drills',\n 'ponytail',\n 'sidetail',\n 'hime',\n 'odango',\n 'messy',\n 'wavy',\n 'braids',\n 'wolf',\n 'ahoge',\n 'none',\n ],\n eyes: ['round', 'dot', 'sparkle', 'lashes', 'sleepy', 'happy', 'wink', 'sharp'],\n brows: ['soft', 'thick', 'raised', 'angry', 'worried', 'none'],\n nose: ['button', 'dot', 'line', 'none'],\n mouth: ['smile', 'grin', 'open', 'flat', 'smirk', 'cat', 'tongue', 'o'],\n cheeks: ['blush', 'freckles', 'none'],\n glasses: ['none', 'round', 'square', 'shades', 'monocle'],\n outfit: [\n 'tee',\n 'shirttie',\n 'hoodie',\n 'turtleneck',\n 'sailor',\n 'blazer',\n 'overalls',\n 'dress',\n 'kimono',\n 'cardigan',\n 'maid',\n 'jacket',\n ],\n backdrop: ['sparkles', 'hearts', 'stars', 'dots', 'none'],\n accessory: [\n 'none',\n 'beanie',\n 'cap',\n 'headphones',\n 'flower',\n 'bow',\n 'earring',\n 'crown',\n 'halo',\n 'catears',\n 'hairclip',\n 'horns',\n 'beret',\n 'ribbon',\n 'headband',\n 'bunnyears',\n 'horseears',\n 'flowercrown',\n 'witch',\n 'pins',\n ],\n} as const;\n\nexport const AVATAR_HAIR_PARTS = {\n bangs: [\n 'crop',\n 'bob',\n 'sweep',\n 'spiky',\n 'curly',\n 'messy',\n 'wolf',\n 'wavy',\n 'ahoge',\n 'hime',\n 'buzz',\n 'mohawk',\n 'none',\n ],\n sideHair: ['crop', 'bun', 'bob', 'long', 'hime', 'curly', 'braids', 'none'],\n backHair: [\n 'none',\n 'bob',\n 'long',\n 'wavy',\n 'wolf',\n 'bun',\n 'odango',\n 'pigtails',\n 'twintails',\n 'drills',\n 'ponytail',\n 'sidetail',\n 'afro',\n ],\n} as const satisfies Record<string, readonly (typeof AVATAR_PARTS)['hair'][number][]>;\nconst HAIR_SPLIT: Record<\n (typeof AVATAR_PARTS)['hair'][number],\n { [P in AvatarHairPart]: (typeof AVATAR_HAIR_PARTS)[P][number] }\n> = {\n crop: { bangs: 'crop', sideHair: 'crop', backHair: 'none' },\n sweep: { bangs: 'sweep', sideHair: 'crop', backHair: 'none' },\n spiky: { bangs: 'spiky', sideHair: 'crop', backHair: 'none' },\n buzz: { bangs: 'buzz', sideHair: 'none', backHair: 'none' },\n curly: { bangs: 'curly', sideHair: 'curly', backHair: 'none' },\n mohawk: { bangs: 'mohawk', sideHair: 'none', backHair: 'none' },\n bob: { bangs: 'bob', sideHair: 'bob', backHair: 'bob' },\n long: { bangs: 'bob', sideHair: 'long', backHair: 'long' },\n bun: { bangs: 'bob', sideHair: 'bun', backHair: 'bun' },\n pigtails: { bangs: 'bob', sideHair: 'bun', backHair: 'pigtails' },\n afro: { bangs: 'buzz', sideHair: 'none', backHair: 'afro' },\n twintails: { bangs: 'bob', sideHair: 'bob', backHair: 'twintails' },\n drills: { bangs: 'bob', sideHair: 'bob', backHair: 'drills' },\n ponytail: { bangs: 'bob', sideHair: 'bun', backHair: 'ponytail' },\n sidetail: { bangs: 'sweep', sideHair: 'bun', backHair: 'sidetail' },\n hime: { bangs: 'hime', sideHair: 'hime', backHair: 'long' },\n odango: { bangs: 'bob', sideHair: 'bun', backHair: 'odango' },\n messy: { bangs: 'messy', sideHair: 'bun', backHair: 'none' },\n wavy: { bangs: 'wavy', sideHair: 'long', backHair: 'wavy' },\n braids: { bangs: 'bob', sideHair: 'braids', backHair: 'none' },\n wolf: { bangs: 'wolf', sideHair: 'bun', backHair: 'wolf' },\n ahoge: { bangs: 'ahoge', sideHair: 'bob', backHair: 'bob' },\n none: { bangs: 'none', sideHair: 'none', backHair: 'none' },\n};\nexport const AVATAR_RANGES = {\n spacing: [-1, 1],\n height: [-1, 1],\n hairLength: [-2, 2],\n} as const;\nexport type AvatarHairPart = keyof typeof AVATAR_HAIR_PARTS;\nexport type AvatarRange = keyof typeof AVATAR_RANGES;\nconst DETAIL_KEYS = [\n ...(Object.keys(AVATAR_HAIR_PARTS) as AvatarHairPart[]),\n ...(Object.keys(AVATAR_RANGES) as AvatarRange[]),\n] as const;\n\nexport type AvatarPart = keyof typeof AVATAR_PARTS;\nexport const AVATAR_COLORS = ['skinColor', 'hairColor', 'eyeColor', 'shirtColor'] as const;\nexport type AvatarColor = (typeof AVATAR_COLORS)[number];\n\n/**\n * Avatar Species: a base on the pixel bust rig. Species share motion and anchors; each sets its\n * own ears, face details and suggested body colors. A recipe with a species is asset version 2.\n */\nexport const AVATAR_SPECIES = ['human', 'goblin'] as const;\nexport type AvatarSpecies = (typeof AVATAR_SPECIES)[number];\n/** Optional per-piece hair colors (asset version 2); an absent piece uses `hairColor`. */\nexport const AVATAR_PIECE_COLORS = ['leftSideHairColor', 'rightSideHairColor'] as const;\nexport type AvatarPieceColor = (typeof AVATAR_PIECE_COLORS)[number];\n\ntype BaseRecipe = {\n schemaVersion: 1;\n family: 'illustrated';\n rigVersion: 1;\n} & { [P in AvatarPart]: (typeof AVATAR_PARTS)[P][number] } & Record<AvatarColor, string>;\n\n/** Asset version 1: optional split hair and geometry, all six or none. */\nexport type PixelAvatarRecipeV1 = BaseRecipe & { assetVersion: 1 } & {\n [P in AvatarHairPart]?: (typeof AVATAR_PARTS)['hair'][number];\n} & { [P in AvatarRange]?: number } & {\n species?: never;\n rightSideHair?: never;\n} & { [P in AvatarPieceColor]?: never };\n\n/**\n * Asset version 2: a species, the full split hair and geometry, a separate right side hair\n * (`sideHair` is then the left side) and optional per-side hair colors.\n */\nexport type PixelAvatarRecipeV2 = BaseRecipe & { assetVersion: 2 } & {\n [P in AvatarHairPart]: (typeof AVATAR_PARTS)['hair'][number];\n} & { [P in AvatarRange]: number } & {\n species: AvatarSpecies;\n rightSideHair: (typeof AVATAR_HAIR_PARTS)['sideHair'][number];\n} & { [P in AvatarPieceColor]?: string };\n\nexport type PixelAvatarRecipe = PixelAvatarRecipeV1 | PixelAvatarRecipeV2;\n\nexport const DEFAULT_RECIPE: PixelAvatarRecipeV1 = {\n schemaVersion: 1,\n family: 'illustrated',\n assetVersion: 1,\n rigVersion: 1,\n head: 'round',\n pose: 'front',\n hair: 'crop',\n eyes: 'round',\n brows: 'soft',\n nose: 'button',\n mouth: 'smile',\n cheeks: 'blush',\n glasses: 'none',\n outfit: 'tee',\n backdrop: 'sparkles',\n accessory: 'none',\n skinColor: '#f2c9a8',\n hairColor: '#5a3a2a',\n eyeColor: '#3f7fbf',\n shirtColor: '#5b8bd6',\n};\n\nconst PART_KEYS = Object.keys(AVATAR_PARTS) as AvatarPart[];\n\nexport function isPixelAvatarRecipe(value: unknown): value is PixelAvatarRecipe {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const r = value as Record<string, unknown>;\n const detailed = DETAIL_KEYS.filter((key) => Object.hasOwn(r, key)).length;\n if (detailed !== 0 && detailed !== DETAIL_KEYS.length) return false;\n const v2 = r['assetVersion'] === 2;\n const pieces = AVATAR_PIECE_COLORS.filter((key) => Object.hasOwn(r, key));\n const v2Keys = v2 ? 2 + pieces.length : 0;\n if (Object.keys(r).length !== Object.keys(DEFAULT_RECIPE).length + detailed + v2Keys)\n return false;\n if (\n v2 &&\n (detailed === 0 ||\n !(AVATAR_SPECIES as readonly unknown[]).includes(r['species']) ||\n !(AVATAR_HAIR_PARTS.sideHair as readonly unknown[]).includes(r['rightSideHair']) ||\n !pieces.every((key) => typeof r[key] === 'string' && /^#[\\da-f]{6}$/iu.test(r[key])))\n )\n return false;\n return (\n (detailed === 0 ||\n ((Object.keys(AVATAR_HAIR_PARTS) as AvatarHairPart[]).every(\n (key) =>\n typeof r[key] === 'string' &&\n (AVATAR_HAIR_PARTS[key] as readonly string[]).includes(r[key]),\n ) &&\n (Object.keys(AVATAR_RANGES) as AvatarRange[]).every((key) => {\n const v = r[key];\n const [min, max] = AVATAR_RANGES[key];\n return typeof v === 'number' && Number.isInteger(v) && v >= min && v <= max;\n }))) &&\n r['schemaVersion'] === 1 &&\n r['family'] === 'illustrated' &&\n (r['assetVersion'] === 1 || v2) &&\n r['rigVersion'] === 1 &&\n PART_KEYS.every(\n (key) =>\n typeof r[key] === 'string' && (AVATAR_PARTS[key] as readonly string[]).includes(r[key]),\n ) &&\n AVATAR_COLORS.every((key) => typeof r[key] === 'string' && /^#[\\da-f]{6}$/iu.test(r[key]))\n );\n}\n\nexport function canonicalRecipe(recipe: PixelAvatarRecipe): PixelAvatarRecipe {\n const canonical: Record<string, unknown> = {\n schemaVersion: 1,\n family: 'illustrated',\n assetVersion: recipe.assetVersion,\n rigVersion: 1,\n };\n for (const key of PART_KEYS) canonical[key] = recipe[key];\n for (const key of AVATAR_COLORS) canonical[key] = recipe[key].toLowerCase();\n if (recipe.bangs !== undefined) for (const key of DETAIL_KEYS) canonical[key] = recipe[key];\n if (recipe.assetVersion === 2) {\n canonical['species'] = recipe.species;\n canonical['rightSideHair'] = recipe.rightSideHair;\n for (const key of AVATAR_PIECE_COLORS)\n if (recipe[key] !== undefined) canonical[key] = recipe[key].toLowerCase();\n }\n return canonical as PixelAvatarRecipe;\n}\n\n/**\n * Returns the recipe as asset version 2 with the given species, keeping every other choice.\n * Side hair splits into left (`sideHair`) and right (`rightSideHair`) pieces that start equal.\n * When the skin color is one of the previous species' suggested colors, it moves to the new\n * species' first suggestion; a custom color is kept.\n */\nexport function withSpecies(\n recipe: PixelAvatarRecipe,\n species: AvatarSpecies,\n): PixelAvatarRecipeV2 {\n const detailed = detailedRecipe(recipe);\n const previous = recipe.species ?? 'human';\n const suggested = AVATAR_SPECIES_SWATCHES[previous].includes(recipe.skinColor.toLowerCase());\n return {\n ...detailed,\n assetVersion: 2,\n species,\n rightSideHair: detailed.rightSideHair ?? detailed.sideHair!,\n skinColor:\n suggested && previous !== species ? AVATAR_SPECIES_SWATCHES[species][0]! : recipe.skinColor,\n } as PixelAvatarRecipeV2;\n}\n\nexport function detailedRecipe(recipe: PixelAvatarRecipe): PixelAvatarRecipe {\n if (recipe.bangs !== undefined) return recipe;\n const pick = <P extends AvatarHairPart>(part: P) =>\n (AVATAR_HAIR_PARTS[part] as readonly string[]).includes(recipe.hair)\n ? (recipe.hair as (typeof AVATAR_HAIR_PARTS)[P][number])\n : HAIR_SPLIT[recipe.hair][part];\n return {\n ...recipe,\n bangs: pick('bangs'),\n sideHair: pick('sideHair'),\n backHair: pick('backHair'),\n spacing: 0,\n height: 0,\n hairLength: 0,\n };\n}\n\nexport const AVATAR_SWATCHES: Record<AvatarColor, readonly string[]> = {\n skinColor: [\n '#ffe3cf',\n '#f2c9a8',\n '#e0a87e',\n '#c68863',\n '#9a6142',\n '#6e4129',\n '#4a2c1c',\n '#f4f1ec',\n ],\n hairColor: [\n '#1d1b22',\n '#5a3a2a',\n '#8a5a36',\n '#e2b04a',\n '#c4452f',\n '#d9475a',\n '#f06292',\n '#3fc1b8',\n '#5a7be0',\n '#9aa3ad',\n '#f4f1ec',\n ],\n eyeColor: [\n '#3f7fbf',\n '#5a3a2a',\n '#2f9e8f',\n '#4c8a3c',\n '#8a5ad0',\n '#d0533f',\n '#d9a13a',\n '#2a2230',\n ],\n shirtColor: [\n '#5b8bd6',\n '#e07a5f',\n '#3d9970',\n '#7a5cc7',\n '#f2c14e',\n '#2f3a4a',\n '#e2565f',\n '#9ad0c2',\n ],\n};\n\nconst SEEDED_CHOICES: { [P in AvatarPart]: readonly (typeof AVATAR_PARTS)[P][number][] } = {\n head: ['round', 'oval', 'square', 'long', 'heart', 'vchin', 'chubby', 'diamond'],\n pose: ['front'],\n hair: AVATAR_PARTS.hair.filter((hair) => hair !== 'none'),\n eyes: ['round', 'round', 'sparkle', 'lashes', 'dot', 'happy', 'sharp'],\n brows: ['soft', 'soft', 'thick', 'raised'],\n nose: ['button', 'dot', 'none'],\n mouth: ['smile', 'smile', 'grin', 'open', 'cat'],\n cheeks: ['blush', 'blush', 'freckles', 'none'],\n glasses: ['none', 'none', 'none', 'none', 'round', 'square'],\n accessory: [\n 'none',\n 'none',\n 'none',\n 'flower',\n 'bow',\n 'hairclip',\n 'catears',\n 'headphones',\n 'beanie',\n 'cap',\n ],\n outfit: AVATAR_PARTS.outfit,\n backdrop: ['sparkles', 'hearts', 'stars', 'dots'],\n};\n\n/**\n * Returns a name-seeded recipe factory. Different namespaces give different faces for the same\n * name; the factory takes the name only, so it is safe to pass straight to `Array.map`.\n */\nexport function createSeededRecipe(namespace: string): (seed: string) => PixelAvatarRecipe {\n return (seed) => {\n const random = seededRandom(`${namespace}:${seed.trim().toLowerCase()}`);\n const pick = <T>(values: readonly T[]) => values[Math.floor(random() * values.length)]!;\n const recipe: Record<string, unknown> = {\n schemaVersion: 1,\n family: 'illustrated',\n assetVersion: 1,\n rigVersion: 1,\n };\n for (const part of Object.keys(AVATAR_PARTS) as AvatarPart[])\n recipe[part] = pick(SEEDED_CHOICES[part]);\n for (const color of AVATAR_COLORS) recipe[color] = pick(AVATAR_SWATCHES[color].slice(0, 7));\n return recipe as PixelAvatarRecipe;\n };\n}\n\n/** The same name always gives the same face (BotHarness's namespace). */\nexport const seededRecipe: (seed: string) => PixelAvatarRecipe =\n createSeededRecipe('botharness-avatar');\n\n/** Suggested body colors per species; any color remains allowed. */\nexport const AVATAR_SPECIES_SWATCHES: Record<AvatarSpecies, readonly string[]> = {\n human: AVATAR_SWATCHES.skinColor,\n goblin: ['#9cc464', '#7fae4f', '#6a9a45', '#b3cf7a', '#5c8a4a', '#8fa86a'],\n};\n\nconst preset = (parts: Partial<PixelAvatarRecipeV1>): PixelAvatarRecipeV1 => ({\n ...DEFAULT_RECIPE,\n ...parts,\n});\n\nexport const AVATAR_PRESETS: readonly PixelAvatarRecipe[] = [\n preset({\n hair: 'wavy',\n eyes: 'lashes',\n accessory: 'beret',\n outfit: 'dress',\n skinColor: '#ffe3cf',\n hairColor: '#e2b04a',\n eyeColor: '#3f7fbf',\n shirtColor: '#e2565f',\n backdrop: 'stars',\n }),\n preset({\n hair: 'braids',\n accessory: 'flowercrown',\n outfit: 'cardigan',\n skinColor: '#ffe3cf',\n hairColor: '#8a5a36',\n eyeColor: '#4c8a3c',\n shirtColor: '#9ad0c2',\n backdrop: 'hearts',\n }),\n preset({\n hair: 'twintails',\n eyes: 'sparkle',\n accessory: 'ribbon',\n outfit: 'maid',\n skinColor: '#ffe3cf',\n hairColor: '#3fc1b8',\n eyeColor: '#2f9e8f',\n shirtColor: '#e2565f',\n backdrop: 'stars',\n }),\n preset({\n hair: 'long',\n accessory: 'horseears',\n outfit: 'jacket',\n skinColor: '#ffe3cf',\n hairColor: '#8a5a36',\n eyeColor: '#d0533f',\n shirtColor: '#5b8bd6',\n backdrop: 'dots',\n }),\n preset({\n hair: 'hime',\n eyes: 'sleepy',\n accessory: 'pins',\n outfit: 'kimono',\n skinColor: '#f4f1ec',\n hairColor: '#1d1b22',\n eyeColor: '#d0533f',\n shirtColor: '#7a5cc7',\n backdrop: 'none',\n }),\n preset({\n hair: 'ahoge',\n accessory: 'headband',\n outfit: 'sailor',\n skinColor: '#ffe3cf',\n hairColor: '#f06292',\n eyeColor: '#2f9e8f',\n shirtColor: '#f4f1ec',\n backdrop: 'hearts',\n }),\n preset({\n hair: 'wolf',\n eyes: 'sharp',\n outfit: 'jacket',\n skinColor: '#e0a87e',\n hairColor: '#9aa3ad',\n eyeColor: '#5a7be0',\n shirtColor: '#2f3a4a',\n backdrop: 'stars',\n }),\n preset({\n hair: 'wavy',\n eyes: 'sparkle',\n accessory: 'witch',\n outfit: 'dress',\n skinColor: '#ffe3cf',\n hairColor: '#8a5ad0',\n eyeColor: '#d9a13a',\n shirtColor: '#2f3a4a',\n backdrop: 'sparkles',\n }),\n preset({\n hair: 'bob',\n eyes: 'happy',\n accessory: 'bunnyears',\n outfit: 'cardigan',\n skinColor: '#ffe3cf',\n hairColor: '#f4f1ec',\n eyeColor: '#d9475a',\n shirtColor: '#f2c14e',\n backdrop: 'hearts',\n }),\n preset({\n hair: 'spiky',\n glasses: 'round',\n accessory: 'headphones',\n outfit: 'hoodie',\n backdrop: 'dots',\n }),\n preset({\n hair: 'odango',\n eyes: 'lashes',\n accessory: 'bow',\n outfit: 'kimono',\n hairColor: '#e2b04a',\n shirtColor: '#5b8bd6',\n backdrop: 'sparkles',\n }),\n preset({\n hair: 'crop',\n accessory: 'cap',\n outfit: 'shirttie',\n skinColor: '#9a6142',\n hairColor: '#1d1b22',\n shirtColor: '#3d9970',\n backdrop: 'dots',\n }),\n];\n","import { escapeAttribute, type PixelCell } from '@botharness/pixel-morph';\nimport { AVATAR_PIECE_COLORS, type PixelAvatarRecipe } from './recipe.js';\n\ntype Cell = string | undefined;\ntype Grid = Cell[][];\ntype Mask = (x: number, y: number) => boolean;\ntype Point = readonly [number, number];\n\nconst N = 32;\nconst C = 16;\nconst INK = '#2a2230';\nconst WHITE = '#ffffff';\nconst BLUSH = '#f4879a';\nconst MOUTH = '#7a2a38';\nconst MOUTH_INSIDE = '#b8415a';\nconst TONGUE = '#ef6f84';\nconst GOLD = '#efb93f';\nconst TUSK = '#f6f0d8';\n\nexport type PixelGrid = Grid;\nexport type PixelMouthState = 'saved' | 'closed' | 'half-open' | 'open';\nexport interface PixelFigureOptions {\n mouthLayers?: boolean;\n}\nconst blank = (): Grid => Array.from({ length: N }, () => Array<Cell>(N).fill(undefined));\nconst ellipse =\n (cx: number, cy: number, rx: number, ry: number): Mask =>\n (x, y) =>\n ((x + 0.5 - cx) / rx) ** 2 + ((y + 0.5 - cy) / ry) ** 2 <= 1;\n\nfunction channels(color: string): number[] {\n const n = Number.parseInt(color.slice(1), 16);\n return [16, 8, 0].map((bit) => (n >> bit) & 255);\n}\nfunction hex(values: number[]): string {\n return `#${values\n .map((v) =>\n Math.min(255, Math.max(0, Math.round(v)))\n .toString(16)\n .padStart(2, '0'),\n )\n .join('')}`;\n}\nconst shade = (color: string, k: number) => hex(channels(color).map((v) => v * k));\nconst mix = (base: string, tint: string, k: number) => {\n const t = channels(tint);\n return hex(channels(base).map((v, i) => v * (1 - k) + t[i]! * k));\n};\nfunction paint(grid: Grid, test: Mask, color: string): void {\n for (let y = 0; y < N; y++) for (let x = 0; x < N; x++) if (test(x, y)) grid[y]![x] = color;\n}\nfunction sprite(\n grid: Grid,\n rows: readonly string[],\n ox: number,\n oy: number,\n pal: Record<string, string>,\n flip = false,\n): void {\n rows.forEach((row, y) =>\n [...row].forEach((code, i) => {\n const c = pal[code];\n const x = ox + (flip ? row.length - 1 - i : i);\n if (c && x >= 0 && x < N && oy + y >= 0 && oy + y < N) grid[oy + y]![x] = c;\n }),\n );\n}\nfunction outline(grid: Grid): Grid {\n const out = grid.map((row) => [...row]);\n for (let y = 0; y < N; y++)\n for (let x = 0; x < N; x++) {\n if (grid[y]![x]) continue;\n const n = [grid[y]?.[x - 1], grid[y]?.[x + 1], grid[y - 1]?.[x], grid[y + 1]?.[x]].find(\n Boolean,\n );\n if (n) out[y]![x] = mix(shade(n, 0.3), INK, 0.62);\n }\n return out;\n}\nconst R = 6;\nconst inTile: Mask = (x, y) => {\n const clamp = (v: number) => Math.min(Math.max(v, R), N - R);\n return (x + 0.5 - clamp(x + 0.5)) ** 2 + (y + 0.5 - clamp(y + 0.5)) ** 2 <= R * R;\n};\nconst clip = (g: Grid): Grid =>\n g.map((row, y) => row.map((c, x) => (inTile(x, y) ? c : undefined)));\nfunction rects(grid: Grid): string {\n let m = '';\n for (let y = 0; y < N; y++) {\n let x = 0;\n while (x < N) {\n const c = grid[y]![x];\n if (!c) {\n x++;\n continue;\n }\n let w = 1;\n while (x + w < N && grid[y]![x + w] === c) w++;\n m += `<rect x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"1\" fill=\"${escapeAttribute(c)}\"/>`;\n x += w;\n }\n }\n return m;\n}\n\ntype Recipe = PixelAvatarRecipe;\n\nconst FACE: Record<Recipe['head'], (s: number) => Mask> = {\n round: (s) => ellipse(C + s, 16.6, 8.6, 7.6),\n oval: (s) => ellipse(C + s, 16.6, 8, 8),\n chubby: (s) => ellipse(C + s, 17, 9.4, 7.2),\n long: (s) => ellipse(C + s, 16.6, 7.8, 8.4),\n square: (s) => (x, y) => {\n if (y < 8 || y > 23) return false;\n const dx = Math.abs(x + 0.5 - C - s);\n const r = 3;\n if (y <= 20) return dx <= 8.5;\n return dx <= 8.5 - (y - 20) ** 1.3 * 1.1 + 0.3 - (y === 23 ? 1 : 0) || dx <= 8.5 - r;\n },\n heart: (s) => taper(ellipse(C + s, 15.8, 9, 7.4), 16.5, 9, 2.6, 24.4, s),\n vchin: (s) => taper(ellipse(C + s, 15.8, 8.6, 7.4), 17.5, 8.6, 2.2, 24.4, s),\n diamond: (s) =>\n taper(\n (x, y) => y >= 9 && Math.abs(x + 0.5 - C - s) <= 6.4 + (y - 9) * 0.45,\n 15.8,\n 9.2,\n 2.6,\n 24.4,\n s,\n ),\n};\nfunction taper(top: Mask, from: number, width: number, end: number, chin: number, s: number): Mask {\n return (x, y) => {\n const cy = y + 0.5;\n if (cy <= from) return top(x, y);\n if (cy > chin) return false;\n const t = (cy - from) / (chin - from);\n return Math.abs(x + 0.5 - C - s) <= width - (width - end) * t ** 1.5;\n };\n}\n\nconst EYES: Record<Recipe['eyes'], readonly string[]> = {\n round: ['KKKK', 'DWDD', 'IDDI', 'LIIL'],\n dot: ['....', '.KK.', '.KK.', '....'],\n sparkle: ['KKKK', 'DWDW', 'IDDI', 'LIWL'],\n lashes: ['KKKKK', 'K.DWD', '..IDD', '..LII'],\n sleepy: ['....', 'KKKK', 'IDDI', 'LIIL'],\n happy: ['....', '.KK.', 'K..K', '....'],\n wink: ['KKKK', 'DWDD', 'IDDI', 'LIIL'],\n sharp: ['KK..', '.KKK', '.DWD', '..LI'],\n};\nconst CLOSED = ['....', '....', 'KKKK', '....'];\nconst BROWS: Record<Recipe['brows'], readonly string[]> = {\n soft: ['.BBB'],\n thick: ['BBBB'],\n raised: ['.BB.'],\n angry: ['BB..', '..BB'],\n worried: ['..BB', 'BB..'],\n none: [],\n};\nconst MOUTHS: Record<Recipe['mouth'], readonly string[]> = {\n smile: ['K..K', '.KK.'],\n grin: ['KWWK', '.KK.'],\n open: ['KKK', 'MTM'],\n flat: ['.KK.'],\n smirk: ['...K', '.KK.'],\n cat: ['K.K.K', '.K.K.'],\n tongue: ['KKKK', '.TT.'],\n o: ['.K.', 'KMK', '.K.'],\n};\n\nfunction hair(\n recipe: Recipe,\n s: number,\n b: number,\n): { back: Mask; front: Mask; ties?: Point[]; bands?: boolean } {\n const none: Mask = () => false;\n const cap = ellipse(C + s, 14, 11, 10.6);\n const tip = (x: number, depth = 1) => [0, depth, depth + 1, depth][(x + 40 - s) % 4]!;\n const bangs =\n (line: number, depth = 1, sides = 22): Mask =>\n (x, y) => {\n if (!cap(x, Math.min(y, 13))) return false;\n const dx = x + 0.5 - C - s;\n if (Math.abs(dx) >= 7) return y <= sides - [0, 1, 0, 2][(x + 40 - s) % 4]!;\n return y <= line + tip(x, depth) - (Math.abs(dx) > 6 ? 0 : 0);\n };\n const longBack =\n (bottom: number, width = 11.4): Mask =>\n (x, y) =>\n (ellipse(C + b, 14, width + 0.4, 11)(x, y) && y <= 16) ||\n (y > 15 && y <= bottom && Math.abs(x + 0.5 - C - b) <= width - (y > bottom - 2 ? 1 : 0));\n switch (recipe.hair) {\n case 'none':\n return { back: none, front: none };\n case 'buzz':\n return { back: none, front: (x, y) => cap(x, y) && y <= 7 };\n case 'crop':\n return { back: none, front: bangs(10, 1, 15) };\n case 'sweep':\n return {\n back: none,\n front: (x, y) =>\n cap(x, Math.min(y, 13)) &&\n (y <= 9 + Math.max(0, (x - 6 - s) * 0.45) || (Math.abs(x + 0.5 - C - s) >= 7 && y <= 16)),\n };\n case 'spiky':\n return {\n back: none,\n front: (x, y) =>\n cap(x, Math.max(y, 6)) &&\n y >= [1, 3, 5, 3][(x + 40 - s) % 4]! &&\n bangs(11, 2, 15)(x, Math.max(y, 6)),\n };\n case 'curly': {\n const bumps: Point[] = Array.from({ length: 9 }, (_, i) => {\n const a = Math.PI * (1.02 + (i * 0.96) / 8);\n return [C + s + 11.5 * Math.cos(a), 14 + 11 * Math.sin(a)] as Point;\n });\n return {\n back: none,\n front: (x, y) =>\n bangs(11, 1, 18)(x, y) ||\n (y <= 18 && bumps.some(([bx, by]) => (x + 0.5 - bx) ** 2 + (y + 0.5 - by) ** 2 <= 6.5)),\n };\n }\n case 'mohawk':\n return { back: none, front: (x, y) => Math.abs(x + 0.5 - C - s) <= 2 && y >= 1 && y <= 9 };\n case 'bob':\n return { back: longBack(25), front: bangs(13, 1, 24) };\n case 'long':\n return { back: longBack(31), front: bangs(13, 1, 26) };\n case 'bun':\n return {\n back: none,\n front: (x, y) => bangs(12, 1, 18)(x, y) || ellipse(C + s, 2.6, 4, 2.6)(x, y),\n };\n case 'pigtails':\n return {\n back: (x, y) =>\n ellipse(C + s - 11.5, 21, 3, 4.4)(x, y) || ellipse(C + s + 11.5, 21, 3, 4.4)(x, y),\n front: bangs(13, 1, 21),\n ties: [\n [C + s - 12, 16],\n [C + s + 11, 16],\n ],\n };\n case 'afro':\n return { back: ellipse(C + b, 12, 15, 11.5), front: (x, y) => cap(x, y) && y <= 8 };\n case 'twintails':\n case 'drills':\n return {\n back: (x, y) =>\n y >= 8 &&\n (ellipse(C + s - 13.2, 20, 2.3, 12)(x, y) || ellipse(C + s + 13.2, 20, 2.3, 12)(x, y)),\n front: bangs(13, 1, 24),\n ties: [\n [C + s - 13, 9],\n [C + s - 12, 9],\n [C + s + 11, 9],\n [C + s + 12, 9],\n ],\n bands: recipe.hair === 'drills',\n };\n case 'ponytail':\n return {\n back: (x, y) => ellipse(C + s + 11.5, 19, 3, 9)(x, y) && y >= 8,\n front: bangs(12, 1, 20),\n ties: [\n [C + s + 10, 9],\n [C + s + 11, 9],\n ],\n };\n case 'sidetail':\n return {\n back: (x, y) => ellipse(C + s - 11.5, 21, 3, 8)(x, y) && y >= 12,\n front: (x, y) =>\n cap(x, Math.min(y, 13)) &&\n (y <= 9 + Math.max(0, (C + s - x) * 0.45) || (Math.abs(x + 0.5 - C - s) >= 7 && y <= 18)),\n ties: [\n [C + s - 13, 13],\n [C + s - 12, 13],\n ],\n };\n case 'hime':\n return {\n back: longBack(31),\n front: (x, y) =>\n cap(x, Math.min(y, 13)) && (y <= 12 || (Math.abs(x + 0.5 - C - s) >= 6.5 && y <= 24)),\n };\n case 'odango':\n return {\n back: none,\n front: (x, y) =>\n bangs(12, 1, 18)(x, y) ||\n ellipse(C + s - 8, 3.5, 3.3, 3)(x, y) ||\n ellipse(C + s + 8, 3.5, 3.3, 3)(x, y),\n };\n case 'messy':\n return {\n back: none,\n front: (x, y) =>\n cap(x, Math.max(y, 4)) &&\n y >= [2, 0, 3, 1, 2][(x + 50 - s) % 5]! &&\n bangs(11, 2, 17)(x, Math.max(y, 4)),\n };\n case 'wavy':\n return {\n back: (x, y) =>\n longBack(30)(x, y) ||\n (y >= 16 && y <= 30 && Math.abs(x + 0.5 - C - b) <= 12.4 + Math.sin(y * 0.9) * 0.9),\n front: bangs(12, 2, 25),\n };\n case 'braids':\n return {\n back: none,\n front: (x, y) =>\n bangs(13, 1, 20)(x, y) ||\n [C + s - 9.5, C + s + 9.5].some(\n (bx) =>\n y >= 20 && y <= 30 && Math.abs(x + 0.5 - bx) <= 1.6 - ((y + 1) % 3 === 0 ? 0.6 : 0),\n ),\n ties: [\n [C + s - 10, 30],\n [C + s + 9, 30],\n ],\n };\n case 'wolf':\n return {\n back: (x, y) => longBack(24, 11.8)(x, y) && (y < 20 || (x + y) % 3 !== 0),\n front: (x, y) =>\n cap(x, Math.max(y, 5)) &&\n y >= [1, 2, 0, 2][(x + 40 - s) % 4]! &&\n bangs(12, 2, 21)(x, Math.max(y, 5)),\n };\n case 'ahoge':\n return {\n back: longBack(23),\n front: (x, y) =>\n bangs(13, 1, 22)(x, y) ||\n [\n [0, 0],\n [1, 0],\n [1, 1],\n [2, 1],\n [2, 2],\n [1, 2],\n ].some(([ax, ay]) => x === Math.round(C + s) + ax! && y === ay! + 1),\n };\n }\n}\n\nfunction detailedHair(\n recipe: Recipe,\n s: number,\n b: number,\n): { back: Mask; front: Mask; ties?: Point[]; bands?: boolean; sides?: [Mask, Mask] } {\n const of = (style: Recipe['hair'] | undefined) =>\n hair({ ...recipe, hair: style ?? 'none' }, s, b);\n const bangs = of(recipe.bangs);\n const side = of(recipe.sideHair);\n const right = recipe.rightSideHair === undefined ? side : of(recipe.rightSideHair);\n const back = of(recipe.backHair);\n const length = (recipe.hairLength ?? 0) * 2;\n const lengthen =\n (mask: Mask): Mask =>\n (x, y) =>\n mask(x, y > 18 ? Math.round(y - length) : y);\n // Side pieces cover |dx| >= 7 below the crown; with a right piece, each side has its own.\n const sideOf =\n (sign: -1 | 1): Mask =>\n (x, y) =>\n y > 7 && sign * (x + 0.5 - C - s) >= 7 && lengthen((sign < 0 ? side : right).front)(x, y);\n return {\n front: (x, y) =>\n y <= 7\n ? bangs.front(x, y) || back.front(x, y)\n : Math.abs(x + 0.5 - C - s) < 7\n ? bangs.front(x, y)\n : lengthen((x + 0.5 - C - s < 0 ? side : right).front)(x, y),\n sides: [sideOf(-1), sideOf(1)],\n back: length === 0 ? back.back : lengthen(back.back),\n ...(back.ties ? { ties: back.ties } : {}),\n ...(back.bands ? { bands: back.bands } : {}),\n };\n}\n\nfunction outfit(recipe: Recipe, g: Grid, s: number): void {\n const shirt = recipe.shirtColor;\n const skin = recipe.skinColor;\n const dark = shade(shirt, 0.75);\n const light = mix(shirt, WHITE, 0.8);\n const half = (y: number) => 6.5 + (y - 24) * 1.15;\n const torso: Mask = (x, y) => y >= 24 && Math.abs(x + 0.5 - C - s * 0.5) <= half(y);\n const dx = (x: number) => x + 0.5 - C - s * 0.5;\n paint(g, (x, y) => y >= 22 && y <= 25 && Math.abs(dx(x)) <= 2.5, shade(skin, 0.85));\n paint(g, torso, shirt);\n const v =\n (depth: number, w: number): Mask =>\n (x, y) =>\n y >= 24 && y <= 24 + depth && Math.abs(dx(x)) <= w - (y - 24) * (w / (depth + 1));\n switch (recipe.outfit) {\n case 'tee':\n paint(g, v(1, 2.5), shade(skin, 0.85));\n break;\n case 'shirttie':\n paint(g, v(3, 4), light);\n paint(g, (x, y) => y >= 24 && Math.abs(dx(x)) <= 0.5 && y <= 28, '#d22a5a');\n break;\n case 'hoodie':\n paint(g, (x, y) => torso(x, y) && y === 24 && Math.abs(dx(x)) >= 3, dark);\n paint(\n g,\n (x, y) =>\n y >= 25 && y <= 27 && (Math.abs(dx(x) + 1.5) <= 0.5 || Math.abs(dx(x) - 1.5) <= 0.5),\n WHITE,\n );\n break;\n case 'turtleneck':\n paint(g, (x, y) => y >= 22 && y <= 25 && Math.abs(dx(x)) <= 3, shade(shirt, 0.88));\n break;\n case 'sailor':\n paint(g, (x, y) => torso(x, y) && y <= 26 && Math.abs(dx(x)) >= 2, '#2f3a5a');\n paint(g, (x, y) => torso(x, y) && y === 26 && Math.abs(dx(x)) >= 3, WHITE);\n sprite(g, ['R.R', '.R.'], Math.round(C + s * 0.5) - 2, 26, { R: '#e2565f' });\n break;\n case 'blazer':\n paint(g, v(4, 4), light);\n paint(\n g,\n (x, y) => torso(x, y) && y >= 24 && Math.abs(Math.abs(dx(x)) - (4 - (y - 24) * 0.8)) <= 0.5,\n dark,\n );\n sprite(g, ['G'], Math.round(C + s * 0.5), 28, { G: GOLD });\n break;\n case 'overalls':\n paint(g, torso, light);\n paint(g, (x, y) => torso(x, y) && (y >= 27 || Math.abs(Math.abs(dx(x)) - 4) <= 0.6), shirt);\n sprite(g, ['G....G'], Math.round(C + s * 0.5) - 3, 27, { G: GOLD });\n break;\n case 'dress':\n paint(g, (x, y) => torso(x, y) && y <= 25 && Math.abs(dx(x)) <= 4.5, WHITE);\n paint(\n g,\n (x, y) => torso(x, y) && y === 25 && Math.abs(dx(x)) <= 4.5 && x % 2 === 0,\n shade(WHITE, 0.86),\n );\n sprite(g, ['RR.RR', '.RRR.', 'R...R'], Math.round(C + s * 0.5) - 2, 25, { R: '#e5566a' });\n paint(g, (x, y) => torso(x, y) && y === 29, mix(shirt, WHITE, 0.5));\n break;\n case 'kimono':\n paint(\n g,\n (x, y) => torso(x, y) && y <= 28 && Math.abs(Math.abs(dx(x)) - (y - 23.5)) <= 0.6,\n WHITE,\n );\n paint(g, (x, y) => torso(x, y) && y >= 28, '#e2565f');\n paint(g, (x, y) => torso(x, y) && y === 28 && x % 3 === 0, GOLD);\n paint(\n g,\n (x, y) => torso(x, y) && y <= 27 && (x * 3 + y * 2) % 7 === 0,\n mix(shirt, WHITE, 0.45),\n );\n break;\n case 'cardigan':\n paint(g, v(5, 3.5), light);\n paint(g, (x, y) => torso(x, y) && Math.abs(Math.abs(dx(x)) - 2) <= 0.5 && y >= 25, dark);\n sprite(g, ['W', '.', 'W', '.', 'W'], Math.round(C + s * 0.5) - 3, 25, { W: WHITE });\n paint(g, (x, y) => torso(x, y) && y === 29, dark);\n break;\n case 'maid':\n paint(g, (x, y) => torso(x, y), '#2f2a3a');\n paint(g, (x, y) => torso(x, y) && y >= 25 && Math.abs(dx(x)) <= 4 - (y - 25) * 0.2, WHITE);\n paint(g, (x, y) => y === 24 && Math.abs(dx(x)) <= 4.5, WHITE);\n sprite(g, ['RR.RR', '.RRR.'], Math.round(C + s * 0.5) - 2, 24, { R: shirt });\n break;\n case 'jacket':\n paint(g, v(6, 4.5), WHITE);\n paint(\n g,\n (x, y) => torso(x, y) && Math.abs(Math.abs(dx(x)) - (4.5 - (y - 24) * 0.6)) <= 0.6,\n dark,\n );\n paint(g, (x, y) => torso(x, y) && y >= 27 && Math.abs(dx(x)) <= 0.5, '#9aa3ad');\n paint(\n g,\n (x, y) => torso(x, y) && y === 28 && Math.abs(dx(x)) >= half(y) - 2.5,\n mix(shirt, WHITE, 0.6),\n );\n break;\n }\n const neck = shade(skin, 0.85);\n for (let y = 24; y < N; y++)\n for (let x = 0; x < N; x++) {\n const cell = g[y]![x];\n if (!cell || cell === neck || !torso(x, y)) continue;\n const d = dx(x);\n const edge = half(y) - Math.abs(d);\n if (y === 24 && Math.abs(d) <= 4.5) g[y]![x] = shade(cell, 0.78);\n else if (y >= 26 && edge >= 1.6 && edge < 2.6) g[y]![x] = shade(cell, 0.82);\n else if (d > 0 && edge < 1.6) g[y]![x] = shade(cell, 0.84);\n else if (d < 0 && edge < 1.6 && y <= 26) g[y]![x] = mix(cell, WHITE, 0.28);\n else if (d < -2 && y <= 25) g[y]![x] = mix(cell, WHITE, 0.14);\n }\n}\n\nfunction accessory(recipe: Recipe, g: Grid, s: number, face: Mask): void {\n const shirt = recipe.shirtColor;\n const cap = ellipse(C + s, 14, 11.6, 11.2);\n switch (recipe.accessory) {\n case 'none':\n return;\n case 'beanie':\n paint(g, (x, y) => cap(x, y) && y <= 8, shirt);\n paint(g, (x, y) => cap(x, y) && (y === 8 || y === 9), shade(shirt, 0.78));\n paint(g, ellipse(C + s, 1.6, 2.2, 1.8), WHITE);\n return;\n case 'cap':\n paint(g, (x, y) => cap(x, y) && y <= 8, shirt);\n paint(\n g,\n (x, y) => y === 9 && x + 0.5 >= C + s - 10 && x + 0.5 <= C + s + 13,\n shade(shirt, 0.72),\n );\n return;\n case 'headphones': {\n const band = (x: number, y: number) =>\n ellipse(C + s, 14, 12, 11.6)(x, y) && !ellipse(C + s, 14, 10.8, 10.4)(x, y) && y <= 13;\n paint(g, band, '#5d5b66');\n paint(\n g,\n (x, y) =>\n y >= 12 &&\n y <= 19 &&\n (Math.abs(x + 0.5 - (C + s - 11)) <= 1.6 || Math.abs(x + 0.5 - (C + s + 11)) <= 1.6),\n '#e25d6a',\n );\n return;\n }\n case 'flower':\n sprite(g, ['.P.P.', 'PPYPP', '.PPP.'], Math.round(C + s) + 6, 3, { P: '#f59fba', Y: GOLD });\n return;\n case 'bow':\n sprite(g, ['RR.RR', 'RRrRR', 'RR.RR'], Math.round(C + s) + 6, 3, {\n R: '#e5566a',\n r: '#b83a50',\n });\n return;\n case 'earring': {\n const xs = [...Array(N).keys()].filter((x) => face(x, 19));\n if (xs.length) {\n sprite(g, ['G', 'G'], xs[0]! - 1, 20, { G: GOLD });\n sprite(g, ['G', 'G'], xs.at(-1)! + 1, 20, { G: GOLD });\n }\n return;\n }\n case 'crown':\n sprite(g, ['G.G.G.G', 'GGGGGGG', 'GrGbGrG'], Math.round(C + s) - 3, 0, {\n G: GOLD,\n r: '#e5566a',\n b: '#5a9be0',\n });\n return;\n case 'halo':\n paint(\n g,\n (x, y) => ellipse(C + s, 1.6, 6.5, 1.8)(x, y) && !ellipse(C + s, 1.6, 4.4, 0.8)(x, y),\n GOLD,\n );\n return;\n case 'catears': {\n const ear = ['X...', 'XX..', 'XPX.', 'XXXX'];\n sprite(g, ear, Math.round(C + s) - 9, 2, { X: recipe.hairColor, P: '#f4a3b5' });\n sprite(g, ear, Math.round(C + s) + 5, 2, { X: recipe.hairColor, P: '#f4a3b5' }, true);\n return;\n }\n case 'hairclip':\n sprite(g, ['CC.CC', '.CCC.'], Math.round(C + s) + 3, 9, { C: '#e5566a' });\n return;\n case 'horns': {\n const horn = ['.H', 'HH', 'Hh'];\n sprite(g, horn, Math.round(C + s) - 8, 1, { H: '#5b3a6e', h: '#7d5694' });\n sprite(g, horn, Math.round(C + s) + 6, 1, { H: '#5b3a6e', h: '#7d5694' }, true);\n return;\n }\n case 'beret':\n paint(g, (x, y) => ellipse(C + s + 1.5, 4.6, 10.5, 3.6)(x, y), shirt);\n paint(g, (x, y) => ellipse(C + s + 1.5, 4.6, 10.5, 3.6)(x, y) && y >= 6, shade(shirt, 0.78));\n paint(\n g,\n (x, y) => ellipse(C + s + 1.5, 4.6, 10.5, 3.6)(x, y) && y <= 2 && x + 0.5 < C + s,\n mix(shirt, WHITE, 0.3),\n );\n sprite(g, ['S'], Math.round(C + s) + 1, 0, { S: shade(shirt, 0.6) });\n return;\n case 'ribbon':\n sprite(g, ['RRR.RRR', 'RrRRRrR', 'RRR.RRR', '.R...R.'], Math.round(C + s) - 3, 0, {\n R: '#e5566a',\n r: '#f49aa8',\n });\n return;\n case 'headband':\n paint(\n g,\n (x, y) =>\n ellipse(C + s, 14, 11.2, 10.8)(x, y) && !ellipse(C + s, 14.2, 10.2, 9.8)(x, y) && y <= 8,\n shirt,\n );\n paint(\n g,\n (x, y) =>\n ellipse(C + s, 14, 11.2, 10.8)(x, y) && !ellipse(C + s, 14.2, 10.2, 9.8)(x, y) && y <= 5,\n mix(shirt, WHITE, 0.35),\n );\n return;\n case 'bunnyears': {\n const ear = ['WW', 'WP', 'WP', 'WP', 'WW'];\n sprite(g, ear, Math.round(C + s) - 6, 0, { W: '#f4f1ec', P: '#f4a3b5' });\n sprite(g, ear, Math.round(C + s) + 4, 0, { W: '#f4f1ec', P: '#f4a3b5' }, true);\n return;\n }\n case 'horseears': {\n const ear = ['.X.', 'XPX', 'XPX', 'XXX'];\n sprite(g, ear, Math.round(C + s) - 9, 1, { X: shade(recipe.hairColor, 0.9), P: '#f4a3b5' });\n sprite(g, ear, Math.round(C + s) + 6, 1, { X: shade(recipe.hairColor, 0.9), P: '#f4a3b5' });\n sprite(g, ['BB', 'BB'], Math.round(C + s) + 3, 7, { B: '#5a9be0' });\n return;\n }\n case 'flowercrown':\n for (const [fx, color] of [\n [-8, '#f59fba'],\n [-4, GOLD],\n [0, '#f4f1ec'],\n [4, '#f59fba'],\n [8, GOLD],\n ] as const)\n sprite(\n g,\n ['.F.', 'FCF', '.F.'],\n Math.round(C + s) + fx - 1,\n 4 + Math.round(Math.abs(fx) / 4),\n {\n F: color,\n C: color === GOLD ? '#e2565f' : GOLD,\n },\n );\n paint(\n g,\n (x, y) =>\n y === 6 + Math.round(Math.abs(x + 0.5 - C - s) / 4) &&\n Math.abs(x + 0.5 - C - s) <= 9 &&\n x % 2 === 1,\n '#5aa36b',\n );\n return;\n case 'witch':\n paint(g, (x, y) => y >= 6 && y <= 7 && Math.abs(x + 0.5 - C - s) <= 13, '#3a2f52');\n paint(\n g,\n (x, y) => y <= 6 && Math.abs(x + 0.5 - C - s - (6 - y) * 0.5) <= 1 + y * 0.9,\n '#4b3d6b',\n );\n paint(g, (x, y) => y === 5 && Math.abs(x + 0.5 - C - s - 0.5) <= 5.2, '#efb93f');\n return;\n case 'pins':\n sprite(g, ['Y.Y', '.Y.', 'Y.Y', '...', 'B.B', '.B.', 'B.B'], Math.round(C + s) + 6, 7, {\n Y: GOLD,\n B: '#5a9be0',\n });\n return;\n }\n}\n\nexport function pixelTileColor(hair: string): string {\n const [r, g, b] = channels(hair).map((v) => v / 255) as [number, number, number];\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const lightness = (max + min) / 2;\n const chroma = max - min;\n const saturation = chroma === 0 ? 0 : chroma / (1 - Math.abs(2 * lightness - 1));\n if (saturation < 0.18 || lightness > 0.86 || lightness < 0.16) return '#ece8e1';\n const hue =\n max === r\n ? ((g - b) / chroma + 6) % 6\n : max === g\n ? (b - r) / chroma + 2\n : (r - g) / chroma + 4;\n const s = Math.min(0.55, Math.max(0.35, saturation * 0.6));\n const l = 0.88;\n const f = (n: number) => {\n const k = (n + hue * 2) % 12;\n return l - s * Math.min(l, 1 - l) * Math.max(-1, Math.min(k - 3, 9 - k, 1));\n };\n return hex([f(0), f(8), f(4)].map((v) => v * 255));\n}\n\nexport function pixelFigure(\n recipe: Recipe,\n yawDeg: number,\n options: PixelFigureOptions = {},\n): { tile: string; body: string; head: string; cells: PixelCell[] } {\n const yaw = (yawDeg * Math.PI) / 180;\n const sinY = Math.sin(yaw);\n const s = Math.round(sinY * 3);\n const fs = Math.round(sinY * 10);\n const b = -Math.round(sinY * 3.5);\n const turned = Math.abs(sinY) >= 0.3;\n const d = Math.sign(sinY);\n const skin = recipe.skinColor;\n const hairColor = recipe.hairColor;\n const front = FACE[recipe.head](s * 0.5);\n const face: Mask = turned\n ? (x, y) => {\n const dx = x + 0.5 - C;\n const tuck = y >= 17 && d * dx > 4 ? Math.min(2, (y - 16) * 0.35) : 0;\n return front(x - Math.round(d * (1 + Math.max(0, y - 20) * 0.4) - d * tuck), y);\n }\n : front;\n const masks: ReturnType<typeof detailedHair> =\n recipe.bangs === undefined ? hair(recipe, s, b) : detailedHair(recipe, s, b);\n\n const body = blank();\n outfit(recipe, body, s);\n\n const back = blank();\n paint(back, masks.back, shade(hairColor, 0.82));\n if (masks.bands)\n paint(\n back,\n (x, y) => masks.back(x, y) && (y + Math.floor(x / 2)) % 4 === 0,\n shade(hairColor, 0.68),\n );\n\n const head = blank();\n paint(head, face, skin);\n const earY = 15;\n const edge = (side: number) => {\n const xs = [...Array(N).keys()].filter((x) => face(x, earY));\n return side < 0 ? xs[0]! - 1 : xs.at(-1)! + 1;\n };\n const goblin = recipe.species === 'goblin';\n if (goblin) {\n // Long pointed ears drawn over hair: the outer tip rises above the ear line.\n const ear = ['E...', 'EE..', '.EiE', '..Ee'];\n const pal = { E: skin, e: shade(skin, 0.86), i: shade(skin, 0.74) };\n paint(head, masks.front, hairColor);\n for (const ex of turned ? [-d] : [-1, 1])\n sprite(head, ear, ex < 0 ? edge(ex) - 3 : edge(ex), earY - 2, pal, ex > 0);\n } else if (!turned)\n for (const ex of [-1, 1])\n sprite(head, ['E', 'E', 'e'], edge(ex), earY, { E: skin, e: shade(skin, 0.86) });\n else\n sprite(head, ['EE', 'Ee', 'Ee', 'E.'], d > 0 ? edge(-d) - 1 : edge(-d), earY, {\n E: skin,\n e: shade(skin, 0.8),\n });\n if (!goblin) paint(head, masks.front, hairColor);\n for (const [x, y] of masks.ties ?? [])\n sprite(back, ['T'], Math.round(x), y, { T: shade(recipe.shirtColor, 0.8) });\n accessory(recipe, head, s, face);\n\n const shadeHair = (g: Grid) => {\n const out = g.map((r) => [...r]);\n const cells = g.flatMap((row, y) => row.flatMap((c, x) => (c === hairColor ? [[x, y]] : [])));\n const xs = cells.map(([x]) => x!);\n const ys = cells.map(([, y]) => y!);\n const left = Math.min(...xs);\n const right = Math.max(...xs);\n const top = Math.min(...ys);\n const mid = (left + right) / 2;\n const span = Math.max(1, (right - left) / 2);\n const light = mix(hairColor, WHITE, 0.2);\n const dark = shade(hairColor, 0.8);\n const middle = shade(hairColor, 0.9);\n for (const [x, y] of cells) {\n const side = (x! + 0.5 - mid) / span + (y! - top) * 0.025;\n if (side > 0.72) out[y!]![x!] = dark;\n else if (side > 0.42) out[y!]![x!] = middle;\n else if (side < -0.2 && y! <= top + 4) out[y!]![x!] = light;\n }\n for (const [x, y] of cells) {\n const nearFace = g[y!]![x! - 1] === skin || g[y!]![x! + 1] === skin;\n if (nearFace && y! >= 14) out[y!]![x!] = shade(hairColor, 0.74);\n else if (Math.abs(x! + 0.5 - C - s) >= 7.5 && y! >= 14 && (x! + 40 - s) % 3 === 0)\n out[y!]![x!] = shade(out[y!]![x!]!, 0.86);\n }\n for (let y = 1; y < N; y++)\n for (let x = 0; x < N; x++) {\n if (g[y]![x] !== skin) continue;\n if (g[y - 1]![x] === hairColor) out[y]![x] = mix(shade(skin, 0.84), BLUSH, 0.12);\n else if (x + 1 < N && g[y]![x + 1] !== skin && g[y]![x + 1] !== undefined && x > C + s)\n out[y]![x] = shade(skin, 0.9);\n else if (x + 1 < N && g[y]![x + 1] === undefined && x > C + s)\n out[y]![x] = shade(skin, 0.9);\n }\n for (let y = 0; y < N - 1; y++)\n for (let x = 0; x < N; x++)\n if (g[y]![x] === hairColor && g[y + 1]![x] === skin) out[y]![x] = shade(hairColor, 0.62);\n for (let x = 0; x < N; x++)\n for (let y = 3; y < N; y++)\n if (g[y]![x] === hairColor && g[y + 1]?.[x] === skin && (x + 40 - s) % 4 === 0)\n for (let k = 1; k <= 3; k++)\n if (g[y - k]?.[x] === hairColor) out[y - k]![x] = shade(hairColor, 0.72);\n const ring = mix(hairColor, WHITE, 0.45);\n for (let x = Math.round(C + s) - 7; x <= Math.round(C + s) + 3; x++) {\n const first = g.findIndex((row) => row[x] === hairColor);\n if (first < 0) continue;\n const y = first + 2 + Math.round(Math.abs(x + 0.5 - (C + s - 2)) / 4);\n if (g[y]?.[x] === hairColor && x % 3 !== 0) out[y]![x] = ring;\n }\n return out;\n };\n\n const figure = blank();\n for (const layer of [back, body, shadeHair(head)])\n for (let y = 0; y < N; y++)\n for (let x = 0; x < N; x++) if (layer[y]![x]) figure[y]![x] = layer[y]![x];\n\n const features = blank();\n const eyes = blank();\n const closed = blank();\n const glasses = blank();\n const sp = recipe.spacing ?? 0;\n const h = recipe.height ?? 0;\n const eyeTop = 15 + h;\n const eyeW = (side: -1 | 1) => (turned && Math.sign(fs) === side ? 3 : 4);\n const eyeX = (side: -1 | 1) => {\n const w = eyeW(side);\n return side < 0\n ? Math.round(C + fs * 0.6) - 6 - sp - (w === 3 ? -1 : 0)\n : Math.round(C + fs * 0.6) + 2 + sp;\n };\n const left = { x: eyeX(-1), w: eyeW(-1) };\n const right = { x: eyeX(1), w: eyeW(1) };\n const fit = (rows: readonly string[], w: number) =>\n rows.map((r) => r.slice(Math.max(0, r.length - w)));\n const pal = {\n K: INK,\n W: WHITE,\n D: shade(recipe.eyeColor, 0.55),\n I: recipe.eyeColor,\n L: mix(recipe.eyeColor, WHITE, 0.45),\n };\n const style = EYES[recipe.eyes];\n const extra = style[0]!.length - 4;\n sprite(eyes, fit(style, left.w + extra), left.x - extra, eyeTop, pal);\n sprite(\n eyes,\n recipe.eyes === 'wink' ? fit(CLOSED, right.w) : fit(style, right.w + extra),\n right.x,\n eyeTop,\n pal,\n true,\n );\n sprite(closed, fit(CLOSED, left.w), left.x, eyeTop, pal);\n sprite(closed, fit(CLOSED, right.w), right.x, eyeTop, pal, true);\n const browRows = BROWS[recipe.brows];\n if (browRows.length) {\n sprite(features, fit(browRows, left.w), left.x, eyeTop - 2, { B: shade(hairColor, 0.55) });\n sprite(\n features,\n fit(browRows, right.w),\n right.x,\n eyeTop - 2,\n { B: shade(hairColor, 0.55) },\n true,\n );\n }\n const cx = Math.round(C + fs * (turned ? 0.85 : 0.6));\n if (recipe.nose === 'dot') sprite(features, ['N'], cx, 18 + h, { N: shade(skin, 0.78) });\n if (recipe.nose === 'button') sprite(features, ['N'], cx, 18 + h, { N: shade(skin, 0.88) });\n if (recipe.nose === 'line') sprite(features, ['N', 'N'], cx, 17 + h, { N: shade(skin, 0.82) });\n const mx = C - 0.5 + fs * 0.6;\n const withMouth = (mouth: readonly string[]) => {\n const layer = features.map((row) => [...row]);\n sprite(layer, mouth, Math.round(mx - (mouth[0]!.length - 1) / 2), 20 + h, {\n K: MOUTH,\n M: MOUTH_INSIDE,\n T: TONGUE,\n W: WHITE,\n });\n if (recipe.species === 'goblin')\n for (const tx of [Math.round(mx - 2.5), Math.round(mx + 2.5)])\n sprite(layer, ['T'], tx, 21 + h, { T: TUSK });\n if (recipe.cheeks === 'blush') {\n sprite(layer, ['PP'], left.x - 1, 19 + h, { P: mix(BLUSH, skin, 0.25) });\n sprite(layer, ['PP'], right.x + right.w - 1, 19 + h, { P: mix(BLUSH, skin, 0.25) });\n }\n if (recipe.cheeks === 'freckles') {\n sprite(layer, ['F.F'], left.x, 19 + h, { F: shade(skin, 0.7) });\n sprite(layer, ['F.F'], right.x + 1, 19 + h, { F: shade(skin, 0.7) });\n }\n return layer;\n };\n const savedFeatures = withMouth(MOUTHS[recipe.mouth]);\n const featureMarkup = options.mouthLayers\n ? (\n [\n ['saved', MOUTHS[recipe.mouth]],\n ['closed', ['KKK']],\n ['half-open', ['KKK', 'MMM']],\n ['open', ['.K.', 'KMK', '.K.']],\n ] satisfies readonly [PixelMouthState, readonly string[]][]\n )\n .map(\n ([state, rows]) =>\n `<g data-avatar-mouth=\"${state}\" opacity=\"${state === 'saved' ? 1 : 0}\">${rects(withMouth(rows))}</g>`,\n )\n .join('')\n : rects(savedFeatures);\n const frame = (fx: number, w: number, round: boolean) =>\n paint(\n glasses,\n (x, y) => {\n const inside = x >= fx && x < fx + w && y >= eyeTop && y <= eyeTop + 3;\n const box = x >= fx - 1 && x <= fx + w && y >= eyeTop - 1 && y <= eyeTop + 4;\n const corner = (x === fx - 1 || x === fx + w) && (y === eyeTop - 1 || y === eyeTop + 4);\n return box && !inside && !(round && corner);\n },\n INK,\n );\n if (recipe.glasses === 'round' || recipe.glasses === 'square') {\n frame(left.x, left.w, recipe.glasses === 'round');\n frame(right.x, right.w, recipe.glasses === 'round');\n paint(glasses, (x, y) => y === eyeTop + 1 && x > left.x + left.w && x < right.x - 1, INK);\n }\n if (recipe.glasses === 'shades') {\n for (const e of [left, right])\n paint(\n glasses,\n (x, y) => x >= e.x - 1 && x <= e.x + e.w && y >= eyeTop && y <= eyeTop + 2,\n INK,\n );\n paint(glasses, (x, y) => y === eyeTop && x > left.x + left.w && x < right.x - 1, INK);\n for (const e of [left, right]) sprite(glasses, ['W'], e.x, eyeTop, { W: '#7d7b88' });\n }\n if (recipe.glasses === 'monocle') {\n frame(right.x, right.w, true);\n sprite(glasses, ['G', 'G', 'G'], right.x + right.w, eyeTop + 5, { G: GOLD });\n }\n\n const full = clip(outline(figure));\n AVATAR_PIECE_COLORS.forEach((key, i) => {\n const color = recipe[key];\n const mask = masks.sides?.[i];\n if (color === undefined || !mask || color.toLowerCase() === hairColor.toLowerCase()) return;\n const variant = blank();\n const plain = { ...recipe, hairColor: color };\n for (const k of AVATAR_PIECE_COLORS) delete plain[k];\n for (const cell of pixelFigure(plain, yawDeg).cells) variant[cell.y]![cell.x] = cell.c;\n const near = (x: number, y: number) =>\n mask(x, y) || mask(x - 1, y) || mask(x + 1, y) || mask(x, y - 1) || mask(x, y + 1);\n for (let y = 0; y < N; y++)\n for (let x = 0; x < N; x++)\n if (full[y]![x] && near(x, y) && !eyes[y]![x] && !glasses[y]![x])\n full[y]![x] = variant[y]![x];\n });\n const bodyCells = blank();\n const headCells = blank();\n for (let y = 0; y < N; y++)\n for (let x = 0; x < N; x++) {\n const c = full[y]![x];\n if (!c) continue;\n if (y >= 22 && !head[y]![x] && !back[y]![x]) bodyCells[y]![x] = c;\n else headCells[y]![x] = c;\n }\n const cells: PixelCell[] = [];\n for (let y = 0; y < N; y++)\n for (let x = 0; x < N; x++) {\n const c = glasses[y]![x] ?? eyes[y]![x] ?? savedFeatures[y]![x] ?? full[y]![x];\n if (c) cells.push({ x, y, c });\n }\n return {\n cells,\n tile: `<rect width=\"32\" height=\"32\" rx=\"6\" fill=\"${pixelTileColor(recipe.hairColor)}\"/>`,\n body: `<g class=\"bh-illustrated-body\">${rects(bodyCells)}</g>`,\n head: [\n `<g class=\"bh-illustrated-head\">${rects(headCells)}`,\n `<g class=\"bh-illustrated-face\">${featureMarkup}`,\n `<g class=\"bh-illustrated-gaze\">${rects(eyes)}</g>`,\n `<g class=\"bh-illustrated-blink\" opacity=\"0\">${rects(closed)}</g>`,\n `${rects(glasses)}</g></g>`,\n ].join(''),\n };\n}\n","import type { PixelCell } from '@botharness/pixel-morph';\nimport { pixelFigure } from './figure.js';\nimport { isPixelAvatarRecipe, type PixelAvatarRecipe } from './recipe.js';\n\nconst YAW = { front: 0, left: -25, right: 25 } as const;\n\n/** Head-turn offsets (degrees) the thinking animation cycles through. */\nexport const AVATAR_TURNS = [-14, -7, 7, 14] as const;\n\nexport interface PixelAvatarSvgOptions {\n mouthLayers?: boolean;\n /** Extra yaw offsets to pre-render as hidden `[data-avatar-turn]` layers. */\n turns?: readonly number[];\n /** Class prefix for the rig layers (`-body`, `-head`, `-face`, `-gaze`, `-blink`). */\n classPrefix?: string;\n}\n\n/** Every visible pixel of the face at its pose, in paint order, for morphing. */\nexport function faceCells(recipe: PixelAvatarRecipe): PixelCell[] {\n return pixelFigure(recipe, YAW[recipe.pose]).cells;\n}\n\n/** A 32×32 SVG of the avatar: tile, body, head rig, optional turn layers and an empty morph layer. */\nexport function pixelAvatarSvg(\n recipe: PixelAvatarRecipe,\n options: PixelAvatarSvgOptions = {},\n): string {\n if (!isPixelAvatarRecipe(recipe)) throw new Error('invalid Avatar recipe');\n const base = pixelFigure(recipe, YAW[recipe.pose], options);\n const turns = (options.turns ?? [])\n .map((delta) => {\n const figure = pixelFigure(recipe, YAW[recipe.pose] + delta, options);\n const layers = `${figure.body}${figure.head}`.replaceAll(\n 'class=\"bh-illustrated-',\n 'data-turn-part=\"',\n );\n return `<g data-avatar-turn=\"${delta}\" opacity=\"0\">${layers}</g>`;\n })\n .join('');\n const svg = [\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\" width=\"512\" height=\"512\" shape-rendering=\"crispEdges\" aria-hidden=\"true\">',\n base.tile,\n base.body,\n base.head,\n turns,\n '<g data-avatar-pixel-morph=\"\"></g>',\n '</svg>',\n ].join('');\n const prefix = options.classPrefix;\n return prefix === undefined || prefix === 'bh-illustrated'\n ? svg\n : svg.replaceAll('class=\"bh-illustrated-', `class=\"${prefix}-`);\n}\n","import type { PixelCell } from '@botharness/pixel-morph';\n\nconst SYMBOLS = {\n thinking: [\n '........................',\n '........................',\n '........................',\n '...........AAAA.........',\n '..........AAAAAA........',\n '.........AAAAAAAA.......',\n '.......AAAAAAAAAAA......',\n '.....AAAAAAAAAAAAA......',\n '....AAAAAAAAAAAAAAAA....',\n '....AAAAAAAAAAAAAAAAA...',\n '...AAAAAAAAAAAAAAAAAAA..',\n '...AAAAHHAAAHHAAAHHAAA..',\n '....AAAHHAAAHHAAAHHAAA..',\n '....AAAAAAAAAAAAAAAAAA..',\n '.....AAAAAAAAAAAAAAAA...',\n '.....AAAAAAAAAAAAAAA....',\n '.......AAAAAAAAAAA......',\n '........................',\n '....AA..................',\n '...AAAA.................',\n '...AAAA.................',\n '..A.AA..................',\n '.AAA....................',\n '..A.....................',\n ],\n ask: [\n '........................',\n '........................',\n '...........AAA..........',\n '........AAAAAAAA........',\n '.......AAAAAAAAAA.......',\n '.......AAAAAAAAAA.......',\n '......AAAAA...AAAA......',\n '......AAAA....AAAA......',\n '......AAA.....AAAA......',\n '......AAA.....AAAA......',\n '..............AAAA......',\n '.............AAAAA......',\n '............AAAAA.......',\n '...........AAAAA........',\n '...........AAA..........',\n '..........AAAA..........',\n '..........AAAA..........',\n '...........AA...........',\n '........................',\n '..........AAAA..........',\n '..........AAAA..........',\n '..........AAAA..........',\n '...........AA...........',\n '........................',\n ],\n read: [\n '........................',\n '........................',\n '........................',\n '........................',\n '..AAAAAAA......AAAAAAA..',\n '.AAAAAAAAAA..AAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAHHHHHAAAAAAHHHHHAAA.',\n '.AAAHHHHHAAAAAAHHHHHAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAHHHHHAAAAAAHHHHHAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '...........AA...........',\n '........................',\n '........................',\n '........................',\n '........................',\n '........................',\n ],\n write: [\n '........................',\n '.....AAAAAAAAAA.........',\n '....AAAAAAAAAAAA........',\n '....AAAAAAAAAAAAA.......',\n '....AAAAAAAAAAAAAA......',\n '....AAAAAAAAAAAAAAA.....',\n '....AAAAAAAAAAAAAAAA....',\n '....AAAAAAAAAAAAAAAA....',\n '....AAAAAAAAAAAAAAAA....',\n '....AAAAAAAHHAAAAAAA....',\n '....AAAAAAAHHAAAAAAA....',\n '....AAAAAAAHHAAAAAAA....',\n '....AAAAAAAHHAAAAAAA....',\n '....AAAHHHHHHHHHHAAA....',\n '....AAAAAAAHHAAAAAAA....',\n '....AAAAAAAHHAAAAAAA....',\n '....AAAAAAAHHAAAAAAA....',\n '....AAAAAAAHHAAAAAAA....',\n '....AAAAAAAAAAAAAAAA....',\n '....AAAAAAAAAAAAAAAA....',\n '....AAAAAAAAAAAAAAAA....',\n '....AAAAAAAAAAAAAAAA....',\n '.....AAAAAAAAAAAAAA.....',\n '........................',\n ],\n edit: [\n '........................',\n '........................',\n '........................',\n '...............AA.......',\n '.............HHAAA......',\n '.............HHHAAA.....',\n '............AAHHHAAA....',\n '...........AAAAHHHAAA...',\n '..........AAAAAAHHHAA...',\n '.........AAAAAAAAHHH....',\n '........AAAAAAAAAAHH....',\n '.......AAAAAAAAAAA......',\n '......AAAAAAAAAAA.......',\n '.....AAAAAAAAAAA........',\n '....AAAAAAAAAAA.........',\n '...AAAAAAAAAAA..........',\n '...AAHHAAAAAA...........',\n '...AAHHHAAAA............',\n '...AAAHHAAA.............',\n '...AAAAAAA..............',\n '...AAAAAA...............',\n '........................',\n '........................',\n '........................',\n ],\n bash: [\n '........................',\n '........................',\n '........................',\n '....AAAAAAAAAAAAAAAA....',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAHHAAAAAAAAAAAAAAAA.',\n '.AAAAHHHAAAAAAAAAAAAAAA.',\n '.AAAAAHHHAAAAAAAAAAAAAA.',\n '.AAAAAAHHHAAAAAAAAAAAAA.',\n '.AAAAAAHHHAAAAAAAAAAAAA.',\n '.AAAAAHHHAAAAAAAAAAAAAA.',\n '.AAAAHHHAAAAAAAAAAAAAAA.',\n '.AAAAHHAAAAHHHHHHHAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '....AAAAAAAAAAAAAAAA....',\n '........................',\n '........................',\n '........................',\n ],\n search: [\n '........................',\n '........................',\n '.......AAAAAA...........',\n '......AAAAAAAA..........',\n '....AAAAAAAAAAAA........',\n '....AAAAAAAAAAAA........',\n '...AAAA......AAAA.......',\n '..AAAA........AAAA......',\n '..AAAA........AAAA......',\n '..AAAA........AAAA......',\n '..AAAA........AAAA......',\n '..AAAA........AAAA......',\n '..AAAA........AAAA......',\n '...AAAA......AAAA.......',\n '....AAAAAAAAAAAAA.......',\n '....AAAAAAAAAAAAAA......',\n '......AAAAAAAAAAAAA.....',\n '.......AAAAAA..AAAAA....',\n '................AAAAA...',\n '.................AAAAA..',\n '..................AAAAA.',\n '...................AAAA.',\n '....................AA..',\n '........................',\n ],\n web: [\n '........................',\n '........................',\n '.........AHHHHA.........',\n '.......AAHHHHHHAA.......',\n '.....AAAAHHAAHHAAAA.....',\n '....AAAAHHAAAAHHAAAA....',\n '....HHHHHHHHHHHHHHHH....',\n '...AHHHHHHHHHHHHHHHHA...',\n '...AAAAAHAAAAAAHAAAAA...',\n '..AAAAAHHAAAAAAHAAAAAA..',\n '..AAAAAHHAAAAAAHHAAAAA..',\n '..HHHHHHHHHHHHHHHHHHHH..',\n '..HHHHHHHHHHHHHHHHHHHH..',\n '..AAAAAHHAAAAAAHHAAAAA..',\n '..AAAAAHHAAAAAAHAAAAAA..',\n '...AAAAAHAAAAAAHAAAAA...',\n '...AHHHHHHHHHHHHHHHHA...',\n '....HHHHHHHHHHHHHHHH....',\n '....AAAAHHAAAAHHAAAA....',\n '.....AAAAHHAAHHAAAA.....',\n '.......AAHHHHHHAA.......',\n '.........AHHHHA.........',\n '........................',\n '........................',\n ],\n fetch: [\n '........................',\n '..........AAA...........',\n '..........AAAA..........',\n '..........AAAA..........',\n '..........AAAA..........',\n '..........AAAA..........',\n '..........AAAA..........',\n '.....AA...AAAA...AA.....',\n '....AAAA..AAAA..AAAA....',\n '....AAAAA.AAAA.AAAAA....',\n '.....AAAAAAAAAAAAAA.....',\n '......AAAAAAAAAAAA......',\n '.......AAAAAAAAAA.......',\n '........AAAAAAAA........',\n '.........AAAAAA.........',\n '..AAA.....AAAA.....AAA..',\n '..AAA......AA......AAA..',\n '..AAA..............AAA..',\n '..AAA..............AAA..',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '...AAAAAAAAAAAAAAAAAA...',\n '........................',\n ],\n todo: [\n '........................',\n '........................',\n '....AAAAAAAAAAAAAAAA....',\n '....AAAAAAAAAAAAAAAA....',\n '...AAAAAAAAAAAAAAAAAA...',\n '...AAAAAAAAAAAAAAAAAA...',\n '...AAAAAAAAHAAAAAAAAA...',\n '...AAAAAAAHHAAAAAAAAA...',\n '...AAAHHAHHAAHHHHHAAA...',\n '...AAAAHHHAAAHHHHHAAA...',\n '...AAAAAHAAAAAAAAAAAA...',\n '...AAAAAAAAAAAAAAAAAA...',\n '...AAAAAAAAAAAAAAAAAA...',\n '...AAAAAAAAHAAAAAAAAA...',\n '...AAAAAAAHHAAAAAAAAA...',\n '...AAAHHAHHAAHHHHHAAA...',\n '...AAAAHHHAAAHHHHHAAA...',\n '...AAAAAHAAAAAAAAAAAA...',\n '...AAAAAAAAAAAAAAAAAA...',\n '...AAAAAAAAAAAAAAAAAA...',\n '...AAAAAAAAAAAAAAAAAA...',\n '....AAAAAAAAAAAAAAAA....',\n '.....AAAAAAAAAAAAAA.....',\n '........................',\n ],\n subagent: [\n '........................',\n '........................',\n '........................',\n '........................',\n '.....AAAA......AAAA.....',\n '....AAAAAA....AAAAAA....',\n '....AAAAAAA..AAAAAAA....',\n '....AAAAAAA..AAAAAAA....',\n '....AAAAAAA..AAAAAAA....',\n '....AAAAAA...AAAAAAA....',\n '.....AAAAA....AAAAA.....',\n '........................',\n '........................',\n '........................',\n '.......A................',\n '....AAAAAAA..AAAAAAA....',\n '...AAAAAAAAAAAAAAAAAA...',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '........................',\n '........................',\n '........................',\n ],\n workflow: [\n '........................',\n '........................',\n '........................',\n '..AAAAAA.........AAAAA..',\n '..AAAAAA........AAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAA....AAA.AAAAAAA.',\n '..AAAAAA....AAA..AAAAA..',\n '............AAA.........',\n '............AAA.........',\n '............AAA.........',\n '............AAA.........',\n '............AAA..AAAAA..',\n '............AAA.AAAAAAA.',\n '.............AAAAAAAAAA.',\n '.............AAAAAAAAAA.',\n '...............AAAAAAAA.',\n '................AAAAAAA.',\n '.................AAAAA..',\n '........................',\n '........................',\n '........................',\n ],\n goal: [\n '........................',\n '....AA..................',\n '...AAAA.................',\n '...AAAAAAAAAAAAAAAAA....',\n '...AAAAAAAAAAAAAAAA.....',\n '...AAAAAAAAAAAAAAA......',\n '...AAAAAAAAAAAAAAA......',\n '...AAAAAAAAAAAAAA.......',\n '...AAAAAAAAAAAAAA.......',\n '...AAAAAAAAAAAAAAA......',\n '...AAAAAAAAAAAAAAAA.....',\n '...AAAAAAAAAAAAAAAAA....',\n '...AAAA.................',\n '...AAAA.................',\n '...AAAA.................',\n '...AAAA.................',\n '...AAAA.................',\n '...AAAA.................',\n '...AAAA.................',\n '...AAAA.................',\n '...AAAA.................',\n '...AAAA.................',\n '...AAAA.................',\n '....AA..................',\n ],\n present: [\n '........................',\n '........................',\n '...AAAAAAAAAAAAAAAAAA...',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '.AAAAAAAAAAAAAAAAAHAAAA.',\n '.AAAAAAAAAAAAAAAAAHAAAA.',\n '.AAAAAAAAAHAAAAAAAHAAAA.',\n '.AAAAAAAAAHAAAHAAAHAAAA.',\n '.AAAAAHAAAHAAAHAAAHAAAA.',\n '.AAAAAHAAAHAAAHAAAHAAAA.',\n '.AAAAAHAAAHAAAHAAAHAAAA.',\n '.AAAAAHAAAHAAAHAAAHAAAA.',\n '.AAAAAHAAAHAAAHAAAHAAAA.',\n '.AAAAAAAAAAAAAAAAAAAAAA.',\n '..AAAAAAAAAAAAAAAAAAAA..',\n '...AAAAAAAAAAAAAAAAAA...',\n '.........AAAAAA.........',\n '........AAAAAAAA........',\n '........AAA..AAA........',\n '.......AAA....AAA.......',\n '.......AAA....AAA.......',\n '.......AA......AA.......',\n '........................',\n ],\n approval: [\n '........................',\n '........................',\n '.........AAAAAA.........',\n '......AAAAAAAAAAAA......',\n '....AAAAAAAAAAAAAAAA....',\n '...AAAAAAAAHHAAAAAAAA...',\n '...AAAAAAAAHHAAAAAAAA...',\n '...AAAAAAAAHHAAAAAAAA...',\n '...AAAAAAAAHHAAAAAAAA...',\n '...AAAAAAAAHHAAAAAAAA...',\n '...AAAAAAAAHHAAAAAAAA...',\n '...AAAAAAAAHHAAAAAAAA...',\n '...AAAAAAAAHHAAAAAAAA...',\n '....AAAAAAAHHAAAAAAA....',\n '....AAAAAAAAAAAAAAAA....',\n '....AAAAAAAAAAAAAAAA....',\n '.....AAAAAAHHAAAAAA.....',\n '.....AAAAAAHHAAAAAA.....',\n '......AAAAAAAAAAAA......',\n '.......AAAAAAAAAA.......',\n '........AAAAAAAA........',\n '.........AAAAA..........',\n '...........AA...........',\n '........................',\n ],\n other: [\n '........................',\n '........................',\n '........................',\n '...........AA...........',\n '...........AA...........',\n '..........AAAA..........',\n '..........AAAA..........',\n '..........AAAA..........',\n '.........AAAAAA.........',\n '........AAAAAAAA........',\n '.....AAAAAAAAAAAAAA.....',\n '...AAAAAAAAAAAAAAAAAA...',\n '...AAAAAAAAAAAAAAAAAA...',\n '.....AAAAAAAAAAAAAA.....',\n '........AAAAAAAA........',\n '.........AAAAAA.........',\n '..........AAAA..........',\n '..........AAAA..........',\n '..........AAAA..........',\n '...........AA...........',\n '...........AA...........',\n '........................',\n '........................',\n '........................',\n ],\n} as const satisfies Record<string, readonly string[]>;\n\nexport type PixelSymbol = keyof typeof SYMBOLS;\nexport const PIXEL_SYMBOLS = Object.keys(SYMBOLS) as PixelSymbol[];\n\nconst INK = '#2a2230';\nconst channels = (color: string) => {\n const n = Number.parseInt(color.slice(1), 16);\n return [16, 8, 0].map((bit) => (n >> bit) & 255);\n};\nconst mix = (base: string, tint: string, k: number) => {\n const t = channels(tint);\n return `#${channels(base)\n .map((v, i) =>\n Math.round(v * (1 - k) + t[i]! * k)\n .toString(16)\n .padStart(2, '0'),\n )\n .join('')}`;\n};\n\nexport function pixelSymbolCells(symbol: PixelSymbol, color: string): PixelCell[] {\n return symbolArtCells(SYMBOLS[symbol], color);\n}\n\n/**\n * Colours a 24×24 character-art symbol (`A` body, `H` highlight, anything else empty) into\n * cells on the 32 grid: the body in `color`, highlights lighter, the lower-right edge darker,\n * and a one-pixel ink outline. This is how every built-in symbol is drawn, so a host can add\n * its own symbols in the same style without touching the package.\n */\nexport function symbolArtCells(rows: readonly string[], color: string): PixelCell[] {\n const body = new Map<string, 'A' | 'H'>();\n rows.forEach((row, y) =>\n [...row].forEach((code, x) => {\n if (code === 'A' || code === 'H') body.set(`${x + 4},${y + 4}`, code);\n }),\n );\n const light = mix(color, '#ffffff', 0.75);\n const low = mix(color, INK, 0.25);\n const cells: PixelCell[] = [];\n for (const [key, code] of body) {\n const [x, y] = key.split(',').map(Number) as [number, number];\n const edge = x + y > 34 && !body.has(`${x + 1},${y + 1}`);\n cells.push({ x, y, c: code === 'H' ? light : edge ? low : color });\n }\n const outline = new Set<string>();\n for (const key of body.keys()) {\n const [x, y] = key.split(',').map(Number) as [number, number];\n for (const [dx, dy] of [\n [1, 0],\n [-1, 0],\n [0, 1],\n [0, -1],\n ] as const) {\n const next = `${x + dx},${y + dy}`;\n if (body.has(next) || outline.has(next)) continue;\n outline.add(next);\n cells.push({ x: x + dx, y: y + dy, c: INK });\n }\n }\n return cells;\n}\n"],"mappings":"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Q,IAAI,OAAO,QAAQ,OAAO,QAAQ;AAKrE,SAAO,wBAAwB,MAAM,gBAJtB,GAAG,OAAO,OAAO,OAAO,OAAO,WAC5C,2BACA,oBACD,CAC2D;GAC5D,CACD,KAAK,GAAG;CACX,MAAM,MAAM;EACV;EACA,KAAK;EACL,KAAK;EACL,KAAK;EACL;EACA;EACA;EACD,CAAC,KAAK,GAAG;CACV,MAAM,SAAS,QAAQ;AACvB,QAAO,WAAW,UAAa,WAAW,mBACtC,MACA,IAAI,WAAW,2BAA0B,UAAU,OAAO,GAAG;;;;;ACjDnE,MAAM,UAAU;CACd,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,KAAK;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,KAAK;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACF;AAGD,MAAa,gBAAgB,OAAO,KAAK,QAAQ;AAEjD,MAAM,MAAM;AACZ,MAAM,YAAY,UAAkB;CAClC,MAAM,IAAI,OAAO,SAAS,MAAM,MAAM,EAAE,EAAE,GAAG;AAC7C,QAAO;EAAC;EAAI;EAAG;EAAE,CAAC,KAAK,QAAS,KAAK,MAAO,IAAI;;AAElD,MAAM,OAAO,MAAc,MAAc,MAAc;CACrD,MAAM,IAAI,SAAS,KAAK;AACxB,QAAO,IAAI,SAAS,KAAK,CACtB,KAAK,GAAG,MACP,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,KAAM,EAAE,CAChC,SAAS,GAAG,CACZ,SAAS,GAAG,IAAI,CACpB,CACA,KAAK,GAAG;;AAGb,SAAgB,iBAAiB,QAAqB,OAA4B;AAChF,QAAO,eAAe,QAAQ,SAAS,MAAM;;;;;;;;AAS/C,SAAgB,eAAe,MAAyB,OAA4B;CAClF,MAAM,uBAAO,IAAI,KAAwB;AACzC,MAAK,SAAS,KAAK,MACjB,CAAC,GAAG,IAAI,CAAC,SAAS,MAAM,MAAM;AAC5B,MAAI,SAAS,OAAO,SAAS,IAAK,MAAK,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,KAAK,KAAK;GACrE,CACH;CACD,MAAM,QAAQ,IAAI,OAAO,WAAW,IAAK;CACzC,MAAM,MAAM,IAAI,OAAO,KAAK,IAAK;CACjC,MAAM,QAAqB,EAAE;AAC7B,MAAK,MAAM,CAAC,KAAK,SAAS,MAAM;EAC9B,MAAM,CAAC,GAAG,KAAK,IAAI,MAAM,IAAI,CAAC,IAAI,OAAO;EACzC,MAAM,OAAO,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI;AACzD,QAAM,KAAK;GAAE;GAAG;GAAG,GAAG,SAAS,MAAM,QAAQ,OAAO,MAAM;GAAO,CAAC;;CAEpE,MAAM,0BAAU,IAAI,KAAa;AACjC,MAAK,MAAM,OAAO,KAAK,MAAM,EAAE;EAC7B,MAAM,CAAC,GAAG,KAAK,IAAI,MAAM,IAAI,CAAC,IAAI,OAAO;AACzC,OAAK,MAAM,CAAC,IAAI,OAAO;GACrB,CAAC,GAAG,EAAE;GACN,CAAC,IAAI,EAAE;GACP,CAAC,GAAG,EAAE;GACN,CAAC,GAAG,GAAG;GACR,EAAW;GACV,MAAM,OAAO,GAAG,IAAI,GAAG,GAAG,IAAI;AAC9B,OAAI,KAAK,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,CAAE;AACzC,WAAQ,IAAI,KAAK;AACjB,SAAM,KAAK;IAAE,GAAG,IAAI;IAAI,GAAG,IAAI;IAAI,GAAG;IAAK,CAAC;;;AAGhD,QAAO"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@botharness/pixel-avatar",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Seeded, editable 32×32 chibi pixel avatars with state symbols that morph in and out",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent-ui",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"./package.json": "./package.json"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@botharness/pixel-morph": "^0.
|
|
39
|
+
"@botharness/pixel-morph": "^0.2.0"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"tsdown": "^0.20.0",
|