@marktiderman/genesis-ui 2.13.0 → 2.15.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/components/resource/chip.tsx","../src/components/resource/ResourceHeader.tsx","../src/components/resource/ReadinessChip.tsx","../src/components/resource/ResponsesToolbar.tsx","../src/components/resource/HeadlineNumbers.tsx","../src/components/resource/SummaryCard.tsx","../src/components/resource/FollowUpList.tsx","../src/components/resource/ResourceSettingsPage.tsx","../src/components/resource/ShareDialog.tsx"],"names":["jsxs","jsx","Fragment","Check","TriangleAlert","useState"],"mappings":";;;;;;;;;;;;;;;;;;;;AAOO,SAAS,IAAA,CAAK;AAAA,EACnB,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,MAAM,wBACJ,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,IAAA,uBAAQ,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAkC,aAAA,EAAW,IAAA,EAAE,gBAAK,CAAA,GAAU,IAAA;AAAA,IACrF;AAAA,GAAA,EACH,CAAA;AAGF,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,uBACE,GAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAO,UAAA,EAAW,SAAA,EAAW,EAAA,CAAG,aAAA,EAAe,SAAS,CAAA,EAAG,aAAA,EAAa,MAAA,EAClF,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,EAEJ;AACA,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,EAAA,CAAG,aAAA,EAAe,SAAS,CAAA,EAAG,aAAA,EAAa,MAAA,EACzE,QAAA,EAAA,KAAA,EACH,CAAA;AAEJ;ACaA,IAAM,SAAA,GAAyC;AAAA,EAC7C,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,OAAA;AAAA,EACR,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,SAAA;AAAA,EACR,OAAA,EAAS,QAAA;AAAA,EACT,QAAA,EAAU;AACZ,CAAA;AAQO,SAAS,cAAA,CAAe;AAAA,EAC7B,KAAA;AAAA,EACA,QAAA,GAAW,UAAA;AAAA,EACX,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,OAAA,GAAU,IAAA;AAAA,EACV,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,UAAU,MAAA,IAAU,MAAA;AAC1B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,EAAK,IAAK,QAAA;AAC7B,EAAA,uBACEA,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,mEAAA,EAAqE,SAAS,CAAA;AAAA,MAE5F,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACZ,QAAA,EAAA;AAAA,UAAA,MAAA,mBACCC,GAAAA,CAAC,UAAA,EAAA,EACC,0BAAAD,IAAAA,CAAC,cAAA,EAAA,EAAe,WAAU,SAAA,EAExB,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,qDAAA,EAAuD,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,4BACxFA,IAAC,mBAAA,EAAA,EAAoB,CAAA;AAAA,4BACrBA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,SAAA,EACxB,QAAA,kBAAAA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,UAAA,EAAY,QAAA,EAAA,IAAA,EAAK,CAAA,EAC7C;AAAA,WAAA,EACF,GACF,CAAA,GACE,IAAA;AAAA,0BACJD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,sEAAA,EAAwE,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,YAC1F,MAAA,mBACCA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,MAAA,EAAO,iBAAA,EAC7B,QAAA,EAAA,MAAA,CAAO,KAAA,EACV,CAAA,GACE,IAAA;AAAA,YACH,4BACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAA,EAAU,UACd,QAAA,kBAAAA,GAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAM,UAAU,SAAS,CAAA;AAAA,gBACzB,MAAA,EAAO,qBAAA;AAAA,gBACP,IAAA,EACE,cAAc,OAAA,mBACZA,IAAC,KAAA,EAAA,EAAM,CAAA,GACL,cAAc,QAAA,mBAChBA,IAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,gBAAe,CAAA,GAChC,SAAA,KAAc,YAAY,IAAA,mBAC5BA,IAAC,aAAA,EAAA,EAAc,CAAA;AAAA,gBAIlB,2BAAiB,SAAS;AAAA;AAAA,eAE/B,CAAA,GACE;AAAA,WAAA,EACN;AAAA,SAAA,EACF,CAAA;AAAA,wBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACZ,QAAA,EAAA;AAAA,UAAA,OAAA,mBACCA,IAAAA,CAAAE,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAD,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,OAAA;AAAA,gBACR,IAAA,EAAK,MAAA;AAAA,gBACL,YAAA,EAAW,MAAA;AAAA,gBACX,KAAA,EAAM,MAAA;AAAA,gBACN,QAAA,EAAU,CAAC,MAAA,IAAU,CAAC,OAAA;AAAA,gBACtB,OAAA,EAAS,MAAA;AAAA,gBACT,aAAA,EAAY,eAAA;AAAA,gBAEZ,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,aAC5B;AAAA,4BACAA,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,OAAA;AAAA,gBACR,IAAA,EAAK,MAAA;AAAA,gBACL,YAAA,EAAW,MAAA;AAAA,gBACX,KAAA,EAAM,MAAA;AAAA,gBACN,QAAA,EAAU,CAAC,MAAA,IAAU,CAAC,OAAA;AAAA,gBACtB,OAAA,EAAS,MAAA;AAAA,gBACT,aAAA,EAAY,eAAA;AAAA,gBAEZ,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,aAC5B;AAAA,4BACAA,GAAAA,CAAC,SAAA,EAAA,EAAU,WAAA,EAAY,UAAA,EAAW,WAAU,UAAA,EAAW;AAAA,WAAA,EACzD,CAAA,GACE,IAAA;AAAA,UACH,OAAA;AAAA,UACA,4BACCA,GAAAA,CAAC,UAAO,OAAA,EAAQ,OAAA,EAAQ,2BAAWA,GAAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,UAAS,CAAA,EAAI,OAAA,EAAS,WAAW,aAAA,EAAY,kBAAA,EAAmB,qBAElH,CAAA,GACE,IAAA;AAAA,UACH,0BACCA,GAAAA,CAAC,UAAO,OAAA,EAAQ,SAAA,EAAU,2BAAWA,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,UAAS,CAAA,EAAI,OAAA,EAAS,SAAS,aAAA,EAAY,gBAAA,EAAiB,mBAEnH,CAAA,GACE,IAAA;AAAA,UACH,0BACCA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,kBAAWA,GAAAA,CAAC,MAAA,EAAA,EAAO,WAAU,QAAA,EAAS,CAAA;AAAA,cACtC,SAAS,OAAA,CAAQ,OAAA;AAAA,cACjB,UAAU,OAAA,CAAQ,QAAA;AAAA,cAClB,SAAS,OAAA,CAAQ,OAAA;AAAA,cACjB,aAAA,EAAY,kBAAA;AAAA,cAEX,kBAAQ,KAAA,IAAS;AAAA;AAAA,WACpB,GACE;AAAA,SAAA,EACN;AAAA;AAAA;AAAA,GACF;AAEJ;AChLO,SAAS,aAAA,CAAc;AAAA,EAC5B,SAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,aAAA,CAAc,WAAW,MAAM,CAAA;AACvD,EAAA,MAAM,IAAA,GACJ,UAAU,KAAA,KAAU,OAAA,mBAAUA,GAAAA,CAACE,KAAAA,EAAA,EAAM,CAAA,GAAK,SAAA,CAAU,KAAA,KAAU,6BAAaF,GAAAA,CAAC,WAAA,EAAA,EAAY,CAAA,GAAK,SAAA,CAAU,KAAA,KAAU,6BAAaA,GAAAA,CAACG,aAAAA,EAAA,EAAc,CAAA,GAAK,IAAA;AACpJ,EAAA,MAAM,IAAA,mBACJH,GAAAA,CAAC,IAAA,EAAA,EAAK,MAAY,IAAA,EAAY,MAAA,EAAO,WAAA,EAAY,SAAA,EAC9C,QAAA,EAAA,KAAA,EACH,CAAA;AAEF,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,uBACEA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA;AAAA,MACA,SAAA,EAAU,sFAAA;AAAA,MAET,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AC3BO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,IAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAS,EAAC;AAAA,EACV;AACF,CAAA,EAQG;AACD,EAAA,uBACED,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,mBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,mEAAA,EAAqE,SAAS,CAAA;AAAA,MAE5F,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAQ,SAAA;AAAA,cACR,IAAA,EAAK,IAAA;AAAA,cACL,SAAA,EAAU,KAAA;AAAA,cACV,KAAA,EAAO,IAAA;AAAA,cACP,aAAA,EAAe,CAAC,CAAA,KAAM,CAAA,IAAK,aAAa,CAAkB,CAAA;AAAA,cAC1D,YAAA,EAAY,OAAO,KAAA,IAAS,mBAAA;AAAA,cAE5B,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAM,SAAA,EAAU,SAAA,EAAU,YAAW,aAAA,EAAY,wBAAA,EAC/D,QAAA,EAAA,MAAA,CAAO,OAAA,IAAW,SAAA,EACrB,CAAA;AAAA,gCACAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAM,MAAA,EAAO,SAAA,EAAU,UAAA,EAAW,aAAA,EAAY,qBAAA,EAC5D,QAAA,EAAA,MAAA,CAAO,IAAA,IAAQ,eAAA,EAClB;AAAA;AAAA;AAAA,WACF;AAAA,UACC;AAAA,SAAA,EACH,CAAA;AAAA,QACC,0BAAUA,GAAAA,CAAC,SAAI,SAAA,EAAU,4CAAA,EAA8C,mBAAQ,CAAA,GAAS;AAAA;AAAA;AAAA,GAC3F;AAEJ;ACxCA,IAAM,IAAA,GAA4D;AAAA,EAChE,QAAA,EAAU,wCAAA;AAAA,EACV,QAAA,EAAU,gCAAA;AAAA,EACV,OAAA,EAAS,oCAAA;AAAA,EACT,KAAA,EAAO;AACT,CAAA;AAGO,SAAS,eAAA,CAAgB;AAAA,EAC9B,OAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ;AACF,CAAA,EAIG;AACD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,yCAAyC,SAAS,CAAA,EAClE,QAAA,EAAA,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,qBACjBA,GAAAA,CAAC,YAAiB,SAAA,EAAU,wBAAA,EAAA,EAAb,CAAsC,CACtD,CAAA,EACH,CAAA;AAAA,EAEJ;AACA,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAO,IAAA;AAC5B,EAAA,uBACEA,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,kBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,wBAAA;AAAA,QACA,QAAQ,MAAA,IAAU,CAAA,GAAI,mBAAmB,OAAA,CAAQ,MAAA,KAAW,IAAI,gBAAA,GAAmB,EAAA;AAAA,QACnF;AAAA,OACF;AAAA,MAEC,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACZD,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,8FAAA;AAAA,UACV,aAAA,EAAa,CAAA,SAAA,EAAY,CAAA,CAAE,GAAG,CAAA,CAAA;AAAA,UAE9B,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,wCAAA,EAA0C,YAAE,KAAA,EAAM,CAAA;AAAA,4BAChEA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gEAAA,EAAkE,YAAE,KAAA,EAAM,CAAA;AAAA,YACvF,EAAE,MAAA,mBAASA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAW,EAAA,CAAG,SAAA,EAAW,IAAA,CAAK,CAAA,CAAE,QAAQ,OAAO,CAAC,CAAA,EAAI,QAAA,EAAA,CAAA,CAAE,QAAO,CAAA,GAAQ;AAAA;AAAA,SAAA;AAAA,QANhF,CAAA,CAAE;AAAA,OAQV;AAAA;AAAA,GACH;AAEJ;ACxDO,SAAS,WAAA,CAAY;AAAA,EAC1B,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAOG;AACD,EAAA,uBACED,IAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAa,MAAA;AAAA,MACb,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,sFAAA,EAAwF,SAAS,CAAA;AAAA,MAE/G,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,+DAAA,EAChB,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,+CAAA,EACX,QAAA,EAAA;AAAA,YAAA,IAAA,mBACCC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iDAAgD,aAAA,EAAW,IAAA,EACxE,gBACH,CAAA,GACE,IAAA;AAAA,4BACJA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAuB,QAAA,EAAA,KAAA,EAAM;AAAA,WAAA,EAC/C,CAAA;AAAA,UACC,uBAAOA,GAAAA,CAAC,UAAK,SAAA,EAAU,+BAAA,EAAiC,gBAAK,CAAA,GAAU;AAAA,SAAA,EAC1E,CAAA;AAAA,QACC;AAAA;AAAA;AAAA,GACH;AAEJ;AChBO,SAAS,YAAA,CAAa;AAAA,EAC3B,OAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA,GAAQ,mBAAA;AAAA,EACR,SAAA,GAAY,KAAA;AAAA,EACZ,KAAA,GAAQ,iCAAA;AAAA,EACR,SAAA,GAAY,YAAA;AAAA,EACZ;AACF,CAAA,EAWG;AACD,EAAA,uBACED,IAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAY,gBAAA;AAAA,MACZ,SAAA,EAAW,EAAA,CAAG,sFAAA,EAAwF,SAAS,CAAA;AAAA,MAE/G,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,yCAAA,EAChB,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EACZ,QAAA,EAAA;AAAA,4BAAAC,IAACG,aAAAA,EAAA,EAAc,SAAA,EAAU,2CAAA,EAA4C,eAAW,IAAA,EAAC,CAAA;AAAA,YAChF;AAAA,WAAA,EACH,CAAA;AAAA,UACC,CAAC,4BACAH,GAAAA,CAAC,UAAK,SAAA,EAAU,4EAAA,EACb,QAAA,EAAA,OAAA,CAAQ,MAAA,EACX,CAAA,GACE;AAAA,SAAA,EACN,CAAA;AAAA,QACC,SAAA,mBACCD,IAAAA,CAAAE,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,wBAAA,EAAyB,CAAA;AAAA,0BAC7CA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,wBAAA,EAAyB;AAAA,SAAA,EAC/C,CAAA,GACE,QAAQ,MAAA,KAAW,CAAA,mBACrBD,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,uDAAA,EACX,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,iBAAA,EAAkB,eAAW,IAAA,EAAC,CAAA;AAAA,UACpD;AAAA,SAAA,EACH,CAAA,mBAEAA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,qBAAA,EACX,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU;AACtB,UAAA,MAAM,OAAA,GAAU,UAAU,KAAK,CAAA;AAC/B,UAAA,uBACED,IAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,SAAA,EAAU,2DAAA;AAAA,cACV,aAAA,EAAa,CAAA,UAAA,EAAa,KAAA,CAAM,EAAE,CAAA,CAAA;AAAA,cAElC,QAAA,EAAA;AAAA,gCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,kCAAAA,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2CAAA,EACX,QAAA,EAAA;AAAA,oCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA2B,gBAAM,IAAA,EAAK,CAAA;AAAA,oBACrD,KAAA,CAAM,GAAA,mBAAMA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,IAAA,IAAQ,OAAA,EAAU,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,OAAM,CAAA,GAAU;AAAA,mBAAA,EACjF,CAAA;AAAA,kBACC,KAAA,CAAM,yBACLD,IAAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAU,wGAAA;AAAA,sBACV,IAAA,EAAK,KAAA;AAAA,sBACL,YAAA,EAAY,SAAS,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA,QAAA,EAAW,KAAA,CAAM,OAAO,GAAG,CAAA,CAAA;AAAA,sBAEjE,QAAA,EAAA;AAAA,wBAAA,KAAA,CAAM,MAAA,CAAO,KAAA;AAAA,wCACdC,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,eAAW,IAAA,EAAC;AAAA;AAAA;AAAA,mBACtD,GACE;AAAA,iBAAA,EACN,CAAA;AAAA,gBACC,KAAA,CAAM,uBAAOA,GAAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,KAAA,CAAM,IAAA,EAAK,CAAA,GAAO,IAAA;AAAA,gCAC9EA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,EAAA,CAAG,kCAAA,EAAoC,CAAC,KAAA,CAAM,OAAA,IAAW,uBAAuB,CAAA,EAC3F,QAAA,EAAA,KAAA,CAAM,WAAW,SAAA,EACpB,CAAA;AAAA,gBACC,0BAAUA,GAAAA,CAAC,SAAI,SAAA,EAAU,2BAAA,EAA6B,mBAAQ,CAAA,GAAS;AAAA;AAAA,aAAA;AAAA,YAxBnE,KAAA,CAAM;AAAA,WAyBb;AAAA,QAEJ,CAAC,CAAA,EACH;AAAA;AAAA;AAAA,GAEJ;AAEJ;ACrGO,SAAS,eAAA,CAAgB;AAAA,EAC9B,EAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAQG;AACD,EAAA,MAAM,SAAA,GAAY,EAAA,GAAK,CAAA,EAAG,EAAE,CAAA,MAAA,CAAA,GAAW,MAAA;AACvC,EAAA,uBACED,IAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,EAAA;AAAA,MACA,iBAAA,EAAiB,SAAA;AAAA,MACjB,WAAA,EAAU,kBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,0EAAA,EAA4E,SAAS,CAAA;AAAA,MAEnG,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,6CAAA,EACf,QAAA,EAAA;AAAA,UAAA,IAAA,mBACCC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sCAAqC,aAAA,EAAW,IAAA,EAC7D,gBACH,CAAA,GACE,IAAA;AAAA,0BACJD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,IAAC,IAAA,EAAA,EAAG,EAAA,EAAI,SAAA,EAAW,SAAA,EAAU,iBAC1B,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,YACC,8BAAcA,GAAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EAAiC,uBAAY,CAAA,GAAO;AAAA,WAAA,EAClF;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,wBAAA;AAAA;AAAA,cAEA,gDAAA;AAAA,cACA,uEAAA;AAAA,cACA,4EAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEC;AAAA;AAAA;AACH;AAAA;AAAA,GACF;AAEJ;AAyBO,SAAS,oBAAA,CAAqB;AAAA,EACnC,QAAA;AAAA,EACA,QAAA,GAAW,cAAA;AAAA,EACX;AACF,CAAA,EAIG;AACD,EAAA,MAAM,CAAC,QAAQ,SAAS,CAAA,GAAI,SAAS,QAAA,CAAS,CAAC,GAAG,EAAE,CAAA;AACpD,EAAA,MAAM,GAAA,GAAM,SAAS,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC9C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAGnC,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,MAAM,SAAS,MAAM;AACnB,MAAA,KAAA,GAAQ,CAAA;AACR,MAAA,MAAM,IAAA,GAAO,OAAO,WAAA,GAAc,CAAA;AAClC,MAAA,IAAI,OAAA,GAAU,QAAA,CAAS,CAAC,CAAA,EAAG,EAAA;AAE3B,MAAA,IAAI,IAAA;AACJ,MAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,cAAA,CAAe,CAAA,CAAE,EAAE,CAAA;AACvC,QAAA,IAAI,CAAC,EAAA,EAAI;AACT,QAAA,IAAA,GAAO,CAAA,CAAE,EAAA;AACT,QAAA,IAAI,GAAG,qBAAA,EAAsB,CAAE,GAAA,IAAO,IAAA,YAAgB,CAAA,CAAE,EAAA;AAAA,MAC1D;AAEA,MAAA,MAAM,SAAS,MAAA,CAAO,WAAA,GAAc,OAAO,OAAA,IAAW,QAAA,CAAS,gBAAgB,YAAA,GAAe,CAAA;AAC9F,MAAA,IAAI,MAAA,IAAU,IAAA,IAAQ,MAAA,CAAO,OAAA,GAAU,GAAG,OAAA,GAAU,IAAA;AACpD,MAAA,SAAA,CAAU,OAAO,CAAA;AAAA,IACnB,CAAA;AACA,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,IAAI,CAAC,KAAA,EAAO,KAAA,GAAQ,MAAA,CAAO,sBAAsB,MAAM,CAAA;AAAA,IACzD,CAAA;AACA,IAAA,MAAA,EAAO;AACP,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,QAAA,EAAU,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAC5E,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,oBAAoB,QAAA,EAAU,QAAA,EAAU,EAAE,OAAA,EAAS,MAAM,CAAA;AAChE,MAAA,IAAI,KAAA,EAAO,MAAA,CAAO,oBAAA,CAAqB,KAAK,CAAA;AAAA,IAC9C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,uBACED,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,wBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,kFAAA,EAAoF,SAAS,CAAA;AAAA,MAE3G,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,YAAA,EAAY,QAAA,EAAU,WAAU,0CAAA,EACnC,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wFAAA,EACV,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,0BACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yFACX,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,qBACbA,GAAAA,CAAC,IAAA,EAAA,EAAc,SAAA,EAAU,YACvB,QAAA,kBAAAD,IAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,CAAA;AAAA,cACd,cAAA,EAAc,MAAA,KAAW,CAAA,CAAE,EAAA,GAAK,UAAA,GAAa,MAAA;AAAA,cAC7C,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gBAAA,SAAA,CAAU,EAAE,EAAE,CAAA;AACd,gBAAA,IAAI,CAAA,CAAE,OAAA,KAAY,MAAA,IAAa,CAAA,CAAE,QAAA,EAAU;AACzC,kBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,kBAAA,CAAA,CAAE,QAAA,EAAS;AAAA,gBACb;AAAA,cACF,CAAA;AAAA,cACA,SAAA,EAAW,EAAA;AAAA,gBACT,oOAAA;AAAA,gBACA,MAAA,KAAW,EAAE,EAAA,IAAM;AAAA,eACrB;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,CAAA,CAAE,IAAA,mBAAOC,GAAAA,CAAC,MAAA,EAAA,EAAK,eAAW,IAAA,EAAE,QAAA,EAAA,CAAA,CAAE,MAAK,CAAA,GAAU,IAAA;AAAA,gBAC7C,CAAA,CAAE;AAAA;AAAA;AAAA,WACL,EAAA,EAlBO,CAAA,CAAE,EAmBX,CACD,CAAA,EACH;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,mBACE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,MAAS,CAAA,CACrC,GAAA,CAAI,CAAC,sBACJA,GAAAA,CAAC,eAAA,EAAA,EAA2B,EAAA,EAAI,EAAE,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,OAAO,CAAA,CAAE,KAAA,EAAO,WAAA,EAAa,CAAA,CAAE,aAChF,QAAA,EAAA,CAAA,CAAE,OAAA,EAAA,EADiB,CAAA,CAAE,EAExB,CACD,CAAA,EACL;AAAA;AAAA;AAAA,GACF;AAEJ;AClKA,IAAM,GAAA,GAAM,OAAA;AAEZ,eAAe,IAAA,CAAK,MAAc,IAAA,EAAc;AAC9C,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AACxC,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,IAAI,CAAA,QAAA,CAAU,CAAA;AAAA,EACjC,CAAA,CAAA,MAAQ;AACN,IAAA,KAAA,CAAM,MAAM,+CAA+C,CAAA;AAAA,EAC7D;AACF;AAEA,SAAS,SAAA,CAAU;AAAA,EACjB,EAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAS,EAAA,EAAK,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAC3BD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAM,EAAA,EAAQ,QAAA,EAAQ,IAAA,EAAC,KAAA,EAAc,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,CAAO,MAAA,EAAO,EAAG,CAAA;AAAA,sBACzEA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,SAAA;AAAA,UACR,SAAA,kBAAWA,GAAAA,CAAC,IAAA,EAAA,EAAK,WAAU,QAAA,EAAS,CAAA;AAAA,UACpC,OAAA,EAAS,MAAM,KAAK,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,UACrC,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AASO,SAAS,WAAA,CAAY;AAAA,EAC1B,IAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA,GAAO,MAAA;AAAA,EACP,KAAA,GAAQ,cAAc,IAAI,CAAA,CAAA;AAAA,EAC1B,WAAA,GAAc,mCAAA;AAAA,EACd,GAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAU,EAAC;AAAA,EACX,WAAA;AAAA,EACA,UAAA,GAAa;AACf,CAAA,EAuBG;AACD,EAAA,MAAM,KAAK,KAAA,EAAM;AACjB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAII,QAAAA,CAAiC,EAAE,CAAA;AAC/D,EAAA,MAAM,SAAS,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,IAAK,CAAA,KAAM,GAAG,CAAC,CAAA;AAC1F,EAAA,MAAM,SAAA,GAAY,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,EAAE,MAAA,GAAS,YAAA,CAAa,GAAA,EAAK,MAAM,CAAA,GAAI,IAAA;AAClF,EAAA,MAAM,SAAS,GAAA,GAAM,SAAA,GAAY,GAAA,EAAK,EAAE,CAAA,GAAI,IAAA;AAC5C,EAAA,MAAM,kBAAkB,SAAA,IAAa,GAAA,GAAM,SAAA,GAAY,GAAA,EAAK,MAAM,CAAA,GAAI,IAAA;AACtE,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAC,CAAA;AAEzD,EAAA,uBACEJ,IAAC,MAAA,EAAA,EAAO,IAAA,EAAY,cAClB,QAAA,kBAAAD,IAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,2CAAA,EACvB,QAAA,EAAA;AAAA,oBAAAA,KAAC,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,eAAa,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACpBA,GAAAA,CAAC,iBAAA,EAAA,EAAmB,QAAA,EAAA,WAAA,EAAY;AAAA,KAAA,EAClC,CAAA;AAAA,IACC,CAAC,GAAA,mBACAA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,wBAAA,EAAiB,CAAA,mBAE9DD,IAAAA,CAAC,QAAK,YAAA,EAAc,UAAA,KAAe,QAAQ,CAAC,QAAA,GAAW,SAAS,UAAA,EAC9D,QAAA,EAAA;AAAA,sBAAAA,KAAC,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,QAC7B,4BAAYA,GAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,MAAK,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,wBAC5CA,GAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,SAAQ,QAAA,EAAA,OAAA,EAAK;AAAA,OAAA,EAClC,CAAA;AAAA,sBACAD,IAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,MAAA,EAAO,WAAU,gBAAA,EAClC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAA,EAAA,EAAU,EAAA,EAAI,CAAA,EAAG,EAAE,CAAA,KAAA,CAAA,EAAS,KAAA,EAAM,MAAA,EAAO,KAAA,EAAO,GAAA,EAAK,IAAA,EAAK,MAAA,EAAO,CAAA;AAAA,wBAClEA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAO,IAAA;AAAA,YACP,OAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,SAAA,kBAAWA,GAAAA,CAAC,YAAA,EAAA,EAAa,WAAU,QAAA,EAAS,CAAA;AAAA,YAE5C,QAAA,kBAAAD,KAAC,GAAA,EAAA,EAAE,IAAA,EAAM,KAAK,MAAA,EAAO,QAAA,EAAS,KAAI,YAAA,EAAa,QAAA,EAAA;AAAA,cAAA,WAAA;AAAA,cACnC;AAAA,aAAA,EACZ;AAAA;AAAA,SACF;AAAA,QACC,OAAO,MAAA,GAAS,CAAA,oBACfA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uCAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,YAChD,+BAAeA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,WAAA,EAAY;AAAA,WAAA,EAC5E,CAAA;AAAA,0BACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBACZ,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,qBACXD,IAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cAEC,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,GAAG,CAAA,IAAK,GAAA;AAAA,cACxB,aAAA,EAAe,CAAC,CAAA,KAAM,SAAA,CAAU,CAAC,GAAA,MAAS,EAAE,GAAG,GAAA,EAAK,CAAC,CAAA,CAAE,GAAG,GAAG,GAAE,CAAE,CAAA;AAAA,cAEjE,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,iBAAA,EAAkB,YAAA,EAAY,EAAE,KAAA,EACvD,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,CAAA,EACf,CAAA;AAAA,gCACAD,KAAC,aAAA,EAAA,EACC,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,GAAA,EAAM,YAAE,QAAA,EAAS,CAAA;AAAA,kBACnC,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAI,CAAC,sBACdA,GAAAA,CAAC,UAAA,EAAA,EAAyB,KAAA,EAAO,EAAE,KAAA,EAChC,QAAA,EAAA,CAAA,CAAE,KAAA,EAAA,EADY,CAAA,CAAE,KAEnB,CACD;AAAA,iBAAA,EACH;AAAA;AAAA,aAAA;AAAA,YAdK,CAAA,CAAE;AAAA,WAgBV,CAAA,EACH,CAAA;AAAA,UACC,SAAA,oBACCD,IAAAA,CAAAE,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAD,GAAAA;AAAA,cAAC,SAAA;AAAA,cAAA;AAAA,gBACC,EAAA,EAAI,GAAG,EAAE,CAAA,UAAA,CAAA;AAAA,gBACT,KAAA,EAAM,gBAAA;AAAA,gBACN,KAAA,EAAO,SAAA;AAAA,gBACP,IAAA,EAAK;AAAA;AAAA,aACP;AAAA,YACC,mCACCA,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAO,IAAA;AAAA,gBACP,OAAA,EAAQ,SAAA;AAAA,gBACR,SAAA,kBAAWA,GAAAA,CAAC,OAAA,EAAA,EAAQ,WAAU,QAAA,EAAS,CAAA;AAAA,gBAEvC,QAAA,kBAAAA,IAAC,GAAA,EAAA,EAAE,IAAA,EAAM,iBAAiB,MAAA,EAAO,QAAA,EAAS,GAAA,EAAI,YAAA,EAAa,QAAA,EAAA,8BAAA,EAE3D;AAAA;AAAA;AACF,WAAA,EAEJ;AAAA,SAAA,EAEJ;AAAA,OAAA,EAEJ,CAAA;AAAA,MACC,4BACCD,IAAAA,CAAC,eAAY,KAAA,EAAM,IAAA,EAAK,WAAU,gBAAA,EAChC,QAAA,EAAA;AAAA,wBAAAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA2B,QAAA,EAAA,QAAA,CAAS,GAAG,CAAA,EAAE,CAAA;AAAA,wBACxDD,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA;AAAA,UAAA,yCAAA;AAAA,UACf,IAAA;AAAA,UAAK;AAAA,SAAA,EAC/C,CAAA;AAAA,QACC,MAAA,oBACCC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAO,IAAA,EAAC,OAAA,EAAQ,WAAU,SAAA,kBAAWA,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,QAAA,EAAS,CAAA,EACvE,QAAA,kBAAAA,IAAC,GAAA,EAAA,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAO,QAAA,EAAS,GAAA,EAAI,YAAA,EAAa,QAAA,EAAA,mBAAA,EAElD,GACF,CAAA,EACF;AAAA,OAAA,EAEJ,CAAA;AAAA,sBAEFD,IAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,OAAA,EAAQ,WAAU,gBAAA,EACnC,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,IAAC,KAAA,EAAA,EAAM,OAAA,EAAS,CAAA,EAAG,EAAE,UAAU,QAAA,EAAA,uBAAA,EAAqB,CAAA;AAAA,0BACpDA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI,GAAG,EAAE,CAAA,MAAA,CAAA;AAAA,cACT,QAAA,EAAQ,IAAA;AAAA,cACR,IAAA,EAAM,CAAA;AAAA,cACN,SAAA,EAAU,mBAAA;AAAA,cACV,KAAA,EAAO,YAAA,CAAa,GAAA,EAAK,IAAI,CAAA;AAAA,cAC7B,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAA;AAAO;AAAA;AAClC,SAAA,EACF,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,SAAA,kBAAWA,GAAAA,CAAC,IAAA,EAAA,EAAK,WAAU,QAAA,EAAS,CAAA;AAAA,YACpC,OAAA,EAAS,MAAM,KAAK,IAAA,CAAK,aAAa,GAAA,EAAK,IAAI,GAAG,YAAY,CAAA;AAAA,YAC/D,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ","file":"chunk-ZEUUIJ57.js","sourcesContent":["import type { ReactNode } from \"react\";\nimport { Badge } from \"../ui/badge\";\nimport { StatusBadge } from \"../patterns/status-badge\";\nimport { cn } from \"../../utils\";\nimport type { ChipTone } from \"./status\";\n\n/** A small status chip in one of the resource workspace's tones (tinted, AA-safe Genesis badges). */\nexport function Chip({\n tone,\n icon,\n children,\n className,\n testID,\n}: {\n tone: ChipTone;\n icon?: ReactNode;\n children: ReactNode;\n className?: string | undefined;\n testID?: string | undefined;\n}) {\n const inner = (\n <>\n {icon ? <span className=\"mr-1 inline-flex [&_svg]:size-3\" aria-hidden>{icon}</span> : null}\n {children}\n </>\n );\n // Badge's destructive variant is a solid fill; the tinted red is StatusBadge's.\n if (tone === \"danger\") {\n return (\n <StatusBadge status=\"offTrack\" className={cn(\"font-normal\", className)} data-testid={testID}>\n {inner}\n </StatusBadge>\n );\n }\n return (\n <Badge variant={tone} className={cn(\"font-normal\", className)} data-testid={testID}>\n {inner}\n </Badge>\n );\n}\n","import type { ReactNode } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"../ui/breadcrumb\";\nimport { Button } from \"../ui/button\";\nimport { Separator } from \"../ui/separator\";\nimport { cn } from \"../../utils\";\nimport { Check, Eye, Loader2, Redo2, Rocket, Share2, TriangleAlert, Undo2 } from \"lucide-react\";\nimport { Chip } from \"./chip\";\nimport { SAVE_STATE_LABEL, type ChipTone, type SaveState } from \"./status\";\n\nexport interface ResourceHeaderProps {\n /** The title, shown once: as the heading and the breadcrumb's last part. */\n title: string;\n /** Shown when the title is empty. Default \"Untitled\". */\n untitled?: string | undefined;\n /**\n * The breadcrumb's parent link, e.g. `<Link to=\"/courses\">Courses</Link>`: one element, so\n * the host's router renders it.\n */\n parent?: ReactNode;\n /** The status chip, e.g. \"Live · version 3\" or \"Draft\" (forms-studio's formStatusChip makes a form's). */\n status?: { label: string; tone: ChipTone } | undefined;\n /** Where saving the draft stands; no chip when absent. */\n saveState?: SaveState | undefined;\n /** Undo and redo buttons, shown when given (for example the builder's history). */\n onUndo?: (() => void) | undefined;\n onRedo?: (() => void) | undefined;\n canUndo?: boolean | undefined;\n canRedo?: boolean | undefined;\n /** A Preview button. */\n onPreview?: (() => void) | undefined;\n /** A Share button (open a share dialog). */\n onShare?: (() => void) | undefined;\n /** The primary button: \"Publish\", or \"Publish changes\" once it is live. */\n publish?:\n | {\n onClick: () => void;\n label?: string | undefined;\n loading?: boolean | undefined;\n disabled?: boolean | undefined;\n }\n | undefined;\n /** Anything else for the right-hand side, before Preview (a Reload button, a menu). */\n actions?: ReactNode;\n className?: string | undefined;\n}\n\nconst SAVE_TONE: Record<SaveState, ChipTone> = {\n saved: \"muted\",\n saving: \"muted\",\n unsaved: \"muted\",\n failed: \"warning\",\n stopped: \"danger\",\n conflict: \"danger\",\n};\n\n/**\n * The header of a page that edits one publishable thing (a form, a course, a lesson, a\n * worksheet): the breadcrumb (\"Courses › name\"), the title once, its status and save-state\n * chips, and on the right undo and redo, Preview, Share and Publish. Every action is the\n * host's; a button shows only when its handler is given.\n */\nexport function ResourceHeader({\n title,\n untitled = \"Untitled\",\n parent,\n status,\n saveState,\n onUndo,\n onRedo,\n canUndo = true,\n canRedo = true,\n onPreview,\n onShare,\n publish,\n actions,\n className,\n}: ResourceHeaderProps) {\n const history = onUndo || onRedo;\n const name = title.trim() || untitled;\n return (\n <header\n data-slot=\"resource-header\"\n className={cn(\"flex flex-col gap-3 md:flex-row md:items-start md:justify-between\", className)}\n >\n <div className=\"min-w-0 flex-1 space-y-1\">\n {parent ? (\n <Breadcrumb>\n <BreadcrumbList className=\"text-xs\">\n {/* The host's own link, as is: BreadcrumbLink would wrap it in a second <a>. */}\n <BreadcrumbItem className=\"[&_a:hover]:text-foreground [&_a]:transition-colors\">{parent}</BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem className=\"min-w-0\">\n <BreadcrumbPage className=\"truncate\">{name}</BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ) : null}\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1\">\n <h1 className=\"min-w-0 break-words text-xl font-semibold tracking-tight sm:text-2xl\">{name}</h1>\n {status ? (\n <Chip tone={status.tone} testID=\"resource-status\">\n {status.label}\n </Chip>\n ) : null}\n {saveState ? (\n <span aria-live=\"polite\">\n <Chip\n tone={SAVE_TONE[saveState]}\n testID=\"resource-save-state\"\n icon={\n saveState === \"saved\" ? (\n <Check />\n ) : saveState === \"saving\" ? (\n <Loader2 className=\"animate-spin\" />\n ) : saveState === \"unsaved\" ? null : (\n <TriangleAlert />\n )\n }\n >\n {SAVE_STATE_LABEL[saveState]}\n </Chip>\n </span>\n ) : null}\n </div>\n </div>\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n {history ? (\n <>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Undo\"\n title=\"Undo\"\n disabled={!onUndo || !canUndo}\n onClick={onUndo}\n data-testid=\"resource-undo\"\n >\n <Undo2 className=\"size-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Redo\"\n title=\"Redo\"\n disabled={!onRedo || !canRedo}\n onClick={onRedo}\n data-testid=\"resource-redo\"\n >\n <Redo2 className=\"size-4\" />\n </Button>\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n </>\n ) : null}\n {actions}\n {onPreview ? (\n <Button variant=\"ghost\" startIcon={<Eye className=\"size-4\" />} onClick={onPreview} data-testid=\"resource-preview\">\n Preview\n </Button>\n ) : null}\n {onShare ? (\n <Button variant=\"outline\" startIcon={<Share2 className=\"size-4\" />} onClick={onShare} data-testid=\"resource-share\">\n Share\n </Button>\n ) : null}\n {publish ? (\n <Button\n startIcon={<Rocket className=\"size-4\" />}\n loading={publish.loading}\n disabled={publish.disabled}\n onClick={publish.onClick}\n data-testid=\"resource-publish\"\n >\n {publish.label ?? \"Publish\"}\n </Button>\n ) : null}\n </div>\n </header>\n );\n}\n","import { Check, CircleAlert, TriangleAlert } from \"lucide-react\";\nimport { Chip } from \"./chip\";\nimport { readinessChip, type Readiness, type ReadinessLabels } from \"./status\";\n\n/**\n * \"Ready to publish\", or how many problems to fix: for the trailing slot of a resource\n * page's row of tabs (genesis-ui's `<AppShellSubNavEnd>`). With `onClick` it is a button (open the checks).\n */\nexport function ReadinessChip({\n readiness,\n onClick,\n labels,\n className,\n}: {\n readiness: Readiness;\n /** The chip's words; the defaults are neutral (\"Nothing to publish yet\" when empty). */\n labels?: ReadinessLabels | undefined;\n onClick?: (() => void) | undefined;\n className?: string | undefined;\n}) {\n const { label, tone } = readinessChip(readiness, labels);\n const icon =\n readiness.state === \"ready\" ? <Check /> : readiness.state === \"problems\" ? <CircleAlert /> : readiness.state === \"warnings\" ? <TriangleAlert /> : null;\n const chip = (\n <Chip tone={tone} icon={icon} testID=\"readiness\" className={className}>\n {label}\n </Chip>\n );\n if (!onClick) return chip;\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"rounded-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {chip}\n </button>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { ToggleGroup, ToggleGroupItem } from \"../ui/toggle-group\";\nimport { cn } from \"../../utils\";\n\nexport type ResponsesView = \"summary\" | \"each\";\n\n/**\n * The Responses tab's toolbar: a Summary / Each response switch, the host's filters\n * (forms-studio's ResponsesFilters, or its own) and, on the right, its export actions\n * (open a Sheet, Download CSV). `labels` renames the switch, e.g. \"Each submission\".\n */\nexport function ResponsesToolbar({\n view,\n onViewChange,\n filters,\n actions,\n labels = {},\n className,\n}: {\n view: ResponsesView;\n onViewChange: (view: ResponsesView) => void;\n filters?: ReactNode;\n actions?: ReactNode;\n /** The switch's words. Defaults \"Summary\", \"Each response\" and \"Show responses as\". */\n labels?: { summary?: string | undefined; each?: string | undefined; group?: string | undefined } | undefined;\n className?: string | undefined;\n}) {\n return (\n <div\n data-slot=\"responses-toolbar\"\n className={cn(\"flex flex-col gap-2 lg:flex-row lg:items-start lg:justify-between\", className)}\n >\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <ToggleGroup\n type=\"single\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-9\"\n value={view}\n onValueChange={(v) => v && onViewChange(v as ResponsesView)}\n aria-label={labels.group ?? \"Show responses as\"}\n >\n <ToggleGroupItem value=\"summary\" className=\"h-9 px-3\" data-testid=\"responses-view-summary\">\n {labels.summary ?? \"Summary\"}\n </ToggleGroupItem>\n <ToggleGroupItem value=\"each\" className=\"h-9 px-3\" data-testid=\"responses-view-each\">\n {labels.each ?? \"Each response\"}\n </ToggleGroupItem>\n </ToggleGroup>\n {filters}\n </div>\n {actions ? <div className=\"flex shrink-0 flex-wrap items-center gap-2\">{actions}</div> : null}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Skeleton } from \"../ui/skeleton\";\nimport { cn } from \"../../utils\";\n\n/** One headline number: a label, the number, and a short line under it. */\nexport interface HeadlineNumber {\n key: string;\n label: string;\n value: ReactNode;\n detail?: ReactNode;\n /** The detail's colour: good news, bad news, a warning, or plain. Default plain. */\n tone?: \"positive\" | \"negative\" | \"warning\" | \"muted\" | undefined;\n}\n\nconst TONE: Record<NonNullable<HeadlineNumber[\"tone\"]>, string> = {\n positive: \"text-emerald-700 dark:text-emerald-300\",\n negative: \"text-red-700 dark:text-red-300\",\n warning: \"text-amber-800 dark:text-amber-200\",\n muted: \"text-muted-foreground\",\n};\n\n/** A row of headline numbers (KPI cards): two across on a phone, up to four on a wide screen. */\nexport function HeadlineNumbers({\n numbers,\n isLoading = false,\n className,\n}: {\n numbers: readonly HeadlineNumber[];\n isLoading?: boolean | undefined;\n className?: string | undefined;\n}) {\n if (isLoading) {\n return (\n <div className={cn(\"grid grid-cols-2 gap-3 lg:grid-cols-4\", className)}>\n {[0, 1, 2, 3].map((i) => (\n <Skeleton key={i} className=\"h-28 w-full rounded-lg\" />\n ))}\n </div>\n );\n }\n if (!numbers.length) return null;\n return (\n <dl\n data-slot=\"headline-numbers\"\n className={cn(\n \"grid grid-cols-2 gap-3\",\n numbers.length >= 4 ? \"lg:grid-cols-4\" : numbers.length === 3 ? \"lg:grid-cols-3\" : \"\",\n className,\n )}\n >\n {numbers.map((n) => (\n <div\n key={n.key}\n className=\"flex min-w-0 flex-col gap-1 rounded-lg border border-border bg-card p-4 text-card-foreground\"\n data-testid={`headline-${n.key}`}\n >\n <dt className=\"truncate text-sm text-muted-foreground\">{n.label}</dt>\n <dd className=\"text-2xl font-semibold tabular-nums tracking-tight sm:text-3xl\">{n.value}</dd>\n {n.detail ? <dd className={cn(\"text-xs\", TONE[n.tone ?? \"muted\"])}>{n.detail}</dd> : null}\n </div>\n ))}\n </dl>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../../utils\";\n\n/**\n * One card of a summary column: an icon and a title, a short line on the right (\"24\n * responses · average 4.1\"), then whatever summarises it (bars, quotes, a split bar).\n */\nexport function SummaryCard({\n icon,\n title,\n meta,\n children,\n className,\n testID,\n}: {\n icon?: ReactNode;\n title: string;\n meta?: ReactNode;\n children?: ReactNode;\n className?: string | undefined;\n testID?: string | undefined;\n}) {\n return (\n <section\n aria-label={title}\n data-testid={testID}\n data-slot=\"summary-card\"\n className={cn(\"flex flex-col gap-4 rounded-lg border border-border bg-card p-5 text-card-foreground\", className)}\n >\n <header className=\"flex flex-wrap items-baseline justify-between gap-x-4 gap-y-1\">\n <h3 className=\"flex min-w-0 items-center gap-2 font-semibold\">\n {icon ? (\n <span className=\"shrink-0 text-muted-foreground [&_svg]:size-4\" aria-hidden>\n {icon}\n </span>\n ) : null}\n <span className=\"min-w-0 break-words\">{title}</span>\n </h3>\n {meta ? <span className=\"text-xs text-muted-foreground\">{meta}</span> : null}\n </header>\n {children}\n </section>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Skeleton } from \"../ui/skeleton\";\nimport { cn } from \"../../utils\";\nimport { CircleCheck, Star, TriangleAlert } from \"lucide-react\";\nimport { Chip } from \"./chip\";\nimport type { ChipTone } from \"./status\";\n\n/** One item in the follow-up list (a response, a submission), as the host describes it. */\nexport interface FollowUpEntry {\n id: string;\n /** Who answered: a name, or \"Anonymous\". */\n name: string;\n /** A tag beside the name, e.g. \"Member\" or \"New lead\". */\n tag?: { label: string; tone?: ChipTone | undefined } | undefined;\n /** One line under the name: \"Today · 6:00 WOD · Leo\". */\n meta?: ReactNode;\n /** What they wrote; null shows `noComment`. */\n comment?: string | null | undefined;\n /** The low score, on its scale. */\n rating?: { value: number; max: number } | null | undefined;\n}\n\n/**\n * Responses that need a follow-up (the host decides which; forms-studio's needsFollowUp is\n * one rule), each with who answered, a tag, the day and context, their comment, its low\n * score and the host's actions (Reply, Mark handled). Handled items are the host's to leave out.\n */\nexport function FollowUpList({\n entries,\n actions,\n title = \"Needs a follow-up\",\n isLoading = false,\n empty = \"Nothing to follow up right now.\",\n noComment = \"No comment\",\n className,\n}: {\n entries: readonly FollowUpEntry[];\n /** Buttons for one entry. */\n actions?: ((entry: FollowUpEntry) => ReactNode) | undefined;\n title?: string | undefined;\n isLoading?: boolean | undefined;\n /** Said when the list is empty. */\n empty?: ReactNode;\n /** Said for an entry without a comment. Default \"No comment\". */\n noComment?: string | undefined;\n className?: string | undefined;\n}) {\n return (\n <section\n aria-label={title}\n data-testid=\"follow-up-list\"\n className={cn(\"flex flex-col gap-3 rounded-lg border border-border bg-card p-4 text-card-foreground\", className)}\n >\n <header className=\"flex items-center justify-between gap-2\">\n <h3 className=\"flex items-center gap-2 font-semibold\">\n <TriangleAlert className=\"size-4 text-amber-800 dark:text-amber-200\" aria-hidden />\n {title}\n </h3>\n {!isLoading ? (\n <span className=\"rounded-md bg-muted px-2 py-0.5 text-xs tabular-nums text-muted-foreground\">\n {entries.length}\n </span>\n ) : null}\n </header>\n {isLoading ? (\n <>\n <Skeleton className=\"h-24 w-full rounded-md\" />\n <Skeleton className=\"h-24 w-full rounded-md\" />\n </>\n ) : entries.length === 0 ? (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <CircleCheck className=\"size-4 shrink-0\" aria-hidden />\n {empty}\n </p>\n ) : (\n <ul className=\"flex flex-col gap-3\">\n {entries.map((entry) => {\n const buttons = actions?.(entry);\n return (\n <li\n key={entry.id}\n className=\"flex flex-col gap-1.5 rounded-md border border-border p-3\"\n data-testid={`follow-up-${entry.id}`}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <span className=\"break-words font-medium\">{entry.name}</span>\n {entry.tag ? <Chip tone={entry.tag.tone ?? \"muted\"}>{entry.tag.label}</Chip> : null}\n </p>\n {entry.rating ? (\n <span\n className=\"flex shrink-0 items-center gap-0.5 text-sm font-medium tabular-nums text-amber-800 dark:text-amber-200\"\n role=\"img\"\n aria-label={`Rated ${entry.rating.value} out of ${entry.rating.max}`}\n >\n {entry.rating.value}\n <Star className=\"size-3.5 fill-current\" aria-hidden />\n </span>\n ) : null}\n </div>\n {entry.meta ? <p className=\"text-xs text-muted-foreground\">{entry.meta}</p> : null}\n <p className={cn(\"line-clamp-3 break-words text-sm\", !entry.comment && \"text-muted-foreground\")}>\n {entry.comment || noComment}\n </p>\n {buttons ? <div className=\"mt-1 flex flex-wrap gap-2\">{buttons}</div> : null}\n </li>\n );\n })}\n </ul>\n )}\n </section>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState, type ReactNode } from \"react\";\nimport { cn } from \"../../utils\";\n\n/**\n * One group of settings as a card: an icon, a title and a sentence, then its rows\n * (genesis-ui `SettingsRow` and `ToggleRow`: a label, a one-sentence description and the\n * control), divided by lines. On a phone a row whose control isn't a switch puts the\n * control under its label, so wide controls (a link, a list of people) still fit.\n */\nexport function SettingsSection({\n id,\n icon,\n title,\n description,\n children,\n className,\n}: {\n /** The jump link's target. */\n id?: string | undefined;\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n children?: ReactNode;\n className?: string | undefined;\n}) {\n const headingId = id ? `${id}-title` : undefined;\n return (\n <section\n id={id}\n aria-labelledby={headingId}\n data-slot=\"settings-section\"\n className={cn(\"scroll-mt-6 rounded-lg border border-border bg-card text-card-foreground\", className)}\n >\n <header className=\"flex gap-3 border-b border-border px-5 py-4\">\n {icon ? (\n <span className=\"mt-0.5 text-primary [&_svg]:size-5\" aria-hidden>\n {icon}\n </span>\n ) : null}\n <div className=\"min-w-0\">\n <h2 id={headingId} className=\"font-semibold\">\n {title}\n </h2>\n {description ? <p className=\"text-sm text-muted-foreground\">{description}</p> : null}\n </div>\n </header>\n <div\n className={cn(\n \"divide-y divide-border\",\n // Rows: genesis-ui SettingsRow and ToggleRow, padded to the card.\n \"[&>*]:px-5 [&>[data-slot=settings-row]]:py-3.5\",\n \"[&>[data-slot=settings-row]:not(:has([role=switch]))]:max-sm:flex-col\",\n \"[&>[data-slot=settings-row]:not(:has([role=switch]))]:max-sm:items-stretch\",\n \"[&>[data-slot=settings-row]>div:last-child]:max-sm:flex-wrap\",\n )}\n >\n {children}\n </div>\n </section>\n );\n}\n\n/**\n * One section of a ResourceSettingsPage. (Named apart from the layout tier's\n * `SettingsPageSection`, which belongs to the whole-page `SettingsPage`.)\n */\nexport interface ResourceSettingsSection {\n id: string;\n title: string;\n icon?: ReactNode;\n description?: ReactNode;\n /** The rows. Absent: a jump link only, to `#id` elsewhere on the page (or `onSelect`). */\n content?: ReactNode;\n /** For a link-only section whose target has no id: scroll to it yourself. */\n onSelect?: (() => void) | undefined;\n}\n\n/**\n * Every setting of one thing (a form, a course, a worksheet) on one page: jump links on the left (\"On this page\", the one in\n * view marked), the sections as cards on the right. On a phone the links sit above the\n * sections as a row that scrolls sideways.\n *\n * Not genesis-ui's `SettingsPage`: that one is a whole page with its own title, and plain\n * sections; these settings sit under the resource's header, as cards with icons.\n */\nexport function ResourceSettingsPage({\n sections,\n navLabel = \"On this page\",\n className,\n}: {\n sections: readonly ResourceSettingsSection[];\n navLabel?: string | undefined;\n className?: string | undefined;\n}) {\n const [active, setActive] = useState(sections[0]?.id);\n const ids = sections.map((s) => s.id).join(\" \");\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n // The section in view is the last one whose top has passed the upper third of the\n // window (the first one before any has).\n let frame = 0;\n const update = () => {\n frame = 0;\n const line = window.innerHeight / 3;\n let current = sections[0]?.id;\n // One pass: the section past the line, and the last one on the page.\n let last: string | undefined;\n for (const s of sections) {\n const el = document.getElementById(s.id);\n if (!el) continue;\n last = s.id;\n if (el.getBoundingClientRect().top <= line) current = s.id;\n }\n // At the very bottom the last sections can't reach the line: the last one is in view.\n const bottom = window.innerHeight + window.scrollY >= document.documentElement.scrollHeight - 2;\n if (bottom && last && window.scrollY > 0) current = last;\n setActive(current);\n };\n const onScroll = () => {\n if (!frame) frame = window.requestAnimationFrame(update);\n };\n update();\n window.addEventListener(\"scroll\", onScroll, { passive: true, capture: true });\n return () => {\n window.removeEventListener(\"scroll\", onScroll, { capture: true });\n if (frame) window.cancelAnimationFrame(frame);\n };\n }, [ids]); // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <div\n data-slot=\"resource-settings-page\"\n className={cn(\"grid grid-cols-[minmax(0,1fr)] gap-6 md:grid-cols-[12rem_minmax(0,1fr)] lg:gap-8\", className)}\n >\n <nav aria-label={navLabel} className=\"min-w-0 md:sticky md:top-4 md:self-start\">\n <p className=\"mb-2 hidden text-xs font-medium uppercase tracking-wide text-muted-foreground md:block\">\n {navLabel}\n </p>\n <ul className=\"-mx-1 flex gap-1 overflow-x-auto px-1 md:mx-0 md:flex-col md:overflow-visible md:px-0\">\n {sections.map((s) => (\n <li key={s.id} className=\"shrink-0\">\n <a\n href={`#${s.id}`}\n aria-current={active === s.id ? \"location\" : undefined}\n onClick={(e) => {\n setActive(s.id);\n if (s.content === undefined && s.onSelect) {\n e.preventDefault();\n s.onSelect();\n }\n }}\n className={cn(\n \"flex items-center gap-2 whitespace-nowrap rounded-md px-3 py-1.5 text-sm text-muted-foreground hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring [&_svg]:size-4\",\n active === s.id && \"bg-muted font-medium text-foreground\",\n )}\n >\n {s.icon ? <span aria-hidden>{s.icon}</span> : null}\n {s.title}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n <div className=\"flex min-w-0 flex-col gap-5\">\n {sections\n .filter((s) => s.content !== undefined)\n .map((s) => (\n <SettingsSection key={s.id} id={s.id} icon={s.icon} title={s.title} description={s.description}>\n {s.content}\n </SettingsSection>\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useId, useState, type ReactNode } from \"react\";\nimport { Button } from \"../ui/button\";\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from \"../ui/dialog\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../ui/select\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../ui/tabs\";\nimport { Textarea } from \"../ui/textarea\";\nimport { toast } from \"../ui/sonner\";\nimport { Copy, ExternalLink, Printer } from \"lucide-react\";\nimport { embedSnippet, prefilledUrl, type PrefillChoice } from \"./share\";\n\nconst ANY = \"__any\";\n\nasync function copy(text: string, what: string) {\n try {\n await navigator.clipboard.writeText(text);\n toast.success(`${what} copied.`);\n } catch {\n toast.error(\"Couldn't copy. Select it and copy it instead.\");\n }\n}\n\nfunction CopyField({\n id,\n label,\n value,\n what,\n}: {\n id: string;\n label: string;\n value: string;\n what: string;\n}) {\n return (\n <div className=\"space-y-1.5\">\n <Label htmlFor={id}>{label}</Label>\n <div className=\"flex gap-2\">\n <Input id={id} readOnly value={value} onFocus={(e) => e.target.select()} />\n <Button\n variant=\"outline\"\n startIcon={<Copy className=\"size-4\" />}\n onClick={() => void copy(value, what)}\n >\n Copy\n </Button>\n </div>\n </div>\n );\n}\n\n/**\n * Sharing one published page (a form, a course, a worksheet), as Google Forms' Send step:\n * its link with Copy, a QR code (and a printable poster when the host has one), an\n * `<iframe>` to embed it on a website, and a builder for prefilled links\n * (`?location=…&staff=…`, or whatever the host offers).\n * Generic: the host passes the link, how to draw a QR code, and the prefill choices.\n */\nexport function ShareDialog({\n open,\n onOpenChange,\n noun = \"page\",\n title = `Share your ${noun}`,\n description = \"Anyone with the link can open it.\",\n url,\n posterUrl,\n renderQr,\n name,\n prefill = [],\n prefillNote,\n defaultTab = \"link\",\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Default \"Share your {noun}\". */\n title?: string | undefined;\n /** Default \"Anyone with the link can open it.\" */\n description?: ReactNode;\n /** The public link; null while it is still loading. */\n url: string | null;\n /** A printable poster for a link (the base link, or a prefilled one), when the host has one. */\n posterUrl?: ((url: string, prefill: Record<string, string>) => string | null) | undefined;\n /** Draws a QR code for a link. */\n renderQr?: ((url: string) => ReactNode) | undefined;\n /** Its name, for the embed's accessible title. */\n name: string;\n /** What it is, in the default title and buttons: \"page\" (default), \"form\", \"course\". */\n noun?: string | undefined;\n /** The search params a prefilled link may set, each with its choices. None hides the builder. */\n prefill?: readonly PrefillChoice[] | undefined;\n /** Said under the prefilled-link builder (what a prefilled link does). */\n prefillNote?: ReactNode;\n /** The tab it opens on (each time it opens). Default \"link\". */\n defaultTab?: \"link\" | \"qr\" | \"embed\" | undefined;\n}) {\n const id = useId();\n const [values, setValues] = useState<Record<string, string>>({});\n const chosen = Object.fromEntries(Object.entries(values).filter(([, v]) => v && v !== ANY));\n const prefilled = url && Object.keys(chosen).length ? prefilledUrl(url, chosen) : null;\n const poster = url ? posterUrl?.(url, {}) : null;\n const prefilledPoster = prefilled && url ? posterUrl?.(url, chosen) : null;\n const usable = prefill.filter((p) => p.options.length > 0);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-h-[90dvh] overflow-y-auto sm:max-w-lg\">\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n {!url ? (\n <p className=\"text-sm text-muted-foreground\">Loading the link…</p>\n ) : (\n <Tabs defaultValue={defaultTab === \"qr\" && !renderQr ? \"link\" : defaultTab}>\n <TabsList>\n <TabsTrigger value=\"link\">Link</TabsTrigger>\n {renderQr && <TabsTrigger value=\"qr\">QR code</TabsTrigger>}\n <TabsTrigger value=\"embed\">Embed</TabsTrigger>\n </TabsList>\n <TabsContent value=\"link\" className=\"space-y-5 pt-2\">\n <CopyField id={`${id}-link`} label=\"Link\" value={url} what=\"Link\" />\n <Button\n asChild\n variant=\"ghost\"\n size=\"sm\"\n startIcon={<ExternalLink className=\"size-4\" />}\n >\n <a href={url} target=\"_blank\" rel=\"noreferrer\">\n Open the {noun}\n </a>\n </Button>\n {usable.length > 0 && (\n <div className=\"space-y-3 border-t border-border pt-4\">\n <div>\n <p className=\"text-sm font-medium\">Prefilled link</p>\n {prefillNote && <p className=\"text-sm text-muted-foreground\">{prefillNote}</p>}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {usable.map((p) => (\n <Select\n key={p.key}\n value={values[p.key] ?? ANY}\n onValueChange={(v) => setValues((old) => ({ ...old, [p.key]: v }))}\n >\n <SelectTrigger className=\"min-w-40 flex-1\" aria-label={p.label}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ANY}>{p.anyLabel}</SelectItem>\n {p.options.map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ))}\n </div>\n {prefilled && (\n <>\n <CopyField\n id={`${id}-prefilled`}\n label=\"Prefilled link\"\n value={prefilled}\n what=\"Prefilled link\"\n />\n {prefilledPoster && (\n <Button\n asChild\n variant=\"outline\"\n startIcon={<Printer className=\"size-4\" />}\n >\n <a href={prefilledPoster} target=\"_blank\" rel=\"noreferrer\">\n Print a poster for this link\n </a>\n </Button>\n )}\n </>\n )}\n </div>\n )}\n </TabsContent>\n {renderQr && (\n <TabsContent value=\"qr\" className=\"space-y-4 pt-2\">\n <div className=\"mx-auto w-full max-w-56\">{renderQr(url)}</div>\n <p className=\"text-center text-sm text-muted-foreground\">\n Scan with a phone's camera to open the {noun}.\n </p>\n {poster && (\n <div className=\"flex justify-center\">\n <Button asChild variant=\"outline\" startIcon={<Printer className=\"size-4\" />}>\n <a href={poster} target=\"_blank\" rel=\"noreferrer\">\n Print a QR poster\n </a>\n </Button>\n </div>\n )}\n </TabsContent>\n )}\n <TabsContent value=\"embed\" className=\"space-y-3 pt-2\">\n <div className=\"space-y-1.5\">\n <Label htmlFor={`${id}-embed`}>Embed on your website</Label>\n <Textarea\n id={`${id}-embed`}\n readOnly\n rows={4}\n className=\"font-mono text-xs\"\n value={embedSnippet(url, name)}\n onFocus={(e) => e.target.select()}\n />\n </div>\n <Button\n variant=\"outline\"\n startIcon={<Copy className=\"size-4\" />}\n onClick={() => void copy(embedSnippet(url, name), \"Embed code\")}\n >\n Copy embed code\n </Button>\n </TabsContent>\n </Tabs>\n )}\n </DialogContent>\n </Dialog>\n );\n}\n"]}
@@ -1,17 +1,19 @@
1
1
  "use client";
