@retro-antlitz-kartei/react-editor 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +3 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -289,6 +289,7 @@ function AvatarEditor(props) {
|
|
|
289
289
|
showCombat = true,
|
|
290
290
|
showCode = true,
|
|
291
291
|
showSeed = true,
|
|
292
|
+
showRandom = true,
|
|
292
293
|
onMagic,
|
|
293
294
|
loadFonts = true,
|
|
294
295
|
className,
|
|
@@ -724,7 +725,7 @@ function AvatarEditor(props) {
|
|
|
724
725
|
/* @__PURE__ */ jsxRuntime.jsx("span", { style: swatchLabelStyle, children: "TROUSERS" }),
|
|
725
726
|
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", gap: "6px", flexWrap: "wrap" }, children: generator.PANTS.map((c) => /* @__PURE__ */ jsxRuntime.jsx("button", { onClick: () => patch({ trousersColor: c }), style: swatchBtn(c, config.trousersColor === c) }, c)) })
|
|
726
727
|
] }),
|
|
727
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { style: dividerStyle }),
|
|
728
|
+
(onMagic || showRandom) && /* @__PURE__ */ jsxRuntime.jsx("div", { style: dividerStyle }),
|
|
728
729
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: "8px", marginTop: "2px" }, children: [
|
|
729
730
|
onMagic && /* @__PURE__ */ jsxRuntime.jsx(
|
|
730
731
|
"button",
|
|
@@ -745,7 +746,7 @@ function AvatarEditor(props) {
|
|
|
745
746
|
children: "\u2728 MAGIC"
|
|
746
747
|
}
|
|
747
748
|
),
|
|
748
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
749
|
+
showRandom && /* @__PURE__ */ jsxRuntime.jsx(
|
|
749
750
|
"button",
|
|
750
751
|
{
|
|
751
752
|
onClick: onRandom,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/AvatarPreview.tsx","../src/CombatModal.tsx","../src/theme.ts","../src/AvatarEditor.tsx"],"names":["useRef","useEffect","renderAvatar","jsx","useState","AvatarArena","jsxs","POSES","POSE_NAMES","useCallback","useMemo","normalizeConfig","configFromSeed","DEFAULT_CONFIG","PARTS","randomConfig","encodeConfig","decodeConfig","partLabel","BG","Fragment","SKIN","HAIRS","CLOTH","PANTS"],"mappings":"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","file":"index.cjs","sourcesContent":["import React, { useRef, useEffect } from \"react\";\nimport { renderAvatar, type AvatarConfig } from \"@retro-antlitz-kartei/generator\";\n\nexport interface AvatarPreviewProps {\n /** The avatar to draw. */\n config: AvatarConfig;\n /** Backing canvas resolution in px. Default `320 × 400`. */\n width?: number;\n height?: number;\n /** Background: `true` = palette colour, hex string = override, `false` = transparent. */\n background?: boolean | string;\n /** Draw the floor strip. Default `true`. */\n floor?: boolean;\n className?: string;\n style?: React.CSSProperties;\n onClick?: () => void;\n}\n\n/**\n * Renders an {@link AvatarConfig} onto a `<canvas>`, re-drawing whenever the\n * config changes. Standalone — use it without the full editor chrome.\n */\nexport function AvatarPreview({\n config,\n width = 320,\n height = 400,\n background = true,\n floor = true,\n className,\n style,\n onClick,\n}: AvatarPreviewProps): React.ReactElement {\n const ref = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n const canvas = ref.current;\n if (!canvas) return;\n renderAvatar(canvas, config, { background, floor });\n }, [config, background, floor, width, height]);\n\n return (\n <canvas\n ref={ref}\n width={width}\n height={height}\n className={className}\n style={{ imageRendering: \"pixelated\", display: \"block\", ...style }}\n onClick={onClick}\n />\n );\n}\n","import React, { useRef, useEffect, useState } from \"react\";\nimport type { AvatarConfig } from \"@retro-antlitz-kartei/generator\";\nimport { AvatarArena, POSES, POSE_NAMES, type Pose } from \"@retro-antlitz-kartei/animate\";\nimport type { Theme } from \"./theme.js\";\n\nexport interface CombatModalProps {\n config: AvatarConfig;\n theme: Theme;\n onClose: () => void;\n}\n\n/** Full-screen overlay running the animated combat arena with pose buttons. */\nexport function CombatModal({ config, theme: t, onClose }: CombatModalProps): React.ReactElement {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const arenaRef = useRef<AvatarArena | null>(null);\n const [pose, setPose] = useState<Pose>(\"idle\");\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const arena = new AvatarArena(canvas, { pose: \"idle\" });\n arena.setConfig(config);\n arenaRef.current = arena;\n return () => arena.destroy();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n arenaRef.current?.setConfig(config);\n }, [config]);\n\n useEffect(() => {\n arenaRef.current?.setPose(pose);\n }, [pose]);\n\n return (\n <div\n onClick={onClose}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 60,\n background: \"rgba(8,4,16,0.82)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"20px\",\n backdropFilter: \"blur(3px)\",\n }}\n >\n <div\n onClick={(e) => e.stopPropagation()}\n style={{\n background: t.cabinet,\n border: \"4px solid \" + t.cabinetBorder,\n borderRadius: t.paper ? \"6px\" : \"14px\",\n padding: \"18px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"14px\",\n width: \"100%\",\n maxWidth: \"420px\",\n boxShadow: \"0 20px 60px rgba(0,0,0,.6)\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: \"10px\" }}>\n <span style={{ fontFamily: t.mono, fontSize: \"10px\", color: t.title, letterSpacing: \"1px\" }}>\n ⚔ COMBAT MODE\n </span>\n <button\n onClick={onClose}\n style={{\n fontFamily: t.mono,\n fontSize: \"11px\",\n cursor: \"pointer\",\n width: \"30px\",\n height: \"30px\",\n borderRadius: \"7px\",\n border: \"2px solid \" + t.panelBorder,\n background: \"#ffffff10\",\n color: \"#fff\",\n flex: \"0 0 auto\",\n }}\n >\n ✕\n </button>\n </div>\n <canvas\n ref={canvasRef}\n width={360}\n height={380}\n style={{\n width: \"100%\",\n maxWidth: \"360px\",\n aspectRatio: \"360 / 380\",\n imageRendering: \"pixelated\",\n display: \"block\",\n margin: \"0 auto\",\n borderRadius: \"8px\",\n border: \"3px solid \" + t.cabinetBorder,\n background: \"#0c0618\",\n }}\n />\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(3,1fr)\", gap: \"7px\" }}>\n {POSES.map((p) => (\n <button\n key={p}\n onClick={() => setPose(p)}\n style={{\n fontFamily: t.mono,\n fontSize: \"7px\",\n letterSpacing: \".5px\",\n cursor: \"pointer\",\n padding: \"10px 4px\",\n borderRadius: \"6px\",\n border: \"2px solid \" + (pose === p ? \"#00f0ff\" : \"#3a2f55\"),\n background: pose === p ? \"#00f0ff\" : \"#1c0d33\",\n color: pose === p ? \"#10131c\" : \"#cdbcff\",\n }}\n >\n {POSE_NAMES[p].toUpperCase()}\n </button>\n ))}\n </div>\n </div>\n </div>\n );\n}\n","/** The three editor skins. */\nexport type Layout = \"arcade\" | \"kompakt\" | \"steckbrief\";\n\n/** All layouts in display order. */\nexport const LAYOUTS: readonly { key: Layout; name: string }[] = [\n { key: \"arcade\", name: \"ARCADE\" },\n { key: \"kompakt\", name: \"COMPACT\" },\n { key: \"steckbrief\", name: \"WANTED\" },\n];\n\n/** Resolved style tokens for a layout — colours, fonts and shape. */\nexport interface Theme {\n stageBg: string;\n cabinet: string;\n cabinetBorder: string;\n marqueeBg: string;\n title: string;\n accent: string;\n screenBg: string;\n panel: string;\n panelBorder: string;\n rowBg: string;\n text: string;\n sub: string;\n mainDir: \"row\" | \"column\";\n mono: string;\n body: string;\n radius: string;\n titleText: string;\n glow: boolean;\n paper: boolean;\n}\n\nconst MONO = \"'Press Start 2P',monospace\";\nconst BODY = \"'VT323',monospace\";\n\n/** Resolve the visual tokens for a layout. */\nexport function theme(layout: Layout): Theme {\n if (layout === \"kompakt\") {\n return {\n stageBg: \"#10131c\",\n cabinet: \"#1a1f2e\",\n cabinetBorder: \"#2a3145\",\n marqueeBg: \"#232a3d\",\n title: \"#7df9ff\",\n accent: \"#ff5d8f\",\n screenBg: \"#0b0e16\",\n panel: \"#222a3d\",\n panelBorder: \"#323b54\",\n rowBg: \"#1a2032\",\n text: \"#cdd6f4\",\n sub: \"#8a93b2\",\n mainDir: \"row\",\n mono: MONO,\n body: BODY,\n radius: \"14px\",\n titleText: \"@retro-antlitz-kartei AVATAR EDITOR\",\n glow: false,\n paper: false,\n };\n }\n if (layout === \"steckbrief\") {\n return {\n stageBg: \"#3a2a18\",\n cabinet: \"#efe2c4\",\n cabinetBorder: \"#7a5a32\",\n marqueeBg: \"#c0392b\",\n title: \"#fff4dc\",\n accent: \"#c0392b\",\n screenBg: \"#d8c9a6\",\n panel: \"#e6d8ba\",\n panelBorder: \"#b89a64\",\n rowBg: \"#f3ead2\",\n text: \"#4a3520\",\n sub: \"#8a6e44\",\n mainDir: \"row\",\n mono: MONO,\n body: BODY,\n radius: \"4px\",\n titleText: \"WANTED\",\n glow: false,\n paper: true,\n };\n }\n return {\n // arcade\n stageBg: \"#1a0b2e\",\n cabinet: \"#3a1d5c\",\n cabinetBorder: \"#ff2e88\",\n marqueeBg: \"#120726\",\n title: \"#ffe600\",\n accent: \"#00f0ff\",\n screenBg: \"#06010f\",\n panel: \"#2a1248\",\n panelBorder: \"#7b2ff7\",\n rowBg: \"#1c0d33\",\n text: \"#ffe600\",\n sub: \"#b48cff\",\n mainDir: \"column\",\n mono: MONO,\n body: BODY,\n radius: \"10px\",\n titleText: \"AVATAR-O-MAT\",\n glow: true,\n paper: false,\n };\n}\n\n/** The web-font `<link>` hrefs the editor needs (Press Start 2P + VT323). */\nexport const FONT_HREFS: readonly string[] = [\n \"https://fonts.googleapis.com/css2?family=Press+Start+2P&family=VT323&display=swap\",\n];\n","import React, { useEffect, useMemo, useState, useCallback, useRef } from \"react\";\nimport {\n type AvatarConfig,\n type PartKey,\n type View,\n PARTS,\n partLabel,\n SKIN,\n HAIRS,\n CLOTH,\n BG,\n PANTS,\n DEFAULT_CONFIG,\n normalizeConfig,\n encodeConfig,\n decodeConfig,\n randomConfig,\n configFromSeed,\n} from \"@retro-antlitz-kartei/generator\";\nimport { AvatarPreview } from \"./AvatarPreview.js\";\nimport { CombatModal } from \"./CombatModal.js\";\nimport { theme, LAYOUTS, FONT_HREFS, type Layout } from \"./theme.js\";\n\nexport interface AvatarEditorProps {\n /** Controlled config. When set, you must update it via `onChange`. */\n value?: AvatarConfig;\n /** Initial config for uncontrolled use. */\n defaultValue?: AvatarConfig;\n /** Seed for the initial avatar when neither `value` nor `defaultValue` is given. */\n seed?: string;\n /** Called with the new config whenever the user edits the avatar. */\n onChange?: (config: AvatarConfig) => void;\n /** Controlled layout/skin. */\n layout?: Layout;\n /** Initial layout for uncontrolled use. Default `\"arcade\"`. */\n defaultLayout?: Layout;\n onLayoutChange?: (layout: Layout) => void;\n /** Show the layout switcher row. Default `true`. */\n showLayoutPicker?: boolean;\n /** Show the \"fight\" combat modal. Default `true`. */\n showCombat?: boolean;\n /** Show the share-code copy/load box. Default `true`. */\n showCode?: boolean;\n /** Show the seed input. Default `true`. */\n showSeed?: boolean;\n /** When set, renders a \"✨ MAGIC\" button next to RANDOM (e.g. to open an AI prompt modal). */\n onMagic?: () => void;\n /** Inject the pixel web fonts (Press Start 2P + VT323) into `<head>`. Default `true`. */\n loadFonts?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst PART_CONTROLS: readonly { key: PartKey; label: string }[] = [\n { key: \"build\", label: \"BUILD\" },\n { key: \"hat\", label: \"HAT\" },\n { key: \"hair\", label: \"HAIR\" },\n { key: \"ears\", label: \"EARS\" },\n { key: \"nose\", label: \"NOSE\" },\n { key: \"accessory\", label: \"ACCESSORY\" },\n { key: \"top\", label: \"TOP\" },\n { key: \"trousers\", label: \"TROUSERS\" },\n { key: \"shoes\", label: \"SHOES\" },\n];\n\nconst VIEW_OPTIONS: readonly { key: View; name: string }[] = [\n { key: \"left\", name: \"LEFT\" },\n { key: \"front\", name: \"FRONT\" },\n { key: \"right\", name: \"RIGHT\" },\n];\n\n/** Track whether an element is narrower than `breakpoint` px (for responsive layout). */\nfunction useNarrow(ref: React.RefObject<HTMLElement | null>, breakpoint = 640): boolean {\n const [narrow, setNarrow] = useState(\n () => typeof window !== \"undefined\" && window.innerWidth < breakpoint,\n );\n useEffect(() => {\n const el = ref.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver((entries) => {\n const w = entries[0]?.contentRect.width ?? 0;\n if (w > 0) setNarrow(w < breakpoint);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [ref, breakpoint]);\n return narrow;\n}\n\nfunction useControllable<T>(\n controlled: T | undefined,\n initial: T,\n onChange?: (v: T) => void,\n): [T, (v: T) => void] {\n const [internal, setInternal] = useState<T>(initial);\n const value = controlled !== undefined ? controlled : internal;\n const set = useCallback(\n (v: T) => {\n if (controlled === undefined) setInternal(v);\n onChange?.(v);\n },\n [controlled, onChange],\n );\n return [value, set];\n}\n\n/**\n * The full retro avatar editor: live preview, part cyclers, colour swatches,\n * view + layout switchers, a shareable code box, a seed generator and the\n * animated combat modal. Works controlled (`value`/`onChange`) or uncontrolled.\n */\nexport function AvatarEditor(props: AvatarEditorProps): React.ReactElement {\n const {\n value,\n defaultValue,\n seed,\n onChange,\n layout: layoutProp,\n defaultLayout = \"arcade\",\n onLayoutChange,\n showLayoutPicker = true,\n showCombat = true,\n showCode = true,\n showSeed = true,\n onMagic,\n loadFonts = true,\n className,\n style,\n } = props;\n\n const initialConfig = useMemo(\n () => normalizeConfig(value ?? defaultValue ?? (seed ? configFromSeed(seed) : DEFAULT_CONFIG)),\n // initial only\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n const [config, setConfig] = useControllable<AvatarConfig>(value, initialConfig, onChange);\n const [layout, setLayout] = useControllable<Layout>(layoutProp, defaultLayout, onLayoutChange);\n const [modalOpen, setModalOpen] = useState(false);\n const [codeInput, setCodeInput] = useState(\"\");\n const [codeMsg, setCodeMsg] = useState(\"\");\n const [seedInput, setSeedInput] = useState(seed ?? \"\");\n\n const stageRef = useRef<HTMLDivElement>(null);\n const narrow = useNarrow(stageRef);\n\n const t = theme(layout);\n const stacked = narrow || t.mainDir === \"column\";\n\n useEffect(() => {\n if (!loadFonts || typeof document === \"undefined\") return;\n for (const href of FONT_HREFS) {\n if (document.querySelector(`link[href=\"${href}\"]`)) continue;\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = href;\n document.head.appendChild(link);\n }\n }, [loadFonts]);\n\n const patch = useCallback((p: Partial<AvatarConfig>) => setConfig({ ...config, ...p }), [config, setConfig]);\n const cycle = useCallback(\n (key: PartKey, dir: number) => {\n const ids = PARTS[key];\n const cur = ids.indexOf(config[key] as never);\n patch({ [key]: ids[(cur + dir + ids.length) % ids.length] } as Partial<AvatarConfig>);\n },\n [config, patch],\n );\n\n const onRandom = () => setConfig({ ...randomConfig(), view: config.view });\n const onCopyCode = () => {\n const code = encodeConfig(config);\n try {\n navigator.clipboard.writeText(code);\n setCodeMsg(\"Copied!\");\n } catch {\n setCodeInput(code);\n setCodeMsg(\"Selected\");\n }\n };\n const onLoadCode = () => {\n if (!codeInput.trim()) return;\n const next = decodeConfig(codeInput, config);\n setConfig(next);\n setCodeMsg(\"Loaded!\");\n };\n const onGenerateSeed = () => {\n if (!seedInput.trim()) return;\n setConfig({ ...configFromSeed(seedInput), view: config.view });\n };\n\n /* ---------- styles ---------- */\n const arrowStyle: React.CSSProperties = {\n fontFamily: t.mono,\n fontSize: \"10px\",\n cursor: \"pointer\",\n flex: \"0 0 auto\",\n width: \"32px\",\n height: \"32px\",\n borderRadius: t.paper ? \"3px\" : \"7px\",\n border: \"2px solid \" + t.accent,\n background: t.glow ? t.accent : t.accent + \"22\",\n color: t.glow ? \"#10131c\" : t.accent,\n lineHeight: 1,\n };\n const rowStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n background: t.rowBg,\n borderRadius: t.paper ? \"3px\" : \"8px\",\n padding: \"6px 8px\",\n border: \"1px solid \" + t.panelBorder,\n };\n const partLabelStyle: React.CSSProperties = { fontFamily: t.mono, fontSize: \"7px\", color: t.sub, letterSpacing: \"1px\" };\n const partValueStyle: React.CSSProperties = { fontFamily: t.body, fontSize: \"19px\", color: t.text, lineHeight: 1.1, marginTop: \"2px\" };\n const dividerStyle: React.CSSProperties = { height: \"2px\", background: t.panelBorder, opacity: 0.6, margin: \"2px 0\" };\n const swatchRowStyle: React.CSSProperties = { display: \"flex\", alignItems: \"center\", gap: \"10px\", flexWrap: \"wrap\" };\n const swatchLabelStyle: React.CSSProperties = { fontFamily: t.mono, fontSize: \"7px\", color: t.sub, letterSpacing: \"1px\", width: \"78px\", flex: \"0 0 auto\" };\n const codeFieldStyle: React.CSSProperties = {\n flex: \"1 1 auto\",\n minWidth: 0,\n fontFamily: \"monospace\",\n fontSize: \"11px\",\n padding: \"7px 8px\",\n borderRadius: t.paper ? \"3px\" : \"6px\",\n border: \"2px solid \" + t.panelBorder,\n background: t.paper ? \"#fff\" : \"#0c111c\",\n color: t.text,\n outline: \"none\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n boxSizing: \"border-box\",\n };\n const smallBtnStyle: React.CSSProperties = {\n fontFamily: t.mono,\n fontSize: \"7px\",\n letterSpacing: \".5px\",\n cursor: \"pointer\",\n padding: \"8px 9px\",\n borderRadius: t.paper ? \"3px\" : \"6px\",\n border: \"2px solid \" + t.accent,\n background: t.glow ? t.accent : t.accent + \"22\",\n color: t.glow ? \"#10131c\" : t.accent,\n flex: \"0 0 auto\",\n };\n const codeLabelStyle: React.CSSProperties = { fontFamily: t.mono, fontSize: \"7px\", color: t.sub, letterSpacing: \"1px\" };\n const swatchBtn = (col: string, active: boolean): React.CSSProperties => ({\n background: col,\n width: \"22px\",\n height: \"22px\",\n cursor: \"pointer\",\n padding: 0,\n borderRadius: t.paper ? \"2px\" : \"5px\",\n border: \"2px solid \" + (active ? t.accent : t.paper ? \"#00000033\" : \"#ffffff44\"),\n boxShadow: active ? \"0 0 0 2px \" + t.accent + \"66\" : \"none\",\n });\n\n const nameDisplay = partLabel(\"top\", config.top).toUpperCase();\n\n const partRow = (key: PartKey, label: string) => (\n <div key={key} style={rowStyle}>\n <button onClick={() => cycle(key, -1)} style={arrowStyle}>\n ◀\n </button>\n <div style={{ flex: 1, minWidth: 0, textAlign: \"center\" }}>\n <div style={partLabelStyle}>{label}</div>\n <div style={partValueStyle}>{partLabel(key, config[key])}</div>\n </div>\n <button onClick={() => cycle(key, 1)} style={arrowStyle}>\n ▶\n </button>\n </div>\n );\n\n return (\n <div\n ref={stageRef}\n className={className}\n style={{\n minHeight: \"100%\",\n width: \"100%\",\n background: t.stageBg,\n padding: narrow ? \"10px\" : \"24px\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n fontFamily: t.body,\n backgroundImage: \"radial-gradient(circle at 50% 0%, \" + t.accent + \"22, transparent 60%)\",\n boxSizing: \"border-box\",\n ...style,\n }}\n >\n {showLayoutPicker && (\n <div style={{ display: \"flex\", gap: \"10px\", alignItems: \"center\", flexWrap: \"wrap\", marginBottom: \"14px\" }}>\n <span style={{ fontFamily: t.mono, fontSize: \"9px\", color: \"#fff\", opacity: 0.55, letterSpacing: \"1px\" }}>LAYOUT</span>\n {LAYOUTS.map((l) => (\n <button\n key={l.key}\n onClick={() => setLayout(l.key)}\n style={{\n fontFamily: t.mono,\n fontSize: \"8px\",\n letterSpacing: \"1px\",\n cursor: \"pointer\",\n padding: \"7px 9px\",\n borderRadius: \"6px\",\n border: \"2px solid \" + (layout === l.key ? t.accent : \"#ffffff22\"),\n background: layout === l.key ? t.accent : \"#ffffff10\",\n color: layout === l.key ? \"#10131c\" : \"#fff\",\n }}\n >\n {l.name}\n </button>\n ))}\n </div>\n )}\n\n <div\n style={{\n width: \"100%\",\n maxWidth: narrow ? \"100%\" : t.mainDir === \"row\" ? \"860px\" : \"540px\",\n background: t.cabinet,\n border: narrow ? \"none\" : \"4px solid \" + t.cabinetBorder,\n borderRadius: narrow ? \"10px\" : t.radius,\n boxShadow: narrow ? \"none\" : \"0 18px 50px rgba(0,0,0,.5)\" + (t.glow ? \", 0 0 30px \" + t.accent + \"33\" : \"\"),\n overflow: \"hidden\",\n }}\n >\n <div\n style={{\n background: t.marqueeBg,\n padding: narrow ? \"10px\" : \"14px\",\n display: \"flex\",\n gap: narrow ? \"8px\" : \"12px\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexWrap: \"wrap\",\n borderBottom: narrow ? \"none\" : \"3px solid \" + t.cabinetBorder,\n }}\n >\n <span style={{ width: \"10px\", height: \"10px\", borderRadius: \"50%\", background: t.accent, boxShadow: \"0 0 8px \" + t.accent, flex: \"0 0 auto\" }} />\n <span\n style={{\n fontFamily: t.mono,\n fontSize: t.titleText === \"WANTED\" ? \"20px\" : narrow ? \"10px\" : \"15px\",\n color: t.title,\n letterSpacing: narrow ? \"1px\" : \"2px\",\n textShadow: t.glow ? \"0 0 10px \" + t.accent : \"2px 2px 0 #00000044\",\n textAlign: \"center\",\n lineHeight: 1.5,\n }}\n >\n {t.titleText}\n </span>\n <span style={{ width: \"10px\", height: \"10px\", borderRadius: \"50%\", background: t.accent, boxShadow: \"0 0 8px \" + t.accent, flex: \"0 0 auto\" }} />\n </div>\n\n <div\n style={{\n display: \"flex\",\n flexDirection: stacked ? \"column\" : \"row\",\n gap: \"16px\",\n padding: narrow ? \"10px\" : \"18px\",\n alignItems: stacked ? \"center\" : \"stretch\",\n }}\n >\n {/* screen card */}\n <div\n style={{\n flex: stacked ? \"0 0 auto\" : \"0 0 300px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n alignItems: \"center\",\n width: stacked ? \"100%\" : undefined,\n maxWidth: \"100%\",\n }}\n >\n <div\n style={{\n position: \"relative\",\n padding: \"10px\",\n background: t.screenBg,\n borderRadius: t.paper ? \"4px\" : \"10px\",\n border: \"4px solid \" + t.cabinetBorder,\n boxShadow: \"inset 0 0 20px rgba(0,0,0,.6)\",\n cursor: showCombat ? \"pointer\" : \"default\",\n }}\n onClick={showCombat ? () => setModalOpen(true) : undefined}\n >\n <AvatarPreview\n config={config}\n width={320}\n height={400}\n style={{ width: \"264px\", maxWidth: \"100%\", height: \"auto\", aspectRatio: \"320 / 400\", borderRadius: \"3px\" }}\n />\n <div\n style={{\n position: \"absolute\",\n inset: \"10px\",\n pointerEvents: \"none\",\n borderRadius: \"3px\",\n backgroundImage: \"repeating-linear-gradient(0deg, rgba(0,0,0,.16) 0 2px, transparent 2px 4px)\",\n mixBlendMode: \"multiply\",\n }}\n />\n {showCombat && (\n <div\n style={{\n position: \"absolute\",\n right: \"14px\",\n bottom: \"14px\",\n fontFamily: t.mono,\n fontSize: \"7px\",\n letterSpacing: \"1px\",\n color: t.title,\n background: t.marqueeBg,\n border: \"2px solid \" + t.cabinetBorder,\n borderRadius: \"6px\",\n padding: \"5px 7px\",\n pointerEvents: \"none\",\n }}\n >\n ⚔ FIGHT\n </div>\n )}\n </div>\n <div\n style={{\n fontFamily: t.mono,\n fontSize: \"9px\",\n color: t.title,\n letterSpacing: \"1px\",\n padding: \"6px 10px\",\n background: t.marqueeBg,\n borderRadius: \"5px\",\n textAlign: \"center\",\n border: \"2px solid \" + t.cabinetBorder,\n }}\n >\n {\"THE \" + nameDisplay + \" WEARER\"}\n </div>\n\n <div style={{ width: \"264px\", maxWidth: \"100%\", display: \"flex\", flexDirection: \"column\", gap: \"8px\", marginTop: \"2px\" }}>\n <div style={{ display: \"flex\", gap: \"6px\", width: \"100%\" }}>\n {VIEW_OPTIONS.map((o) => (\n <button\n key={o.key}\n onClick={() => patch({ view: o.key })}\n style={{\n fontFamily: t.mono,\n fontSize: \"7px\",\n letterSpacing: \".5px\",\n cursor: \"pointer\",\n flex: 1,\n padding: \"8px 4px\",\n borderRadius: t.paper ? \"3px\" : \"6px\",\n border: \"2px solid \" + (config.view === o.key ? t.accent : t.panelBorder),\n background: config.view === o.key ? t.accent : t.paper ? \"#ffffff55\" : \"#ffffff10\",\n color: config.view === o.key ? \"#10131c\" : t.text,\n }}\n >\n {o.name}\n </button>\n ))}\n </div>\n\n {partRow(\"mouth\", \"MOUTH\")}\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>BACKGROUND</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {BG.map((c) => (\n <button key={c} onClick={() => patch({ background: c })} style={swatchBtn(c, config.background === c)} />\n ))}\n </div>\n </div>\n\n {showCode && (\n <>\n <div style={dividerStyle} />\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"6px\" }}>\n <span style={codeLabelStyle}>CODE</span>\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n <div style={codeFieldStyle}>{encodeConfig(config)}</div>\n <button onClick={onCopyCode} style={smallBtnStyle}>\n COPY\n </button>\n </div>\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n <input\n value={codeInput}\n onChange={(e) => {\n setCodeInput(e.target.value);\n setCodeMsg(\"\");\n }}\n placeholder=\"Paste code…\"\n style={codeFieldStyle}\n />\n <button onClick={onLoadCode} style={smallBtnStyle}>\n LOAD\n </button>\n </div>\n {codeMsg && <span style={{ fontFamily: t.mono, fontSize: \"7px\", color: t.accent }}>{codeMsg}</span>}\n </div>\n </>\n )}\n\n {showSeed && (\n <>\n <div style={dividerStyle} />\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"6px\" }}>\n <span style={codeLabelStyle}>SEED</span>\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n <input\n value={seedInput}\n onChange={(e) => setSeedInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") onGenerateSeed();\n }}\n placeholder=\"e.g. your name…\"\n style={codeFieldStyle}\n />\n <button onClick={onGenerateSeed} style={smallBtnStyle}>\n GENERATE\n </button>\n </div>\n </div>\n </>\n )}\n </div>\n </div>\n\n {/* controls card */}\n <div\n style={{\n flex: 1,\n minWidth: 0,\n width: stacked ? \"100%\" : \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"9px\",\n background: t.panel,\n border: \"3px solid \" + t.panelBorder,\n borderRadius: t.paper ? \"4px\" : \"10px\",\n padding: \"14px\",\n }}\n >\n {PART_CONTROLS.map((c) => partRow(c.key, c.label))}\n\n <div style={dividerStyle} />\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>SKIN</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {SKIN.map((c) => (\n <button key={c} onClick={() => patch({ skin: c })} style={swatchBtn(c, config.skin === c)} />\n ))}\n </div>\n </div>\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>HAIR</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {HAIRS.map((c) => (\n <button key={c} onClick={() => patch({ hairColor: c })} style={swatchBtn(c, config.hairColor === c)} />\n ))}\n </div>\n </div>\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>CLOTHING</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {CLOTH.map((c) => (\n <button key={c} onClick={() => patch({ topColor: c })} style={swatchBtn(c, config.topColor === c)} />\n ))}\n </div>\n </div>\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>TROUSERS</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {PANTS.map((c) => (\n <button key={c} onClick={() => patch({ trousersColor: c })} style={swatchBtn(c, config.trousersColor === c)} />\n ))}\n </div>\n </div>\n\n <div style={dividerStyle} />\n\n <div style={{ display: \"flex\", gap: \"8px\", marginTop: \"2px\" }}>\n {onMagic && (\n <button\n onClick={onMagic}\n style={{\n fontFamily: t.mono,\n fontSize: \"10px\",\n letterSpacing: \"1px\",\n cursor: \"pointer\",\n padding: \"12px\",\n borderRadius: t.paper ? \"3px\" : \"9px\",\n border: \"3px solid \" + t.title,\n background: \"#9b5de5\",\n color: \"#fff\",\n flex: \"0 0 auto\",\n }}\n >\n ✨ MAGIC\n </button>\n )}\n <button\n onClick={onRandom}\n style={{\n fontFamily: t.mono,\n fontSize: \"10px\",\n letterSpacing: \"1px\",\n cursor: \"pointer\",\n padding: \"12px\",\n borderRadius: t.paper ? \"3px\" : \"9px\",\n border: \"3px solid \" + t.title,\n background: t.accent,\n color: \"#10131c\",\n flex: 1,\n }}\n >\n 🎲 RANDOM\n </button>\n </div>\n </div>\n </div>\n </div>\n\n {showCombat && modalOpen && <CombatModal config={config} theme={t} onClose={() => setModalOpen(false)} />}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/AvatarPreview.tsx","../src/CombatModal.tsx","../src/theme.ts","../src/AvatarEditor.tsx"],"names":["useRef","useEffect","renderAvatar","jsx","useState","AvatarArena","jsxs","POSES","POSE_NAMES","useCallback","useMemo","normalizeConfig","configFromSeed","DEFAULT_CONFIG","PARTS","randomConfig","encodeConfig","decodeConfig","partLabel","BG","Fragment","SKIN","HAIRS","CLOTH","PANTS"],"mappings":"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","file":"index.cjs","sourcesContent":["import React, { useRef, useEffect } from \"react\";\nimport { renderAvatar, type AvatarConfig } from \"@retro-antlitz-kartei/generator\";\n\nexport interface AvatarPreviewProps {\n /** The avatar to draw. */\n config: AvatarConfig;\n /** Backing canvas resolution in px. Default `320 × 400`. */\n width?: number;\n height?: number;\n /** Background: `true` = palette colour, hex string = override, `false` = transparent. */\n background?: boolean | string;\n /** Draw the floor strip. Default `true`. */\n floor?: boolean;\n className?: string;\n style?: React.CSSProperties;\n onClick?: () => void;\n}\n\n/**\n * Renders an {@link AvatarConfig} onto a `<canvas>`, re-drawing whenever the\n * config changes. Standalone — use it without the full editor chrome.\n */\nexport function AvatarPreview({\n config,\n width = 320,\n height = 400,\n background = true,\n floor = true,\n className,\n style,\n onClick,\n}: AvatarPreviewProps): React.ReactElement {\n const ref = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n const canvas = ref.current;\n if (!canvas) return;\n renderAvatar(canvas, config, { background, floor });\n }, [config, background, floor, width, height]);\n\n return (\n <canvas\n ref={ref}\n width={width}\n height={height}\n className={className}\n style={{ imageRendering: \"pixelated\", display: \"block\", ...style }}\n onClick={onClick}\n />\n );\n}\n","import React, { useRef, useEffect, useState } from \"react\";\nimport type { AvatarConfig } from \"@retro-antlitz-kartei/generator\";\nimport { AvatarArena, POSES, POSE_NAMES, type Pose } from \"@retro-antlitz-kartei/animate\";\nimport type { Theme } from \"./theme.js\";\n\nexport interface CombatModalProps {\n config: AvatarConfig;\n theme: Theme;\n onClose: () => void;\n}\n\n/** Full-screen overlay running the animated combat arena with pose buttons. */\nexport function CombatModal({ config, theme: t, onClose }: CombatModalProps): React.ReactElement {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const arenaRef = useRef<AvatarArena | null>(null);\n const [pose, setPose] = useState<Pose>(\"idle\");\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const arena = new AvatarArena(canvas, { pose: \"idle\" });\n arena.setConfig(config);\n arenaRef.current = arena;\n return () => arena.destroy();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n arenaRef.current?.setConfig(config);\n }, [config]);\n\n useEffect(() => {\n arenaRef.current?.setPose(pose);\n }, [pose]);\n\n return (\n <div\n onClick={onClose}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 60,\n background: \"rgba(8,4,16,0.82)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"20px\",\n backdropFilter: \"blur(3px)\",\n }}\n >\n <div\n onClick={(e) => e.stopPropagation()}\n style={{\n background: t.cabinet,\n border: \"4px solid \" + t.cabinetBorder,\n borderRadius: t.paper ? \"6px\" : \"14px\",\n padding: \"18px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"14px\",\n width: \"100%\",\n maxWidth: \"420px\",\n boxShadow: \"0 20px 60px rgba(0,0,0,.6)\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: \"10px\" }}>\n <span style={{ fontFamily: t.mono, fontSize: \"10px\", color: t.title, letterSpacing: \"1px\" }}>\n ⚔ COMBAT MODE\n </span>\n <button\n onClick={onClose}\n style={{\n fontFamily: t.mono,\n fontSize: \"11px\",\n cursor: \"pointer\",\n width: \"30px\",\n height: \"30px\",\n borderRadius: \"7px\",\n border: \"2px solid \" + t.panelBorder,\n background: \"#ffffff10\",\n color: \"#fff\",\n flex: \"0 0 auto\",\n }}\n >\n ✕\n </button>\n </div>\n <canvas\n ref={canvasRef}\n width={360}\n height={380}\n style={{\n width: \"100%\",\n maxWidth: \"360px\",\n aspectRatio: \"360 / 380\",\n imageRendering: \"pixelated\",\n display: \"block\",\n margin: \"0 auto\",\n borderRadius: \"8px\",\n border: \"3px solid \" + t.cabinetBorder,\n background: \"#0c0618\",\n }}\n />\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(3,1fr)\", gap: \"7px\" }}>\n {POSES.map((p) => (\n <button\n key={p}\n onClick={() => setPose(p)}\n style={{\n fontFamily: t.mono,\n fontSize: \"7px\",\n letterSpacing: \".5px\",\n cursor: \"pointer\",\n padding: \"10px 4px\",\n borderRadius: \"6px\",\n border: \"2px solid \" + (pose === p ? \"#00f0ff\" : \"#3a2f55\"),\n background: pose === p ? \"#00f0ff\" : \"#1c0d33\",\n color: pose === p ? \"#10131c\" : \"#cdbcff\",\n }}\n >\n {POSE_NAMES[p].toUpperCase()}\n </button>\n ))}\n </div>\n </div>\n </div>\n );\n}\n","/** The three editor skins. */\nexport type Layout = \"arcade\" | \"kompakt\" | \"steckbrief\";\n\n/** All layouts in display order. */\nexport const LAYOUTS: readonly { key: Layout; name: string }[] = [\n { key: \"arcade\", name: \"ARCADE\" },\n { key: \"kompakt\", name: \"COMPACT\" },\n { key: \"steckbrief\", name: \"WANTED\" },\n];\n\n/** Resolved style tokens for a layout — colours, fonts and shape. */\nexport interface Theme {\n stageBg: string;\n cabinet: string;\n cabinetBorder: string;\n marqueeBg: string;\n title: string;\n accent: string;\n screenBg: string;\n panel: string;\n panelBorder: string;\n rowBg: string;\n text: string;\n sub: string;\n mainDir: \"row\" | \"column\";\n mono: string;\n body: string;\n radius: string;\n titleText: string;\n glow: boolean;\n paper: boolean;\n}\n\nconst MONO = \"'Press Start 2P',monospace\";\nconst BODY = \"'VT323',monospace\";\n\n/** Resolve the visual tokens for a layout. */\nexport function theme(layout: Layout): Theme {\n if (layout === \"kompakt\") {\n return {\n stageBg: \"#10131c\",\n cabinet: \"#1a1f2e\",\n cabinetBorder: \"#2a3145\",\n marqueeBg: \"#232a3d\",\n title: \"#7df9ff\",\n accent: \"#ff5d8f\",\n screenBg: \"#0b0e16\",\n panel: \"#222a3d\",\n panelBorder: \"#323b54\",\n rowBg: \"#1a2032\",\n text: \"#cdd6f4\",\n sub: \"#8a93b2\",\n mainDir: \"row\",\n mono: MONO,\n body: BODY,\n radius: \"14px\",\n titleText: \"@retro-antlitz-kartei AVATAR EDITOR\",\n glow: false,\n paper: false,\n };\n }\n if (layout === \"steckbrief\") {\n return {\n stageBg: \"#3a2a18\",\n cabinet: \"#efe2c4\",\n cabinetBorder: \"#7a5a32\",\n marqueeBg: \"#c0392b\",\n title: \"#fff4dc\",\n accent: \"#c0392b\",\n screenBg: \"#d8c9a6\",\n panel: \"#e6d8ba\",\n panelBorder: \"#b89a64\",\n rowBg: \"#f3ead2\",\n text: \"#4a3520\",\n sub: \"#8a6e44\",\n mainDir: \"row\",\n mono: MONO,\n body: BODY,\n radius: \"4px\",\n titleText: \"WANTED\",\n glow: false,\n paper: true,\n };\n }\n return {\n // arcade\n stageBg: \"#1a0b2e\",\n cabinet: \"#3a1d5c\",\n cabinetBorder: \"#ff2e88\",\n marqueeBg: \"#120726\",\n title: \"#ffe600\",\n accent: \"#00f0ff\",\n screenBg: \"#06010f\",\n panel: \"#2a1248\",\n panelBorder: \"#7b2ff7\",\n rowBg: \"#1c0d33\",\n text: \"#ffe600\",\n sub: \"#b48cff\",\n mainDir: \"column\",\n mono: MONO,\n body: BODY,\n radius: \"10px\",\n titleText: \"AVATAR-O-MAT\",\n glow: true,\n paper: false,\n };\n}\n\n/** The web-font `<link>` hrefs the editor needs (Press Start 2P + VT323). */\nexport const FONT_HREFS: readonly string[] = [\n \"https://fonts.googleapis.com/css2?family=Press+Start+2P&family=VT323&display=swap\",\n];\n","import React, { useEffect, useMemo, useState, useCallback, useRef } from \"react\";\nimport {\n type AvatarConfig,\n type PartKey,\n type View,\n PARTS,\n partLabel,\n SKIN,\n HAIRS,\n CLOTH,\n BG,\n PANTS,\n DEFAULT_CONFIG,\n normalizeConfig,\n encodeConfig,\n decodeConfig,\n randomConfig,\n configFromSeed,\n} from \"@retro-antlitz-kartei/generator\";\nimport { AvatarPreview } from \"./AvatarPreview.js\";\nimport { CombatModal } from \"./CombatModal.js\";\nimport { theme, LAYOUTS, FONT_HREFS, type Layout } from \"./theme.js\";\n\nexport interface AvatarEditorProps {\n /** Controlled config. When set, you must update it via `onChange`. */\n value?: AvatarConfig;\n /** Initial config for uncontrolled use. */\n defaultValue?: AvatarConfig;\n /** Seed for the initial avatar when neither `value` nor `defaultValue` is given. */\n seed?: string;\n /** Called with the new config whenever the user edits the avatar. */\n onChange?: (config: AvatarConfig) => void;\n /** Controlled layout/skin. */\n layout?: Layout;\n /** Initial layout for uncontrolled use. Default `\"arcade\"`. */\n defaultLayout?: Layout;\n onLayoutChange?: (layout: Layout) => void;\n /** Show the layout switcher row. Default `true`. */\n showLayoutPicker?: boolean;\n /** Show the \"fight\" combat modal. Default `true`. */\n showCombat?: boolean;\n /** Show the share-code copy/load box. Default `true`. */\n showCode?: boolean;\n /** Show the seed input. Default `true`. */\n showSeed?: boolean;\n /** Show the built-in \"🎲 RANDOM\" button. Default `true`. */\n showRandom?: boolean;\n /** When set, renders a \"✨ MAGIC\" button next to RANDOM (e.g. to open an AI prompt modal). */\n onMagic?: () => void;\n /** Inject the pixel web fonts (Press Start 2P + VT323) into `<head>`. Default `true`. */\n loadFonts?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst PART_CONTROLS: readonly { key: PartKey; label: string }[] = [\n { key: \"build\", label: \"BUILD\" },\n { key: \"hat\", label: \"HAT\" },\n { key: \"hair\", label: \"HAIR\" },\n { key: \"ears\", label: \"EARS\" },\n { key: \"nose\", label: \"NOSE\" },\n { key: \"accessory\", label: \"ACCESSORY\" },\n { key: \"top\", label: \"TOP\" },\n { key: \"trousers\", label: \"TROUSERS\" },\n { key: \"shoes\", label: \"SHOES\" },\n];\n\nconst VIEW_OPTIONS: readonly { key: View; name: string }[] = [\n { key: \"left\", name: \"LEFT\" },\n { key: \"front\", name: \"FRONT\" },\n { key: \"right\", name: \"RIGHT\" },\n];\n\n/** Track whether an element is narrower than `breakpoint` px (for responsive layout). */\nfunction useNarrow(ref: React.RefObject<HTMLElement | null>, breakpoint = 640): boolean {\n const [narrow, setNarrow] = useState(\n () => typeof window !== \"undefined\" && window.innerWidth < breakpoint,\n );\n useEffect(() => {\n const el = ref.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver((entries) => {\n const w = entries[0]?.contentRect.width ?? 0;\n if (w > 0) setNarrow(w < breakpoint);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [ref, breakpoint]);\n return narrow;\n}\n\nfunction useControllable<T>(\n controlled: T | undefined,\n initial: T,\n onChange?: (v: T) => void,\n): [T, (v: T) => void] {\n const [internal, setInternal] = useState<T>(initial);\n const value = controlled !== undefined ? controlled : internal;\n const set = useCallback(\n (v: T) => {\n if (controlled === undefined) setInternal(v);\n onChange?.(v);\n },\n [controlled, onChange],\n );\n return [value, set];\n}\n\n/**\n * The full retro avatar editor: live preview, part cyclers, colour swatches,\n * view + layout switchers, a shareable code box, a seed generator and the\n * animated combat modal. Works controlled (`value`/`onChange`) or uncontrolled.\n */\nexport function AvatarEditor(props: AvatarEditorProps): React.ReactElement {\n const {\n value,\n defaultValue,\n seed,\n onChange,\n layout: layoutProp,\n defaultLayout = \"arcade\",\n onLayoutChange,\n showLayoutPicker = true,\n showCombat = true,\n showCode = true,\n showSeed = true,\n showRandom = true,\n onMagic,\n loadFonts = true,\n className,\n style,\n } = props;\n\n const initialConfig = useMemo(\n () => normalizeConfig(value ?? defaultValue ?? (seed ? configFromSeed(seed) : DEFAULT_CONFIG)),\n // initial only\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n const [config, setConfig] = useControllable<AvatarConfig>(value, initialConfig, onChange);\n const [layout, setLayout] = useControllable<Layout>(layoutProp, defaultLayout, onLayoutChange);\n const [modalOpen, setModalOpen] = useState(false);\n const [codeInput, setCodeInput] = useState(\"\");\n const [codeMsg, setCodeMsg] = useState(\"\");\n const [seedInput, setSeedInput] = useState(seed ?? \"\");\n\n const stageRef = useRef<HTMLDivElement>(null);\n const narrow = useNarrow(stageRef);\n\n const t = theme(layout);\n const stacked = narrow || t.mainDir === \"column\";\n\n useEffect(() => {\n if (!loadFonts || typeof document === \"undefined\") return;\n for (const href of FONT_HREFS) {\n if (document.querySelector(`link[href=\"${href}\"]`)) continue;\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = href;\n document.head.appendChild(link);\n }\n }, [loadFonts]);\n\n const patch = useCallback((p: Partial<AvatarConfig>) => setConfig({ ...config, ...p }), [config, setConfig]);\n const cycle = useCallback(\n (key: PartKey, dir: number) => {\n const ids = PARTS[key];\n const cur = ids.indexOf(config[key] as never);\n patch({ [key]: ids[(cur + dir + ids.length) % ids.length] } as Partial<AvatarConfig>);\n },\n [config, patch],\n );\n\n const onRandom = () => setConfig({ ...randomConfig(), view: config.view });\n const onCopyCode = () => {\n const code = encodeConfig(config);\n try {\n navigator.clipboard.writeText(code);\n setCodeMsg(\"Copied!\");\n } catch {\n setCodeInput(code);\n setCodeMsg(\"Selected\");\n }\n };\n const onLoadCode = () => {\n if (!codeInput.trim()) return;\n const next = decodeConfig(codeInput, config);\n setConfig(next);\n setCodeMsg(\"Loaded!\");\n };\n const onGenerateSeed = () => {\n if (!seedInput.trim()) return;\n setConfig({ ...configFromSeed(seedInput), view: config.view });\n };\n\n /* ---------- styles ---------- */\n const arrowStyle: React.CSSProperties = {\n fontFamily: t.mono,\n fontSize: \"10px\",\n cursor: \"pointer\",\n flex: \"0 0 auto\",\n width: \"32px\",\n height: \"32px\",\n borderRadius: t.paper ? \"3px\" : \"7px\",\n border: \"2px solid \" + t.accent,\n background: t.glow ? t.accent : t.accent + \"22\",\n color: t.glow ? \"#10131c\" : t.accent,\n lineHeight: 1,\n };\n const rowStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n background: t.rowBg,\n borderRadius: t.paper ? \"3px\" : \"8px\",\n padding: \"6px 8px\",\n border: \"1px solid \" + t.panelBorder,\n };\n const partLabelStyle: React.CSSProperties = { fontFamily: t.mono, fontSize: \"7px\", color: t.sub, letterSpacing: \"1px\" };\n const partValueStyle: React.CSSProperties = { fontFamily: t.body, fontSize: \"19px\", color: t.text, lineHeight: 1.1, marginTop: \"2px\" };\n const dividerStyle: React.CSSProperties = { height: \"2px\", background: t.panelBorder, opacity: 0.6, margin: \"2px 0\" };\n const swatchRowStyle: React.CSSProperties = { display: \"flex\", alignItems: \"center\", gap: \"10px\", flexWrap: \"wrap\" };\n const swatchLabelStyle: React.CSSProperties = { fontFamily: t.mono, fontSize: \"7px\", color: t.sub, letterSpacing: \"1px\", width: \"78px\", flex: \"0 0 auto\" };\n const codeFieldStyle: React.CSSProperties = {\n flex: \"1 1 auto\",\n minWidth: 0,\n fontFamily: \"monospace\",\n fontSize: \"11px\",\n padding: \"7px 8px\",\n borderRadius: t.paper ? \"3px\" : \"6px\",\n border: \"2px solid \" + t.panelBorder,\n background: t.paper ? \"#fff\" : \"#0c111c\",\n color: t.text,\n outline: \"none\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n boxSizing: \"border-box\",\n };\n const smallBtnStyle: React.CSSProperties = {\n fontFamily: t.mono,\n fontSize: \"7px\",\n letterSpacing: \".5px\",\n cursor: \"pointer\",\n padding: \"8px 9px\",\n borderRadius: t.paper ? \"3px\" : \"6px\",\n border: \"2px solid \" + t.accent,\n background: t.glow ? t.accent : t.accent + \"22\",\n color: t.glow ? \"#10131c\" : t.accent,\n flex: \"0 0 auto\",\n };\n const codeLabelStyle: React.CSSProperties = { fontFamily: t.mono, fontSize: \"7px\", color: t.sub, letterSpacing: \"1px\" };\n const swatchBtn = (col: string, active: boolean): React.CSSProperties => ({\n background: col,\n width: \"22px\",\n height: \"22px\",\n cursor: \"pointer\",\n padding: 0,\n borderRadius: t.paper ? \"2px\" : \"5px\",\n border: \"2px solid \" + (active ? t.accent : t.paper ? \"#00000033\" : \"#ffffff44\"),\n boxShadow: active ? \"0 0 0 2px \" + t.accent + \"66\" : \"none\",\n });\n\n const nameDisplay = partLabel(\"top\", config.top).toUpperCase();\n\n const partRow = (key: PartKey, label: string) => (\n <div key={key} style={rowStyle}>\n <button onClick={() => cycle(key, -1)} style={arrowStyle}>\n ◀\n </button>\n <div style={{ flex: 1, minWidth: 0, textAlign: \"center\" }}>\n <div style={partLabelStyle}>{label}</div>\n <div style={partValueStyle}>{partLabel(key, config[key])}</div>\n </div>\n <button onClick={() => cycle(key, 1)} style={arrowStyle}>\n ▶\n </button>\n </div>\n );\n\n return (\n <div\n ref={stageRef}\n className={className}\n style={{\n minHeight: \"100%\",\n width: \"100%\",\n background: t.stageBg,\n padding: narrow ? \"10px\" : \"24px\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n fontFamily: t.body,\n backgroundImage: \"radial-gradient(circle at 50% 0%, \" + t.accent + \"22, transparent 60%)\",\n boxSizing: \"border-box\",\n ...style,\n }}\n >\n {showLayoutPicker && (\n <div style={{ display: \"flex\", gap: \"10px\", alignItems: \"center\", flexWrap: \"wrap\", marginBottom: \"14px\" }}>\n <span style={{ fontFamily: t.mono, fontSize: \"9px\", color: \"#fff\", opacity: 0.55, letterSpacing: \"1px\" }}>LAYOUT</span>\n {LAYOUTS.map((l) => (\n <button\n key={l.key}\n onClick={() => setLayout(l.key)}\n style={{\n fontFamily: t.mono,\n fontSize: \"8px\",\n letterSpacing: \"1px\",\n cursor: \"pointer\",\n padding: \"7px 9px\",\n borderRadius: \"6px\",\n border: \"2px solid \" + (layout === l.key ? t.accent : \"#ffffff22\"),\n background: layout === l.key ? t.accent : \"#ffffff10\",\n color: layout === l.key ? \"#10131c\" : \"#fff\",\n }}\n >\n {l.name}\n </button>\n ))}\n </div>\n )}\n\n <div\n style={{\n width: \"100%\",\n maxWidth: narrow ? \"100%\" : t.mainDir === \"row\" ? \"860px\" : \"540px\",\n background: t.cabinet,\n border: narrow ? \"none\" : \"4px solid \" + t.cabinetBorder,\n borderRadius: narrow ? \"10px\" : t.radius,\n boxShadow: narrow ? \"none\" : \"0 18px 50px rgba(0,0,0,.5)\" + (t.glow ? \", 0 0 30px \" + t.accent + \"33\" : \"\"),\n overflow: \"hidden\",\n }}\n >\n <div\n style={{\n background: t.marqueeBg,\n padding: narrow ? \"10px\" : \"14px\",\n display: \"flex\",\n gap: narrow ? \"8px\" : \"12px\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexWrap: \"wrap\",\n borderBottom: narrow ? \"none\" : \"3px solid \" + t.cabinetBorder,\n }}\n >\n <span style={{ width: \"10px\", height: \"10px\", borderRadius: \"50%\", background: t.accent, boxShadow: \"0 0 8px \" + t.accent, flex: \"0 0 auto\" }} />\n <span\n style={{\n fontFamily: t.mono,\n fontSize: t.titleText === \"WANTED\" ? \"20px\" : narrow ? \"10px\" : \"15px\",\n color: t.title,\n letterSpacing: narrow ? \"1px\" : \"2px\",\n textShadow: t.glow ? \"0 0 10px \" + t.accent : \"2px 2px 0 #00000044\",\n textAlign: \"center\",\n lineHeight: 1.5,\n }}\n >\n {t.titleText}\n </span>\n <span style={{ width: \"10px\", height: \"10px\", borderRadius: \"50%\", background: t.accent, boxShadow: \"0 0 8px \" + t.accent, flex: \"0 0 auto\" }} />\n </div>\n\n <div\n style={{\n display: \"flex\",\n flexDirection: stacked ? \"column\" : \"row\",\n gap: \"16px\",\n padding: narrow ? \"10px\" : \"18px\",\n alignItems: stacked ? \"center\" : \"stretch\",\n }}\n >\n {/* screen card */}\n <div\n style={{\n flex: stacked ? \"0 0 auto\" : \"0 0 300px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n alignItems: \"center\",\n width: stacked ? \"100%\" : undefined,\n maxWidth: \"100%\",\n }}\n >\n <div\n style={{\n position: \"relative\",\n padding: \"10px\",\n background: t.screenBg,\n borderRadius: t.paper ? \"4px\" : \"10px\",\n border: \"4px solid \" + t.cabinetBorder,\n boxShadow: \"inset 0 0 20px rgba(0,0,0,.6)\",\n cursor: showCombat ? \"pointer\" : \"default\",\n }}\n onClick={showCombat ? () => setModalOpen(true) : undefined}\n >\n <AvatarPreview\n config={config}\n width={320}\n height={400}\n style={{ width: \"264px\", maxWidth: \"100%\", height: \"auto\", aspectRatio: \"320 / 400\", borderRadius: \"3px\" }}\n />\n <div\n style={{\n position: \"absolute\",\n inset: \"10px\",\n pointerEvents: \"none\",\n borderRadius: \"3px\",\n backgroundImage: \"repeating-linear-gradient(0deg, rgba(0,0,0,.16) 0 2px, transparent 2px 4px)\",\n mixBlendMode: \"multiply\",\n }}\n />\n {showCombat && (\n <div\n style={{\n position: \"absolute\",\n right: \"14px\",\n bottom: \"14px\",\n fontFamily: t.mono,\n fontSize: \"7px\",\n letterSpacing: \"1px\",\n color: t.title,\n background: t.marqueeBg,\n border: \"2px solid \" + t.cabinetBorder,\n borderRadius: \"6px\",\n padding: \"5px 7px\",\n pointerEvents: \"none\",\n }}\n >\n ⚔ FIGHT\n </div>\n )}\n </div>\n <div\n style={{\n fontFamily: t.mono,\n fontSize: \"9px\",\n color: t.title,\n letterSpacing: \"1px\",\n padding: \"6px 10px\",\n background: t.marqueeBg,\n borderRadius: \"5px\",\n textAlign: \"center\",\n border: \"2px solid \" + t.cabinetBorder,\n }}\n >\n {\"THE \" + nameDisplay + \" WEARER\"}\n </div>\n\n <div style={{ width: \"264px\", maxWidth: \"100%\", display: \"flex\", flexDirection: \"column\", gap: \"8px\", marginTop: \"2px\" }}>\n <div style={{ display: \"flex\", gap: \"6px\", width: \"100%\" }}>\n {VIEW_OPTIONS.map((o) => (\n <button\n key={o.key}\n onClick={() => patch({ view: o.key })}\n style={{\n fontFamily: t.mono,\n fontSize: \"7px\",\n letterSpacing: \".5px\",\n cursor: \"pointer\",\n flex: 1,\n padding: \"8px 4px\",\n borderRadius: t.paper ? \"3px\" : \"6px\",\n border: \"2px solid \" + (config.view === o.key ? t.accent : t.panelBorder),\n background: config.view === o.key ? t.accent : t.paper ? \"#ffffff55\" : \"#ffffff10\",\n color: config.view === o.key ? \"#10131c\" : t.text,\n }}\n >\n {o.name}\n </button>\n ))}\n </div>\n\n {partRow(\"mouth\", \"MOUTH\")}\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>BACKGROUND</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {BG.map((c) => (\n <button key={c} onClick={() => patch({ background: c })} style={swatchBtn(c, config.background === c)} />\n ))}\n </div>\n </div>\n\n {showCode && (\n <>\n <div style={dividerStyle} />\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"6px\" }}>\n <span style={codeLabelStyle}>CODE</span>\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n <div style={codeFieldStyle}>{encodeConfig(config)}</div>\n <button onClick={onCopyCode} style={smallBtnStyle}>\n COPY\n </button>\n </div>\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n <input\n value={codeInput}\n onChange={(e) => {\n setCodeInput(e.target.value);\n setCodeMsg(\"\");\n }}\n placeholder=\"Paste code…\"\n style={codeFieldStyle}\n />\n <button onClick={onLoadCode} style={smallBtnStyle}>\n LOAD\n </button>\n </div>\n {codeMsg && <span style={{ fontFamily: t.mono, fontSize: \"7px\", color: t.accent }}>{codeMsg}</span>}\n </div>\n </>\n )}\n\n {showSeed && (\n <>\n <div style={dividerStyle} />\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"6px\" }}>\n <span style={codeLabelStyle}>SEED</span>\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n <input\n value={seedInput}\n onChange={(e) => setSeedInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") onGenerateSeed();\n }}\n placeholder=\"e.g. your name…\"\n style={codeFieldStyle}\n />\n <button onClick={onGenerateSeed} style={smallBtnStyle}>\n GENERATE\n </button>\n </div>\n </div>\n </>\n )}\n </div>\n </div>\n\n {/* controls card */}\n <div\n style={{\n flex: 1,\n minWidth: 0,\n width: stacked ? \"100%\" : \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"9px\",\n background: t.panel,\n border: \"3px solid \" + t.panelBorder,\n borderRadius: t.paper ? \"4px\" : \"10px\",\n padding: \"14px\",\n }}\n >\n {PART_CONTROLS.map((c) => partRow(c.key, c.label))}\n\n <div style={dividerStyle} />\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>SKIN</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {SKIN.map((c) => (\n <button key={c} onClick={() => patch({ skin: c })} style={swatchBtn(c, config.skin === c)} />\n ))}\n </div>\n </div>\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>HAIR</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {HAIRS.map((c) => (\n <button key={c} onClick={() => patch({ hairColor: c })} style={swatchBtn(c, config.hairColor === c)} />\n ))}\n </div>\n </div>\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>CLOTHING</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {CLOTH.map((c) => (\n <button key={c} onClick={() => patch({ topColor: c })} style={swatchBtn(c, config.topColor === c)} />\n ))}\n </div>\n </div>\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>TROUSERS</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {PANTS.map((c) => (\n <button key={c} onClick={() => patch({ trousersColor: c })} style={swatchBtn(c, config.trousersColor === c)} />\n ))}\n </div>\n </div>\n\n {(onMagic || showRandom) && <div style={dividerStyle} />}\n\n <div style={{ display: \"flex\", gap: \"8px\", marginTop: \"2px\" }}>\n {onMagic && (\n <button\n onClick={onMagic}\n style={{\n fontFamily: t.mono,\n fontSize: \"10px\",\n letterSpacing: \"1px\",\n cursor: \"pointer\",\n padding: \"12px\",\n borderRadius: t.paper ? \"3px\" : \"9px\",\n border: \"3px solid \" + t.title,\n background: \"#9b5de5\",\n color: \"#fff\",\n flex: \"0 0 auto\",\n }}\n >\n ✨ MAGIC\n </button>\n )}\n {showRandom && (\n <button\n onClick={onRandom}\n style={{\n fontFamily: t.mono,\n fontSize: \"10px\",\n letterSpacing: \"1px\",\n cursor: \"pointer\",\n padding: \"12px\",\n borderRadius: t.paper ? \"3px\" : \"9px\",\n border: \"3px solid \" + t.title,\n background: t.accent,\n color: \"#10131c\",\n flex: 1,\n }}\n >\n 🎲 RANDOM\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n\n {showCombat && modalOpen && <CombatModal config={config} theme={t} onClose={() => setModalOpen(false)} />}\n </div>\n );\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -57,6 +57,8 @@ interface AvatarEditorProps {
|
|
|
57
57
|
showCode?: boolean;
|
|
58
58
|
/** Show the seed input. Default `true`. */
|
|
59
59
|
showSeed?: boolean;
|
|
60
|
+
/** Show the built-in "🎲 RANDOM" button. Default `true`. */
|
|
61
|
+
showRandom?: boolean;
|
|
60
62
|
/** When set, renders a "✨ MAGIC" button next to RANDOM (e.g. to open an AI prompt modal). */
|
|
61
63
|
onMagic?: () => void;
|
|
62
64
|
/** Inject the pixel web fonts (Press Start 2P + VT323) into `<head>`. Default `true`. */
|
package/dist/index.d.ts
CHANGED
|
@@ -57,6 +57,8 @@ interface AvatarEditorProps {
|
|
|
57
57
|
showCode?: boolean;
|
|
58
58
|
/** Show the seed input. Default `true`. */
|
|
59
59
|
showSeed?: boolean;
|
|
60
|
+
/** Show the built-in "🎲 RANDOM" button. Default `true`. */
|
|
61
|
+
showRandom?: boolean;
|
|
60
62
|
/** When set, renders a "✨ MAGIC" button next to RANDOM (e.g. to open an AI prompt modal). */
|
|
61
63
|
onMagic?: () => void;
|
|
62
64
|
/** Inject the pixel web fonts (Press Start 2P + VT323) into `<head>`. Default `true`. */
|
package/dist/index.js
CHANGED
|
@@ -287,6 +287,7 @@ function AvatarEditor(props) {
|
|
|
287
287
|
showCombat = true,
|
|
288
288
|
showCode = true,
|
|
289
289
|
showSeed = true,
|
|
290
|
+
showRandom = true,
|
|
290
291
|
onMagic,
|
|
291
292
|
loadFonts = true,
|
|
292
293
|
className,
|
|
@@ -722,7 +723,7 @@ function AvatarEditor(props) {
|
|
|
722
723
|
/* @__PURE__ */ jsx("span", { style: swatchLabelStyle, children: "TROUSERS" }),
|
|
723
724
|
/* @__PURE__ */ jsx("div", { style: { display: "flex", gap: "6px", flexWrap: "wrap" }, children: PANTS.map((c) => /* @__PURE__ */ jsx("button", { onClick: () => patch({ trousersColor: c }), style: swatchBtn(c, config.trousersColor === c) }, c)) })
|
|
724
725
|
] }),
|
|
725
|
-
/* @__PURE__ */ jsx("div", { style: dividerStyle }),
|
|
726
|
+
(onMagic || showRandom) && /* @__PURE__ */ jsx("div", { style: dividerStyle }),
|
|
726
727
|
/* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: "8px", marginTop: "2px" }, children: [
|
|
727
728
|
onMagic && /* @__PURE__ */ jsx(
|
|
728
729
|
"button",
|
|
@@ -743,7 +744,7 @@ function AvatarEditor(props) {
|
|
|
743
744
|
children: "\u2728 MAGIC"
|
|
744
745
|
}
|
|
745
746
|
),
|
|
746
|
-
/* @__PURE__ */ jsx(
|
|
747
|
+
showRandom && /* @__PURE__ */ jsx(
|
|
747
748
|
"button",
|
|
748
749
|
{
|
|
749
750
|
onClick: onRandom,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/AvatarPreview.tsx","../src/CombatModal.tsx","../src/theme.ts","../src/AvatarEditor.tsx"],"names":["useRef","useEffect","jsx","useState","jsxs"],"mappings":";;;;;;AAsBO,SAAS,aAAA,CAAc;AAAA,EAC5B,MAAA;AAAA,EACA,KAAA,GAAQ,GAAA;AAAA,EACR,MAAA,GAAS,GAAA;AAAA,EACT,UAAA,GAAa,IAAA;AAAA,EACb,KAAA,GAAQ,IAAA;AAAA,EACR,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAA2C;AACzC,EAAA,MAAM,GAAA,GAAM,OAA0B,IAAI,CAAA;AAE1C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,SAAS,GAAA,CAAI,OAAA;AACnB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,YAAA,CAAa,MAAA,EAAQ,MAAA,EAAQ,EAAE,UAAA,EAAY,OAAO,CAAA;AAAA,EACpD,GAAG,CAAC,MAAA,EAAQ,YAAY,KAAA,EAAO,KAAA,EAAO,MAAM,CAAC,CAAA;AAE7C,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAO,EAAE,cAAA,EAAgB,aAAa,OAAA,EAAS,OAAA,EAAS,GAAG,KAAA,EAAM;AAAA,MACjE;AAAA;AAAA,GACF;AAEJ;ACtCO,SAAS,YAAY,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA,EAAG,SAAQ,EAAyC;AAC/F,EAAA,MAAM,SAAA,GAAYA,OAA0B,IAAI,CAAA;AAChD,EAAA,MAAM,QAAA,GAAWA,OAA2B,IAAI,CAAA;AAChD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAe,MAAM,CAAA;AAE7C,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,QAAQ,IAAI,WAAA,CAAY,QAAQ,EAAE,IAAA,EAAM,QAAQ,CAAA;AACtD,IAAA,KAAA,CAAM,UAAU,MAAM,CAAA;AACtB,IAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AACnB,IAAA,OAAO,MAAM,MAAM,OAAA,EAAQ;AAAA,EAE7B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAA,UAAU,MAAM;AACd,IAAA,QAAA,CAAS,OAAA,EAAS,UAAU,MAAM,CAAA;AAAA,EACpC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAAA,UAAU,MAAM;AACd,IAAA,QAAA,CAAS,OAAA,EAAS,QAAQ,IAAI,CAAA;AAAA,EAChC,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,uBACEC,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,OAAA;AAAA,MACT,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,EAAA;AAAA,QACR,UAAA,EAAY,mBAAA;AAAA,QACZ,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,OAAA,EAAS,MAAA;AAAA,QACT,cAAA,EAAgB;AAAA,OAClB;AAAA,MAEA,QAAA,kBAAA,IAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,UAClC,KAAA,EAAO;AAAA,YACL,YAAY,CAAA,CAAE,OAAA;AAAA,YACd,MAAA,EAAQ,eAAe,CAAA,CAAE,aAAA;AAAA,YACzB,YAAA,EAAc,CAAA,CAAE,KAAA,GAAQ,KAAA,GAAQ,MAAA;AAAA,YAChC,OAAA,EAAS,MAAA;AAAA,YACT,OAAA,EAAS,MAAA;AAAA,YACT,aAAA,EAAe,QAAA;AAAA,YACf,GAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,MAAA;AAAA,YACP,QAAA,EAAU,OAAA;AAAA,YACV,SAAA,EAAW;AAAA,WACb;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,eAAA,EAAiB,GAAA,EAAK,MAAA,EAAO,EAChG,QAAA,EAAA;AAAA,8BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,YAAY,CAAA,CAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,OAAO,CAAA,CAAE,KAAA,EAAO,aAAA,EAAe,KAAA,IAAS,QAAA,EAAA,oBAAA,EAE7F,CAAA;AAAA,8BACAA,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,OAAA;AAAA,kBACT,KAAA,EAAO;AAAA,oBACL,YAAY,CAAA,CAAE,IAAA;AAAA,oBACd,QAAA,EAAU,MAAA;AAAA,oBACV,MAAA,EAAQ,SAAA;AAAA,oBACR,KAAA,EAAO,MAAA;AAAA,oBACP,MAAA,EAAQ,MAAA;AAAA,oBACR,YAAA,EAAc,KAAA;AAAA,oBACd,MAAA,EAAQ,eAAe,CAAA,CAAE,WAAA;AAAA,oBACzB,UAAA,EAAY,WAAA;AAAA,oBACZ,KAAA,EAAO,MAAA;AAAA,oBACP,IAAA,EAAM;AAAA,mBACR;AAAA,kBACD,QAAA,EAAA;AAAA;AAAA;AAED,aAAA,EACF,CAAA;AAAA,4BACAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAK,SAAA;AAAA,gBACL,KAAA,EAAO,GAAA;AAAA,gBACP,MAAA,EAAQ,GAAA;AAAA,gBACR,KAAA,EAAO;AAAA,kBACL,KAAA,EAAO,MAAA;AAAA,kBACP,QAAA,EAAU,OAAA;AAAA,kBACV,WAAA,EAAa,WAAA;AAAA,kBACb,cAAA,EAAgB,WAAA;AAAA,kBAChB,OAAA,EAAS,OAAA;AAAA,kBACT,MAAA,EAAQ,QAAA;AAAA,kBACR,YAAA,EAAc,KAAA;AAAA,kBACd,MAAA,EAAQ,eAAe,CAAA,CAAE,aAAA;AAAA,kBACzB,UAAA,EAAY;AAAA;AACd;AAAA,aACF;AAAA,4BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,mBAAA,EAAqB,eAAA,EAAiB,GAAA,EAAK,OAAM,EAC7E,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,sBACVA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,gBACxB,KAAA,EAAO;AAAA,kBACL,YAAY,CAAA,CAAE,IAAA;AAAA,kBACd,QAAA,EAAU,KAAA;AAAA,kBACV,aAAA,EAAe,MAAA;AAAA,kBACf,MAAA,EAAQ,SAAA;AAAA,kBACR,OAAA,EAAS,UAAA;AAAA,kBACT,YAAA,EAAc,KAAA;AAAA,kBACd,MAAA,EAAQ,YAAA,IAAgB,IAAA,KAAS,CAAA,GAAI,SAAA,GAAY,SAAA,CAAA;AAAA,kBACjD,UAAA,EAAY,IAAA,KAAS,CAAA,GAAI,SAAA,GAAY,SAAA;AAAA,kBACrC,KAAA,EAAO,IAAA,KAAS,CAAA,GAAI,SAAA,GAAY;AAAA,iBAClC;AAAA,gBAEC,QAAA,EAAA,UAAA,CAAW,CAAC,CAAA,CAAE,WAAA;AAAY,eAAA;AAAA,cAdtB;AAAA,aAgBR,CAAA,EACH;AAAA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;;;AC3HO,IAAM,OAAA,GAAoD;AAAA,EAC/D,EAAE,GAAA,EAAK,QAAA,EAAU,IAAA,EAAM,QAAA,EAAS;AAAA,EAChC,EAAE,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA,EAClC,EAAE,GAAA,EAAK,YAAA,EAAc,IAAA,EAAM,QAAA;AAC7B;AAyBA,IAAM,IAAA,GAAO,4BAAA;AACb,IAAM,IAAA,GAAO,mBAAA;AAGN,SAAS,MAAM,MAAA,EAAuB;AAC3C,EAAA,IAAI,WAAW,SAAA,EAAW;AACxB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS,SAAA;AAAA,MACT,aAAA,EAAe,SAAA;AAAA,MACf,SAAA,EAAW,SAAA;AAAA,MACX,KAAA,EAAO,SAAA;AAAA,MACP,MAAA,EAAQ,SAAA;AAAA,MACR,QAAA,EAAU,SAAA;AAAA,MACV,KAAA,EAAO,SAAA;AAAA,MACP,WAAA,EAAa,SAAA;AAAA,MACb,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM,SAAA;AAAA,MACN,GAAA,EAAK,SAAA;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,IAAA,EAAM,IAAA;AAAA,MACN,IAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAQ,MAAA;AAAA,MACR,SAAA,EAAW,qCAAA;AAAA,MACX,IAAA,EAAM,KAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AACA,EAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS,SAAA;AAAA,MACT,aAAA,EAAe,SAAA;AAAA,MACf,SAAA,EAAW,SAAA;AAAA,MACX,KAAA,EAAO,SAAA;AAAA,MACP,MAAA,EAAQ,SAAA;AAAA,MACR,QAAA,EAAU,SAAA;AAAA,MACV,KAAA,EAAO,SAAA;AAAA,MACP,WAAA,EAAa,SAAA;AAAA,MACb,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM,SAAA;AAAA,MACN,GAAA,EAAK,SAAA;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,IAAA,EAAM,IAAA;AAAA,MACN,IAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAQ,KAAA;AAAA,MACR,SAAA,EAAW,QAAA;AAAA,MACX,IAAA,EAAM,KAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AACA,EAAA,OAAO;AAAA;AAAA,IAEL,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA,IACT,aAAA,EAAe,SAAA;AAAA,IACf,SAAA,EAAW,SAAA;AAAA,IACX,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,SAAA;AAAA,IACV,KAAA,EAAO,SAAA;AAAA,IACP,WAAA,EAAa,SAAA;AAAA,IACb,KAAA,EAAO,SAAA;AAAA,IACP,IAAA,EAAM,SAAA;AAAA,IACN,GAAA,EAAK,SAAA;AAAA,IACL,OAAA,EAAS,QAAA;AAAA,IACT,IAAA,EAAM,IAAA;AAAA,IACN,IAAA,EAAM,IAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,SAAA,EAAW,cAAA;AAAA,IACX,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AACF;AAGO,IAAM,UAAA,GAAgC;AAAA,EAC3C;AACF;AC1DA,IAAM,aAAA,GAA4D;AAAA,EAChE,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC/B,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,EAC3B,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,EAC7B,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,EAC7B,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,EAC7B,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,WAAA,EAAY;AAAA,EACvC,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,EAC3B,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,EACrC,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,OAAA;AACzB,CAAA;AAEA,IAAM,YAAA,GAAuD;AAAA,EAC3D,EAAE,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAO;AAAA,EAC5B,EAAE,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC9B,EAAE,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,OAAA;AACxB,CAAA;AAGA,SAAS,SAAA,CAAU,GAAA,EAA0C,UAAA,GAAa,GAAA,EAAc;AACtF,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIC,QAAAA;AAAA,IAC1B,MAAM,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,UAAA,GAAa;AAAA,GAC7D;AACA,EAAAF,UAAU,MAAM;AACd,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,EAAA,IAAM,OAAO,cAAA,KAAmB,WAAA,EAAa;AAClD,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,CAAC,OAAA,KAAY;AACzC,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,EAAG,YAAY,KAAA,IAAS,CAAA;AAC3C,MAAA,IAAI,CAAA,GAAI,CAAA,EAAG,SAAA,CAAU,CAAA,GAAI,UAAU,CAAA;AAAA,IACrC,CAAC,CAAA;AACD,IAAA,EAAA,CAAG,QAAQ,EAAE,CAAA;AACb,IAAA,OAAO,MAAM,GAAG,UAAA,EAAW;AAAA,EAC7B,CAAA,EAAG,CAAC,GAAA,EAAK,UAAU,CAAC,CAAA;AACpB,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAA,CACP,UAAA,EACA,OAAA,EACA,QAAA,EACqB;AACrB,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIE,SAAY,OAAO,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,UAAA,KAAe,MAAA,GAAY,UAAA,GAAa,QAAA;AACtD,EAAA,MAAM,GAAA,GAAM,WAAA;AAAA,IACV,CAAC,CAAA,KAAS;AACR,MAAA,IAAI,UAAA,KAAe,MAAA,EAAW,WAAA,CAAY,CAAC,CAAA;AAC3C,MAAA,QAAA,GAAW,CAAC,CAAA;AAAA,IACd,CAAA;AAAA,IACA,CAAC,YAAY,QAAQ;AAAA,GACvB;AACA,EAAA,OAAO,CAAC,OAAO,GAAG,CAAA;AACpB;AAOO,SAAS,aAAa,KAAA,EAA8C;AACzE,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,YAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA,EAAQ,UAAA;AAAA,IACR,aAAA,GAAgB,QAAA;AAAA,IAChB,cAAA;AAAA,IACA,gBAAA,GAAmB,IAAA;AAAA,IACnB,UAAA,GAAa,IAAA;AAAA,IACb,QAAA,GAAW,IAAA;AAAA,IACX,QAAA,GAAW,IAAA;AAAA,IACX,OAAA;AAAA,IACA,SAAA,GAAY,IAAA;AAAA,IACZ,SAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,MAAM,aAAA,GAAgB,OAAA;AAAA,IACpB,MAAM,gBAAgB,KAAA,IAAS,YAAA,KAAiB,OAAO,cAAA,CAAe,IAAI,IAAI,cAAA,CAAe,CAAA;AAAA;AAAA;AAAA,IAG7F;AAAC,GACH;AAEA,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,IAAI,eAAA,CAA8B,KAAA,EAAO,eAAe,QAAQ,CAAA;AACxF,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,IAAI,eAAA,CAAwB,UAAA,EAAY,eAAe,cAAc,CAAA;AAC7F,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,EAAE,CAAA;AACzC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,QAAAA,CAAS,QAAQ,EAAE,CAAA;AAErD,EAAA,MAAM,QAAA,GAAWH,OAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,UAAU,QAAQ,CAAA;AAEjC,EAAA,MAAM,CAAA,GAAI,MAAM,MAAM,CAAA;AACtB,EAAA,MAAM,OAAA,GAAU,MAAA,IAAU,CAAA,CAAE,OAAA,KAAY,QAAA;AAExC,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,IAAa,OAAO,QAAA,KAAa,WAAA,EAAa;AACnD,IAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,MAAA,IAAI,QAAA,CAAS,aAAA,CAAc,CAAA,WAAA,EAAc,IAAI,IAAI,CAAA,EAAG;AACpD,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,MAAA,IAAA,CAAK,GAAA,GAAM,YAAA;AACX,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,IAChC;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAC,CAAA,KAA6B,UAAU,EAAE,GAAG,MAAA,EAAQ,GAAG,GAAG,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAS,CAAC,CAAA;AAC3G,EAAA,MAAM,KAAA,GAAQ,WAAA;AAAA,IACZ,CAAC,KAAc,GAAA,KAAgB;AAC7B,MAAA,MAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AACrB,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAU,CAAA;AAC5C,MAAA,KAAA,CAAM,EAAE,CAAC,GAAG,GAAG,GAAA,CAAA,CAAK,GAAA,GAAM,GAAA,GAAM,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,MAAM,CAAA,EAA4B,CAAA;AAAA,IACtF,CAAA;AAAA,IACA,CAAC,QAAQ,KAAK;AAAA,GAChB;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,EAAE,GAAG,cAAa,EAAG,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,CAAA;AACzE,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAM,IAAA,GAAO,aAAa,MAAM,CAAA;AAChC,IAAA,IAAI;AACF,MAAA,SAAA,CAAU,SAAA,CAAU,UAAU,IAAI,CAAA;AAClC,MAAA,UAAA,CAAW,SAAS,CAAA;AAAA,IACtB,CAAA,CAAA,MAAQ;AACN,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,UAAA,CAAW,UAAU,CAAA;AAAA,IACvB;AAAA,EACF,CAAA;AACA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,CAAC,SAAA,CAAU,IAAA,EAAK,EAAG;AACvB,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,SAAA,EAAW,MAAM,CAAA;AAC3C,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,UAAA,CAAW,SAAS,CAAA;AAAA,EACtB,CAAA;AACA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,CAAC,SAAA,CAAU,IAAA,EAAK,EAAG;AACvB,IAAA,SAAA,CAAU,EAAE,GAAG,cAAA,CAAe,SAAS,GAAG,IAAA,EAAM,MAAA,CAAO,MAAM,CAAA;AAAA,EAC/D,CAAA;AAGA,EAAA,MAAM,UAAA,GAAkC;AAAA,IACtC,YAAY,CAAA,CAAE,IAAA;AAAA,IACd,QAAA,EAAU,MAAA;AAAA,IACV,MAAA,EAAQ,SAAA;AAAA,IACR,IAAA,EAAM,UAAA;AAAA,IACN,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,YAAA,EAAc,CAAA,CAAE,KAAA,GAAQ,KAAA,GAAQ,KAAA;AAAA,IAChC,MAAA,EAAQ,eAAe,CAAA,CAAE,MAAA;AAAA,IACzB,YAAY,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,MAAA,GAAS,EAAE,MAAA,GAAS,IAAA;AAAA,IAC3C,KAAA,EAAO,CAAA,CAAE,IAAA,GAAO,SAAA,GAAY,CAAA,CAAE,MAAA;AAAA,IAC9B,UAAA,EAAY;AAAA,GACd;AACA,EAAA,MAAM,QAAA,GAAgC;AAAA,IACpC,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK,KAAA;AAAA,IACL,YAAY,CAAA,CAAE,KAAA;AAAA,IACd,YAAA,EAAc,CAAA,CAAE,KAAA,GAAQ,KAAA,GAAQ,KAAA;AAAA,IAChC,OAAA,EAAS,SAAA;AAAA,IACT,MAAA,EAAQ,eAAe,CAAA,CAAE;AAAA,GAC3B;AACA,EAAA,MAAM,cAAA,GAAsC,EAAE,UAAA,EAAY,CAAA,CAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAM;AACtH,EAAA,MAAM,cAAA,GAAsC,EAAE,UAAA,EAAY,CAAA,CAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,CAAA,CAAE,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,WAAW,KAAA,EAAM;AACrI,EAAA,MAAM,YAAA,GAAoC,EAAE,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAY,EAAE,WAAA,EAAa,OAAA,EAAS,GAAA,EAAK,MAAA,EAAQ,OAAA,EAAQ;AACpH,EAAA,MAAM,cAAA,GAAsC,EAAE,OAAA,EAAS,MAAA,EAAQ,YAAY,QAAA,EAAU,GAAA,EAAK,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAO;AACnH,EAAA,MAAM,gBAAA,GAAwC,EAAE,UAAA,EAAY,CAAA,CAAE,MAAM,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,KAAK,aAAA,EAAe,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,MAAM,UAAA,EAAW;AACzJ,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU,CAAA;AAAA,IACV,UAAA,EAAY,WAAA;AAAA,IACZ,QAAA,EAAU,MAAA;AAAA,IACV,OAAA,EAAS,SAAA;AAAA,IACT,YAAA,EAAc,CAAA,CAAE,KAAA,GAAQ,KAAA,GAAQ,KAAA;AAAA,IAChC,MAAA,EAAQ,eAAe,CAAA,CAAE,WAAA;AAAA,IACzB,UAAA,EAAY,CAAA,CAAE,KAAA,GAAQ,MAAA,GAAS,SAAA;AAAA,IAC/B,OAAO,CAAA,CAAE,IAAA;AAAA,IACT,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,QAAA,EAAU,QAAA;AAAA,IACV,YAAA,EAAc,UAAA;AAAA,IACd,SAAA,EAAW;AAAA,GACb;AACA,EAAA,MAAM,aAAA,GAAqC;AAAA,IACzC,YAAY,CAAA,CAAE,IAAA;AAAA,IACd,QAAA,EAAU,KAAA;AAAA,IACV,aAAA,EAAe,MAAA;AAAA,IACf,MAAA,EAAQ,SAAA;AAAA,IACR,OAAA,EAAS,SAAA;AAAA,IACT,YAAA,EAAc,CAAA,CAAE,KAAA,GAAQ,KAAA,GAAQ,KAAA;AAAA,IAChC,MAAA,EAAQ,eAAe,CAAA,CAAE,MAAA;AAAA,IACzB,YAAY,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,MAAA,GAAS,EAAE,MAAA,GAAS,IAAA;AAAA,IAC3C,KAAA,EAAO,CAAA,CAAE,IAAA,GAAO,SAAA,GAAY,CAAA,CAAE,MAAA;AAAA,IAC9B,IAAA,EAAM;AAAA,GACR;AACA,EAAA,MAAM,cAAA,GAAsC,EAAE,UAAA,EAAY,CAAA,CAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAM;AACtH,EAAA,MAAM,SAAA,GAAY,CAAC,GAAA,EAAa,MAAA,MAA0C;AAAA,IACxE,UAAA,EAAY,GAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA,IACR,OAAA,EAAS,CAAA;AAAA,IACT,YAAA,EAAc,CAAA,CAAE,KAAA,GAAQ,KAAA,GAAQ,KAAA;AAAA,IAChC,QAAQ,YAAA,IAAgB,MAAA,GAAS,EAAE,MAAA,GAAS,CAAA,CAAE,QAAQ,WAAA,GAAc,WAAA,CAAA;AAAA,IACpE,SAAA,EAAW,MAAA,GAAS,YAAA,GAAe,CAAA,CAAE,SAAS,IAAA,GAAO;AAAA,GACvD,CAAA;AAEA,EAAA,MAAM,cAAc,SAAA,CAAU,KAAA,EAAO,MAAA,CAAO,GAAG,EAAE,WAAA,EAAY;AAE7D,EAAA,MAAM,OAAA,GAAU,CAAC,GAAA,EAAc,KAAA,qBAC7BG,IAAAA,CAAC,KAAA,EAAA,EAAc,OAAO,QAAA,EACpB,QAAA,EAAA;AAAA,oBAAAF,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,KAAA,CAAM,KAAK,EAAE,CAAA,EAAG,KAAA,EAAO,UAAA,EAAY,QAAA,EAAA,QAAA,EAE1D,CAAA;AAAA,oBACAE,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,SAAA,EAAW,QAAA,EAAS,EACtD,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EAAiB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACnCA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EAAiB,oBAAU,GAAA,EAAK,MAAA,CAAO,GAAG,CAAC,CAAA,EAAE;AAAA,KAAA,EAC3D,CAAA;AAAA,oBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,KAAA,CAAM,GAAA,EAAK,CAAC,CAAA,EAAG,KAAA,EAAO,UAAA,EAAY,QAAA,EAAA,QAAA,EAEzD;AAAA,GAAA,EAAA,EAVQ,GAWV,CAAA;AAGF,EAAA,uBACEE,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,QAAA;AAAA,MACL,SAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,MAAA;AAAA,QACX,KAAA,EAAO,MAAA;AAAA,QACP,YAAY,CAAA,CAAE,OAAA;AAAA,QACd,OAAA,EAAS,SAAS,MAAA,GAAS,MAAA;AAAA,QAC3B,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe,QAAA;AAAA,QACf,UAAA,EAAY,QAAA;AAAA,QACZ,YAAY,CAAA,CAAE,IAAA;AAAA,QACd,eAAA,EAAiB,oCAAA,GAAuC,CAAA,CAAE,MAAA,GAAS,sBAAA;AAAA,QACnE,SAAA,EAAW,YAAA;AAAA,QACX,GAAG;AAAA,OACL;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,gBAAA,oBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,MAAA,EAAQ,YAAY,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,YAAA,EAAc,QAAO,EACvG,QAAA,EAAA;AAAA,0BAAAF,IAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,QAAQ,OAAA,EAAS,IAAA,EAAM,aAAA,EAAe,KAAA,IAAS,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,UAC/G,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACZA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,OAAA,EAAS,MAAM,SAAA,CAAU,CAAA,CAAE,GAAG,CAAA;AAAA,cAC9B,KAAA,EAAO;AAAA,gBACL,YAAY,CAAA,CAAE,IAAA;AAAA,gBACd,QAAA,EAAU,KAAA;AAAA,gBACV,aAAA,EAAe,KAAA;AAAA,gBACf,MAAA,EAAQ,SAAA;AAAA,gBACR,OAAA,EAAS,SAAA;AAAA,gBACT,YAAA,EAAc,KAAA;AAAA,gBACd,QAAQ,YAAA,IAAgB,MAAA,KAAW,CAAA,CAAE,GAAA,GAAM,EAAE,MAAA,GAAS,WAAA,CAAA;AAAA,gBACtD,UAAA,EAAY,MAAA,KAAW,CAAA,CAAE,GAAA,GAAM,EAAE,MAAA,GAAS,WAAA;AAAA,gBAC1C,KAAA,EAAO,MAAA,KAAW,CAAA,CAAE,GAAA,GAAM,SAAA,GAAY;AAAA,eACxC;AAAA,cAEC,QAAA,EAAA,CAAA,CAAE;AAAA,aAAA;AAAA,YAdE,CAAA,CAAE;AAAA,WAgBV;AAAA,SAAA,EACH,CAAA;AAAA,wBAGFE,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,MAAA;AAAA,cACP,UAAU,MAAA,GAAS,MAAA,GAAS,CAAA,CAAE,OAAA,KAAY,QAAQ,OAAA,GAAU,OAAA;AAAA,cAC5D,YAAY,CAAA,CAAE,OAAA;AAAA,cACd,MAAA,EAAQ,MAAA,GAAS,MAAA,GAAS,YAAA,GAAe,CAAA,CAAE,aAAA;AAAA,cAC3C,YAAA,EAAc,MAAA,GAAS,MAAA,GAAS,CAAA,CAAE,MAAA;AAAA,cAClC,SAAA,EAAW,SAAS,MAAA,GAAS,4BAAA,IAAgC,EAAE,IAAA,GAAO,aAAA,GAAgB,CAAA,CAAE,MAAA,GAAS,IAAA,GAAO,EAAA,CAAA;AAAA,cACxG,QAAA,EAAU;AAAA,aACZ;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAA,IAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,YAAY,CAAA,CAAE,SAAA;AAAA,oBACd,OAAA,EAAS,SAAS,MAAA,GAAS,MAAA;AAAA,oBAC3B,OAAA,EAAS,MAAA;AAAA,oBACT,GAAA,EAAK,SAAS,KAAA,GAAQ,MAAA;AAAA,oBACtB,UAAA,EAAY,QAAA;AAAA,oBACZ,cAAA,EAAgB,QAAA;AAAA,oBAChB,QAAA,EAAU,MAAA;AAAA,oBACV,YAAA,EAAc,MAAA,GAAS,MAAA,GAAS,YAAA,GAAe,CAAA,CAAE;AAAA,mBACnD;AAAA,kBAEA,QAAA,EAAA;AAAA,oCAAAF,IAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAQ,MAAA,EAAQ,YAAA,EAAc,OAAO,UAAA,EAAY,CAAA,CAAE,QAAQ,SAAA,EAAW,UAAA,GAAa,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAW,EAAG,CAAA;AAAA,oCAC/IA,GAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAO;AAAA,0BACL,YAAY,CAAA,CAAE,IAAA;AAAA,0BACd,UAAU,CAAA,CAAE,SAAA,KAAc,QAAA,GAAW,MAAA,GAAS,SAAS,MAAA,GAAS,MAAA;AAAA,0BAChE,OAAO,CAAA,CAAE,KAAA;AAAA,0BACT,aAAA,EAAe,SAAS,KAAA,GAAQ,KAAA;AAAA,0BAChC,UAAA,EAAY,CAAA,CAAE,IAAA,GAAO,WAAA,GAAc,EAAE,MAAA,GAAS,qBAAA;AAAA,0BAC9C,SAAA,EAAW,QAAA;AAAA,0BACX,UAAA,EAAY;AAAA,yBACd;AAAA,wBAEC,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA,qBACL;AAAA,oCACAA,IAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAQ,MAAA,EAAQ,YAAA,EAAc,OAAO,UAAA,EAAY,CAAA,CAAE,QAAQ,SAAA,EAAW,UAAA,GAAa,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAW,EAAG;AAAA;AAAA;AAAA,eACjJ;AAAA,8BAEAE,IAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,OAAA,EAAS,MAAA;AAAA,oBACT,aAAA,EAAe,UAAU,QAAA,GAAW,KAAA;AAAA,oBACpC,GAAA,EAAK,MAAA;AAAA,oBACL,OAAA,EAAS,SAAS,MAAA,GAAS,MAAA;AAAA,oBAC3B,UAAA,EAAY,UAAU,QAAA,GAAW;AAAA,mBACnC;AAAA,kBAGA,QAAA,EAAA;AAAA,oCAAAA,IAAAA;AAAA,sBAAC,KAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAO;AAAA,0BACL,IAAA,EAAM,UAAU,UAAA,GAAa,WAAA;AAAA,0BAC7B,OAAA,EAAS,MAAA;AAAA,0BACT,aAAA,EAAe,QAAA;AAAA,0BACf,GAAA,EAAK,KAAA;AAAA,0BACL,UAAA,EAAY,QAAA;AAAA,0BACZ,KAAA,EAAO,UAAU,MAAA,GAAS,MAAA;AAAA,0BAC1B,QAAA,EAAU;AAAA,yBACZ;AAAA,wBAEA,QAAA,EAAA;AAAA,0CAAAA,IAAAA;AAAA,4BAAC,KAAA;AAAA,4BAAA;AAAA,8BACC,KAAA,EAAO;AAAA,gCACL,QAAA,EAAU,UAAA;AAAA,gCACV,OAAA,EAAS,MAAA;AAAA,gCACT,YAAY,CAAA,CAAE,QAAA;AAAA,gCACd,YAAA,EAAc,CAAA,CAAE,KAAA,GAAQ,KAAA,GAAQ,MAAA;AAAA,gCAChC,MAAA,EAAQ,eAAe,CAAA,CAAE,aAAA;AAAA,gCACzB,SAAA,EAAW,+BAAA;AAAA,gCACX,MAAA,EAAQ,aAAa,SAAA,GAAY;AAAA,+BACnC;AAAA,8BACA,OAAA,EAAS,UAAA,GAAa,MAAM,YAAA,CAAa,IAAI,CAAA,GAAI,MAAA;AAAA,8BAEjD,QAAA,EAAA;AAAA,gDAAAF,GAAAA;AAAA,kCAAC,aAAA;AAAA,kCAAA;AAAA,oCACC,MAAA;AAAA,oCACA,KAAA,EAAO,GAAA;AAAA,oCACP,MAAA,EAAQ,GAAA;AAAA,oCACR,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAa,WAAA,EAAa,YAAA,EAAc,KAAA;AAAM;AAAA,iCAC3G;AAAA,gDACAA,GAAAA;AAAA,kCAAC,KAAA;AAAA,kCAAA;AAAA,oCACC,KAAA,EAAO;AAAA,sCACL,QAAA,EAAU,UAAA;AAAA,sCACV,KAAA,EAAO,MAAA;AAAA,sCACP,aAAA,EAAe,MAAA;AAAA,sCACf,YAAA,EAAc,KAAA;AAAA,sCACd,eAAA,EAAiB,6EAAA;AAAA,sCACjB,YAAA,EAAc;AAAA;AAChB;AAAA,iCACF;AAAA,gCACC,8BACCA,GAAAA;AAAA,kCAAC,KAAA;AAAA,kCAAA;AAAA,oCACC,KAAA,EAAO;AAAA,sCACL,QAAA,EAAU,UAAA;AAAA,sCACV,KAAA,EAAO,MAAA;AAAA,sCACP,MAAA,EAAQ,MAAA;AAAA,sCACR,YAAY,CAAA,CAAE,IAAA;AAAA,sCACd,QAAA,EAAU,KAAA;AAAA,sCACV,aAAA,EAAe,KAAA;AAAA,sCACf,OAAO,CAAA,CAAE,KAAA;AAAA,sCACT,YAAY,CAAA,CAAE,SAAA;AAAA,sCACd,MAAA,EAAQ,eAAe,CAAA,CAAE,aAAA;AAAA,sCACzB,YAAA,EAAc,KAAA;AAAA,sCACd,OAAA,EAAS,SAAA;AAAA,sCACT,aAAA,EAAe;AAAA,qCACjB;AAAA,oCACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,2BAEJ;AAAA,0CACAA,GAAAA;AAAA,4BAAC,KAAA;AAAA,4BAAA;AAAA,8BACC,KAAA,EAAO;AAAA,gCACL,YAAY,CAAA,CAAE,IAAA;AAAA,gCACd,QAAA,EAAU,KAAA;AAAA,gCACV,OAAO,CAAA,CAAE,KAAA;AAAA,gCACT,aAAA,EAAe,KAAA;AAAA,gCACf,OAAA,EAAS,UAAA;AAAA,gCACT,YAAY,CAAA,CAAE,SAAA;AAAA,gCACd,YAAA,EAAc,KAAA;AAAA,gCACd,SAAA,EAAW,QAAA;AAAA,gCACX,MAAA,EAAQ,eAAe,CAAA,CAAE;AAAA,+BAC3B;AAAA,8BAEC,mBAAS,WAAA,GAAc;AAAA;AAAA,2BAC1B;AAAA,0CAEAE,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAO,OAAA,EAAS,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,KAAK,KAAA,EAAO,SAAA,EAAW,OAAM,EACrH,QAAA,EAAA;AAAA,4CAAAF,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,QAAO,EACtD,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,sBACjBA,GAAAA;AAAA,8BAAC,QAAA;AAAA,8BAAA;AAAA,gCAEC,SAAS,MAAM,KAAA,CAAM,EAAE,IAAA,EAAM,CAAA,CAAE,KAAK,CAAA;AAAA,gCACpC,KAAA,EAAO;AAAA,kCACL,YAAY,CAAA,CAAE,IAAA;AAAA,kCACd,QAAA,EAAU,KAAA;AAAA,kCACV,aAAA,EAAe,MAAA;AAAA,kCACf,MAAA,EAAQ,SAAA;AAAA,kCACR,IAAA,EAAM,CAAA;AAAA,kCACN,OAAA,EAAS,SAAA;AAAA,kCACT,YAAA,EAAc,CAAA,CAAE,KAAA,GAAQ,KAAA,GAAQ,KAAA;AAAA,kCAChC,MAAA,EAAQ,gBAAgB,MAAA,CAAO,IAAA,KAAS,EAAE,GAAA,GAAM,CAAA,CAAE,SAAS,CAAA,CAAE,WAAA,CAAA;AAAA,kCAC7D,UAAA,EAAY,OAAO,IAAA,KAAS,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,KAAA,GAAQ,WAAA,GAAc,WAAA;AAAA,kCACvE,OAAO,MAAA,CAAO,IAAA,KAAS,CAAA,CAAE,GAAA,GAAM,YAAY,CAAA,CAAE;AAAA,iCAC/C;AAAA,gCAEC,QAAA,EAAA,CAAA,CAAE;AAAA,+BAAA;AAAA,8BAfE,CAAA,CAAE;AAAA,6BAiBV,CAAA,EACH,CAAA;AAAA,4BAEC,OAAA,CAAQ,SAAS,OAAO,CAAA;AAAA,4CAEzBE,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EACV,QAAA,EAAA;AAAA,8CAAAF,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,gBAAA,EAAkB,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,8CACzCA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,QAAA,EAAU,QAAO,EACzD,QAAA,EAAA,EAAA,CAAG,GAAA,CAAI,CAAC,sBACPA,GAAAA,CAAC,QAAA,EAAA,EAAe,OAAA,EAAS,MAAM,KAAA,CAAM,EAAE,UAAA,EAAY,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,SAAA,CAAU,CAAA,EAAG,OAAO,UAAA,KAAe,CAAC,CAAA,EAAA,EAAvF,CAA0F,CACxG,CAAA,EACH;AAAA,6BAAA,EACF,CAAA;AAAA,4BAEC,QAAA,oBACCE,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,8CAAAF,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,EAAc,CAAA;AAAA,8CAC1BE,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,KAAA,EAAM,EACjE,QAAA,EAAA;AAAA,gDAAAF,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,gDACjCE,KAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAM,EACxC,QAAA,EAAA;AAAA,kDAAAF,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EAAiB,QAAA,EAAA,YAAA,CAAa,MAAM,CAAA,EAAE,CAAA;AAAA,kDAClDA,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,UAAA,EAAY,KAAA,EAAO,eAAe,QAAA,EAAA,MAAA,EAEnD;AAAA,iCAAA,EACF,CAAA;AAAA,gDACAE,KAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAM,EACxC,QAAA,EAAA;AAAA,kDAAAF,GAAAA;AAAA,oCAAC,OAAA;AAAA,oCAAA;AAAA,sCACC,KAAA,EAAO,SAAA;AAAA,sCACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,wCAAA,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAC3B,wCAAA,UAAA,CAAW,EAAE,CAAA;AAAA,sCACf,CAAA;AAAA,sCACA,WAAA,EAAY,kBAAA;AAAA,sCACZ,KAAA,EAAO;AAAA;AAAA,mCACT;AAAA,kDACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,UAAA,EAAY,KAAA,EAAO,eAAe,QAAA,EAAA,MAAA,EAEnD;AAAA,iCAAA,EACF,CAAA;AAAA,gCACC,OAAA,oBAAWA,GAAAA,CAAC,MAAA,EAAA,EAAK,OAAO,EAAE,UAAA,EAAY,CAAA,CAAE,IAAA,EAAM,UAAU,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,MAAA,IAAW,QAAA,EAAA,OAAA,EAAQ;AAAA,+BAAA,EAC9F;AAAA,6BAAA,EACF,CAAA;AAAA,4BAGD,QAAA,oBACCE,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,8CAAAF,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,EAAc,CAAA;AAAA,8CAC1BE,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,KAAA,EAAM,EACjE,QAAA,EAAA;AAAA,gDAAAF,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,gDACjCE,KAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAM,EACxC,QAAA,EAAA;AAAA,kDAAAF,GAAAA;AAAA,oCAAC,OAAA;AAAA,oCAAA;AAAA,sCACC,KAAA,EAAO,SAAA;AAAA,sCACP,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,sCAC5C,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,wCAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS,cAAA,EAAe;AAAA,sCACxC,CAAA;AAAA,sCACA,WAAA,EAAY,sBAAA;AAAA,sCACZ,KAAA,EAAO;AAAA;AAAA,mCACT;AAAA,kDACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,cAAA,EAAgB,KAAA,EAAO,eAAe,QAAA,EAAA,UAAA,EAEvD;AAAA,iCAAA,EACF;AAAA,+BAAA,EACF;AAAA,6BAAA,EACF;AAAA,2BAAA,EAEJ;AAAA;AAAA;AAAA,qBACF;AAAA,oCAGAE,IAAAA;AAAA,sBAAC,KAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAO;AAAA,0BACL,IAAA,EAAM,CAAA;AAAA,0BACN,QAAA,EAAU,CAAA;AAAA,0BACV,KAAA,EAAO,UAAU,MAAA,GAAS,MAAA;AAAA,0BAC1B,OAAA,EAAS,MAAA;AAAA,0BACT,aAAA,EAAe,QAAA;AAAA,0BACf,GAAA,EAAK,KAAA;AAAA,0BACL,YAAY,CAAA,CAAE,KAAA;AAAA,0BACd,MAAA,EAAQ,eAAe,CAAA,CAAE,WAAA;AAAA,0BACzB,YAAA,EAAc,CAAA,CAAE,KAAA,GAAQ,KAAA,GAAQ,MAAA;AAAA,0BAChC,OAAA,EAAS;AAAA,yBACX;AAAA,wBAEC,QAAA,EAAA;AAAA,0BAAA,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,OAAA,CAAQ,EAAE,GAAA,EAAK,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,0CAEjDF,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,EAAc,CAAA;AAAA,0CAE1BE,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EACV,QAAA,EAAA;AAAA,4CAAAF,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,gBAAA,EAAkB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,4CACnCA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,QAAA,EAAU,QAAO,EACzD,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,sBACTA,GAAAA,CAAC,QAAA,EAAA,EAAe,OAAA,EAAS,MAAM,KAAA,CAAM,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,SAAA,CAAU,CAAA,EAAG,OAAO,IAAA,KAAS,CAAC,CAAA,EAAA,EAA3E,CAA8E,CAC5F,CAAA,EACH;AAAA,2BAAA,EACF,CAAA;AAAA,0CAEAE,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EACV,QAAA,EAAA;AAAA,4CAAAF,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,gBAAA,EAAkB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,4CACnCA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,QAAA,EAAU,QAAO,EACzD,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,sBACVA,GAAAA,CAAC,QAAA,EAAA,EAAe,OAAA,EAAS,MAAM,KAAA,CAAM,EAAE,SAAA,EAAW,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,SAAA,CAAU,CAAA,EAAG,OAAO,SAAA,KAAc,CAAC,CAAA,EAAA,EAArF,CAAwF,CACtG,CAAA,EACH;AAAA,2BAAA,EACF,CAAA;AAAA,0CAEAE,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EACV,QAAA,EAAA;AAAA,4CAAAF,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,gBAAA,EAAkB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,4CACvCA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,QAAA,EAAU,QAAO,EACzD,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,sBACVA,GAAAA,CAAC,QAAA,EAAA,EAAe,OAAA,EAAS,MAAM,KAAA,CAAM,EAAE,QAAA,EAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,SAAA,CAAU,CAAA,EAAG,OAAO,QAAA,KAAa,CAAC,CAAA,EAAA,EAAnF,CAAsF,CACpG,CAAA,EACH;AAAA,2BAAA,EACF,CAAA;AAAA,0CAEAE,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EACV,QAAA,EAAA;AAAA,4CAAAF,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,gBAAA,EAAkB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,4CACvCA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,QAAA,EAAU,QAAO,EACzD,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,sBACVA,GAAAA,CAAC,QAAA,EAAA,EAAe,OAAA,EAAS,MAAM,KAAA,CAAM,EAAE,aAAA,EAAe,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,SAAA,CAAU,CAAA,EAAG,OAAO,aAAA,KAAkB,CAAC,CAAA,EAAA,EAA7F,CAAgG,CAC9G,CAAA,EACH;AAAA,2BAAA,EACF,CAAA;AAAA,0CAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,EAAc,CAAA;AAAA,0CAE1BE,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,SAAA,EAAW,KAAA,EAAM,EACzD,QAAA,EAAA;AAAA,4BAAA,OAAA,oBACCF,GAAAA;AAAA,8BAAC,QAAA;AAAA,8BAAA;AAAA,gCACC,OAAA,EAAS,OAAA;AAAA,gCACT,KAAA,EAAO;AAAA,kCACL,YAAY,CAAA,CAAE,IAAA;AAAA,kCACd,QAAA,EAAU,MAAA;AAAA,kCACV,aAAA,EAAe,KAAA;AAAA,kCACf,MAAA,EAAQ,SAAA;AAAA,kCACR,OAAA,EAAS,MAAA;AAAA,kCACT,YAAA,EAAc,CAAA,CAAE,KAAA,GAAQ,KAAA,GAAQ,KAAA;AAAA,kCAChC,MAAA,EAAQ,eAAe,CAAA,CAAE,KAAA;AAAA,kCACzB,UAAA,EAAY,SAAA;AAAA,kCACZ,KAAA,EAAO,MAAA;AAAA,kCACP,IAAA,EAAM;AAAA,iCACR;AAAA,gCACD,QAAA,EAAA;AAAA;AAAA,6BAED;AAAA,4CAEFA,GAAAA;AAAA,8BAAC,QAAA;AAAA,8BAAA;AAAA,gCACC,OAAA,EAAS,QAAA;AAAA,gCACT,KAAA,EAAO;AAAA,kCACL,YAAY,CAAA,CAAE,IAAA;AAAA,kCACd,QAAA,EAAU,MAAA;AAAA,kCACV,aAAA,EAAe,KAAA;AAAA,kCACf,MAAA,EAAQ,SAAA;AAAA,kCACR,OAAA,EAAS,MAAA;AAAA,kCACT,YAAA,EAAc,CAAA,CAAE,KAAA,GAAQ,KAAA,GAAQ,KAAA;AAAA,kCAChC,MAAA,EAAQ,eAAe,CAAA,CAAE,KAAA;AAAA,kCACzB,YAAY,CAAA,CAAE,MAAA;AAAA,kCACd,KAAA,EAAO,SAAA;AAAA,kCACP,IAAA,EAAM;AAAA,iCACR;AAAA,gCACD,QAAA,EAAA;AAAA;AAAA;AAED,2BAAA,EACF;AAAA;AAAA;AAAA;AACF;AAAA;AAAA;AACF;AAAA;AAAA,SACF;AAAA,QAEC,UAAA,IAAc,SAAA,oBAAaA,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAgB,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,MAAM,YAAA,CAAa,KAAK,CAAA,EAAG;AAAA;AAAA;AAAA,GACzG;AAEJ","file":"index.js","sourcesContent":["import React, { useRef, useEffect } from \"react\";\nimport { renderAvatar, type AvatarConfig } from \"@retro-antlitz-kartei/generator\";\n\nexport interface AvatarPreviewProps {\n /** The avatar to draw. */\n config: AvatarConfig;\n /** Backing canvas resolution in px. Default `320 × 400`. */\n width?: number;\n height?: number;\n /** Background: `true` = palette colour, hex string = override, `false` = transparent. */\n background?: boolean | string;\n /** Draw the floor strip. Default `true`. */\n floor?: boolean;\n className?: string;\n style?: React.CSSProperties;\n onClick?: () => void;\n}\n\n/**\n * Renders an {@link AvatarConfig} onto a `<canvas>`, re-drawing whenever the\n * config changes. Standalone — use it without the full editor chrome.\n */\nexport function AvatarPreview({\n config,\n width = 320,\n height = 400,\n background = true,\n floor = true,\n className,\n style,\n onClick,\n}: AvatarPreviewProps): React.ReactElement {\n const ref = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n const canvas = ref.current;\n if (!canvas) return;\n renderAvatar(canvas, config, { background, floor });\n }, [config, background, floor, width, height]);\n\n return (\n <canvas\n ref={ref}\n width={width}\n height={height}\n className={className}\n style={{ imageRendering: \"pixelated\", display: \"block\", ...style }}\n onClick={onClick}\n />\n );\n}\n","import React, { useRef, useEffect, useState } from \"react\";\nimport type { AvatarConfig } from \"@retro-antlitz-kartei/generator\";\nimport { AvatarArena, POSES, POSE_NAMES, type Pose } from \"@retro-antlitz-kartei/animate\";\nimport type { Theme } from \"./theme.js\";\n\nexport interface CombatModalProps {\n config: AvatarConfig;\n theme: Theme;\n onClose: () => void;\n}\n\n/** Full-screen overlay running the animated combat arena with pose buttons. */\nexport function CombatModal({ config, theme: t, onClose }: CombatModalProps): React.ReactElement {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const arenaRef = useRef<AvatarArena | null>(null);\n const [pose, setPose] = useState<Pose>(\"idle\");\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const arena = new AvatarArena(canvas, { pose: \"idle\" });\n arena.setConfig(config);\n arenaRef.current = arena;\n return () => arena.destroy();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n arenaRef.current?.setConfig(config);\n }, [config]);\n\n useEffect(() => {\n arenaRef.current?.setPose(pose);\n }, [pose]);\n\n return (\n <div\n onClick={onClose}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 60,\n background: \"rgba(8,4,16,0.82)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"20px\",\n backdropFilter: \"blur(3px)\",\n }}\n >\n <div\n onClick={(e) => e.stopPropagation()}\n style={{\n background: t.cabinet,\n border: \"4px solid \" + t.cabinetBorder,\n borderRadius: t.paper ? \"6px\" : \"14px\",\n padding: \"18px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"14px\",\n width: \"100%\",\n maxWidth: \"420px\",\n boxShadow: \"0 20px 60px rgba(0,0,0,.6)\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: \"10px\" }}>\n <span style={{ fontFamily: t.mono, fontSize: \"10px\", color: t.title, letterSpacing: \"1px\" }}>\n ⚔ COMBAT MODE\n </span>\n <button\n onClick={onClose}\n style={{\n fontFamily: t.mono,\n fontSize: \"11px\",\n cursor: \"pointer\",\n width: \"30px\",\n height: \"30px\",\n borderRadius: \"7px\",\n border: \"2px solid \" + t.panelBorder,\n background: \"#ffffff10\",\n color: \"#fff\",\n flex: \"0 0 auto\",\n }}\n >\n ✕\n </button>\n </div>\n <canvas\n ref={canvasRef}\n width={360}\n height={380}\n style={{\n width: \"100%\",\n maxWidth: \"360px\",\n aspectRatio: \"360 / 380\",\n imageRendering: \"pixelated\",\n display: \"block\",\n margin: \"0 auto\",\n borderRadius: \"8px\",\n border: \"3px solid \" + t.cabinetBorder,\n background: \"#0c0618\",\n }}\n />\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(3,1fr)\", gap: \"7px\" }}>\n {POSES.map((p) => (\n <button\n key={p}\n onClick={() => setPose(p)}\n style={{\n fontFamily: t.mono,\n fontSize: \"7px\",\n letterSpacing: \".5px\",\n cursor: \"pointer\",\n padding: \"10px 4px\",\n borderRadius: \"6px\",\n border: \"2px solid \" + (pose === p ? \"#00f0ff\" : \"#3a2f55\"),\n background: pose === p ? \"#00f0ff\" : \"#1c0d33\",\n color: pose === p ? \"#10131c\" : \"#cdbcff\",\n }}\n >\n {POSE_NAMES[p].toUpperCase()}\n </button>\n ))}\n </div>\n </div>\n </div>\n );\n}\n","/** The three editor skins. */\nexport type Layout = \"arcade\" | \"kompakt\" | \"steckbrief\";\n\n/** All layouts in display order. */\nexport const LAYOUTS: readonly { key: Layout; name: string }[] = [\n { key: \"arcade\", name: \"ARCADE\" },\n { key: \"kompakt\", name: \"COMPACT\" },\n { key: \"steckbrief\", name: \"WANTED\" },\n];\n\n/** Resolved style tokens for a layout — colours, fonts and shape. */\nexport interface Theme {\n stageBg: string;\n cabinet: string;\n cabinetBorder: string;\n marqueeBg: string;\n title: string;\n accent: string;\n screenBg: string;\n panel: string;\n panelBorder: string;\n rowBg: string;\n text: string;\n sub: string;\n mainDir: \"row\" | \"column\";\n mono: string;\n body: string;\n radius: string;\n titleText: string;\n glow: boolean;\n paper: boolean;\n}\n\nconst MONO = \"'Press Start 2P',monospace\";\nconst BODY = \"'VT323',monospace\";\n\n/** Resolve the visual tokens for a layout. */\nexport function theme(layout: Layout): Theme {\n if (layout === \"kompakt\") {\n return {\n stageBg: \"#10131c\",\n cabinet: \"#1a1f2e\",\n cabinetBorder: \"#2a3145\",\n marqueeBg: \"#232a3d\",\n title: \"#7df9ff\",\n accent: \"#ff5d8f\",\n screenBg: \"#0b0e16\",\n panel: \"#222a3d\",\n panelBorder: \"#323b54\",\n rowBg: \"#1a2032\",\n text: \"#cdd6f4\",\n sub: \"#8a93b2\",\n mainDir: \"row\",\n mono: MONO,\n body: BODY,\n radius: \"14px\",\n titleText: \"@retro-antlitz-kartei AVATAR EDITOR\",\n glow: false,\n paper: false,\n };\n }\n if (layout === \"steckbrief\") {\n return {\n stageBg: \"#3a2a18\",\n cabinet: \"#efe2c4\",\n cabinetBorder: \"#7a5a32\",\n marqueeBg: \"#c0392b\",\n title: \"#fff4dc\",\n accent: \"#c0392b\",\n screenBg: \"#d8c9a6\",\n panel: \"#e6d8ba\",\n panelBorder: \"#b89a64\",\n rowBg: \"#f3ead2\",\n text: \"#4a3520\",\n sub: \"#8a6e44\",\n mainDir: \"row\",\n mono: MONO,\n body: BODY,\n radius: \"4px\",\n titleText: \"WANTED\",\n glow: false,\n paper: true,\n };\n }\n return {\n // arcade\n stageBg: \"#1a0b2e\",\n cabinet: \"#3a1d5c\",\n cabinetBorder: \"#ff2e88\",\n marqueeBg: \"#120726\",\n title: \"#ffe600\",\n accent: \"#00f0ff\",\n screenBg: \"#06010f\",\n panel: \"#2a1248\",\n panelBorder: \"#7b2ff7\",\n rowBg: \"#1c0d33\",\n text: \"#ffe600\",\n sub: \"#b48cff\",\n mainDir: \"column\",\n mono: MONO,\n body: BODY,\n radius: \"10px\",\n titleText: \"AVATAR-O-MAT\",\n glow: true,\n paper: false,\n };\n}\n\n/** The web-font `<link>` hrefs the editor needs (Press Start 2P + VT323). */\nexport const FONT_HREFS: readonly string[] = [\n \"https://fonts.googleapis.com/css2?family=Press+Start+2P&family=VT323&display=swap\",\n];\n","import React, { useEffect, useMemo, useState, useCallback, useRef } from \"react\";\nimport {\n type AvatarConfig,\n type PartKey,\n type View,\n PARTS,\n partLabel,\n SKIN,\n HAIRS,\n CLOTH,\n BG,\n PANTS,\n DEFAULT_CONFIG,\n normalizeConfig,\n encodeConfig,\n decodeConfig,\n randomConfig,\n configFromSeed,\n} from \"@retro-antlitz-kartei/generator\";\nimport { AvatarPreview } from \"./AvatarPreview.js\";\nimport { CombatModal } from \"./CombatModal.js\";\nimport { theme, LAYOUTS, FONT_HREFS, type Layout } from \"./theme.js\";\n\nexport interface AvatarEditorProps {\n /** Controlled config. When set, you must update it via `onChange`. */\n value?: AvatarConfig;\n /** Initial config for uncontrolled use. */\n defaultValue?: AvatarConfig;\n /** Seed for the initial avatar when neither `value` nor `defaultValue` is given. */\n seed?: string;\n /** Called with the new config whenever the user edits the avatar. */\n onChange?: (config: AvatarConfig) => void;\n /** Controlled layout/skin. */\n layout?: Layout;\n /** Initial layout for uncontrolled use. Default `\"arcade\"`. */\n defaultLayout?: Layout;\n onLayoutChange?: (layout: Layout) => void;\n /** Show the layout switcher row. Default `true`. */\n showLayoutPicker?: boolean;\n /** Show the \"fight\" combat modal. Default `true`. */\n showCombat?: boolean;\n /** Show the share-code copy/load box. Default `true`. */\n showCode?: boolean;\n /** Show the seed input. Default `true`. */\n showSeed?: boolean;\n /** When set, renders a \"✨ MAGIC\" button next to RANDOM (e.g. to open an AI prompt modal). */\n onMagic?: () => void;\n /** Inject the pixel web fonts (Press Start 2P + VT323) into `<head>`. Default `true`. */\n loadFonts?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst PART_CONTROLS: readonly { key: PartKey; label: string }[] = [\n { key: \"build\", label: \"BUILD\" },\n { key: \"hat\", label: \"HAT\" },\n { key: \"hair\", label: \"HAIR\" },\n { key: \"ears\", label: \"EARS\" },\n { key: \"nose\", label: \"NOSE\" },\n { key: \"accessory\", label: \"ACCESSORY\" },\n { key: \"top\", label: \"TOP\" },\n { key: \"trousers\", label: \"TROUSERS\" },\n { key: \"shoes\", label: \"SHOES\" },\n];\n\nconst VIEW_OPTIONS: readonly { key: View; name: string }[] = [\n { key: \"left\", name: \"LEFT\" },\n { key: \"front\", name: \"FRONT\" },\n { key: \"right\", name: \"RIGHT\" },\n];\n\n/** Track whether an element is narrower than `breakpoint` px (for responsive layout). */\nfunction useNarrow(ref: React.RefObject<HTMLElement | null>, breakpoint = 640): boolean {\n const [narrow, setNarrow] = useState(\n () => typeof window !== \"undefined\" && window.innerWidth < breakpoint,\n );\n useEffect(() => {\n const el = ref.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver((entries) => {\n const w = entries[0]?.contentRect.width ?? 0;\n if (w > 0) setNarrow(w < breakpoint);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [ref, breakpoint]);\n return narrow;\n}\n\nfunction useControllable<T>(\n controlled: T | undefined,\n initial: T,\n onChange?: (v: T) => void,\n): [T, (v: T) => void] {\n const [internal, setInternal] = useState<T>(initial);\n const value = controlled !== undefined ? controlled : internal;\n const set = useCallback(\n (v: T) => {\n if (controlled === undefined) setInternal(v);\n onChange?.(v);\n },\n [controlled, onChange],\n );\n return [value, set];\n}\n\n/**\n * The full retro avatar editor: live preview, part cyclers, colour swatches,\n * view + layout switchers, a shareable code box, a seed generator and the\n * animated combat modal. Works controlled (`value`/`onChange`) or uncontrolled.\n */\nexport function AvatarEditor(props: AvatarEditorProps): React.ReactElement {\n const {\n value,\n defaultValue,\n seed,\n onChange,\n layout: layoutProp,\n defaultLayout = \"arcade\",\n onLayoutChange,\n showLayoutPicker = true,\n showCombat = true,\n showCode = true,\n showSeed = true,\n onMagic,\n loadFonts = true,\n className,\n style,\n } = props;\n\n const initialConfig = useMemo(\n () => normalizeConfig(value ?? defaultValue ?? (seed ? configFromSeed(seed) : DEFAULT_CONFIG)),\n // initial only\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n const [config, setConfig] = useControllable<AvatarConfig>(value, initialConfig, onChange);\n const [layout, setLayout] = useControllable<Layout>(layoutProp, defaultLayout, onLayoutChange);\n const [modalOpen, setModalOpen] = useState(false);\n const [codeInput, setCodeInput] = useState(\"\");\n const [codeMsg, setCodeMsg] = useState(\"\");\n const [seedInput, setSeedInput] = useState(seed ?? \"\");\n\n const stageRef = useRef<HTMLDivElement>(null);\n const narrow = useNarrow(stageRef);\n\n const t = theme(layout);\n const stacked = narrow || t.mainDir === \"column\";\n\n useEffect(() => {\n if (!loadFonts || typeof document === \"undefined\") return;\n for (const href of FONT_HREFS) {\n if (document.querySelector(`link[href=\"${href}\"]`)) continue;\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = href;\n document.head.appendChild(link);\n }\n }, [loadFonts]);\n\n const patch = useCallback((p: Partial<AvatarConfig>) => setConfig({ ...config, ...p }), [config, setConfig]);\n const cycle = useCallback(\n (key: PartKey, dir: number) => {\n const ids = PARTS[key];\n const cur = ids.indexOf(config[key] as never);\n patch({ [key]: ids[(cur + dir + ids.length) % ids.length] } as Partial<AvatarConfig>);\n },\n [config, patch],\n );\n\n const onRandom = () => setConfig({ ...randomConfig(), view: config.view });\n const onCopyCode = () => {\n const code = encodeConfig(config);\n try {\n navigator.clipboard.writeText(code);\n setCodeMsg(\"Copied!\");\n } catch {\n setCodeInput(code);\n setCodeMsg(\"Selected\");\n }\n };\n const onLoadCode = () => {\n if (!codeInput.trim()) return;\n const next = decodeConfig(codeInput, config);\n setConfig(next);\n setCodeMsg(\"Loaded!\");\n };\n const onGenerateSeed = () => {\n if (!seedInput.trim()) return;\n setConfig({ ...configFromSeed(seedInput), view: config.view });\n };\n\n /* ---------- styles ---------- */\n const arrowStyle: React.CSSProperties = {\n fontFamily: t.mono,\n fontSize: \"10px\",\n cursor: \"pointer\",\n flex: \"0 0 auto\",\n width: \"32px\",\n height: \"32px\",\n borderRadius: t.paper ? \"3px\" : \"7px\",\n border: \"2px solid \" + t.accent,\n background: t.glow ? t.accent : t.accent + \"22\",\n color: t.glow ? \"#10131c\" : t.accent,\n lineHeight: 1,\n };\n const rowStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n background: t.rowBg,\n borderRadius: t.paper ? \"3px\" : \"8px\",\n padding: \"6px 8px\",\n border: \"1px solid \" + t.panelBorder,\n };\n const partLabelStyle: React.CSSProperties = { fontFamily: t.mono, fontSize: \"7px\", color: t.sub, letterSpacing: \"1px\" };\n const partValueStyle: React.CSSProperties = { fontFamily: t.body, fontSize: \"19px\", color: t.text, lineHeight: 1.1, marginTop: \"2px\" };\n const dividerStyle: React.CSSProperties = { height: \"2px\", background: t.panelBorder, opacity: 0.6, margin: \"2px 0\" };\n const swatchRowStyle: React.CSSProperties = { display: \"flex\", alignItems: \"center\", gap: \"10px\", flexWrap: \"wrap\" };\n const swatchLabelStyle: React.CSSProperties = { fontFamily: t.mono, fontSize: \"7px\", color: t.sub, letterSpacing: \"1px\", width: \"78px\", flex: \"0 0 auto\" };\n const codeFieldStyle: React.CSSProperties = {\n flex: \"1 1 auto\",\n minWidth: 0,\n fontFamily: \"monospace\",\n fontSize: \"11px\",\n padding: \"7px 8px\",\n borderRadius: t.paper ? \"3px\" : \"6px\",\n border: \"2px solid \" + t.panelBorder,\n background: t.paper ? \"#fff\" : \"#0c111c\",\n color: t.text,\n outline: \"none\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n boxSizing: \"border-box\",\n };\n const smallBtnStyle: React.CSSProperties = {\n fontFamily: t.mono,\n fontSize: \"7px\",\n letterSpacing: \".5px\",\n cursor: \"pointer\",\n padding: \"8px 9px\",\n borderRadius: t.paper ? \"3px\" : \"6px\",\n border: \"2px solid \" + t.accent,\n background: t.glow ? t.accent : t.accent + \"22\",\n color: t.glow ? \"#10131c\" : t.accent,\n flex: \"0 0 auto\",\n };\n const codeLabelStyle: React.CSSProperties = { fontFamily: t.mono, fontSize: \"7px\", color: t.sub, letterSpacing: \"1px\" };\n const swatchBtn = (col: string, active: boolean): React.CSSProperties => ({\n background: col,\n width: \"22px\",\n height: \"22px\",\n cursor: \"pointer\",\n padding: 0,\n borderRadius: t.paper ? \"2px\" : \"5px\",\n border: \"2px solid \" + (active ? t.accent : t.paper ? \"#00000033\" : \"#ffffff44\"),\n boxShadow: active ? \"0 0 0 2px \" + t.accent + \"66\" : \"none\",\n });\n\n const nameDisplay = partLabel(\"top\", config.top).toUpperCase();\n\n const partRow = (key: PartKey, label: string) => (\n <div key={key} style={rowStyle}>\n <button onClick={() => cycle(key, -1)} style={arrowStyle}>\n ◀\n </button>\n <div style={{ flex: 1, minWidth: 0, textAlign: \"center\" }}>\n <div style={partLabelStyle}>{label}</div>\n <div style={partValueStyle}>{partLabel(key, config[key])}</div>\n </div>\n <button onClick={() => cycle(key, 1)} style={arrowStyle}>\n ▶\n </button>\n </div>\n );\n\n return (\n <div\n ref={stageRef}\n className={className}\n style={{\n minHeight: \"100%\",\n width: \"100%\",\n background: t.stageBg,\n padding: narrow ? \"10px\" : \"24px\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n fontFamily: t.body,\n backgroundImage: \"radial-gradient(circle at 50% 0%, \" + t.accent + \"22, transparent 60%)\",\n boxSizing: \"border-box\",\n ...style,\n }}\n >\n {showLayoutPicker && (\n <div style={{ display: \"flex\", gap: \"10px\", alignItems: \"center\", flexWrap: \"wrap\", marginBottom: \"14px\" }}>\n <span style={{ fontFamily: t.mono, fontSize: \"9px\", color: \"#fff\", opacity: 0.55, letterSpacing: \"1px\" }}>LAYOUT</span>\n {LAYOUTS.map((l) => (\n <button\n key={l.key}\n onClick={() => setLayout(l.key)}\n style={{\n fontFamily: t.mono,\n fontSize: \"8px\",\n letterSpacing: \"1px\",\n cursor: \"pointer\",\n padding: \"7px 9px\",\n borderRadius: \"6px\",\n border: \"2px solid \" + (layout === l.key ? t.accent : \"#ffffff22\"),\n background: layout === l.key ? t.accent : \"#ffffff10\",\n color: layout === l.key ? \"#10131c\" : \"#fff\",\n }}\n >\n {l.name}\n </button>\n ))}\n </div>\n )}\n\n <div\n style={{\n width: \"100%\",\n maxWidth: narrow ? \"100%\" : t.mainDir === \"row\" ? \"860px\" : \"540px\",\n background: t.cabinet,\n border: narrow ? \"none\" : \"4px solid \" + t.cabinetBorder,\n borderRadius: narrow ? \"10px\" : t.radius,\n boxShadow: narrow ? \"none\" : \"0 18px 50px rgba(0,0,0,.5)\" + (t.glow ? \", 0 0 30px \" + t.accent + \"33\" : \"\"),\n overflow: \"hidden\",\n }}\n >\n <div\n style={{\n background: t.marqueeBg,\n padding: narrow ? \"10px\" : \"14px\",\n display: \"flex\",\n gap: narrow ? \"8px\" : \"12px\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexWrap: \"wrap\",\n borderBottom: narrow ? \"none\" : \"3px solid \" + t.cabinetBorder,\n }}\n >\n <span style={{ width: \"10px\", height: \"10px\", borderRadius: \"50%\", background: t.accent, boxShadow: \"0 0 8px \" + t.accent, flex: \"0 0 auto\" }} />\n <span\n style={{\n fontFamily: t.mono,\n fontSize: t.titleText === \"WANTED\" ? \"20px\" : narrow ? \"10px\" : \"15px\",\n color: t.title,\n letterSpacing: narrow ? \"1px\" : \"2px\",\n textShadow: t.glow ? \"0 0 10px \" + t.accent : \"2px 2px 0 #00000044\",\n textAlign: \"center\",\n lineHeight: 1.5,\n }}\n >\n {t.titleText}\n </span>\n <span style={{ width: \"10px\", height: \"10px\", borderRadius: \"50%\", background: t.accent, boxShadow: \"0 0 8px \" + t.accent, flex: \"0 0 auto\" }} />\n </div>\n\n <div\n style={{\n display: \"flex\",\n flexDirection: stacked ? \"column\" : \"row\",\n gap: \"16px\",\n padding: narrow ? \"10px\" : \"18px\",\n alignItems: stacked ? \"center\" : \"stretch\",\n }}\n >\n {/* screen card */}\n <div\n style={{\n flex: stacked ? \"0 0 auto\" : \"0 0 300px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n alignItems: \"center\",\n width: stacked ? \"100%\" : undefined,\n maxWidth: \"100%\",\n }}\n >\n <div\n style={{\n position: \"relative\",\n padding: \"10px\",\n background: t.screenBg,\n borderRadius: t.paper ? \"4px\" : \"10px\",\n border: \"4px solid \" + t.cabinetBorder,\n boxShadow: \"inset 0 0 20px rgba(0,0,0,.6)\",\n cursor: showCombat ? \"pointer\" : \"default\",\n }}\n onClick={showCombat ? () => setModalOpen(true) : undefined}\n >\n <AvatarPreview\n config={config}\n width={320}\n height={400}\n style={{ width: \"264px\", maxWidth: \"100%\", height: \"auto\", aspectRatio: \"320 / 400\", borderRadius: \"3px\" }}\n />\n <div\n style={{\n position: \"absolute\",\n inset: \"10px\",\n pointerEvents: \"none\",\n borderRadius: \"3px\",\n backgroundImage: \"repeating-linear-gradient(0deg, rgba(0,0,0,.16) 0 2px, transparent 2px 4px)\",\n mixBlendMode: \"multiply\",\n }}\n />\n {showCombat && (\n <div\n style={{\n position: \"absolute\",\n right: \"14px\",\n bottom: \"14px\",\n fontFamily: t.mono,\n fontSize: \"7px\",\n letterSpacing: \"1px\",\n color: t.title,\n background: t.marqueeBg,\n border: \"2px solid \" + t.cabinetBorder,\n borderRadius: \"6px\",\n padding: \"5px 7px\",\n pointerEvents: \"none\",\n }}\n >\n ⚔ FIGHT\n </div>\n )}\n </div>\n <div\n style={{\n fontFamily: t.mono,\n fontSize: \"9px\",\n color: t.title,\n letterSpacing: \"1px\",\n padding: \"6px 10px\",\n background: t.marqueeBg,\n borderRadius: \"5px\",\n textAlign: \"center\",\n border: \"2px solid \" + t.cabinetBorder,\n }}\n >\n {\"THE \" + nameDisplay + \" WEARER\"}\n </div>\n\n <div style={{ width: \"264px\", maxWidth: \"100%\", display: \"flex\", flexDirection: \"column\", gap: \"8px\", marginTop: \"2px\" }}>\n <div style={{ display: \"flex\", gap: \"6px\", width: \"100%\" }}>\n {VIEW_OPTIONS.map((o) => (\n <button\n key={o.key}\n onClick={() => patch({ view: o.key })}\n style={{\n fontFamily: t.mono,\n fontSize: \"7px\",\n letterSpacing: \".5px\",\n cursor: \"pointer\",\n flex: 1,\n padding: \"8px 4px\",\n borderRadius: t.paper ? \"3px\" : \"6px\",\n border: \"2px solid \" + (config.view === o.key ? t.accent : t.panelBorder),\n background: config.view === o.key ? t.accent : t.paper ? \"#ffffff55\" : \"#ffffff10\",\n color: config.view === o.key ? \"#10131c\" : t.text,\n }}\n >\n {o.name}\n </button>\n ))}\n </div>\n\n {partRow(\"mouth\", \"MOUTH\")}\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>BACKGROUND</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {BG.map((c) => (\n <button key={c} onClick={() => patch({ background: c })} style={swatchBtn(c, config.background === c)} />\n ))}\n </div>\n </div>\n\n {showCode && (\n <>\n <div style={dividerStyle} />\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"6px\" }}>\n <span style={codeLabelStyle}>CODE</span>\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n <div style={codeFieldStyle}>{encodeConfig(config)}</div>\n <button onClick={onCopyCode} style={smallBtnStyle}>\n COPY\n </button>\n </div>\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n <input\n value={codeInput}\n onChange={(e) => {\n setCodeInput(e.target.value);\n setCodeMsg(\"\");\n }}\n placeholder=\"Paste code…\"\n style={codeFieldStyle}\n />\n <button onClick={onLoadCode} style={smallBtnStyle}>\n LOAD\n </button>\n </div>\n {codeMsg && <span style={{ fontFamily: t.mono, fontSize: \"7px\", color: t.accent }}>{codeMsg}</span>}\n </div>\n </>\n )}\n\n {showSeed && (\n <>\n <div style={dividerStyle} />\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"6px\" }}>\n <span style={codeLabelStyle}>SEED</span>\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n <input\n value={seedInput}\n onChange={(e) => setSeedInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") onGenerateSeed();\n }}\n placeholder=\"e.g. your name…\"\n style={codeFieldStyle}\n />\n <button onClick={onGenerateSeed} style={smallBtnStyle}>\n GENERATE\n </button>\n </div>\n </div>\n </>\n )}\n </div>\n </div>\n\n {/* controls card */}\n <div\n style={{\n flex: 1,\n minWidth: 0,\n width: stacked ? \"100%\" : \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"9px\",\n background: t.panel,\n border: \"3px solid \" + t.panelBorder,\n borderRadius: t.paper ? \"4px\" : \"10px\",\n padding: \"14px\",\n }}\n >\n {PART_CONTROLS.map((c) => partRow(c.key, c.label))}\n\n <div style={dividerStyle} />\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>SKIN</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {SKIN.map((c) => (\n <button key={c} onClick={() => patch({ skin: c })} style={swatchBtn(c, config.skin === c)} />\n ))}\n </div>\n </div>\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>HAIR</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {HAIRS.map((c) => (\n <button key={c} onClick={() => patch({ hairColor: c })} style={swatchBtn(c, config.hairColor === c)} />\n ))}\n </div>\n </div>\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>CLOTHING</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {CLOTH.map((c) => (\n <button key={c} onClick={() => patch({ topColor: c })} style={swatchBtn(c, config.topColor === c)} />\n ))}\n </div>\n </div>\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>TROUSERS</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {PANTS.map((c) => (\n <button key={c} onClick={() => patch({ trousersColor: c })} style={swatchBtn(c, config.trousersColor === c)} />\n ))}\n </div>\n </div>\n\n <div style={dividerStyle} />\n\n <div style={{ display: \"flex\", gap: \"8px\", marginTop: \"2px\" }}>\n {onMagic && (\n <button\n onClick={onMagic}\n style={{\n fontFamily: t.mono,\n fontSize: \"10px\",\n letterSpacing: \"1px\",\n cursor: \"pointer\",\n padding: \"12px\",\n borderRadius: t.paper ? \"3px\" : \"9px\",\n border: \"3px solid \" + t.title,\n background: \"#9b5de5\",\n color: \"#fff\",\n flex: \"0 0 auto\",\n }}\n >\n ✨ MAGIC\n </button>\n )}\n <button\n onClick={onRandom}\n style={{\n fontFamily: t.mono,\n fontSize: \"10px\",\n letterSpacing: \"1px\",\n cursor: \"pointer\",\n padding: \"12px\",\n borderRadius: t.paper ? \"3px\" : \"9px\",\n border: \"3px solid \" + t.title,\n background: t.accent,\n color: \"#10131c\",\n flex: 1,\n }}\n >\n 🎲 RANDOM\n </button>\n </div>\n </div>\n </div>\n </div>\n\n {showCombat && modalOpen && <CombatModal config={config} theme={t} onClose={() => setModalOpen(false)} />}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/AvatarPreview.tsx","../src/CombatModal.tsx","../src/theme.ts","../src/AvatarEditor.tsx"],"names":["useRef","useEffect","jsx","useState","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["import React, { useRef, useEffect } from \"react\";\nimport { renderAvatar, type AvatarConfig } from \"@retro-antlitz-kartei/generator\";\n\nexport interface AvatarPreviewProps {\n /** The avatar to draw. */\n config: AvatarConfig;\n /** Backing canvas resolution in px. Default `320 × 400`. */\n width?: number;\n height?: number;\n /** Background: `true` = palette colour, hex string = override, `false` = transparent. */\n background?: boolean | string;\n /** Draw the floor strip. Default `true`. */\n floor?: boolean;\n className?: string;\n style?: React.CSSProperties;\n onClick?: () => void;\n}\n\n/**\n * Renders an {@link AvatarConfig} onto a `<canvas>`, re-drawing whenever the\n * config changes. Standalone — use it without the full editor chrome.\n */\nexport function AvatarPreview({\n config,\n width = 320,\n height = 400,\n background = true,\n floor = true,\n className,\n style,\n onClick,\n}: AvatarPreviewProps): React.ReactElement {\n const ref = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n const canvas = ref.current;\n if (!canvas) return;\n renderAvatar(canvas, config, { background, floor });\n }, [config, background, floor, width, height]);\n\n return (\n <canvas\n ref={ref}\n width={width}\n height={height}\n className={className}\n style={{ imageRendering: \"pixelated\", display: \"block\", ...style }}\n onClick={onClick}\n />\n );\n}\n","import React, { useRef, useEffect, useState } from \"react\";\nimport type { AvatarConfig } from \"@retro-antlitz-kartei/generator\";\nimport { AvatarArena, POSES, POSE_NAMES, type Pose } from \"@retro-antlitz-kartei/animate\";\nimport type { Theme } from \"./theme.js\";\n\nexport interface CombatModalProps {\n config: AvatarConfig;\n theme: Theme;\n onClose: () => void;\n}\n\n/** Full-screen overlay running the animated combat arena with pose buttons. */\nexport function CombatModal({ config, theme: t, onClose }: CombatModalProps): React.ReactElement {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const arenaRef = useRef<AvatarArena | null>(null);\n const [pose, setPose] = useState<Pose>(\"idle\");\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const arena = new AvatarArena(canvas, { pose: \"idle\" });\n arena.setConfig(config);\n arenaRef.current = arena;\n return () => arena.destroy();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n arenaRef.current?.setConfig(config);\n }, [config]);\n\n useEffect(() => {\n arenaRef.current?.setPose(pose);\n }, [pose]);\n\n return (\n <div\n onClick={onClose}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 60,\n background: \"rgba(8,4,16,0.82)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"20px\",\n backdropFilter: \"blur(3px)\",\n }}\n >\n <div\n onClick={(e) => e.stopPropagation()}\n style={{\n background: t.cabinet,\n border: \"4px solid \" + t.cabinetBorder,\n borderRadius: t.paper ? \"6px\" : \"14px\",\n padding: \"18px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"14px\",\n width: \"100%\",\n maxWidth: \"420px\",\n boxShadow: \"0 20px 60px rgba(0,0,0,.6)\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: \"10px\" }}>\n <span style={{ fontFamily: t.mono, fontSize: \"10px\", color: t.title, letterSpacing: \"1px\" }}>\n ⚔ COMBAT MODE\n </span>\n <button\n onClick={onClose}\n style={{\n fontFamily: t.mono,\n fontSize: \"11px\",\n cursor: \"pointer\",\n width: \"30px\",\n height: \"30px\",\n borderRadius: \"7px\",\n border: \"2px solid \" + t.panelBorder,\n background: \"#ffffff10\",\n color: \"#fff\",\n flex: \"0 0 auto\",\n }}\n >\n ✕\n </button>\n </div>\n <canvas\n ref={canvasRef}\n width={360}\n height={380}\n style={{\n width: \"100%\",\n maxWidth: \"360px\",\n aspectRatio: \"360 / 380\",\n imageRendering: \"pixelated\",\n display: \"block\",\n margin: \"0 auto\",\n borderRadius: \"8px\",\n border: \"3px solid \" + t.cabinetBorder,\n background: \"#0c0618\",\n }}\n />\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(3,1fr)\", gap: \"7px\" }}>\n {POSES.map((p) => (\n <button\n key={p}\n onClick={() => setPose(p)}\n style={{\n fontFamily: t.mono,\n fontSize: \"7px\",\n letterSpacing: \".5px\",\n cursor: \"pointer\",\n padding: \"10px 4px\",\n borderRadius: \"6px\",\n border: \"2px solid \" + (pose === p ? \"#00f0ff\" : \"#3a2f55\"),\n background: pose === p ? \"#00f0ff\" : \"#1c0d33\",\n color: pose === p ? \"#10131c\" : \"#cdbcff\",\n }}\n >\n {POSE_NAMES[p].toUpperCase()}\n </button>\n ))}\n </div>\n </div>\n </div>\n );\n}\n","/** The three editor skins. */\nexport type Layout = \"arcade\" | \"kompakt\" | \"steckbrief\";\n\n/** All layouts in display order. */\nexport const LAYOUTS: readonly { key: Layout; name: string }[] = [\n { key: \"arcade\", name: \"ARCADE\" },\n { key: \"kompakt\", name: \"COMPACT\" },\n { key: \"steckbrief\", name: \"WANTED\" },\n];\n\n/** Resolved style tokens for a layout — colours, fonts and shape. */\nexport interface Theme {\n stageBg: string;\n cabinet: string;\n cabinetBorder: string;\n marqueeBg: string;\n title: string;\n accent: string;\n screenBg: string;\n panel: string;\n panelBorder: string;\n rowBg: string;\n text: string;\n sub: string;\n mainDir: \"row\" | \"column\";\n mono: string;\n body: string;\n radius: string;\n titleText: string;\n glow: boolean;\n paper: boolean;\n}\n\nconst MONO = \"'Press Start 2P',monospace\";\nconst BODY = \"'VT323',monospace\";\n\n/** Resolve the visual tokens for a layout. */\nexport function theme(layout: Layout): Theme {\n if (layout === \"kompakt\") {\n return {\n stageBg: \"#10131c\",\n cabinet: \"#1a1f2e\",\n cabinetBorder: \"#2a3145\",\n marqueeBg: \"#232a3d\",\n title: \"#7df9ff\",\n accent: \"#ff5d8f\",\n screenBg: \"#0b0e16\",\n panel: \"#222a3d\",\n panelBorder: \"#323b54\",\n rowBg: \"#1a2032\",\n text: \"#cdd6f4\",\n sub: \"#8a93b2\",\n mainDir: \"row\",\n mono: MONO,\n body: BODY,\n radius: \"14px\",\n titleText: \"@retro-antlitz-kartei AVATAR EDITOR\",\n glow: false,\n paper: false,\n };\n }\n if (layout === \"steckbrief\") {\n return {\n stageBg: \"#3a2a18\",\n cabinet: \"#efe2c4\",\n cabinetBorder: \"#7a5a32\",\n marqueeBg: \"#c0392b\",\n title: \"#fff4dc\",\n accent: \"#c0392b\",\n screenBg: \"#d8c9a6\",\n panel: \"#e6d8ba\",\n panelBorder: \"#b89a64\",\n rowBg: \"#f3ead2\",\n text: \"#4a3520\",\n sub: \"#8a6e44\",\n mainDir: \"row\",\n mono: MONO,\n body: BODY,\n radius: \"4px\",\n titleText: \"WANTED\",\n glow: false,\n paper: true,\n };\n }\n return {\n // arcade\n stageBg: \"#1a0b2e\",\n cabinet: \"#3a1d5c\",\n cabinetBorder: \"#ff2e88\",\n marqueeBg: \"#120726\",\n title: \"#ffe600\",\n accent: \"#00f0ff\",\n screenBg: \"#06010f\",\n panel: \"#2a1248\",\n panelBorder: \"#7b2ff7\",\n rowBg: \"#1c0d33\",\n text: \"#ffe600\",\n sub: \"#b48cff\",\n mainDir: \"column\",\n mono: MONO,\n body: BODY,\n radius: \"10px\",\n titleText: \"AVATAR-O-MAT\",\n glow: true,\n paper: false,\n };\n}\n\n/** The web-font `<link>` hrefs the editor needs (Press Start 2P + VT323). */\nexport const FONT_HREFS: readonly string[] = [\n \"https://fonts.googleapis.com/css2?family=Press+Start+2P&family=VT323&display=swap\",\n];\n","import React, { useEffect, useMemo, useState, useCallback, useRef } from \"react\";\nimport {\n type AvatarConfig,\n type PartKey,\n type View,\n PARTS,\n partLabel,\n SKIN,\n HAIRS,\n CLOTH,\n BG,\n PANTS,\n DEFAULT_CONFIG,\n normalizeConfig,\n encodeConfig,\n decodeConfig,\n randomConfig,\n configFromSeed,\n} from \"@retro-antlitz-kartei/generator\";\nimport { AvatarPreview } from \"./AvatarPreview.js\";\nimport { CombatModal } from \"./CombatModal.js\";\nimport { theme, LAYOUTS, FONT_HREFS, type Layout } from \"./theme.js\";\n\nexport interface AvatarEditorProps {\n /** Controlled config. When set, you must update it via `onChange`. */\n value?: AvatarConfig;\n /** Initial config for uncontrolled use. */\n defaultValue?: AvatarConfig;\n /** Seed for the initial avatar when neither `value` nor `defaultValue` is given. */\n seed?: string;\n /** Called with the new config whenever the user edits the avatar. */\n onChange?: (config: AvatarConfig) => void;\n /** Controlled layout/skin. */\n layout?: Layout;\n /** Initial layout for uncontrolled use. Default `\"arcade\"`. */\n defaultLayout?: Layout;\n onLayoutChange?: (layout: Layout) => void;\n /** Show the layout switcher row. Default `true`. */\n showLayoutPicker?: boolean;\n /** Show the \"fight\" combat modal. Default `true`. */\n showCombat?: boolean;\n /** Show the share-code copy/load box. Default `true`. */\n showCode?: boolean;\n /** Show the seed input. Default `true`. */\n showSeed?: boolean;\n /** Show the built-in \"🎲 RANDOM\" button. Default `true`. */\n showRandom?: boolean;\n /** When set, renders a \"✨ MAGIC\" button next to RANDOM (e.g. to open an AI prompt modal). */\n onMagic?: () => void;\n /** Inject the pixel web fonts (Press Start 2P + VT323) into `<head>`. Default `true`. */\n loadFonts?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst PART_CONTROLS: readonly { key: PartKey; label: string }[] = [\n { key: \"build\", label: \"BUILD\" },\n { key: \"hat\", label: \"HAT\" },\n { key: \"hair\", label: \"HAIR\" },\n { key: \"ears\", label: \"EARS\" },\n { key: \"nose\", label: \"NOSE\" },\n { key: \"accessory\", label: \"ACCESSORY\" },\n { key: \"top\", label: \"TOP\" },\n { key: \"trousers\", label: \"TROUSERS\" },\n { key: \"shoes\", label: \"SHOES\" },\n];\n\nconst VIEW_OPTIONS: readonly { key: View; name: string }[] = [\n { key: \"left\", name: \"LEFT\" },\n { key: \"front\", name: \"FRONT\" },\n { key: \"right\", name: \"RIGHT\" },\n];\n\n/** Track whether an element is narrower than `breakpoint` px (for responsive layout). */\nfunction useNarrow(ref: React.RefObject<HTMLElement | null>, breakpoint = 640): boolean {\n const [narrow, setNarrow] = useState(\n () => typeof window !== \"undefined\" && window.innerWidth < breakpoint,\n );\n useEffect(() => {\n const el = ref.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver((entries) => {\n const w = entries[0]?.contentRect.width ?? 0;\n if (w > 0) setNarrow(w < breakpoint);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [ref, breakpoint]);\n return narrow;\n}\n\nfunction useControllable<T>(\n controlled: T | undefined,\n initial: T,\n onChange?: (v: T) => void,\n): [T, (v: T) => void] {\n const [internal, setInternal] = useState<T>(initial);\n const value = controlled !== undefined ? controlled : internal;\n const set = useCallback(\n (v: T) => {\n if (controlled === undefined) setInternal(v);\n onChange?.(v);\n },\n [controlled, onChange],\n );\n return [value, set];\n}\n\n/**\n * The full retro avatar editor: live preview, part cyclers, colour swatches,\n * view + layout switchers, a shareable code box, a seed generator and the\n * animated combat modal. Works controlled (`value`/`onChange`) or uncontrolled.\n */\nexport function AvatarEditor(props: AvatarEditorProps): React.ReactElement {\n const {\n value,\n defaultValue,\n seed,\n onChange,\n layout: layoutProp,\n defaultLayout = \"arcade\",\n onLayoutChange,\n showLayoutPicker = true,\n showCombat = true,\n showCode = true,\n showSeed = true,\n showRandom = true,\n onMagic,\n loadFonts = true,\n className,\n style,\n } = props;\n\n const initialConfig = useMemo(\n () => normalizeConfig(value ?? defaultValue ?? (seed ? configFromSeed(seed) : DEFAULT_CONFIG)),\n // initial only\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n const [config, setConfig] = useControllable<AvatarConfig>(value, initialConfig, onChange);\n const [layout, setLayout] = useControllable<Layout>(layoutProp, defaultLayout, onLayoutChange);\n const [modalOpen, setModalOpen] = useState(false);\n const [codeInput, setCodeInput] = useState(\"\");\n const [codeMsg, setCodeMsg] = useState(\"\");\n const [seedInput, setSeedInput] = useState(seed ?? \"\");\n\n const stageRef = useRef<HTMLDivElement>(null);\n const narrow = useNarrow(stageRef);\n\n const t = theme(layout);\n const stacked = narrow || t.mainDir === \"column\";\n\n useEffect(() => {\n if (!loadFonts || typeof document === \"undefined\") return;\n for (const href of FONT_HREFS) {\n if (document.querySelector(`link[href=\"${href}\"]`)) continue;\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = href;\n document.head.appendChild(link);\n }\n }, [loadFonts]);\n\n const patch = useCallback((p: Partial<AvatarConfig>) => setConfig({ ...config, ...p }), [config, setConfig]);\n const cycle = useCallback(\n (key: PartKey, dir: number) => {\n const ids = PARTS[key];\n const cur = ids.indexOf(config[key] as never);\n patch({ [key]: ids[(cur + dir + ids.length) % ids.length] } as Partial<AvatarConfig>);\n },\n [config, patch],\n );\n\n const onRandom = () => setConfig({ ...randomConfig(), view: config.view });\n const onCopyCode = () => {\n const code = encodeConfig(config);\n try {\n navigator.clipboard.writeText(code);\n setCodeMsg(\"Copied!\");\n } catch {\n setCodeInput(code);\n setCodeMsg(\"Selected\");\n }\n };\n const onLoadCode = () => {\n if (!codeInput.trim()) return;\n const next = decodeConfig(codeInput, config);\n setConfig(next);\n setCodeMsg(\"Loaded!\");\n };\n const onGenerateSeed = () => {\n if (!seedInput.trim()) return;\n setConfig({ ...configFromSeed(seedInput), view: config.view });\n };\n\n /* ---------- styles ---------- */\n const arrowStyle: React.CSSProperties = {\n fontFamily: t.mono,\n fontSize: \"10px\",\n cursor: \"pointer\",\n flex: \"0 0 auto\",\n width: \"32px\",\n height: \"32px\",\n borderRadius: t.paper ? \"3px\" : \"7px\",\n border: \"2px solid \" + t.accent,\n background: t.glow ? t.accent : t.accent + \"22\",\n color: t.glow ? \"#10131c\" : t.accent,\n lineHeight: 1,\n };\n const rowStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n background: t.rowBg,\n borderRadius: t.paper ? \"3px\" : \"8px\",\n padding: \"6px 8px\",\n border: \"1px solid \" + t.panelBorder,\n };\n const partLabelStyle: React.CSSProperties = { fontFamily: t.mono, fontSize: \"7px\", color: t.sub, letterSpacing: \"1px\" };\n const partValueStyle: React.CSSProperties = { fontFamily: t.body, fontSize: \"19px\", color: t.text, lineHeight: 1.1, marginTop: \"2px\" };\n const dividerStyle: React.CSSProperties = { height: \"2px\", background: t.panelBorder, opacity: 0.6, margin: \"2px 0\" };\n const swatchRowStyle: React.CSSProperties = { display: \"flex\", alignItems: \"center\", gap: \"10px\", flexWrap: \"wrap\" };\n const swatchLabelStyle: React.CSSProperties = { fontFamily: t.mono, fontSize: \"7px\", color: t.sub, letterSpacing: \"1px\", width: \"78px\", flex: \"0 0 auto\" };\n const codeFieldStyle: React.CSSProperties = {\n flex: \"1 1 auto\",\n minWidth: 0,\n fontFamily: \"monospace\",\n fontSize: \"11px\",\n padding: \"7px 8px\",\n borderRadius: t.paper ? \"3px\" : \"6px\",\n border: \"2px solid \" + t.panelBorder,\n background: t.paper ? \"#fff\" : \"#0c111c\",\n color: t.text,\n outline: \"none\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n boxSizing: \"border-box\",\n };\n const smallBtnStyle: React.CSSProperties = {\n fontFamily: t.mono,\n fontSize: \"7px\",\n letterSpacing: \".5px\",\n cursor: \"pointer\",\n padding: \"8px 9px\",\n borderRadius: t.paper ? \"3px\" : \"6px\",\n border: \"2px solid \" + t.accent,\n background: t.glow ? t.accent : t.accent + \"22\",\n color: t.glow ? \"#10131c\" : t.accent,\n flex: \"0 0 auto\",\n };\n const codeLabelStyle: React.CSSProperties = { fontFamily: t.mono, fontSize: \"7px\", color: t.sub, letterSpacing: \"1px\" };\n const swatchBtn = (col: string, active: boolean): React.CSSProperties => ({\n background: col,\n width: \"22px\",\n height: \"22px\",\n cursor: \"pointer\",\n padding: 0,\n borderRadius: t.paper ? \"2px\" : \"5px\",\n border: \"2px solid \" + (active ? t.accent : t.paper ? \"#00000033\" : \"#ffffff44\"),\n boxShadow: active ? \"0 0 0 2px \" + t.accent + \"66\" : \"none\",\n });\n\n const nameDisplay = partLabel(\"top\", config.top).toUpperCase();\n\n const partRow = (key: PartKey, label: string) => (\n <div key={key} style={rowStyle}>\n <button onClick={() => cycle(key, -1)} style={arrowStyle}>\n ◀\n </button>\n <div style={{ flex: 1, minWidth: 0, textAlign: \"center\" }}>\n <div style={partLabelStyle}>{label}</div>\n <div style={partValueStyle}>{partLabel(key, config[key])}</div>\n </div>\n <button onClick={() => cycle(key, 1)} style={arrowStyle}>\n ▶\n </button>\n </div>\n );\n\n return (\n <div\n ref={stageRef}\n className={className}\n style={{\n minHeight: \"100%\",\n width: \"100%\",\n background: t.stageBg,\n padding: narrow ? \"10px\" : \"24px\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n fontFamily: t.body,\n backgroundImage: \"radial-gradient(circle at 50% 0%, \" + t.accent + \"22, transparent 60%)\",\n boxSizing: \"border-box\",\n ...style,\n }}\n >\n {showLayoutPicker && (\n <div style={{ display: \"flex\", gap: \"10px\", alignItems: \"center\", flexWrap: \"wrap\", marginBottom: \"14px\" }}>\n <span style={{ fontFamily: t.mono, fontSize: \"9px\", color: \"#fff\", opacity: 0.55, letterSpacing: \"1px\" }}>LAYOUT</span>\n {LAYOUTS.map((l) => (\n <button\n key={l.key}\n onClick={() => setLayout(l.key)}\n style={{\n fontFamily: t.mono,\n fontSize: \"8px\",\n letterSpacing: \"1px\",\n cursor: \"pointer\",\n padding: \"7px 9px\",\n borderRadius: \"6px\",\n border: \"2px solid \" + (layout === l.key ? t.accent : \"#ffffff22\"),\n background: layout === l.key ? t.accent : \"#ffffff10\",\n color: layout === l.key ? \"#10131c\" : \"#fff\",\n }}\n >\n {l.name}\n </button>\n ))}\n </div>\n )}\n\n <div\n style={{\n width: \"100%\",\n maxWidth: narrow ? \"100%\" : t.mainDir === \"row\" ? \"860px\" : \"540px\",\n background: t.cabinet,\n border: narrow ? \"none\" : \"4px solid \" + t.cabinetBorder,\n borderRadius: narrow ? \"10px\" : t.radius,\n boxShadow: narrow ? \"none\" : \"0 18px 50px rgba(0,0,0,.5)\" + (t.glow ? \", 0 0 30px \" + t.accent + \"33\" : \"\"),\n overflow: \"hidden\",\n }}\n >\n <div\n style={{\n background: t.marqueeBg,\n padding: narrow ? \"10px\" : \"14px\",\n display: \"flex\",\n gap: narrow ? \"8px\" : \"12px\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexWrap: \"wrap\",\n borderBottom: narrow ? \"none\" : \"3px solid \" + t.cabinetBorder,\n }}\n >\n <span style={{ width: \"10px\", height: \"10px\", borderRadius: \"50%\", background: t.accent, boxShadow: \"0 0 8px \" + t.accent, flex: \"0 0 auto\" }} />\n <span\n style={{\n fontFamily: t.mono,\n fontSize: t.titleText === \"WANTED\" ? \"20px\" : narrow ? \"10px\" : \"15px\",\n color: t.title,\n letterSpacing: narrow ? \"1px\" : \"2px\",\n textShadow: t.glow ? \"0 0 10px \" + t.accent : \"2px 2px 0 #00000044\",\n textAlign: \"center\",\n lineHeight: 1.5,\n }}\n >\n {t.titleText}\n </span>\n <span style={{ width: \"10px\", height: \"10px\", borderRadius: \"50%\", background: t.accent, boxShadow: \"0 0 8px \" + t.accent, flex: \"0 0 auto\" }} />\n </div>\n\n <div\n style={{\n display: \"flex\",\n flexDirection: stacked ? \"column\" : \"row\",\n gap: \"16px\",\n padding: narrow ? \"10px\" : \"18px\",\n alignItems: stacked ? \"center\" : \"stretch\",\n }}\n >\n {/* screen card */}\n <div\n style={{\n flex: stacked ? \"0 0 auto\" : \"0 0 300px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n alignItems: \"center\",\n width: stacked ? \"100%\" : undefined,\n maxWidth: \"100%\",\n }}\n >\n <div\n style={{\n position: \"relative\",\n padding: \"10px\",\n background: t.screenBg,\n borderRadius: t.paper ? \"4px\" : \"10px\",\n border: \"4px solid \" + t.cabinetBorder,\n boxShadow: \"inset 0 0 20px rgba(0,0,0,.6)\",\n cursor: showCombat ? \"pointer\" : \"default\",\n }}\n onClick={showCombat ? () => setModalOpen(true) : undefined}\n >\n <AvatarPreview\n config={config}\n width={320}\n height={400}\n style={{ width: \"264px\", maxWidth: \"100%\", height: \"auto\", aspectRatio: \"320 / 400\", borderRadius: \"3px\" }}\n />\n <div\n style={{\n position: \"absolute\",\n inset: \"10px\",\n pointerEvents: \"none\",\n borderRadius: \"3px\",\n backgroundImage: \"repeating-linear-gradient(0deg, rgba(0,0,0,.16) 0 2px, transparent 2px 4px)\",\n mixBlendMode: \"multiply\",\n }}\n />\n {showCombat && (\n <div\n style={{\n position: \"absolute\",\n right: \"14px\",\n bottom: \"14px\",\n fontFamily: t.mono,\n fontSize: \"7px\",\n letterSpacing: \"1px\",\n color: t.title,\n background: t.marqueeBg,\n border: \"2px solid \" + t.cabinetBorder,\n borderRadius: \"6px\",\n padding: \"5px 7px\",\n pointerEvents: \"none\",\n }}\n >\n ⚔ FIGHT\n </div>\n )}\n </div>\n <div\n style={{\n fontFamily: t.mono,\n fontSize: \"9px\",\n color: t.title,\n letterSpacing: \"1px\",\n padding: \"6px 10px\",\n background: t.marqueeBg,\n borderRadius: \"5px\",\n textAlign: \"center\",\n border: \"2px solid \" + t.cabinetBorder,\n }}\n >\n {\"THE \" + nameDisplay + \" WEARER\"}\n </div>\n\n <div style={{ width: \"264px\", maxWidth: \"100%\", display: \"flex\", flexDirection: \"column\", gap: \"8px\", marginTop: \"2px\" }}>\n <div style={{ display: \"flex\", gap: \"6px\", width: \"100%\" }}>\n {VIEW_OPTIONS.map((o) => (\n <button\n key={o.key}\n onClick={() => patch({ view: o.key })}\n style={{\n fontFamily: t.mono,\n fontSize: \"7px\",\n letterSpacing: \".5px\",\n cursor: \"pointer\",\n flex: 1,\n padding: \"8px 4px\",\n borderRadius: t.paper ? \"3px\" : \"6px\",\n border: \"2px solid \" + (config.view === o.key ? t.accent : t.panelBorder),\n background: config.view === o.key ? t.accent : t.paper ? \"#ffffff55\" : \"#ffffff10\",\n color: config.view === o.key ? \"#10131c\" : t.text,\n }}\n >\n {o.name}\n </button>\n ))}\n </div>\n\n {partRow(\"mouth\", \"MOUTH\")}\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>BACKGROUND</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {BG.map((c) => (\n <button key={c} onClick={() => patch({ background: c })} style={swatchBtn(c, config.background === c)} />\n ))}\n </div>\n </div>\n\n {showCode && (\n <>\n <div style={dividerStyle} />\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"6px\" }}>\n <span style={codeLabelStyle}>CODE</span>\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n <div style={codeFieldStyle}>{encodeConfig(config)}</div>\n <button onClick={onCopyCode} style={smallBtnStyle}>\n COPY\n </button>\n </div>\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n <input\n value={codeInput}\n onChange={(e) => {\n setCodeInput(e.target.value);\n setCodeMsg(\"\");\n }}\n placeholder=\"Paste code…\"\n style={codeFieldStyle}\n />\n <button onClick={onLoadCode} style={smallBtnStyle}>\n LOAD\n </button>\n </div>\n {codeMsg && <span style={{ fontFamily: t.mono, fontSize: \"7px\", color: t.accent }}>{codeMsg}</span>}\n </div>\n </>\n )}\n\n {showSeed && (\n <>\n <div style={dividerStyle} />\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"6px\" }}>\n <span style={codeLabelStyle}>SEED</span>\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n <input\n value={seedInput}\n onChange={(e) => setSeedInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") onGenerateSeed();\n }}\n placeholder=\"e.g. your name…\"\n style={codeFieldStyle}\n />\n <button onClick={onGenerateSeed} style={smallBtnStyle}>\n GENERATE\n </button>\n </div>\n </div>\n </>\n )}\n </div>\n </div>\n\n {/* controls card */}\n <div\n style={{\n flex: 1,\n minWidth: 0,\n width: stacked ? \"100%\" : \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"9px\",\n background: t.panel,\n border: \"3px solid \" + t.panelBorder,\n borderRadius: t.paper ? \"4px\" : \"10px\",\n padding: \"14px\",\n }}\n >\n {PART_CONTROLS.map((c) => partRow(c.key, c.label))}\n\n <div style={dividerStyle} />\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>SKIN</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {SKIN.map((c) => (\n <button key={c} onClick={() => patch({ skin: c })} style={swatchBtn(c, config.skin === c)} />\n ))}\n </div>\n </div>\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>HAIR</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {HAIRS.map((c) => (\n <button key={c} onClick={() => patch({ hairColor: c })} style={swatchBtn(c, config.hairColor === c)} />\n ))}\n </div>\n </div>\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>CLOTHING</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {CLOTH.map((c) => (\n <button key={c} onClick={() => patch({ topColor: c })} style={swatchBtn(c, config.topColor === c)} />\n ))}\n </div>\n </div>\n\n <div style={swatchRowStyle}>\n <span style={swatchLabelStyle}>TROUSERS</span>\n <div style={{ display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {PANTS.map((c) => (\n <button key={c} onClick={() => patch({ trousersColor: c })} style={swatchBtn(c, config.trousersColor === c)} />\n ))}\n </div>\n </div>\n\n {(onMagic || showRandom) && <div style={dividerStyle} />}\n\n <div style={{ display: \"flex\", gap: \"8px\", marginTop: \"2px\" }}>\n {onMagic && (\n <button\n onClick={onMagic}\n style={{\n fontFamily: t.mono,\n fontSize: \"10px\",\n letterSpacing: \"1px\",\n cursor: \"pointer\",\n padding: \"12px\",\n borderRadius: t.paper ? \"3px\" : \"9px\",\n border: \"3px solid \" + t.title,\n background: \"#9b5de5\",\n color: \"#fff\",\n flex: \"0 0 auto\",\n }}\n >\n ✨ MAGIC\n </button>\n )}\n {showRandom && (\n <button\n onClick={onRandom}\n style={{\n fontFamily: t.mono,\n fontSize: \"10px\",\n letterSpacing: \"1px\",\n cursor: \"pointer\",\n padding: \"12px\",\n borderRadius: t.paper ? \"3px\" : \"9px\",\n border: \"3px solid \" + t.title,\n background: t.accent,\n color: \"#10131c\",\n flex: 1,\n }}\n >\n 🎲 RANDOM\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n\n {showCombat && modalOpen && <CombatModal config={config} theme={t} onClose={() => setModalOpen(false)} />}\n </div>\n );\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@retro-antlitz-kartei/react-editor",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "React editor and preview components for retro-antlitz-kartei pixel-art avatars.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "DracoBlue",
|
|
@@ -36,8 +36,8 @@
|
|
|
36
36
|
],
|
|
37
37
|
"sideEffects": false,
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@retro-antlitz-kartei/animate": "^0.1.
|
|
40
|
-
"@retro-antlitz-kartei/generator": "^0.
|
|
39
|
+
"@retro-antlitz-kartei/animate": "^0.1.2",
|
|
40
|
+
"@retro-antlitz-kartei/generator": "^0.3.0"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
43
|
"react": ">=18",
|