@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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vue.ts","../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 {\n computed,\n ref,\n watch,\n onUnmounted,\n defineComponent,\n h,\n type PropType,\n} from 'vue';\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/** Composable: returns a computed SVG string from a reactive config. If no config is provided, a random face is generated once. */\nexport function useAvatar(config?: () => FaceConfig | undefined) {\n let fallback: FaceConfig | undefined;\n return computed(() => {\n const c = config?.();\n if (c) return generateFace(c);\n if (!fallback) fallback = generateRandomConfig();\n return generateFace(fallback);\n });\n}\n\n/** Composable: returns a ref that cycles through animation frames. */\nexport function useAnimatedAvatar(\n config: () => FaceConfig | undefined,\n animation: () => string | AnimationSequence | undefined,\n) {\n const frameIndex = ref(0);\n let timer: ReturnType<typeof setTimeout> | undefined;\n let fallback: FaceConfig | undefined;\n\n const sequence = computed(() => {\n const anim = animation();\n if (!anim) return undefined;\n if (typeof anim === 'string') return ANIMATIONS[anim];\n return anim;\n });\n\n function scheduleNext() {\n const seq = sequence.value;\n if (!seq) return;\n const frame = seq.frames[frameIndex.value];\n if (!frame) return;\n\n timer = setTimeout(() => {\n frameIndex.value = (frameIndex.value + 1) % seq.frames.length;\n scheduleNext();\n }, frame.duration);\n }\n\n watch(\n sequence,\n () => {\n if (timer !== undefined) clearTimeout(timer);\n frameIndex.value = 0;\n scheduleNext();\n },\n { immediate: true },\n );\n\n onUnmounted(() => {\n if (timer !== undefined) clearTimeout(timer);\n });\n\n return computed(() => {\n const seq = sequence.value;\n const base = config() ?? (fallback ??= generateRandomConfig());\n if (!seq) return generateFace(base);\n const frame = seq.frames[frameIndex.value];\n if (!frame) return generateFace(base);\n return generateFace({ ...base, ...frame.overrides });\n });\n}\n\n/** Component: renders the avatar SVG inline, with optional animation. If no config is provided, a random face is generated. */\nexport const Avatar = defineComponent({\n name: 'Avatar',\n props: {\n config: {\n type: Object as PropType<FaceConfig>,\n default: undefined,\n },\n size: {\n type: Number,\n default: 128,\n },\n animation: {\n type: [String, Object] as PropType<string | AnimationSequence>,\n default: undefined,\n },\n },\n setup(props) {\n const svg = useAnimatedAvatar(\n () => props.config,\n () => props.animation,\n );\n\n return () =>\n h('div', {\n innerHTML: svg.value,\n style: {\n width: `${props.size}px`,\n height: `${props.size}px`,\n imageRendering: 'pixelated',\n },\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/vue.d.cts ADDED
@@ -0,0 +1,45 @@
1
+ import * as vue from 'vue';
2
+ import { PropType } from 'vue';
3
+ import { F as FaceConfig, b as AnimationSequence } from './animations-BfYtmKFc.cjs';
4
+ export { e as generateRandomConfig } from './animations-BfYtmKFc.cjs';
5
+
6
+ /** Composable: returns a computed SVG string from a reactive config. If no config is provided, a random face is generated once. */
7
+ declare function useAvatar(config?: () => FaceConfig | undefined): vue.ComputedRef<string>;
8
+ /** Composable: returns a ref that cycles through animation frames. */
9
+ declare function useAnimatedAvatar(config: () => FaceConfig | undefined, animation: () => string | AnimationSequence | undefined): vue.ComputedRef<string>;
10
+ /** Component: renders the avatar SVG inline, with optional animation. If no config is provided, a random face is generated. */
11
+ declare const Avatar: vue.DefineComponent<vue.ExtractPropTypes<{
12
+ config: {
13
+ type: PropType<FaceConfig>;
14
+ default: undefined;
15
+ };
16
+ size: {
17
+ type: NumberConstructor;
18
+ default: number;
19
+ };
20
+ animation: {
21
+ type: PropType<string | AnimationSequence>;
22
+ default: undefined;
23
+ };
24
+ }>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
25
+ [key: string]: any;
26
+ }>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
27
+ config: {
28
+ type: PropType<FaceConfig>;
29
+ default: undefined;
30
+ };
31
+ size: {
32
+ type: NumberConstructor;
33
+ default: number;
34
+ };
35
+ animation: {
36
+ type: PropType<string | AnimationSequence>;
37
+ default: undefined;
38
+ };
39
+ }>> & Readonly<{}>, {
40
+ config: FaceConfig;
41
+ size: number;
42
+ animation: string | AnimationSequence;
43
+ }, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
44
+
45
+ export { AnimationSequence, Avatar, FaceConfig, useAnimatedAvatar, useAvatar };
package/dist/vue.d.ts ADDED
@@ -0,0 +1,45 @@
1
+ import * as vue from 'vue';
2
+ import { PropType } from 'vue';
3
+ import { F as FaceConfig, b as AnimationSequence } from './animations-BfYtmKFc.js';
4
+ export { e as generateRandomConfig } from './animations-BfYtmKFc.js';
5
+
6
+ /** Composable: returns a computed SVG string from a reactive config. If no config is provided, a random face is generated once. */
7
+ declare function useAvatar(config?: () => FaceConfig | undefined): vue.ComputedRef<string>;
8
+ /** Composable: returns a ref that cycles through animation frames. */
9
+ declare function useAnimatedAvatar(config: () => FaceConfig | undefined, animation: () => string | AnimationSequence | undefined): vue.ComputedRef<string>;
10
+ /** Component: renders the avatar SVG inline, with optional animation. If no config is provided, a random face is generated. */
11
+ declare const Avatar: vue.DefineComponent<vue.ExtractPropTypes<{
12
+ config: {
13
+ type: PropType<FaceConfig>;
14
+ default: undefined;
15
+ };
16
+ size: {
17
+ type: NumberConstructor;
18
+ default: number;
19
+ };
20
+ animation: {
21
+ type: PropType<string | AnimationSequence>;
22
+ default: undefined;
23
+ };
24
+ }>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
25
+ [key: string]: any;
26
+ }>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
27
+ config: {
28
+ type: PropType<FaceConfig>;
29
+ default: undefined;
30
+ };
31
+ size: {
32
+ type: NumberConstructor;
33
+ default: number;
34
+ };
35
+ animation: {
36
+ type: PropType<string | AnimationSequence>;
37
+ default: undefined;
38
+ };
39
+ }>> & Readonly<{}>, {
40
+ config: FaceConfig;
41
+ size: number;
42
+ animation: string | AnimationSequence;
43
+ }, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
44
+
45
+ export { AnimationSequence, Avatar, FaceConfig, useAnimatedAvatar, useAvatar };
package/dist/vue.js ADDED
@@ -0,0 +1,103 @@
1
+ import {
2
+ ANIMATIONS,
3
+ generateFace,
4
+ generateRandomConfig
5
+ } from "./chunk-SCBE5EEX.js";
6
+
7
+ // src/vue.ts
8
+ import {
9
+ computed,
10
+ ref,
11
+ watch,
12
+ onUnmounted,
13
+ defineComponent,
14
+ h
15
+ } from "vue";
16
+ function useAvatar(config) {
17
+ let fallback;
18
+ return computed(() => {
19
+ const c = config?.();
20
+ if (c) return generateFace(c);
21
+ if (!fallback) fallback = generateRandomConfig();
22
+ return generateFace(fallback);
23
+ });
24
+ }
25
+ function useAnimatedAvatar(config, animation) {
26
+ const frameIndex = ref(0);
27
+ let timer;
28
+ let fallback;
29
+ const sequence = computed(() => {
30
+ const anim = animation();
31
+ if (!anim) return void 0;
32
+ if (typeof anim === "string") return ANIMATIONS[anim];
33
+ return anim;
34
+ });
35
+ function scheduleNext() {
36
+ const seq = sequence.value;
37
+ if (!seq) return;
38
+ const frame = seq.frames[frameIndex.value];
39
+ if (!frame) return;
40
+ timer = setTimeout(() => {
41
+ frameIndex.value = (frameIndex.value + 1) % seq.frames.length;
42
+ scheduleNext();
43
+ }, frame.duration);
44
+ }
45
+ watch(
46
+ sequence,
47
+ () => {
48
+ if (timer !== void 0) clearTimeout(timer);
49
+ frameIndex.value = 0;
50
+ scheduleNext();
51
+ },
52
+ { immediate: true }
53
+ );
54
+ onUnmounted(() => {
55
+ if (timer !== void 0) clearTimeout(timer);
56
+ });
57
+ return computed(() => {
58
+ const seq = sequence.value;
59
+ const base = config() ?? (fallback ?? (fallback = generateRandomConfig()));
60
+ if (!seq) return generateFace(base);
61
+ const frame = seq.frames[frameIndex.value];
62
+ if (!frame) return generateFace(base);
63
+ return generateFace({ ...base, ...frame.overrides });
64
+ });
65
+ }
66
+ var Avatar = defineComponent({
67
+ name: "Avatar",
68
+ props: {
69
+ config: {
70
+ type: Object,
71
+ default: void 0
72
+ },
73
+ size: {
74
+ type: Number,
75
+ default: 128
76
+ },
77
+ animation: {
78
+ type: [String, Object],
79
+ default: void 0
80
+ }
81
+ },
82
+ setup(props) {
83
+ const svg = useAnimatedAvatar(
84
+ () => props.config,
85
+ () => props.animation
86
+ );
87
+ return () => h("div", {
88
+ innerHTML: svg.value,
89
+ style: {
90
+ width: `${props.size}px`,
91
+ height: `${props.size}px`,
92
+ imageRendering: "pixelated"
93
+ }
94
+ });
95
+ }
96
+ });
97
+ export {
98
+ Avatar,
99
+ generateRandomConfig,
100
+ useAnimatedAvatar,
101
+ useAvatar
102
+ };
103
+ //# sourceMappingURL=vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vue.ts"],"sourcesContent":["import {\n computed,\n ref,\n watch,\n onUnmounted,\n defineComponent,\n h,\n type PropType,\n} from 'vue';\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/** Composable: returns a computed SVG string from a reactive config. If no config is provided, a random face is generated once. */\nexport function useAvatar(config?: () => FaceConfig | undefined) {\n let fallback: FaceConfig | undefined;\n return computed(() => {\n const c = config?.();\n if (c) return generateFace(c);\n if (!fallback) fallback = generateRandomConfig();\n return generateFace(fallback);\n });\n}\n\n/** Composable: returns a ref that cycles through animation frames. */\nexport function useAnimatedAvatar(\n config: () => FaceConfig | undefined,\n animation: () => string | AnimationSequence | undefined,\n) {\n const frameIndex = ref(0);\n let timer: ReturnType<typeof setTimeout> | undefined;\n let fallback: FaceConfig | undefined;\n\n const sequence = computed(() => {\n const anim = animation();\n if (!anim) return undefined;\n if (typeof anim === 'string') return ANIMATIONS[anim];\n return anim;\n });\n\n function scheduleNext() {\n const seq = sequence.value;\n if (!seq) return;\n const frame = seq.frames[frameIndex.value];\n if (!frame) return;\n\n timer = setTimeout(() => {\n frameIndex.value = (frameIndex.value + 1) % seq.frames.length;\n scheduleNext();\n }, frame.duration);\n }\n\n watch(\n sequence,\n () => {\n if (timer !== undefined) clearTimeout(timer);\n frameIndex.value = 0;\n scheduleNext();\n },\n { immediate: true },\n );\n\n onUnmounted(() => {\n if (timer !== undefined) clearTimeout(timer);\n });\n\n return computed(() => {\n const seq = sequence.value;\n const base = config() ?? (fallback ??= generateRandomConfig());\n if (!seq) return generateFace(base);\n const frame = seq.frames[frameIndex.value];\n if (!frame) return generateFace(base);\n return generateFace({ ...base, ...frame.overrides });\n });\n}\n\n/** Component: renders the avatar SVG inline, with optional animation. If no config is provided, a random face is generated. */\nexport const Avatar = defineComponent({\n name: 'Avatar',\n props: {\n config: {\n type: Object as PropType<FaceConfig>,\n default: undefined,\n },\n size: {\n type: Number,\n default: 128,\n },\n animation: {\n type: [String, Object] as PropType<string | AnimationSequence>,\n default: undefined,\n },\n },\n setup(props) {\n const svg = useAnimatedAvatar(\n () => props.config,\n () => props.animation,\n );\n\n return () =>\n h('div', {\n innerHTML: svg.value,\n style: {\n width: `${props.size}px`,\n height: `${props.size}px`,\n imageRendering: 'pixelated',\n },\n });\n },\n});\n"],"mappings":";;;;;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAWA,SAAS,UAAU,QAAuC;AAC/D,MAAI;AACJ,SAAO,SAAS,MAAM;AACpB,UAAM,IAAI,SAAS;AACnB,QAAI,EAAG,QAAO,aAAa,CAAC;AAC5B,QAAI,CAAC,SAAU,YAAW,qBAAqB;AAC/C,WAAO,aAAa,QAAQ;AAAA,EAC9B,CAAC;AACH;AAGO,SAAS,kBACd,QACA,WACA;AACA,QAAM,aAAa,IAAI,CAAC;AACxB,MAAI;AACJ,MAAI;AAEJ,QAAM,WAAW,SAAS,MAAM;AAC9B,UAAM,OAAO,UAAU;AACvB,QAAI,CAAC,KAAM,QAAO;AAClB,QAAI,OAAO,SAAS,SAAU,QAAO,WAAW,IAAI;AACpD,WAAO;AAAA,EACT,CAAC;AAED,WAAS,eAAe;AACtB,UAAM,MAAM,SAAS;AACrB,QAAI,CAAC,IAAK;AACV,UAAM,QAAQ,IAAI,OAAO,WAAW,KAAK;AACzC,QAAI,CAAC,MAAO;AAEZ,YAAQ,WAAW,MAAM;AACvB,iBAAW,SAAS,WAAW,QAAQ,KAAK,IAAI,OAAO;AACvD,mBAAa;AAAA,IACf,GAAG,MAAM,QAAQ;AAAA,EACnB;AAEA;AAAA,IACE;AAAA,IACA,MAAM;AACJ,UAAI,UAAU,OAAW,cAAa,KAAK;AAC3C,iBAAW,QAAQ;AACnB,mBAAa;AAAA,IACf;AAAA,IACA,EAAE,WAAW,KAAK;AAAA,EACpB;AAEA,cAAY,MAAM;AAChB,QAAI,UAAU,OAAW,cAAa,KAAK;AAAA,EAC7C,CAAC;AAED,SAAO,SAAS,MAAM;AACpB,UAAM,MAAM,SAAS;AACrB,UAAM,OAAO,OAAO,MAAM,wBAAa,qBAAqB;AAC5D,QAAI,CAAC,IAAK,QAAO,aAAa,IAAI;AAClC,UAAM,QAAQ,IAAI,OAAO,WAAW,KAAK;AACzC,QAAI,CAAC,MAAO,QAAO,aAAa,IAAI;AACpC,WAAO,aAAa,EAAE,GAAG,MAAM,GAAG,MAAM,UAAU,CAAC;AAAA,EACrD,CAAC;AACH;AAGO,IAAM,SAAS,gBAAgB;AAAA,EACpC,MAAM;AAAA,EACN,OAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,WAAW;AAAA,MACT,MAAM,CAAC,QAAQ,MAAM;AAAA,MACrB,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,OAAO;AACX,UAAM,MAAM;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,IACd;AAEA,WAAO,MACL,EAAE,OAAO;AAAA,MACP,WAAW,IAAI;AAAA,MACf,OAAO;AAAA,QACL,OAAO,GAAG,MAAM,IAAI;AAAA,QACpB,QAAQ,GAAG,MAAM,IAAI;AAAA,QACrB,gBAAgB;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACL;AACF,CAAC;","names":[]}
package/package.json ADDED
@@ -0,0 +1,111 @@
1
+ {
2
+ "name": "@ignaciocabeza/bitface",
3
+ "version": "1.0.0",
4
+ "description": "Pixel art SVG avatar/face generator with zero dependencies",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.cts",
17
+ "default": "./dist/index.cjs"
18
+ }
19
+ },
20
+ "./react": {
21
+ "import": {
22
+ "types": "./dist/react.d.ts",
23
+ "default": "./dist/react.js"
24
+ },
25
+ "require": {
26
+ "types": "./dist/react.d.cts",
27
+ "default": "./dist/react.cjs"
28
+ }
29
+ },
30
+ "./vue": {
31
+ "import": {
32
+ "types": "./dist/vue.d.ts",
33
+ "default": "./dist/vue.js"
34
+ },
35
+ "require": {
36
+ "types": "./dist/vue.d.cts",
37
+ "default": "./dist/vue.cjs"
38
+ }
39
+ },
40
+ "./svelte": {
41
+ "types": "./src/svelte/Avatar.svelte.d.ts",
42
+ "svelte": "./src/svelte/Avatar.svelte",
43
+ "default": "./src/svelte/Avatar.svelte"
44
+ }
45
+ },
46
+ "files": [
47
+ "dist",
48
+ "src/svelte"
49
+ ],
50
+ "sideEffects": false,
51
+ "keywords": [
52
+ "svg",
53
+ "avatar",
54
+ "pixel-art",
55
+ "face-generator",
56
+ "identicon",
57
+ "react",
58
+ "vue",
59
+ "svelte"
60
+ ],
61
+ "repository": {
62
+ "type": "git",
63
+ "url": "https://github.com/ignaciocabeza/bitface.git"
64
+ },
65
+ "homepage": "https://github.com/ignaciocabeza/bitface#readme",
66
+ "bugs": {
67
+ "url": "https://github.com/ignaciocabeza/bitface/issues"
68
+ },
69
+ "license": "MIT",
70
+ "peerDependencies": {
71
+ "react": ">=18",
72
+ "svelte": ">=3",
73
+ "vue": ">=3"
74
+ },
75
+ "peerDependenciesMeta": {
76
+ "react": {
77
+ "optional": true
78
+ },
79
+ "vue": {
80
+ "optional": true
81
+ },
82
+ "svelte": {
83
+ "optional": true
84
+ }
85
+ },
86
+ "scripts": {
87
+ "build": "tsup",
88
+ "dev": "vite --config docs/vite.config.ts",
89
+ "build:docs": "vite build --config docs/vite.config.ts",
90
+ "preview": "vite preview --config docs/vite.config.ts",
91
+ "test": "vitest run",
92
+ "test:watch": "vitest",
93
+ "prepublishOnly": "npm test && npm run build"
94
+ },
95
+ "devDependencies": {
96
+ "@testing-library/dom": "^10.4.1",
97
+ "@testing-library/react": "^16.3.2",
98
+ "@types/react": "^19.2.14",
99
+ "@types/react-dom": "^19.2.3",
100
+ "@vitejs/plugin-react": "^5.1.4",
101
+ "@vue/test-utils": "^2.4.6",
102
+ "jsdom": "^28.1.0",
103
+ "react": "^19.2.4",
104
+ "react-dom": "^19.2.4",
105
+ "tsup": "^8.5.1",
106
+ "typescript": "~5.9.3",
107
+ "vite": "^7.3.1",
108
+ "vitest": "^4.0.18",
109
+ "vue": "^3.5.28"
110
+ }
111
+ }
@@ -0,0 +1,59 @@
1
+ <script>
2
+ import { generateFace, generateRandomConfig } from '../renderer/index.ts';
3
+ import { ANIMATIONS } from '../renderer/animations.ts';
4
+
5
+ /** @type {import('../../src/types.ts').FaceConfig | undefined} */
6
+ export let config = undefined;
7
+ /** @type {number} */
8
+ export let size = 128;
9
+ /** @type {string | import('../renderer/animations.ts').AnimationSequence | undefined} */
10
+ export let animation = undefined;
11
+
12
+ const fallbackConfig = config ? undefined : generateRandomConfig();
13
+
14
+ let frameIndex = 0;
15
+ let timer;
16
+
17
+ $: resolvedConfig = config ?? fallbackConfig;
18
+
19
+ $: sequence =
20
+ !animation
21
+ ? undefined
22
+ : typeof animation === 'string'
23
+ ? ANIMATIONS[animation]
24
+ : animation;
25
+
26
+ $: mergedConfig =
27
+ sequence && sequence.frames[frameIndex]
28
+ ? { ...resolvedConfig, ...sequence.frames[frameIndex].overrides }
29
+ : resolvedConfig;
30
+
31
+ $: svg = generateFace(mergedConfig);
32
+
33
+ // Reset and start animation loop when sequence changes
34
+ $: if (sequence) {
35
+ clearTimeout(timer);
36
+ frameIndex = 0;
37
+ tick();
38
+ }
39
+
40
+ function tick() {
41
+ if (!sequence) return;
42
+ const frame = sequence.frames[frameIndex];
43
+ if (!frame) return;
44
+ timer = setTimeout(() => {
45
+ frameIndex = (frameIndex + 1) % sequence.frames.length;
46
+ tick();
47
+ }, frame.duration);
48
+ }
49
+
50
+ import { onDestroy } from 'svelte';
51
+ onDestroy(() => clearTimeout(timer));
52
+ </script>
53
+
54
+ <div
55
+ class={$$props.class}
56
+ style="width: {size}px; height: {size}px; image-rendering: pixelated;"
57
+ >
58
+ {@html svg}
59
+ </div>
@@ -0,0 +1,15 @@
1
+ import type { SvelteComponent } from 'svelte';
2
+ import type { FaceConfig } from '../types.ts';
3
+ import type { AnimationSequence } from '../renderer/animations.ts';
4
+
5
+ export type { FaceConfig } from '../types.ts';
6
+ export type { AnimationSequence } from '../renderer/animations.ts';
7
+
8
+ interface AvatarProps {
9
+ config?: FaceConfig;
10
+ size?: number;
11
+ animation?: string | AnimationSequence;
12
+ class?: string;
13
+ }
14
+
15
+ export default class Avatar extends SvelteComponent<AvatarProps> {}