2
- import { AppShell, PageHeader } from '../../chunk-5OFA2CQR.js';
2
+ import { AppShell, PageHeader } from '../../chunk-DTQHAZWN.js';
3
3
  export { ViewSettings, ViewToggle } from '../../chunk-46TZGMFW.js';
4
4
  import { slots_exports } from '../../chunk-WALJMVEF.js';
5
5
  import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from '../../chunk-N2ZFNOOT.js';
6
+ import { Progress } from '../../chunk-W5Y3LG5K.js';
7
+ import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from '../../chunk-XCGZPFT7.js';
8
+ import { Card, CardContent, CardHeader, CardTitle } from '../../chunk-FN3FZVUR.js';
9
+ import { Checkbox } from '../../chunk-SEBU6JCK.js';
10
+ import { AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction } from '../../chunk-4C4ESW6O.js';
6
11
  import { Textarea } from '../../chunk-YETMISCE.js';
7
12
  import { Separator } from '../../chunk-SXSCHWZU.js';
8
- import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from '../../chunk-XCGZPFT7.js';
9
13
  import { Skeleton } from '../../chunk-QFM4Z2SS.js';
10
- import { Progress } from '../../chunk-W5Y3LG5K.js';
11
- import { Checkbox } from '../../chunk-SEBU6JCK.js';
12
- import { Card, CardContent, CardHeader, CardTitle } from '../../chunk-FN3FZVUR.js';
13
14
  import { Input } from '../../chunk-QSXVL5UB.js';
