@akira-io/ui 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/blocks/command-palette.tsx","../src/blocks/date-filter/context.tsx","../src/blocks/date-filter/fixed-panel.tsx","../src/blocks/date-filter/range.ts","../src/blocks/date-filter/relative-panel.tsx","../src/blocks/date-filter/summarise.ts","../src/blocks/date-filter/types.ts","../src/blocks/date-filter/date-filter.tsx","../src/blocks/date-filter/encode.ts","../src/blocks/info-field.tsx","../src/blocks/localized-fields.tsx","../src/blocks/section-header.tsx","../src/blocks/settings-card.tsx","../src/blocks/stat-card.tsx"],"names":["jsxs","jsx","format","pt","ChevronLeft","useState","CalendarDays"],"mappings":";;;;;;;;;AA0CO,SAAS,cAAA,CAAe;AAAA,EAC3B,IAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA,GAAc,WAAA;AAAA,EACd,cAAA,GAAiB,kBAAA;AAAA,EACjB,UAAA;AAAA,EACA;AACJ,CAAA,EAAwB;AACpB,EAAA,MAAM,qBAAqB,UAAA,IAAc,cAAA;AAEzC,EAAA,uBACI,IAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACG,IAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACG,WAAA;AAAA,YACA,KAAA,EAAO,KAAA;AAAA,YACP,aAAA,EAAe;AAAA;AAAA,SACnB;AAAA,wBACA,IAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,eAAA,EACnB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,gBAAc,QAAA,EAAA,kBAAA,EAAmB,CAAA;AAAA,UAEjC,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,qBACT,GAAA,CAAC,YAAA,EAAA,EAAiC,OAAA,EAAS,KAAA,CAAM,OAAA,EAC5C,QAAA,EAAA,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACd,IAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cAEG,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,KAAA;AAAA,cAC1B,QAAA,EAAU,MAAM,QAAA,CAAS,IAAI,CAAA;AAAA,cAE5B,QAAA,EAAA;AAAA,gBAAA,IAAA,CAAK,wBACF,GAAA,CAAC,IAAA,CAAK,IAAA,EAAL,EAAU,WAAU,aAAA,EAAc,CAAA;AAAA,gCAEvC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EACX,eAAK,KAAA,EACV,CAAA;AAAA,gBACC,KAAK,IAAA,oBACF,GAAA,CAAC,UAAK,SAAA,EAAU,uCAAA,EACX,eAAK,IAAA,EACV;AAAA;AAAA,aAAA;AAAA,YAbC,IAAA,CAAK;AAAA,WAgBjB,CAAA,EAAA,EAnBc,KAAA,CAAM,OAoBzB,CACH;AAAA,SAAA,EACL;AAAA;AAAA;AAAA,GACJ;AAER;AAEO,SAAS,iBAAA,CAAkB,cAAc,KAAA,EAAO;AACnD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,WAAW,CAAA;AAE5C,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,MAAM,OAAA,CAAQ,CAAC,aAAa,CAAC,QAAQ,CAAA,EAAG,EAAE,CAAA;AAErE,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAyB;AACtC,MAAA,IAAI,MAAM,GAAA,KAAQ,GAAA,KAAQ,KAAA,CAAM,OAAA,IAAW,MAAM,OAAA,CAAA,EAAU;AACvD,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,MAAA,EAAO;AAAA,MACX;AAAA,IACJ,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,OAAO,CAAA;AAE5C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,OAAO,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAO;AACnC;AC7FA,IAAM,iBAAA,GAAoB,cAA6C,IAAI,CAAA;AAEpE,IAAM,qBAAqB,iBAAA,CAAkB,QAAA;AAE7C,SAAS,aAAA,GAAwC;AACpD,EAAA,MAAM,OAAA,GAAU,WAAW,iBAAiB,CAAA;AAE5C,EAAA,IAAI,YAAY,IAAA,EAAM;AAClB,IAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,EACxE;AAEA,EAAA,OAAO,OAAA;AACX;AC1BA,IAAM,cAAA,GAAiB,IAAI,IAAA,CAAK,IAAA,EAAM,GAAG,CAAC,CAAA;AAE1C,IAAM,YAAA,GAAe,IAAI,IAAA,CAAA,iBAAK,IAAI,IAAA,IAAO,WAAA,EAAY,GAAI,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA;AAElE,IAAM,MAAA,GAAS,CAAC,KAAA,KACZ,KAAA,uBAAY,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,SAAA,CAAW,CAAA,GAAI,MAAA;AAE5C,IAAM,QAAQ,CAAC,KAAA,KACX,QAAQ,MAAA,CAAO,KAAA,EAAO,YAAY,CAAA,GAAI,MAAA;AAEnC,SAAS,oBAAA,GAAuB;AACnC,EAAA,MAAM,EAAE,OAAO,SAAA,EAAW,MAAA,EAAQ,UAAU,UAAA,EAAY,MAAA,KACpD,aAAA,EAAc;AAElB,EAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,SAAA;AACnC,EAAA,MAAM,UAAU,QAAA,KAAa,SAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,QAAQ,KAAA,CAAM,KAAK,MAAM,CAAC,OAAA,IAAW,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAA;AAEvE,EAAA,uBACIA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EACX,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACX,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACG,OAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAK,MAAA;AAAA,UACL,OAAA,EAAS,UAAA;AAAA,UACT,cAAY,MAAA,CAAO,IAAA;AAAA,UAEnB,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,OACpC;AAAA,MACC,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,qBACZA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEG,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MACL,QAAA,CAAS;AAAA,YACL,GAAG,KAAA;AAAA,YACH,UAAU,IAAA,CAAK;AAAA,WAClB,CAAA;AAAA,UAEL,SAAA,EAAW,EAAA;AAAA,YACP,6EAAA;AAAA,YACA,QAAA,KAAa,IAAA,CAAK,KAAA,GACZ,oCAAA,GACA;AAAA,WACV;AAAA,UAEC,QAAA,EAAA,IAAA,CAAK;AAAA,SAAA;AAAA,QAfD,IAAA,CAAK;AAAA,OAiBjB;AAAA,KAAA,EACL,CAAA;AAAA,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EACV,oCACGA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,OAAA;AAAA,QACL,cAAA,EAAgB,CAAA;AAAA,QAChB,MAAA,EAAQ,EAAA;AAAA,QACR,aAAA,EAAc,UAAA;AAAA,QACd,UAAA,EAAY,cAAA;AAAA,QACZ,QAAA,EAAU,YAAA;AAAA,QACV,YAAA,EAAc,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAAA,QAChC,QAAA,EAAU;AAAA,UACN,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAAA,UACxB,EAAA,EAAI,MAAA,CAAO,KAAA,CAAM,GAAG;AAAA,SACxB;AAAA,QACA,QAAA,EAAU,CAAC,KAAA,KACP,QAAA,CAAS;AAAA,UACL,GAAG,KAAA;AAAA,UACH,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,IAAI,CAAA;AAAA,UACxB,GAAA,EAAK,KAAA,CAAM,KAAA,EAAO,EAAE;AAAA,SACvB;AAAA;AAAA,wBAITA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,MAAA,EAAQ,EAAA;AAAA,QACR,aAAA,EAAc,UAAA;AAAA,QACd,UAAA,EAAY,cAAA;AAAA,QACZ,QAAA,EAAU,YAAA;AAAA,QACV,YAAA,EAAc,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAAA,QAChC,QAAA,EAAU,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAAA,QAC5B,QAAA,EAAU,CAAC,IAAA,KACP,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,IAAI,CAAA,EAAG;AAAA;AAAA,KAEjD,EAER,CAAA;AAAA,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qCAAA,EACX,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAO,QAAA,EAAU,CAAC,QAAA,EAAU,SAAS,MAAM,MAAA,CAAO,KAAK,CAAA,EACnD,QAAA,EAAA,MAAA,CAAO,OACZ,CAAA,EACJ;AAAA,GAAA,EACJ,CAAA;AAER;ACnFA,IAAM,YAAA,GAAe,EAAE,YAAA,EAAc,CAAA,EAAE;AAEvC,IAAM,QAAA,GAAyE;AAAA,EAC3E,GAAA,EAAK,OAAA;AAAA,EACL,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,SAAA;AAAA,EACP,OAAA,EAAS,WAAA;AAAA,EACT,IAAA,EAAM;AACV,CAAA;AAEA,IAAM,OAAA,GAAwD;AAAA,EAC1D,GAAA,EAAK,UAAA;AAAA,EACL,IAAA,EAAM,CAAC,IAAA,KAAS,WAAA,CAAY,MAAM,YAAY,CAAA;AAAA,EAC9C,KAAA,EAAO,YAAA;AAAA,EACP,OAAA,EAAS,cAAA;AAAA,EACT,IAAA,EAAM;AACV,CAAA;AAEA,IAAM,KAAA,GAAsD;AAAA,EACxD,GAAA,EAAK,QAAA;AAAA,EACL,IAAA,EAAM,CAAC,IAAA,KAAS,SAAA,CAAU,MAAM,YAAY,CAAA;AAAA,EAC5C,KAAA,EAAO,UAAA;AAAA,EACP,OAAA,EAAS,YAAA;AAAA,EACT,IAAA,EAAM;AACV,CAAA;AAEO,SAAS,oBAAA,CACZ,IAAA,EACA,MAAA,EACA,cAAA,EACA,GAAA,uBAAgB,IAAA,EAAK,EACrB,YAAA,GAAe,CAAA,EACf,UAAA,EACiC;AACjC,EAAA,IAAI,MAAA,GAAS,CAAA,IAAK,YAAA,GAAe,CAAA,EAAG;AAChC,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,IAAI,SAAS,cAAA,GAAiB,GAAA,GAAM,SAAS,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAEzD,EAAA,IAAI,eAAe,CAAA,EAAG;AAClB,IAAA,MAAA,GAAS,QAAA,CAAS,UAAA,IAAc,IAAI,CAAA,CAAE,QAAQ,YAAY,CAAA;AAAA,EAC9D;AAEA,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,CAAE,MAAA,EAAQ,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,IACvD,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA,CAAE,MAAM;AAAA,GAC3B;AACJ;AAEO,SAAS,mBAAmB,KAAA,EAA2C;AAC1E,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,KAAA,CAAM,KAAA,EAAO,MAAM,GAAG,CAAA;AAClD,EAAA,MAAM,YAAA,GAAe,WAAW,OAAA,GAAU,YAAA;AAE1C,EAAA,OAAO,GAAGC,MAAAA,CAAO,KAAA,CAAM,OAAO,YAAA,EAAc,EAAE,QAAQC,EAAAA,EAAI,CAAC,CAAA,GAAA,EAAMD,MAAAA,CAAO,MAAM,GAAA,EAAK,YAAA,EAAc,EAAE,MAAA,EAAQC,EAAAA,EAAI,CAAC,CAAA,CAAA;AACpH;ACxDO,SAAS,uBAAA,GAA0B;AACtC,EAAA,MAAM,EAAE,OAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,UAAA,EAAY,MAAA,KAChD,aAAA,EAAc;AAElB,EAAA,MAAM,SAAA,GAAA,CAAa,KAAA,CAAM,aAAA,IAAiB,CAAA,IAAK,CAAA;AAE/C,EAAA,uBACIH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACX,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACX,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACG,OAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAK,MAAA;AAAA,UACL,OAAA,EAAS,UAAA;AAAA,UACT,cAAY,MAAA,CAAO,IAAA;AAAA,UAEnB,QAAA,kBAAAA,GAAAA,CAACG,WAAAA,EAAA,EAAY,WAAU,QAAA,EAAS;AAAA;AAAA,OACpC;AAAA,sBACAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EACX,iBAAO,aAAA,EACZ;AAAA,KAAA,EACJ,CAAA;AAAA,oBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACX,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACX,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,iBAAO,MAAA,EAAO,CAAA;AAAA,wBACzCA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACG,IAAA,EAAK,QAAA;AAAA,YACL,GAAA,EAAK,CAAA;AAAA,YACL,GAAA,EAAK,GAAA;AAAA,YACL,KAAA,EAAO,MAAM,MAAA,IAAU,CAAA;AAAA,YACvB,QAAA,EAAU,CAAC,KAAA,KACP,QAAA,CAAS;AAAA,cACL,GAAG,KAAA;AAAA,cACH,MAAA,EAAQ,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,KAAK;AAAA,aACpC,CAAA;AAAA,YAEL,SAAA,EAAU;AAAA;AAAA,SACd;AAAA,wBACAD,IAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACG,KAAA,EAAO,MAAM,IAAA,IAAQ,OAAA;AAAA,YACrB,aAAA,EAAe,CAAC,IAAA,KACZ,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,MAA8B,CAAA;AAAA,YAGvD,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,SAAA,EAAU,UACrB,QAAA,kBAAAA,GAAAA,CAAC,eAAY,CAAA,EACjB,CAAA;AAAA,8BACAA,GAAAA,CAAC,aAAA,EAAA,EACI,gBAAM,GAAA,CAAI,CAAC,yBACRA,GAAAA,CAAC,UAAA,EAAA,EAA4B,KAAA,EAAO,KAAK,KAAA,EACpC,QAAA,EAAA,IAAA,CAAK,SADO,IAAA,CAAK,KAEtB,CACH,CAAA,EACL;AAAA;AAAA;AAAA,SACJ;AAAA,QACC,CAAC,6BACEA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACG,OAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAK,MAAA;AAAA,YACL,cAAY,MAAA,CAAO,WAAA;AAAA,YACnB,OAAO,MAAA,CAAO,WAAA;AAAA,YACd,OAAA,EAAS,MACL,QAAA,CAAS;AAAA,cACL,GAAG,KAAA;AAAA,cACH,aAAA,EAAe,CAAA;AAAA,cACf,WAAA,EAAa,MAAM,IAAA,IAAQ;AAAA,aAC9B,CAAA;AAAA,YAGL,QAAA,kBAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA;AACxC,OAAA,EAER,CAAA;AAAA,MAEC,SAAA,oBACGD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACX,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,iBAAO,WAAA,EAAY,CAAA;AAAA,wBAC9CA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACG,IAAA,EAAK,QAAA;AAAA,YACL,GAAA,EAAK,CAAA;AAAA,YACL,GAAA,EAAK,GAAA;AAAA,YACL,KAAA,EAAO,MAAM,aAAA,IAAiB,CAAA;AAAA,YAC9B,QAAA,EAAU,CAAC,KAAA,KACP,QAAA,CAAS;AAAA,cACL,GAAG,KAAA;AAAA,cACH,aAAA,EAAe,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,KAAK;AAAA,aAC3C,CAAA;AAAA,YAEL,SAAA,EAAU;AAAA;AAAA,SACd;AAAA,wBACAD,IAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACG,KAAA,EAAO,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,IAAA,IAAQ,OAAA;AAAA,YAC1C,aAAA,EAAe,CAAC,IAAA,KACZ,QAAA,CAAS;AAAA,cACL,GAAG,KAAA;AAAA,cACH,WAAA,EAAa;AAAA,aAChB,CAAA;AAAA,YAGL,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,SAAA,EAAU,UACrB,QAAA,kBAAAA,GAAAA,CAAC,eAAY,CAAA,EACjB,CAAA;AAAA,8BACAA,GAAAA,CAAC,aAAA,EAAA,EACI,gBAAM,GAAA,CAAI,CAAC,yBACRA,GAAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBAEG,OAAO,IAAA,CAAK,KAAA;AAAA,kBAEX,QAAA,EAAA,IAAA,CAAK;AAAA,iBAAA;AAAA,gBAHD,IAAA,CAAK;AAAA,eAKjB,CAAA,EACL;AAAA;AAAA;AAAA,SACJ;AAAA,wBACAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACG,OAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAK,MAAA;AAAA,YACL,cAAY,MAAA,CAAO,YAAA;AAAA,YACnB,OAAA,EAAS,MACL,QAAA,CAAS;AAAA,cACL,GAAG,KAAA;AAAA,cACH,aAAA,EAAe,MAAA;AAAA,cACf,WAAA,EAAa;AAAA,aAChB,CAAA;AAAA,YAGL,QAAA,kBAAAA,GAAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA;AAC1B,OAAA,EACJ,CAAA;AAAA,sBAGJD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,2CAAA,EACZ,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,cAAA;AAAA,wBACRC,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACG,OAAA,EAAS,MAAM,eAAA,IAAmB,KAAA;AAAA,YAClC,eAAA,EAAiB,CAAC,OAAA,KACd,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,eAAA,EAAiB,OAAA,EAAS;AAAA;AAAA;AAEvD,OAAA,EACJ;AAAA,KAAA,EACJ,CAAA;AAAA,oBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DAAA,EACX,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,gBAAa,KAAA,EAAc,CAAA;AAAA,sBAC5BA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACG,QAAA,EAAU,CAAC,KAAA,CAAM,IAAA,IAAQ,CAAC,KAAA,CAAM,MAAA,IAAU,MAAM,MAAA,GAAS,CAAA;AAAA,UACzD,OAAA,EAAS,MAAM,MAAA,CAAO,KAAK,CAAA;AAAA,UAE1B,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA;AACZ,KAAA,EACJ;AAAA,GAAA,EACJ,CAAA;AAER;AAEA,SAAS,YAAA,CAAa,EAAE,KAAA,EAAM,EAA+B;AACzD,EAAA,MAAM,KAAA,GAAQ,oBAAA;AAAA,IACV,MAAM,IAAA,IAAQ,OAAA;AAAA,IACd,MAAM,MAAA,IAAU,CAAA;AAAA,IAChB,MAAM,eAAA,IAAmB,KAAA;AAAA,wBACrB,IAAA,EAAK;AAAA,IACT,MAAM,aAAA,IAAiB,CAAA;AAAA,IACvB,KAAA,CAAM;AAAA,GACV;AAEA,EAAA,IAAI,CAAC,KAAA,EAAO;AACR,IAAA,uBAAOA,IAAC,MAAA,EAAA,EAAK,CAAA;AAAA,EACjB;AAEA,EAAA,uBACID,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uDAAA,EACZ,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,IAChC,mBAAmB,KAAK;AAAA,GAAA,EAC7B,CAAA;AAER;AC3LA,IAAM,QAAA,GAAW,CAAC,KAAA,KACd,KAAA,GACMC,MAAAA,iBAAO,IAAI,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,SAAA,CAAW,CAAA,EAAG,uBAAA,EAAyB;AAAA,EAC3D,MAAA,EAAQC;AACZ,CAAC,CAAA,GACD,EAAA;AAEH,SAAS,mBAAA,CACZ,KAAA,EACA,OAAA,EACA,SAAA,EACA,OACA,MAAA,EACM;AACN,EAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AACzB,IAAA,OACI,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,UAAU,KAAA,CAAM,MAAM,CAAA,EAAG,KAAA,IACzD,MAAA,CAAO,QAAA;AAAA,EAEf;AAEA,EAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AACxB,IAAA,MAAM,QAAA,GACF,SAAA,CAAU,IAAA,CAAK,CAAC,IAAA,KAAS,KAAK,KAAA,KAAU,KAAA,CAAM,QAAQ,CAAA,EAAG,KAAA,IACzD,EAAA;AAEJ,IAAA,OAAO,KAAA,CAAM,aAAa,SAAA,GACpB,CAAA,EAAG,SAAS,KAAA,CAAM,KAAK,CAAC,CAAA,GAAA,EAAM,QAAA,CAAS,MAAM,GAAG,CAAC,KACjD,CAAA,EAAG,QAAQ,IAAI,QAAA,CAAS,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC3B,IAAA,MAAM,SAAA,GAAY,CAAC,IAAA,KACf,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,KAAA,KAAU,IAAI,CAAA,EAAG,KAAA,IAAS,EAAA;AAExD,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,KAAA,CAAM,MAAA,IAAU,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA;AAE3E,IAAA,OAAA,CAAQ,MAAM,aAAA,IAAiB,CAAA,IAAK,IAC9B,CAAA,EAAG,IAAI,KAAK,MAAA,CAAO,GAAG,IAAI,KAAA,CAAM,aAAa,IAAI,SAAA,CAAU,KAAA,CAAM,eAAe,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA,GAC3F,IAAA;AAAA,EACV;AAEA,EAAA,OAAO,MAAA,CAAO,GAAA;AAClB;;;ACbO,IAAM,eAAA,GAAsC;AAAA,EAC/C,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,EACjC,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,WAAA,EAAY;AAAA,EACzC,EAAE,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,eAAA,EAAgB;AAAA,EACjD,EAAE,KAAA,EAAO,iBAAA,EAAmB,KAAA,EAAO,aAAA,EAAc;AAAA,EACjD,EAAE,KAAA,EAAO,kBAAA,EAAoB,KAAA,EAAO,cAAA,EAAe;AAAA,EACnD,EAAE,KAAA,EAAO,gBAAA,EAAkB,KAAA,EAAO,gBAAA,EAAiB;AAAA,EACnD,EAAE,KAAA,EAAO,mBAAA,EAAqB,KAAA,EAAO,eAAA,EAAgB;AAAA,EACrD,EAAE,KAAA,EAAO,oBAAA,EAAsB,KAAA,EAAO,gBAAA;AAC1C;AAEO,IAAM,iBAAA,GAAwC;AAAA,EACjD,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,EACrC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,EACnC,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK;AAAA,EAC3B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA;AAC7B;AAEO,IAAM,aAAA,GAAoC;AAAA,EAC7C,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAA,EAAO;AAAA,EAC9B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAQ;AAAA,EAChC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAA,EAAS;AAAA,EAClC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,UAAA,EAAW;AAAA,EACtC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,OAAA;AAC5B;AAEO,IAAM,cAAA,GAAmC;AAAA,EAC5C,GAAA,EAAK,UAAA;AAAA,EACL,KAAA,EAAO,gBAAA;AAAA,EACP,QAAA,EAAU,mBAAA;AAAA,EACV,aAAA,EAAe,gBAAA;AAAA,EACf,KAAA,EAAO,cAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ,MAAA;AAAA,EACR,GAAA,EAAK,QAAA;AAAA,EACL,cAAA,EAAgB,wBAAA;AAAA,EAChB,WAAA,EAAa,UAAA;AAAA,EACb,YAAA,EAAc,eAAA;AAAA,EACd,QAAA,EAAU;AACd;ACxCO,SAAS,UAAA,CAAW;AAAA,EACvB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA,GAAU,eAAA;AAAA,EACV,SAAA,GAAY,iBAAA;AAAA,EACZ,KAAA,GAAQ,aAAA;AAAA,EACR,MAAA;AAAA,EACA;AACJ,CAAA,EAAoB;AAChB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIE,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAA0B,MAAM,CAAA;AAC1D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAA0B,KAAK,CAAA;AAEzD,EAAA,MAAM,OAAA,GAAU;AAAA,IACZ,KAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA,EAAQ,EAAE,GAAG,cAAA,EAAgB,GAAG,MAAA,EAAO;AAAA,IACvC,OAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA,EAAW,CAAC,IAAA,EAAuB,IAAA,KAA0B;AACzD,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,UAAA,EAAY,MAAM,QAAA,CAAS,MAAM,CAAA;AAAA,IACjC,MAAA,EAAQ,CAAC,IAAA,KAA0B;AAC/B,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,OAAA,CAAQ,KAAK,CAAA;AACb,MAAA,QAAA,CAAS,MAAM,CAAA;AAAA,IACnB;AAAA,GACJ;AAEA,EAAA,uBACIJ,GAAAA,CAAC,kBAAA,EAAA,EAAmB,KAAA,EAAO,SACvB,QAAA,kBAAAA,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACG,IAAA;AAAA,MACA,YAAA,EAAc,CAAC,IAAA,KAAS;AACpB,QAAA,OAAA,CAAQ,IAAI,CAAA;AAEZ,QAAA,IAAI,CAAC,IAAA,EAAM;AACP,UAAA,QAAA,CAAS,MAAM,CAAA;AAAA,QACnB;AAAA,MACJ,CAAA;AAAA,MAEC,QAAA,EAAA,QAAA,oBACGD,IAAAA,CAAA,QAAA,EAAA,EACI,QAAA,EAAA;AAAA,wBAAAC,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,wBACnBD,KAAC,iBAAA,EAAA,EACG,QAAA,EAAA;AAAA,0BAAAC,IAAC,aAAA,EAAA,EAAc,CAAA;AAAA,0BACfA,IAAC,mBAAA,EAAA,EAAoB,CAAA;AAAA,0BACrBA,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,0BACnBA,IAAC,mBAAA,EAAA,EAAoB,CAAA;AAAA,0BACrBA,IAAC,eAAA,EAAA,EAAgB,CAAA;AAAA,0BACjBA,IAAC,kBAAA,EAAA,EAAmB;AAAA,SAAA,EACxB;AAAA,OAAA,EACJ;AAAA;AAAA,GAER,EACJ,CAAA;AAER;AAEO,SAAS,iBAAA,CAAkB;AAAA,EAC9B,SAAA;AAAA,EACA;AACJ,CAAA,EAGG;AACC,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,WAAW,KAAA,EAAO,MAAA,KAAW,aAAA,EAAc;AAEnE,EAAA,uBACIA,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,MACnB,QAAA,kBAAAD,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACG,OAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA;AAAA,MAE9C,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAACK,YAAAA,EAAA,EAAa,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,QAChC,QAAA,IACG,mBAAA;AAAA,UACI,KAAA;AAAA,UACA,OAAA;AAAA,UACA,SAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA;AACJ;AAAA;AAAA,GACR,EACJ,CAAA;AAER;AAEO,SAAS,iBAAA,CAAkB;AAAA,EAC9B,QAAA;AAAA,EACA;AACJ,CAAA,EAGG;AACC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,aAAA,EAAc;AAEhC,EAAA,uBACIN,KAAC,cAAA,EAAA,EAAe,KAAA,EAAM,SAAQ,SAAA,EAAW,EAAA,CAAG,YAAA,EAAc,SAAS,CAAA,EAC9D,QAAA,EAAA;AAAA,IAAA,KAAA,KAAU,0BACPC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAA2B,QAAA,EAAS,CAAA;AAAA,IAEtD,KAAA,KAAU,OAAA,oBAAWA,GAAAA,CAAC,oBAAA,EAAA,EAAqB,CAAA;AAAA,IAC3C,KAAA,KAAU,UAAA,oBAAcA,GAAAA,CAAC,uBAAA,EAAA,EAAwB;AAAA,GAAA,EACtD,CAAA;AAER;AAEO,SAAS,cAAA,CAAe;AAAA,EAC3B,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACJ,CAAA,EAIG;AACC,EAAA,uBACIA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACG,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,QAAA;AAAA,MACT,SAAA,EAAW,EAAA;AAAA,QACP,0EAAA;AAAA,QACA,SACM,kCAAA,GACA;AAAA,OACV;AAAA,MAEC;AAAA;AAAA,GACL;AAER;AAEO,SAAS,mBAAA,GAAsB;AAClC,EAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,CAAA;AAC1C;AAEO,SAAS,aAAA,CAAc,EAAE,QAAA,EAAS,EAA6B;AAClE,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,KAAW,aAAA,EAAc;AAEhD,EAAA,uBACIA,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACG,MAAA,EAAQ,MAAM,IAAA,KAAS,KAAA;AAAA,MACvB,UAAU,MAAM,MAAA,CAAO,EAAE,IAAA,EAAM,OAAO,CAAA;AAAA,MAErC,sBAAY,MAAA,CAAO;AAAA;AAAA,GACxB;AAER;AAEO,SAAS,iBAAA,CAAkB,EAAE,IAAA,EAAK,EAAwB;AAC7D,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,MAAA,KAAW,aAAA,EAAc;AAEjD,EAAA,MAAM,OAAA,GAAU,IAAA,GACV,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,KAAK,CAAC,CAAA,GACtD,OAAA;AAEN,EAAA,uBACIA,GAAAA,CAAA,QAAA,EAAA,EACK,kBAAQ,GAAA,CAAI,CAAC,2BACVA,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MAEG,QACI,KAAA,CAAM,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,WAAW,MAAA,CAAO,KAAA;AAAA,MAEvD,QAAA,EAAU,MACN,MAAA,CAAO,EAAE,MAAM,QAAA,EAAU,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,MAGlD,QAAA,EAAA,MAAA,CAAO;AAAA,KAAA;AAAA,IARH,MAAA,CAAO;AAAA,GAUnB,CAAA,EACL,CAAA;AAER;AAEO,SAAS,eAAA,CAAgB,EAAE,QAAA,EAAS,EAA6B;AACpE,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,SAAA,KAAc,aAAA,EAAc;AAEnD,EAAA,uBACIA,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACG,MAAA,EAAQ,MAAM,IAAA,KAAS,OAAA;AAAA,MACvB,QAAA,EAAU,MACN,SAAA,CAAU,OAAA,EAAS;AAAA,QACf,IAAA,EAAM,OAAA;AAAA,QACN,QAAA,EAAU,MAAM,QAAA,IAAY,SAAA;AAAA,QAC5B,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,KAAK,KAAA,CAAM;AAAA,OACd,CAAA;AAAA,MAGJ,sBAAY,MAAA,CAAO;AAAA;AAAA,GACxB;AAER;AAEO,SAAS,kBAAA,CAAmB,EAAE,QAAA,EAAS,EAA6B;AACvE,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,SAAA,KAAc,aAAA,EAAc;AAEnD,EAAA,uBACIA,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACG,MAAA,EAAQ,MAAM,IAAA,KAAS,UAAA;AAAA,MACvB,QAAA,EAAU,MACN,SAAA,CAAU,UAAA,EAAY;AAAA,QAClB,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,MAAM,IAAA,IAAQ,OAAA;AAAA,QACpB,MAAA,EAAQ,MAAM,MAAA,IAAU,CAAA;AAAA,QACxB,eAAA,EAAiB,MAAM,eAAA,IAAmB;AAAA,OAC7C,CAAA;AAAA,MAGJ,sBAAY,MAAA,CAAO;AAAA;AAAA,GACxB;AAER;;;AC/PA,IAAM,eAAA,GAAkB,GAAA;AAExB,IAAM,eAAA,GAAkB,UAAA;AAEjB,SAAS,iBAAiB,MAAA,EAAwC;AACrE,EAAA,IAAI,MAAA,CAAO,SAAS,QAAA,EAAU;AAC1B,IAAA,OAAO,OAAO,MAAA,IAAU,IAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AACzB,IAAA,OAAO,YAAY,MAAM,CAAA;AAAA,EAC7B;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,UAAA,EAAY;AAC5B,IAAA,OAAO,eAAe,MAAM,CAAA;AAAA,EAChC;AAEA,EAAA,OAAO,IAAA;AACX;AAEA,SAAS,YAAY,MAAA,EAAwC;AACzD,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACf,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,IAAI,MAAA,CAAO,aAAa,QAAA,EAAU;AAC9B,IAAA,OAAO,CAAA,EAAG,eAAe,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,MAAA,CAAO,aAAa,OAAA,EAAS;AAC7B,IAAA,OAAO,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,EAAG,eAAe,CAAA,CAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,MAAA,CAAO,aAAa,IAAA,EAAM;AAC1B,IAAA,OAAO,MAAA,CAAO,KAAA;AAAA,EAClB;AAEA,EAAA,OAAO,MAAA,CAAO,GAAA,GAAM,CAAA,EAAG,MAAA,CAAO,KAAK,GAAG,eAAe,CAAA,EAAG,MAAA,CAAO,GAAG,CAAA,CAAA,GAAK,IAAA;AAC3E;AAEA,SAAS,eAAe,MAAA,EAAwC;AAC5D,EAAA,IAAI,CAAC,OAAO,IAAA,IAAQ,CAAC,OAAO,MAAA,IAAU,MAAA,CAAO,SAAS,CAAA,EAAG;AACrD,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,IAAI,KAAA,GAAQ,GAAG,eAAe,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA,CAAA,EAAI,OAAO,IAAI,CAAA,CAAA;AAE9D,EAAA,IAAI,OAAO,eAAA,EAAiB;AACxB,IAAA,KAAA,IAAS,UAAA;AAAA,EACb;AAEA,EAAA,IAAI,MAAA,CAAO,aAAA,IAAiB,MAAA,CAAO,aAAA,GAAgB,CAAA,EAAG;AAClD,IAAA,KAAA,IAAS,WAAW,MAAA,CAAO,aAAa,IAAI,MAAA,CAAO,WAAA,IAAe,OAAO,IAAI,CAAA,CAAA;AAAA,EACjF;AAEA,EAAA,OAAO,KAAA;AACX;AC9CO,SAAS,SAAA,CAAU;AAAA,EACtB,IAAA,EAAM,IAAA;AAAA,EACN,KAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AAAA,EACA;AACJ,CAAA,EAAmB;AACf,EAAA,uBACID,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,yBAAA,EAA2B,SAAS,CAAA,EACnD,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,yBAAA,EAA2B,aAAa,CAAA,EACvD,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAA+B,CAAA,EACnD,CAAA;AAAA,oBACAD,KAAC,KAAA,EAAA,EACG,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oEAAA,EACR,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iBAAiB,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EACxC;AAAA,GAAA,EACJ,CAAA;AAER;AAOO,SAAS,cAAA,CAAe,EAAE,QAAA,EAAU,SAAA,EAAU,EAAwB;AACzE,EAAA,uBAAOA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,WAAA,EAAa,SAAS,GAAI,QAAA,EAAS,CAAA;AACjE;ACjBO,SAAS,eAAA,CAAgB;AAAA,EAC5B,OAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA;AACJ,CAAA,EAAyB;AACrB,EAAA,uBACID,IAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACG,YAAA,EAAc,aAAA,IAAiB,OAAA,CAAQ,CAAC,CAAA;AAAA,MACxC,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA;AAAA,MAEjC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,YAAS,SAAA,EAAU,kFAAA,EACf,kBAAQ,GAAA,CAAI,CAAC,2BACVA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YAEG,KAAA,EAAO,MAAA;AAAA,YACP,SAAA,EAAU,iCAAA;AAAA,YAET,QAAA,EAAA,YAAA,GAAe,MAAM,CAAA,IAAK,MAAA,CAAO,WAAA;AAAY,WAAA;AAAA,UAJzC;AAAA,SAMZ,CAAA,EACL,CAAA;AAAA,QAEC,QAAQ,GAAA,CAAI,CAAC,2BACVA,GAAAA,CAAC,eAAyB,KAAA,EAAO,MAAA,EAAQ,WAAU,MAAA,EAC/C,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BACV,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AACnB,UAAA,MAAM,OAAA,GAAU,CAAA,EAAG,KAAA,CAAM,IAAI,IAAI,MAAM,CAAA,CAAA;AACvC,UAAA,MAAM,QAAQ,MAAA,GAAS,CAAA,EAAG,MAAM,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAChD,UAAA,MAAM,QAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,GAAI,MAAM,CAAA,IAAK,EAAA;AAE9C,UAAA,uBACID,IAAAA,CAAC,KAAA,EAAA,EAAqB,SAAA,EAAU,WAAA,EAC5B,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EACX,gBAAM,KAAA,EACX,CAAA;AAAA,YACC,KAAA,CAAM,IAAA,KAAS,UAAA,mBACZA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACG,EAAA,EAAI,OAAA;AAAA,gBACJ,IAAA,EAAM,MAAM,IAAA,IAAQ,CAAA;AAAA,gBACpB,KAAA;AAAA,gBACA,QAAA,EAAU,CAAC,KAAA,KACP,QAAA;AAAA,kBACI,KAAA,CAAM,IAAA;AAAA,kBACN,MAAA;AAAA,kBACA,MAAM,MAAA,CAAO;AAAA;AACjB;AAAA,gCAIRA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACG,EAAA,EAAI,OAAA;AAAA,gBACJ,KAAA;AAAA,gBACA,QAAA,EAAU,CAAC,KAAA,KACP,QAAA;AAAA,kBACI,KAAA,CAAM,IAAA;AAAA,kBACN,MAAA;AAAA,kBACA,MAAM,MAAA,CAAO;AAAA;AACjB;AAAA,aAER;AAAA,YAEH,yBACGA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCACR,QAAA,EAAA,KAAA,EACL;AAAA,WAAA,EAAA,EAjCE,MAAM,IAmChB,CAAA;AAAA,QAER,CAAC,CAAA,EACL,CAAA,EAAA,EA9Cc,MA+ClB,CACH;AAAA;AAAA;AAAA,GACL;AAER;AC5FO,SAAS,aAAA,CAAc;AAAA,EAC1B,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA;AACJ,CAAA,EAAuB;AACnB,EAAA,uBACID,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,oEAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACV,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,0BACDA,KAAC,KAAA,EAAA,EACG,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mCAAA,EACT,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,YACC,+BACGA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6CACR,QAAA,EAAA,WAAA,EACL;AAAA,WAAA,EAER;AAAA,SAAA,EACJ,CAAA;AAAA,QACC;AAAA;AAAA;AAAA,GACL;AAER;ACpBO,SAAS,YAAA,CAAa;AAAA,EACzB,IAAA,EAAM,IAAA;AAAA,EACN,aAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,KAAA;AAAA,EACR;AACJ,CAAA,EAAsB;AAClB,EAAA,uBACID,IAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACG,WAAA,EAAU,eAAA;AAAA,MACV,cAAY,KAAA,IAAS,MAAA;AAAA,MACrB,SAAA,EAAW,EAAA;AAAA,QACP,eAAA;AAAA,QACA,+CAAA;AAAA,QACA,KAAA,IAAS,eAAA;AAAA,QACT;AAAA,OACJ;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEAAA,EACX,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACX,QAAA,EAAA;AAAA,4BAAAC,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACG,SAAA,EAAW,EAAA;AAAA,kBACP,sDAAA;AAAA,kBACA,aAAA,IAAiB;AAAA,iBACrB;AAAA,gBAEA,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,aAC7B;AAAA,4BACAD,KAAC,KAAA,EAAA,EACG,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mCAAA,EACT,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,8BACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6CACR,QAAA,EAAA,WAAA,EACL;AAAA,aAAA,EACJ;AAAA,WAAA,EACJ,CAAA;AAAA,UACC;AAAA,SAAA,EACL,CAAA;AAAA,QACC;AAAA;AAAA;AAAA,GACL;AAER;AASO,SAAS,aAAA,CAAc;AAAA,EAC1B,KAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,IAAA;AAAA,EACR;AACJ,CAAA,EAAuB;AACnB,EAAA,uBACID,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,WAAA,EAAU,gBAAA;AAAA,MACV,cAAY,KAAA,IAAS,MAAA;AAAA,MACrB,SAAA,EAAW,EAAA;AAAA,QACP,eAAA;AAAA,QACA,+CAAA;AAAA,QACA,KAAA,IAAS,eAAA;AAAA,QACT;AAAA,OACJ;AAAA,MAEE,QAAA,EAAA;AAAA,QAAA,CAAA,KAAA,IAAS,WAAA,qBACPA,IAAAA,CAAC,KAAA,EAAA,EACI,QAAA,EAAA;AAAA,UAAA,KAAA,oBACGC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yCACT,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,UAEH,+BACGA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kDACR,QAAA,EAAA,WAAA,EACL;AAAA,SAAA,EAER,CAAA;AAAA,QAEH;AAAA;AAAA;AAAA,GACL;AAER;AAWO,SAAS,SAAA,CAAU;AAAA,EACtB,EAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA;AACJ,CAAA,EAAmB;AACf,EAAA,uBACID,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACX,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACX,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACG,OAAA,EAAS,EAAA;AAAA,UACT,SAAA,EAAU,qCAAA;AAAA,UAET,QAAA,EAAA;AAAA;AAAA,OACL;AAAA,MACC,+BACGA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6CACR,QAAA,EAAA,WAAA,EACL;AAAA,KAAA,EAER,CAAA;AAAA,oBACAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACG,EAAA;AAAA,QACA,OAAA;AAAA,QACA,eAAA,EAAiB,QAAA;AAAA,QACjB;AAAA;AAAA;AACJ,GAAA,EACJ,CAAA;AAER;AClIA,SAAS,aAAa,KAAA,EAAqC;AACvD,EAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,KAAU,UAAa,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,EAAG;AAC9D,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,OAAO,CAAA,GAAI,KAAA;AAEhD,EAAA,IAAI,eAAe,CAAA,EAAG;AAClB,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,MAAM,UAAA,EAAW;AAAA,EAC5D;AAEA,EAAA,IAAI,aAAa,CAAA,EAAG;AAChB,IAAA,OAAO;AAAA,MACH,KAAA,EAAO,CAAA,CAAA,EAAI,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,MAChC,IAAA,EAAM,UAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACV;AAAA,EACJ;AAEA,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,CAAA,EAAG,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,IAC/B,IAAA,EAAM,UAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACV;AACJ;AAEA,IAAM,cAAA,GAA4C;AAAA,EAC9C,QAAA,EAAU,cAAA;AAAA,EACV,QAAA,EAAU,kBAAA;AAAA,EACV,OAAA,EAAS;AACb,CAAA;AAYO,SAAS,QAAA,CAAS;AAAA,EACrB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA,EAAM,IAAA;AAAA,EACN,aAAA,GAAgB,gCAAA;AAAA,EAChB,KAAA;AAAA,EACA,eAAA;AAAA,EACA,KAAA,GAAQ,KAAA;AAAA,EACR;AACJ,CAAA,EAAkB;AACd,EAAA,MAAM,aAAA,GAAgB,aAAa,KAAK,CAAA;AAExC,EAAA,uBACID,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,WAAA,EAAU,WAAA;AAAA,MACV,cAAY,KAAA,IAAS,MAAA;AAAA,MACrB,SAAA,EAAW,EAAA;AAAA,QACP,eAAA;AAAA,QACA,kFAAA;AAAA,QACA,KAAA,IAAS,eAAA;AAAA,QACT;AAAA,OACJ;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACX,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,0BAAA,EAA4B,aAAa,CAAA,EACxD,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA,EAC7B,CAAA;AAAA,UACC,aAAA,oBACGD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oBAAA,EACX,QAAA,EAAA;AAAA,4BAAAA,IAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACG,SAAA,EAAW,EAAA;AAAA,kBACP,gDAAA;AAAA,kBACA,cAAA,CAAe,cAAc,IAAI;AAAA,iBACrC;AAAA,gBAEC,QAAA,EAAA;AAAA,kBAAA,aAAA,CAAc,KAAA;AAAA,kCACfC,GAAAA,CAAC,aAAA,CAAc,IAAA,EAAd,EAAmB,WAAU,aAAA,EAAc;AAAA;AAAA;AAAA,aAChD;AAAA,YACC,mCACGA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iGACR,QAAA,EAAA,eAAA,EACL;AAAA,WAAA,EAER;AAAA,SAAA,EAER,CAAA;AAAA,wBACAD,KAAC,KAAA,EAAA,EACG,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qFAAA,EACR,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,0BACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4DACR,QAAA,EAAA,KAAA,EACL;AAAA,SAAA,EACJ;AAAA;AAAA;AAAA,GACJ;AAER;AAOO,SAAS,SAAA,CAAU,EAAE,QAAA,EAAU,SAAA,EAAU,EAAmB;AAC/D,EAAA,uBACIA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,qFAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAEC;AAAA;AAAA,GACL;AAER","file":"blocks.js","sourcesContent":["import {\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '@/components/ui/command';\nimport { type LucideIcon } from 'lucide-react';\nimport { useCallback, useEffect, useState, type ReactNode } from 'react';\n\nexport interface CommandPaletteItem {\n id: string;\n label: string;\n icon?: LucideIcon;\n value?: string;\n hint?: string;\n}\n\nexport interface CommandPaletteGroup {\n heading: string;\n items: CommandPaletteItem[];\n}\n\nexport interface CommandPaletteLabels {\n placeholder: string;\n noResultsLabel: string;\n}\n\nexport interface CommandPaletteProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n groups: CommandPaletteGroup[];\n onSelect: (item: CommandPaletteItem) => void;\n query?: string;\n onQueryChange?: (query: string) => void;\n placeholder?: CommandPaletteLabels['placeholder'];\n noResultsLabel?: CommandPaletteLabels['noResultsLabel'];\n emptyState?: ReactNode;\n className?: string;\n}\n\nexport function CommandPalette({\n open,\n onOpenChange,\n groups,\n onSelect,\n query,\n onQueryChange,\n placeholder = 'Search...',\n noResultsLabel = 'No results found',\n emptyState,\n className,\n}: CommandPaletteProps) {\n const resolvedEmptyState = emptyState ?? noResultsLabel;\n\n return (\n <CommandDialog\n open={open}\n onOpenChange={onOpenChange}\n className={className}\n >\n <CommandInput\n placeholder={placeholder}\n value={query}\n onValueChange={onQueryChange}\n />\n <CommandList className=\"max-h-[360px]\">\n <CommandEmpty>{resolvedEmptyState}</CommandEmpty>\n\n {groups.map((group) => (\n <CommandGroup key={group.heading} heading={group.heading}>\n {group.items.map((item) => (\n <CommandItem\n key={item.id}\n value={item.value ?? item.label}\n onSelect={() => onSelect(item)}\n >\n {item.icon && (\n <item.icon className=\"mr-2 size-4\" />\n )}\n <span className=\"font-medium\">\n {item.label}\n </span>\n {item.hint && (\n <span className=\"text-xs ml-auto text-muted-foreground\">\n {item.hint}\n </span>\n )}\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n </CommandList>\n </CommandDialog>\n );\n}\n\nexport function useCommandPalette(initialOpen = false) {\n const [open, setOpen] = useState(initialOpen);\n\n const toggle = useCallback(() => setOpen((previous) => !previous), []);\n\n useEffect(() => {\n const handler = (event: KeyboardEvent) => {\n if (event.key === 'k' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n toggle();\n }\n };\n\n document.addEventListener('keydown', handler);\n\n return () => document.removeEventListener('keydown', handler);\n }, [toggle]);\n\n return { open, setOpen, toggle };\n}\n","import { createContext, useContext } from 'react';\n\nimport type {\n DateFilterLabels,\n DateFilterOption,\n DateFilterValue,\n} from '@/blocks/date-filter/types';\n\nexport type DateFilterPanel = 'root' | 'fixed' | 'relative';\n\nexport interface DateFilterContextValue {\n value: DateFilterValue;\n draft: DateFilterValue;\n labels: DateFilterLabels;\n presets: DateFilterOption[];\n operators: DateFilterOption[];\n units: DateFilterOption[];\n panel: DateFilterPanel;\n setDraft: (value: DateFilterValue) => void;\n openPanel: (panel: DateFilterPanel, seed: DateFilterValue) => void;\n backToRoot: () => void;\n commit: (value: DateFilterValue) => void;\n}\n\nconst DateFilterContext = createContext<DateFilterContextValue | null>(null);\n\nexport const DateFilterProvider = DateFilterContext.Provider;\n\nexport function useDateFilter(): DateFilterContextValue {\n const context = useContext(DateFilterContext);\n\n if (context === null) {\n throw new Error('DateFilter parts must be used inside <DateFilter>.');\n }\n\n return context;\n}\n","import { format } from 'date-fns';\nimport { pt } from 'date-fns/locale';\nimport { ChevronLeft } from 'lucide-react';\n\nimport { useDateFilter } from '@/blocks/date-filter/context';\nimport type { DateFilterOperator } from '@/blocks/date-filter/types';\nimport { Button } from '@/components/ui/button';\nimport { Calendar } from '@/components/ui/calendar';\nimport { cn } from '@/lib/utils';\n\nconst CALENDAR_START = new Date(2020, 0, 1);\n\nconst CALENDAR_END = new Date(new Date().getFullYear() + 1, 11, 31);\n\nconst toDate = (value?: string) =>\n value ? new Date(`${value}T00:00:00`) : undefined;\n\nconst toIso = (value?: Date) =>\n value ? format(value, 'yyyy-MM-dd') : undefined;\n\nexport function DateFilterFixedPanel() {\n const { draft, operators, labels, setDraft, backToRoot, commit } =\n useDateFilter();\n\n const operator = draft.operator ?? 'between';\n const isRange = operator === 'between';\n const canApply = Boolean(draft.start) && (!isRange || Boolean(draft.end));\n\n return (\n <div className=\"w-auto\">\n <div className=\"gap-1 px-2 py-2 flex items-center border-b\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={backToRoot}\n aria-label={labels.back}\n >\n <ChevronLeft className=\"size-4\" />\n </Button>\n {operators.map((item) => (\n <button\n key={item.value}\n type=\"button\"\n onClick={() =>\n setDraft({\n ...draft,\n operator: item.value as DateFilterOperator,\n })\n }\n className={cn(\n 'px-3 py-1.5 text-sm font-medium rounded-xl cursor-pointer transition-colors',\n operator === item.value\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:text-foreground',\n )}\n >\n {item.label}\n </button>\n ))}\n </div>\n\n <div className=\"p-3\">\n {isRange ? (\n <Calendar\n mode=\"range\"\n numberOfMonths={2}\n locale={pt}\n captionLayout=\"dropdown\"\n startMonth={CALENDAR_START}\n endMonth={CALENDAR_END}\n defaultMonth={toDate(draft.start)}\n selected={{\n from: toDate(draft.start),\n to: toDate(draft.end),\n }}\n onSelect={(range) =>\n setDraft({\n ...draft,\n start: toIso(range?.from),\n end: toIso(range?.to),\n })\n }\n />\n ) : (\n <Calendar\n mode=\"single\"\n locale={pt}\n captionLayout=\"dropdown\"\n startMonth={CALENDAR_START}\n endMonth={CALENDAR_END}\n defaultMonth={toDate(draft.start)}\n selected={toDate(draft.start)}\n onSelect={(date) =>\n setDraft({ ...draft, start: toIso(date) })\n }\n />\n )}\n </div>\n\n <div className=\"px-3 py-2 flex justify-end border-t\">\n <Button disabled={!canApply} onClick={() => commit(draft)}>\n {labels.apply}\n </Button>\n </div>\n </div>\n );\n}\n","import {\n endOfDay,\n endOfMonth,\n endOfQuarter,\n endOfWeek,\n endOfYear,\n format,\n isSameYear,\n startOfDay,\n startOfMonth,\n startOfQuarter,\n startOfWeek,\n startOfYear,\n subDays,\n subMonths,\n subQuarters,\n subWeeks,\n subYears,\n} from 'date-fns';\nimport { pt } from 'date-fns/locale';\n\nimport type { DateFilterUnit } from '@/blocks/date-filter/types';\n\nconst WEEK_OPTIONS = { weekStartsOn: 1 } as const;\n\nconst subtract: Record<DateFilterUnit, (date: Date, amount: number) => Date> = {\n day: subDays,\n week: subWeeks,\n month: subMonths,\n quarter: subQuarters,\n year: subYears,\n};\n\nconst startOf: Record<DateFilterUnit, (date: Date) => Date> = {\n day: startOfDay,\n week: (date) => startOfWeek(date, WEEK_OPTIONS),\n month: startOfMonth,\n quarter: startOfQuarter,\n year: startOfYear,\n};\n\nconst endOf: Record<DateFilterUnit, (date: Date) => Date> = {\n day: endOfDay,\n week: (date) => endOfWeek(date, WEEK_OPTIONS),\n month: endOfMonth,\n quarter: endOfQuarter,\n year: endOfYear,\n};\n\nexport function resolveRelativeRange(\n unit: DateFilterUnit,\n amount: number,\n includeCurrent: boolean,\n now: Date = new Date(),\n offsetAmount = 0,\n offsetUnit?: DateFilterUnit,\n): { start: Date; end: Date } | null {\n if (amount < 1 || offsetAmount < 0) {\n return null;\n }\n\n let anchor = includeCurrent ? now : subtract[unit](now, 1);\n\n if (offsetAmount > 0) {\n anchor = subtract[offsetUnit ?? unit](anchor, offsetAmount);\n }\n\n return {\n start: startOf[unit](subtract[unit](anchor, amount - 1)),\n end: endOf[unit](anchor),\n };\n}\n\nexport function formatRangePreview(range: { start: Date; end: Date }): string {\n const sameYear = isSameYear(range.start, range.end);\n const startPattern = sameYear ? 'd MMM' : 'd MMM yyyy';\n\n return `${format(range.start, startPattern, { locale: pt })} - ${format(range.end, 'd MMM yyyy', { locale: pt })}`;\n}\n","import { ArrowLeftToLine, CalendarDays, ChevronLeft, X } from 'lucide-react';\n\nimport { useDateFilter } from '@/blocks/date-filter/context';\nimport {\n formatRangePreview,\n resolveRelativeRange,\n} from '@/blocks/date-filter/range';\nimport type {\n DateFilterUnit,\n DateFilterValue,\n} from '@/blocks/date-filter/types';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { Switch } from '@/components/ui/switch';\n\nexport function DateFilterRelativePanel() {\n const { draft, units, labels, setDraft, backToRoot, commit } =\n useDateFilter();\n\n const hasOffset = (draft.offset_amount ?? 0) > 0;\n\n return (\n <div className=\"w-96\">\n <div className=\"gap-2 px-2 py-2 flex items-center border-b\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={backToRoot}\n aria-label={labels.back}\n >\n <ChevronLeft className=\"size-4\" />\n </Button>\n <span className=\"text-sm font-medium\">\n {labels.relativeTitle}\n </span>\n </div>\n\n <div className=\"gap-3 p-3 flex flex-col\">\n <div className=\"gap-2 flex items-center\">\n <span className=\"text-sm\">{labels.latest}</span>\n <Input\n type=\"number\"\n min={1}\n max={120}\n value={draft.amount ?? 1}\n onChange={(event) =>\n setDraft({\n ...draft,\n amount: Number(event.target.value),\n })\n }\n className=\"w-20\"\n />\n <Select\n value={draft.unit ?? 'month'}\n onValueChange={(unit) =>\n setDraft({ ...draft, unit: unit as DateFilterUnit })\n }\n >\n <SelectTrigger className=\"flex-1\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {units.map((unit) => (\n <SelectItem key={unit.value} value={unit.value}>\n {unit.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {!hasOffset && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={labels.startingAgo}\n title={labels.startingAgo}\n onClick={() =>\n setDraft({\n ...draft,\n offset_amount: 1,\n offset_unit: draft.unit ?? 'month',\n })\n }\n >\n <ArrowLeftToLine className=\"size-4\" />\n </Button>\n )}\n </div>\n\n {hasOffset && (\n <div className=\"gap-2 flex items-center\">\n <span className=\"text-sm\">{labels.startingAgo}</span>\n <Input\n type=\"number\"\n min={1}\n max={120}\n value={draft.offset_amount ?? 1}\n onChange={(event) =>\n setDraft({\n ...draft,\n offset_amount: Number(event.target.value),\n })\n }\n className=\"w-20\"\n />\n <Select\n value={draft.offset_unit ?? draft.unit ?? 'month'}\n onValueChange={(unit) =>\n setDraft({\n ...draft,\n offset_unit: unit as DateFilterUnit,\n })\n }\n >\n <SelectTrigger className=\"flex-1\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {units.map((unit) => (\n <SelectItem\n key={unit.value}\n value={unit.value}\n >\n {unit.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={labels.removeOffset}\n onClick={() =>\n setDraft({\n ...draft,\n offset_amount: undefined,\n offset_unit: undefined,\n })\n }\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n )}\n\n <label className=\"text-sm flex items-center justify-between\">\n {labels.includeCurrent}\n <Switch\n checked={draft.include_current ?? false}\n onCheckedChange={(checked) =>\n setDraft({ ...draft, include_current: checked })\n }\n />\n </label>\n </div>\n\n <div className=\"gap-3 px-3 py-2 flex items-center justify-between border-t\">\n <RangePreview draft={draft} />\n <Button\n disabled={!draft.unit || !draft.amount || draft.amount < 1}\n onClick={() => commit(draft)}\n >\n {labels.apply}\n </Button>\n </div>\n </div>\n );\n}\n\nfunction RangePreview({ draft }: { draft: DateFilterValue }) {\n const range = resolveRelativeRange(\n draft.unit ?? 'month',\n draft.amount ?? 0,\n draft.include_current ?? false,\n new Date(),\n draft.offset_amount ?? 0,\n draft.offset_unit,\n );\n\n if (!range) {\n return <span />;\n }\n\n return (\n <span className=\"gap-2 text-sm flex items-center text-muted-foreground\">\n <CalendarDays className=\"size-4\" />\n {formatRangePreview(range)}\n </span>\n );\n}\n","import { format } from 'date-fns';\nimport { pt } from 'date-fns/locale';\n\nimport type {\n DateFilterLabels,\n DateFilterOption,\n DateFilterValue,\n} from '@/blocks/date-filter/types';\n\nconst readable = (value?: string) =>\n value\n ? format(new Date(`${value}T00:00:00`), \"d 'de' MMMM 'de' yyyy\", {\n locale: pt,\n })\n : '';\n\nexport function summariseDateFilter(\n value: DateFilterValue,\n presets: DateFilterOption[],\n operators: DateFilterOption[],\n units: DateFilterOption[],\n labels: DateFilterLabels,\n): string {\n if (value.mode === 'preset') {\n return (\n presets.find((preset) => preset.value === value.preset)?.label ??\n labels.fallback\n );\n }\n\n if (value.mode === 'fixed') {\n const operator =\n operators.find((item) => item.value === value.operator)?.label ??\n '';\n\n return value.operator === 'between'\n ? `${readable(value.start)} - ${readable(value.end)}`\n : `${operator} ${readable(value.start)}`;\n }\n\n if (value.mode === 'relative') {\n const unitLabel = (unit?: string) =>\n units.find((item) => item.value === unit)?.label ?? '';\n\n const base = `${labels.latest} ${value.amount ?? 1} ${unitLabel(value.unit)}`;\n\n return (value.offset_amount ?? 0) > 0\n ? `${base}, ${labels.ago} ${value.offset_amount} ${unitLabel(value.offset_unit ?? value.unit)}`\n : base;\n }\n\n return labels.all;\n}\n","export type DateFilterMode = 'all' | 'preset' | 'fixed' | 'relative';\n\nexport type DateFilterOperator = 'between' | 'before' | 'on' | 'after';\n\nexport type DateFilterUnit = 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface DateFilterValue {\n mode: DateFilterMode;\n preset?: string;\n operator?: DateFilterOperator;\n start?: string;\n end?: string;\n unit?: DateFilterUnit;\n amount?: number;\n include_current?: boolean;\n offset_amount?: number;\n offset_unit?: DateFilterUnit;\n}\n\nexport interface DateFilterOption {\n value: string;\n label: string;\n}\n\nexport interface DateFilterLabels {\n all: string;\n fixed: string;\n relative: string;\n relativeTitle: string;\n apply: string;\n back: string;\n latest: string;\n ago: string;\n includeCurrent: string;\n startingAgo: string;\n removeOffset: string;\n fallback: string;\n}\n\nexport const DEFAULT_PRESETS: DateFilterOption[] = [\n { value: 'today', label: 'Today' },\n { value: 'yesterday', label: 'Yesterday' },\n { value: 'previous_week', label: 'Previous week' },\n { value: 'previous_7_days', label: 'Last 7 days' },\n { value: 'previous_30_days', label: 'Last 30 days' },\n { value: 'previous_month', label: 'Previous month' },\n { value: 'previous_3_months', label: 'Last 3 months' },\n { value: 'previous_12_months', label: 'Last 12 months' },\n];\n\nexport const DEFAULT_OPERATORS: DateFilterOption[] = [\n { value: 'between', label: 'Between' },\n { value: 'before', label: 'Before' },\n { value: 'on', label: 'On' },\n { value: 'after', label: 'After' },\n];\n\nexport const DEFAULT_UNITS: DateFilterOption[] = [\n { value: 'day', label: 'days' },\n { value: 'week', label: 'weeks' },\n { value: 'month', label: 'months' },\n { value: 'quarter', label: 'quarters' },\n { value: 'year', label: 'years' },\n];\n\nexport const DEFAULT_LABELS: DateFilterLabels = {\n all: 'All time',\n fixed: 'Fixed range...',\n relative: 'Relative range...',\n relativeTitle: 'Relative range',\n apply: 'Apply filter',\n back: 'Back',\n latest: 'Last',\n ago: 'offset',\n includeCurrent: 'Include current period',\n startingAgo: 'Starting',\n removeOffset: 'Remove offset',\n fallback: 'Date',\n};\n","import { CalendarDays } from 'lucide-react';\nimport { useState, type ReactNode } from 'react';\n\nimport {\n DateFilterProvider,\n useDateFilter,\n type DateFilterPanel,\n} from '@/blocks/date-filter/context';\nimport { DateFilterFixedPanel } from '@/blocks/date-filter/fixed-panel';\nimport { DateFilterRelativePanel } from '@/blocks/date-filter/relative-panel';\nimport { summariseDateFilter } from '@/blocks/date-filter/summarise';\nimport {\n DEFAULT_LABELS,\n DEFAULT_OPERATORS,\n DEFAULT_PRESETS,\n DEFAULT_UNITS,\n type DateFilterLabels,\n type DateFilterOption,\n type DateFilterValue,\n} from '@/blocks/date-filter/types';\nimport { Button } from '@/components/ui/button';\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@/components/ui/popover';\nimport { cn } from '@/lib/utils';\n\nexport interface DateFilterProps {\n value: DateFilterValue;\n onChange: (value: DateFilterValue) => void;\n presets?: DateFilterOption[];\n operators?: DateFilterOption[];\n units?: DateFilterOption[];\n labels?: Partial<DateFilterLabels>;\n children?: ReactNode;\n}\n\nexport function DateFilter({\n value,\n onChange,\n presets = DEFAULT_PRESETS,\n operators = DEFAULT_OPERATORS,\n units = DEFAULT_UNITS,\n labels,\n children,\n}: DateFilterProps) {\n const [open, setOpen] = useState(false);\n const [panel, setPanel] = useState<DateFilterPanel>('root');\n const [draft, setDraft] = useState<DateFilterValue>(value);\n\n const context = {\n value,\n draft,\n labels: { ...DEFAULT_LABELS, ...labels },\n presets,\n operators,\n units,\n panel,\n setDraft,\n openPanel: (next: DateFilterPanel, seed: DateFilterValue) => {\n setDraft(seed);\n setPanel(next);\n },\n backToRoot: () => setPanel('root'),\n commit: (next: DateFilterValue) => {\n onChange(next);\n setOpen(false);\n setPanel('root');\n },\n };\n\n return (\n <DateFilterProvider value={context}>\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n\n if (!next) {\n setPanel('root');\n }\n }}\n >\n {children ?? (\n <>\n <DateFilterTrigger />\n <DateFilterContent>\n <DateFilterAll />\n <DateFilterSeparator />\n <DateFilterPresets />\n <DateFilterSeparator />\n <DateFilterFixed />\n <DateFilterRelative />\n </DateFilterContent>\n </>\n )}\n </Popover>\n </DateFilterProvider>\n );\n}\n\nexport function DateFilterTrigger({\n className,\n children,\n}: {\n className?: string;\n children?: ReactNode;\n}) {\n const { value, presets, operators, units, labels } = useDateFilter();\n\n return (\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn('gap-2 justify-start', className)}\n >\n <CalendarDays className=\"size-4\" />\n {children ??\n summariseDateFilter(\n value,\n presets,\n operators,\n units,\n labels,\n )}\n </Button>\n </PopoverTrigger>\n );\n}\n\nexport function DateFilterContent({\n children,\n className,\n}: {\n children: ReactNode;\n className?: string;\n}) {\n const { panel } = useDateFilter();\n\n return (\n <PopoverContent align=\"start\" className={cn('p-0 w-auto', className)}>\n {panel === 'root' && (\n <div className=\"w-64 py-2 flex flex-col\">{children}</div>\n )}\n {panel === 'fixed' && <DateFilterFixedPanel />}\n {panel === 'relative' && <DateFilterRelativePanel />}\n </PopoverContent>\n );\n}\n\nexport function DateFilterItem({\n active,\n onSelect,\n children,\n}: {\n active: boolean;\n onSelect: () => void;\n children: ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={cn(\n 'px-4 py-2 text-sm font-medium cursor-pointer text-left transition-colors',\n active\n ? 'bg-accent text-accent-foreground'\n : 'text-foreground hover:bg-accent/50',\n )}\n >\n {children}\n </button>\n );\n}\n\nexport function DateFilterSeparator() {\n return <div className=\"my-2 border-t\" />;\n}\n\nexport function DateFilterAll({ children }: { children?: ReactNode }) {\n const { value, labels, commit } = useDateFilter();\n\n return (\n <DateFilterItem\n active={value.mode === 'all'}\n onSelect={() => commit({ mode: 'all' })}\n >\n {children ?? labels.all}\n </DateFilterItem>\n );\n}\n\nexport function DateFilterPresets({ only }: { only?: string[] }) {\n const { value, presets, commit } = useDateFilter();\n\n const visible = only\n ? presets.filter((preset) => only.includes(preset.value))\n : presets;\n\n return (\n <>\n {visible.map((preset) => (\n <DateFilterItem\n key={preset.value}\n active={\n value.mode === 'preset' && value.preset === preset.value\n }\n onSelect={() =>\n commit({ mode: 'preset', preset: preset.value })\n }\n >\n {preset.label}\n </DateFilterItem>\n ))}\n </>\n );\n}\n\nexport function DateFilterFixed({ children }: { children?: ReactNode }) {\n const { value, labels, openPanel } = useDateFilter();\n\n return (\n <DateFilterItem\n active={value.mode === 'fixed'}\n onSelect={() =>\n openPanel('fixed', {\n mode: 'fixed',\n operator: value.operator ?? 'between',\n start: value.start,\n end: value.end,\n })\n }\n >\n {children ?? labels.fixed}\n </DateFilterItem>\n );\n}\n\nexport function DateFilterRelative({ children }: { children?: ReactNode }) {\n const { value, labels, openPanel } = useDateFilter();\n\n return (\n <DateFilterItem\n active={value.mode === 'relative'}\n onSelect={() =>\n openPanel('relative', {\n mode: 'relative',\n unit: value.unit ?? 'month',\n amount: value.amount ?? 3,\n include_current: value.include_current ?? false,\n })\n }\n >\n {children ?? labels.relative}\n </DateFilterItem>\n );\n}\n","import type { DateFilterValue } from '@/blocks/date-filter/types';\n\nconst RANGE_SEPARATOR = '~';\n\nconst RELATIVE_PREFIX = 'previous';\n\nexport function encodeDateFilter(filter: DateFilterValue): string | null {\n if (filter.mode === 'preset') {\n return filter.preset ?? null;\n }\n\n if (filter.mode === 'fixed') {\n return encodeFixed(filter);\n }\n\n if (filter.mode === 'relative') {\n return encodeRelative(filter);\n }\n\n return null;\n}\n\nfunction encodeFixed(filter: DateFilterValue): string | null {\n if (!filter.start) {\n return null;\n }\n\n if (filter.operator === 'before') {\n return `${RANGE_SEPARATOR}${filter.start}`;\n }\n\n if (filter.operator === 'after') {\n return `${filter.start}${RANGE_SEPARATOR}`;\n }\n\n if (filter.operator === 'on') {\n return filter.start;\n }\n\n return filter.end ? `${filter.start}${RANGE_SEPARATOR}${filter.end}` : null;\n}\n\nfunction encodeRelative(filter: DateFilterValue): string | null {\n if (!filter.unit || !filter.amount || filter.amount < 1) {\n return null;\n }\n\n let value = `${RELATIVE_PREFIX}:${filter.amount}:${filter.unit}`;\n\n if (filter.include_current) {\n value += ':current';\n }\n\n if (filter.offset_amount && filter.offset_amount > 0) {\n value += `:offset:${filter.offset_amount}:${filter.offset_unit ?? filter.unit}`;\n }\n\n return value;\n}\n","import { cn } from '@/lib/utils';\nimport { type LucideIcon } from 'lucide-react';\nimport { type ReactNode } from 'react';\n\nexport interface InfoFieldProps {\n icon: LucideIcon;\n label: string;\n value: ReactNode;\n iconClassName?: string;\n className?: string;\n}\n\nexport function InfoField({\n icon: Icon,\n label,\n value,\n iconClassName,\n className,\n}: InfoFieldProps) {\n return (\n <div className={cn('gap-3 flex items-center', className)}>\n <div className={cn('p-2 rounded-xl bg-muted', iconClassName)}>\n <Icon className=\"size-5 text-muted-foreground\" />\n </div>\n <div>\n <p className=\"text-xs font-medium tracking-wider text-muted-foreground uppercase\">\n {label}\n </p>\n <p className=\"font-semibold\">{value}</p>\n </div>\n </div>\n );\n}\n\nexport interface InfoFieldGroupProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function InfoFieldGroup({ children, className }: InfoFieldGroupProps) {\n return <div className={cn('space-y-4', className)}>{children}</div>;\n}\n","import { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Textarea } from '@/components/ui/textarea';\nimport { cn } from '@/lib/utils';\n\nexport interface LocalizedField {\n name: string;\n label: string;\n type?: 'text' | 'textarea';\n rows?: number;\n}\n\nexport interface LocalizedFieldsProps {\n locales: string[];\n localeLabels?: Record<string, string>;\n fields: LocalizedField[];\n values: Record<string, Record<string, string>>;\n onChange: (field: string, locale: string, value: string) => void;\n errors?: Record<string, string>;\n defaultLocale?: string;\n className?: string;\n}\n\nexport function LocalizedFields({\n locales,\n localeLabels,\n fields,\n values,\n onChange,\n errors,\n defaultLocale,\n className,\n}: LocalizedFieldsProps) {\n return (\n <Tabs\n defaultValue={defaultLocale ?? locales[0]}\n className={cn('w-full', className)}\n >\n <TabsList className=\"mb-4 rounded-2xl p-1.5 flex h-auto w-full justify-start overflow-x-auto bg-muted\">\n {locales.map((locale) => (\n <TabsTrigger\n key={locale}\n value={locale}\n className=\"px-4 font-medium h-8 rounded-xl\"\n >\n {localeLabels?.[locale] ?? locale.toUpperCase()}\n </TabsTrigger>\n ))}\n </TabsList>\n\n {locales.map((locale) => (\n <TabsContent key={locale} value={locale} className=\"mt-0\">\n <div className=\"gap-4 lg:grid-cols-2 grid\">\n {fields.map((field) => {\n const fieldId = `${field.name}-${locale}`;\n const error = errors?.[`${field.name}.${locale}`];\n const value = values[field.name]?.[locale] ?? '';\n\n return (\n <div key={field.name} className=\"space-y-2\">\n <Label htmlFor={fieldId}>\n {field.label}\n </Label>\n {field.type === 'textarea' ? (\n <Textarea\n id={fieldId}\n rows={field.rows ?? 4}\n value={value}\n onChange={(event) =>\n onChange(\n field.name,\n locale,\n event.target.value,\n )\n }\n />\n ) : (\n <Input\n id={fieldId}\n value={value}\n onChange={(event) =>\n onChange(\n field.name,\n locale,\n event.target.value,\n )\n }\n />\n )}\n {error && (\n <p className=\"text-xs font-medium text-destructive\">\n {error}\n </p>\n )}\n </div>\n );\n })}\n </div>\n </TabsContent>\n ))}\n </Tabs>\n );\n}\n","import { cn } from '@/lib/utils';\nimport { type ReactNode } from 'react';\n\nexport interface SectionHeaderProps {\n icon?: ReactNode;\n title: string;\n description?: string;\n control?: ReactNode;\n className?: string;\n}\n\nexport function SectionHeader({\n icon,\n title,\n description,\n control,\n className,\n}: SectionHeaderProps) {\n return (\n <div\n className={cn(\n 'gap-4 sm:flex-row sm:items-center sm:justify-between flex flex-col',\n className,\n )}\n >\n <div className=\"gap-3 flex items-center\">\n {icon}\n <div>\n <h2 className=\"text-lg font-bold text-foreground\">\n {title}\n </h2>\n {description && (\n <p className=\"text-sm font-medium text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n </div>\n {control}\n </div>\n );\n}\n","import { Label } from '@/components/ui/label';\nimport { Switch } from '@/components/ui/switch';\nimport {\n elevatedSurface,\n recessedSurface,\n type SurfaceProps,\n} from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport { type LucideIcon } from 'lucide-react';\nimport { type ReactNode } from 'react';\n\nexport interface SettingsCardProps extends SurfaceProps {\n icon: LucideIcon;\n iconClassName?: string;\n title: string;\n description: string;\n control?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport function SettingsCard({\n icon: Icon,\n iconClassName,\n title,\n description,\n control,\n children,\n inset = false,\n className,\n}: SettingsCardProps) {\n return (\n <section\n data-slot=\"settings-card\"\n data-inset={inset || undefined}\n className={cn(\n elevatedSurface,\n 'space-y-5 p-6 bg-card/60 text-card-foreground',\n inset && recessedSurface,\n className,\n )}\n >\n <div className=\"gap-4 sm:flex-row sm:items-center sm:justify-between flex flex-col\">\n <div className=\"gap-3 flex items-center\">\n <div\n className={cn(\n 'size-11 rounded-2xl flex items-center justify-center',\n iconClassName ?? 'bg-muted text-muted-foreground',\n )}\n >\n <Icon className=\"size-5\" />\n </div>\n <div>\n <h2 className=\"text-lg font-bold text-foreground\">\n {title}\n </h2>\n <p className=\"text-sm font-medium text-muted-foreground\">\n {description}\n </p>\n </div>\n </div>\n {control}\n </div>\n {children}\n </section>\n );\n}\n\nexport interface SettingsPanelProps extends SurfaceProps {\n title?: string;\n description?: string;\n children: ReactNode;\n className?: string;\n}\n\nexport function SettingsPanel({\n title,\n description,\n children,\n inset = true,\n className,\n}: SettingsPanelProps) {\n return (\n <div\n data-slot=\"settings-panel\"\n data-inset={inset || undefined}\n className={cn(\n elevatedSurface,\n 'space-y-4 p-5 bg-card/60 text-card-foreground',\n inset && recessedSurface,\n className,\n )}\n >\n {(title || description) && (\n <div>\n {title && (\n <h3 className=\"text-sm font-semibold text-foreground\">\n {title}\n </h3>\n )}\n {description && (\n <p className=\"mt-1 text-xs font-medium text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nexport interface ToggleRowProps {\n id: string;\n label: string;\n description?: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n disabled?: boolean;\n}\n\nexport function ToggleRow({\n id,\n label,\n description,\n checked,\n onChange,\n disabled,\n}: ToggleRowProps) {\n return (\n <div className=\"gap-4 py-1 flex items-center justify-between\">\n <div className=\"space-y-0.5\">\n <Label\n htmlFor={id}\n className=\"text-sm font-medium text-foreground\"\n >\n {label}\n </Label>\n {description && (\n <p className=\"text-xs font-medium text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n <Switch\n id={id}\n checked={checked}\n onCheckedChange={onChange}\n disabled={disabled}\n />\n </div>\n );\n}\n","import {\n elevatedSurface,\n recessedSurface,\n type SurfaceProps,\n} from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport {\n ArrowDownRight,\n ArrowRight,\n ArrowUpRight,\n type LucideIcon,\n} from 'lucide-react';\nimport { type ReactNode } from 'react';\n\ntype TrendTone = 'positive' | 'negative' | 'neutral';\n\ninterface TrendDisplay {\n label: string;\n tone: TrendTone;\n icon: LucideIcon;\n}\n\nfunction resolveTrend(trend?: number): TrendDisplay | null {\n if (trend === null || trend === undefined || Number.isNaN(trend)) {\n return null;\n }\n\n const normalized = Math.abs(trend) < 0.05 ? 0 : trend;\n\n if (normalized === 0) {\n return { label: '0%', tone: 'neutral', icon: ArrowRight };\n }\n\n if (normalized > 0) {\n return {\n label: `+${normalized.toFixed(1)}%`,\n tone: 'positive',\n icon: ArrowUpRight,\n };\n }\n\n return {\n label: `${normalized.toFixed(1)}%`,\n tone: 'negative',\n icon: ArrowDownRight,\n };\n}\n\nconst trendToneClass: Record<TrendTone, string> = {\n positive: 'text-success',\n negative: 'text-destructive',\n neutral: 'text-muted-foreground',\n};\n\nexport interface StatCardProps extends SurfaceProps {\n title: string;\n value: ReactNode;\n icon: LucideIcon;\n iconClassName?: string;\n trend?: number;\n comparisonLabel?: string;\n className?: string;\n}\n\nexport function StatCard({\n title,\n value,\n icon: Icon,\n iconClassName = 'bg-muted text-muted-foreground',\n trend,\n comparisonLabel,\n inset = false,\n className,\n}: StatCardProps) {\n const resolvedTrend = resolveTrend(trend);\n\n return (\n <div\n data-slot=\"stat-card\"\n data-inset={inset || undefined}\n className={cn(\n elevatedSurface,\n 'p-6 min-w-0 flex h-full flex-col justify-between bg-card/60 text-card-foreground',\n inset && recessedSurface,\n className,\n )}\n >\n <div className=\"mb-4 gap-4 flex items-start justify-between\">\n <div className={cn('rounded-2xl p-3 shrink-0', iconClassName)}>\n <Icon className=\"size-6\" />\n </div>\n {resolvedTrend && (\n <div className=\"min-w-0 text-right\">\n <span\n className={cn(\n 'text-sm font-semibold inline-flex items-center',\n trendToneClass[resolvedTrend.tone],\n )}\n >\n {resolvedTrend.label}\n <resolvedTrend.icon className=\"ml-1 size-4\" />\n </span>\n {comparisonLabel && (\n <p className=\"mt-1 font-medium tracking-wider text-[10px] whitespace-nowrap text-muted-foreground uppercase\">\n {comparisonLabel}\n </p>\n )}\n </div>\n )}\n </div>\n <div>\n <p className=\"mb-1 text-xs font-medium tracking-wider break-words text-muted-foreground uppercase\">\n {title}\n </p>\n <p className=\"text-3xl font-bold truncate text-foreground tabular-nums\">\n {value}\n </p>\n </div>\n </div>\n );\n}\n\nexport interface StatsGridProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function StatsGrid({ children, className }: StatsGridProps) {\n return (\n <div\n className={cn(\n 'gap-6 [&>*]:min-w-0 grid [grid-template-columns:repeat(auto-fit,minmax(18rem,1fr))]',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n"]}