@retro-antlitz-kartei/react-editor 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +58 -0
- package/dist/index.cjs +750 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +100 -0
- package/dist/index.d.ts +100 -0
- package/dist/index.js +743 -0
- package/dist/index.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +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","PART_NAMES","randomConfig","encodeConfig","decodeConfig","BG","Fragment","SKIN","CLOTH"],"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,GAAMA,aAA0B,IAAI,CAAA;AAE1C,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,SAAS,GAAA,CAAI,OAAA;AACnB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAAC,sBAAA,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,uBACEC,cAAA;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,GAAYH,aAA0B,IAAI,CAAA;AAChD,EAAA,MAAM,QAAA,GAAWA,aAA2B,IAAI,CAAA;AAChD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAII,eAAe,MAAM,CAAA;AAE7C,EAAAH,gBAAU,MAAM;AACd,IAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,QAAQ,IAAII,mBAAA,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,EAAAJ,gBAAU,MAAM;AACd,IAAA,QAAA,CAAS,OAAA,EAAS,UAAU,MAAM,CAAA;AAAA,EACpC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAAA,gBAAU,MAAM;AACd,IAAA,QAAA,CAAS,OAAA,EAAS,QAAQ,IAAI,CAAA;AAAA,EAChC,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,uBACEE,cAAAA;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,kBAAAG,eAAA;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,4BAAAA,eAAA,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,8BAAAH,cAAAA,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,cAAAA;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,cAAAA;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,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,mBAAA,EAAqB,eAAA,EAAiB,GAAA,EAAK,OAAM,EAC7E,QAAA,EAAAI,aAAA,CAAM,GAAA,CAAI,CAAC,sBACVJ,cAAAA;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,EAAAK,kBAAA,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,eAAA;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;AC/DA,IAAM,aAAA,GAA4D;AAAA,EAChE,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,OAAA,EAAQ;AAAA,EAChC,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,EAC3B,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,MAAA,EAAO;AAAA,EAC9B,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,MAAA,EAAO;AAAA,EAC9B,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,EAC7B,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,WAAA,EAAY;AAAA,EACjC,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,KAAA,EAAM;AAAA,EAC7B,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,UAAA;AACxB,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;AAEA,SAAS,eAAA,CACP,UAAA,EACA,OAAA,EACA,QAAA,EACqB;AACrB,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIJ,eAAY,OAAO,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,UAAA,KAAe,MAAA,GAAY,UAAA,GAAa,QAAA;AACtD,EAAA,MAAM,GAAA,GAAMK,iBAAA;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,SAAA,GAAY,IAAA;AAAA,IACZ,SAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,MAAM,aAAA,GAAgBC,aAAA;AAAA,IACpB,MAAMC,0BAAgB,KAAA,IAAS,YAAA,KAAiB,OAAOC,wBAAA,CAAe,IAAI,IAAIC,wBAAA,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,GAAIT,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,EAAE,CAAA;AACzC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,cAAAA,CAAS,QAAQ,EAAE,CAAA;AAErD,EAAA,MAAM,CAAA,GAAI,MAAM,MAAM,CAAA;AAEtB,EAAAH,gBAAU,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;AACA,IAAA,IAAI,CAAC,QAAA,CAAS,cAAA,CAAe,eAAe,CAAA,EAAG;AAC7C,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AACxC,MAAA,CAAA,CAAE,EAAA,GAAK,eAAA;AACP,MAAA,CAAA,CAAE,WAAA,GAAc,2FAAA;AAChB,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,KAAA,GAAQQ,iBAAA,CAAY,CAAC,CAAA,KAA6B,UAAU,EAAE,GAAG,MAAA,EAAQ,GAAG,GAAG,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAS,CAAC,CAAA;AAC3G,EAAA,MAAM,KAAA,GAAQA,iBAAA;AAAA,IACZ,CAAC,KAAc,GAAA,KAAgB;AAC7B,MAAA,MAAM,GAAA,GAAMK,oBAAA,CAAW,GAAG,CAAA,CAAE,MAAA;AAC5B,MAAA,KAAA,CAAM,EAAE,CAAC,GAAG,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,GAAI,GAAA,GAAM,GAAA,IAAO,GAAA,EAA8B,CAAA;AAAA,IAC3E,CAAA;AAAA,IACA,CAAC,QAAQ,KAAK;AAAA,GAChB;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,EAAE,GAAGC,wBAAa,EAAG,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,CAAA;AACzE,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAM,IAAA,GAAOC,uBAAa,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,GAAOC,sBAAA,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,GAAGL,wBAAA,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,cAAcE,oBAAA,CAAW,KAAA,CAAM,MAAA,CAAO,KAAK,EAAE,WAAA,EAAY;AAE/D,EAAA,MAAM,OAAA,GAAU,CAAC,GAAA,EAAc,KAAA,qBAC7BR,eAAAA,CAAC,KAAA,EAAA,EAAc,OAAO,QAAA,EACpB,QAAA,EAAA;AAAA,oBAAAH,cAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,KAAA,CAAM,KAAK,EAAE,CAAA,EAAG,KAAA,EAAO,UAAA,EAAY,QAAA,EAAA,QAAA,EAE1D,CAAA;AAAA,oBACAG,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,SAAA,EAAW,QAAA,EAAS,EACtD,QAAA,EAAA;AAAA,sBAAAH,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EAAiB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACnCA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EAAiB,QAAA,EAAAW,oBAAA,CAAW,GAAG,CAAA,CAAE,MAAA,CAAO,GAAG,CAAC,CAAA,EAAE;AAAA,KAAA,EAC5D,CAAA;AAAA,oBACAX,cAAAA,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,uBACEG,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,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,MAAA;AAAA,QACT,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,eAAAA,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,0BAAAH,eAAC,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,cAAAA;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,wBAGFG,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,MAAA;AAAA,cACP,QAAA,EAAU,CAAA,CAAE,OAAA,KAAY,KAAA,GAAQ,OAAA,GAAU,OAAA;AAAA,cAC1C,YAAY,CAAA,CAAE,OAAA;AAAA,cACd,MAAA,EAAQ,eAAe,CAAA,CAAE,aAAA;AAAA,cACzB,cAAc,CAAA,CAAE,MAAA;AAAA,cAChB,WAAW,4BAAA,IAAgC,CAAA,CAAE,OAAO,aAAA,GAAgB,CAAA,CAAE,SAAS,IAAA,GAAO,EAAA,CAAA;AAAA,cACtF,QAAA,EAAU;AAAA,aACZ;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAA,eAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,YAAY,CAAA,CAAE,SAAA;AAAA,oBACd,OAAA,EAAS,MAAA;AAAA,oBACT,OAAA,EAAS,MAAA;AAAA,oBACT,GAAA,EAAK,MAAA;AAAA,oBACL,UAAA,EAAY,QAAA;AAAA,oBACZ,cAAA,EAAgB,QAAA;AAAA,oBAChB,YAAA,EAAc,eAAe,CAAA,CAAE;AAAA,mBACjC;AAAA,kBAEA,QAAA,EAAA;AAAA,oCAAAH,eAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,QAAQ,MAAA,EAAQ,MAAA,EAAQ,YAAA,EAAc,KAAA,EAAO,YAAY,CAAA,CAAE,MAAA,EAAQ,WAAW,UAAA,GAAa,CAAA,CAAE,QAAO,EAAG,CAAA;AAAA,oCAC7HA,cAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAO;AAAA,0BACL,YAAY,CAAA,CAAE,IAAA;AAAA,0BACd,QAAA,EAAU,CAAA,CAAE,SAAA,KAAc,QAAA,GAAW,MAAA,GAAS,MAAA;AAAA,0BAC9C,OAAO,CAAA,CAAE,KAAA;AAAA,0BACT,aAAA,EAAe,KAAA;AAAA,0BACf,UAAA,EAAY,CAAA,CAAE,IAAA,GAAO,WAAA,GAAc,EAAE,MAAA,GAAS;AAAA,yBAChD;AAAA,wBAEC,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA,qBACL;AAAA,oCACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,OAAO,EAAE,KAAA,EAAO,QAAQ,MAAA,EAAQ,MAAA,EAAQ,YAAA,EAAc,KAAA,EAAO,YAAY,CAAA,CAAE,MAAA,EAAQ,WAAW,UAAA,GAAa,CAAA,CAAE,QAAO,EAAG;AAAA;AAAA;AAAA,eAC/H;AAAA,8BAEAG,eAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,OAAA,EAAS,MAAA;AAAA,oBACT,eAAe,CAAA,CAAE,OAAA;AAAA,oBACjB,GAAA,EAAK,MAAA;AAAA,oBACL,OAAA,EAAS,MAAA;AAAA,oBACT,UAAA,EAAY,CAAA,CAAE,OAAA,KAAY,KAAA,GAAQ,SAAA,GAAY;AAAA,mBAChD;AAAA,kBAGA,QAAA,EAAA;AAAA,oCAAAA,eAAAA;AAAA,sBAAC,KAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAO;AAAA,0BACL,IAAA,EAAM,CAAA,CAAE,OAAA,KAAY,KAAA,GAAQ,WAAA,GAAc,UAAA;AAAA,0BAC1C,OAAA,EAAS,MAAA;AAAA,0BACT,aAAA,EAAe,QAAA;AAAA,0BACf,GAAA,EAAK,KAAA;AAAA,0BACL,UAAA,EAAY;AAAA,yBACd;AAAA,wBAEA,QAAA,EAAA;AAAA,0CAAAA,eAAAA;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,gDAAAH,cAAAA,CAAC,aAAA,EAAA,EAAc,MAAA,EAAgB,KAAA,EAAO,KAAK,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,EAAE,OAAO,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS,YAAA,EAAc,OAAM,EAAG,CAAA;AAAA,gDACzHA,cAAAA;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,cAAAA;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,cAAAA;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,0CAEAG,eAAAA,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,4CAAAH,cAAAA,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,cAAAA;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,QAAQ,OAAO,CAAA;AAAA,4CAExBG,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EACV,QAAA,EAAA;AAAA,8CAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,gBAAA,EAAkB,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,8CACzCA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,QAAA,EAAU,QAAO,EACzD,QAAA,EAAAe,YAAA,CAAG,GAAA,CAAI,CAAC,GAAG,CAAA,qBACVf,cAAAA,CAAC,QAAA,EAAA,EAAe,SAAS,MAAM,KAAA,CAAM,EAAE,EAAA,EAAI,GAAG,CAAA,EAAG,KAAA,EAAO,SAAA,CAAU,GAAG,MAAA,CAAO,EAAA,KAAO,CAAC,CAAA,EAAA,EAAvE,CAA0E,CACxF,CAAA,EACH;AAAA,6BAAA,EACF,CAAA;AAAA,4BAEC,QAAA,oBACCG,eAAAA,CAAAa,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,8CAAAhB,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,EAAc,CAAA;AAAA,8CAC1BG,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,KAAA,EAAM,EACjE,QAAA,EAAA;AAAA,gDAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,gDACjCG,gBAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAM,EACxC,QAAA,EAAA;AAAA,kDAAAH,eAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EAAiB,QAAA,EAAAa,sBAAA,CAAa,MAAM,CAAA,EAAE,CAAA;AAAA,kDAClDb,cAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,UAAA,EAAY,KAAA,EAAO,eAAe,QAAA,EAAA,MAAA,EAEnD;AAAA,iCAAA,EACF,CAAA;AAAA,gDACAG,gBAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAM,EACxC,QAAA,EAAA;AAAA,kDAAAH,cAAAA;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,cAAAA,CAAC,QAAA,EAAA,EAAO,SAAS,UAAA,EAAY,KAAA,EAAO,eAAe,QAAA,EAAA,MAAA,EAEnD;AAAA,iCAAA,EACF,CAAA;AAAA,gCACC,OAAA,oBAAWA,cAAAA,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,oBACCG,eAAAA,CAAAa,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,8CAAAhB,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,EAAc,CAAA;AAAA,8CAC1BG,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,KAAA,EAAM,EACjE,QAAA,EAAA;AAAA,gDAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,gDACjCG,gBAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAM,EACxC,QAAA,EAAA;AAAA,kDAAAH,cAAAA;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,cAAAA,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,oCAGAG,eAAAA;AAAA,sBAAC,KAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAO;AAAA,0BACL,IAAA,EAAM,CAAA;AAAA,0BACN,QAAA,EAAU,CAAA;AAAA,0BACV,KAAA,EAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,MAAA,GAAS,MAAA;AAAA,0BACzC,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,0CAEjDH,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,EAAc,CAAA;AAAA,0CAE1BG,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EACV,QAAA,EAAA;AAAA,4CAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,gBAAA,EAAkB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,4CACnCA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,QAAA,EAAU,QAAO,EACzD,QAAA,EAAAiB,cAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,qBACZjB,cAAAA,CAAC,QAAA,EAAA,EAAe,SAAS,MAAM,KAAA,CAAM,EAAE,IAAA,EAAM,GAAG,CAAA,EAAG,KAAA,EAAO,SAAA,CAAU,GAAG,MAAA,CAAO,IAAA,KAAS,CAAC,CAAA,EAAA,EAA3E,CAA8E,CAC5F,CAAA,EACH;AAAA,2BAAA,EACF,CAAA;AAAA,0CAEAG,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EACV,QAAA,EAAA;AAAA,4CAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,gBAAA,EAAkB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,4CACvCA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,QAAA,EAAU,QAAO,EACzD,QAAA,EAAAkB,eAAA,CAAM,GAAA,CAAI,CAAC,GAAG,CAAA,qBACblB,cAAAA,CAAC,QAAA,EAAA,EAAe,SAAS,MAAM,KAAA,CAAM,EAAE,KAAA,EAAO,GAAG,CAAA,EAAG,KAAA,EAAO,SAAA,CAAU,GAAG,MAAA,CAAO,KAAA,KAAU,CAAC,CAAA,EAAA,EAA7E,CAAgF,CAC9F,CAAA,EACH;AAAA,2BAAA,EACF,CAAA;AAAA,0CAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,EAAc,CAAA;AAAA,0CAE1BA,cAAAA;AAAA,4BAAC,QAAA;AAAA,4BAAA;AAAA,8BACC,OAAA,EAAS,QAAA;AAAA,8BACT,KAAA,EAAO;AAAA,gCACL,YAAY,CAAA,CAAE,IAAA;AAAA,gCACd,QAAA,EAAU,MAAA;AAAA,gCACV,aAAA,EAAe,KAAA;AAAA,gCACf,MAAA,EAAQ,SAAA;AAAA,gCACR,OAAA,EAAS,MAAA;AAAA,gCACT,YAAA,EAAc,CAAA,CAAE,KAAA,GAAQ,KAAA,GAAQ,KAAA;AAAA,gCAChC,SAAA,EAAW,KAAA;AAAA,gCACX,MAAA,EAAQ,eAAe,CAAA,CAAE,KAAA;AAAA,gCACzB,YAAY,CAAA,CAAE,MAAA;AAAA,gCACd,KAAA,EAAO;AAAA,+BACT;AAAA,8BACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA;AACF;AAAA;AAAA,eACF;AAAA,8BAEAG,eAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,YAAY,CAAA,CAAE,SAAA;AAAA,oBACd,OAAA,EAAS,MAAA;AAAA,oBACT,OAAA,EAAS,MAAA;AAAA,oBACT,GAAA,EAAK,MAAA;AAAA,oBACL,UAAA,EAAY,QAAA;AAAA,oBACZ,cAAA,EAAgB,QAAA;AAAA,oBAChB,OAAO,CAAA,CAAE,KAAA;AAAA,oBACT,SAAA,EAAW,eAAe,CAAA,CAAE;AAAA,mBAC9B;AAAA,kBAEA,QAAA,EAAA;AAAA,oCAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,CAAE,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAW,yCAAA,EAA0C,EAAG,QAAA,EAAA,QAAA,EAAO,CAAA;AAAA,oCACjHA,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,CAAA,CAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,aAAA,EAAe,KAAA,IAAS,QAAA,EAAA,iCAAA,EAAmC;AAAA;AAAA;AAAA;AACjH;AAAA;AAAA,SACF;AAAA,QAEC,UAAA,IAAc,SAAA,oBAAaA,cAAAA,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.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: \"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 } from \"react\";\nimport {\n type AvatarConfig,\n type PartKey,\n type View,\n PART_NAMES,\n SKIN,\n CLOTH,\n BG,\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 /** 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: \"gender\", label: \"BUILD\" },\n { key: \"hut\", label: \"HAT\" },\n { key: \"haare\", label: \"HAIR\" },\n { key: \"ohren\", label: \"EARS\" },\n { key: \"nase\", label: \"NOSE\" },\n { key: \"acc\", label: \"ACCESSORY\" },\n { key: \"torso\", label: \"TOP\" },\n { key: \"hose\", label: \"TROUSERS\" },\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\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 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 t = theme(layout);\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 if (!document.getElementById(\"rak-keyframes\")) {\n const s = document.createElement(\"style\");\n s.id = \"rak-keyframes\";\n s.textContent = \"@keyframes rak-coinpulse{0%,100%{transform:translateY(0)}50%{transform:translateY(-2px)}}\";\n document.head.appendChild(s);\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 len = PART_NAMES[key].length;\n patch({ [key]: (config[key] + dir + len) % len } 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 = PART_NAMES.torso[config.torso].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}>{PART_NAMES[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 className={className}\n style={{\n minHeight: \"100%\",\n width: \"100%\",\n background: t.stageBg,\n padding: \"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: t.mainDir === \"row\" ? \"860px\" : \"540px\",\n background: t.cabinet,\n border: \"4px solid \" + t.cabinetBorder,\n borderRadius: t.radius,\n boxShadow: \"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: \"14px\",\n display: \"flex\",\n gap: \"12px\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderBottom: \"3px solid \" + t.cabinetBorder,\n }}\n >\n <span style={{ width: \"10px\", height: \"10px\", borderRadius: \"50%\", background: t.accent, boxShadow: \"0 0 8px \" + t.accent }} />\n <span\n style={{\n fontFamily: t.mono,\n fontSize: t.titleText === \"WANTED\" ? \"20px\" : \"15px\",\n color: t.title,\n letterSpacing: \"2px\",\n textShadow: t.glow ? \"0 0 10px \" + t.accent : \"2px 2px 0 #00000044\",\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 }} />\n </div>\n\n <div\n style={{\n display: \"flex\",\n flexDirection: t.mainDir,\n gap: \"16px\",\n padding: \"18px\",\n alignItems: t.mainDir === \"row\" ? \"stretch\" : \"center\",\n }}\n >\n {/* screen card */}\n <div\n style={{\n flex: t.mainDir === \"row\" ? \"0 0 300px\" : \"0 0 auto\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n alignItems: \"center\",\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 config={config} width={320} height={400} style={{ width: \"264px\", height: \"330px\", borderRadius: \"3px\" }} />\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(\"mund\", \"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, i) => (\n <button key={c} onClick={() => patch({ bg: i })} style={swatchBtn(c, config.bg === i)} />\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: t.mainDir === \"column\" ? \"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, i) => (\n <button key={c} onClick={() => patch({ skin: i })} style={swatchBtn(c, config.skin === i)} />\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, i) => (\n <button key={c} onClick={() => patch({ cloth: i })} style={swatchBtn(c, config.cloth === i)} />\n ))}\n </div>\n </div>\n\n <div style={dividerStyle} />\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 marginTop: \"2px\",\n border: \"3px solid \" + t.title,\n background: t.accent,\n color: \"#10131c\",\n }}\n >\n 🎲 RANDOM\n </button>\n </div>\n </div>\n\n <div\n style={{\n background: t.marqueeBg,\n padding: \"10px\",\n display: \"flex\",\n gap: \"10px\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: t.title,\n borderTop: \"3px solid \" + t.cabinetBorder,\n }}\n >\n <span style={{ color: t.accent, fontSize: \"14px\", animation: \"rak-coinpulse 1.2s ease-in-out infinite\" }}>●</span>\n <span style={{ fontFamily: t.mono, fontSize: \"8px\", letterSpacing: \"1px\" }}>INSERT COIN · SATIRE EDITION</span>\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
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { AvatarConfig } from '@retro-antlitz-kartei/generator';
|
|
3
|
+
|
|
4
|
+
/** The three editor skins. */
|
|
5
|
+
type Layout = "arcade" | "kompakt" | "steckbrief";
|
|
6
|
+
/** All layouts in display order. */
|
|
7
|
+
declare const LAYOUTS: readonly {
|
|
8
|
+
key: Layout;
|
|
9
|
+
name: string;
|
|
10
|
+
}[];
|
|
11
|
+
/** Resolved style tokens for a layout — colours, fonts and shape. */
|
|
12
|
+
interface Theme {
|
|
13
|
+
stageBg: string;
|
|
14
|
+
cabinet: string;
|
|
15
|
+
cabinetBorder: string;
|
|
16
|
+
marqueeBg: string;
|
|
17
|
+
title: string;
|
|
18
|
+
accent: string;
|
|
19
|
+
screenBg: string;
|
|
20
|
+
panel: string;
|
|
21
|
+
panelBorder: string;
|
|
22
|
+
rowBg: string;
|
|
23
|
+
text: string;
|
|
24
|
+
sub: string;
|
|
25
|
+
mainDir: "row" | "column";
|
|
26
|
+
mono: string;
|
|
27
|
+
body: string;
|
|
28
|
+
radius: string;
|
|
29
|
+
titleText: string;
|
|
30
|
+
glow: boolean;
|
|
31
|
+
paper: boolean;
|
|
32
|
+
}
|
|
33
|
+
/** Resolve the visual tokens for a layout. */
|
|
34
|
+
declare function theme(layout: Layout): Theme;
|
|
35
|
+
/** The web-font `<link>` hrefs the editor needs (Press Start 2P + VT323). */
|
|
36
|
+
declare const FONT_HREFS: readonly string[];
|
|
37
|
+
|
|
38
|
+
interface AvatarEditorProps {
|
|
39
|
+
/** Controlled config. When set, you must update it via `onChange`. */
|
|
40
|
+
value?: AvatarConfig;
|
|
41
|
+
/** Initial config for uncontrolled use. */
|
|
42
|
+
defaultValue?: AvatarConfig;
|
|
43
|
+
/** Seed for the initial avatar when neither `value` nor `defaultValue` is given. */
|
|
44
|
+
seed?: string;
|
|
45
|
+
/** Called with the new config whenever the user edits the avatar. */
|
|
46
|
+
onChange?: (config: AvatarConfig) => void;
|
|
47
|
+
/** Controlled layout/skin. */
|
|
48
|
+
layout?: Layout;
|
|
49
|
+
/** Initial layout for uncontrolled use. Default `"arcade"`. */
|
|
50
|
+
defaultLayout?: Layout;
|
|
51
|
+
onLayoutChange?: (layout: Layout) => void;
|
|
52
|
+
/** Show the layout switcher row. Default `true`. */
|
|
53
|
+
showLayoutPicker?: boolean;
|
|
54
|
+
/** Show the "fight" combat modal. Default `true`. */
|
|
55
|
+
showCombat?: boolean;
|
|
56
|
+
/** Show the share-code copy/load box. Default `true`. */
|
|
57
|
+
showCode?: boolean;
|
|
58
|
+
/** Show the seed input. Default `true`. */
|
|
59
|
+
showSeed?: boolean;
|
|
60
|
+
/** Inject the pixel web fonts (Press Start 2P + VT323) into `<head>`. Default `true`. */
|
|
61
|
+
loadFonts?: boolean;
|
|
62
|
+
className?: string;
|
|
63
|
+
style?: React.CSSProperties;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The full retro avatar editor: live preview, part cyclers, colour swatches,
|
|
67
|
+
* view + layout switchers, a shareable code box, a seed generator and the
|
|
68
|
+
* animated combat modal. Works controlled (`value`/`onChange`) or uncontrolled.
|
|
69
|
+
*/
|
|
70
|
+
declare function AvatarEditor(props: AvatarEditorProps): React.ReactElement;
|
|
71
|
+
|
|
72
|
+
interface AvatarPreviewProps {
|
|
73
|
+
/** The avatar to draw. */
|
|
74
|
+
config: AvatarConfig;
|
|
75
|
+
/** Backing canvas resolution in px. Default `320 × 400`. */
|
|
76
|
+
width?: number;
|
|
77
|
+
height?: number;
|
|
78
|
+
/** Background: `true` = palette colour, hex string = override, `false` = transparent. */
|
|
79
|
+
background?: boolean | string;
|
|
80
|
+
/** Draw the floor strip. Default `true`. */
|
|
81
|
+
floor?: boolean;
|
|
82
|
+
className?: string;
|
|
83
|
+
style?: React.CSSProperties;
|
|
84
|
+
onClick?: () => void;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Renders an {@link AvatarConfig} onto a `<canvas>`, re-drawing whenever the
|
|
88
|
+
* config changes. Standalone — use it without the full editor chrome.
|
|
89
|
+
*/
|
|
90
|
+
declare function AvatarPreview({ config, width, height, background, floor, className, style, onClick, }: AvatarPreviewProps): React.ReactElement;
|
|
91
|
+
|
|
92
|
+
interface CombatModalProps {
|
|
93
|
+
config: AvatarConfig;
|
|
94
|
+
theme: Theme;
|
|
95
|
+
onClose: () => void;
|
|
96
|
+
}
|
|
97
|
+
/** Full-screen overlay running the animated combat arena with pose buttons. */
|
|
98
|
+
declare function CombatModal({ config, theme: t, onClose }: CombatModalProps): React.ReactElement;
|
|
99
|
+
|
|
100
|
+
export { AvatarEditor, type AvatarEditorProps, AvatarPreview, type AvatarPreviewProps, CombatModal, type CombatModalProps, FONT_HREFS, LAYOUTS, type Layout, type Theme, theme };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { AvatarConfig } from '@retro-antlitz-kartei/generator';
|
|
3
|
+
|
|
4
|
+
/** The three editor skins. */
|
|
5
|
+
type Layout = "arcade" | "kompakt" | "steckbrief";
|
|
6
|
+
/** All layouts in display order. */
|
|
7
|
+
declare const LAYOUTS: readonly {
|
|
8
|
+
key: Layout;
|
|
9
|
+
name: string;
|
|
10
|
+
}[];
|
|
11
|
+
/** Resolved style tokens for a layout — colours, fonts and shape. */
|
|
12
|
+
interface Theme {
|
|
13
|
+
stageBg: string;
|
|
14
|
+
cabinet: string;
|
|
15
|
+
cabinetBorder: string;
|
|
16
|
+
marqueeBg: string;
|
|
17
|
+
title: string;
|
|
18
|
+
accent: string;
|
|
19
|
+
screenBg: string;
|
|
20
|
+
panel: string;
|
|
21
|
+
panelBorder: string;
|
|
22
|
+
rowBg: string;
|
|
23
|
+
text: string;
|
|
24
|
+
sub: string;
|
|
25
|
+
mainDir: "row" | "column";
|
|
26
|
+
mono: string;
|
|
27
|
+
body: string;
|
|
28
|
+
radius: string;
|
|
29
|
+
titleText: string;
|
|
30
|
+
glow: boolean;
|
|
31
|
+
paper: boolean;
|
|
32
|
+
}
|
|
33
|
+
/** Resolve the visual tokens for a layout. */
|
|
34
|
+
declare function theme(layout: Layout): Theme;
|
|
35
|
+
/** The web-font `<link>` hrefs the editor needs (Press Start 2P + VT323). */
|
|
36
|
+
declare const FONT_HREFS: readonly string[];
|
|
37
|
+
|
|
38
|
+
interface AvatarEditorProps {
|
|
39
|
+
/** Controlled config. When set, you must update it via `onChange`. */
|
|
40
|
+
value?: AvatarConfig;
|
|
41
|
+
/** Initial config for uncontrolled use. */
|
|
42
|
+
defaultValue?: AvatarConfig;
|
|
43
|
+
/** Seed for the initial avatar when neither `value` nor `defaultValue` is given. */
|
|
44
|
+
seed?: string;
|
|
45
|
+
/** Called with the new config whenever the user edits the avatar. */
|
|
46
|
+
onChange?: (config: AvatarConfig) => void;
|
|
47
|
+
/** Controlled layout/skin. */
|
|
48
|
+
layout?: Layout;
|
|
49
|
+
/** Initial layout for uncontrolled use. Default `"arcade"`. */
|
|
50
|
+
defaultLayout?: Layout;
|
|
51
|
+
onLayoutChange?: (layout: Layout) => void;
|
|
52
|
+
/** Show the layout switcher row. Default `true`. */
|
|
53
|
+
showLayoutPicker?: boolean;
|
|
54
|
+
/** Show the "fight" combat modal. Default `true`. */
|
|
55
|
+
showCombat?: boolean;
|
|
56
|
+
/** Show the share-code copy/load box. Default `true`. */
|
|
57
|
+
showCode?: boolean;
|
|
58
|
+
/** Show the seed input. Default `true`. */
|
|
59
|
+
showSeed?: boolean;
|
|
60
|
+
/** Inject the pixel web fonts (Press Start 2P + VT323) into `<head>`. Default `true`. */
|
|
61
|
+
loadFonts?: boolean;
|
|
62
|
+
className?: string;
|
|
63
|
+
style?: React.CSSProperties;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The full retro avatar editor: live preview, part cyclers, colour swatches,
|
|
67
|
+
* view + layout switchers, a shareable code box, a seed generator and the
|
|
68
|
+
* animated combat modal. Works controlled (`value`/`onChange`) or uncontrolled.
|
|
69
|
+
*/
|
|
70
|
+
declare function AvatarEditor(props: AvatarEditorProps): React.ReactElement;
|
|
71
|
+
|
|
72
|
+
interface AvatarPreviewProps {
|
|
73
|
+
/** The avatar to draw. */
|
|
74
|
+
config: AvatarConfig;
|
|
75
|
+
/** Backing canvas resolution in px. Default `320 × 400`. */
|
|
76
|
+
width?: number;
|
|
77
|
+
height?: number;
|
|
78
|
+
/** Background: `true` = palette colour, hex string = override, `false` = transparent. */
|
|
79
|
+
background?: boolean | string;
|
|
80
|
+
/** Draw the floor strip. Default `true`. */
|
|
81
|
+
floor?: boolean;
|
|
82
|
+
className?: string;
|
|
83
|
+
style?: React.CSSProperties;
|
|
84
|
+
onClick?: () => void;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Renders an {@link AvatarConfig} onto a `<canvas>`, re-drawing whenever the
|
|
88
|
+
* config changes. Standalone — use it without the full editor chrome.
|
|
89
|
+
*/
|
|
90
|
+
declare function AvatarPreview({ config, width, height, background, floor, className, style, onClick, }: AvatarPreviewProps): React.ReactElement;
|
|
91
|
+
|
|
92
|
+
interface CombatModalProps {
|
|
93
|
+
config: AvatarConfig;
|
|
94
|
+
theme: Theme;
|
|
95
|
+
onClose: () => void;
|
|
96
|
+
}
|
|
97
|
+
/** Full-screen overlay running the animated combat arena with pose buttons. */
|
|
98
|
+
declare function CombatModal({ config, theme: t, onClose }: CombatModalProps): React.ReactElement;
|
|
99
|
+
|
|
100
|
+
export { AvatarEditor, type AvatarEditorProps, AvatarPreview, type AvatarPreviewProps, CombatModal, type CombatModalProps, FONT_HREFS, LAYOUTS, type Layout, type Theme, theme };
|