14
- import { AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction } from '../../chunk-4C4ESW6O.js';
15
+ import { EmptyState } from '../../chunk-65SPT7EA.js';
16
+ export { EmptyState } from '../../chunk-65SPT7EA.js';
15
17
  import { PageLoading } from '../../chunk-YRYQXU3G.js';
16
18
  import { Spinner } from '../../chunk-OVU3Z2MT.js';
17
19
  import { useAnnouncer } from '../../chunk-I4NBE2KL.js';
@@ -21,15 +23,13 @@ import { Badge } from '../../chunk-NPNADZHM.js';
21
23
  import '../../chunk-G5YKBPBF.js';
22
24
  import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '../../chunk-FK42ZGGV.js';
23
25
  import { Popover, PopoverTrigger, PopoverContent } from '../../chunk-22XB3Q6H.js';
26
+ import { Button } from '../../chunk-NWSCYLPT.js';
24
27
  import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuCheckboxItem, DropdownMenuSeparator, DropdownMenuItem, DropdownMenuLabel } from '../../chunk-QJ6P2DW6.js';
25
28
  import { Switch } from '../../chunk-27ELYTGE.js';
26
29
  import '../../chunk-F47U5KNW.js';
27
30
  import { DetailPage } from '../../chunk-AFZ76Q26.js';
