@churnkey/react 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-F4ESJBOS.js → chunk-5EQ6CIJK.js} +6 -4
- package/dist/chunk-5EQ6CIJK.js.map +1 -0
- package/dist/{chunk-SNTKIKHU.cjs → chunk-MDLWWG2S.cjs} +34 -20
- package/dist/chunk-MDLWWG2S.cjs.map +1 -0
- package/dist/{chunk-4BMB42WI.cjs → chunk-PATKEQOP.cjs} +9 -7
- package/dist/chunk-PATKEQOP.cjs.map +1 -0
- package/dist/{chunk-QYNW3HF3.js → chunk-R65FT3QP.js} +34 -20
- package/dist/chunk-R65FT3QP.js.map +1 -0
- package/dist/core.cjs +5 -5
- package/dist/core.d.cts +6 -5
- package/dist/core.d.ts +6 -5
- package/dist/core.js +1 -1
- package/dist/headless.cjs +3 -3
- package/dist/headless.d.cts +1 -1
- package/dist/headless.d.ts +1 -1
- package/dist/headless.js +2 -2
- package/dist/index.cjs +19 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +14 -5
- package/dist/index.js.map +1 -1
- package/dist/{step-graph-DKvaV3Dg.d.cts → step-graph-C1N_lZAr.d.cts} +13 -2
- package/dist/{step-graph-DKvaV3Dg.d.ts → step-graph-C1N_lZAr.d.ts} +13 -2
- package/dist/styles.css +8 -1
- package/package.json +1 -1
- package/dist/chunk-4BMB42WI.cjs.map +0 -1
- package/dist/chunk-F4ESJBOS.js.map +0 -1
- package/dist/chunk-QYNW3HF3.js.map +0 -1
- package/dist/chunk-SNTKIKHU.cjs.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/rich-text.tsx","../src/components/steps/default-confirm.tsx","../src/components/steps/default-feedback.tsx","../src/components/steps/offer/default-contact-offer.tsx","../src/components/steps/offer/default-discount-offer.tsx","../src/components/steps/offer/default-pause-offer.tsx","../src/components/steps/shared.tsx","../src/components/steps/offer/default-plan-change-offer.tsx","../src/components/steps/offer/default-rebate-offer.tsx","../src/components/steps/offer/default-redirect-offer.tsx","../src/components/steps/offer/default-trial-extension-offer.tsx","../src/components/steps/default-offer.tsx","../src/components/steps/default-success.tsx","../src/components/steps/default-survey.tsx","../src/components/structural/default-back-button.tsx","../src/components/structural/default-close-button.tsx","../src/components/structural/default-modal.tsx","../src/components/use-color-scheme.ts","../src/components/cancel-flow.tsx"],"names":["jsx","jsxs","useState","useEffect"],"mappings":";;;;;;;;AAeO,SAAS,SAAS,EAAE,IAAA,EAAM,EAAA,GAAK,GAAA,EAAK,WAAU,EAAkB;AACrE,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,MAAM,GAAA,GAAM,EAAA;AACZ,EAAA,uBACE,GAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MAEA,uBAAA,EAAyB,EAAE,MAAA,EAAQ,IAAA;AAAK;AAAA,GAC1C;AAEJ;ACpBO,SAAS,cAAA,CAAe;AAAA,EAC7B,KAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,IAAK,OAAO,MAAA,GAAS,CAAA;AAC3D,EAAA,MAAM,SAAA,GAAY,gBAAgB,aAAa,CAAA;AAC/C,EAAA,4BACG,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,yBAAA,EAA2B,UAAA,EAAY,IAAI,CAAA,EAC5D,QAAA,EAAA;AAAA,oBAAAA,GAAAA,CAAC,QAAG,SAAA,EAAW,EAAA,CAAG,iBAAiB,UAAA,EAAY,KAAK,GAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAC7D,WAAA,oBAAeA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,WAAA,EAAa,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,UAAA,EAAY,WAAW,CAAA,EAAG,CAAA;AAAA,IAE3G,SAAA,yBACE,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,eAAA,EAAiB,UAAA,EAAY,QAAQ,CAAA,EACtD,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,iBAAiB,UAAA,EAAY,SAAS,CAAA,EAAI,QAAA,EAAA,WAAA,IAAe,wBAAA,EAAyB,CAAA;AAAA,sBACrGA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,cAAA,EACX,iBAAO,GAAA,CAAI,CAAC,IAAA,qBACX,IAAA,CAAC,QAAc,SAAA,EAAW,EAAA,CAAG,cAAA,EAAgB,UAAA,EAAY,QAAQ,CAAA,EAC/D,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,SAAA,EAAW,GAAG,gBAAA,EAAkB,UAAA,EAAY,UAAU,CAAA,EAAG,QAAA,EAAA,QAAA,EAE3E,CAAA;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,EAAK;AAAA,OAAA,EAAA,EAJL,IAKT,CACD,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,IAGD,SAAA,yBACE,GAAA,EAAA,EAAE,SAAA,EAAW,GAAG,eAAA,EAAiB,UAAA,EAAY,eAAe,CAAA,EAAG,QAAA,EAAA;AAAA,MAAA,8BAAA;AAAA,MAA6B,SAAA;AAAA,MAAU;AAAA,KAAA,EAAC,CAAA;AAAA,oBAG1GA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAW,EAAA,CAAG,4BAAA,EAA8B,UAAA,EAAY,aAAa,CAAA;AAAA,QACrE,OAAA,EAAS,SAAA;AAAA,QACT,QAAA,EAAU,YAAA;AAAA,QAET,yBAAe,eAAA,GAAkB;AAAA;AAAA,KACpC;AAAA,oBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,UAAA,EAAY,YAAY,CAAA,EAAG,OAAA,EAAS,UACvF,QAAA,EAAA,WAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;ACrDO,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,SAAS,SAAA,GAAY,CAAA;AAC3B,EAAA,MAAM,aAAa,MAAA,IAAU,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,MAAM,MAAA,GAAS,SAAA;AAChE,EAAA,MAAM,OAAA,GAAU,CAAC,QAAA,IAAY,KAAA,CAAM,MAAA,IAAU,SAAA;AAC7C,EAAA,MAAM,eAAA,GAAkB,WAAA,KAAgB,MAAA,GAAS,CAAA,SAAA,EAAY,SAAS,CAAA,iBAAA,CAAA,GAAiB,0BAAA,CAAA;AAEvF,EAAA,uBACEC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,0BAAA,EAA4B,UAAA,EAAY,IAAI,CAAA,EAC7D,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,QAAG,SAAA,EAAW,EAAA,CAAG,iBAAiB,UAAA,EAAY,KAAK,GAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAC7D,WAAA,oBAAeA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,WAAA,EAAa,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,UAAA,EAAY,WAAW,CAAA,EAAG,CAAA;AAAA,oBAE5GC,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,mBAAA;AAAA,UACA,OAAA,IAAW,4BAAA;AAAA,UACX,UAAA,IAAc;AAAA,SAChB;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA,CAAG,aAAA,EAAe,UAAA,EAAY,QAAQ,CAAA;AAAA,cACjD,WAAA,EAAa,eAAA;AAAA,cACb,KAAA;AAAA,cACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cACxC,OAAA,EAAS,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,cAC9B,MAAA,EAAQ,MAAM,UAAA,CAAW,KAAK,CAAA;AAAA,cAC9B,IAAA,EAAM;AAAA;AAAA,WACR;AAAA,UACC,0BACCC,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,oBAAA;AAAA,gBACA,UAAA,IAAc,6BAAA;AAAA,gBACd,UAAA,EAAY;AAAA,eACd;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,KAAA,CAAM,MAAA;AAAA,gBAAO,KAAA;AAAA,gBAAI;AAAA;AAAA;AAAA;AACpB;AAAA;AAAA,KAEJ;AAAA,oBAEAD,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,UAAA,EAAY,YAAY,CAAA;AAAA,QACrE,OAAA,EAAS,QAAA;AAAA,QACT,UAAU,CAAC,OAAA;AAAA,QACZ,QAAA,EAAA;AAAA;AAAA;AAED,GAAA,EACF,CAAA;AAEJ;AC1DO,SAAS,mBAAA,CAAoB;AAAA,EAClC,KAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,QAAA,GAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,QAAA;AACrC,EAAA,MAAM,IAAA,GAAO,WAAA,IAAe,KAAA,CAAM,IAAA,CAAK,IAAA;AAEvC,EAAA,uBACEC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,uBAAA,EAAyB,UAAA,EAAY,IAAI,CAAA,EACzD,QAAA,EAAA;AAAA,IAAA,QAAA,oBAAYD,IAAC,IAAA,EAAA,EAAG,SAAA,EAAW,GAAG,eAAA,EAAiB,UAAA,EAAY,KAAK,CAAA,EAAI,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,IAC7E,IAAA,oBAAQA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,UAAA,EAAY,WAAW,CAAA,EAAG,CAAA;AAAA,oBAE9FC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,eAAA,EAAiB,UAAA,EAAY,IAAI,CAAA,EAClD,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,UAAA,EAAY,YAAY,CAAA;AAAA,UACrE,OAAA,EAAS,MAAM,QAAA,EAAS;AAAA,UACxB,QAAA,EAAU,YAAA;AAAA,UAET,QAAA,EAAA,YAAA,GAAe,eAAA,GAAkB,KAAA,CAAM,IAAA,CAAK;AAAA;AAAA,OAC/C;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,UAAA,EAAY,aAAa,CAAA,EAAG,OAAA,EAAS,SAAA,EACxF,QAAA,EAAA,KAAA,CAAM,KAAK,UAAA,EACd;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACnCO,SAAS,oBAAA,CAAqB;AAAA,EACnC,KAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,CAAA,GAAI,KAAA;AAMV,EAAA,MAAM,QAAA,GAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,QAAA;AACrC,EAAA,MAAM,IAAA,GAAO,WAAA,IAAe,KAAA,CAAM,IAAA,CAAK,IAAA;AACvC,EAAA,MAAM,MAAA,GAAS,eAAe,CAAC,CAAA;AAE/B,EAAA,uBACEC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,uBAAA,EAAyB,UAAA,EAAY,IAAI,CAAA,EACzD,QAAA,EAAA;AAAA,IAAA,QAAA,oBAAYD,IAAC,IAAA,EAAA,EAAG,SAAA,EAAW,GAAG,eAAA,EAAiB,UAAA,EAAY,KAAK,CAAA,EAAI,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,IAC7E,IAAA,oBAAQA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,UAAA,EAAY,WAAW,CAAA,EAAG,CAAA;AAAA,oBAE9FC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,eAAA,EAAiB,UAAA,EAAY,IAAI,CAAA,EAClD,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,oBAAA,EAAkB,CAAA;AAAA,wBAC7DA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAA4B,QAAA,EAAA,MAAA,EAAO;AAAA,OAAA,EACpD,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,UAAA,EAAY,YAAY,CAAA;AAAA,UACrE,OAAA,EAAS,MAAM,QAAA,EAAS;AAAA,UACxB,QAAA,EAAU,YAAA;AAAA,UAET,QAAA,EAAA,YAAA,GAAe,eAAA,GAAkB,KAAA,CAAM,IAAA,CAAK;AAAA;AAAA,OAC/C;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,UAAA,EAAY,aAAa,CAAA,EAAG,OAAA,EAAS,SAAA,EACxF,QAAA,EAAA,KAAA,CAAM,KAAK,UAAA,EACd;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC1CO,SAAS,iBAAA,CAAkB;AAAA,EAChC,KAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAE,MAAM,CAAA;AAChC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIE,SAAiB,CAAC,CAAA;AAE9C,EAAA,MAAM,QAAA,GAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,QAAA;AACrC,EAAA,MAAM,IAAA,GAAO,WAAA,IAAe,KAAA,CAAM,IAAA,CAAK,IAAA;AAEvC,EAAA,MAAM,MAAA,uBAAa,IAAA,EAAK;AACxB,EAAA,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,QAAA,EAAS,GAAI,MAAM,CAAA;AAC1C,EAAA,MAAM,UAAA,GAAa,mBAAmB,MAAM,CAAA;AAE5C,EAAA,uBACED,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,uBAAA,EAAyB,UAAA,EAAY,IAAI,CAAA,EACzD,QAAA,EAAA;AAAA,IAAA,QAAA,oBAAYD,IAAC,IAAA,EAAA,EAAG,SAAA,EAAW,GAAG,eAAA,EAAiB,UAAA,EAAY,KAAK,CAAA,EAAI,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,IAC7E,IAAA,oBAAQA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,UAAA,EAAY,WAAW,CAAA,EAAG,CAAA;AAAA,oBAE9FC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,6BAAA,EAA+B,UAAA,EAAY,IAAI,CAAA,EAChE,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAmB,QAAA,EAAA,uBAAA,EAA0B,CAAA;AAAA,sBAC5DA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAiB,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,sBAC3CA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,kBAAkB,UAAA,EAAY,WAAW,CAAA,EACzD,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,QAAQ,GAAA,EAAI,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,qBACjDC,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,SAAA,CAAU,CAAC,CAAA;AAAA,UAC1B,SAAA,EAAW,EAAA,CAAG,eAAA,EAAiB,CAAA,KAAM,UAAU,yBAAyB,CAAA;AAAA,UACxE,gBAAc,CAAA,KAAM,MAAA;AAAA,UAEnB,QAAA,EAAA;AAAA,YAAA,CAAA;AAAA,YAAE,GAAA;AAAA,YAAE,CAAA,KAAM,IAAI,OAAA,GAAU;AAAA;AAAA,SAAA;AAAA,QANpB;AAAA,OAQR,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBACAD,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,UAAA,EAAY,YAAY,CAAA;AAAA,QACrE,OAAA,EAAS,MAAM,QAAA,CAAS,EAAE,QAAQ,CAAA;AAAA,QAClC,QAAA,EAAU,YAAA;AAAA,QAET,QAAA,EAAA,YAAA,GAAe,eAAA,GAAkB,KAAA,CAAM,IAAA,CAAK;AAAA;AAAA,KAC/C;AAAA,oBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,UAAA,EAAY,aAAa,CAAA,EAAG,OAAA,EAAS,SAAA,EACxF,QAAA,EAAA,KAAA,CAAM,KAAK,UAAA,EACd;AAAA,GAAA,EACF,CAAA;AAEJ;AC7DO,SAAS,UAAU,EAAE,KAAA,GAAQ,cAAA,EAAgB,IAAA,GAAO,IAAG,EAAsC;AAClG,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,aAAA,EAAY,MAAA,EAC1E,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oBAAA,EAAqB,MAAA,EAAQ,KAAA,EAAO,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAC3G,CAAA;AAEJ;ACCO,SAAS,sBAAA,CAAuB;AAAA,EACrC,KAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,EAAC;AAG1B,EAAA,MAAM,gBAAgB,aAAA,CAAc,CAAC,GAAG,KAAA,CAAM,CAAC,GAAG,KAAA,CAAM,EAAA;AACxD,EAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,aAAa,CAAA,EAAG,EAAA,IAAM,IAAA;AACvE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIE,SAAwB,aAAa,CAAA;AACjF,EAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,cAAc,CAAA,IAAK,IAAA;AAEnE,EAAA,MAAM,QAAA,GAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,QAAA;AACrC,EAAA,MAAM,IAAA,GAAO,WAAA,IAAe,KAAA,CAAM,IAAA,CAAK,IAAA;AACvC,EAAA,MAAM,QAAA,GAAW,YAAA,GACb,eAAA,GACA,YAAA,EAAc,IAAA,GACZ,aAAa,YAAA,CAAa,IAAI,CAAA,CAAA,GAC9B,KAAA,CAAM,IAAA,CAAK,GAAA;AAEjB,EAAA,uBACED,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,uBAAA,EAAyB,UAAA,EAAY,IAAI,CAAA,EACzD,QAAA,EAAA;AAAA,IAAA,QAAA,oBAAYD,IAAC,IAAA,EAAA,EAAG,SAAA,EAAW,GAAG,eAAA,EAAiB,UAAA,EAAY,KAAK,CAAA,EAAI,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,IAC7E,IAAA,oBAAQA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,UAAA,EAAY,WAAW,CAAA,EAAG,CAAA;AAAA,oBAE9FC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,eAAA,EAAiB,UAAA,EAAY,IAAI,CAAA,EAClD,QAAA,EAAA;AAAA,sBAAAD,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,EAAU,QAAA,IAAY,OAAA;AAC5C,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,QAAA,IAAY,KAAA;AACzC,QAAA,MAAM,UAAA,GAAa,KAAK,EAAA,KAAO,cAAA;AAC/B,QAAA,MAAM,SAAA,GAAY,KAAK,EAAA,KAAO,aAAA;AAE9B,QAAA,uBACEC,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YAEL,OAAA,EAAS,MAAM,iBAAA,CAAkB,IAAA,CAAK,EAAE,CAAA;AAAA,YACxC,QAAA,EAAU,SAAA;AAAA,YACV,SAAA,EAAW,EAAA;AAAA,cACT,cAAA;AAAA,cACA,UAAA,IAAc,wBAAA;AAAA,cACd,SAAA,IAAa;AAAA,aACf;AAAA,YACA,cAAA,EAAc,UAAA;AAAA,YAEd,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,EAAA;AAAA,gBAClB,6BAAaD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,SAAA,EAAO;AAAA,eAAA,EAC/D,CAAA;AAAA,cACC,IAAA,CAAK,2BAAWA,GAAAA,CAAC,SAAI,SAAA,EAAU,iBAAA,EAAmB,eAAK,OAAA,EAAQ,CAAA;AAAA,8BAEhEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,EAAA;AAAA,gCAAAD,GAAAA,CAAC,UAAK,SAAA,EAAU,gBAAA,EAAkB,+BAAqB,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,QAAQ,CAAA,EAAE,CAAA;AAAA,gCACpFC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAiB,QAAA,EAAA;AAAA,kBAAA,GAAA;AAAA,kBAAE;AAAA,iBAAA,EAAS,CAAA;AAAA,gBAC3C,IAAA,CAAK,wBAAQD,GAAAA,CAAC,UAAK,SAAA,EAAU,cAAA,EAAgB,eAAK,IAAA,EAAK;AAAA,eAAA,EAC1D,CAAA;AAAA,cAEC,IAAA,CAAK,YAAY,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,oBACvCA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oBACX,QAAA,EAAA,IAAA,CAAK,QAAA,CAAS,IAAI,CAAC,OAAA,EAAS,sBAC3BC,IAAAA,CAAC,IAAA,EAAA,EAAmC,SAAA,EAAU,iBAAA,EAC5C,QAAA,EAAA;AAAA,gCAAAD,GAAAA,CAAC,UAAK,SAAA,EAAU,uBAAA,EACd,0BAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAM,EAAA,EAAI,CAAA,EACvB,CAAA;AAAA,gBACC;AAAA,eAAA,EAAA,EAJM,GAAG,IAAA,CAAK,EAAE,YAAY,CAAC,CAAA,CAKhC,CACD,CAAA,EACH;AAAA;AAAA,WAAA;AAAA,UAhCG,IAAA,CAAK;AAAA,SAkCZ;AAAA,MAEJ,CAAC,CAAA,EACH,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,UAAA,EAAY,YAAY,CAAA;AAAA,UACrE,SAAS,MAAM,cAAA,IAAkB,SAAS,EAAE,MAAA,EAAQ,gBAAgB,CAAA;AAAA,UACpE,QAAA,EAAU,gBAAgB,CAAC,cAAA;AAAA,UAE1B,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,UAAA,EAAY,aAAa,CAAA,EAAG,OAAA,EAAS,SAAA,EACxF,QAAA,EAAA,KAAA,CAAM,KAAK,UAAA,EACd;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC1FO,SAAS,kBAAA,CAAmB;AAAA,EACjC,KAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,MAAM,QAAA,GAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,QAAA;AACrC,EAAA,MAAM,IAAA,GAAO,WAAA,IAAe,KAAA,CAAM,IAAA,CAAK,IAAA;AACvC,EAAA,MAAM,QAAA,GAAW,EAAE,QAAA,IAAY,KAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,EAAE,WAAA,IAAe,CAAA;AAEhC,EAAA,uBACEC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,uBAAA,EAAyB,UAAA,EAAY,IAAI,CAAA,EACzD,QAAA,EAAA;AAAA,IAAA,QAAA,oBAAYD,IAAC,IAAA,EAAA,EAAG,SAAA,EAAW,GAAG,eAAA,EAAiB,UAAA,EAAY,KAAK,CAAA,EAAI,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,IAC7E,IAAA,oBAAQA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,UAAA,EAAY,WAAW,CAAA,EAAG,CAAA;AAAA,oBAE9FC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,eAAA,EAAiB,UAAA,EAAY,IAAI,CAAA,EAKlD,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,CAAA,CAAE,mBAAmB,IAAA,oBACpBA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,UAAK,QAAA,EAAA,sBAAA,EAAoB,CAAA;AAAA,0BAC1BA,GAAAA,CAAC,MAAA,EAAA,EAAM,+BAAqB,CAAA,CAAE,eAAA,EAAiB,QAAQ,CAAA,EAAE;AAAA,SAAA,EAC3D,CAAA;AAAA,wBAEFC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,UAAK,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,0BACzBC,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,YAAA,QAAA;AAAA,YAAE,oBAAA,CAAqB,QAAQ,QAAQ;AAAA,WAAA,EAAE;AAAA,SAAA,EACjD,CAAA;AAAA,QACC,EAAE,mBAAA,IAAuB,IAAA,oBACxBA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2CAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,UAAK,QAAA,EAAA,0BAAA,EAAwB,CAAA;AAAA,0BAC9BA,GAAAA,CAAC,MAAA,EAAA,EAAM,+BAAqB,CAAA,CAAE,mBAAA,EAAqB,QAAQ,CAAA,EAAE;AAAA,SAAA,EAC/D;AAAA,OAAA,EAEJ,CAAA;AAAA,sBAEAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,UAAA,EAAY,YAAY,CAAA;AAAA,UACrE,OAAA,EAAS,MAAM,QAAA,EAAS;AAAA,UACxB,QAAA,EAAU,YAAA;AAAA,UAET,QAAA,EAAA,YAAA,GAAe,eAAA,GAAkB,KAAA,CAAM,IAAA,CAAK;AAAA;AAAA,OAC/C;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,UAAA,EAAY,aAAa,CAAA,EAAG,OAAA,EAAS,SAAA,EACxF,QAAA,EAAA,KAAA,CAAM,KAAK,UAAA,EACd;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AClEO,SAAS,qBAAqB,EAAE,KAAA,EAAO,aAAa,KAAA,EAAO,SAAA,EAAW,YAAW,EAAmB;AACzG,EAAA,MAAM,MAAO,KAAA,CAA0C,GAAA;AACvD,EAAA,MAAM,QAAA,GAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,QAAA;AACrC,EAAA,MAAM,IAAA,GAAO,WAAA,IAAe,KAAA,CAAM,IAAA,CAAK,IAAA;AAEvC,EAAA,uBACEC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,uBAAA,EAAyB,UAAA,EAAY,IAAI,CAAA,EACzD,QAAA,EAAA;AAAA,IAAA,QAAA,oBAAYD,IAAC,IAAA,EAAA,EAAG,SAAA,EAAW,GAAG,eAAA,EAAiB,UAAA,EAAY,KAAK,CAAA,EAAI,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,IAC7E,IAAA,oBAAQA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,UAAA,EAAY,WAAW,CAAA,EAAG,CAAA;AAAA,oBAE9FC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,eAAA,EAAiB,UAAA,EAAY,IAAI,CAAA,EAClD,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,0BAAAC,IAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,GAAA,EAAK,MAAA,EAAO,QAAA,EAAS,GAAA,EAAI,qBAAA,EAAsB,WAAU,kBAAA,EAChE,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CAAA;AAAA,wBACtBA,IAAC,YAAA,EAAA,EAAa;AAAA,OAAA,EAChB,CAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,UAAA,EAAY,aAAa,CAAA,EAAG,OAAA,EAAS,SAAA,EACxF,QAAA,EAAA,KAAA,CAAM,KAAK,UAAA,EACd;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,YAAA,GAAe;AACtB,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA,EAAU,kBAAA;AAAA,MACV,aAAA,EAAY,MAAA;AAAA,MAEZ,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0DAAA,EAA2D,CAAA;AAAA,wBACnEA,GAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,gBAAA,EAAiB,CAAA;AAAA,wBAClCA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI;AAAA;AAAA;AAAA,GACvC;AAEJ;AC3CO,SAAS,0BAAA,CAA2B;AAAA,EACzC,KAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,MAAM,QAAA,GAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,QAAA;AACrC,EAAA,MAAM,IAAA,GAAO,WAAA,IAAe,KAAA,CAAM,IAAA,CAAK,IAAA;AACvC,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,OAAA,EAAQ,GAAI,EAAE,IAAI,CAAA;AAClC,EAAA,MAAM,MAAA,GAAS,eAAe,GAAG,CAAA;AAEjC,EAAA,uBACEC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,uBAAA,EAAyB,UAAA,EAAY,IAAI,CAAA,EACzD,QAAA,EAAA;AAAA,IAAA,QAAA,oBAAYD,IAAC,IAAA,EAAA,EAAG,SAAA,EAAW,GAAG,eAAA,EAAiB,UAAA,EAAY,KAAK,CAAA,EAAI,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,IAC7E,IAAA,oBAAQA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,UAAA,EAAY,WAAW,CAAA,EAAG,CAAA;AAAA,oBAE9FC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,eAAA,EAAiB,UAAA,EAAY,IAAI,CAAA,EAClD,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA;AAAA,YAAA,GAAA;AAAA,YAAE,CAAA,CAAE;AAAA,WAAA,EAAK,CAAA;AAAA,0BACxCD,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAiB,QAAA,EAAA,CAAA,CAAE,IAAA,KAAS,CAAA,GAAI,KAAA,GAAQ,MAAA,EAAO;AAAA,SAAA,EAChE,CAAA;AAAA,wBACAC,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,0BAChDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAqB,QAAA,EAAA,MAAA,EAAO;AAAA,SAAA,EAC7C;AAAA,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,UAAA,EAAY,YAAY,CAAA;AAAA,UACrE,OAAA,EAAS,MAAM,QAAA,EAAS;AAAA,UACxB,QAAA,EAAU,YAAA;AAAA,UAET,QAAA,EAAA,YAAA,GAAe,eAAA,GAAkB,KAAA,CAAM,IAAA,CAAK;AAAA;AAAA,OAC/C;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,UAAA,EAAY,aAAa,CAAA,EAAG,OAAA,EAAS,SAAA,EACxF,QAAA,EAAA,KAAA,CAAM,KAAK,UAAA,EACd;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACtCO,SAAS,aAAa,KAAA,EAAuB;AAClD,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAI,KAAA;AAC9B,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,KAAA,CAAM,IAAA,EAAM,UAAU,CAAA;AAG3D,EAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AACvB,EAAA,uBACEA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MAIE,GAAG;AAAA,KAAA;AAAA,IADC,KAAA,CAAM,cAAc,KAAA,CAAM;AAAA,GAEjC;AAEJ;AAEA,SAAS,kBAAA,CACP,MACA,UAAA,EACkD;AAClD,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,UAAA;AACH,MAAA,OAAO,YAAY,aAAA,IAAiB,oBAAA;AAAA,IACtC,KAAK,OAAA;AACH,MAAA,OAAO,YAAY,UAAA,IAAc,iBAAA;AAAA,IACnC,KAAK,iBAAA;AACH,MAAA,OAAO,YAAY,mBAAA,IAAuB,0BAAA;AAAA,IAC5C,KAAK,aAAA;AACH,MAAA,OAAO,YAAY,eAAA,IAAmB,sBAAA;AAAA,IACxC,KAAK,SAAA;AACH,MAAA,OAAO,YAAY,YAAA,IAAgB,mBAAA;AAAA,IACrC,KAAK,UAAA;AACH,MAAA,OAAO,YAAY,aAAA,IAAiB,oBAAA;AAAA,IACtC,KAAK,QAAA;AACH,MAAA,OAAO,YAAY,WAAA,IAAe,kBAAA;AAAA,IACpC;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AC9CO,SAAS,eAAe,EAAE,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,YAAW,EAAqB;AAC5F,EAAA,uBACEC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,yBAAA,EAA2B,UAAA,EAAY,IAAI,CAAA,EAC5D,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,mBAAmB,UAAA,EAAY,IAAI,CAAA,EACpD,QAAA,kBAAAA,IAAC,SAAA,EAAA,EAAU,KAAA,EAAM,cAAA,EAAe,IAAA,EAAM,IAAI,CAAA,EAC5C,CAAA;AAAA,oBAEAA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAW,GAAG,eAAA,EAAiB,UAAA,EAAY,KAAK,CAAA,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAC7D,WAAA,oBAAeA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,WAAA,EAAa,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,UAAA,EAAY,WAAW,CAAA,EAAG,CAAA;AAAA,oBAE5GA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oBAAA,EACb,QAAA,kBAAAA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAW,EAAA,CAAG,+BAA+B,UAAA,EAAY,WAAW,GAAG,OAAA,EAAS,OAAA,EAAS,kBAE/G,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACjBA,SAAS,oBAAoB,EAAE,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAY,UAAS,EAAsB;AACvF,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,CAAa,EAAA,GAAK,KAAK,CAAA;AAE7C,EAAA,uBACEC,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,IAAA,EAAK,OAAA;AAAA,MACL,cAAA,EAAc,UAAA;AAAA,MACd,OAAA,EAAS,MAAM,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA;AAAA,MACjC,SAAA,EAAW,EAAA,CAAG,kBAAA,EAAoB,UAAA,IAAc,4BAA4B,CAAA;AAAA,MAE5E,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,WAAU,iBAAA,EACzB,QAAA,EAAA,UAAA,mBAAaA,GAAAA,CAAC,aAAU,KAAA,EAAM,MAAA,EAAO,IAAA,EAAM,EAAA,EAAI,IAAK,MAAA,EACvD,CAAA;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,iBAAO,KAAA,EAAM;AAAA;AAAA;AAAA,GAClD;AAEJ;AAEO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,wBAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,YAAA,GAAe,YAAY,YAAA,IAAgB,mBAAA;AACjD,EAAA,MAAM,WAAW,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,cAAc,CAAA;AAC5D,EAAA,MAAM,YAAA,GAAe,UAAU,QAAA,KAAa,IAAA;AAE5C,EAAA,uBACEC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,wBAAA,EAA0B,UAAA,EAAY,IAAI,CAAA,EAC3D,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,QAAG,SAAA,EAAW,EAAA,CAAG,iBAAiB,UAAA,EAAY,KAAK,GAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAC7D,WAAA,oBAAeA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,WAAA,EAAa,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,UAAA,EAAY,WAAW,CAAA,EAAG,CAAA;AAAA,oBAE5GA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,gBAAA,EAAkB,YAAY,UAAU,CAAA,EAAG,IAAA,EAAK,YAAA,EAAa,cAAY,KAAA,EACzF,QAAA,EAAA,OAAA,CAAQ,IAAI,CAAC,MAAA,EAAQ,sBACpBA,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QAEC,MAAA;AAAA,QACA,KAAA,EAAO,CAAA;AAAA,QACP,UAAA,EAAY,mBAAmB,MAAA,CAAO,EAAA;AAAA,QACtC,QAAA,EAAU;AAAA,OAAA;AAAA,MAJL,MAAA,CAAO;AAAA,KAMf,CAAA,EACH,CAAA;AAAA,IAEC,gCACCA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA,CAAG,oBAAA,EAAsB,UAAA,EAAY,aAAa,CAAA;AAAA,QAC7D,WAAA,EAAY,yBAAA;AAAA,QACZ,IAAA,EAAM,CAAA;AAAA,QACN,KAAA,EAAO,gBAAA;AAAA,QACP,UAAU,CAAC,CAAA,KAAM,wBAAA,CAAyB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACxD,YAAA,EAAW;AAAA;AAAA,KACb;AAAA,oBAGFA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,UAAA,EAAY,cAAc,CAAA;AAAA,QACvE,OAAA,EAAS,MAAA;AAAA,QACT,UAAU,CAAC,cAAA;AAAA,QACZ,QAAA,EAAA;AAAA;AAAA;AAED,GAAA,EACF,CAAA;AAEJ;AC3EO,SAAS,iBAAA,CAAkB,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAoB;AACxE,EAAA,uBACEC,IAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,SAAS,CAAA,EAAG,OAAA,EAAS,MAAA,EACzE,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,aAAA,EAAY,MAAA,EACtE,QAAA,kBAAAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAE,oBAAA;AAAA,QACF,MAAA,EAAO,cAAA;AAAA,QACP,WAAA,EAAY,KAAA;AAAA,QACZ,aAAA,EAAc,OAAA;AAAA,QACd,cAAA,EAAe;AAAA;AAAA,KACjB,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,MAAA,EAAI;AAAA,GAAA,EACZ,CAAA;AAEJ;ACfO,SAAS,kBAAA,CAAmB,EAAE,OAAA,EAAS,SAAA,EAAU,EAAqB;AAC3E,EAAA,uBACEA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAW,EAAA,CAAG,iBAAA,EAAmB,SAAS,CAAA,EAAG,SAAS,OAAA,EAAS,YAAA,EAAW,SAC9F,QAAA,kBAAAA,GAAAA,CAAC,SAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,SAAQ,WAAA,EAAY,IAAA,EAAK,QAAO,aAAA,EAAY,MAAA,EACtE,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sBAAA,EAAuB,QAAO,cAAA,EAAe,WAAA,EAAY,OAAM,aAAA,EAAc,OAAA,EAAQ,GAC/F,CAAA,EACF,CAAA;AAEJ;ACNA,SAAS,UAAU,SAAA,EAAoC;AACrD,EAAA,MAAM,iBAAA,GAAoB;AAAA,IACxB,SAAA;AAAA,IACA,uBAAA;AAAA,IACA,sBAAA;AAAA,IACA,yBAAA;AAAA,IACA,uBAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AAEX,EAAA,SAAS,cAAc,CAAA,EAAkB;AACvC,IAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AAErB,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA,CAAK,UAAU,gBAAA,CAA8B,iBAAiB,CAAC,CAAA,CAAE,MAAA;AAAA,MACvF,CAAC,EAAA,KAAO,EAAA,CAAG,YAAA,KAAiB;AAAA,KAC9B;AACA,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAE5B,IAAA,MAAM,KAAA,GAAQ,UAAU,CAAC,CAAA;AACzB,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAE3C,IAAA,IAAI,CAAA,CAAE,QAAA,IAAY,QAAA,CAAS,aAAA,KAAkB,KAAA,EAAO;AAClD,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb,WAAW,CAAC,CAAA,CAAE,QAAA,IAAY,QAAA,CAAS,kBAAkB,IAAA,EAAM;AACzD,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,KAAA,CAAM,KAAA,EAAM;AAAA,IACd;AAAA,EACF;AAEA,EAAA,SAAA,CAAU,gBAAA,CAAiB,WAAW,aAAa,CAAA;AACnD,EAAA,OAAO,MAAM,SAAA,CAAU,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AACrE;AAEO,SAAS,aAAa,EAAE,IAAA,EAAM,SAAS,QAAA,EAAU,SAAA,EAAW,kBAAiB,EAAe;AACjG,EAAA,MAAM,UAAA,GAAa,OAAuB,IAAI,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,OAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,gBAAA,GAAmB,OAA2B,IAAI,CAAA;AAGxD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,QAAA,CAAS,OAAA,EAAS;AAEhC,IAAA,gBAAA,CAAiB,UAAU,QAAA,CAAS,aAAA;AACpC,IAAA,QAAA,CAAS,QAAQ,KAAA,EAAM;AAEvB,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA;AAC1C,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,EAAQ;AACR,MAAA,gBAAA,CAAiB,SAAS,KAAA,EAAM;AAAA,IAClC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,CAAA,KAAqB;AACpB,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,OAAA,EAAQ;AAAA,IAClC,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EACpE,CAAA,EAAG,CAAC,IAAA,EAAM,aAAa,CAAC,CAAA;AAExB,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,SAAA,EAAW,EAAA,CAAG,YAAA,EAAc,gBAAgB,CAAA;AAAA,MAC5C,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,QAAA,IAAI,CAAA,CAAE,MAAA,KAAW,UAAA,CAAW,OAAA,EAAS,OAAA,EAAQ;AAAA,MAC/C,CAAA;AAAA,MAEA,QAAA,kBAAAA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,IAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAW,MAAA;AAAA,UACX,iBAAA,EAAgB,iBAAA;AAAA,UAChB,QAAA,EAAU,EAAA;AAAA,UACV,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA;AAAA,UAElC;AAAA;AAAA;AACH;AAAA,GACF;AAEJ;ACzFA,IAAM,KAAA,GAAQ,8BAAA;AAEd,SAAS,eAAA,GAA+B;AACtC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,UAAA,KAAe,YAAY,OAAO,OAAA;AACrF,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA,CAAE,UAAU,MAAA,GAAS,OAAA;AACrD;AAEO,SAAS,eAAe,UAAA,EAAqD;AAClF,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIE,SAAS,eAAe,CAAA;AAEpD,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,UAAA,KAAe,UAAU,OAAO,MAAA,KAAW,eAAe,OAAO,MAAA,CAAO,eAAe,UAAA,EAAY;AACvG,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AACnC,IAAA,MAAM,WAAW,MAAM,SAAA,CAAU,GAAA,CAAI,OAAA,GAAU,SAAS,OAAO,CAAA;AAC/D,IAAA,GAAA,CAAI,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AACvC,IAAA,OAAO,MAAM,GAAA,CAAI,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAA;AAAA,EACzD,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,IAAI,CAAC,UAAA,IAAc,UAAA,KAAe,OAAA,EAAS,OAAO,OAAA;AAClD,EAAA,IAAI,UAAA,KAAe,QAAQ,OAAO,MAAA;AAClC,EAAA,OAAO,MAAA;AACT;ACEO,SAAS,WAAW,KAAA,EAAwB;AACjD,EAAA,MAAM,EAAE,SAAS,KAAA,EAAO,SAAA,EAAW,WAAW,KAAA,EAAM,GAAI,qBAAqB,KAAK,CAAA;AAElF,EAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,IAAA,uBACEH,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,SAAA;AAAA,QACA,SAAA;AAAA,QACA,OAAA,EAAS;AAAA;AAAA,KACX;AAAA,EAEJ;AAEA,EAAA,uBACEA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,KAAA;AAAA,MACA,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,kBAAkB,KAAA,CAAM;AAAA;AAAA,GAC1B;AAEJ;AAEA,SAAS,UAAA,CAAW;AAAA,EAClB,UAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAQG;AACD,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,UAAA,EAAY,WAAW,CAAA;AACrD,EAAA,MAAM,eAAA,GAAkB,kBAAkB,UAAU,CAAA;AACpD,EAAA,MAAM,KAAA,GAAQ,YAAY,KAAA,IAAS,YAAA;AACnC,EAAA,MAAM,WAAA,GAAc,YAAY,WAAA,IAAe,kBAAA;AAC/C,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AAAA,EAAC,CAAA,CAAA;AAEvC,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAiB,mBAAA,EAAmB,MAAA,EAAQ,OAAO,eAAA,EAChE,QAAA,kBAAAC,KAAC,KAAA,EAAA,EAAM,IAAA,EAAM,MAAM,OAAA,EAAS,WAAA,EAAa,WAAW,UAAA,EAAY,KAAA,EAAO,gBAAA,EAAkB,UAAA,EAAY,OAAA,EACnG,QAAA,EAAA;AAAA,oBAAAD,IAAC,WAAA,EAAA,EAAY,OAAA,EAAS,WAAA,EAAa,SAAA,EAAW,YAAY,WAAA,EAAa,CAAA;AAAA,oBACvEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACZ,QAAA,EAAA;AAAA,MAAA,SAAA,oBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EAAa,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAS,EACxE,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,oBAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,EAAA;AAAA,cACP,MAAA,EAAQ,EAAA;AAAA,cACR,MAAA,EAAQ,2CAAA;AAAA,cACR,cAAA,EAAgB,kCAAA;AAAA,cAChB,YAAA,EAAc,KAAA;AAAA,cACd,SAAA,EAAW,8BAAA;AAAA,cACX,MAAA,EAAQ;AAAA;AACV;AAAA,SACF;AAAA,wBACAA,IAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,yCAAA,IAA6C,QAAA,EAAA,yBAAA,EAAuB;AAAA,OAAA,EACzF,CAAA;AAAA,MAED,SAAA,oBACCC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,UAAA,EAAW,IAAA,EAAK,OAAA,EAAQ,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,UAAS,EACnF,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,OAAE,SAAA,EAAU,kBAAA,EAAmB,OAAO,EAAE,YAAA,EAAc,EAAA,EAAG,EAAG,QAAA,EAAA,+DAAA,EAE7D,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,iBAAA;AAAA,YACV,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO;AAAA,cACL,OAAA,EAAS,UAAA;AAAA,cACT,QAAA,EAAU,EAAA;AAAA,cACV,UAAA,EAAY,GAAA;AAAA,cACZ,UAAA,EAAY,kCAAA;AAAA,cACZ,KAAA,EAAO,MAAA;AAAA,cACP,MAAA,EAAQ,MAAA;AAAA,cACR,YAAA,EAAc,8BAAA;AAAA,cACd,MAAA,EAAQ;AAAA,aACV;AAAA,YACD,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAWA,SAAS,SAAA,CAAU,EAAE,OAAA,EAAS,KAAA,EAAO,YAAY,UAAA,EAAY,UAAA,EAAY,kBAAiB,EAAmB;AAC3G,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,UAAA,EAAY,WAAW,CAAA;AACrD,EAAA,MAAM,eAAA,GAAkB,kBAAkB,UAAU,CAAA;AAEpD,EAAA,MAAM,KAAA,GAAQ,YAAY,KAAA,IAAS,YAAA;AACnC,EAAA,MAAM,WAAA,GAAc,YAAY,WAAA,IAAe,kBAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,YAAY,UAAA,IAAc,iBAAA;AAE7C,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAiB,mBAAA,EAAmB,MAAA,EAAQ,KAAA,EAAO,eAAA,EAChE,QAAA,kBAAAC,IAAAA,CAAC,SAAM,IAAA,EAAM,IAAA,EAAM,SAAS,OAAA,CAAQ,KAAA,EAAO,WAAW,UAAA,EAAY,KAAA,EAAO,gBAAA,EAAkB,UAAA,EAAY,OAAA,EACrG,QAAA,EAAA;AAAA,oBAAAD,IAAC,WAAA,EAAA,EAAY,OAAA,EAAS,QAAQ,KAAA,EAAO,SAAA,EAAW,YAAY,WAAA,EAAa,CAAA;AAAA,oBACzEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACZ,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,SAAA,oBAAaD,GAAAA,CAAC,UAAA,EAAA,EAAW,QAAQ,OAAA,CAAQ,IAAA,EAAM,SAAA,EAAW,UAAA,EAAY,UAAA,EAAY,CAAA;AAAA,MAC1F,KAAA,CAAM,KAAA,oBACLA,GAAAA,CAAC,SAAI,SAAA,EAAU,UAAA,EAAW,IAAA,EAAK,OAAA,EAC7B,0BAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kBAAA,EAAmB,qDAAuC,CAAA,EACzE,CAAA;AAAA,sBAEFA,GAAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAc,OAAA,EAAkB,YAAwB,gBAAA,EAAoC;AAAA,KAAA,EAC5G;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,YAAA,CAAa;AAAA,EACpB,KAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,aAAa,OAAA,CAAQ,WAAA;AAE3B,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,MAAA,GAAS,YAAY,MAAA,IAAU,aAAA;AACrC,MAAA,MAAM,MAAA,GAAS,UAAA;AACf,MAAA,uBACEA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,MAAA,EAAQ,KAAA,IAAS,aAAA,CAAc,MAAA;AAAA,UACtC,aAAa,MAAA,EAAQ,WAAA;AAAA,UACrB,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,eAAe,KAAA,CAAM,aAAA;AAAA,UACrB,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,gBAAgB,KAAA,CAAM,cAAA;AAAA,UACtB,gBAAgB,OAAA,CAAQ,YAAA;AAAA,UACxB,kBAAkB,KAAA,CAAM,gBAAA;AAAA,UACxB,0BAA0B,OAAA,CAAQ,mBAAA;AAAA,UAClC,QAAQ,OAAA,CAAQ,IAAA;AAAA,UAChB,YAAY,MAAA,EAAQ,UAAA;AAAA,UACpB;AAAA;AAAA,OACF;AAAA,IAEJ;AAAA,IAEA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,QAAQ,OAAA,CAAQ,YAAA;AACtB,MAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAGnB,MAAA,MAAM,WAAA,GAAc,gBAAA,GAAmB,KAAA,CAAM,IAAI,CAAA;AACjD,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,uBACEA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,UAAU,KAAA,CAAM,QAAA;AAAA,YAChB,eAAe,KAAA,CAAM,aAAA;AAAA,YACrB,UAAU,OAAA,CAAQ,MAAA;AAAA,YAClB,WAAW,OAAA,CAAQ,OAAA;AAAA,YACnB,cAAc,KAAA,CAAM;AAAA;AAAA,SACtB;AAAA,MAEJ;AACA,MAAA,IAAI,CAAC,oBAAA,CAAqB,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,EAAG;AAC9C,QAAA,uBAAOA,IAAC,yBAAA,EAAA,EAA0B,SAAA,EAAW,MAAM,IAAA,EAAM,MAAA,EAAQ,QAAQ,OAAA,EAAS,CAAA;AAAA,MACpF;AACA,MAAA,MAAM,KAAA,GAAQ,YAAY,KAAA,IAAS,YAAA;AACnC,MAAA,MAAM,MAAA,GAAS,UAAA;AACf,MAAA,uBACEA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,OAAO,MAAA,EAAQ,KAAA;AAAA,UACf,aAAa,MAAA,EAAQ,WAAA;AAAA,UACrB,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,eAAe,KAAA,CAAM,aAAA;AAAA,UACrB,KAAA;AAAA,UACA,UAAU,OAAA,CAAQ,MAAA;AAAA,UAClB,WAAW,OAAA,CAAQ,OAAA;AAAA,UACnB,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB,YAAY,MAAA,EAAQ,UAAA;AAAA,UACpB;AAAA;AAAA,OACF;AAAA,IAEJ;AAAA,IAEA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,QAAA,GAAW,YAAY,QAAA,IAAY,eAAA;AACzC,MAAA,MAAM,MAAA,GAAS,UAAA;AACf,MAAA,uBACEA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,MAAA,EAAQ,KAAA,IAAS,aAAA,CAAc,QAAA;AAAA,UACtC,aAAa,MAAA,EAAQ,WAAA;AAAA,UACrB,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,eAAe,KAAA,CAAM,aAAA;AAAA,UACrB,aAAa,MAAA,EAAQ,WAAA;AAAA,UACrB,QAAA,EAAU,QAAQ,QAAA,IAAY,KAAA;AAAA,UAC9B,SAAA,EAAW,QAAQ,SAAA,IAAa,CAAA;AAAA,UAChC,OAAO,KAAA,CAAM,QAAA;AAAA,UACb,UAAU,OAAA,CAAQ,WAAA;AAAA,UAClB,UAAU,OAAA,CAAQ,IAAA;AAAA,UAClB,YAAY,MAAA,EAAQ;AAAA;AAAA,OACtB;AAAA,IAEJ;AAAA,IAEA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,OAAA,GAAU,YAAY,OAAA,IAAW,cAAA;AACvC,MAAA,MAAM,MAAA,GAAS,UAAA;AACf,MAAA,uBACEA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,MAAA,EAAQ,KAAA,IAAS,aAAA,CAAc,OAAA;AAAA,UACtC,aAAa,MAAA,EAAQ,WAAA;AAAA,UACrB,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,eAAe,KAAA,CAAM,aAAA;AAAA,UACrB,QAAQ,MAAA,EAAQ,MAAA;AAAA,UAChB,aAAa,MAAA,EAAQ,WAAA;AAAA,UACrB,YAAA,EAAc,QAAQ,YAAA,IAAgB,qBAAA;AAAA,UACtC,WAAA,EAAa,QAAQ,WAAA,IAAe,SAAA;AAAA,UACpC,WAAW,OAAA,CAAQ,MAAA;AAAA,UACnB,UAAU,OAAA,CAAQ,IAAA;AAAA,UAClB,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB,YAAY,MAAA,EAAQ;AAAA;AAAA,OACtB;AAAA,IAEJ;AAAA,IAEA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,OAAA,GAAU,YAAY,OAAA,IAAW,cAAA;AACvC,MAAA,MAAM,MAAA,GAAS,UAAA;AACf,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,KAAY,OAAA;AAClC,MAAA,uBACEA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,OAAA,IAAW,WAAA;AAAA,UAC1B,KAAA,EAAO,QAAQ,YAAA,IAAgB,MAAA;AAAA,UAC/B,OACE,OAAA,GAAW,MAAA,EAAQ,UAAA,IAAc,eAAA,GAAoB,QAAQ,cAAA,IAAkB,wBAAA;AAAA,UAEjF,aACE,OAAA,GACK,MAAA,EAAQ,gBAAA,IAAoB,8BAAA,GAC5B,QAAQ,oBAAA,IAAwB,4BAAA;AAAA,UAEvC,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,eAAe,KAAA,CAAM,aAAA;AAAA,UACrB,SAAS,OAAA,CAAQ,KAAA;AAAA,UACjB,YAAY,MAAA,EAAQ;AAAA;AAAA,OACtB;AAAA,IAEJ;AAAA,IAEA,SAAS;AACP,MAAA,MAAM,UAAA,GAAa,gBAAA,GAAmB,KAAA,CAAM,IAAI,CAAA;AAEhD,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,uBAAOA,IAAC,wBAAA,EAAA,EAAyB,IAAA,EAAM,MAAM,IAAA,EAAM,MAAA,EAAQ,QAAQ,IAAA,EAAM,CAAA;AAAA,MAC3E;AAEA,MAAA,MAAM,MAAA,GAAS,UAAA;AAEf,MAAA,uBACEA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM;AAAA,YACJ,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,OAAO,MAAA,EAAQ,KAAA;AAAA,YACf,aAAa,MAAA,EAAQ,WAAA;AAAA,YACrB,MAAM,MAAA,EAAQ;AAAA,WAChB;AAAA,UACA,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,eAAe,KAAA,CAAM,aAAA;AAAA,UACrB,QAAQ,OAAA,CAAQ,IAAA;AAAA,UAChB,QAAQ,OAAA,CAAQ;AAAA;AAAA,OAClB;AAAA,IAEJ;AAAA;AAEJ;AAGA,SAAS,wBAAA,CAAyB,EAAE,IAAA,EAAM,MAAA,EAAO,EAAyC;AACxF,EAAAG,UAAU,MAAM;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,kDAAA,EAAqD,IAAI,CAAA,YAAA,CAAc,CAAA;AACpF,IAAA,MAAA,EAAO;AAAA,EACT,CAAA,EAAG,CAAC,IAAA,EAAM,MAAM,CAAC,CAAA;AACjB,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,yBAAA,CAA0B,EAAE,SAAA,EAAW,MAAA,EAAO,EAA8C;AACnG,EAAAA,UAAU,MAAM;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mDAAA,EAAsD,SAAS,CAAA,YAAA,CAAc,CAAA;AAC1F,IAAA,MAAA,EAAO;AAAA,EACT,CAAA,EAAG,CAAC,SAAA,EAAW,MAAM,CAAC,CAAA;AACtB,EAAA,OAAO,IAAA;AACT","file":"index.js","sourcesContent":["// Renders copy that may contain dashboard-authored HTML (offer body, step\n// descriptions) as actual HTML rather than escaped text. Copy comes from a\n// user's Churnkey dashboard, not user input, and\n// merge fields are pre-substituted in the transform layer before the string\n// reaches this component. If we ever need stricter hardening, sanitization\n// (e.g. DOMPurify) should go here, not at every call site.\n\ntype RichTextTag = 'p' | 'div' | 'span'\n\ninterface RichTextProps {\n html: string | undefined | null\n as?: RichTextTag\n className?: string\n}\n\nexport function RichText({ html, as = 'p', className }: RichTextProps) {\n if (!html) return null\n const Tag = as\n return (\n <Tag\n className={className}\n // biome-ignore lint/security/noDangerouslySetInnerHtml: see file-level comment\n dangerouslySetInnerHTML={{ __html: html }}\n />\n )\n}\n","import { formatPeriodEnd } from '../../core/format'\nimport type { ConfirmStepProps } from '../../core/types'\nimport { cn } from '../../core/utils'\nimport { RichText } from '../rich-text'\n\nexport function DefaultConfirm({\n title,\n description,\n subscriptions,\n losses,\n lossesLabel,\n confirmLabel,\n goBackLabel,\n onConfirm,\n onGoBack,\n isProcessing,\n classNames,\n}: ConfirmStepProps) {\n const hasLosses = Array.isArray(losses) && losses.length > 0\n const periodEnd = formatPeriodEnd(subscriptions)\n return (\n <div className={cn('ck-step ck-step-confirm', classNames?.root)}>\n <h2 className={cn('ck-step-title', classNames?.title)}>{title}</h2>\n {description && <RichText html={description} className={cn('ck-step-description', classNames?.description)} />}\n\n {hasLosses && (\n <div className={cn('ck-loss-block', classNames?.lossList)}>\n <div className={cn('ck-loss-label', classNames?.lossLabel)}>{lossesLabel ?? \"You'll lose access to:\"}</div>\n <ul className=\"ck-loss-list\">\n {losses.map((item) => (\n <li key={item} className={cn('ck-loss-item', classNames?.lossItem)}>\n <span aria-hidden className={cn('ck-loss-bullet', classNames?.lossBullet)}>\n ●\n </span>\n <span>{item}</span>\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {periodEnd && (\n <p className={cn('ck-period-end', classNames?.periodEndNotice)}>Your access continues until {periodEnd}.</p>\n )}\n\n <button\n type=\"button\"\n className={cn('ck-button ck-button-danger', classNames?.confirmButton)}\n onClick={onConfirm}\n disabled={isProcessing}\n >\n {isProcessing ? 'Processing...' : confirmLabel}\n </button>\n <button type=\"button\" className={cn('ck-button-link', classNames?.goBackButton)} onClick={onGoBack}>\n {goBackLabel}\n </button>\n </div>\n )\n}\n","import { useState } from 'react'\nimport type { FeedbackStepProps } from '../../core/types'\nimport { cn } from '../../core/utils'\nimport { RichText } from '../rich-text'\n\nexport function DefaultFeedback({\n title,\n description,\n placeholder,\n required,\n minLength,\n value,\n onChange,\n onSubmit,\n classNames,\n}: FeedbackStepProps) {\n const [focused, setFocused] = useState(false)\n const hasMin = minLength > 0\n const isUnderMin = hasMin && value.length > 0 && value.length < minLength\n const isValid = !required || value.length >= minLength\n const placeholderText = placeholder ?? (hasMin ? `At least ${minLength} characters…` : 'Type your thoughts…')\n\n return (\n <div className={cn('ck-step ck-step-feedback', classNames?.root)}>\n <h2 className={cn('ck-step-title', classNames?.title)}>{title}</h2>\n {description && <RichText html={description} className={cn('ck-step-description', classNames?.description)} />}\n\n <div\n className={cn(\n 'ck-feedback-field',\n focused && 'ck-feedback-field--focused',\n isUnderMin && 'ck-feedback-field--invalid',\n )}\n >\n <textarea\n className={cn('ck-textarea', classNames?.textarea)}\n placeholder={placeholderText}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n rows={3}\n />\n {hasMin && (\n <div\n className={cn(\n 'ck-character-count',\n isUnderMin && 'ck-character-count--invalid',\n classNames?.characterCount,\n )}\n >\n {value.length} / {minLength}\n </div>\n )}\n </div>\n\n <button\n type=\"button\"\n className={cn('ck-button ck-button-primary', classNames?.submitButton)}\n onClick={onSubmit}\n disabled={!isValid}\n >\n Continue\n </button>\n </div>\n )\n}\n","import type { OfferStepProps } from '../../../core/types'\nimport { cn } from '../../../core/utils'\nimport { RichText } from '../../rich-text'\n\n// Contact offers render no body by default — title and description carry the\n// pitch, the accept button triggers the consumer's handleContact callback\n// (which usually opens the offer's url). Override the slot to add an\n// avatar/SLA/etc. specific to your support team.\nexport function DefaultContactOffer({\n title,\n description,\n offer,\n onAccept,\n onDecline,\n isProcessing,\n classNames,\n}: OfferStepProps) {\n const headline = title ?? offer.copy.headline\n const body = description ?? offer.copy.body\n\n return (\n <div className={cn('ck-step ck-step-offer', classNames?.root)}>\n {headline && <h2 className={cn('ck-step-title', classNames?.title)}>{headline}</h2>}\n {body && <RichText html={body} className={cn('ck-step-description', classNames?.description)} />}\n\n <div className={cn('ck-offer-card', classNames?.card)}>\n <button\n type=\"button\"\n className={cn('ck-button ck-button-primary', classNames?.acceptButton)}\n onClick={() => onAccept()}\n disabled={isProcessing}\n >\n {isProcessing ? 'Processing...' : offer.copy.cta}\n </button>\n <button type=\"button\" className={cn('ck-button-link', classNames?.declineButton)} onClick={onDecline}>\n {offer.copy.declineCta}\n </button>\n </div>\n </div>\n )\n}\n","import { discountPhrase } from '../../../core/format'\nimport type { OfferDecision, OfferStepProps } from '../../../core/types'\nimport { cn } from '../../../core/utils'\nimport { RichText } from '../../rich-text'\n\nexport function DefaultDiscountOffer({\n title,\n description,\n offer,\n onAccept,\n onDecline,\n isProcessing,\n classNames,\n}: OfferStepProps) {\n const o = offer as OfferDecision & {\n percentOff?: number\n amountOff?: number\n currency?: string\n durationInMonths?: number\n }\n const headline = title ?? offer.copy.headline\n const body = description ?? offer.copy.body\n const phrase = discountPhrase(o)\n\n return (\n <div className={cn('ck-step ck-step-offer', classNames?.root)}>\n {headline && <h2 className={cn('ck-step-title', classNames?.title)}>{headline}</h2>}\n {body && <RichText html={body} className={cn('ck-step-description', classNames?.description)} />}\n\n <div className={cn('ck-offer-card', classNames?.card)}>\n <div className=\"ck-offer-details ck-offer-discount\">\n <div className=\"ck-offer-discount-eyebrow\">Limited-time offer</div>\n <div className=\"ck-offer-discount-phrase\">{phrase}</div>\n </div>\n <button\n type=\"button\"\n className={cn('ck-button ck-button-primary', classNames?.acceptButton)}\n onClick={() => onAccept()}\n disabled={isProcessing}\n >\n {isProcessing ? 'Processing...' : offer.copy.cta}\n </button>\n <button type=\"button\" className={cn('ck-button-link', classNames?.declineButton)} onClick={onDecline}>\n {offer.copy.declineCta}\n </button>\n </div>\n </div>\n )\n}\n","import { useState } from 'react'\nimport { formatMonthDayLong } from '../../../core/format'\nimport type { OfferDecision, OfferStepProps } from '../../../core/types'\nimport { cn } from '../../../core/utils'\nimport { RichText } from '../../rich-text'\n\nexport function DefaultPauseOffer({\n title,\n description,\n offer,\n onAccept,\n onDecline,\n isProcessing,\n classNames,\n}: OfferStepProps) {\n const o = offer as OfferDecision & { months: number }\n const max = Math.max(1, o.months)\n const [months, setMonths] = useState<number>(1)\n\n const headline = title ?? offer.copy.headline\n const body = description ?? offer.copy.body\n\n const resume = new Date()\n resume.setMonth(resume.getMonth() + months)\n const resumeDate = formatMonthDayLong(resume)\n\n return (\n <div className={cn('ck-step ck-step-offer', classNames?.root)}>\n {headline && <h2 className={cn('ck-step-title', classNames?.title)}>{headline}</h2>}\n {body && <RichText html={body} className={cn('ck-step-description', classNames?.description)} />}\n\n <div className={cn('ck-offer-card ck-pause-card', classNames?.card)}>\n <div className=\"ck-pause-eyebrow\">We'll see you back on</div>\n <div className=\"ck-pause-date\">{resumeDate}</div>\n <div className={cn('ck-pause-chips', classNames?.pauseSlider)}>\n {Array.from({ length: max }, (_, i) => i + 1).map((m) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => setMonths(m)}\n className={cn('ck-pause-chip', m === months && 'ck-pause-chip--selected')}\n aria-pressed={m === months}\n >\n {m} {m === 1 ? 'month' : 'months'}\n </button>\n ))}\n </div>\n </div>\n <button\n type=\"button\"\n className={cn('ck-button ck-button-primary', classNames?.acceptButton)}\n onClick={() => onAccept({ months })}\n disabled={isProcessing}\n >\n {isProcessing ? 'Processing...' : offer.copy.cta}\n </button>\n <button type=\"button\" className={cn('ck-button-link', classNames?.declineButton)} onClick={onDecline}>\n {offer.copy.declineCta}\n </button>\n </div>\n )\n}\n","export function Checkmark({ color = 'currentColor', size = 14 }: { color?: string; size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 8.5L6.5 12L13 5\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n","import { useState } from 'react'\nimport { formatPriceFromMinor } from '../../../core/format'\nimport type { OfferDecision, OfferStepProps, PlanOption } from '../../../core/types'\nimport { cn } from '../../../core/utils'\nimport { RichText } from '../../rich-text'\nimport { Checkmark } from '../shared'\n\nexport function DefaultPlanChangeOffer({\n title,\n description,\n subscriptions,\n offer,\n onAccept,\n onDecline,\n isProcessing,\n classNames,\n}: OfferStepProps) {\n const o = offer as OfferDecision & { plans?: PlanOption[] }\n const plans = o.plans ?? []\n // Mark the customer's current plan via their first subscription's first\n // price; switching to that same plan would be a no-op so it gets disabled.\n const currentPlanId = subscriptions[0]?.items[0]?.price.id\n const initialPlanId = plans.find((p) => p.id !== currentPlanId)?.id ?? null\n const [selectedPlanId, setSelectedPlanId] = useState<string | null>(initialPlanId)\n const selectedPlan = plans.find((p) => p.id === selectedPlanId) ?? null\n\n const headline = title ?? offer.copy.headline\n const body = description ?? offer.copy.body\n const ctaLabel = isProcessing\n ? 'Processing...'\n : selectedPlan?.name\n ? `Switch to ${selectedPlan.name}`\n : offer.copy.cta\n\n return (\n <div className={cn('ck-step ck-step-offer', classNames?.root)}>\n {headline && <h2 className={cn('ck-step-title', classNames?.title)}>{headline}</h2>}\n {body && <RichText html={body} className={cn('ck-step-description', classNames?.description)} />}\n\n <div className={cn('ck-offer-card', classNames?.card)}>\n <div className=\"ck-offer-details ck-plan-grid\">\n {plans.map((plan) => {\n const interval = plan.duration?.interval ?? 'month'\n const currency = plan.amount.currency ?? 'USD'\n const isSelected = plan.id === selectedPlanId\n const isCurrent = plan.id === currentPlanId\n\n return (\n <button\n type=\"button\"\n key={plan.id}\n onClick={() => setSelectedPlanId(plan.id)}\n disabled={isCurrent}\n className={cn(\n 'ck-plan-card',\n isSelected && 'ck-plan-card--selected',\n isCurrent && 'ck-plan-card--current',\n )}\n aria-pressed={isSelected}\n >\n <div className=\"ck-plan-name\">\n {plan.name ?? plan.id}\n {isCurrent && <span className=\"ck-plan-current-badge\">Current</span>}\n </div>\n {plan.tagline && <div className=\"ck-plan-tagline\">{plan.tagline}</div>}\n\n <div className=\"ck-plan-price-row\">\n <span className=\"ck-plan-amount\">{formatPriceFromMinor(plan.amount.value, currency)}</span>\n <span className=\"ck-plan-period\">/{interval}</span>\n {plan.msrp && <span className=\"ck-plan-msrp\">{plan.msrp}</span>}\n </div>\n\n {plan.features && plan.features.length > 0 && (\n <ul className=\"ck-plan-features\">\n {plan.features.map((feature, i) => (\n <li key={`${plan.id}-feature-${i}`} className=\"ck-plan-feature\">\n <span className=\"ck-plan-feature-check\">\n <Checkmark size={11} />\n </span>\n {feature}\n </li>\n ))}\n </ul>\n )}\n </button>\n )\n })}\n </div>\n <button\n type=\"button\"\n className={cn('ck-button ck-button-primary', classNames?.acceptButton)}\n onClick={() => selectedPlanId && onAccept({ planId: selectedPlanId })}\n disabled={isProcessing || !selectedPlanId}\n >\n {ctaLabel}\n </button>\n <button type=\"button\" className={cn('ck-button-link', classNames?.declineButton)} onClick={onDecline}>\n {offer.copy.declineCta}\n </button>\n </div>\n </div>\n )\n}\n","import { formatPriceFromMinor } from '../../../core/format'\nimport type { OfferDecision, OfferStepProps } from '../../../core/types'\nimport { cn } from '../../../core/utils'\nimport { RichText } from '../../rich-text'\n\ntype RebateDecision = OfferDecision & {\n amountMinor?: number\n currency?: string\n amountPaidMinor?: number\n netAfterRebateMinor?: number\n}\n\nexport function DefaultRebateOffer({\n title,\n description,\n offer,\n onAccept,\n onDecline,\n isProcessing,\n classNames,\n}: OfferStepProps) {\n const o = offer as RebateDecision\n const headline = title ?? offer.copy.headline\n const body = description ?? offer.copy.body\n const currency = o.currency ?? 'usd'\n const amount = o.amountMinor ?? 0\n\n return (\n <div className={cn('ck-step ck-step-offer', classNames?.root)}>\n {headline && <h2 className={cn('ck-step-title', classNames?.title)}>{headline}</h2>}\n {body && <RichText html={body} className={cn('ck-step-description', classNames?.description)} />}\n\n <div className={cn('ck-offer-card', classNames?.card)}>\n {/* Itemized like an invoice: what they already paid this period, the\n rebate we credit (the accented line), and the net after the refund.\n Paid and net are server-resolved in token mode, so each renders\n only when present. */}\n <div className=\"ck-offer-rebate\">\n {o.amountPaidMinor != null && (\n <div className=\"ck-offer-rebate-row\">\n <span>You paid this period</span>\n <span>{formatPriceFromMinor(o.amountPaidMinor, currency)}</span>\n </div>\n )}\n <div className=\"ck-offer-rebate-row ck-offer-rebate-credit\">\n <span>Cancellation rebate</span>\n <span>−{formatPriceFromMinor(amount, currency)}</span>\n </div>\n {o.netAfterRebateMinor != null && (\n <div className=\"ck-offer-rebate-row ck-offer-rebate-total\">\n <span>Your net for this period</span>\n <span>{formatPriceFromMinor(o.netAfterRebateMinor, currency)}</span>\n </div>\n )}\n </div>\n\n <button\n type=\"button\"\n className={cn('ck-button ck-button-primary', classNames?.acceptButton)}\n onClick={() => onAccept()}\n disabled={isProcessing}\n >\n {isProcessing ? 'Processing...' : offer.copy.cta}\n </button>\n <button type=\"button\" className={cn('ck-button-link', classNames?.declineButton)} onClick={onDecline}>\n {offer.copy.declineCta}\n </button>\n </div>\n </div>\n )\n}\n","import type { OfferDecision, OfferStepProps } from '../../../core/types'\nimport { cn } from '../../../core/utils'\nimport { RichText } from '../../rich-text'\n\nexport function DefaultRedirectOffer({ title, description, offer, onDecline, classNames }: OfferStepProps) {\n const url = (offer as OfferDecision & { url: string }).url\n const headline = title ?? offer.copy.headline\n const body = description ?? offer.copy.body\n\n return (\n <div className={cn('ck-step ck-step-offer', classNames?.root)}>\n {headline && <h2 className={cn('ck-step-title', classNames?.title)}>{headline}</h2>}\n {body && <RichText html={body} className={cn('ck-step-description', classNames?.description)} />}\n\n <div className={cn('ck-offer-card', classNames?.card)}>\n <div className=\"ck-offer-details\">\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"ck-redirect-link\">\n <span>{offer.copy.cta}</span>\n <ExternalIcon />\n </a>\n </div>\n <button type=\"button\" className={cn('ck-button-link', classNames?.declineButton)} onClick={onDecline}>\n {offer.copy.declineCta}\n </button>\n </div>\n </div>\n )\n}\n\nfunction ExternalIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"ck-redirect-icon\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n )\n}\n","import { formatMonthDay } from '../../../core/format'\nimport type { OfferDecision, OfferStepProps } from '../../../core/types'\nimport { cn } from '../../../core/utils'\nimport { RichText } from '../../rich-text'\n\nexport function DefaultTrialExtensionOffer({\n title,\n description,\n offer,\n onAccept,\n onDecline,\n isProcessing,\n classNames,\n}: OfferStepProps) {\n const o = offer as OfferDecision & { days: number }\n const headline = title ?? offer.copy.headline\n const body = description ?? offer.copy.body\n const end = new Date()\n end.setDate(end.getDate() + o.days)\n const newEnd = formatMonthDay(end)\n\n return (\n <div className={cn('ck-step ck-step-offer', classNames?.root)}>\n {headline && <h2 className={cn('ck-step-title', classNames?.title)}>{headline}</h2>}\n {body && <RichText html={body} className={cn('ck-step-description', classNames?.description)} />}\n\n <div className={cn('ck-offer-card', classNames?.card)}>\n <div className=\"ck-offer-details ck-trial-block\">\n <div className=\"ck-trial-badge\">\n <div className=\"ck-trial-days\">+{o.days}</div>\n <div className=\"ck-trial-unit\">{o.days === 1 ? 'day' : 'days'}</div>\n </div>\n <div>\n <div className=\"ck-trial-end-label\">New end date</div>\n <div className=\"ck-trial-end-date\">{newEnd}</div>\n </div>\n </div>\n <button\n type=\"button\"\n className={cn('ck-button ck-button-primary', classNames?.acceptButton)}\n onClick={() => onAccept()}\n disabled={isProcessing}\n >\n {isProcessing ? 'Processing...' : offer.copy.cta}\n </button>\n <button type=\"button\" className={cn('ck-button-link', classNames?.declineButton)} onClick={onDecline}>\n {offer.copy.declineCta}\n </button>\n </div>\n </div>\n )\n}\n","import type { ReactElement } from 'react'\nimport type { OfferStepProps } from '../../core/types'\nimport { DefaultContactOffer } from './offer/default-contact-offer'\nimport { DefaultDiscountOffer } from './offer/default-discount-offer'\nimport { DefaultPauseOffer } from './offer/default-pause-offer'\nimport { DefaultPlanChangeOffer } from './offer/default-plan-change-offer'\nimport { DefaultRebateOffer } from './offer/default-rebate-offer'\nimport { DefaultRedirectOffer } from './offer/default-redirect-offer'\nimport { DefaultTrialExtensionOffer } from './offer/default-trial-extension-offer'\n\n// Routes to the per-type component, which owns its full canvas. Two\n// override seams: replace one type via `components.PauseOffer` (etc.), or\n// take over the whole offer step via the `Offer` slot.\nexport function DefaultOffer(props: OfferStepProps) {\n const { offer, components } = props\n const Component = pickOfferComponent(offer.type, components)\n // Custom offer types are dispatched upstream against `customComponents`,\n // so an unknown type reaching this switcher is bad data.\n if (!Component) return null\n return (\n <Component\n // Remount on offer change so per-type selection state (pause months,\n // plan id) doesn't leak across reason switches.\n key={offer.decisionId ?? offer.type}\n {...props}\n />\n )\n}\n\nfunction pickOfferComponent(\n type: string,\n components: OfferStepProps['components'],\n): ((props: OfferStepProps) => ReactElement) | null {\n switch (type) {\n case 'discount':\n return components?.DiscountOffer ?? DefaultDiscountOffer\n case 'pause':\n return components?.PauseOffer ?? DefaultPauseOffer\n case 'trial_extension':\n return components?.TrialExtensionOffer ?? DefaultTrialExtensionOffer\n case 'plan_change':\n return components?.PlanChangeOffer ?? DefaultPlanChangeOffer\n case 'contact':\n return components?.ContactOffer ?? DefaultContactOffer\n case 'redirect':\n return components?.RedirectOffer ?? DefaultRedirectOffer\n case 'rebate':\n return components?.RebateOffer ?? DefaultRebateOffer\n default:\n return null\n }\n}\n","import type { SuccessStepProps } from '../../core/types'\nimport { cn } from '../../core/utils'\nimport { RichText } from '../rich-text'\nimport { Checkmark } from './shared'\n\nexport function DefaultSuccess({ title, description, onClose, classNames }: SuccessStepProps) {\n return (\n <div className={cn('ck-step ck-step-success', classNames?.root)}>\n <div className={cn('ck-success-icon', classNames?.icon)}>\n <Checkmark color=\"currentColor\" size={26} />\n </div>\n\n <h2 className={cn('ck-step-title', classNames?.title)}>{title}</h2>\n {description && <RichText html={description} className={cn('ck-step-description', classNames?.description)} />}\n\n <div className=\"ck-success-actions\">\n <button type=\"button\" className={cn('ck-button ck-button-primary', classNames?.closeButton)} onClick={onClose}>\n Done\n </button>\n </div>\n </div>\n )\n}\n","import type { ReasonButtonProps, SurveyStepProps } from '../../core/types'\nimport { cn } from '../../core/utils'\nimport { RichText } from '../rich-text'\nimport { Checkmark } from './shared'\n\nfunction DefaultReasonButton({ reason, index, isSelected, onSelect }: ReasonButtonProps) {\n const letter = String.fromCharCode(65 + index)\n\n return (\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n onClick={() => onSelect(reason.id)}\n className={cn('ck-reason-button', isSelected && 'ck-reason-button--selected')}\n >\n <span aria-hidden className=\"ck-reason-badge\">\n {isSelected ? <Checkmark color=\"#fff\" size={12} /> : letter}\n </span>\n <span className=\"ck-reason-label\">{reason.label}</span>\n </button>\n )\n}\n\nexport function DefaultSurvey({\n title,\n description,\n reasons,\n selectedReason,\n onSelectReason,\n followupResponse,\n onFollowupResponseChange,\n onNext,\n classNames,\n components,\n}: SurveyStepProps) {\n const ReasonButton = components?.ReasonButton ?? DefaultReasonButton\n const selected = reasons.find((r) => r.id === selectedReason)\n const showFollowup = selected?.freeform === true\n\n return (\n <div className={cn('ck-step ck-step-survey', classNames?.root)}>\n <h2 className={cn('ck-step-title', classNames?.title)}>{title}</h2>\n {description && <RichText html={description} className={cn('ck-step-description', classNames?.description)} />}\n\n <div className={cn('ck-reason-list', classNames?.reasonList)} role=\"radiogroup\" aria-label={title}>\n {reasons.map((reason, i) => (\n <ReasonButton\n key={reason.id}\n reason={reason}\n index={i}\n isSelected={selectedReason === reason.id}\n onSelect={onSelectReason}\n />\n ))}\n </div>\n\n {showFollowup && (\n <textarea\n className={cn('ck-reason-followup', classNames?.followupInput)}\n placeholder=\"Tell us more (optional)\"\n rows={3}\n value={followupResponse}\n onChange={(e) => onFollowupResponseChange(e.target.value)}\n aria-label=\"Additional detail\"\n />\n )}\n\n <button\n type=\"button\"\n className={cn('ck-button ck-button-primary', classNames?.continueButton)}\n onClick={onNext}\n disabled={!selectedReason}\n >\n Continue\n </button>\n </div>\n )\n}\n\nexport { DefaultReasonButton }\n","import type { BackButtonProps } from '../../core/types'\nimport { cn } from '../../core/utils'\n\nexport function DefaultBackButton({ onBack, className }: BackButtonProps) {\n return (\n <button type=\"button\" className={cn('ck-back-button', className)} onClick={onBack}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M12.5 4L6.5 10l6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span>Back</span>\n </button>\n )\n}\n","import type { CloseButtonProps } from '../../core/types'\nimport { cn } from '../../core/utils'\n\nexport function DefaultCloseButton({ onClose, className }: CloseButtonProps) {\n return (\n <button type=\"button\" className={cn('ck-close-button', className)} onClick={onClose} aria-label=\"Close\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M15 5L5 15M5 5l10 10\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )\n}\n","import { useCallback, useEffect, useRef } from 'react'\nimport type { ModalProps } from '../../core/types'\nimport { cn } from '../../core/utils'\n\n// Only traps visible, enabled elements\nfunction trapFocus(container: HTMLElement): () => void {\n const focusableSelector = [\n 'a[href]',\n 'button:not(:disabled)',\n 'input:not(:disabled)',\n 'textarea:not(:disabled)',\n 'select:not(:disabled)',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(', ')\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') return\n\n const focusable = Array.from(container.querySelectorAll<HTMLElement>(focusableSelector)).filter(\n (el) => el.offsetParent !== null,\n ) // visible only\n if (focusable.length === 0) return\n\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault()\n last.focus()\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault()\n first.focus()\n }\n }\n\n container.addEventListener('keydown', handleKeyDown)\n return () => container.removeEventListener('keydown', handleKeyDown)\n}\n\nexport function DefaultModal({ open, onClose, children, className, overlayClassName }: ModalProps) {\n const overlayRef = useRef<HTMLDivElement>(null)\n const modalRef = useRef<HTMLDivElement>(null)\n const previousFocusRef = useRef<HTMLElement | null>(null)\n\n // Save focus, set up trap, restore on unmount\n useEffect(() => {\n if (!open || !modalRef.current) return\n\n previousFocusRef.current = document.activeElement as HTMLElement\n modalRef.current.focus()\n\n const cleanup = trapFocus(modalRef.current)\n return () => {\n cleanup()\n previousFocusRef.current?.focus()\n }\n }, [open])\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n },\n [onClose],\n )\n\n useEffect(() => {\n if (!open) return\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [open, handleKeyDown])\n\n if (!open) return null\n\n return (\n <div\n ref={overlayRef}\n className={cn('ck-overlay', overlayClassName)}\n onClick={(e) => {\n if (e.target === overlayRef.current) onClose()\n }}\n >\n <div\n ref={modalRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"ck-dialog-title\"\n tabIndex={-1}\n className={cn('ck-modal', className)}\n >\n {children}\n </div>\n </div>\n )\n}\n","import { useEffect, useState } from 'react'\n\ntype ColorScheme = 'light' | 'dark'\n\nconst query = '(prefers-color-scheme: dark)'\n\nfunction getSystemScheme(): ColorScheme {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return 'light'\n return window.matchMedia(query).matches ? 'dark' : 'light'\n}\n\nexport function useColorScheme(preference?: 'auto' | 'light' | 'dark'): ColorScheme {\n const [system, setSystem] = useState(getSystemScheme)\n\n useEffect(() => {\n if (preference !== 'auto' || typeof window === 'undefined' || typeof window.matchMedia !== 'function') return\n const mql = window.matchMedia(query)\n const onChange = () => setSystem(mql.matches ? 'dark' : 'light')\n mql.addEventListener('change', onChange)\n return () => mql.removeEventListener('change', onChange)\n }, [preference])\n\n if (!preference || preference === 'light') return 'light'\n if (preference === 'dark') return 'dark'\n return system\n}\n","import { type ReactElement, useEffect } from 'react'\nimport type { CancelFlowMachine } from '../core/machine'\nimport type {\n CancelFlowProps,\n ComponentOverrides,\n ConfirmStep,\n CustomComponents,\n CustomOfferProps,\n CustomStepProps,\n FeedbackStep,\n FlowState,\n OfferStep,\n SuccessStep,\n SurveyStep,\n} from '../core/types'\nimport { appearanceToStyle, BUILT_IN_OFFER_TYPES, defaultTitles } from '../core/utils'\nimport { useCancelFlowMachine } from '../headless/use-cancel-flow-machine'\nimport { DefaultConfirm } from './steps/default-confirm'\nimport { DefaultFeedback } from './steps/default-feedback'\nimport { DefaultOffer } from './steps/default-offer'\nimport { DefaultSuccess } from './steps/default-success'\nimport { DefaultSurvey } from './steps/default-survey'\nimport { DefaultBackButton } from './structural/default-back-button'\nimport { DefaultCloseButton } from './structural/default-close-button'\nimport { DefaultModal } from './structural/default-modal'\nimport { useColorScheme } from './use-color-scheme'\n\nexport function CancelFlow(props: CancelFlowProps) {\n const { machine, state, isLoading, loadError, retry } = useCancelFlowMachine(props)\n\n if (isLoading || loadError) {\n return (\n <LoadStatus\n appearance={props.appearance}\n classNames={props.classNames}\n components={props.components}\n onClose={props.onClose}\n isLoading={isLoading}\n loadError={loadError}\n onRetry={retry}\n />\n )\n }\n\n return (\n <FlowShell\n machine={machine}\n state={state}\n appearance={props.appearance}\n classNames={props.classNames}\n components={props.components}\n customComponents={props.customComponents}\n />\n )\n}\n\nfunction LoadStatus({\n appearance,\n classNames,\n components,\n onClose,\n isLoading,\n loadError,\n onRetry,\n}: {\n appearance?: CancelFlowProps['appearance']\n classNames?: CancelFlowProps['classNames']\n components?: CancelFlowProps['components']\n onClose?: CancelFlowProps['onClose']\n isLoading: boolean\n loadError: Error | null\n onRetry: () => void\n}) {\n const scheme = useColorScheme(appearance?.colorScheme)\n const appearanceStyle = appearanceToStyle(appearance)\n const Modal = components?.Modal ?? DefaultModal\n const CloseButton = components?.CloseButton ?? DefaultCloseButton\n const handleClose = onClose ?? (() => {})\n\n return (\n <div className=\"ck-cancel-flow\" data-color-scheme={scheme} style={appearanceStyle}>\n <Modal open={true} onClose={handleClose} className={classNames?.modal} overlayClassName={classNames?.overlay}>\n <CloseButton onClose={handleClose} className={classNames?.closeButton} />\n <div className=\"ck-content\">\n {isLoading && (\n <div className=\"ck-loading\" style={{ padding: '32px', textAlign: 'center' }}>\n <div\n className=\"ck-loading-spinner\"\n style={{\n width: 32,\n height: 32,\n border: '3px solid var(--ck-color-border, #e5e7eb)',\n borderTopColor: 'var(--ck-color-primary, #2563eb)',\n borderRadius: '50%',\n animation: 'ck-spin 0.6s linear infinite',\n margin: '0 auto 16px',\n }}\n />\n <p style={{ color: 'var(--ck-color-text-secondary, #6b7280)' }}>Loading your options...</p>\n </div>\n )}\n {loadError && (\n <div className=\"ck-error\" role=\"alert\" style={{ padding: '32px', textAlign: 'center' }}>\n <p className=\"ck-error-message\" style={{ marginBottom: 16 }}>\n We couldn't load your cancellation options. Please try again.\n </p>\n <button\n type=\"button\"\n className=\"ck-retry-button\"\n onClick={onRetry}\n style={{\n padding: '8px 20px',\n fontSize: 14,\n fontWeight: 600,\n background: 'var(--ck-color-primary, #2563eb)',\n color: '#fff',\n border: 'none',\n borderRadius: 'var(--ck-border-radius, 8px)',\n cursor: 'pointer',\n }}\n >\n Try again\n </button>\n </div>\n )}\n </div>\n </Modal>\n </div>\n )\n}\n\ninterface FlowShellProps {\n machine: CancelFlowMachine\n state: FlowState\n appearance?: CancelFlowProps['appearance']\n classNames?: CancelFlowProps['classNames']\n components?: CancelFlowProps['components']\n customComponents?: CustomComponents\n}\n\nfunction FlowShell({ machine, state, appearance, classNames, components, customComponents }: FlowShellProps) {\n const scheme = useColorScheme(appearance?.colorScheme)\n const appearanceStyle = appearanceToStyle(appearance)\n\n const Modal = components?.Modal ?? DefaultModal\n const CloseButton = components?.CloseButton ?? DefaultCloseButton\n const BackButton = components?.BackButton ?? DefaultBackButton\n\n return (\n <div className=\"ck-cancel-flow\" data-color-scheme={scheme} style={appearanceStyle}>\n <Modal open={true} onClose={machine.close} className={classNames?.modal} overlayClassName={classNames?.overlay}>\n <CloseButton onClose={machine.close} className={classNames?.closeButton} />\n <div className=\"ck-content\">\n {machine.canGoBack && <BackButton onBack={machine.back} className={classNames?.backButton} />}\n {state.error && (\n <div className=\"ck-error\" role=\"alert\">\n <p className=\"ck-error-message\">Something went wrong. Please try again.</p>\n </div>\n )}\n <StepRenderer state={state} machine={machine} components={components} customComponents={customComponents} />\n </div>\n </Modal>\n </div>\n )\n}\n\nfunction StepRenderer({\n state,\n machine,\n components,\n customComponents,\n}: {\n state: FlowState\n machine: CancelFlowMachine\n components?: Partial<ComponentOverrides>\n customComponents?: CustomComponents\n}) {\n const stepConfig = machine.currentStep\n\n switch (state.step) {\n case 'survey': {\n const Survey = components?.Survey ?? DefaultSurvey\n const config = stepConfig as SurveyStep | undefined\n return (\n <Survey\n title={config?.title ?? defaultTitles.survey}\n description={config?.description}\n customer={state.customer}\n subscriptions={state.subscriptions}\n reasons={machine.reasons}\n selectedReason={state.selectedReason}\n onSelectReason={machine.selectReason}\n followupResponse={state.followupResponse}\n onFollowupResponseChange={machine.setFollowupResponse}\n onNext={machine.next}\n classNames={config?.classNames}\n components={components}\n />\n )\n }\n\n case 'offer': {\n const offer = machine.currentOffer\n if (!offer) return null\n // Custom offer types (e.g. 'change-seats') match against\n // customComponents first; built-ins fall through to DefaultOffer.\n const CustomOffer = customComponents?.[offer.type] as ((props: CustomOfferProps) => ReactElement) | undefined\n if (CustomOffer) {\n return (\n <CustomOffer\n offer={offer}\n customer={state.customer}\n subscriptions={state.subscriptions}\n onAccept={machine.accept}\n onDecline={machine.decline}\n isProcessing={state.isProcessing}\n />\n )\n }\n if (!BUILT_IN_OFFER_TYPES.includes(offer.type)) {\n return <UnregisteredOfferFallback offerType={offer.type} onSkip={machine.decline} />\n }\n const Offer = components?.Offer ?? DefaultOffer\n const config = stepConfig as OfferStep | undefined\n return (\n <Offer\n title={config?.title}\n description={config?.description}\n customer={state.customer}\n subscriptions={state.subscriptions}\n offer={offer}\n onAccept={machine.accept}\n onDecline={machine.decline}\n isProcessing={state.isProcessing}\n classNames={config?.classNames}\n components={components}\n />\n )\n }\n\n case 'feedback': {\n const Feedback = components?.Feedback ?? DefaultFeedback\n const config = stepConfig as FeedbackStep | undefined\n return (\n <Feedback\n title={config?.title ?? defaultTitles.feedback}\n description={config?.description}\n customer={state.customer}\n subscriptions={state.subscriptions}\n placeholder={config?.placeholder}\n required={config?.required ?? false}\n minLength={config?.minLength ?? 0}\n value={state.feedback}\n onChange={machine.setFeedback}\n onSubmit={machine.next}\n classNames={config?.classNames}\n />\n )\n }\n\n case 'confirm': {\n const Confirm = components?.Confirm ?? DefaultConfirm\n const config = stepConfig as ConfirmStep | undefined\n return (\n <Confirm\n title={config?.title ?? defaultTitles.confirm}\n description={config?.description}\n customer={state.customer}\n subscriptions={state.subscriptions}\n losses={config?.losses}\n lossesLabel={config?.lossesLabel}\n confirmLabel={config?.confirmLabel ?? 'Cancel subscription'}\n goBackLabel={config?.goBackLabel ?? 'Go back'}\n onConfirm={machine.cancel}\n onGoBack={machine.back}\n isProcessing={state.isProcessing}\n classNames={config?.classNames}\n />\n )\n }\n\n case 'success': {\n const Success = components?.Success ?? DefaultSuccess\n const config = stepConfig as SuccessStep | undefined\n const isSaved = state.outcome === 'saved'\n return (\n <Success\n outcome={state.outcome ?? 'cancelled'}\n offer={machine.currentOffer ?? undefined}\n title={\n isSaved ? (config?.savedTitle ?? 'Welcome back!') : (config?.cancelledTitle ?? 'Subscription cancelled')\n }\n description={\n isSaved\n ? (config?.savedDescription ?? 'Your offer has been applied.')\n : (config?.cancelledDescription ?? \"We're sorry to see you go.\")\n }\n customer={state.customer}\n subscriptions={state.subscriptions}\n onClose={machine.close}\n classNames={config?.classNames}\n />\n )\n }\n\n default: {\n const CustomStep = customComponents?.[state.step] as ((props: CustomStepProps) => ReactElement) | undefined\n\n if (!CustomStep) {\n return <UnregisteredStepFallback step={state.step} onSkip={machine.next} />\n }\n\n const config = stepConfig as CustomStepProps['step'] | undefined\n\n return (\n <CustomStep\n step={{\n type: state.step,\n title: config?.title,\n description: config?.description,\n data: config?.data,\n }}\n customer={state.customer}\n subscriptions={state.subscriptions}\n onNext={machine.next}\n onBack={machine.back}\n />\n )\n }\n }\n}\n\n// Skip runs in an effect so we don't mutate machine state during render.\nfunction UnregisteredStepFallback({ step, onSkip }: { step: string; onSkip: () => void }) {\n useEffect(() => {\n console.warn(`[churnkey] No component registered for step type \"${step}\". Skipping.`)\n onSkip()\n }, [step, onSkip])\n return null\n}\n\n// Pass machine.decline as onSkip so the auto-advance doesn't record an accept.\nfunction UnregisteredOfferFallback({ offerType, onSkip }: { offerType: string; onSkip: () => void }) {\n useEffect(() => {\n console.warn(`[churnkey] No component registered for offer type \"${offerType}\". Skipping.`)\n onSkip()\n }, [offerType, onSkip])\n return null\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/rich-text.tsx","../src/components/steps/default-confirm.tsx","../src/components/steps/default-feedback.tsx","../src/components/steps/offer/default-contact-offer.tsx","../src/components/steps/offer/default-discount-offer.tsx","../src/components/steps/offer/default-pause-offer.tsx","../src/components/steps/shared.tsx","../src/components/steps/offer/default-plan-change-offer.tsx","../src/components/steps/offer/default-rebate-offer.tsx","../src/components/steps/offer/default-redirect-offer.tsx","../src/components/steps/offer/default-trial-extension-offer.tsx","../src/components/steps/default-offer.tsx","../src/components/steps/default-success.tsx","../src/components/steps/default-survey.tsx","../src/components/structural/default-back-button.tsx","../src/components/structural/default-close-button.tsx","../src/components/structural/default-modal.tsx","../src/components/use-color-scheme.ts","../src/components/cancel-flow.tsx"],"names":["jsx","jsxs","useState","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["// Renders copy that may contain dashboard-authored HTML (offer body, step\n// descriptions) as actual HTML rather than escaped text. Copy comes from a\n// user's Churnkey dashboard, not user input, and\n// merge fields are pre-substituted in the transform layer before the string\n// reaches this component. If we ever need stricter hardening, sanitization\n// (e.g. DOMPurify) should go here, not at every call site.\n\ntype RichTextTag = 'p' | 'div' | 'span'\n\ninterface RichTextProps {\n html: string | undefined | null\n as?: RichTextTag\n className?: string\n}\n\nexport function RichText({ html, as = 'p', className }: RichTextProps) {\n if (!html) return null\n const Tag = as\n return (\n <Tag\n className={className}\n // biome-ignore lint/security/noDangerouslySetInnerHtml: see file-level comment\n dangerouslySetInnerHTML={{ __html: html }}\n />\n )\n}\n","import { formatPeriodEnd } from '../../core/format'\nimport type { ConfirmStepProps } from '../../core/types'\nimport { cn } from '../../core/utils'\nimport { RichText } from '../rich-text'\n\nexport function DefaultConfirm({\n title,\n description,\n subscriptions,\n losses,\n lossesLabel,\n confirmLabel,\n goBackLabel,\n onConfirm,\n onGoBack,\n isProcessing,\n classNames,\n}: ConfirmStepProps) {\n const hasLosses = Array.isArray(losses) && losses.length > 0\n const periodEnd = formatPeriodEnd(subscriptions)\n return (\n <div className={cn('ck-step ck-step-confirm', classNames?.root)}>\n <h2 className={cn('ck-step-title', classNames?.title)}>{title}</h2>\n {description && <RichText html={description} className={cn('ck-step-description', classNames?.description)} />}\n\n {hasLosses && (\n <div className={cn('ck-loss-block', classNames?.lossList)}>\n <div className={cn('ck-loss-label', classNames?.lossLabel)}>{lossesLabel ?? \"You'll lose access to:\"}</div>\n <ul className=\"ck-loss-list\">\n {losses.map((item) => (\n <li key={item} className={cn('ck-loss-item', classNames?.lossItem)}>\n <span aria-hidden className={cn('ck-loss-bullet', classNames?.lossBullet)}>\n ●\n </span>\n <span>{item}</span>\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {periodEnd && (\n <p className={cn('ck-period-end', classNames?.periodEndNotice)}>Your access continues until {periodEnd}.</p>\n )}\n\n <button\n type=\"button\"\n className={cn('ck-button ck-button-danger', classNames?.confirmButton)}\n onClick={onConfirm}\n disabled={isProcessing}\n >\n {isProcessing ? 'Processing...' : confirmLabel}\n </button>\n <button type=\"button\" className={cn('ck-button-link', classNames?.goBackButton)} onClick={onGoBack}>\n {goBackLabel}\n </button>\n </div>\n )\n}\n","import { useState } from 'react'\nimport type { FeedbackStepProps } from '../../core/types'\nimport { cn } from '../../core/utils'\nimport { RichText } from '../rich-text'\n\nexport function DefaultFeedback({\n title,\n description,\n placeholder,\n required,\n minLength,\n value,\n onChange,\n onSubmit,\n classNames,\n}: FeedbackStepProps) {\n const [focused, setFocused] = useState(false)\n const hasMin = minLength > 0\n const isUnderMin = hasMin && value.length > 0 && value.length < minLength\n const isValid = !required || value.length >= minLength\n const placeholderText = placeholder ?? (hasMin ? `At least ${minLength} characters…` : 'Type your thoughts…')\n\n return (\n <div className={cn('ck-step ck-step-feedback', classNames?.root)}>\n <h2 className={cn('ck-step-title', classNames?.title)}>{title}</h2>\n {description && <RichText html={description} className={cn('ck-step-description', classNames?.description)} />}\n\n <div\n className={cn(\n 'ck-feedback-field',\n focused && 'ck-feedback-field--focused',\n isUnderMin && 'ck-feedback-field--invalid',\n )}\n >\n <textarea\n className={cn('ck-textarea', classNames?.textarea)}\n placeholder={placeholderText}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n rows={3}\n />\n {hasMin && (\n <div\n className={cn(\n 'ck-character-count',\n isUnderMin && 'ck-character-count--invalid',\n classNames?.characterCount,\n )}\n >\n {value.length} / {minLength}\n </div>\n )}\n </div>\n\n <button\n type=\"button\"\n className={cn('ck-button ck-button-primary', classNames?.submitButton)}\n onClick={onSubmit}\n disabled={!isValid}\n >\n Continue\n </button>\n </div>\n )\n}\n","import type { OfferStepProps } from '../../../core/types'\nimport { cn } from '../../../core/utils'\nimport { RichText } from '../../rich-text'\n\n// Contact offers render no body by default — title and description carry the\n// pitch, the accept button triggers the consumer's handleContact callback\n// (which usually opens the offer's url). Override the slot to add an\n// avatar/SLA/etc. specific to your support team.\nexport function DefaultContactOffer({\n title,\n description,\n offer,\n onAccept,\n onDecline,\n isProcessing,\n classNames,\n}: OfferStepProps) {\n const headline = title ?? offer.copy.headline\n const body = description ?? offer.copy.body\n\n return (\n <div className={cn('ck-step ck-step-offer', classNames?.root)}>\n {headline && <h2 className={cn('ck-step-title', classNames?.title)}>{headline}</h2>}\n {body && <RichText html={body} className={cn('ck-step-description', classNames?.description)} />}\n\n <div className={cn('ck-offer-card', classNames?.card)}>\n <button\n type=\"button\"\n className={cn('ck-button ck-button-primary', classNames?.acceptButton)}\n onClick={() => onAccept()}\n disabled={isProcessing}\n >\n {isProcessing ? 'Processing...' : offer.copy.cta}\n </button>\n <button type=\"button\" className={cn('ck-button-link', classNames?.declineButton)} onClick={onDecline}>\n {offer.copy.declineCta}\n </button>\n </div>\n </div>\n )\n}\n","import { discountPhrase } from '../../../core/format'\nimport type { OfferDecision, OfferStepProps } from '../../../core/types'\nimport { cn } from '../../../core/utils'\nimport { RichText } from '../../rich-text'\n\nexport function DefaultDiscountOffer({\n title,\n description,\n offer,\n onAccept,\n onDecline,\n isProcessing,\n classNames,\n}: OfferStepProps) {\n const o = offer as OfferDecision & {\n percentOff?: number\n amountOff?: number\n currency?: string\n durationInMonths?: number\n }\n const headline = title ?? offer.copy.headline\n const body = description ?? offer.copy.body\n const phrase = discountPhrase(o)\n\n return (\n <div className={cn('ck-step ck-step-offer', classNames?.root)}>\n {headline && <h2 className={cn('ck-step-title', classNames?.title)}>{headline}</h2>}\n {body && <RichText html={body} className={cn('ck-step-description', classNames?.description)} />}\n\n <div className={cn('ck-offer-card', classNames?.card)}>\n <div className=\"ck-offer-details ck-offer-discount\">\n <div className=\"ck-offer-discount-eyebrow\">Limited-time offer</div>\n <div className=\"ck-offer-discount-phrase\">{phrase}</div>\n </div>\n <button\n type=\"button\"\n className={cn('ck-button ck-button-primary', classNames?.acceptButton)}\n onClick={() => onAccept()}\n disabled={isProcessing}\n >\n {isProcessing ? 'Processing...' : offer.copy.cta}\n </button>\n <button type=\"button\" className={cn('ck-button-link', classNames?.declineButton)} onClick={onDecline}>\n {offer.copy.declineCta}\n </button>\n </div>\n </div>\n )\n}\n","import { useState } from 'react'\nimport { formatMonthDayLong } from '../../../core/format'\nimport type { OfferDecision, OfferStepProps } from '../../../core/types'\nimport { cn } from '../../../core/utils'\nimport { RichText } from '../../rich-text'\n\nexport function DefaultPauseOffer({\n title,\n description,\n offer,\n onAccept,\n onDecline,\n isProcessing,\n classNames,\n}: OfferStepProps) {\n const o = offer as OfferDecision & { months: number }\n const max = Math.max(1, o.months)\n const [months, setMonths] = useState<number>(1)\n\n const headline = title ?? offer.copy.headline\n const body = description ?? offer.copy.body\n\n const resume = new Date()\n resume.setMonth(resume.getMonth() + months)\n const resumeDate = formatMonthDayLong(resume)\n\n return (\n <div className={cn('ck-step ck-step-offer', classNames?.root)}>\n {headline && <h2 className={cn('ck-step-title', classNames?.title)}>{headline}</h2>}\n {body && <RichText html={body} className={cn('ck-step-description', classNames?.description)} />}\n\n <div className={cn('ck-offer-card ck-pause-card', classNames?.card)}>\n <div className=\"ck-pause-eyebrow\">We'll see you back on</div>\n <div className=\"ck-pause-date\">{resumeDate}</div>\n <div className={cn('ck-pause-chips', classNames?.pauseSlider)}>\n {Array.from({ length: max }, (_, i) => i + 1).map((m) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => setMonths(m)}\n className={cn('ck-pause-chip', m === months && 'ck-pause-chip--selected')}\n aria-pressed={m === months}\n >\n {m} {m === 1 ? 'month' : 'months'}\n </button>\n ))}\n </div>\n </div>\n <button\n type=\"button\"\n className={cn('ck-button ck-button-primary', classNames?.acceptButton)}\n onClick={() => onAccept({ months })}\n disabled={isProcessing}\n >\n {isProcessing ? 'Processing...' : offer.copy.cta}\n </button>\n <button type=\"button\" className={cn('ck-button-link', classNames?.declineButton)} onClick={onDecline}>\n {offer.copy.declineCta}\n </button>\n </div>\n )\n}\n","export function Checkmark({ color = 'currentColor', size = 14 }: { color?: string; size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 8.5L6.5 12L13 5\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n","import { useState } from 'react'\nimport { formatPriceFromMinor } from '../../../core/format'\nimport type { OfferDecision, OfferStepProps, PlanOption } from '../../../core/types'\nimport { cn } from '../../../core/utils'\nimport { RichText } from '../../rich-text'\nimport { Checkmark } from '../shared'\n\nexport function DefaultPlanChangeOffer({\n title,\n description,\n subscriptions,\n offer,\n onAccept,\n onDecline,\n isProcessing,\n classNames,\n}: OfferStepProps) {\n const o = offer as OfferDecision & { plans?: PlanOption[] }\n const plans = o.plans ?? []\n // Mark the customer's current plan via their first subscription's first\n // price; switching to that same plan would be a no-op so it gets disabled.\n const currentPlanId = subscriptions[0]?.items[0]?.price.id\n const initialPlanId = plans.find((p) => p.id !== currentPlanId)?.id ?? null\n const [selectedPlanId, setSelectedPlanId] = useState<string | null>(initialPlanId)\n const selectedPlan = plans.find((p) => p.id === selectedPlanId) ?? null\n\n const headline = title ?? offer.copy.headline\n const body = description ?? offer.copy.body\n const ctaLabel = isProcessing\n ? 'Processing...'\n : selectedPlan?.name\n ? `Switch to ${selectedPlan.name}`\n : offer.copy.cta\n\n return (\n <div className={cn('ck-step ck-step-offer', classNames?.root)}>\n {headline && <h2 className={cn('ck-step-title', classNames?.title)}>{headline}</h2>}\n {body && <RichText html={body} className={cn('ck-step-description', classNames?.description)} />}\n\n <div className={cn('ck-offer-card', classNames?.card)}>\n <div className=\"ck-offer-details ck-plan-grid\">\n {plans.map((plan) => {\n const interval = plan.duration?.interval ?? 'month'\n const currency = plan.amount.currency ?? 'USD'\n const isSelected = plan.id === selectedPlanId\n const isCurrent = plan.id === currentPlanId\n\n return (\n <button\n type=\"button\"\n key={plan.id}\n onClick={() => setSelectedPlanId(plan.id)}\n disabled={isCurrent}\n className={cn(\n 'ck-plan-card',\n isSelected && 'ck-plan-card--selected',\n isCurrent && 'ck-plan-card--current',\n )}\n aria-pressed={isSelected}\n >\n <div className=\"ck-plan-name\">\n {plan.name ?? plan.id}\n {isCurrent && <span className=\"ck-plan-current-badge\">Current</span>}\n </div>\n {plan.tagline && <div className=\"ck-plan-tagline\">{plan.tagline}</div>}\n\n <div className=\"ck-plan-price-row\">\n <span className=\"ck-plan-amount\">{formatPriceFromMinor(plan.amount.value, currency)}</span>\n <span className=\"ck-plan-period\">/{interval}</span>\n {plan.msrp && <span className=\"ck-plan-msrp\">{plan.msrp}</span>}\n </div>\n\n {plan.features && plan.features.length > 0 && (\n <ul className=\"ck-plan-features\">\n {plan.features.map((feature, i) => (\n <li key={`${plan.id}-feature-${i}`} className=\"ck-plan-feature\">\n <span className=\"ck-plan-feature-check\">\n <Checkmark size={11} />\n </span>\n {feature}\n </li>\n ))}\n </ul>\n )}\n </button>\n )\n })}\n </div>\n <button\n type=\"button\"\n className={cn('ck-button ck-button-primary', classNames?.acceptButton)}\n onClick={() => selectedPlanId && onAccept({ planId: selectedPlanId })}\n disabled={isProcessing || !selectedPlanId}\n >\n {ctaLabel}\n </button>\n <button type=\"button\" className={cn('ck-button-link', classNames?.declineButton)} onClick={onDecline}>\n {offer.copy.declineCta}\n </button>\n </div>\n </div>\n )\n}\n","import { formatPriceFromMinor } from '../../../core/format'\nimport type { OfferDecision, OfferStepProps } from '../../../core/types'\nimport { cn } from '../../../core/utils'\nimport { RichText } from '../../rich-text'\n\ntype RebateDecision = OfferDecision & {\n amountMinor?: number\n currency?: string\n amountPaidMinor?: number\n netAfterRebateMinor?: number\n}\n\nexport function DefaultRebateOffer({\n title,\n description,\n offer,\n onAccept,\n onDecline,\n isProcessing,\n classNames,\n}: OfferStepProps) {\n const o = offer as RebateDecision\n const headline = title ?? offer.copy.headline\n const body = description ?? offer.copy.body\n const currency = o.currency ?? 'usd'\n const amount = o.amountMinor ?? 0\n // refund = paid - net; tax = refund - rebate. The server's net already\n // accounts for tax refunded on the rebate, so no tax means refund == rebate.\n const refund =\n o.amountPaidMinor != null && o.netAfterRebateMinor != null ? o.amountPaidMinor - o.netAfterRebateMinor : amount\n const taxRefunded = refund - amount\n\n return (\n <div className={cn('ck-step ck-step-offer', classNames?.root)}>\n {headline && <h2 className={cn('ck-step-title', classNames?.title)}>{headline}</h2>}\n {body && <RichText html={body} className={cn('ck-step-description', classNames?.description)} />}\n\n <div className={cn('ck-offer-card', classNames?.card)}>\n {/* paid / money back / net, like an invoice. Paid and net only exist in token mode. */}\n <div className=\"ck-offer-rebate\">\n {o.amountPaidMinor != null && (\n <div className=\"ck-offer-rebate-row\">\n <span>You paid this period</span>\n <span>{formatPriceFromMinor(o.amountPaidMinor, currency)}</span>\n </div>\n )}\n <div className=\"ck-offer-rebate-row ck-offer-rebate-credit\">\n <span>\n Money back\n {taxRefunded > 0 && (\n <span className=\"ck-offer-rebate-tax\"> (incl. {formatPriceFromMinor(taxRefunded, currency)} tax)</span>\n )}\n </span>\n <span>−{formatPriceFromMinor(refund, currency)}</span>\n </div>\n {o.netAfterRebateMinor != null && (\n <div className=\"ck-offer-rebate-row ck-offer-rebate-total\">\n <span>Your net for this period</span>\n <span>{formatPriceFromMinor(o.netAfterRebateMinor, currency)}</span>\n </div>\n )}\n </div>\n\n <button\n type=\"button\"\n className={cn('ck-button ck-button-primary', classNames?.acceptButton)}\n onClick={() => onAccept()}\n disabled={isProcessing}\n >\n {isProcessing ? 'Processing...' : offer.copy.cta}\n </button>\n <button type=\"button\" className={cn('ck-button-link', classNames?.declineButton)} onClick={onDecline}>\n {offer.copy.declineCta}\n </button>\n </div>\n </div>\n )\n}\n","import type { OfferDecision, OfferStepProps } from '../../../core/types'\nimport { cn } from '../../../core/utils'\nimport { RichText } from '../../rich-text'\n\nexport function DefaultRedirectOffer({ title, description, offer, onDecline, classNames }: OfferStepProps) {\n const url = (offer as OfferDecision & { url: string }).url\n const headline = title ?? offer.copy.headline\n const body = description ?? offer.copy.body\n\n return (\n <div className={cn('ck-step ck-step-offer', classNames?.root)}>\n {headline && <h2 className={cn('ck-step-title', classNames?.title)}>{headline}</h2>}\n {body && <RichText html={body} className={cn('ck-step-description', classNames?.description)} />}\n\n <div className={cn('ck-offer-card', classNames?.card)}>\n <div className=\"ck-offer-details\">\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"ck-redirect-link\">\n <span>{offer.copy.cta}</span>\n <ExternalIcon />\n </a>\n </div>\n <button type=\"button\" className={cn('ck-button-link', classNames?.declineButton)} onClick={onDecline}>\n {offer.copy.declineCta}\n </button>\n </div>\n </div>\n )\n}\n\nfunction ExternalIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"ck-redirect-icon\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n )\n}\n","import { formatMonthDay } from '../../../core/format'\nimport type { OfferDecision, OfferStepProps } from '../../../core/types'\nimport { cn } from '../../../core/utils'\nimport { RichText } from '../../rich-text'\n\nexport function DefaultTrialExtensionOffer({\n title,\n description,\n offer,\n onAccept,\n onDecline,\n isProcessing,\n classNames,\n}: OfferStepProps) {\n const o = offer as OfferDecision & { days: number }\n const headline = title ?? offer.copy.headline\n const body = description ?? offer.copy.body\n const end = new Date()\n end.setDate(end.getDate() + o.days)\n const newEnd = formatMonthDay(end)\n\n return (\n <div className={cn('ck-step ck-step-offer', classNames?.root)}>\n {headline && <h2 className={cn('ck-step-title', classNames?.title)}>{headline}</h2>}\n {body && <RichText html={body} className={cn('ck-step-description', classNames?.description)} />}\n\n <div className={cn('ck-offer-card', classNames?.card)}>\n <div className=\"ck-offer-details ck-trial-block\">\n <div className=\"ck-trial-badge\">\n <div className=\"ck-trial-days\">+{o.days}</div>\n <div className=\"ck-trial-unit\">{o.days === 1 ? 'day' : 'days'}</div>\n </div>\n <div>\n <div className=\"ck-trial-end-label\">New end date</div>\n <div className=\"ck-trial-end-date\">{newEnd}</div>\n </div>\n </div>\n <button\n type=\"button\"\n className={cn('ck-button ck-button-primary', classNames?.acceptButton)}\n onClick={() => onAccept()}\n disabled={isProcessing}\n >\n {isProcessing ? 'Processing...' : offer.copy.cta}\n </button>\n <button type=\"button\" className={cn('ck-button-link', classNames?.declineButton)} onClick={onDecline}>\n {offer.copy.declineCta}\n </button>\n </div>\n </div>\n )\n}\n","import type { ReactElement } from 'react'\nimport type { OfferStepProps } from '../../core/types'\nimport { DefaultContactOffer } from './offer/default-contact-offer'\nimport { DefaultDiscountOffer } from './offer/default-discount-offer'\nimport { DefaultPauseOffer } from './offer/default-pause-offer'\nimport { DefaultPlanChangeOffer } from './offer/default-plan-change-offer'\nimport { DefaultRebateOffer } from './offer/default-rebate-offer'\nimport { DefaultRedirectOffer } from './offer/default-redirect-offer'\nimport { DefaultTrialExtensionOffer } from './offer/default-trial-extension-offer'\n\n// Routes to the per-type component, which owns its full canvas. Two\n// override seams: replace one type via `components.PauseOffer` (etc.), or\n// take over the whole offer step via the `Offer` slot.\nexport function DefaultOffer(props: OfferStepProps) {\n const { offer, components } = props\n const Component = pickOfferComponent(offer.type, components)\n // Custom offer types are dispatched upstream against `customComponents`,\n // so an unknown type reaching this switcher is bad data.\n if (!Component) return null\n return (\n <Component\n // Remount on offer change so per-type selection state (pause months,\n // plan id) doesn't leak across reason switches.\n key={offer.decisionId ?? offer.type}\n {...props}\n />\n )\n}\n\nfunction pickOfferComponent(\n type: string,\n components: OfferStepProps['components'],\n): ((props: OfferStepProps) => ReactElement) | null {\n switch (type) {\n case 'discount':\n return components?.DiscountOffer ?? DefaultDiscountOffer\n case 'pause':\n return components?.PauseOffer ?? DefaultPauseOffer\n case 'trial_extension':\n return components?.TrialExtensionOffer ?? DefaultTrialExtensionOffer\n case 'plan_change':\n return components?.PlanChangeOffer ?? DefaultPlanChangeOffer\n case 'contact':\n return components?.ContactOffer ?? DefaultContactOffer\n case 'redirect':\n return components?.RedirectOffer ?? DefaultRedirectOffer\n case 'rebate':\n return components?.RebateOffer ?? DefaultRebateOffer\n default:\n return null\n }\n}\n","import type { SuccessStepProps } from '../../core/types'\nimport { cn } from '../../core/utils'\nimport { RichText } from '../rich-text'\nimport { Checkmark } from './shared'\n\nexport function DefaultSuccess({ title, description, onClose, classNames }: SuccessStepProps) {\n return (\n <div className={cn('ck-step ck-step-success', classNames?.root)}>\n <div className={cn('ck-success-icon', classNames?.icon)}>\n <Checkmark color=\"currentColor\" size={26} />\n </div>\n\n <h2 className={cn('ck-step-title', classNames?.title)}>{title}</h2>\n {description && <RichText html={description} className={cn('ck-step-description', classNames?.description)} />}\n\n <div className=\"ck-success-actions\">\n <button type=\"button\" className={cn('ck-button ck-button-primary', classNames?.closeButton)} onClick={onClose}>\n Done\n </button>\n </div>\n </div>\n )\n}\n","import type { ReasonButtonProps, SurveyStepProps } from '../../core/types'\nimport { cn } from '../../core/utils'\nimport { RichText } from '../rich-text'\nimport { Checkmark } from './shared'\n\nfunction DefaultReasonButton({ reason, index, isSelected, onSelect }: ReasonButtonProps) {\n const letter = String.fromCharCode(65 + index)\n\n return (\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n onClick={() => onSelect(reason.id)}\n className={cn('ck-reason-button', isSelected && 'ck-reason-button--selected')}\n >\n <span aria-hidden className=\"ck-reason-badge\">\n {isSelected ? <Checkmark color=\"#fff\" size={12} /> : letter}\n </span>\n <span className=\"ck-reason-label\">{reason.label}</span>\n </button>\n )\n}\n\nexport function DefaultSurvey({\n title,\n description,\n reasons,\n selectedReason,\n onSelectReason,\n followupResponse,\n onFollowupResponseChange,\n onNext,\n classNames,\n components,\n}: SurveyStepProps) {\n const ReasonButton = components?.ReasonButton ?? DefaultReasonButton\n const selected = reasons.find((r) => r.id === selectedReason)\n const showFollowup = selected?.freeform === true\n\n return (\n <div className={cn('ck-step ck-step-survey', classNames?.root)}>\n <h2 className={cn('ck-step-title', classNames?.title)}>{title}</h2>\n {description && <RichText html={description} className={cn('ck-step-description', classNames?.description)} />}\n\n <div className={cn('ck-reason-list', classNames?.reasonList)} role=\"radiogroup\" aria-label={title}>\n {reasons.map((reason, i) => (\n <ReasonButton\n key={reason.id}\n reason={reason}\n index={i}\n isSelected={selectedReason === reason.id}\n onSelect={onSelectReason}\n />\n ))}\n </div>\n\n {showFollowup && (\n <textarea\n className={cn('ck-reason-followup', classNames?.followupInput)}\n placeholder=\"Tell us more (optional)\"\n rows={3}\n value={followupResponse}\n onChange={(e) => onFollowupResponseChange(e.target.value)}\n aria-label=\"Additional detail\"\n />\n )}\n\n <button\n type=\"button\"\n className={cn('ck-button ck-button-primary', classNames?.continueButton)}\n onClick={onNext}\n disabled={!selectedReason}\n >\n Continue\n </button>\n </div>\n )\n}\n\nexport { DefaultReasonButton }\n","import type { BackButtonProps } from '../../core/types'\nimport { cn } from '../../core/utils'\n\nexport function DefaultBackButton({ onBack, className }: BackButtonProps) {\n return (\n <button type=\"button\" className={cn('ck-back-button', className)} onClick={onBack}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M12.5 4L6.5 10l6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span>Back</span>\n </button>\n )\n}\n","import type { CloseButtonProps } from '../../core/types'\nimport { cn } from '../../core/utils'\n\nexport function DefaultCloseButton({ onClose, className }: CloseButtonProps) {\n return (\n <button type=\"button\" className={cn('ck-close-button', className)} onClick={onClose} aria-label=\"Close\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M15 5L5 15M5 5l10 10\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )\n}\n","import { useCallback, useEffect, useRef } from 'react'\nimport type { ModalProps } from '../../core/types'\nimport { cn } from '../../core/utils'\n\n// Only traps visible, enabled elements\nfunction trapFocus(container: HTMLElement): () => void {\n const focusableSelector = [\n 'a[href]',\n 'button:not(:disabled)',\n 'input:not(:disabled)',\n 'textarea:not(:disabled)',\n 'select:not(:disabled)',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(', ')\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') return\n\n const focusable = Array.from(container.querySelectorAll<HTMLElement>(focusableSelector)).filter(\n (el) => el.offsetParent !== null,\n ) // visible only\n if (focusable.length === 0) return\n\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault()\n last.focus()\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault()\n first.focus()\n }\n }\n\n container.addEventListener('keydown', handleKeyDown)\n return () => container.removeEventListener('keydown', handleKeyDown)\n}\n\nexport function DefaultModal({ open, onClose, children, className, overlayClassName }: ModalProps) {\n const overlayRef = useRef<HTMLDivElement>(null)\n const modalRef = useRef<HTMLDivElement>(null)\n const previousFocusRef = useRef<HTMLElement | null>(null)\n\n // Save focus, set up trap, restore on unmount\n useEffect(() => {\n if (!open || !modalRef.current) return\n\n previousFocusRef.current = document.activeElement as HTMLElement\n modalRef.current.focus()\n\n const cleanup = trapFocus(modalRef.current)\n return () => {\n cleanup()\n previousFocusRef.current?.focus()\n }\n }, [open])\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n },\n [onClose],\n )\n\n useEffect(() => {\n if (!open) return\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [open, handleKeyDown])\n\n if (!open) return null\n\n return (\n <div\n ref={overlayRef}\n className={cn('ck-overlay', overlayClassName)}\n onClick={(e) => {\n if (e.target === overlayRef.current) onClose()\n }}\n >\n <div\n ref={modalRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"ck-dialog-title\"\n tabIndex={-1}\n className={cn('ck-modal', className)}\n >\n {children}\n </div>\n </div>\n )\n}\n","import { useEffect, useState } from 'react'\n\ntype ColorScheme = 'light' | 'dark'\n\nconst query = '(prefers-color-scheme: dark)'\n\nfunction getSystemScheme(): ColorScheme {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return 'light'\n return window.matchMedia(query).matches ? 'dark' : 'light'\n}\n\nexport function useColorScheme(preference?: 'auto' | 'light' | 'dark'): ColorScheme {\n const [system, setSystem] = useState(getSystemScheme)\n\n useEffect(() => {\n if (preference !== 'auto' || typeof window === 'undefined' || typeof window.matchMedia !== 'function') return\n const mql = window.matchMedia(query)\n const onChange = () => setSystem(mql.matches ? 'dark' : 'light')\n mql.addEventListener('change', onChange)\n return () => mql.removeEventListener('change', onChange)\n }, [preference])\n\n if (!preference || preference === 'light') return 'light'\n if (preference === 'dark') return 'dark'\n return system\n}\n","import { type ReactElement, useEffect } from 'react'\nimport type { CancelFlowMachine } from '../core/machine'\nimport type {\n CancelFlowProps,\n ComponentOverrides,\n ConfirmStep,\n CustomComponents,\n CustomOfferProps,\n CustomStepProps,\n FeedbackStep,\n FlowState,\n OfferStep,\n SuccessStep,\n SurveyStep,\n} from '../core/types'\nimport { appearanceToStyle, BUILT_IN_OFFER_TYPES, defaultTitles } from '../core/utils'\nimport { useCancelFlowMachine } from '../headless/use-cancel-flow-machine'\nimport { DefaultConfirm } from './steps/default-confirm'\nimport { DefaultFeedback } from './steps/default-feedback'\nimport { DefaultOffer } from './steps/default-offer'\nimport { DefaultSuccess } from './steps/default-success'\nimport { DefaultSurvey } from './steps/default-survey'\nimport { DefaultBackButton } from './structural/default-back-button'\nimport { DefaultCloseButton } from './structural/default-close-button'\nimport { DefaultModal } from './structural/default-modal'\nimport { useColorScheme } from './use-color-scheme'\n\nexport function CancelFlow(props: CancelFlowProps) {\n const { machine, state, isLoading, loadError, retry } = useCancelFlowMachine(props)\n\n if (isLoading || loadError) {\n return (\n <LoadStatus\n appearance={props.appearance}\n classNames={props.classNames}\n components={props.components}\n onClose={props.onClose}\n isLoading={isLoading}\n loadError={loadError}\n onRetry={retry}\n />\n )\n }\n\n return (\n <FlowShell\n machine={machine}\n state={state}\n appearance={props.appearance}\n classNames={props.classNames}\n components={props.components}\n customComponents={props.customComponents}\n />\n )\n}\n\nfunction LoadStatus({\n appearance,\n classNames,\n components,\n onClose,\n isLoading,\n loadError,\n onRetry,\n}: {\n appearance?: CancelFlowProps['appearance']\n classNames?: CancelFlowProps['classNames']\n components?: CancelFlowProps['components']\n onClose?: CancelFlowProps['onClose']\n isLoading: boolean\n loadError: Error | null\n onRetry: () => void\n}) {\n const scheme = useColorScheme(appearance?.colorScheme)\n const appearanceStyle = appearanceToStyle(appearance)\n const Modal = components?.Modal ?? DefaultModal\n const CloseButton = components?.CloseButton ?? DefaultCloseButton\n const handleClose = onClose ?? (() => {})\n\n return (\n <div className=\"ck-cancel-flow\" data-color-scheme={scheme} style={appearanceStyle}>\n <Modal open={true} onClose={handleClose} className={classNames?.modal} overlayClassName={classNames?.overlay}>\n <CloseButton onClose={handleClose} className={classNames?.closeButton} />\n <div className=\"ck-content\">\n {isLoading && (\n <div className=\"ck-loading\" style={{ padding: '32px', textAlign: 'center' }}>\n <div\n className=\"ck-loading-spinner\"\n style={{\n width: 32,\n height: 32,\n border: '3px solid var(--ck-color-border, #e5e7eb)',\n borderTopColor: 'var(--ck-color-primary, #2563eb)',\n borderRadius: '50%',\n animation: 'ck-spin 0.6s linear infinite',\n margin: '0 auto 16px',\n }}\n />\n <p style={{ color: 'var(--ck-color-text-secondary, #6b7280)' }}>Loading your options...</p>\n </div>\n )}\n {loadError && (\n <div className=\"ck-error\" role=\"alert\" style={{ padding: '32px', textAlign: 'center' }}>\n <p className=\"ck-error-message\" style={{ marginBottom: 16 }}>\n We couldn't load your cancellation options. Please try again.\n </p>\n <button\n type=\"button\"\n className=\"ck-retry-button\"\n onClick={onRetry}\n style={{\n padding: '8px 20px',\n fontSize: 14,\n fontWeight: 600,\n background: 'var(--ck-color-primary, #2563eb)',\n color: '#fff',\n border: 'none',\n borderRadius: 'var(--ck-border-radius, 8px)',\n cursor: 'pointer',\n }}\n >\n Try again\n </button>\n </div>\n )}\n </div>\n </Modal>\n </div>\n )\n}\n\ninterface FlowShellProps {\n machine: CancelFlowMachine\n state: FlowState\n appearance?: CancelFlowProps['appearance']\n classNames?: CancelFlowProps['classNames']\n components?: CancelFlowProps['components']\n customComponents?: CustomComponents\n}\n\nfunction FlowShell({ machine, state, appearance, classNames, components, customComponents }: FlowShellProps) {\n const scheme = useColorScheme(appearance?.colorScheme)\n const appearanceStyle = appearanceToStyle(appearance)\n\n const Modal = components?.Modal ?? DefaultModal\n const CloseButton = components?.CloseButton ?? DefaultCloseButton\n const BackButton = components?.BackButton ?? DefaultBackButton\n\n return (\n <div className=\"ck-cancel-flow\" data-color-scheme={scheme} style={appearanceStyle}>\n <Modal open={true} onClose={machine.close} className={classNames?.modal} overlayClassName={classNames?.overlay}>\n <CloseButton onClose={machine.close} className={classNames?.closeButton} />\n <div className=\"ck-content\">\n {machine.canGoBack && <BackButton onBack={machine.back} className={classNames?.backButton} />}\n {state.error && (\n <div className=\"ck-error\" role=\"alert\">\n <p className=\"ck-error-message\">Something went wrong. Please try again.</p>\n </div>\n )}\n <StepRenderer state={state} machine={machine} components={components} customComponents={customComponents} />\n </div>\n </Modal>\n </div>\n )\n}\n\nfunction StepRenderer({\n state,\n machine,\n components,\n customComponents,\n}: {\n state: FlowState\n machine: CancelFlowMachine\n components?: Partial<ComponentOverrides>\n customComponents?: CustomComponents\n}) {\n const stepConfig = machine.currentStep\n\n switch (state.step) {\n case 'survey': {\n const Survey = components?.Survey ?? DefaultSurvey\n const config = stepConfig as SurveyStep | undefined\n return (\n <Survey\n title={config?.title ?? defaultTitles.survey}\n description={config?.description}\n customer={state.customer}\n subscriptions={state.subscriptions}\n reasons={machine.reasons}\n selectedReason={state.selectedReason}\n onSelectReason={machine.selectReason}\n followupResponse={state.followupResponse}\n onFollowupResponseChange={machine.setFollowupResponse}\n onNext={machine.next}\n classNames={config?.classNames}\n components={components}\n />\n )\n }\n\n case 'offer': {\n const offer = machine.currentOffer\n if (!offer) return null\n // Custom offer types (e.g. 'change-seats') match against\n // customComponents first; built-ins fall through to DefaultOffer.\n const CustomOffer = customComponents?.[offer.type] as ((props: CustomOfferProps) => ReactElement) | undefined\n if (CustomOffer) {\n return (\n <CustomOffer\n offer={offer}\n customer={state.customer}\n subscriptions={state.subscriptions}\n onAccept={machine.accept}\n onDecline={machine.decline}\n isProcessing={state.isProcessing}\n />\n )\n }\n if (!BUILT_IN_OFFER_TYPES.includes(offer.type)) {\n return <UnregisteredOfferFallback offerType={offer.type} onSkip={machine.decline} />\n }\n const Offer = components?.Offer ?? DefaultOffer\n const config = stepConfig as OfferStep | undefined\n return (\n <Offer\n title={config?.title}\n description={config?.description}\n customer={state.customer}\n subscriptions={state.subscriptions}\n offer={offer}\n onAccept={machine.accept}\n onDecline={machine.decline}\n isProcessing={state.isProcessing}\n classNames={config?.classNames}\n components={components}\n />\n )\n }\n\n case 'feedback': {\n const Feedback = components?.Feedback ?? DefaultFeedback\n const config = stepConfig as FeedbackStep | undefined\n return (\n <Feedback\n title={config?.title ?? defaultTitles.feedback}\n description={config?.description}\n customer={state.customer}\n subscriptions={state.subscriptions}\n placeholder={config?.placeholder}\n required={config?.required ?? false}\n minLength={config?.minLength ?? 0}\n value={state.feedback}\n onChange={machine.setFeedback}\n onSubmit={machine.next}\n classNames={config?.classNames}\n />\n )\n }\n\n case 'confirm': {\n const Confirm = components?.Confirm ?? DefaultConfirm\n const config = stepConfig as ConfirmStep | undefined\n return (\n <Confirm\n title={config?.title ?? defaultTitles.confirm}\n description={config?.description}\n customer={state.customer}\n subscriptions={state.subscriptions}\n losses={config?.losses}\n lossesLabel={config?.lossesLabel}\n confirmLabel={config?.confirmLabel ?? 'Cancel subscription'}\n goBackLabel={config?.goBackLabel ?? 'Go back'}\n onConfirm={machine.cancel}\n onGoBack={machine.back}\n isProcessing={state.isProcessing}\n classNames={config?.classNames}\n />\n )\n }\n\n case 'success': {\n const Success = components?.Success ?? DefaultSuccess\n const config = stepConfig as SuccessStep | undefined\n const isSaved = state.outcome === 'saved'\n return (\n <Success\n outcome={state.outcome ?? 'cancelled'}\n offer={machine.currentOffer ?? undefined}\n title={\n isSaved ? (config?.savedTitle ?? 'Welcome back!') : (config?.cancelledTitle ?? 'Subscription cancelled')\n }\n description={\n isSaved\n ? (config?.savedDescription ?? 'Your offer has been applied.')\n : (config?.cancelledDescription ?? \"We're sorry to see you go.\")\n }\n customer={state.customer}\n subscriptions={state.subscriptions}\n onClose={machine.close}\n classNames={config?.classNames}\n />\n )\n }\n\n default: {\n const CustomStep = customComponents?.[state.step] as ((props: CustomStepProps) => ReactElement) | undefined\n\n if (!CustomStep) {\n return <UnregisteredStepFallback step={state.step} onSkip={machine.next} />\n }\n\n const config = stepConfig as CustomStepProps['step'] | undefined\n\n return (\n <CustomStep\n step={{\n type: state.step,\n title: config?.title,\n description: config?.description,\n data: config?.data,\n }}\n customer={state.customer}\n subscriptions={state.subscriptions}\n onNext={machine.next}\n onBack={machine.back}\n />\n )\n }\n }\n}\n\n// Skip runs in an effect so we don't mutate machine state during render.\nfunction UnregisteredStepFallback({ step, onSkip }: { step: string; onSkip: () => void }) {\n useEffect(() => {\n console.warn(`[churnkey] No component registered for step type \"${step}\". Skipping.`)\n onSkip()\n }, [step, onSkip])\n return null\n}\n\n// Pass machine.decline as onSkip so the auto-advance doesn't record an accept.\nfunction UnregisteredOfferFallback({ offerType, onSkip }: { offerType: string; onSkip: () => void }) {\n useEffect(() => {\n console.warn(`[churnkey] No component registered for offer type \"${offerType}\". Skipping.`)\n onSkip()\n }, [offerType, onSkip])\n return null\n}\n"]}
|
|
@@ -164,12 +164,12 @@ interface RedirectOffer {
|
|
|
164
164
|
}
|
|
165
165
|
interface RebateOffer {
|
|
166
166
|
type: 'rebate';
|
|
167
|
-
/**
|
|
167
|
+
/** The rebate amount (pre-tax), smallest currency unit. The card is refunded this plus any tax charged on it. */
|
|
168
168
|
amountMinor: number;
|
|
169
169
|
currency: string;
|
|
170
170
|
/** Gross paid on the target invoice. Server-resolved in token mode. */
|
|
171
171
|
amountPaidMinor?: number;
|
|
172
|
-
/** amountPaidMinor
|
|
172
|
+
/** amountPaidMinor minus the full refund (the rebate plus its tax). Server-resolved in token mode. */
|
|
173
173
|
netAfterRebateMinor?: number;
|
|
174
174
|
paymentMethodBrand?: string;
|
|
175
175
|
paymentMethodLast4?: string;
|
|
@@ -538,6 +538,15 @@ interface FlowConfig extends FlowCallbacks {
|
|
|
538
538
|
appId?: string;
|
|
539
539
|
customer?: DirectCustomer;
|
|
540
540
|
subscriptions?: DirectSubscription[];
|
|
541
|
+
/**
|
|
542
|
+
* Client-side attribute layer on top of provider data, e.g. usage counts
|
|
543
|
+
* or entitlements only the host app knows (`{ videosCreated: 28 }`). In token mode
|
|
544
|
+
* they're sent with the config request so segments can match on them when
|
|
545
|
+
* picking the blueprint. In every mode they resolve as merge fields and
|
|
546
|
+
* are recorded on the session, taking precedence over `customer.metadata`
|
|
547
|
+
* keys. Same role as the embed's `customerAttributes`.
|
|
548
|
+
*/
|
|
549
|
+
customerAttributes?: Record<string, unknown>;
|
|
541
550
|
session?: string;
|
|
542
551
|
apiBaseUrl?: string;
|
|
543
552
|
steps?: Step[];
|
|
@@ -584,6 +593,8 @@ interface CancelFlowProps extends FlowCallbacks {
|
|
|
584
593
|
appId?: string;
|
|
585
594
|
customer?: DirectCustomer;
|
|
586
595
|
subscriptions?: DirectSubscription[];
|
|
596
|
+
/** See FlowConfig.customerAttributes. */
|
|
597
|
+
customerAttributes?: Record<string, unknown>;
|
|
587
598
|
session?: string;
|
|
588
599
|
steps?: Step[];
|
|
589
600
|
apiBaseUrl?: string;
|
|
@@ -164,12 +164,12 @@ interface RedirectOffer {
|
|
|
164
164
|
}
|
|
165
165
|
interface RebateOffer {
|
|
166
166
|
type: 'rebate';
|
|
167
|
-
/**
|
|
167
|
+
/** The rebate amount (pre-tax), smallest currency unit. The card is refunded this plus any tax charged on it. */
|
|
168
168
|
amountMinor: number;
|
|
169
169
|
currency: string;
|
|
170
170
|
/** Gross paid on the target invoice. Server-resolved in token mode. */
|
|
171
171
|
amountPaidMinor?: number;
|
|
172
|
-
/** amountPaidMinor
|
|
172
|
+
/** amountPaidMinor minus the full refund (the rebate plus its tax). Server-resolved in token mode. */
|
|
173
173
|
netAfterRebateMinor?: number;
|
|
174
174
|
paymentMethodBrand?: string;
|
|
175
175
|
paymentMethodLast4?: string;
|
|
@@ -538,6 +538,15 @@ interface FlowConfig extends FlowCallbacks {
|
|
|
538
538
|
appId?: string;
|
|
539
539
|
customer?: DirectCustomer;
|
|
540
540
|
subscriptions?: DirectSubscription[];
|
|
541
|
+
/**
|
|
542
|
+
* Client-side attribute layer on top of provider data, e.g. usage counts
|
|
543
|
+
* or entitlements only the host app knows (`{ videosCreated: 28 }`). In token mode
|
|
544
|
+
* they're sent with the config request so segments can match on them when
|
|
545
|
+
* picking the blueprint. In every mode they resolve as merge fields and
|
|
546
|
+
* are recorded on the session, taking precedence over `customer.metadata`
|
|
547
|
+
* keys. Same role as the embed's `customerAttributes`.
|
|
548
|
+
*/
|
|
549
|
+
customerAttributes?: Record<string, unknown>;
|
|
541
550
|
session?: string;
|
|
542
551
|
apiBaseUrl?: string;
|
|
543
552
|
steps?: Step[];
|
|
@@ -584,6 +593,8 @@ interface CancelFlowProps extends FlowCallbacks {
|
|
|
584
593
|
appId?: string;
|
|
585
594
|
customer?: DirectCustomer;
|
|
586
595
|
subscriptions?: DirectSubscription[];
|
|
596
|
+
/** See FlowConfig.customerAttributes. */
|
|
597
|
+
customerAttributes?: Record<string, unknown>;
|
|
587
598
|
session?: string;
|
|
588
599
|
steps?: Step[];
|
|
589
600
|
apiBaseUrl?: string;
|
package/dist/styles.css
CHANGED
|
@@ -482,13 +482,20 @@
|
|
|
482
482
|
color: var(--ck-color-text-muted);
|
|
483
483
|
}
|
|
484
484
|
|
|
485
|
-
/* The
|
|
485
|
+
/* The money-back amount — the accented line. */
|
|
486
486
|
.ck-cancel-flow .ck-offer-rebate-credit {
|
|
487
487
|
font-size: 14px;
|
|
488
488
|
font-weight: 600;
|
|
489
489
|
color: var(--ck-color-primary);
|
|
490
490
|
}
|
|
491
491
|
|
|
492
|
+
/* The "(incl. tax)" note, kept quieter than the amount. */
|
|
493
|
+
.ck-cancel-flow .ck-offer-rebate-tax {
|
|
494
|
+
font-size: 13px;
|
|
495
|
+
font-weight: 400;
|
|
496
|
+
color: var(--ck-color-text-muted);
|
|
497
|
+
}
|
|
498
|
+
|
|
492
499
|
.ck-cancel-flow .ck-offer-rebate-total {
|
|
493
500
|
margin-top: 6px;
|
|
494
501
|
padding-top: 14px;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@churnkey/react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Production-ready cancel flow for React. Drop-in component, headless hook, or full customization. Works standalone or with Churnkey for AI-powered retention.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/headless/use-cancel-flow-machine.ts","../src/headless/use-cancel-flow.ts"],"names":["useRef","useState","CancelFlowMachine","useEffect","useCallback","decodeSessionToken","ChurnkeyApi"],"mappings":"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","file":"chunk-4BMB42WI.cjs","sourcesContent":["// Internal — shared by `useCancelFlow` (headless) and the `CancelFlow`\n// component. Lives under headless/ since it's the headless layer of the\n// SDK; the component imports it because there's no separate public/private\n// split worth maintaining for one shared file.\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { ChurnkeyApi } from '../core/api'\nimport { CancelFlowMachine } from '../core/machine'\nimport { decodeSessionToken } from '../core/token'\nimport type { FlowCallbacks, FlowConfig, FlowState } from '../core/types'\n\nexport interface CancelFlowMachineHandle {\n machine: CancelFlowMachine\n state: FlowState\n isLoading: boolean\n loadError: Error | null\n /** Re-fetch the flow config (token mode only). No-op without a session. */\n retry: () => void\n}\n\n/**\n * Wires a CancelFlowMachine to React lifecycle. Used internally by both the\n * `CancelFlow` component and the `useCancelFlow` hook — not part of the\n * public API.\n *\n * Callbacks reach the machine via thunks that dereference a ref updated each\n * render. This buys two things: the consumer's latest closure always runs,\n * and the fetch effect's dep list stays stable so inline-arrow handlers\n * don't trigger a re-fetch and reset the flow to step 1.\n */\nexport function useCancelFlowMachine(config: FlowConfig): CancelFlowMachineHandle {\n // FlowConfig extends FlowCallbacks, so storing the whole config gives us\n // access to every callback by name without a separate copy.\n const callbacksRef = useRef(config)\n callbacksRef.current = config\n\n const [machine] = useState(() => {\n const cb = callbacksRef\n const dispatch: FlowCallbacks = {\n handleDiscount: (o, c) => cb.current.handleDiscount?.(o, c),\n handlePause: (o, c) => cb.current.handlePause?.(o, c),\n handlePlanChange: (o, c) => cb.current.handlePlanChange?.(o, c),\n handleTrialExtension: (o, c) => cb.current.handleTrialExtension?.(o, c),\n handleCancel: (c) => cb.current.handleCancel?.(c),\n onAccept: (o, c) => cb.current.onAccept?.(o, c),\n onDiscount: (o, c) => cb.current.onDiscount?.(o, c),\n onPause: (o, c) => cb.current.onPause?.(o, c),\n onPlanChange: (o, c) => cb.current.onPlanChange?.(o, c),\n onTrialExtension: (o, c) => cb.current.onTrialExtension?.(o, c),\n onCancel: (c) => cb.current.onCancel?.(c),\n onClose: () => cb.current.onClose?.(),\n onStepChange: (step, prevStep) => cb.current.onStepChange?.(step, prevStep),\n }\n return new CancelFlowMachine({ ...config, ...dispatch })\n })\n\n const [state, setState] = useState<FlowState>(() => machine.getSnapshot())\n const [isLoading, setIsLoading] = useState(!!config.session)\n const [loadError, setLoadError] = useState<Error | null>(null)\n\n useEffect(() => {\n setState(machine.getSnapshot())\n return machine.subscribe(() => setState(machine.getSnapshot()))\n }, [machine])\n\n const loadConfig = useCallback(() => {\n if (!config.session) return\n setLoadError(null)\n setIsLoading(true)\n let cancelled = false\n const creds = decodeSessionToken(config.session)\n const api = new ChurnkeyApi(creds, config.apiBaseUrl)\n api\n .fetchConfig()\n .then((sdkConfig) => {\n if (cancelled) return\n machine.initializeFromConfig(sdkConfig, api, creds)\n setIsLoading(false)\n })\n .catch((err) => {\n if (cancelled) return\n setLoadError(err instanceof Error ? err : new Error(String(err)))\n setIsLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [config.session, config.apiBaseUrl, machine])\n\n useEffect(() => {\n if (!config.session) return\n return loadConfig()\n }, [config.session, loadConfig])\n\n return { machine, state, isLoading, loadError, retry: loadConfig }\n}\n","import type { FlowConfig } from '../core/types'\nimport { useCancelFlowMachine } from './use-cancel-flow-machine'\n\nexport function useCancelFlow(config: FlowConfig) {\n const { machine, state, isLoading, loadError, retry } = useCancelFlowMachine(config)\n\n return {\n ...state,\n isLoading,\n loadError,\n retry,\n reasons: machine.reasons,\n currentStep: machine.currentStep,\n currentOffer: machine.currentOffer,\n stepIndex: machine.stepIndex,\n totalSteps: machine.totalSteps,\n selectReason: machine.selectReason,\n setFollowupResponse: machine.setFollowupResponse,\n setFeedback: machine.setFeedback,\n accept: machine.accept,\n decline: machine.decline,\n cancel: machine.cancel,\n next: machine.next,\n back: machine.back,\n close: machine.close,\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/headless/use-cancel-flow-machine.ts","../src/headless/use-cancel-flow.ts"],"names":[],"mappings":"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","file":"chunk-F4ESJBOS.js","sourcesContent":["// Internal — shared by `useCancelFlow` (headless) and the `CancelFlow`\n// component. Lives under headless/ since it's the headless layer of the\n// SDK; the component imports it because there's no separate public/private\n// split worth maintaining for one shared file.\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { ChurnkeyApi } from '../core/api'\nimport { CancelFlowMachine } from '../core/machine'\nimport { decodeSessionToken } from '../core/token'\nimport type { FlowCallbacks, FlowConfig, FlowState } from '../core/types'\n\nexport interface CancelFlowMachineHandle {\n machine: CancelFlowMachine\n state: FlowState\n isLoading: boolean\n loadError: Error | null\n /** Re-fetch the flow config (token mode only). No-op without a session. */\n retry: () => void\n}\n\n/**\n * Wires a CancelFlowMachine to React lifecycle. Used internally by both the\n * `CancelFlow` component and the `useCancelFlow` hook — not part of the\n * public API.\n *\n * Callbacks reach the machine via thunks that dereference a ref updated each\n * render. This buys two things: the consumer's latest closure always runs,\n * and the fetch effect's dep list stays stable so inline-arrow handlers\n * don't trigger a re-fetch and reset the flow to step 1.\n */\nexport function useCancelFlowMachine(config: FlowConfig): CancelFlowMachineHandle {\n // FlowConfig extends FlowCallbacks, so storing the whole config gives us\n // access to every callback by name without a separate copy.\n const callbacksRef = useRef(config)\n callbacksRef.current = config\n\n const [machine] = useState(() => {\n const cb = callbacksRef\n const dispatch: FlowCallbacks = {\n handleDiscount: (o, c) => cb.current.handleDiscount?.(o, c),\n handlePause: (o, c) => cb.current.handlePause?.(o, c),\n handlePlanChange: (o, c) => cb.current.handlePlanChange?.(o, c),\n handleTrialExtension: (o, c) => cb.current.handleTrialExtension?.(o, c),\n handleCancel: (c) => cb.current.handleCancel?.(c),\n onAccept: (o, c) => cb.current.onAccept?.(o, c),\n onDiscount: (o, c) => cb.current.onDiscount?.(o, c),\n onPause: (o, c) => cb.current.onPause?.(o, c),\n onPlanChange: (o, c) => cb.current.onPlanChange?.(o, c),\n onTrialExtension: (o, c) => cb.current.onTrialExtension?.(o, c),\n onCancel: (c) => cb.current.onCancel?.(c),\n onClose: () => cb.current.onClose?.(),\n onStepChange: (step, prevStep) => cb.current.onStepChange?.(step, prevStep),\n }\n return new CancelFlowMachine({ ...config, ...dispatch })\n })\n\n const [state, setState] = useState<FlowState>(() => machine.getSnapshot())\n const [isLoading, setIsLoading] = useState(!!config.session)\n const [loadError, setLoadError] = useState<Error | null>(null)\n\n useEffect(() => {\n setState(machine.getSnapshot())\n return machine.subscribe(() => setState(machine.getSnapshot()))\n }, [machine])\n\n const loadConfig = useCallback(() => {\n if (!config.session) return\n setLoadError(null)\n setIsLoading(true)\n let cancelled = false\n const creds = decodeSessionToken(config.session)\n const api = new ChurnkeyApi(creds, config.apiBaseUrl)\n api\n .fetchConfig()\n .then((sdkConfig) => {\n if (cancelled) return\n machine.initializeFromConfig(sdkConfig, api, creds)\n setIsLoading(false)\n })\n .catch((err) => {\n if (cancelled) return\n setLoadError(err instanceof Error ? err : new Error(String(err)))\n setIsLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [config.session, config.apiBaseUrl, machine])\n\n useEffect(() => {\n if (!config.session) return\n return loadConfig()\n }, [config.session, loadConfig])\n\n return { machine, state, isLoading, loadError, retry: loadConfig }\n}\n","import type { FlowConfig } from '../core/types'\nimport { useCancelFlowMachine } from './use-cancel-flow-machine'\n\nexport function useCancelFlow(config: FlowConfig) {\n const { machine, state, isLoading, loadError, retry } = useCancelFlowMachine(config)\n\n return {\n ...state,\n isLoading,\n loadError,\n retry,\n reasons: machine.reasons,\n currentStep: machine.currentStep,\n currentOffer: machine.currentOffer,\n stepIndex: machine.stepIndex,\n totalSteps: machine.totalSteps,\n selectReason: machine.selectReason,\n setFollowupResponse: machine.setFollowupResponse,\n setFeedback: machine.setFeedback,\n accept: machine.accept,\n decline: machine.decline,\n cancel: machine.cancel,\n next: machine.next,\n back: machine.back,\n close: machine.close,\n }\n}\n"]}
|