@ignaciocabeza/bitface 1.0.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/LICENSE +21 -0
- package/README.md +305 -0
- package/dist/animations-BfYtmKFc.d.cts +53 -0
- package/dist/animations-BfYtmKFc.d.ts +53 -0
- package/dist/chunk-SCBE5EEX.js +1099 -0
- package/dist/chunk-SCBE5EEX.js.map +1 -0
- package/dist/index.cjs +1133 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +7 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/react.cjs +1155 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +17 -0
- package/dist/react.d.ts +17 -0
- package/dist/react.js +86 -0
- package/dist/react.js.map +1 -0
- package/dist/vue.cjs +1165 -0
- package/dist/vue.cjs.map +1 -0
- package/dist/vue.d.cts +45 -0
- package/dist/vue.d.ts +45 -0
- package/dist/vue.js +103 -0
- package/dist/vue.js.map +1 -0
- package/package.json +111 -0
- package/src/svelte/Avatar.svelte +59 -0
- package/src/svelte/Avatar.svelte.d.ts +15 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react.tsx","../src/renderer/parts/face-shapes.ts","../src/renderer/parts/eyes.ts","../src/renderer/parts/eyebrows.ts","../src/renderer/parts/mouth.ts","../src/renderer/parts/nose.ts","../src/renderer/parts/ears.ts","../src/renderer/parts/hair.ts","../src/renderer/parts/beard.ts","../src/renderer/parts/accessories.ts","../src/renderer/parts/index.ts","../src/renderer/palette.ts","../src/renderer/generator.ts","../src/renderer/svg.ts","../src/renderer/index.ts","../src/renderer/animations.ts"],"sourcesContent":["import { useMemo, useState, useEffect, useRef } from 'react';\nimport { generateFace, generateRandomConfig } from './renderer/index.ts';\nimport { ANIMATIONS } from './renderer/animations.ts';\nimport type { FaceConfig } from './types.ts';\nimport type { AnimationSequence } from './renderer/animations.ts';\n\nexport type { FaceConfig } from './types.ts';\nexport type { AnimationSequence } from './renderer/animations.ts';\nexport { generateRandomConfig } from './renderer/index.ts';\n\n/** Hook: returns SVG string, memoized on config changes. If no config is provided, a random face is generated once. */\nexport function useAvatar(config?: FaceConfig): string {\n const stableConfig = useRef<FaceConfig | undefined>(undefined);\n if (!config && !stableConfig.current) {\n stableConfig.current = generateRandomConfig();\n }\n const resolved = config ?? stableConfig.current!;\n\n return useMemo(() => generateFace(resolved), [\n resolved.faceShape,\n resolved.eyes,\n resolved.eyebrows,\n resolved.mouth,\n resolved.nose,\n resolved.ears,\n resolved.hair,\n resolved.beard,\n resolved.accessories,\n resolved.skinColor,\n resolved.hairColor,\n resolved.eyeColor,\n resolved.backgroundColor,\n ]);\n}\n\n/** Hook: cycles through animation frames, returns the current SVG string. */\nexport function useAnimatedAvatar(\n config: FaceConfig | undefined,\n animation: string | AnimationSequence | undefined,\n): string {\n const stableConfig = useRef<FaceConfig | undefined>(undefined);\n if (!config && !stableConfig.current) {\n stableConfig.current = generateRandomConfig();\n }\n const resolved = config ?? stableConfig.current!;\n\n const sequence = useMemo(() => {\n if (!animation) return undefined;\n if (typeof animation === 'string') return ANIMATIONS[animation];\n return animation;\n }, [animation]);\n\n const [frameIndex, setFrameIndex] = useState(0);\n\n // Reset frame when animation changes\n useEffect(() => {\n setFrameIndex(0);\n }, [sequence]);\n\n // Advance frames based on duration\n useEffect(() => {\n if (!sequence) return;\n const frame = sequence.frames[frameIndex];\n if (!frame) return;\n\n const timer = setTimeout(() => {\n setFrameIndex((i) => (i + 1) % sequence.frames.length);\n }, frame.duration);\n\n return () => clearTimeout(timer);\n }, [sequence, frameIndex]);\n\n const mergedConfig = useMemo(() => {\n if (!sequence) return resolved;\n const frame = sequence.frames[frameIndex];\n if (!frame) return resolved;\n return { ...resolved, ...frame.overrides };\n }, [resolved, sequence, frameIndex]);\n\n return useAvatar(mergedConfig);\n}\n\n/** Component: renders the avatar SVG inline, with optional animation. If no config is provided, a random face is generated. */\nexport function Avatar({\n config,\n size = 128,\n className,\n animation,\n}: {\n config?: FaceConfig;\n size?: number;\n className?: string;\n animation?: string | AnimationSequence;\n}) {\n const svg = useAnimatedAvatar(config, animation);\n return (\n <div\n className={className}\n style={{ width: size, height: size, imageRendering: 'pixelated' as const }}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n","import type { PartCategory } from '../../types.ts';\n\n// Face shapes are placed on a 16×16 canvas.\n// Slot map: 1 = skin, 2 = skinShadow\n\nconst faceShapes: PartCategory = {\n round: {\n pixels: [\n [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n ],\n slotMap: { 1: 'skin', 2: 'skinShadow' },\n offsetX: 0,\n offsetY: 3,\n },\n oval: {\n pixels: [\n [0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0],\n [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n [0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0],\n ],\n slotMap: { 1: 'skin', 2: 'skinShadow' },\n offsetX: 0,\n offsetY: 3,\n },\n square: {\n pixels: [\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n ],\n slotMap: { 1: 'skin', 2: 'skinShadow' },\n offsetX: 0,\n offsetY: 3,\n },\n heart: {\n pixels: [\n [0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0],\n [0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n [0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0],\n [0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0],\n ],\n slotMap: { 1: 'skin', 2: 'skinShadow' },\n offsetX: 0,\n offsetY: 3,\n },\n long: {\n pixels: [\n [0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0],\n [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n [0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0],\n [0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0],\n ],\n slotMap: { 1: 'skin', 2: 'skinShadow' },\n offsetX: 0,\n offsetY: 2,\n },\n diamond: {\n pixels: [\n [0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0],\n [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n [0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0],\n [0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0],\n ],\n slotMap: { 1: 'skin', 2: 'skinShadow' },\n offsetX: 0,\n offsetY: 3,\n },\n wide: {\n pixels: [\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\n [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\n [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\n [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\n [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n ],\n slotMap: { 1: 'skin', 2: 'skinShadow' },\n offsetX: 0,\n offsetY: 3,\n },\n};\n\nexport default faceShapes;\n","import type { PartCategory } from '../../types.ts';\n\n// Eyes are placed relative to face center.\n// Slot map: 1 = white (sclera), 2 = eyeColor (iris), 3 = pupil (black)\n\nconst eyes: PartCategory = {\n big: {\n pixels: [\n [1,1,0,0,0,0,1,1],\n [1,2,1,0,0,1,2,1],\n [1,2,3,0,0,1,2,3],\n [1,1,0,0,0,0,1,1],\n ],\n slotMap: { 1: 'white', 2: 'eyes', 3: 'pupil' },\n offsetX: 4,\n offsetY: 7,\n },\n small: {\n pixels: [\n [0,2,0,0,0,0,2,0],\n [0,3,0,0,0,0,3,0],\n ],\n slotMap: { 2: 'eyes', 3: 'pupil' },\n offsetX: 4,\n offsetY: 8,\n },\n narrow: {\n pixels: [\n [1,2,3,0,0,1,2,3],\n ],\n slotMap: { 1: 'white', 2: 'eyes', 3: 'pupil' },\n offsetX: 4,\n offsetY: 8,\n },\n round: {\n pixels: [\n [0,1,0,0,0,0,1,0],\n [1,2,1,0,0,1,2,1],\n [1,2,3,0,0,1,2,3],\n [0,1,0,0,0,0,1,0],\n ],\n slotMap: { 1: 'white', 2: 'eyes', 3: 'pupil' },\n offsetX: 4,\n offsetY: 7,\n },\n wink: {\n pixels: [\n [1,1,0,0,0,0,0,0],\n [1,2,1,0,0,0,0,0],\n [1,2,3,0,0,3,3,3],\n [1,1,0,0,0,0,0,0],\n ],\n slotMap: { 1: 'white', 2: 'eyes', 3: 'pupil' },\n offsetX: 4,\n offsetY: 7,\n },\n happy: {\n pixels: [\n [0,3,3,0,0,0,3,3],\n [3,0,0,0,0,3,0,0],\n ],\n slotMap: { 3: 'pupil' },\n offsetX: 4,\n offsetY: 8,\n },\n angry: {\n pixels: [\n [1,1,0,0,0,0,1,1],\n [1,2,3,0,0,3,2,1],\n [0,1,1,0,0,1,1,0],\n ],\n slotMap: { 1: 'white', 2: 'eyes', 3: 'pupil' },\n offsetX: 4,\n offsetY: 7,\n },\n dots: {\n pixels: [\n [0,0,3,0,0,0,0,3],\n ],\n slotMap: { 3: 'pupil' },\n offsetX: 4,\n offsetY: 9,\n },\n sleepy: {\n pixels: [\n [1,1,0,0,0,0,1,1],\n [3,3,0,0,0,0,3,3],\n ],\n slotMap: { 1: 'white', 3: 'pupil' },\n offsetX: 4,\n offsetY: 8,\n },\n cross: {\n pixels: [\n [3,0,3,0,0,3,0,3],\n [0,3,0,0,0,0,3,0],\n [3,0,3,0,0,3,0,3],\n ],\n slotMap: { 3: 'pupil' },\n offsetX: 4,\n offsetY: 7,\n },\n heart: {\n pixels: [\n [2,0,2,0,0,2,0,2],\n [2,2,2,0,0,2,2,2],\n [0,2,0,0,0,0,2,0],\n ],\n slotMap: { 2: 'eyes' },\n offsetX: 4,\n offsetY: 7,\n },\n};\n\nexport default eyes;\n","import type { PartCategory } from '../../types.ts';\n\n// Eyebrows sit above the eyes.\n// Slot map: 1 = hairColor (eyebrows match hair)\n\nconst eyebrows: PartCategory = {\n thick: {\n pixels: [\n [1,1,1,0,0,1,1,1],\n [1,1,1,0,0,1,1,1],\n ],\n slotMap: { 1: 'hair' },\n offsetX: 4,\n offsetY: 6,\n },\n thin: {\n pixels: [\n [1,1,1,0,0,1,1,1],\n ],\n slotMap: { 1: 'hair' },\n offsetX: 4,\n offsetY: 6,\n },\n arched: {\n pixels: [\n [0,1,1,0,0,0,1,1],\n [1,0,0,0,0,1,0,0],\n ],\n slotMap: { 1: 'hair' },\n offsetX: 4,\n offsetY: 5,\n },\n angry: {\n pixels: [\n [1,0,0,0,0,0,0,1],\n [0,1,1,0,0,1,1,0],\n ],\n slotMap: { 1: 'hair' },\n offsetX: 4,\n offsetY: 5,\n },\n worried: {\n pixels: [\n [0,0,1,0,0,1,0,0],\n [0,1,0,0,0,0,1,0],\n ],\n slotMap: { 1: 'hair' },\n offsetX: 4,\n offsetY: 5,\n },\n unibrow: {\n pixels: [\n [1,1,1,1,1,1,1,1],\n [1,1,0,0,0,0,1,1],\n ],\n slotMap: { 1: 'hair' },\n offsetX: 4,\n offsetY: 5,\n },\n none: {\n pixels: [],\n slotMap: {},\n offsetX: 0,\n offsetY: 0,\n },\n};\n\nexport default eyebrows;\n","import type { PartCategory } from '../../types.ts';\n\n// Mouth is placed below the nose.\n// Slot map: 1 = mouthColor (dark pink/red), 2 = teeth (white)\n\nconst mouth: PartCategory = {\n smile: {\n pixels: [\n [1,0,0,0,0,1],\n [0,1,1,1,1,0],\n ],\n slotMap: { 1: 'mouth' },\n offsetX: 5,\n offsetY: 12,\n },\n frown: {\n pixels: [\n [0,1,1,1,1,0],\n [1,0,0,0,0,1],\n ],\n slotMap: { 1: 'mouth' },\n offsetX: 5,\n offsetY: 12,\n },\n open: {\n pixels: [\n [0,1,1,1,1,0],\n [1,1,1,1,1,1],\n [0,1,1,1,1,0],\n ],\n slotMap: { 1: 'mouth' },\n offsetX: 5,\n offsetY: 11,\n },\n flat: {\n pixels: [\n [1,1,1,1,1,1],\n ],\n slotMap: { 1: 'mouth' },\n offsetX: 5,\n offsetY: 12,\n },\n teeth: {\n pixels: [\n [0,1,1,1,1,0],\n [0,2,2,2,2,0],\n [0,1,1,1,1,0],\n ],\n slotMap: { 1: 'mouth', 2: 'white' },\n offsetX: 5,\n offsetY: 11,\n },\n smirk: {\n pixels: [\n [0,0,0,0,1,0],\n [0,1,1,1,0,0],\n ],\n slotMap: { 1: 'mouth' },\n offsetX: 5,\n offsetY: 12,\n },\n grin: {\n pixels: [\n [0,1,1,1,1,1,1,0],\n [0,1,2,2,2,2,1,0],\n [0,0,1,1,1,1,0,0],\n ],\n slotMap: { 1: 'mouth', 2: 'white' },\n offsetX: 4,\n offsetY: 11,\n },\n tongue: {\n pixels: [\n [0,1,1,1,1,0],\n [0,0,1,1,0,0],\n [0,0,0,1,0,0],\n ],\n slotMap: { 1: 'mouth' },\n offsetX: 5,\n offsetY: 12,\n },\n oh: {\n pixels: [\n [0,1,1,0],\n [1,0,0,1],\n [0,1,1,0],\n ],\n slotMap: { 1: 'mouth' },\n offsetX: 6,\n offsetY: 11,\n },\n};\n\nexport default mouth;\n","import type { PartCategory } from '../../types.ts';\n\n// Nose sits between eyes and mouth.\n// Slot map: 1 = skinShadow (nose is a subtle shadow on skin)\n\nconst nose: PartCategory = {\n small: {\n pixels: [\n [0,1,0],\n [1,0,1],\n ],\n slotMap: { 1: 'skinShadow' },\n offsetX: 7,\n offsetY: 10,\n },\n pointy: {\n pixels: [\n [0,1,0],\n [0,1,0],\n [1,0,1],\n ],\n slotMap: { 1: 'skinShadow' },\n offsetX: 7,\n offsetY: 9,\n },\n wide: {\n pixels: [\n [0,1,1,0],\n [1,0,0,1],\n [1,0,0,1],\n ],\n slotMap: { 1: 'skinShadow' },\n offsetX: 6,\n offsetY: 9,\n },\n button: {\n pixels: [\n [1,1],\n ],\n slotMap: { 1: 'skinShadow' },\n offsetX: 7,\n offsetY: 10,\n },\n long: {\n pixels: [\n [0,1,0],\n [0,1,0],\n [0,1,0],\n [1,0,1],\n ],\n slotMap: { 1: 'skinShadow' },\n offsetX: 7,\n offsetY: 8,\n },\n snub: {\n pixels: [\n [0,1],\n [1,1],\n ],\n slotMap: { 1: 'skinShadow' },\n offsetX: 7,\n offsetY: 10,\n },\n};\n\nexport default nose;\n","import type { PartCategory } from '../../types.ts';\n\n// Ears sit on the sides of the face.\n// Slot map: 1 = skin, 2 = skinShadow\n\nconst ears: PartCategory = {\n small: {\n pixels: [\n [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],\n [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],\n [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2],\n ],\n slotMap: { 1: 'skin', 2: 'skinShadow' },\n offsetX: 0,\n offsetY: 8,\n },\n big: {\n pixels: [\n [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],\n [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],\n [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],\n [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2],\n [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],\n ],\n slotMap: { 1: 'skin', 2: 'skinShadow' },\n offsetX: 0,\n offsetY: 7,\n },\n pointed: {\n pixels: [\n [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],\n [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],\n [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],\n [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],\n [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2],\n ],\n slotMap: { 1: 'skin', 2: 'skinShadow' },\n offsetX: 0,\n offsetY: 5,\n },\n elf: {\n pixels: [\n [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],\n [1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1],\n [1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1],\n [1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1],\n [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],\n [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2],\n ],\n slotMap: { 1: 'skin', 2: 'skinShadow' },\n offsetX: 0,\n offsetY: 4,\n },\n none: {\n pixels: [],\n slotMap: {},\n offsetX: 0,\n offsetY: 0,\n },\n};\n\nexport default ears;\n","import type { PartCategory } from '../../types.ts';\n\n// Hair is drawn on top of the face at the head area.\n// Slot map: 1 = hair, 2 = hairShadow\n\nconst hair: PartCategory = {\n short: {\n pixels: [\n [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,1,2,2,0,0,0,0,0,0,0,0,2,2,1,0],\n ],\n slotMap: { 1: 'hair', 2: 'hairShadow' },\n offsetX: 0,\n offsetY: 2,\n },\n long: {\n pixels: [\n [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,1,1,2,0,0,0,0,0,0,0,0,2,1,1,0],\n [0,1,2,0,0,0,0,0,0,0,0,0,0,2,1,0],\n [0,1,2,0,0,0,0,0,0,0,0,0,0,2,1,0],\n [0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0],\n [0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0],\n [0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0],\n [0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0],\n [0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0],\n [0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0],\n ],\n slotMap: { 1: 'hair', 2: 'hairShadow' },\n offsetX: 0,\n offsetY: 2,\n },\n curly: {\n pixels: [\n [0,0,0,1,0,1,1,1,1,1,1,0,1,0,0,0],\n [0,0,1,0,1,1,1,1,1,1,1,1,0,1,0,0],\n [0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1],\n [1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1],\n [0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0],\n [1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1],\n [0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0],\n ],\n slotMap: { 1: 'hair', 2: 'hairShadow' },\n offsetX: 0,\n offsetY: 1,\n },\n mohawk: {\n pixels: [\n [0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0],\n [0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0],\n [0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0],\n [0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0],\n [0,0,0,0,0,2,1,1,1,1,2,0,0,0,0,0],\n ],\n slotMap: { 1: 'hair', 2: 'hairShadow' },\n offsetX: 0,\n offsetY: 0,\n },\n bald: {\n pixels: [],\n slotMap: {},\n offsetX: 0,\n offsetY: 0,\n },\n ponytail: {\n pixels: [\n [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,1,2,2,0,0,0,0,0,0,0,0,2,1,1,0],\n [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1],\n [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1],\n [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0],\n [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0],\n ],\n slotMap: { 1: 'hair', 2: 'hairShadow' },\n offsetX: 0,\n offsetY: 2,\n },\n spiky: {\n pixels: [\n [0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0],\n [0,0,0,1,0,1,0,1,1,0,1,0,1,0,0,0],\n [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,1,2,2,0,0,0,0,0,0,0,0,2,2,1,0],\n ],\n slotMap: { 1: 'hair', 2: 'hairShadow' },\n offsetX: 0,\n offsetY: 0,\n },\n bob: {\n pixels: [\n [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,1,1,2,0,0,0,0,0,0,0,0,2,1,1,0],\n [0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0],\n [0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0],\n [0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0],\n [0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0],\n ],\n slotMap: { 1: 'hair', 2: 'hairShadow' },\n offsetX: 0,\n offsetY: 2,\n },\n afro: {\n pixels: [\n [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\n [1,1,1,2,0,0,0,0,0,0,0,0,2,1,1,1],\n [1,1,2,0,0,0,0,0,0,0,0,0,0,2,1,1],\n [1,2,0,0,0,0,0,0,0,0,0,0,0,0,2,1],\n [1,2,0,0,0,0,0,0,0,0,0,0,0,0,2,1],\n ],\n slotMap: { 1: 'hair', 2: 'hairShadow' },\n offsetX: 0,\n offsetY: 0,\n },\n bangs: {\n pixels: [\n [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],\n [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n [0,1,1,1,1,1,1,2,0,0,0,0,2,1,1,0],\n ],\n slotMap: { 1: 'hair', 2: 'hairShadow' },\n offsetX: 0,\n offsetY: 2,\n },\n};\n\nexport default hair;\n","import type { PartCategory } from '../../types.ts';\n\n// Beard/facial hair is drawn on the lower face area.\n// Slot map: 1 = hair\n// Beards are positioned at the jaw/chin edge (y=13-14) to avoid covering the mouth.\n// Mustache variants sit just above the mouth (y=11).\n\nconst beard: PartCategory = {\n stubble: {\n // Sparse dots at chin/jaw edge\n pixels: [\n [0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0],\n [0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0],\n ],\n slotMap: { 1: 'hair' },\n offsetX: 0,\n offsetY: 13,\n },\n goatee: {\n // Small chin patch below the mouth\n pixels: [\n [0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0],\n [0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0],\n ],\n slotMap: { 1: 'hair' },\n offsetX: 0,\n offsetY: 13,\n },\n full: {\n // Jaw outline: sideburns at edges + solid chin, hollow center so mouth shows\n pixels: [\n [0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0],\n [0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0],\n [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n [0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0],\n ],\n slotMap: { 1: 'hair' },\n offsetX: 0,\n offsetY: 11,\n },\n mustache: {\n // Sits just above the mouth line\n pixels: [\n [0,0,1,1,0,0,1,1,0,0],\n [0,1,0,0,1,1,0,0,1,0],\n ],\n slotMap: { 1: 'hair' },\n offsetX: 3,\n offsetY: 11,\n },\n handlebar: {\n // Wide curling mustache\n pixels: [\n [0,0,1,1,0,0,0,0,1,1,0,0],\n [0,1,0,0,1,1,1,1,0,0,1,0],\n [1,0,0,0,0,0,0,0,0,0,0,1],\n ],\n slotMap: { 1: 'hair' },\n offsetX: 2,\n offsetY: 11,\n },\n none: {\n pixels: [],\n slotMap: {},\n offsetX: 0,\n offsetY: 0,\n },\n};\n\nexport default beard;\n","import type { PartCategory } from '../../types.ts';\n\n// Accessories layer on top of everything.\n// Slot map: 1 = accessoryPrimary, 2 = accessorySecondary, 3 = lens (semi-transparent)\n\nconst accessories: PartCategory = {\n glasses: {\n pixels: [\n [0,0,1,1,1,1,0,0,1,1,1,1,0,0],\n [1,1,1,3,3,1,1,1,1,3,3,1,1,1],\n [0,0,1,1,1,1,0,0,1,1,1,1,0,0],\n ],\n slotMap: { 1: 'accessoryPrimary', 3: 'lens' },\n offsetX: 1,\n offsetY: 7,\n },\n sunglasses: {\n pixels: [\n [0,0,1,1,1,1,1,1,1,1,1,1,0,0],\n [1,1,1,2,2,1,1,1,1,2,2,1,1,1],\n [0,0,1,1,1,1,0,0,1,1,1,1,0,0],\n ],\n slotMap: { 1: 'accessoryPrimary', 2: 'accessorySecondary' },\n offsetX: 1,\n offsetY: 7,\n },\n hat: {\n pixels: [\n [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0],\n [0,1,2,2,2,2,2,2,2,2,2,2,2,2,1,0],\n ],\n slotMap: { 1: 'accessoryPrimary', 2: 'accessorySecondary' },\n offsetX: 0,\n offsetY: 0,\n },\n headband: {\n pixels: [\n [0,0,1,1,1,1,1,2,1,1,1,1,1,1,0,0],\n ],\n slotMap: { 1: 'accessoryPrimary', 2: 'accessorySecondary' },\n offsetX: 0,\n offsetY: 5,\n },\n earrings: {\n pixels: [\n [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],\n [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],\n ],\n slotMap: { 1: 'accessoryPrimary' },\n offsetX: 0,\n offsetY: 11,\n },\n none: {\n pixels: [],\n slotMap: {},\n offsetX: 0,\n offsetY: 0,\n },\n};\n\nexport default accessories;\n","import type { PartCategory, PartPattern } from '../../types.ts';\nimport faceShapes from './face-shapes.ts';\nimport eyes from './eyes.ts';\nimport eyebrows from './eyebrows.ts';\nimport mouth from './mouth.ts';\nimport nose from './nose.ts';\nimport ears from './ears.ts';\nimport hair from './hair.ts';\nimport beard from './beard.ts';\nimport accessories from './accessories.ts';\n\nconst registry: Record<string, PartCategory> = {\n faceShape: faceShapes,\n eyes,\n eyebrows,\n mouth,\n nose,\n ears,\n hair,\n beard,\n accessories,\n};\n\nexport function getPart(category: string, name: string): PartPattern | undefined {\n return registry[category]?.[name];\n}\n\nexport function getVariantNames(category: string): string[] {\n const cat = registry[category];\n return cat ? Object.keys(cat) : [];\n}\n\nexport function getAllCategories(): string[] {\n return Object.keys(registry);\n}\n\nexport { registry };\n","export const SKIN_PRESETS: Record<string, string> = {\n light: '#FDDCB5',\n medium: '#E8B88A',\n tan: '#D19A6A',\n brown: '#A0673C',\n dark: '#6B4226',\n pale: '#FFF0E0',\n};\n\nexport const SKIN_SHADOW_MAP: Record<string, string> = {\n '#FDDCB5': '#E5C49D',\n '#E8B88A': '#CFA072',\n '#D19A6A': '#B98252',\n '#A0673C': '#885524',\n '#6B4226': '#533010',\n '#FFF0E0': '#E7D8C8',\n};\n\nexport const HAIR_PRESETS: Record<string, string> = {\n black: '#1A1A2E',\n brown: '#6B3A2A',\n blonde: '#E8C84A',\n red: '#B83A1E',\n gray: '#9E9E9E',\n white: '#E8E8E8',\n auburn: '#8B3A1A',\n strawberry: '#D4713A',\n platinum: '#E8E0D0',\n pink: '#E8559E',\n blue: '#3A6BD5',\n purple: '#6B3A8B',\n teal: '#2A9E8B',\n};\n\nexport const EYE_PRESETS: Record<string, string> = {\n brown: '#5C3A1E',\n blue: '#3A7BD5',\n green: '#3A9D5C',\n gray: '#7A7A7A',\n};\n\nconst HEX_COLOR_RE = /^#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\n\n/** Validate that a string is a safe hex color. Returns the color or the fallback. */\nexport function sanitizeColor(value: string, fallback: string): string {\n if (HEX_COLOR_RE.test(value)) return value;\n return fallback;\n}\n\nexport function resolveSkinColor(value: string | undefined): string {\n if (!value) return SKIN_PRESETS.medium;\n return SKIN_PRESETS[value] ?? sanitizeColor(value, SKIN_PRESETS.medium);\n}\n\nexport function resolveSkinShadow(skinHex: string): string {\n return SKIN_SHADOW_MAP[skinHex] ?? darken(skinHex, 30);\n}\n\nexport function resolveHairColor(value: string | undefined): string {\n if (!value) return HAIR_PRESETS.black;\n return HAIR_PRESETS[value] ?? sanitizeColor(value, HAIR_PRESETS.black);\n}\n\nexport function resolveEyeColor(value: string | undefined): string {\n if (!value) return EYE_PRESETS.brown;\n return EYE_PRESETS[value] ?? sanitizeColor(value, EYE_PRESETS.brown);\n}\n\nfunction darken(hex: string, amount: number): string {\n const num = parseInt(hex.replace('#', ''), 16);\n const r = Math.max(0, (num >> 16) - amount);\n const g = Math.max(0, ((num >> 8) & 0xFF) - amount);\n const b = Math.max(0, (num & 0xFF) - amount);\n return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, '0').toUpperCase()}`;\n}\n","import type { FaceConfig, PixelGrid, PartPattern } from '../types.ts';\nimport { getPart } from './parts/index.ts';\nimport {\n resolveSkinColor,\n resolveSkinShadow,\n resolveHairColor,\n resolveEyeColor,\n} from './palette.ts';\n\nconst BASE_SIZE = 16;\n\n/** Build a color lookup from role names to actual hex colors. */\nfunction buildColorMap(config: FaceConfig): Record<string, string> {\n const skin = resolveSkinColor(config.skinColor);\n const skinShadow = resolveSkinShadow(skin);\n const hairColor = resolveHairColor(config.hairColor);\n const eyeColor = resolveEyeColor(config.eyeColor);\n\n return {\n skin,\n skinShadow,\n hair: hairColor,\n hairShadow: darkenColor(hairColor, 25),\n eyes: eyeColor,\n pupil: '#111111',\n white: '#FFFFFF',\n mouth: '#C75050',\n accessoryPrimary: '#333333',\n accessorySecondary: '#1A1A1A',\n lens: '#87CEEB',\n };\n}\n\nfunction darkenColor(hex: string, amount: number): string {\n const num = parseInt(hex.replace('#', ''), 16);\n const r = Math.max(0, (num >> 16) - amount);\n const g = Math.max(0, ((num >> 8) & 0xff) - amount);\n const b = Math.max(0, (num & 0xff) - amount);\n return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, '0')}`;\n}\n\n/** Stamp a part pattern onto the 16×16 pixel grid using the color map. */\nfunction stampPart(\n grid: PixelGrid,\n part: PartPattern,\n colorMap: Record<string, string>\n): void {\n for (let py = 0; py < part.pixels.length; py++) {\n const row = part.pixels[py];\n for (let px = 0; px < row.length; px++) {\n const slot = row[px];\n if (slot === 0) continue;\n\n const role = part.slotMap[slot];\n if (!role) continue;\n\n const color = colorMap[role];\n if (!color) continue;\n\n const gx = part.offsetX + px;\n const gy = part.offsetY + py;\n if (gx >= 0 && gx < BASE_SIZE && gy >= 0 && gy < BASE_SIZE) {\n grid[gy][gx] = color;\n }\n }\n }\n}\n\n/** Layer order for stamping parts onto the grid. */\nconst LAYER_ORDER: { category: string; configKey: keyof FaceConfig }[] = [\n { category: 'faceShape', configKey: 'faceShape' },\n { category: 'ears', configKey: 'ears' },\n { category: 'nose', configKey: 'nose' },\n { category: 'mouth', configKey: 'mouth' },\n { category: 'eyes', configKey: 'eyes' },\n { category: 'eyebrows', configKey: 'eyebrows' },\n { category: 'hair', configKey: 'hair' },\n { category: 'beard', configKey: 'beard' },\n { category: 'accessories', configKey: 'accessories' },\n];\n\n/** Generate a 16×16 pixel grid from a FaceConfig. */\nexport function generateGrid(config: FaceConfig): PixelGrid {\n const grid: PixelGrid = Array.from({ length: BASE_SIZE }, () =>\n Array.from({ length: BASE_SIZE }, () => null)\n );\n\n const colorMap = buildColorMap(config);\n\n for (const layer of LAYER_ORDER) {\n const name = config[layer.configKey] as string | undefined;\n if (!name || name === 'none') continue;\n\n const part = getPart(layer.category, name);\n if (!part) continue;\n\n stampPart(grid, part, colorMap);\n }\n\n return grid;\n}\n\n/** Generate a thumbnail grid showing a single part on a neutral background. */\nexport function generatePartThumbnail(\n category: string,\n name: string,\n skinColor?: string,\n hairColor?: string,\n eyeColor?: string\n): PixelGrid {\n const grid: PixelGrid = Array.from({ length: BASE_SIZE }, () =>\n Array.from({ length: BASE_SIZE }, () => null)\n );\n\n const skin = resolveSkinColor(skinColor);\n const colorMap: Record<string, string> = {\n skin,\n skinShadow: resolveSkinShadow(skin),\n hair: resolveHairColor(hairColor),\n hairShadow: darkenColor(resolveHairColor(hairColor), 25),\n eyes: resolveEyeColor(eyeColor),\n pupil: '#111111',\n white: '#FFFFFF',\n mouth: '#C75050',\n accessoryPrimary: '#333333',\n accessorySecondary: '#1A1A1A',\n lens: '#87CEEB',\n };\n\n const part = getPart(category, name);\n if (part) {\n stampPart(grid, part, colorMap);\n }\n\n return grid;\n}\n","import type { PixelGrid } from '../types.ts';\nimport { sanitizeColor } from './palette.ts';\n\n/** Convert a pixel grid to an SVG string. Grid dimensions are inferred from the array. */\nexport function gridToSvg(grid: PixelGrid, backgroundColor?: string): string {\n const height = grid.length;\n const width = height > 0 ? grid[0].length : 0;\n const raw = backgroundColor ?? '#87CEEB';\n const bg = raw === 'transparent' ? 'transparent' : sanitizeColor(raw, '#87CEEB');\n const rects: string[] = [];\n\n // Background (skip only when explicitly transparent)\n if (bg !== 'transparent') {\n rects.push(`<rect width=\"${width}\" height=\"${height}\" fill=\"${bg}\"/>`);\n }\n\n // Merge adjacent same-color pixels horizontally for smaller SVG output.\n for (let y = 0; y < height; y++) {\n let x = 0;\n while (x < width) {\n const color = grid[y][x];\n if (color === null) {\n x++;\n continue;\n }\n // Find run of same color\n let runLen = 1;\n while (x + runLen < width && grid[y][x + runLen] === color) {\n runLen++;\n }\n rects.push(`<rect x=\"${x}\" y=\"${y}\" width=\"${runLen}\" height=\"1\" fill=\"${color}\"/>`);\n x += runLen;\n }\n }\n\n return [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${width} ${height}\" shape-rendering=\"crispEdges\">`,\n ...rects,\n '</svg>',\n ].join('');\n}\n","import type { FaceConfig } from '../types.ts';\nimport { generateGrid, generatePartThumbnail } from './generator.ts';\nimport { gridToSvg } from './svg.ts';\nimport { getVariantNames, getAllCategories } from './parts/index.ts';\nimport { SKIN_PRESETS, HAIR_PRESETS, EYE_PRESETS } from './palette.ts';\n\nfunction pickRandom<T>(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\n/** Generate a random FaceConfig by picking random parts and colors. */\nexport function generateRandomConfig(): FaceConfig {\n return {\n faceShape: pickRandom(getVariantNames('faceShape')),\n eyes: pickRandom(getVariantNames('eyes')),\n eyebrows: pickRandom(getVariantNames('eyebrows')),\n mouth: pickRandom(getVariantNames('mouth')),\n nose: pickRandom(getVariantNames('nose')),\n ears: pickRandom(getVariantNames('ears')),\n hair: pickRandom(getVariantNames('hair')),\n beard: pickRandom(getVariantNames('beard')),\n accessories: pickRandom(getVariantNames('accessories')),\n skinColor: pickRandom(Object.keys(SKIN_PRESETS)),\n hairColor: pickRandom(Object.keys(HAIR_PRESETS)),\n eyeColor: pickRandom(Object.keys(EYE_PRESETS)),\n };\n}\n\n/** Generate a complete face SVG string. If no config is provided, a random face is generated. */\nexport function generateFace(config?: FaceConfig): string {\n const resolved = config ?? generateRandomConfig();\n const grid = generateGrid(resolved);\n return gridToSvg(grid, resolved.backgroundColor);\n}\n\n/** Get all available part variant names, keyed by category. */\nexport function getAvailableParts(): Record<string, string[]> {\n const result: Record<string, string[]> = {};\n for (const category of getAllCategories()) {\n result[category] = getVariantNames(category);\n }\n return result;\n}\n\n/** Generate a thumbnail SVG string showing a single part variant. */\nexport function getPartThumbnail(\n category: string,\n name: string,\n skinColor?: string,\n hairColor?: string,\n eyeColor?: string\n): string {\n const grid = generatePartThumbnail(category, name, skinColor, hairColor, eyeColor);\n return gridToSvg(grid);\n}\n","import type { FaceConfig } from '../types.ts';\n\nexport interface AnimationFrame {\n duration: number; // milliseconds\n overrides: Partial<FaceConfig>;\n}\n\nexport interface AnimationSequence {\n name: string;\n frames: AnimationFrame[];\n}\n\nexport const ANIMATIONS: Record<string, AnimationSequence> = {\n idle: {\n name: 'idle',\n frames: [\n { duration: 3000, overrides: {} },\n { duration: 150, overrides: { eyes: 'happy' } },\n { duration: 150, overrides: {} },\n ],\n },\n talk: {\n name: 'talk',\n frames: [\n { duration: 200, overrides: { mouth: 'smile' } },\n { duration: 200, overrides: { mouth: 'open' } },\n { duration: 200, overrides: { mouth: 'flat' } },\n { duration: 200, overrides: { mouth: 'open' } },\n { duration: 300, overrides: { mouth: 'smile' } },\n ],\n },\n blink: {\n name: 'blink',\n frames: [\n { duration: 2500, overrides: {} },\n { duration: 100, overrides: { eyes: 'narrow' } },\n { duration: 100, overrides: { eyes: 'happy' } },\n { duration: 100, overrides: { eyes: 'narrow' } },\n { duration: 200, overrides: {} },\n ],\n },\n emote: {\n name: 'emote',\n frames: [\n { duration: 500, overrides: {} },\n { duration: 400, overrides: { eyebrows: 'arched', mouth: 'open' } },\n { duration: 400, overrides: { eyebrows: 'arched', mouth: 'smile' } },\n { duration: 300, overrides: {} },\n ],\n },\n};\n\nexport function getAnimationNames(): string[] {\n return Object.keys(ANIMATIONS);\n}\n"],"mappings":"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","names":[]}
|
package/dist/react.d.cts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { F as FaceConfig, b as AnimationSequence } from './animations-BfYtmKFc.cjs';
|
|
3
|
+
export { e as generateRandomConfig } from './animations-BfYtmKFc.cjs';
|
|
4
|
+
|
|
5
|
+
/** Hook: returns SVG string, memoized on config changes. If no config is provided, a random face is generated once. */
|
|
6
|
+
declare function useAvatar(config?: FaceConfig): string;
|
|
7
|
+
/** Hook: cycles through animation frames, returns the current SVG string. */
|
|
8
|
+
declare function useAnimatedAvatar(config: FaceConfig | undefined, animation: string | AnimationSequence | undefined): string;
|
|
9
|
+
/** Component: renders the avatar SVG inline, with optional animation. If no config is provided, a random face is generated. */
|
|
10
|
+
declare function Avatar({ config, size, className, animation, }: {
|
|
11
|
+
config?: FaceConfig;
|
|
12
|
+
size?: number;
|
|
13
|
+
className?: string;
|
|
14
|
+
animation?: string | AnimationSequence;
|
|
15
|
+
}): react_jsx_runtime.JSX.Element;
|
|
16
|
+
|
|
17
|
+
export { AnimationSequence, Avatar, FaceConfig, useAnimatedAvatar, useAvatar };
|
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { F as FaceConfig, b as AnimationSequence } from './animations-BfYtmKFc.js';
|
|
3
|
+
export { e as generateRandomConfig } from './animations-BfYtmKFc.js';
|
|
4
|
+
|
|
5
|
+
/** Hook: returns SVG string, memoized on config changes. If no config is provided, a random face is generated once. */
|
|
6
|
+
declare function useAvatar(config?: FaceConfig): string;
|
|
7
|
+
/** Hook: cycles through animation frames, returns the current SVG string. */
|
|
8
|
+
declare function useAnimatedAvatar(config: FaceConfig | undefined, animation: string | AnimationSequence | undefined): string;
|
|
9
|
+
/** Component: renders the avatar SVG inline, with optional animation. If no config is provided, a random face is generated. */
|
|
10
|
+
declare function Avatar({ config, size, className, animation, }: {
|
|
11
|
+
config?: FaceConfig;
|
|
12
|
+
size?: number;
|
|
13
|
+
className?: string;
|
|
14
|
+
animation?: string | AnimationSequence;
|
|
15
|
+
}): react_jsx_runtime.JSX.Element;
|
|
16
|
+
|
|
17
|
+
export { AnimationSequence, Avatar, FaceConfig, useAnimatedAvatar, useAvatar };
|
package/dist/react.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ANIMATIONS,
|
|
3
|
+
generateFace,
|
|
4
|
+
generateRandomConfig
|
|
5
|
+
} from "./chunk-SCBE5EEX.js";
|
|
6
|
+
|
|
7
|
+
// src/react.tsx
|
|
8
|
+
import { useMemo, useState, useEffect, useRef } from "react";
|
|
9
|
+
import { jsx } from "react/jsx-runtime";
|
|
10
|
+
function useAvatar(config) {
|
|
11
|
+
const stableConfig = useRef(void 0);
|
|
12
|
+
if (!config && !stableConfig.current) {
|
|
13
|
+
stableConfig.current = generateRandomConfig();
|
|
14
|
+
}
|
|
15
|
+
const resolved = config ?? stableConfig.current;
|
|
16
|
+
return useMemo(() => generateFace(resolved), [
|
|
17
|
+
resolved.faceShape,
|
|
18
|
+
resolved.eyes,
|
|
19
|
+
resolved.eyebrows,
|
|
20
|
+
resolved.mouth,
|
|
21
|
+
resolved.nose,
|
|
22
|
+
resolved.ears,
|
|
23
|
+
resolved.hair,
|
|
24
|
+
resolved.beard,
|
|
25
|
+
resolved.accessories,
|
|
26
|
+
resolved.skinColor,
|
|
27
|
+
resolved.hairColor,
|
|
28
|
+
resolved.eyeColor,
|
|
29
|
+
resolved.backgroundColor
|
|
30
|
+
]);
|
|
31
|
+
}
|
|
32
|
+
function useAnimatedAvatar(config, animation) {
|
|
33
|
+
const stableConfig = useRef(void 0);
|
|
34
|
+
if (!config && !stableConfig.current) {
|
|
35
|
+
stableConfig.current = generateRandomConfig();
|
|
36
|
+
}
|
|
37
|
+
const resolved = config ?? stableConfig.current;
|
|
38
|
+
const sequence = useMemo(() => {
|
|
39
|
+
if (!animation) return void 0;
|
|
40
|
+
if (typeof animation === "string") return ANIMATIONS[animation];
|
|
41
|
+
return animation;
|
|
42
|
+
}, [animation]);
|
|
43
|
+
const [frameIndex, setFrameIndex] = useState(0);
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
setFrameIndex(0);
|
|
46
|
+
}, [sequence]);
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
if (!sequence) return;
|
|
49
|
+
const frame = sequence.frames[frameIndex];
|
|
50
|
+
if (!frame) return;
|
|
51
|
+
const timer = setTimeout(() => {
|
|
52
|
+
setFrameIndex((i) => (i + 1) % sequence.frames.length);
|
|
53
|
+
}, frame.duration);
|
|
54
|
+
return () => clearTimeout(timer);
|
|
55
|
+
}, [sequence, frameIndex]);
|
|
56
|
+
const mergedConfig = useMemo(() => {
|
|
57
|
+
if (!sequence) return resolved;
|
|
58
|
+
const frame = sequence.frames[frameIndex];
|
|
59
|
+
if (!frame) return resolved;
|
|
60
|
+
return { ...resolved, ...frame.overrides };
|
|
61
|
+
}, [resolved, sequence, frameIndex]);
|
|
62
|
+
return useAvatar(mergedConfig);
|
|
63
|
+
}
|
|
64
|
+
function Avatar({
|
|
65
|
+
config,
|
|
66
|
+
size = 128,
|
|
67
|
+
className,
|
|
68
|
+
animation
|
|
69
|
+
}) {
|
|
70
|
+
const svg = useAnimatedAvatar(config, animation);
|
|
71
|
+
return /* @__PURE__ */ jsx(
|
|
72
|
+
"div",
|
|
73
|
+
{
|
|
74
|
+
className,
|
|
75
|
+
style: { width: size, height: size, imageRendering: "pixelated" },
|
|
76
|
+
dangerouslySetInnerHTML: { __html: svg }
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
export {
|
|
81
|
+
Avatar,
|
|
82
|
+
generateRandomConfig,
|
|
83
|
+
useAnimatedAvatar,
|
|
84
|
+
useAvatar
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react.tsx"],"sourcesContent":["import { useMemo, useState, useEffect, useRef } from 'react';\nimport { generateFace, generateRandomConfig } from './renderer/index.ts';\nimport { ANIMATIONS } from './renderer/animations.ts';\nimport type { FaceConfig } from './types.ts';\nimport type { AnimationSequence } from './renderer/animations.ts';\n\nexport type { FaceConfig } from './types.ts';\nexport type { AnimationSequence } from './renderer/animations.ts';\nexport { generateRandomConfig } from './renderer/index.ts';\n\n/** Hook: returns SVG string, memoized on config changes. If no config is provided, a random face is generated once. */\nexport function useAvatar(config?: FaceConfig): string {\n const stableConfig = useRef<FaceConfig | undefined>(undefined);\n if (!config && !stableConfig.current) {\n stableConfig.current = generateRandomConfig();\n }\n const resolved = config ?? stableConfig.current!;\n\n return useMemo(() => generateFace(resolved), [\n resolved.faceShape,\n resolved.eyes,\n resolved.eyebrows,\n resolved.mouth,\n resolved.nose,\n resolved.ears,\n resolved.hair,\n resolved.beard,\n resolved.accessories,\n resolved.skinColor,\n resolved.hairColor,\n resolved.eyeColor,\n resolved.backgroundColor,\n ]);\n}\n\n/** Hook: cycles through animation frames, returns the current SVG string. */\nexport function useAnimatedAvatar(\n config: FaceConfig | undefined,\n animation: string | AnimationSequence | undefined,\n): string {\n const stableConfig = useRef<FaceConfig | undefined>(undefined);\n if (!config && !stableConfig.current) {\n stableConfig.current = generateRandomConfig();\n }\n const resolved = config ?? stableConfig.current!;\n\n const sequence = useMemo(() => {\n if (!animation) return undefined;\n if (typeof animation === 'string') return ANIMATIONS[animation];\n return animation;\n }, [animation]);\n\n const [frameIndex, setFrameIndex] = useState(0);\n\n // Reset frame when animation changes\n useEffect(() => {\n setFrameIndex(0);\n }, [sequence]);\n\n // Advance frames based on duration\n useEffect(() => {\n if (!sequence) return;\n const frame = sequence.frames[frameIndex];\n if (!frame) return;\n\n const timer = setTimeout(() => {\n setFrameIndex((i) => (i + 1) % sequence.frames.length);\n }, frame.duration);\n\n return () => clearTimeout(timer);\n }, [sequence, frameIndex]);\n\n const mergedConfig = useMemo(() => {\n if (!sequence) return resolved;\n const frame = sequence.frames[frameIndex];\n if (!frame) return resolved;\n return { ...resolved, ...frame.overrides };\n }, [resolved, sequence, frameIndex]);\n\n return useAvatar(mergedConfig);\n}\n\n/** Component: renders the avatar SVG inline, with optional animation. If no config is provided, a random face is generated. */\nexport function Avatar({\n config,\n size = 128,\n className,\n animation,\n}: {\n config?: FaceConfig;\n size?: number;\n className?: string;\n animation?: string | AnimationSequence;\n}) {\n const svg = useAnimatedAvatar(config, animation);\n return (\n <div\n className={className}\n style={{ width: size, height: size, imageRendering: 'pixelated' as const }}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n"],"mappings":";;;;;;;AAAA,SAAS,SAAS,UAAU,WAAW,cAAc;AAgGjD;AArFG,SAAS,UAAU,QAA6B;AACrD,QAAM,eAAe,OAA+B,MAAS;AAC7D,MAAI,CAAC,UAAU,CAAC,aAAa,SAAS;AACpC,iBAAa,UAAU,qBAAqB;AAAA,EAC9C;AACA,QAAM,WAAW,UAAU,aAAa;AAExC,SAAO,QAAQ,MAAM,aAAa,QAAQ,GAAG;AAAA,IAC3C,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AACH;AAGO,SAAS,kBACd,QACA,WACQ;AACR,QAAM,eAAe,OAA+B,MAAS;AAC7D,MAAI,CAAC,UAAU,CAAC,aAAa,SAAS;AACpC,iBAAa,UAAU,qBAAqB;AAAA,EAC9C;AACA,QAAM,WAAW,UAAU,aAAa;AAExC,QAAM,WAAW,QAAQ,MAAM;AAC7B,QAAI,CAAC,UAAW,QAAO;AACvB,QAAI,OAAO,cAAc,SAAU,QAAO,WAAW,SAAS;AAC9D,WAAO;AAAA,EACT,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,CAAC;AAG9C,YAAU,MAAM;AACd,kBAAc,CAAC;AAAA,EACjB,GAAG,CAAC,QAAQ,CAAC;AAGb,YAAU,MAAM;AACd,QAAI,CAAC,SAAU;AACf,UAAM,QAAQ,SAAS,OAAO,UAAU;AACxC,QAAI,CAAC,MAAO;AAEZ,UAAM,QAAQ,WAAW,MAAM;AAC7B,oBAAc,CAAC,OAAO,IAAI,KAAK,SAAS,OAAO,MAAM;AAAA,IACvD,GAAG,MAAM,QAAQ;AAEjB,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,UAAU,UAAU,CAAC;AAEzB,QAAM,eAAe,QAAQ,MAAM;AACjC,QAAI,CAAC,SAAU,QAAO;AACtB,UAAM,QAAQ,SAAS,OAAO,UAAU;AACxC,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,EAAE,GAAG,UAAU,GAAG,MAAM,UAAU;AAAA,EAC3C,GAAG,CAAC,UAAU,UAAU,UAAU,CAAC;AAEnC,SAAO,UAAU,YAAY;AAC/B;AAGO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AACF,GAKG;AACD,QAAM,MAAM,kBAAkB,QAAQ,SAAS;AAC/C,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO,EAAE,OAAO,MAAM,QAAQ,MAAM,gBAAgB,YAAqB;AAAA,MACzE,yBAAyB,EAAE,QAAQ,IAAI;AAAA;AAAA,EACzC;AAEJ;","names":[]}
|