28
31
  import '../../chunk-D2LIXA2Y.js';
29
32
  import '../../chunk-AVFZ4P4B.js';
30
- import { EmptyState } from '../../chunk-65SPT7EA.js';
31
- export { EmptyState } from '../../chunk-65SPT7EA.js';
32
- import { Button } from '../../chunk-NWSCYLPT.js';
33
33
  import { showUndoToast, showWriteErrorToast, useResourceTableModel } from '../../chunk-STZVZUYO.js';
34
34
  export { showUndoToast, showWriteErrorToast, useResourceTable } from '../../chunk-STZVZUYO.js';
35
35
  import { titleCase } from '../../chunk-RKPS7ERS.js';
@@ -37,9 +37,9 @@ import '../../chunk-DIV4BYXX.js';
37
37
  export { useSavedViews } from '../../chunk-GCQFVMPI.js';
38
38
  import '../../chunk-PKFDGGZV.js';
39
39
  import '../../chunk-OZ7ZAYCS.js';
40
- import '../../chunk-4RAZJ6LL.js';
41
40
  export { CommandPalette, useCommandPaletteHotkey } from '../../chunk-CNTWQSUT.js';
42
41
  import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandSeparator } from '../../chunk-SEFK4NZV.js';
42
+ import '../../chunk-4RAZJ6LL.js';
43
43
  import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogDescription } from '../../chunk-7XMZVISM.js';
