@unblessed/layout
Version:
Flexbox layout engine for unblessed using Yoga
1 lines • 52.5 kB
Source Map (JSON)
{"version":3,"sources":["../src/widget-sync.ts","../src/yoga-node.ts","../src/layout-engine.ts","../src/widget-descriptor.ts"],"names":["Yoga","Element","Box"],"mappings":";;;;;;;;;;AAWA,SAAS,iBAAA,CACP,QACA,QAAA,EACM;AACN,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACvD,IAAA,MAAA,CAAO,EAAA,CAAG,OAAO,OAAc,CAAA;AAAA,EACjC;AACF;AAKA,SAAS,mBAAA,CACP,QACA,QAAA,EACM;AACN,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACvD,IAAA,MAAA,CAAO,cAAA,CAAe,OAAO,OAAc,CAAA;AAAA,EAC7C;AACF;AAKO,SAAS,kBAAkB,IAAA,EAAkC;AAClE,EAAA,OAAO;AAAA,IACL,KAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,gBAAgB,CAAA;AAAA,IAC9C,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,iBAAiB,CAAA;AAAA,IAChD,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,kBAAkB,CAAA;AAAA,IAClD,QAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,mBAAmB;AAAA,GACtD;AACF;AAMO,SAAS,kBAAA,CAAmB,MAAkB,MAAA,EAAyB;AAE5E,EAAA,MAAM,MAAA,GAAS,kBAAkB,IAAI,CAAA;AAErC,EAAA,IAAI,MAAM,MAAA,CAAO,GAAA;AACjB,EAAA,IAAI,OAAO,MAAA,CAAO,IAAA;AAElB,EAAA,IAAI,KAAK,MAAA,EAAQ;AACf,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,iBAAA;AAAA,MAC3CA,sBAAA,CAAK;AAAA,KACP;AACA,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,iBAAA;AAAA,MAC5CA,sBAAA,CAAK;AAAA,KACP;AAGA,IAAA,GAAA,GAAM,OAAO,GAAA,GAAM,eAAA;AACnB,IAAA,IAAA,GAAO,OAAO,IAAA,GAAO,gBAAA;AAAA,EACvB;AAGA,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAO,IAAA,CAAK,MAAA;AAAA,IACd;AACA,IAAA,IAAA,CAAK,SAAS,IAAIC,YAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAClD,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAEA,EAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAEhB,IAAA,IAAI,KAAK,WAAA,EAAa;AAEpB,MAAA,MAAM,cAAA,GAAiB,EAAE,GAAG,MAAA,EAAQ,KAAK,IAAA,EAAK;AAC9C,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,YAAA,CAAa,gBAAgB,MAAM,CAAA;AAAA,IACpE,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,MAAA,GAAS,IAAIC,QAAA,CAAI;AAAA,QACpB,MAAA;AAAA,QACA,IAAA,EAAM,IAAA;AAAA,QACN,KAAA,EAAO,IAAA;AAAA,QACP,IAAA,EAAM,IAAA;AAAA,QACN,GAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,GAAG,IAAA,CAAK;AAAA,OACT,CAAA;AAAA,IACH;AAIA,IAAA,IAAI,IAAA,CAAK,iBAAiB,MAAA,CAAO,IAAA,CAAK,KAAK,aAAa,CAAA,CAAE,SAAS,CAAA,EAAG;AACpE,MAAA,iBAAA,CAAkB,IAAA,CAAK,MAAA,EAAS,IAAA,CAAK,aAAa,CAAA;AAClD,MAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,aAAA;AAAA,IAC7B;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,cAAA,GAAiB,EAAE,GAAG,MAAA,EAAQ,KAAK,IAAA,EAAK;AAE9C,IAAA,IAAI,KAAK,WAAA,EAAa;AAEpB,MAAA,IAAA,CAAK,WAAA,CAAY,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ,cAAc,CAAA;AAAA,IAC3D,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,MAAA,CAAO,SAAS,GAAA,GAAM,GAAA;AAC3B,MAAA,IAAA,CAAK,MAAA,CAAO,SAAS,IAAA,GAAO,IAAA;AAC5B,MAAA,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,KAAA,GAAQ,MAAA,CAAO,KAAA;AACpC,MAAA,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,MAAA,GAAS,MAAA,CAAO,MAAA;AAErC,MAAA,IAAI,KAAK,aAAA,EAAe;AACtB,QAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,aAAa,CAAA;AAAA,MAC/C;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,aAAA,KAAkB,IAAA,CAAK,cAAA,EAAgB;AAC9C,MAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,QAAA,mBAAA,CAAoB,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,cAAc,CAAA;AAAA,MACtD;AAEA,MAAA,IAAI,MAAA,CAAO,KAAK,IAAA,CAAK,aAAA,IAAiB,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG;AACpD,QAAA,iBAAA,CAAkB,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,aAAA,IAAiB,EAAE,CAAA;AACvD,QAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,aAAA;AAAA,MAC7B,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,cAAA,GAAiB,MAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAIA,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AAEpB,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,IAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,KAAA,EAAO,MAAM,CAAA;AAEpD,IAAA,IAAI,WAAA,CAAY,WAAW,MAAA,EAAQ;AACjC,MAAA,MAAA,CAAO,OAAO,WAAW,CAAA;AAAA,IAC3B;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC5B,IAAA,MAAM,YAAA,GAAe,KAAK,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,OAAO,CAAA;AAElE,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,CACtB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,aAAA,EAAe,OAAA,IAAW,EAAE,CAAA,CACzC,IAAA,CAAK,EAAE,CAAA;AAEV,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAA,CAAO,WAAW,WAAW,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,iBAAA,CAAkB,UAAsB,MAAA,EAAsB;AAC5E,EAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,QAAA,EAAU,MAAM,CAAA;AAGtD,EAAA,IAAI,CAAC,WAAW,MAAA,EAAQ;AACtB,IAAA,MAAA,CAAO,OAAO,UAAU,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAA,CAAO,MAAA,EAAO;AAChB;AAKO,SAAS,eAAe,IAAA,EAAwB;AACrD,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,IAAA,cAAA,CAAe,KAAK,CAAA;AAAA,EACtB;AAEA,EAAA,IAAI,KAAK,MAAA,EAAQ;AACf,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,mBAAA,CAAoB,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,cAAc,CAAA;AACpD,MAAA,IAAA,CAAK,cAAA,GAAiB,MAAA;AAAA,IACxB;AAEA,IAAA,IAAA,CAAK,OAAO,MAAA,EAAO;AACnB,IAAA,IAAA,CAAK,OAAO,OAAA,EAAQ;AACpB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AACF;AC3LO,SAAS,gBAAA,CACd,IAAA,EACA,KAAA,GAAsB,EAAC,EACX;AACZ,EAAA,MAAM,MAAA,GAASF,sBAAAA,CAAK,MAAA,CAAO,MAAA,EAAO;AAClC,EAAA,MAAA,CAAO,kBAAkB,IAAI,CAAA;AAE7B,EAAA,MAAM,QAAA,GAAWA,sBAAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAExC,EAAA,IAAI,IAAA,KAAS,KAAA,IAAS,CAAC,KAAA,CAAM,KAAA,EAAO;AAClC,IAAA,KAAA,CAAM,KAAA,GAAQ,MAAA;AAAA,EAChB;AAEA,EAAA,MAAM,IAAA,GAAmB;AAAA,IACvB,IAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAU,EAAC;AAAA,IACX,MAAA,EAAQ,IAAA;AAAA,IACR,eAAe;AAAC,GAClB;AAGA,EAAA,eAAA,CAAgB,UAAU,KAAK,CAAA;AAE/B,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,eAAA,CAAgB,UAAoB,KAAA,EAA2B;AAE7E,EAAA,IAAI,KAAA,CAAM,kBAAkB,MAAA,EAAW;AACrC,IAAA,QAAQ,MAAM,aAAA;AAAe,MAC3B,KAAK,KAAA;AACH,QAAA,QAAA,CAAS,gBAAA,CAAiBA,uBAAK,kBAAkB,CAAA;AACjD,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,QAAA,CAAS,gBAAA,CAAiBA,uBAAK,qBAAqB,CAAA;AACpD,QAAA;AAAA,MACF,KAAK,aAAA;AACH,QAAA,QAAA,CAAS,gBAAA,CAAiBA,uBAAK,0BAA0B,CAAA;AACzD,QAAA;AAAA,MACF,KAAK,gBAAA;AACH,QAAA,QAAA,CAAS,gBAAA,CAAiBA,uBAAK,6BAA6B,CAAA;AAC5D,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAChC,IAAA,QAAQ,MAAM,QAAA;AAAU,MACtB,KAAK,QAAA;AACH,QAAA,QAAA,CAAS,WAAA,CAAYA,uBAAK,YAAY,CAAA;AACtC,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,QAAA,CAAS,WAAA,CAAYA,uBAAK,SAAS,CAAA;AACnC,QAAA;AAAA,MACF,KAAK,cAAA;AACH,QAAA,QAAA,CAAS,WAAA,CAAYA,uBAAK,iBAAiB,CAAA;AAC3C,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,mBAAmB,MAAA,EAAW;AACtC,IAAA,QAAQ,MAAM,cAAA;AAAgB,MAC5B,KAAK,YAAA;AACH,QAAA,QAAA,CAAS,iBAAA,CAAkBA,uBAAK,kBAAkB,CAAA;AAClD,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,QAAA,CAAS,iBAAA,CAAkBA,uBAAK,cAAc,CAAA;AAC9C,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,QAAA,CAAS,iBAAA,CAAkBA,uBAAK,gBAAgB,CAAA;AAChD,QAAA;AAAA,MACF,KAAK,eAAA;AACH,QAAA,QAAA,CAAS,iBAAA,CAAkBA,uBAAK,qBAAqB,CAAA;AACrD,QAAA;AAAA,MACF,KAAK,cAAA;AACH,QAAA,QAAA,CAAS,iBAAA,CAAkBA,uBAAK,oBAAoB,CAAA;AACpD,QAAA;AAAA,MACF,KAAK,cAAA;AACH,QAAA,QAAA,CAAS,iBAAA,CAAkBA,uBAAK,oBAAoB,CAAA;AACpD,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,eAAe,MAAA,EAAW;AAClC,IAAA,QAAQ,MAAM,UAAA;AAAY,MACxB,KAAK,YAAA;AACH,QAAA,QAAA,CAAS,aAAA,CAAcA,uBAAK,gBAAgB,CAAA;AAC5C,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,QAAA,CAAS,aAAA,CAAcA,uBAAK,YAAY,CAAA;AACxC,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,QAAA,CAAS,aAAA,CAAcA,uBAAK,cAAc,CAAA;AAC1C,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,QAAA,CAAS,aAAA,CAAcA,uBAAK,aAAa,CAAA;AACzC,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,cAAc,MAAA,EAAW;AACjC,IAAA,QAAQ,MAAM,SAAA;AAAW,MACvB,KAAK,MAAA;AACH,QAAA,QAAA,CAAS,YAAA,CAAaA,uBAAK,UAAU,CAAA;AACrC,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,QAAA,CAAS,YAAA,CAAaA,uBAAK,gBAAgB,CAAA;AAC3C,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,QAAA,CAAS,YAAA,CAAaA,uBAAK,YAAY,CAAA;AACvC,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,QAAA,CAAS,YAAA,CAAaA,uBAAK,cAAc,CAAA;AACzC,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,QAAA,CAAS,YAAA,CAAaA,uBAAK,aAAa,CAAA;AACxC,QAAA;AAAA;AACJ,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAChC,IAAA,QAAA,CAAS,WAAA,CAAY,MAAM,QAAQ,CAAA;AAAA,EACrC;AAEA,EAAA,IAAI,KAAA,CAAM,eAAe,MAAA,EAAW;AAClC,IAAA,QAAA,CAAS,aAAA,CAAc,MAAM,UAAU,CAAA;AAAA,EACzC;AAEA,EAAA,IAAI,KAAA,CAAM,cAAc,MAAA,EAAW;AACjC,IAAA,IAAI,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,EAAU;AACvC,MAAA,QAAA,CAAS,YAAA,CAAa,MAAM,SAAS,CAAA;AAAA,IACvC,CAAA,MAAA,IAAW,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,EAAU;AAC9C,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,KAAA,CAAM,SAAS,CAAA;AAC7C,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,QAAA,CAAS,oBAAoB,KAAK,CAAA;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAW;AAC7B,IAAA,IAAI,OAAO,KAAA,CAAM,KAAA,KAAU,QAAA,EAAU;AACnC,MAAA,QAAA,CAAS,QAAA,CAAS,MAAM,KAAK,CAAA;AAAA,IAC/B,CAAA,MAAA,IAAW,OAAO,KAAA,CAAM,KAAA,KAAU,QAAA,EAAU;AAC1C,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,KAAA,CAAM,KAAK,CAAA;AACzC,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,QAAA,CAAS,gBAAgB,KAAK,CAAA;AAAA,MAChC,CAAA,MAAA,IAAW,KAAA,CAAM,KAAA,KAAU,MAAA,EAAQ;AACjC,QAAA,QAAA,CAAS,YAAA,EAAa;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAW;AAC9B,IAAA,IAAI,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,EAAU;AACpC,MAAA,QAAA,CAAS,SAAA,CAAU,MAAM,MAAM,CAAA;AAAA,IACjC,CAAA,MAAA,IAAW,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,EAAU;AAC3C,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,KAAA,CAAM,MAAM,CAAA;AAC1C,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA;AAAA,MACjC,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,KAAW,MAAA,EAAQ;AAClC,QAAA,QAAA,CAAS,aAAA,EAAc;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAChC,IAAA,IAAI,OAAO,KAAA,CAAM,QAAA,KAAa,QAAA,EAAU;AACtC,MAAA,QAAA,CAAS,WAAA,CAAY,MAAM,QAAQ,CAAA;AAAA,IACrC,CAAA,MAAA,IAAW,OAAO,KAAA,CAAM,QAAA,KAAa,QAAA,EAAU;AAC7C,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,KAAA,CAAM,QAAQ,CAAA;AAC5C,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,QAAA,CAAS,mBAAmB,KAAK,CAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,cAAc,MAAA,EAAW;AACjC,IAAA,IAAI,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,EAAU;AACvC,MAAA,QAAA,CAAS,YAAA,CAAa,MAAM,SAAS,CAAA;AAAA,IACvC,CAAA,MAAA,IAAW,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,EAAU;AAC9C,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,KAAA,CAAM,SAAS,CAAA;AAC7C,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,QAAA,CAAS,oBAAoB,KAAK,CAAA;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAChC,IAAA,IAAI,OAAO,KAAA,CAAM,QAAA,KAAa,QAAA,EAAU;AACtC,MAAA,QAAA,CAAS,WAAA,CAAY,MAAM,QAAQ,CAAA;AAAA,IACrC,CAAA,MAAA,IAAW,OAAO,KAAA,CAAM,QAAA,KAAa,QAAA,EAAU;AAC7C,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,KAAA,CAAM,QAAQ,CAAA;AAC5C,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,QAAA,CAAS,mBAAmB,KAAK,CAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,cAAc,MAAA,EAAW;AACjC,IAAA,IAAI,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,EAAU;AACvC,MAAA,QAAA,CAAS,YAAA,CAAa,MAAM,SAAS,CAAA;AAAA,IACvC,CAAA,MAAA,IAAW,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,EAAU;AAC9C,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,KAAA,CAAM,SAAS,CAAA;AAC7C,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,QAAA,CAAS,oBAAoB,KAAK,CAAA;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,YAAY,MAAA,EAAW;AAC/B,IAAA,QAAA,CAAS,UAAA,CAAWA,sBAAAA,CAAK,QAAA,EAAU,KAAA,CAAM,OAAO,CAAA;AAChD,IAAA,QAAA,CAAS,UAAA,CAAWA,sBAAAA,CAAK,WAAA,EAAa,KAAA,CAAM,OAAO,CAAA;AACnD,IAAA,QAAA,CAAS,UAAA,CAAWA,sBAAAA,CAAK,SAAA,EAAW,KAAA,CAAM,OAAO,CAAA;AACjD,IAAA,QAAA,CAAS,UAAA,CAAWA,sBAAAA,CAAK,UAAA,EAAY,KAAA,CAAM,OAAO,CAAA;AAAA,EACpD;AAEA,EAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAChC,IAAA,QAAA,CAAS,UAAA,CAAWA,sBAAAA,CAAK,eAAA,EAAiB,KAAA,CAAM,QAAQ,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAChC,IAAA,QAAA,CAAS,UAAA,CAAWA,sBAAAA,CAAK,aAAA,EAAe,KAAA,CAAM,QAAQ,CAAA;AAAA,EACxD;AAEA,EAAA,IAAI,KAAA,CAAM,eAAe,MAAA,EAAW;AAClC,IAAA,QAAA,CAAS,UAAA,CAAWA,sBAAAA,CAAK,QAAA,EAAU,KAAA,CAAM,UAAU,CAAA;AAAA,EACrD;AAEA,EAAA,IAAI,KAAA,CAAM,kBAAkB,MAAA,EAAW;AACrC,IAAA,QAAA,CAAS,UAAA,CAAWA,sBAAAA,CAAK,WAAA,EAAa,KAAA,CAAM,aAAa,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAI,KAAA,CAAM,gBAAgB,MAAA,EAAW;AACnC,IAAA,QAAA,CAAS,UAAA,CAAWA,sBAAAA,CAAK,SAAA,EAAW,KAAA,CAAM,WAAW,CAAA;AAAA,EACvD;AAEA,EAAA,IAAI,KAAA,CAAM,iBAAiB,MAAA,EAAW;AACpC,IAAA,QAAA,CAAS,UAAA,CAAWA,sBAAAA,CAAK,UAAA,EAAY,KAAA,CAAM,YAAY,CAAA;AAAA,EACzD;AAGA,EAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAW;AAC9B,IAAA,QAAA,CAAS,SAAA,CAAUA,sBAAAA,CAAK,QAAA,EAAU,KAAA,CAAM,MAAM,CAAA;AAC9C,IAAA,QAAA,CAAS,SAAA,CAAUA,sBAAAA,CAAK,WAAA,EAAa,KAAA,CAAM,MAAM,CAAA;AACjD,IAAA,QAAA,CAAS,SAAA,CAAUA,sBAAAA,CAAK,SAAA,EAAW,KAAA,CAAM,MAAM,CAAA;AAC/C,IAAA,QAAA,CAAS,SAAA,CAAUA,sBAAAA,CAAK,UAAA,EAAY,KAAA,CAAM,MAAM,CAAA;AAAA,EAClD;AAEA,EAAA,IAAI,KAAA,CAAM,YAAY,MAAA,EAAW;AAC/B,IAAA,QAAA,CAAS,SAAA,CAAUA,sBAAAA,CAAK,eAAA,EAAiB,KAAA,CAAM,OAAO,CAAA;AAAA,EACxD;AAEA,EAAA,IAAI,KAAA,CAAM,YAAY,MAAA,EAAW;AAC/B,IAAA,QAAA,CAAS,SAAA,CAAUA,sBAAAA,CAAK,aAAA,EAAe,KAAA,CAAM,OAAO,CAAA;AAAA,EACtD;AAEA,EAAA,IAAI,KAAA,CAAM,cAAc,MAAA,EAAW;AACjC,IAAA,QAAA,CAAS,SAAA,CAAUA,sBAAAA,CAAK,QAAA,EAAU,KAAA,CAAM,SAAS,CAAA;AAAA,EACnD;AAEA,EAAA,IAAI,KAAA,CAAM,iBAAiB,MAAA,EAAW;AACpC,IAAA,QAAA,CAAS,SAAA,CAAUA,sBAAAA,CAAK,WAAA,EAAa,KAAA,CAAM,YAAY,CAAA;AAAA,EACzD;AAEA,EAAA,IAAI,KAAA,CAAM,eAAe,MAAA,EAAW;AAClC,IAAA,QAAA,CAAS,SAAA,CAAUA,sBAAAA,CAAK,SAAA,EAAW,KAAA,CAAM,UAAU,CAAA;AAAA,EACrD;AAEA,EAAA,IAAI,KAAA,CAAM,gBAAgB,MAAA,EAAW;AACnC,IAAA,QAAA,CAAS,SAAA,CAAUA,sBAAAA,CAAK,UAAA,EAAY,KAAA,CAAM,WAAW,CAAA;AAAA,EACvD;AAGA,EAAA,IAAI,KAAA,CAAM,QAAQ,MAAA,EAAW;AAC3B,IAAA,QAAA,CAAS,MAAA,CAAOA,sBAAAA,CAAK,UAAA,EAAY,KAAA,CAAM,GAAG,CAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,KAAA,CAAM,cAAc,MAAA,EAAW;AACjC,IAAA,QAAA,CAAS,MAAA,CAAOA,sBAAAA,CAAK,aAAA,EAAe,KAAA,CAAM,SAAS,CAAA;AAAA,EACrD;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAW;AAC9B,IAAA,QAAA,CAAS,MAAA,CAAOA,sBAAAA,CAAK,UAAA,EAAY,KAAA,CAAM,MAAM,CAAA;AAAA,EAC/C;AAGA,EAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAChC,IAAA,QAAQ,MAAM,QAAA;AAAU,MACtB,KAAK,UAAA;AACH,QAAA,QAAA,CAAS,eAAA,CAAgBA,uBAAK,sBAAsB,CAAA;AACpD,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,QAAA,CAAS,eAAA,CAAgBA,uBAAK,sBAAsB,CAAA;AACpD,QAAA;AAAA;AACJ,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,YAAY,MAAA,EAAW;AAC/B,IAAA,QAAQ,MAAM,OAAA;AAAS,MACrB,KAAK,MAAA;AACH,QAAA,QAAA,CAAS,UAAA,CAAWA,uBAAK,YAAY,CAAA;AACrC,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,QAAA,CAAS,UAAA,CAAWA,uBAAK,YAAY,CAAA;AACrC,QAAA;AAAA;AACJ,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAW;AAC9B,IAAA,QAAA,CAAS,SAAA,CAAUA,sBAAAA,CAAK,QAAA,EAAU,KAAA,CAAM,MAAM,CAAA;AAC9C,IAAA,QAAA,CAAS,SAAA,CAAUA,sBAAAA,CAAK,WAAA,EAAa,KAAA,CAAM,MAAM,CAAA;AACjD,IAAA,QAAA,CAAS,SAAA,CAAUA,sBAAAA,CAAK,SAAA,EAAW,KAAA,CAAM,MAAM,CAAA;AAC/C,IAAA,QAAA,CAAS,SAAA,CAAUA,sBAAAA,CAAK,UAAA,EAAY,KAAA,CAAM,MAAM,CAAA;AAAA,EAClD;AAEA,EAAA,IAAI,KAAA,CAAM,cAAc,MAAA,EAAW;AACjC,IAAA,QAAA,CAAS,SAAA,CAAUA,sBAAAA,CAAK,QAAA,EAAU,KAAA,CAAM,SAAS,CAAA;AAAA,EACnD;AAEA,EAAA,IAAI,KAAA,CAAM,iBAAiB,MAAA,EAAW;AACpC,IAAA,QAAA,CAAS,SAAA,CAAUA,sBAAAA,CAAK,WAAA,EAAa,KAAA,CAAM,YAAY,CAAA;AAAA,EACzD;AAEA,EAAA,IAAI,KAAA,CAAM,eAAe,MAAA,EAAW;AAClC,IAAA,QAAA,CAAS,SAAA,CAAUA,sBAAAA,CAAK,SAAA,EAAW,KAAA,CAAM,UAAU,CAAA;AAAA,EACrD;AAEA,EAAA,IAAI,KAAA,CAAM,gBAAgB,MAAA,EAAW;AACnC,IAAA,QAAA,CAAS,SAAA,CAAUA,sBAAAA,CAAK,UAAA,EAAY,KAAA,CAAM,WAAW,CAAA;AAAA,EACvD;AACF;AAOO,SAAS,gBAAA,CACd,MACA,QAAA,EACM;AACN,EAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AACb,EAAA,eAAA,CAAgB,IAAA,CAAK,UAAU,QAAQ,CAAA;AACzC;AAQO,SAAS,WAAA,CAAY,QAAoB,KAAA,EAAyB;AACvE,EAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AACf,EAAA,MAAA,CAAO,QAAA,CAAS,KAAK,KAAK,CAAA;AAC1B,EAAA,MAAA,CAAO,SAAS,WAAA,CAAY,KAAA,CAAM,UAAU,MAAA,CAAO,QAAA,CAAS,SAAS,CAAC,CAAA;AACxE;AAQO,SAAS,WAAA,CAAY,QAAoB,KAAA,EAAyB;AACvE,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA;AAC3C,EAAA,IAAI,UAAU,EAAA,EAAI;AAElB,EAAA,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAC/B,EAAA,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,KAAA,CAAM,QAAQ,CAAA;AAC1C,EAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AACjB;AAOO,SAAS,kBAAkB,IAAA,EAAwB;AAExD,EAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,CAAC,KAAA,KAAU,iBAAA,CAAkB,KAAK,CAAC,CAAA;AAGzD,EAAA,IAAA,CAAK,SAAS,aAAA,EAAc;AAG5B,EAAA,IAAA,CAAK,WAAW,EAAC;AACjB,EAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,EAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAChB;AAOA,SAAS,gBAAgB,KAAA,EAA8B;AACrD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,oBAAoB,CAAA;AAC9C,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,OAAO,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA;AAC5B;;;AClYO,IAAM,gBAAN,MAAoB;AAAA,EAIzB,YAAY,OAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,KAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WACE,IAAA,EACA,KAAA,GAAa,EAAC,EACd,aAAA,GAAqB,EAAC,EACV;AACZ,IAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,IAAA,EAAM,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAErB,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,8BAAA,EAAiC,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAA,CAAY,QAAoB,KAAA,EAAyB;AACvD,IAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AACf,IAAA,MAAA,CAAO,QAAA,CAAS,KAAK,KAAK,CAAA;AAC1B,IAAA,MAAA,CAAO,SAAS,WAAA,CAAY,KAAA,CAAM,UAAU,MAAA,CAAO,QAAA,CAAS,SAAS,CAAC,CAAA;AAEtE,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAI,CAAA,yBAAA,EAA4B,KAAA,CAAM,IAAI,CAAA,IAAA,EAAO,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAA,CACE,MAAA,EACA,KAAA,EACA,WAAA,EACM;AACN,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAA;AACjD,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AAEA,IAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AACf,IAAA,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA;AACtC,IAAA,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,KAAA,CAAM,QAAA,EAAU,KAAK,CAAA;AAEjD,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,yBAAA,EAA4B,MAAM,IAAI,CAAA,QAAA,EAAW,YAAY,IAAI,CAAA,IAAA,EAAO,OAAO,IAAI,CAAA;AAAA,OACrF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAA,CAAY,QAAoB,KAAA,EAAyB;AACvD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA;AAC3C,IAAA,IAAI,UAAU,EAAA,EAAI;AAElB,IAAA,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAC/B,IAAA,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,KAAA,CAAM,QAAQ,CAAA;AAC1C,IAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AAEf,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAI,CAAA,wBAAA,EAA2B,KAAA,CAAM,IAAI,CAAA,MAAA,EAAS,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA,IACzE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,cAAc,QAAA,EAA4B;AACxC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAI,6CAA6C,CAAA;AAAA,IAC3D;AAIA,IAAA,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAE7B,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,UAAU,QAAQ,CAAA;AAAA,IACzB;AAIA,IAAA,iBAAA,CAAkB,QAAA,EAAU,KAAK,MAAM,CAAA;AAEvC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAI,8CAA8C,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,gBAAgB,QAAA,EAA4B;AAElD,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,EAAA;AAI3C,IAAA,IAAI,QAAA,CAAS,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW;AACtC,MAAA,QAAA,CAAS,QAAA,CAAS,SAAS,aAAa,CAAA;AAAA,IAC1C;AAIA,IAAA,QAAA,CAAS,QAAA,CAAS,eAAA;AAAA,MAChB,MAAA;AAAA;AAAA,MACA,MAAA;AAAA,MACAA,sBAAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,SAAA,CAAU,IAAA,EAAkB,KAAA,GAAQ,CAAA,EAAS;AACnD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAChC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,iBAAA,EAAkB;AAG/C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,kBAAA,CAAmB,CAAC,CAAA;AAClD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,iBAAA,CAAkB,CAAC,CAAA;AAEhD,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAG,MAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,MAAA,EAAS,MAAA,CAAO,GAAG,CAAA,MAAA,EAAS,MAAA,CAAO,IAAI,CAAA,OAAA,EACjD,MAAA,CAAO,KAAK,CAAA,QAAA,EAAW,MAAA,CAAO,MAAM,CAAA,SAAA,EAClC,OAAO,WAAW,MAAM,CAAA;AAAA,KACvC;AAEA,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,MAAA,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAA;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,IAAA,EAAwB;AAC9B,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sCAAA,EAAyC,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA,IAClE;AAGA,IAAA,cAAA,CAAe,IAAI,CAAA;AAGnB,IAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,EACxB;AACF;;;ACrMO,IAAe,mBAAf,MAA8C;AAAA;AAAA;AAAA;AAAA;AAAA,EAUnD,YAAmB,KAAA,EAAe;AAAf,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8CnC,YAAA,CAAa,QAAiB,MAAA,EAA8B;AAE1D,IAAA,MAAA,CAAO,QAAA,CAAS,MAAM,MAAA,CAAO,GAAA;AAC7B,IAAA,MAAA,CAAO,QAAA,CAAS,OAAO,MAAA,CAAO,IAAA;AAC9B,IAAA,MAAA,CAAO,QAAA,CAAS,QAAQ,MAAA,CAAO,KAAA;AAC/B,IAAA,MAAA,CAAO,QAAA,CAAS,SAAS,MAAA,CAAO,MAAA;AAGhC,IAAA,MAAM,UAAU,IAAA,CAAK,aAAA;AAGrB,IAAA,MAAM,YAAa,MAAA,CAAe,MAAA;AAClC,IAAA,MAAM,YAAa,MAAA,CAAe,MAAA;AAClC,IAAA,MAAM,mBAAmB,SAAA,IAAa,SAAA;AAEtC,IAAA,IAAI,gBAAA,EAAkB;AAEpB,MAAA,MAAM,EAAE,KAAA,EAAO,YAAA,EAAc,YAAA,EAAc,GAAG,cAAa,GAAI,OAAA;AAG/D,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,YAAY,CAAA;AACtD,MAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,WAAW,CAAA;AAIjC,MAAA,IAAI,SAAA,IAAa,gBAAgB,KAAA,EAAO;AACtC,QAAA,IAAA,CAAK,qBAAA,CAAsB,SAAA,EAAW,KAAA,EAAO,YAAY,CAAA;AAAA,MAC3D;AACA,MAAA,IAAI,SAAA,IAAa,gBAAgB,KAAA,EAAO;AACtC,QAAA,IAAA,CAAK,qBAAA,CAAsB,SAAA,EAAW,KAAA,EAAO,YAAY,CAAA;AAAA,MAC3D;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA;AACjD,MAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,WAAW,CAAA;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,qBAAA,CACN,IAAA,EACA,YAAA,EACA,OAAA,EACM;AACN,IAAA,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACpC,MAAA,MAAM,SAAA,GAAY,QAAQ,GAAG,CAAA;AAC7B,MAAA,IAAI,SAAA,KAAc,IAAA,IAAQ,OAAO,SAAA,KAAc,QAAA,EAAU;AAEvD,QAAA,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA,CAAK,GAAG,KAAK,EAAC;AAC1B,QAAA,MAAM,OAAA,GAAU,YAAA,CAAa,GAAG,CAAA,IAAK,EAAC;AACtC,QAAA,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,KAAM;AAGpC,UAAA,IAAA,CAAK,GAAG,CAAA,CAAE,CAAC,CAAA,GAAI,QAAQ,CAAC,CAAA;AAAA,QAC1B,CAAC,CAAA;AAAA,MACH,CAAA,MAAO;AAEL,QAAA,IAAA,CAAK,GAAG,CAAA,GAAI,YAAA,CAAa,GAAG,CAAA;AAAA,MAC9B;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,iBAAiB,OAAA,EAAmB;AAC1C,IAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,MAAA,OAAO,OAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAc,EAAC;AAErB,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,IAAI,OAAA,CAAQ,cAAA,CAAe,GAAG,CAAA,EAAG;AAC/B,QAAA,MAAM,GAAA,GAAM,QAAQ,GAAG,CAAA;AAEvB,QAAA,IAAI,GAAA,KAAQ,QAAQ,OAAO,GAAA,KAAQ,YAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AAElE,UAAA,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAA;AAAA,QACzC,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,GAAG,CAAA,GAAI,GAAA;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF","file":"index.cjs","sourcesContent":["/**\n * widget-sync.ts - Synchronize Yoga layout to unblessed widgets\n */\n\nimport { Box, Element, Screen } from \"@unblessed/core\";\nimport Yoga from \"yoga-layout\";\nimport type { ComputedLayout, LayoutNode } from \"./types.js\";\n\n/**\n * Binds event handlers to a widget.\n */\nfunction bindEventHandlers(\n widget: Element,\n handlers: Record<string, Function>,\n): void {\n for (const [event, handler] of Object.entries(handlers)) {\n widget.on(event, handler as any);\n }\n}\n\n/**\n * Unbinds event handlers from a widget.\n */\nfunction unbindEventHandlers(\n widget: Element,\n handlers: Record<string, Function>,\n): void {\n for (const [event, handler] of Object.entries(handlers)) {\n widget.removeListener(event, handler as any);\n }\n}\n\n/**\n * Extracts computed layout from a Yoga node.\n */\nexport function getComputedLayout(node: LayoutNode): ComputedLayout {\n return {\n top: Math.round(node.yogaNode.getComputedTop()),\n left: Math.round(node.yogaNode.getComputedLeft()),\n width: Math.round(node.yogaNode.getComputedWidth()),\n height: Math.round(node.yogaNode.getComputedHeight()),\n };\n}\n\n/**\n * Synchronizes a layout node tree to unblessed widgets.\n * Yoga positions are applied to widgets. Widgets are created/updated as needed.\n */\nexport function syncWidgetWithYoga(node: LayoutNode, screen: Screen): Element {\n // Extract Yoga's computed layout\n const layout = getComputedLayout(node);\n\n let top = layout.top;\n let left = layout.left;\n\n if (node.parent) {\n const parentBorderTop = node.parent.yogaNode.getComputedBorder(\n Yoga.EDGE_TOP,\n );\n const parentBorderLeft = node.parent.yogaNode.getComputedBorder(\n Yoga.EDGE_LEFT,\n );\n\n // Adjust for border collapse difference between Yoga and unblessed\n top = layout.top - parentBorderTop;\n left = layout.left - parentBorderLeft;\n }\n\n // Text nodes return hidden elements; content is set on parent after syncing children\n if (node.type === \"#text\") {\n if (node.widget) {\n return node.widget;\n }\n node.widget = new Element({ screen, hidden: true });\n return node.widget;\n }\n\n if (!node.widget) {\n // First render - create new widget\n if (node._descriptor) {\n // Use descriptor if available (from React)\n const adjustedLayout = { ...layout, top, left };\n node.widget = node._descriptor.createWidget(adjustedLayout, screen);\n } else {\n // Fallback: create a simple Box widget (for standalone layout usage)\n node.widget = new Box({\n screen,\n tags: true,\n mouse: true,\n keys: true,\n top,\n left,\n width: layout.width,\n height: layout.height,\n ...node.widgetOptions,\n });\n }\n\n // Bind event handlers after widget is created\n // TypeScript can't infer widget is non-null here, so we assert it\n if (node.eventHandlers && Object.keys(node.eventHandlers).length > 0) {\n bindEventHandlers(node.widget!, node.eventHandlers);\n node._boundHandlers = node.eventHandlers;\n }\n } else {\n // Update existing widget\n const adjustedLayout = { ...layout, top, left };\n\n if (node._descriptor) {\n // Use descriptor's update method (from React)\n node._descriptor.updateWidget(node.widget, adjustedLayout);\n } else {\n // Fallback: manually update (for standalone layout usage)\n node.widget.position.top = top;\n node.widget.position.left = left;\n node.widget.position.width = layout.width;\n node.widget.position.height = layout.height;\n\n if (node.widgetOptions) {\n Object.assign(node.widget, node.widgetOptions);\n }\n }\n\n // Update event handlers\n if (node.eventHandlers !== node._boundHandlers) {\n if (node._boundHandlers) {\n unbindEventHandlers(node.widget, node._boundHandlers);\n }\n\n if (Object.keys(node.eventHandlers || {}).length > 0) {\n bindEventHandlers(node.widget, node.eventHandlers || {});\n node._boundHandlers = node.eventHandlers;\n } else {\n node._boundHandlers = undefined;\n }\n }\n }\n\n // At this point, node.widget is guaranteed to be defined (either just created or already existed)\n // TypeScript can't infer this, so we use non-null assertion\n const widget = node.widget!;\n\n for (const child of node.children) {\n const childWidget = syncWidgetWithYoga(child, screen);\n\n if (childWidget.parent !== widget) {\n widget.append(childWidget);\n }\n }\n\n // Concatenate all #text children and set as widget content\n if (node.children.length > 0) {\n const allTextNodes = node.children.every((c) => c.type === \"#text\");\n\n if (allTextNodes) {\n const fullContent = node.children\n .map((c) => c.widgetOptions?.content || \"\")\n .join(\"\");\n\n if (fullContent) {\n widget.setContent(fullContent);\n }\n }\n }\n\n return widget;\n}\n\n/**\n * Synchronizes layout tree to widgets and renders to screen.\n */\nexport function syncTreeAndRender(rootNode: LayoutNode, screen: Screen): void {\n const rootWidget = syncWidgetWithYoga(rootNode, screen);\n\n // Attach root widget to screen if not already attached\n if (!rootWidget.parent) {\n screen.append(rootWidget);\n }\n\n screen.render();\n}\n\n/**\n * Destroys all widgets in a layout tree and unbinds event handlers.\n */\nexport function destroyWidgets(node: LayoutNode): void {\n for (const child of node.children) {\n destroyWidgets(child);\n }\n\n if (node.widget) {\n if (node._boundHandlers) {\n unbindEventHandlers(node.widget, node._boundHandlers);\n node._boundHandlers = undefined;\n }\n\n node.widget.detach();\n node.widget.destroy();\n node.widget = undefined;\n }\n}\n","/**\n * yoga-node.ts - Yoga node lifecycle management\n */\n\nimport Yoga, { type Node as YogaNode } from \"yoga-layout\";\nimport type { FlexboxProps, LayoutNode } from \"./types.js\";\n\n/**\n * Creates a new layout node with a Yoga node.\n * @param type - Type identifier for the node\n * @param props - Flexbox properties to apply\n * @returns A new LayoutNode\n */\nexport function createLayoutNode(\n type: string,\n props: FlexboxProps = {},\n): LayoutNode {\n const config = Yoga.Config.create();\n config.setUseWebDefaults(true);\n\n const yogaNode = Yoga.Node.create(config);\n\n if (type === \"box\" && !props.width) {\n props.width = \"100%\";\n }\n\n const node: LayoutNode = {\n type,\n yogaNode,\n props,\n children: [],\n parent: null,\n widgetOptions: {},\n };\n\n // Apply initial styles\n applyFlexStyles(yogaNode, props);\n\n return node;\n}\n\n/**\n * Applies flexbox style properties to a Yoga node.\n * This is where React/framework props get translated to Yoga API calls.\n * @param yogaNode - The Yoga node to apply styles to\n * @param props - Flexbox properties\n */\nexport function applyFlexStyles(yogaNode: YogaNode, props: FlexboxProps): void {\n // Flex container properties\n if (props.flexDirection !== undefined) {\n switch (props.flexDirection) {\n case \"row\":\n yogaNode.setFlexDirection(Yoga.FLEX_DIRECTION_ROW);\n break;\n case \"column\":\n yogaNode.setFlexDirection(Yoga.FLEX_DIRECTION_COLUMN);\n break;\n case \"row-reverse\":\n yogaNode.setFlexDirection(Yoga.FLEX_DIRECTION_ROW_REVERSE);\n break;\n case \"column-reverse\":\n yogaNode.setFlexDirection(Yoga.FLEX_DIRECTION_COLUMN_REVERSE);\n break;\n }\n }\n\n if (props.flexWrap !== undefined) {\n switch (props.flexWrap) {\n case \"nowrap\":\n yogaNode.setFlexWrap(Yoga.WRAP_NO_WRAP);\n break;\n case \"wrap\":\n yogaNode.setFlexWrap(Yoga.WRAP_WRAP);\n break;\n case \"wrap-reverse\":\n yogaNode.setFlexWrap(Yoga.WRAP_WRAP_REVERSE);\n break;\n }\n }\n\n if (props.justifyContent !== undefined) {\n switch (props.justifyContent) {\n case \"flex-start\":\n yogaNode.setJustifyContent(Yoga.JUSTIFY_FLEX_START);\n break;\n case \"center\":\n yogaNode.setJustifyContent(Yoga.JUSTIFY_CENTER);\n break;\n case \"flex-end\":\n yogaNode.setJustifyContent(Yoga.JUSTIFY_FLEX_END);\n break;\n case \"space-between\":\n yogaNode.setJustifyContent(Yoga.JUSTIFY_SPACE_BETWEEN);\n break;\n case \"space-around\":\n yogaNode.setJustifyContent(Yoga.JUSTIFY_SPACE_AROUND);\n break;\n case \"space-evenly\":\n yogaNode.setJustifyContent(Yoga.JUSTIFY_SPACE_EVENLY);\n break;\n }\n }\n\n if (props.alignItems !== undefined) {\n switch (props.alignItems) {\n case \"flex-start\":\n yogaNode.setAlignItems(Yoga.ALIGN_FLEX_START);\n break;\n case \"center\":\n yogaNode.setAlignItems(Yoga.ALIGN_CENTER);\n break;\n case \"flex-end\":\n yogaNode.setAlignItems(Yoga.ALIGN_FLEX_END);\n break;\n case \"stretch\":\n yogaNode.setAlignItems(Yoga.ALIGN_STRETCH);\n break;\n }\n }\n\n if (props.alignSelf !== undefined) {\n switch (props.alignSelf) {\n case \"auto\":\n yogaNode.setAlignSelf(Yoga.ALIGN_AUTO);\n break;\n case \"flex-start\":\n yogaNode.setAlignSelf(Yoga.ALIGN_FLEX_START);\n break;\n case \"center\":\n yogaNode.setAlignSelf(Yoga.ALIGN_CENTER);\n break;\n case \"flex-end\":\n yogaNode.setAlignSelf(Yoga.ALIGN_FLEX_END);\n break;\n case \"stretch\":\n yogaNode.setAlignSelf(Yoga.ALIGN_STRETCH);\n break;\n }\n }\n\n // Flex item properties\n if (props.flexGrow !== undefined) {\n yogaNode.setFlexGrow(props.flexGrow);\n }\n\n if (props.flexShrink !== undefined) {\n yogaNode.setFlexShrink(props.flexShrink);\n }\n\n if (props.flexBasis !== undefined) {\n if (typeof props.flexBasis === \"number\") {\n yogaNode.setFlexBasis(props.flexBasis);\n } else if (typeof props.flexBasis === \"string\") {\n const value = parsePercentage(props.flexBasis);\n if (value !== null) {\n yogaNode.setFlexBasisPercent(value);\n }\n }\n }\n\n // Dimensions\n if (props.width !== undefined) {\n if (typeof props.width === \"number\") {\n yogaNode.setWidth(props.width);\n } else if (typeof props.width === \"string\") {\n const value = parsePercentage(props.width);\n if (value !== null) {\n yogaNode.setWidthPercent(value);\n } else if (props.width === \"auto\") {\n yogaNode.setWidthAuto();\n }\n }\n }\n\n if (props.height !== undefined) {\n if (typeof props.height === \"number\") {\n yogaNode.setHeight(props.height);\n } else if (typeof props.height === \"string\") {\n const value = parsePercentage(props.height);\n if (value !== null) {\n yogaNode.setHeightPercent(value);\n } else if (props.height === \"auto\") {\n yogaNode.setHeightAuto();\n }\n }\n }\n\n if (props.minWidth !== undefined) {\n if (typeof props.minWidth === \"number\") {\n yogaNode.setMinWidth(props.minWidth);\n } else if (typeof props.minWidth === \"string\") {\n const value = parsePercentage(props.minWidth);\n if (value !== null) {\n yogaNode.setMinWidthPercent(value);\n }\n }\n }\n\n if (props.minHeight !== undefined) {\n if (typeof props.minHeight === \"number\") {\n yogaNode.setMinHeight(props.minHeight);\n } else if (typeof props.minHeight === \"string\") {\n const value = parsePercentage(props.minHeight);\n if (value !== null) {\n yogaNode.setMinHeightPercent(value);\n }\n }\n }\n\n if (props.maxWidth !== undefined) {\n if (typeof props.maxWidth === \"number\") {\n yogaNode.setMaxWidth(props.maxWidth);\n } else if (typeof props.maxWidth === \"string\") {\n const value = parsePercentage(props.maxWidth);\n if (value !== null) {\n yogaNode.setMaxWidthPercent(value);\n }\n }\n }\n\n if (props.maxHeight !== undefined) {\n if (typeof props.maxHeight === \"number\") {\n yogaNode.setMaxHeight(props.maxHeight);\n } else if (typeof props.maxHeight === \"string\") {\n const value = parsePercentage(props.maxHeight);\n if (value !== null) {\n yogaNode.setMaxHeightPercent(value);\n }\n }\n }\n\n // Padding\n if (props.padding !== undefined) {\n yogaNode.setPadding(Yoga.EDGE_TOP, props.padding);\n yogaNode.setPadding(Yoga.EDGE_BOTTOM, props.padding);\n yogaNode.setPadding(Yoga.EDGE_LEFT, props.padding);\n yogaNode.setPadding(Yoga.EDGE_RIGHT, props.padding);\n }\n\n if (props.paddingX !== undefined) {\n yogaNode.setPadding(Yoga.EDGE_HORIZONTAL, props.paddingX);\n }\n\n if (props.paddingY !== undefined) {\n yogaNode.setPadding(Yoga.EDGE_VERTICAL, props.paddingY);\n }\n\n if (props.paddingTop !== undefined) {\n yogaNode.setPadding(Yoga.EDGE_TOP, props.paddingTop);\n }\n\n if (props.paddingBottom !== undefined) {\n yogaNode.setPadding(Yoga.EDGE_BOTTOM, props.paddingBottom);\n }\n\n if (props.paddingLeft !== undefined) {\n yogaNode.setPadding(Yoga.EDGE_LEFT, props.paddingLeft);\n }\n\n if (props.paddingRight !== undefined) {\n yogaNode.setPadding(Yoga.EDGE_RIGHT, props.paddingRight);\n }\n\n // Margin\n if (props.margin !== undefined) {\n yogaNode.setMargin(Yoga.EDGE_TOP, props.margin);\n yogaNode.setMargin(Yoga.EDGE_BOTTOM, props.margin);\n yogaNode.setMargin(Yoga.EDGE_LEFT, props.margin);\n yogaNode.setMargin(Yoga.EDGE_RIGHT, props.margin);\n }\n\n if (props.marginX !== undefined) {\n yogaNode.setMargin(Yoga.EDGE_HORIZONTAL, props.marginX);\n }\n\n if (props.marginY !== undefined) {\n yogaNode.setMargin(Yoga.EDGE_VERTICAL, props.marginY);\n }\n\n if (props.marginTop !== undefined) {\n yogaNode.setMargin(Yoga.EDGE_TOP, props.marginTop);\n }\n\n if (props.marginBottom !== undefined) {\n yogaNode.setMargin(Yoga.EDGE_BOTTOM, props.marginBottom);\n }\n\n if (props.marginLeft !== undefined) {\n yogaNode.setMargin(Yoga.EDGE_LEFT, props.marginLeft);\n }\n\n if (props.marginRight !== undefined) {\n yogaNode.setMargin(Yoga.EDGE_RIGHT, props.marginRight);\n }\n\n // Gap (Yoga 2.0+)\n if (props.gap !== undefined) {\n yogaNode.setGap(Yoga.GUTTER_ALL, props.gap);\n }\n\n if (props.columnGap !== undefined) {\n yogaNode.setGap(Yoga.GUTTER_COLUMN, props.columnGap);\n }\n\n if (props.rowGap !== undefined) {\n yogaNode.setGap(Yoga.GUTTER_ROW, props.rowGap);\n }\n\n // Position\n if (props.position !== undefined) {\n switch (props.position) {\n case \"relative\":\n yogaNode.setPositionType(Yoga.POSITION_TYPE_RELATIVE);\n break;\n case \"absolute\":\n yogaNode.setPositionType(Yoga.POSITION_TYPE_ABSOLUTE);\n break;\n }\n }\n\n // Display\n if (props.display !== undefined) {\n switch (props.display) {\n case \"flex\":\n yogaNode.setDisplay(Yoga.DISPLAY_FLEX);\n break;\n case \"none\":\n yogaNode.setDisplay(Yoga.DISPLAY_NONE);\n break;\n }\n }\n\n // Border\n if (props.border !== undefined) {\n yogaNode.setBorder(Yoga.EDGE_TOP, props.border);\n yogaNode.setBorder(Yoga.EDGE_BOTTOM, props.border);\n yogaNode.setBorder(Yoga.EDGE_LEFT, props.border);\n yogaNode.setBorder(Yoga.EDGE_RIGHT, props.border);\n }\n\n if (props.borderTop !== undefined) {\n yogaNode.setBorder(Yoga.EDGE_TOP, props.borderTop);\n }\n\n if (props.borderBottom !== undefined) {\n yogaNode.setBorder(Yoga.EDGE_BOTTOM, props.borderBottom);\n }\n\n if (props.borderLeft !== undefined) {\n yogaNode.setBorder(Yoga.EDGE_LEFT, props.borderLeft);\n }\n\n if (props.borderRight !== undefined) {\n yogaNode.setBorder(Yoga.EDGE_RIGHT, props.borderRight);\n }\n}\n\n/**\n * Updates an existing layout node with new props.\n * @param node - The layout node to update\n * @param newProps - New flexbox properties\n */\nexport function updateLayoutNode(\n node: LayoutNode,\n newProps: FlexboxProps,\n): void {\n node.props = newProps;\n applyFlexStyles(node.yogaNode, newProps);\n}\n\n/**\n * Appends a child node to a parent node.\n * Updates both the layout tree and Yoga tree.\n * @param parent - Parent layout node\n * @param child - Child layout node to append\n */\nexport function appendChild(parent: LayoutNode, child: LayoutNode): void {\n child.parent = parent;\n parent.children.push(child);\n parent.yogaNode.insertChild(child.yogaNode, parent.children.length - 1);\n}\n\n/**\n * Removes a child node from its parent.\n * Updates both the layout tree and Yoga tree.\n * @param parent - Parent layout node\n * @param child - Child layout node to remove\n */\nexport function removeChild(parent: LayoutNode, child: LayoutNode): void {\n const index = parent.children.indexOf(child);\n if (index === -1) return;\n\n parent.children.splice(index, 1);\n parent.yogaNode.removeChild(child.yogaNode);\n child.parent = null;\n}\n\n/**\n * Destroys a layout node and frees Yoga resources.\n * IMPORTANT: Always call this to prevent memory leaks.\n * @param node - The layout node to destroy\n */\nexport function destroyLayoutNode(node: LayoutNode): void {\n // Recursively destroy children\n node.children.forEach((child) => destroyLayoutNode(child));\n\n // Free Yoga node\n node.yogaNode.freeRecursive();\n\n // Clear references\n node.children = [];\n node.parent = null;\n node.widget = undefined;\n}\n\n/**\n * Parses a percentage string to a number (0-100).\n * @param value - String like '50%'\n * @returns Numeric percentage or null if invalid\n */\nfunction parsePercentage(value: string): number | null {\n const match = value.match(/^(\\d+(?:\\.\\d+)?)%$/);\n if (!match) return null;\n return parseFloat(match[1]);\n}\n","/**\n * layout-engine.ts - Main layout engine for flexbox calculations\n */\n\nimport type { Screen } from \"@unblessed/core\";\nimport Yoga from \"yoga-layout\";\nimport type { LayoutManagerOptions, LayoutNode } from \"./types.js\";\nimport { destroyWidgets, syncTreeAndRender } from \"./widget-sync.js\";\nimport { createLayoutNode, destroyLayoutNode } from \"./yoga-node.js\";\n\n/**\n * LayoutManager - Main API for flexbox layout in unblessed.\n *\n * This class manages the lifecycle of a Yoga layout tree and synchronizes\n * it with unblessed widgets. It's designed to be used by framework integrations\n * like @unblessed/react.\n *\n * @example\n * ```typescript\n * const screen = new Screen();\n * const manager = new LayoutManager({ screen });\n *\n * const root = manager.createNode('container', {\n * flexDirection: 'row',\n * gap: 2\n * });\n *\n * const left = manager.createNode('box', { width: 20 });\n * const spacer = manager.createNode('spacer', { flexGrow: 1 });\n * const right = manager.createNode('box', { width: 20 });\n *\n * manager.appendChild(root, left);\n * manager.appendChild(root, spacer);\n * manager.appendChild(root, right);\n *\n * manager.performLayout(root);\n * ```\n */\nexport class LayoutManager {\n private screen: Screen;\n private debug: boolean;\n\n constructor(options: LayoutManagerOptions) {\n this.screen = options.screen;\n this.debug = options.debug ?? false;\n }\n\n /**\n * Creates a new layout node.\n * @param type - Type identifier for the node\n * @param props - Flexbox properties\n * @param widgetOptions - Additional unblessed widget options\n * @returns A new layout node\n */\n createNode(\n type: string,\n props: any = {},\n widgetOptions: any = {},\n ): LayoutNode {\n const node = createLayoutNode(type, props);\n node.widgetOptions = widgetOptions;\n\n if (this.debug) {\n console.log(`[LayoutManager] Created node: ${type}`, props);\n }\n\n return node;\n }\n\n /**\n * Appends a child node to a parent.\n * @param parent - Parent layout node\n * @param child - Child layout node\n */\n appendChild(parent: LayoutNode, child: LayoutNode): void {\n child.parent = parent;\n parent.children.push(child);\n parent.yogaNode.insertChild(child.yogaNode, parent.children.length - 1);\n\n if (this.debug) {\n console.log(`[LayoutManager] Appended ${child.type} to ${parent.type}`);\n }\n }\n\n /**\n * Inserts a child node before another child.\n * @param parent - Parent layout node\n * @param child - Child layout node to insert\n * @param beforeChild - Reference child to insert before\n */\n insertBefore(\n parent: LayoutNode,\n child: LayoutNode,\n beforeChild: LayoutNode,\n ): void {\n const index = parent.children.indexOf(beforeChild);\n if (index === -1) {\n throw new Error(\"Reference child not found in parent\");\n }\n\n child.parent = parent;\n parent.children.splice(index, 0, child);\n parent.yogaNode.insertChild(child.yogaNode, index);\n\n if (this.debug) {\n console.log(\n `[LayoutManager] Inserted ${child.type} before ${beforeChild.type} in ${parent.type}`,\n );\n }\n }\n\n /**\n * Removes a child node from its parent.\n * @param parent - Parent layout node\n * @param child - Child layout node to remove\n */\n removeChild(parent: LayoutNode, child: LayoutNode): void {\n const index = parent.children.indexOf(child);\n if (index === -1) return;\n\n parent.children.splice(index, 1);\n parent.yogaNode.removeChild(child.yogaNode);\n child.parent = null;\n\n if (this.debug) {\n console.log(`[LayoutManager] Removed ${child.type} from ${parent.type}`);\n }\n }\n\n /**\n * Calculates layout for a tree and synchronizes with unblessed widgets.\n * This is the main function that bridges Yoga calculations to unblessed rendering.\n *\n * WORKFLOW:\n * 1. Calculate layout with Yoga (flexbox positioning)\n * 2. Extract computed coordinates from Yoga nodes\n * 3. Create/update unblessed widgets with those coordinates\n * 4. Render the screen\n *\n * @param rootNode - Root of the layout tree\n */\n performLayout(rootNode: LayoutNode): void {\n if (this.debug) {\n console.log(\"[LayoutManager] Starting layout calculation\");\n }\n\n // Step 1: Calculate layout using Yoga\n // Yoga will compute top, left, width, height for every node\n this.calculateLayout(rootNode);\n\n if (this.debug) {\n this.logLayout(rootNode);\n }\n\n // Step 2: Sync Yoga output to unblessed widgets\n // This creates/updates widgets with Yoga's computed positions\n syncTreeAndRender(rootNode, this.screen);\n\n if (this.debug) {\n console.log(\"[LayoutManager] Layout complete and rendered\");\n }\n }\n\n /**\n * Calculates layout using Yoga.\n * After this, all Yoga nodes will have computed positions.\n * @param rootNode - Root of the layout tree\n */\n private calculateLayout(rootNode: LayoutNode): void {\n // Get terminal dimensions (fallback to 80x24 if not available)\n const terminalWidth = this.screen.width || 80;\n\n // Only set root width if not already configured\n // This respects explicit dimensions from user while providing defaults\n if (rootNode.props.width === undefined) {\n rootNode.yogaNode.setWidth(terminalWidth);\n }\n\n // Calculate layout\n // Yoga will figure out positions for the entire tree\n rootNode.yogaNode.calculateLayout(\n undefined, // Let Yoga auto-calculate based on node settings\n undefined,\n Yoga.DIRECTION_LTR,\n );\n }\n\n /**\n * Logs the computed layout for debugging.\n * @param node - Node to log (recursive)\n * @param depth - Current depth for indentation\n */\n private logLayout(node: LayoutNode, depth = 0): void {\n const indent = \" \".repeat(depth);\n const layout = node.yogaNode.getComputedLayout();\n\n // Also check computed padding/border\n const padding = node.yogaNode.getComputedPadding(0); // EDGE_TOP = 0\n const border = node.yogaNode.getComputedBorder(0);\n\n console.log(\n `${indent}${node.type}: top=${layout.top} left=${layout.left} ` +\n `width=${layout.width} height=${layout.height} ` +\n `padding=${padding} border=${border}`,\n );\n\n for (const child of node.children) {\n this.logLayout(child, depth + 1);\n }\n }\n\n /**\n * Destroys a layout tree and cleans up all resources.\n * IMPORTANT: Call this to prevent memory leaks.\n * @param node - Root node to destroy\n */\n destroy(node: LayoutNode): void {\n if (this.debug) {\n console.log(`[LayoutManager] Destroying node tree: ${node.type}`);\n }\n\n // Destroy all widgets\n destroyWidgets(node);\n\n // Destroy Yoga nodes\n destroyLayoutNode(node);\n }\n}\n","/**\n * base.ts - Base class for widget descriptors\n *\n * This module defines the WidgetDescriptor base class that all widget types\n * extend. Each descriptor encapsulates:\n * - Typed props for the widget\n * - Flexbox property extraction\n * - Widget options extraction\n * - Event handler extraction\n * - Widget instance creation\n *\n * This eliminates the need for string-based type discrimination and large\n * switch statements throughout the codebase.\n */\n\nimport type { Element, Screen } from \"@unblessed/core\";\nimport { ComputedLayout, FlexboxProps } from \"./types\";\n\n/**\n * Base class for all widget descriptors.\n *\n * A WidgetDescriptor is responsible for:\n * 1. Storing typed props for a specific widget type\n * 2. Extracting flexbox-related props for Yoga layout\n * 3. Extracting widget-specific options for unblessed widgets\n * 4. Extracting event handlers for binding\n * 5. Creating the actual unblessed widget instance\n *\n * @template TProps - The typed props interface for this widget\n */\nexport abstract class WidgetDescriptor<TProps = any> {\n /**\n * Widget type identifier (e.g., 'box', 'text', 'button')\n */\n abstract readonly type: string;\n\n /**\n * Constructor stores the props\n * @param props - Typed props for this widget\n */\n constructor(public props: TProps) {}\n\n /**\n * Extract flexbox-related properties for Yoga layout engine.\n * Only include properties that affect layout (width, height, padding, etc.)\n *\n * @returns FlexboxProps for Yoga\n */\n abstract get flexProps(): FlexboxProps;\n\n /**\n * Extract widget-specific options for unblessed widget creation.\n * Include visual properties (border, content, style) but NOT layout properties.\n *\n * @returns Options object for unblessed widget constructor\n */\n abstract get widgetOptions(): Record<string, any>;\n\n /**\n * Extract event handlers from props.\n *\n * @returns Map of event name → handler function\n */\n abstract get eventHandlers(): Record<string, Function>;\n\n /**\n * Create the actual unblessed widget instance.\n * Called after Yoga has calculated the layout.\n *\n * @param layout - Computed layout from Yoga (top, left, width, height)\n * @param screen - Screen instance to attach widget to\n * @returns Unblessed Element instance\n */\n abstract createWidget(layout: ComputedLayout, screen: Screen): Element;\n\n /**\n * Update an existing widget with new layout and options.\n *\n * IMPORTANT: This method must preserve runtime hover/focus state.\n * When hover/focus effects are active, Screen.setEffects() modifies widget.style\n * and stores original values in temporary objects (_htemp, _ftemp).\n * We must not overwrite widget.style when effects are active.\n *\n * @param widget - Existing widget instance to update\n * @param layout - New computed layout from Yoga (with border adjustments already applied)\n */\n updateWidget(widget: Element, layout: ComputedLayout): void {\n // Update position\n widget.position.top = layout.top;\n widget.position.left = layout.left;\n widget.position.width = layout.width;\n widget.position.height = layout.height;\n\n // Get new widget options\n const options = this.widgetOptions;\n\n // Check if hover/focus effects are currently active\n const hoverTemp = (widget as any)._htemp;\n const focusTemp = (widget as any)._ftemp;\n const hasActiveEffects = hoverTemp || focusTemp;\n\n if (hasActiveEffects) {\n // Effects are active - preserve style, update everything else\n const { style, hoverEffects, focusEffects, ...otherOptions } = options;\n\n // Deep clone other options to avoid shared references\n const safeOptions = this.deepCloneOptions(otherOptions);\n Object.assign(widget, safeOptions);\n\n // Update the temp storage to reflect new base