import { validateAvatarDefinition, type AvatarDefinition } from '@bible-strong/avatar-core' import { Avatar, createAvatar } from '@bible-strong/avatar-react' import '@bible-strong/avatar-react/styles.css' import { StrictMode, useState } from 'react' import { createRoot } from 'react-dom/client' import definitionJson from './strobi.avatar.json' import './styles.css' const validation = validateAvatarDefinition(definitionJson) if (!validation.ok) throw new Error(validation.errors[0]?.message) const definition = validation.value as AvatarDefinition const StrobiAvatar = createAvatar(definitionJson) type StrobiExpressionKey = keyof typeof definitionJson.expressions const expressions = Object.keys(definition.expressions) as StrobiExpressionKey[] const horizontalPosition = (expression: string) => expression.includes('left') ? 'left' : expression.includes('right') ? 'right' : 'center' const verticalPosition = (expression: string) => expression.includes('up') ? 'up' : expression.includes('down') ? 'down' : 'middle' const expressionGroups = [ ['up', 'left', 'Up left'], ['up', 'center', 'Up'], ['up', 'right', 'Up right'], ['middle', 'left', 'Left'], ['middle', 'center', 'Neutral'], ['middle', 'right', 'Right'], ['down', 'left', 'Down left'], ['down', 'center', 'Down'], ['down', 'right', 'Down right'], ].map(([vertical, horizontal, label]) => ({ key: `${vertical}-${horizontal}`, label, expressions: expressions.filter( expression => verticalPosition(expression) === vertical && horizontalPosition(expression) === horizontal ), })) const formatExpressionName = (expression: string) => expression.replaceAll('-', ' ').replace(/\b\w/g, letter => letter.toUpperCase()) function Demo() { const [expression, setExpression] = useState('neutral') return (

Avatar package consumer

Available expressions ({expressions.length})

Active: {formatExpressionName(expression)}
{expressionGroups.map(group => (

{group.label}

{group.expressions.map(key => ( ))}
))}
) } createRoot(document.getElementById('root')!).render( )