44
44
  import { cn } from '../../chunk-NZ5WBA4R.js';
45
45
  import { DefaultLink } from '../../chunk-J45FHL7D.js';
@@ -0,0 +1,96 @@
1
+ import * as React from 'react';
2
+
3
+ /**
4
+ * Props passed through to one slot's wrapper element: a class, a test id,
5
+ * any `data-*` or ARIA attribute.
6
+ */
7
+ type BuilderLayoutSlotProps = React.HTMLAttributes<HTMLElement> & {
8
+ [attribute: `data-${string}`]: string | undefined;
9
+ };
10
+ interface BuilderLayoutProps extends React.HTMLAttributes<HTMLDivElement> {
11
+ /**
12
+ * Left column: the list of things being built (questions, lessons, steps).
13
+ * Optional. Rendered as a `<nav>` when `outlineLabel` is set.
14
+ */
15
+ outline?: React.ReactNode;
16
+ /** Centre column: the editor for the selected thing. Required. */
17
+ editor: React.ReactNode;
18
+ /**
19
+ * Right column: a live preview (and anything that sits with it, such as
20
+ * checks). Optional. Rendered as an `<aside>` when `previewLabel` is set.
21
+ *
22
+ * It keeps its place in the tree whatever `editor` and `outline` hold, so
23
+ * swapping the editor (another section, another selected item) never
24
+ * remounts it: the preview's own state (device, answers typed into it,
25
+ * scroll) survives.
26
+ */
27
+ preview?: React.ReactNode;
28
+ /** Accessible name for the outline; makes it a `navigation` landmark. */
29
+ outlineLabel?: string | undefined;
30
+ /** Accessible name for the preview; makes it a `complementary` landmark. */
31
+ previewLabel?: string | undefined;
32
+ /**
33
+ * Keep the preview mounted but hidden, and give its width back to the
34
+ * editor. For a section that needs the whole width (a host's own
35
+ * settings layout) without losing the preview's state.
36
+ */
37
+ previewHidden?: boolean | undefined;
38
+ /**
39
+ * Pin the outline and/or the preview at the top while the editor scrolls,
40
+ * once each sits in a column of its own (not while stacked). `true` pins
41
+ * both. Default `false`.
42
+ */
43
+ sticky?: boolean | {
44
+ outline?: boolean | undefined;
45
+ preview?: boolean | undefined;
46
+ } | undefined;
47
+ /**
48
+ * With `sticky`, cap each pinned column at the viewport height and let it
49
+ * scroll on its own, so a long outline or preview stays reachable.
50
+ * Default `false`.
51
+ */
52
+ scrollSticky?: boolean | undefined;
53
+ /** Props for the outline's wrapper (class, test id, data attributes). */
54
+ outlineProps?: BuilderLayoutSlotProps | undefined;
55
+ /** Props for the editor's wrapper. */
56
+ editorProps?: BuilderLayoutSlotProps | undefined;
57
+ /** Props for the preview's wrapper. */
58
+ previewProps?: BuilderLayoutSlotProps | undefined;
59
+ }
60
+ /**
61
+ * BuilderLayout — the three columns of a builder: an outline of the parts on
62
+ * the left, the editor for the selected part in the centre, a live preview
63
+ * on the right.
64
+ *
65
+ * ```tsx
66
+ * <BuilderLayout
67
+ * outline={<QuestionList />}
68
+ * outlineLabel="Outline"
69
+ * editor={<QuestionEditor key={selectedId} />}
70
+ * preview={<LivePreview />}
71
+ * previewLabel="Preview"
72
+ * sticky
73
+ * />
74
+ * ```
75
+ *
76
+ * Responsive by container query, so it needs no knowledge of the page around
77
+ * it: all three columns from a 56rem container, wider side columns from
78
+ * 76rem, the preview under the editor below 56rem and everything stacked
79
+ * below 34rem (see `GRID` for each slot combination). The preview keeps its
80
+ * place in the tree when the editor or outline changes, so it never
81
+ * remounts; changing `previewLabel` between set and unset does remount it
82
+ * (the element changes from `<div>` to `<aside>`).
83
+ *
84
+ * It positions the three parts and nothing else. It does **not** own tabs,
85
+ * the app rail or a page header: those belong to the shell. Put a builder's
86
+ * sections in `useAppShellSubNav` (or your own tabs inside `editor`) and its
87
+ * title, status and actions in `AppShellPageHeader`. To keep one preview
88
+ * across sections, render one `BuilderLayout` around the sections and swap
89
+ * `editor`; nest a second one (outline and editor only) inside a section
90
+ * that has an outline.
91
+ *
92
+ * @stability Beta
93
+ */
94
+ declare const BuilderLayout: React.ForwardRefExoticComponent<BuilderLayoutProps & React.RefAttributes<HTMLDivElement>>;
95
+
96
+ export { BuilderLayout, type BuilderLayoutProps, type BuilderLayoutSlotProps };
@@ -0,0 +1,5 @@
1
+ export { BuilderLayout } from '../../chunk-TP6QNFDG.js';
2
+ import '../../chunk-NZ5WBA4R.js';
3
+ import '../../chunk-424PT5DM.js';
4
+ //# sourceMappingURL=builder-layout.js.map
5
+ //# sourceMappingURL=builder-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"builder-layout.js"}
@@ -5,13 +5,260 @@ export { DetailPage, DetailPageProps } from './detail-page.js';
5
5
  export { FormPage, FormPageProps } from './form-page.js';
6
6
  export { D as DashboardPage, a as DashboardPageProps, G as Grid, b as GridProps, g as gridVariants } from '../../dashboard-page-C0TihRl5.js';
7
7
  export { SettingsPage, SettingsPageProps, SettingsPageSection } from './settings-page.js';
8
- export { C as Container, a as ContainerProps, G as GAP_CLASSES, S as Section, b as SectionProps, c as SpaceToken, d as Stack, e as StackProps, f as containerVariants, s as sectionHeadingVariants, g as spaceScale, h as stackVariants } from '../../spacing-BS6qECD4.js';
8
+ export { BuilderLayout, BuilderLayoutProps, BuilderLayoutSlotProps } from './builder-layout.js';
9
+ import { a as ContainerProps } from '../../spacing-BS6qECD4.js';
10
+ export { C as Container, G as GAP_CLASSES, S as Section, b as SectionProps, c as SpaceToken, d as Stack, e as StackProps, f as containerVariants, s as sectionHeadingVariants, g as spaceScale, h as stackVariants } from '../../spacing-BS6qECD4.js';
9
11
  export { S as Split, a as SplitBreakpoint, b as SplitProps, c as SplitRatio, s as splitVariants } from '../../split-Dk9f4Mi0.js';
10
12
  export { Band, BandLead, BandLeadProps, BandProps, Display, DisplayProps, bandVariants, displayVariants, leadVariants } from './band.js';
13
+ import * as React from 'react';
14
+ import { Slots, SlotPropsFor } from '@marktiderman/genesis-core/slots';
11
15
  export { NavigationNode, ResolvedNavigation, resolveNavigation } from '@marktiderman/genesis-core/navigation';
12
- import 'react';
13
16
  import 'lucide-react';
14
17
  import '../../view-toggle-CahQ87PW.js';
15
18
  import '../../hooks/use-view-settings.js';
16
19
  import 'class-variance-authority/types';
17
20
  import 'class-variance-authority';
21
+
22
+ /**
23
+ * The brand block above the card. Same fields as native `AuthBrandingProps`
24
+ * (`logo`, `headline`, `subhead`), except that `headline` is required here:
25
+ * it is the page's `<h1>`.
26
+ */
27
+ interface AuthPageBrandingProps {
28
+ /** Brand mark (logo node). */
29
+ logo?: React.ReactNode;
30
+ /** "Sign in", "Reset your password", "You're invited". Renders as the page's h1. */
31
+ headline: React.ReactNode;
32
+ /** One line under the headline. */
33
+ subhead?: React.ReactNode;
34
+ testID?: string;
35
+ }
36
+ /** The parts of an {@link AuthPage} that `slots` and `slotProps` reach. Names match native `AuthScreenSlotMap`. */
37
+ type AuthPageSlotMap = {
38
+ branding: AuthPageBrandingProps & {
39
+ testID: string;
40
+ };
41
+ social: {
42
+ children: React.ReactNode;
43
+ testID: string;
44
+ };
45
+ footer: {
46
+ children: React.ReactNode;
47
+ testID: string;
48
+ };
49
+ };
50
+ interface AuthPageProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
51
+ /** Logo, headline (h1) and subhead above the card. */
52
+ branding: AuthPageBrandingProps;
53
+ /** Sign-in provider buttons (Google, Apple…), above the form inside the card. */
54
+ social?: React.ReactNode;
55
+ /** The form: sign-in, sign-up, reset, invite acceptance, verify. The card's body. */
56
+ children?: React.ReactNode;
57
+ /** Below the card: "Forgot password?", "Create account". */
58
+ footer?: React.ReactNode;
59
+ /** The small print under everything: terms and privacy. */
60
+ legal?: React.ReactNode;
61
+ /**
62
+ * A panel beside the card on wide screens (an illustration, a quote, a
63
+ * product shot). Hidden below the `lg` breakpoint, where the card is the
64
+ * whole page.
65
+ */
66
+ aside?: React.ReactNode;
67
+ /** Which side `aside` sits on. Default `"end"`. */
68
+ asidePosition?: "start" | "end";
69
+ /** Replace (a component) or drop (`null`) one part. */
70
+ slots?: Slots<AuthPageSlotMap>;
71
+ /** More props for a default part, merged over what the page passes. */
72
+ slotProps?: SlotPropsFor<AuthPageSlotMap>;
73
+ /** testID on the root. Default `"auth-page"`; parts use `${testID}-branding`, `-card`, `-social`, `-footer`, `-legal`, `-aside`. */
74
+ testID?: string;
75
+ }
76
+ /**
77
+ * AuthPage — the web counterpart of native `AuthScreen`: a whole-screen,
78
+ * centred card for sign-in, sign-up, password reset, invite acceptance and
79
+ * email verification.
80
+ *
81
+ * ```tsx
82
+ * <AuthPage
83
+ * branding={{ logo: <Logo />, headline: "Sign in", subhead: "Welcome back." }}
84
+ * footer={<><a href="/reset">Forgot password?</a> · <a href="/sign-up">Create account</a></>}
85
+ * legal={<>By continuing you agree to the <a href="/terms">terms</a>.</>}
86
+ * aside={<img src={hero} alt="" />}
87
+ * >
88
+ * <SignInForm />
89
+ * </AuthPage>
90
+ * ```
91
+ *
92
+ * The card column is a `<main>` landmark and the headline is its single
93
+ * `<h1>`, so a screen reader lands on the form's purpose. The page fills the
94
+ * viewport (`min-height: 100dvh`) and the card shrinks to the screen with a
95
+ * 16px gutter, so nothing scrolls sideways at 375px.
96
+ *
97
+ * Native `AuthScreen` takes `form` and `providers` as data and renders its
98
+ * own `AuthForm`; this one is a **layout**, so the form and the provider
99
+ * buttons are nodes the app passes. Slots are the same contract:
100
+ * replace or drop (`null`) `branding`, `social` or `footer`.
101
+ *
102
+ * @stability Beta
103
+ */
104
+ declare const AuthPage: React.ForwardRefExoticComponent<AuthPageProps & React.RefAttributes<HTMLDivElement>>;
105
+
106
+ /**
107
+ * Brand theming for public pages: a host's brand object becomes CSS
108
+ * variables on a page root, so every Genesis component inside it (a
109
+ * `Button`, a focus ring, a link styled `text-primary`) picks up the accent
110
+ * without knowing a brand exists.
111
+ *
112
+ * The accent is the one colour a public page takes from outside the token
113
+ * set, and it is the one most likely to be unreadable: brand palettes are
114
+ * picked for logos, not for 14px text. Emerald `#10b981` with white text is
115
+ * 2.5:1, half of WCAG AA's 4.5:1. So the accent is never used as-is for
116
+ * text or for a button's fill. {@link accessibleAccent} keeps its hue and
117
+ * saturation and lowers its lightness until white text on it (and it as
118
+ * text on white) clears 4.5:1; the raw accent stays available for
119
+ * decoration (`--brand-accent`: a header rule, a border).
120
+ *
121
+ * Variables set (all HSL triplets, the same shape as Genesis tokens, so
122
+ * `hsl(var(--x))` works everywhere):
123
+ *
124
+ * - `--brand-accent`: the accent exactly as given. Decoration only.
125
+ * - `--brand-accent-strong`: the accessible shade. Text and fills.
126
+ * - `--brand-accent-foreground`: text on `--brand-accent-strong`.
127
+ * - `--primary`, `--primary-foreground`, `--ring`: the Genesis tokens,
128
+ * pointed at the accessible shade, which is what makes nested components
129
+ * follow the brand.
130
+ */
131
+ /** What a host knows about the brand a public page belongs to. */
132
+ interface PublicBrand {
133
+ /** Display name, shown in the header and used as the logo's alt text. */
134
+ name: string;
135
+ /** Logo image URL. */
136
+ logoUrl?: string;
137
+ /** Accent colour: `#rgb`, `#rrggbb` or `rgb(r, g, b)`. Invalid or absent: Genesis's own primary. */
138
+ accent?: string;
139
+ /** Optional wide cover image above the header row. Decorative. */
140
+ headerImageUrl?: string;
141
+ }
142
+ /** An sRGB colour, 0-255 per channel. */
143
+ interface Rgb {
144
+ r: number;
145
+ g: number;
146
+ b: number;
147
+ }
148
+ /** WCAG AA for normal-size text. */
149
+ declare const MIN_TEXT_CONTRAST = 4.5;
150
+ /** Parses `#rgb`, `#rrggbb` or `rgb(r, g, b)` / `rgb(r g b)`. Anything else: `null`. */
151
+ declare function parseColor(input: string | undefined | null): Rgb | null;
152
+ /** WCAG 2 relative luminance, 0 (black) to 1 (white). */
153
+ declare function relativeLuminance({ r, g, b }: Rgb): number;
154
+ /** WCAG 2 contrast ratio between two colours, 1 to 21. */
155
+ declare function contrastRatio(a: Rgb, b: Rgb): number;
156
+ /** The Genesis token shape: `"160 84% 39%"`, for `hsl(var(--x))`. */
157
+ declare function toHslTriplet(color: Rgb): string;
158
+ interface AccessibleAccent {
159
+ /** The accent as given. */
160
+ accent: Rgb;
161
+ /** The shade to use for text on white and for fills under white text. Equals `accent` when it already passes. */
162
+ strong: Rgb;
163
+ /** Contrast of the given accent against the background. */
164
+ ratio: number;
165
+ /** Contrast of `strong` against the background (at least `minRatio`). */
166
+ strongRatio: number;
167
+ /** True when `strong` had to be darkened from `accent`. */
168
+ adjusted: boolean;
169
+ }
170
+ /**
171
+ * The contrast fallback. Returns the accent unchanged when it reaches
172
+ * `minRatio` against `background` (white by default); otherwise the same hue
173
+ * and saturation at the highest lightness that does. The search walks
174
+ * lightness down in 0.5% steps, so the shade stays as close to the brand as
175
+ * the ratio allows, and it always ends: lightness 0 is black, 21:1.
176
+ */
177
+ declare function accessibleAccent(accent: Rgb | string, { background, minRatio }?: {
178
+ background?: Rgb;
179
+ minRatio?: number;
180
+ }): AccessibleAccent | null;
181
+ /**
182
+ * The CSS variables for a brand's accent, for a page root's `style`. Empty
183
+ * when the brand has no valid accent, so the page keeps Genesis's primary.
184
+ */
185
+ declare function brandThemeStyle(brand: Pick<PublicBrand, "accent"> | undefined): React.CSSProperties;
186
+
187
+ /** The parts of a {@link PublicPage} that `slots` and `slotProps` reach. */
188
+ type PublicPageSlotMap = {
189
+ header: {
190
+ brand: PublicBrand;
191
+ testID: string;
192
+ };
193
+ footer: {
194
+ children: React.ReactNode;
195
+ poweredBy?: React.ReactNode;
196
+ testID: string;
197
+ };
198
+ };
199
+ interface PublicPageProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
200
+ /**
201
+ * The brand the page belongs to. Its header (logo, name, cover image) shows
202
+ * at the top, and its `accent` themes the page: see `brandThemeStyle`.
203
+ */
204
+ brand?: PublicBrand;
205
+ /** Optional page heading, rendered as the page's `<h1>` above the content. Leave it out when the content brings its own (a form's title). */
206
+ title?: React.ReactNode;
207
+ /** Supporting copy under `title`. */
208
+ description?: React.ReactNode;
209
+ /** Width of the content column: a `Container` size. Default `"sm"`. */
210
+ maxWidth?: NonNullable<ContainerProps["size"]>;
211
+ /**
212
+ * Who runs the page, as "Powered by …" in the footer (a name or a link).
213
+ * Leave it out, or pass `false`, to hide it.
214
+ */
215
+ poweredBy?: React.ReactNode;
216
+ /** More footer content: privacy and terms links, an address. */
217
+ footer?: React.ReactNode;
218
+ /**
219
+ * For an iframe: no header or footer chrome, a transparent background and
220
+ * no full-viewport height, so the frame is as tall as its content. The
221
+ * brand accent still applies. A host usually sets it from `?embed=1`.
222
+ */
223
+ embedded?: boolean;
224
+ /** Replace (a component) or drop (`null`) the header or footer. */
225
+ slots?: Slots<PublicPageSlotMap>;
226
+ /** More props for a default part, merged over what the page passes. */
227
+ slotProps?: SlotPropsFor<PublicPageSlotMap>;
228
+ /** testID on the root. Default `"public-page"`; parts use `${testID}-header`, `-main`, `-footer`. */
229
+ testID?: string;
230
+ }
231
+ /**
232
+ * PublicPage — a page anyone can open without signing in: a public form, a
233
+ * QR poster, a landing page. A brand header, one content column, and a
234
+ * "Powered by …" footer, themed from a brand object.
235
+ *
236
+ * ```tsx
237
+ * <PublicPage
238
+ * brand={{ name: "Riverside Physio", logoUrl, accent: "#10b981" }}
239
+ * poweredBy={<a href="https://example.com">Example</a>}
240
+ * embedded={searchParams.get("embed") === "1"}
241
+ * >
242
+ * <Form … />
243
+ * </PublicPage>
244
+ * ```
245
+ *
246
+ * The brand's accent becomes `--primary` (darkened when it fails 4.5:1 on
247
+ * white) on the page root, so a `Button` or link inside follows the brand
248
+ * with no props. The check is against white, Genesis's light background;
249
+ * under a `.dark` theme the fill stays readable (white on the shade) but
250
+ * accent-coloured text may not, so public pages are best served light.
251
+ *
252
+ * `embedded` is the frame-ancestors case. It drops the header and footer,
253
+ * the background and `min-height: 100dvh` (inside an iframe the viewport is
254
+ * the frame, so a full-height page would never let the frame shrink to its
255
+ * content).
256
+ *
257
+ * This is a **layout**: it positions content and binds to nothing. The
258
+ * content column is a `Container` for the one-home reason.
259
+ *
260
+ * @stability Beta
261
+ */
262
+ declare const PublicPage: React.ForwardRefExoticComponent<PublicPageProps & React.RefAttributes<HTMLDivElement>>;
263
+
264
+ export { type AccessibleAccent, AuthPage, type AuthPageBrandingProps, type AuthPageProps, type AuthPageSlotMap, ContainerProps, MIN_TEXT_CONTRAST, type PublicBrand, PublicPage, type PublicPageProps, type PublicPageSlotMap, type Rgb, accessibleAccent, brandThemeStyle, contrastRatio, parseColor, relativeLuminance, toHslTriplet };