@yca-software/yca-react-core 0.0.8 → 0.0.11

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/forms/description-field/index.tsx","../src/components/forms/email-field/index.tsx","../src/components/forms/expires-at-field/index.tsx","../src/components/forms/first-name-field/index.tsx","../src/components/forms/last-name-field/index.tsx","../src/components/forms/name-field/index.tsx","../src/components/forms/password-field/index.tsx","../src/components/forms/permissions-field/index.tsx","../src/components/forms/role-select-field/index.tsx"],"names":["jsx","jsxs"],"mappings":";;;;;;AAYO,SAAS,gBAAA,CAAwC;AAAA,EACtD,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,uBACE,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAQ,CAAC,EAAE,OAAM,qBACf,IAAA,CAAC,YAAS,SAAA,EACR,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,aAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBAClB,GAAA,CAAC,eACC,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,aAA0B,QAAA,EAAqB,GAAG,OAAO,CAAA,EACrE,CAAA;AAAA,4BACC,WAAA,EAAA,EAAY;AAAA,OAAA,EACf;AAAA;AAAA,GAEJ;AAEJ;ACtBO,SAAS,UAAA,CAAkC;AAAA,EAChD,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA,GAAe,OAAA;AAAA,EACf;AACF,CAAA,EAAuB;AACrB,EAAA,uBACEA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA,EAAQ,CAAC,EAAE,KAAA,uBACTC,IAAAA,CAAC,YAAS,SAAA,EACR,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,aAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QACjB,+BAAeA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCAAwC,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,wBACjFA,GAAAA,CAAC,WAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,IAAA,EAAK,OAAA,EAAQ,WAAA,EAA0B,YAAA,EAA6B,GAAG,KAAA,EAAO,CAAA,EACvF,CAAA;AAAA,wBACAA,IAAC,WAAA,EAAA,EAAY;AAAA,OAAA,EACf;AAAA;AAAA,GAEJ;AAEJ;ACrBO,SAAS,cAAA,CAAsC;AAAA,EACpD,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,uBACEA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAQ,CAAC,EAAE,OAAM,qBACfC,KAAC,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,aAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBAClBA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAQ,MAAM,KAAA,IAAoB,EAAA;AAAA,YAClC,aAAA,EAAe,CAAC,IAAA,KAAS;AACvB,cAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AAAA,YACrB,CAAA;AAAA,YACA,OAAA;AAAA,YACA,WAAA;AAAA,YACA,cAAY,SAAA,IAAa;AAAA;AAAA,SAC3B;AAAA,wBACAA,IAAC,WAAA,EAAA,EAAY;AAAA,OAAA,EACf;AAAA;AAAA,GAEJ;AAEJ;ACnCO,SAAS,cAAA,CAAsC;AAAA,EACpD,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,uBACEA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA,EAAQ,CAAC,EAAE,KAAA,uBACTC,IAAAA,CAAC,YAAS,SAAA,EACR,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,aAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBAClBA,GAAAA,CAAC,WAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,WAAA,EAA0B,YAAA,EAAa,YAAA,EAAc,GAAG,KAAA,EAAO,CAAA,EACxE,CAAA;AAAA,wBACAA,IAAC,WAAA,EAAA,EAAY;AAAA,OAAA,EACf;AAAA;AAAA,GAEJ;AAEJ;ACtBO,SAAS,aAAA,CAAqC;AAAA,EACnD,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,uBACEA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA,EAAQ,CAAC,EAAE,KAAA,uBACTC,IAAAA,CAAC,YAAS,SAAA,EACR,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,aAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBAClBA,GAAAA,CAAC,WAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,WAAA,EAA0B,YAAA,EAAa,aAAA,EAAe,GAAG,KAAA,EAAO,CAAA,EACzE,CAAA;AAAA,wBACAA,IAAC,WAAA,EAAA,EAAY;AAAA,OAAA,EACf;AAAA;AAAA,GAEJ;AAEJ;ACrBO,SAAS,SAAA,CAAiC;AAAA,EAC/C,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,uBACEA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA,EAAQ,CAAC,EAAE,KAAA,uBACTC,IAAAA,CAAC,YAAS,SAAA,EACR,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,aAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBAClBA,GAAAA,CAAC,WAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,WAAA,EAA0B,QAAA,EAAoB,YAAA,EAAa,KAAA,EAAO,GAAG,KAAA,EAAO,CAAA,EACrF,CAAA;AAAA,wBACAA,IAAC,WAAA,EAAA,EAAY;AAAA,OAAA,EACf;AAAA;AAAA,GAEJ;AAEJ;ACpBO,SAAS,aAAA,CAAqC;AAAA,EACnD,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA,GAAe,kBAAA;AAAA,EACf,UAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,uBACEA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA,EAAQ,CAAC,EAAE,KAAA,uBACTC,IAAAA,CAAC,YAAS,SAAA,EACR,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,aAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UACjB;AAAA,SAAA,EACH,CAAA;AAAA,wBACAA,GAAAA,CAAC,WAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,UAAA;AAAA,YACL,WAAA;AAAA,YACA,YAAA;AAAA,YACC,GAAG;AAAA;AAAA,SACN,EACF,CAAA;AAAA,wBACAA,IAAC,WAAA,EAAA,EAAY;AAAA,OAAA,EACf;AAAA;AAAA,GAEJ;AAEJ;AC3BO,SAAS,gBAAA,CAAwC;AAAA,EACtD,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,CAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAA6B;AAC3B,EAAA,uBACEA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAM,KAAM;AACrB,QAAA,MAAM,QAAA,GAAY,KAAA,CAAM,KAAA,IAAsB,EAAC;AAE/C,QAAA,MAAM,gBAAA,GAAmB,CAAC,GAAA,EAAa,KAAA,KAA8B;AACnE,UAAA,MAAM,OAAA,GAAU,mBAAmB,KAAK,CAAA;AACxC,UAAA,MAAM,MAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,GAAG,CAAA;AAC3C,UAAA,IAAI,CAAC,GAAA,EAAK;AAEV,UAAA,MAAM,IAAA,GAAO,QAAA,CAAS,QAAA,CAAS,GAAG,IAC9B,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,GAAG,CAAA,GAChC,CAAC,GAAG,UAAU,GAAG,CAAA;AAErB,UAAA,IAAI,GAAA,CAAI,MAAA,KAAW,OAAA,IAAW,GAAA,CAAI,WAAW,QAAA,EAAU;AACrD,YAAA,IAAI,IAAA,CAAK,SAAS,GAAG,CAAA,IAAK,WAAW,CAAC,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAC5D,cAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,YACnB;AAAA,UACF;AACA,UAAA,IAAI,GAAA,CAAI,WAAW,QAAA,EAAU;AAC3B,YAAA,MAAM,QAAA,GAAW,oBAAoB,KAAK,CAAA;AAC1C,YAAA,IAAI,IAAA,CAAK,SAAS,GAAG,CAAA,IAAK,YAAY,CAAC,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC9D,cAAA,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,YACpB;AAAA,UACF;AAEA,UAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AAAA,QACrB,CAAA;AAEA,QAAA,uBACEC,KAAC,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,aAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BAClBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACZ,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AACrB,YAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,KAAA,CAAM,WAAW,CAAA;AACpD,YAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,KAAA,CAAM,WAAW,CAAA;AACtD,YAAA,MAAM,eAAe,OAAA,GACjB,gBAAA,CAAiB,KAAA,CAAM,WAAA,EAAa,QAAQ,CAAA,GAC5C,KAAA;AACJ,YAAA,MAAM,gBAAgB,QAAA,GAAW,SAAA,CAAU,KAAA,CAAM,WAAA,EAAa,QAAQ,CAAA,GAAI,KAAA;AAC1E,YAAA,MAAM,cACJ,OAAA,KAAY,IAAA,KAAS,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,IAAK,YAAA,CAAA;AACrD,YAAA,MAAM,eACJ,QAAA,KAAa,IAAA,KAAS,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,IAAK,aAAA,CAAA;AAEvD,YAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAA2B,SAAA,EAAU,WAAA,EACpC,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,gCAAAD,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAuB,QAAA,EAAA,CAAA,CAAE,KAAA,CAAM,QAAQ,CAAA,EAAE,CAAA;AAAA,gCACtDA,GAAAA,CAAC,OAAA,EAAA,EAAQ,OAAA,EAAS,CAAA,CAAE,KAAA,CAAM,cAAc,CAAA,EAAG,IAAA,EAAK,KAAA,EAAM,KAAA,EAAM,OAAA,EAC1D,QAAA,kBAAAA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,SAAA,EAAU,2JAAA;AAAA,oBACV,YAAA,EAAY,CAAA,CAAE,KAAA,CAAM,cAAc,CAAA;AAAA,oBAElC,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW,eAAW,IAAA,EAAC;AAAA;AAAA,iBACzC,EACF;AAAA,eAAA,EACF,CAAA;AAAA,8BACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BACZ,QAAA,EAAA,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,KAAS;AAC/B,gBAAA,MAAM,MAAA,GAAS,KAAK,MAAA,KAAW,MAAA;AAC/B,gBAAA,MAAM,OAAA,GAAU,KAAK,MAAA,KAAW,OAAA;AAChC,gBAAA,MAAM,OAAA,GAAU,SACZ,WAAA,GACA,OAAA,GACE,eACA,QAAA,CAAS,QAAA,CAAS,KAAK,GAAG,CAAA;AAChC,gBAAA,MAAM,kBAAA,GACH,MAAA,IAAU,YAAA,IAAkB,OAAA,IAAW,aAAA;AAC1C,gBAAA,MAAM,mBAAmB,QAAA,IAAY,kBAAA;AAErC,gBAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAmB,SAAA,EAAU,6BAAA,EAC5B,QAAA,EAAA;AAAA,kCAAAD,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAI,IAAA,CAAK,GAAA;AAAA,sBACT,OAAA,EAAS,SAAS,WAAA,GAAc,OAAA;AAAA,sBAChC,QAAA,EAAU,gBAAA;AAAA,sBACV,eAAA,EAAiB,MACf,CAAC,gBAAA,IAAoB,iBAAiB,IAAA,CAAK,GAAA,EAAK,MAAM,WAAW;AAAA;AAAA,mBAErE;AAAA,kCACAA,GAAAA;AAAA,oBAAC,OAAA;AAAA,oBAAA;AAAA,sBACC,SAAS,IAAA,CAAK,GAAA;AAAA,sBACd,SAAA,EAAU,0EAAA;AAAA,sBAET,QAAA,EAAA,CAAA,CAAE,KAAK,QAAQ;AAAA;AAAA;AAClB,iBAAA,EAAA,EAdQ,KAAK,GAef,CAAA;AAAA,cAEJ,CAAC,CAAA,EACH;AAAA,aAAA,EAAA,EA7CQ,MAAM,UA8ChB,CAAA;AAAA,UAEJ,CAAC,CAAA,EACH,CAAA;AAAA,0BACAA,IAAC,WAAA,EAAA,EAAY;AAAA,SAAA,EACf,CAAA;AAAA,MAEJ;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,mBAAmB,WAAA,EAAgD;AAC1E,EAAA,MAAM,UAAU,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,MAAM,CAAA;AAC3D,EAAA,OAAO,SAAS,GAAA,IAAO,IAAA;AACzB;AAEA,SAAS,oBAAoB,WAAA,EAAgD;AAC3E,EAAA,MAAM,WAAW,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,OAAO,CAAA;AAC7D,EAAA,OAAO,UAAU,GAAA,IAAO,IAAA;AAC1B;AAEA,SAAS,gBAAA,CAAiB,aAAiC,QAAA,EAA6B;AACtF,EAAA,OAAO,WAAA,CAAY,IAAA;AAAA,IACjB,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,MAAA,KAAW,OAAA,IAAW,CAAA,CAAE,MAAA,KAAW,QAAA,KAAa,QAAA,CAAS,QAAA,CAAS,CAAA,CAAE,GAAG;AAAA,GACnF;AACF;AAEA,SAAS,SAAA,CAAU,aAAiC,QAAA,EAA6B;AAC/E,EAAA,OAAO,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,QAAA,IAAY,QAAA,CAAS,QAAA,CAAS,CAAA,CAAE,GAAG,CAAC,CAAA;AAClF;AC9HO,SAAS,eAAA,CAAuC;AAAA,EACrD,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,uBACEA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAM,KAAM;AACrB,QAAA,MAAM,cAAA,GAAiB,QAAQ,IAAA,CAAK,CAAC,QAAQ,GAAA,CAAI,KAAA,KAAU,MAAM,KAAK,CAAA;AACtE,QAAA,MAAM,YAAA,GAAe,gBAAgB,KAAA,IAAS,KAAA;AAE9C,QAAA,uBACEC,IAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EACR,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,aAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BAClBA,GAAAA,CAAC,WAAA,EAAA,EACC,QAAA,kBAAAC,KAAC,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,mBAAA,EAAA,EAAoB,OAAA,EAAO,IAAA,EAC1B,QAAA,kBAAAC,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,IAAA,EAAK,UAAA;AAAA,gBACL,YAAA,EAAY,KAAA;AAAA,gBACZ,QAAQ,KAAA,CAAM,MAAA;AAAA,gBACd,SAAA,EAAW,EAAA;AAAA,kBACT,sKAAA;AAAA,kBACA,6FAAA;AAAA,kBACA,kDAAA;AAAA,kBACA,kEAAA;AAAA,kBACA,CAAC,MAAM,KAAA,IAAS;AAAA,iBAClB;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,kCAC3DA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,6CAAA,EAA8C;AAAA;AAAA;AAAA,aACvE,EACF,CAAA;AAAA,4BACAA,GAAAA;AAAA,cAAC,mBAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,OAAA;AAAA,gBACN,UAAA,EAAY,CAAA;AAAA,gBACZ,SAAA,EAAW,GAAG,mDAAmD,CAAA;AAAA,gBAEhE,kBAAQ,GAAA,CAAI,CAAC,wBACZA,GAAAA,CAAC,oBAAiC,OAAA,EAAS,MAAM,KAAA,CAAM,QAAA,CAAS,IAAI,KAAK,CAAA,EACtE,cAAI,KAAA,EAAA,EADgB,GAAA,CAAI,KAE3B,CACD;AAAA;AAAA;AACH,WAAA,EACF,CAAA,EACF,CAAA;AAAA,0BACAA,IAAC,WAAA,EAAA,EAAY;AAAA,SAAA,EACf,CAAA;AAAA,MAEJ;AAAA;AAAA,GACF;AAEJ","file":"chunk-OMADWGPL.js","sourcesContent":["import type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage, Textarea } from '../../ui';\n\ntype DescriptionFieldProps<T extends FieldValues> = {\n control: Control<T>;\n name: FieldPath<T>;\n label: string;\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n};\n\nexport function DescriptionField<T extends FieldValues>({\n control,\n name,\n label,\n placeholder,\n className,\n disabled,\n}: DescriptionFieldProps<T>) {\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }) => (\n <FormItem className={className}>\n <FormLabel>{label}</FormLabel>\n <FormControl>\n <Textarea placeholder={placeholder} disabled={disabled} {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n}\n","import type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage, Input } from '../../ui';\n\ntype EmailFieldProps<T extends FieldValues> = {\n control: Control<T>;\n name: FieldPath<T>;\n label: string;\n placeholder?: string;\n description?: string;\n autoComplete?: 'email' | 'username';\n className?: string;\n};\n\nexport function EmailField<T extends FieldValues>({\n control,\n name,\n label,\n placeholder,\n description,\n autoComplete = 'email',\n className,\n}: EmailFieldProps<T>) {\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }) => (\n <FormItem className={className}>\n <FormLabel>{label}</FormLabel>\n {description && <p className=\"text-sm text-muted-foreground mt-0.5\">{description}</p>}\n <FormControl>\n <Input type=\"email\" placeholder={placeholder} autoComplete={autoComplete} {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n}\n","import type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport { FormField, FormItem, FormLabel, FormMessage, Select } from '../../ui';\n\ntype ExpiresAtOption = {\n value: string;\n label: string;\n};\n\ntype ExpiresAtFieldProps<T extends FieldValues> = {\n control: Control<T>;\n name: FieldPath<T>;\n label: string;\n placeholder?: string;\n ariaLabel?: string;\n options: ExpiresAtOption[];\n};\n\nexport function ExpiresAtField<T extends FieldValues>({\n control,\n name,\n label,\n placeholder,\n ariaLabel,\n options,\n}: ExpiresAtFieldProps<T>) {\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }) => (\n <FormItem>\n <FormLabel>{label}</FormLabel>\n <Select\n value={(field.value as string) ?? ''}\n onValueChange={(next) => {\n field.onChange(next);\n }}\n options={options}\n placeholder={placeholder}\n aria-label={ariaLabel ?? label}\n />\n <FormMessage />\n </FormItem>\n )}\n />\n );\n}\n","import type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage, Input } from '../../ui';\n\ntype FirstNameFieldProps<T extends FieldValues> = {\n control: Control<T>;\n name: FieldPath<T>;\n label: string;\n placeholder?: string;\n className?: string;\n};\n\nexport function FirstNameField<T extends FieldValues>({\n control,\n name,\n label,\n placeholder,\n className,\n}: FirstNameFieldProps<T>) {\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }) => (\n <FormItem className={className}>\n <FormLabel>{label}</FormLabel>\n <FormControl>\n <Input placeholder={placeholder} autoComplete=\"given-name\" {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n}\n","import type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage, Input } from '../../ui';\n\ntype LastNameFieldProps<T extends FieldValues> = {\n control: Control<T>;\n name: FieldPath<T>;\n label: string;\n placeholder?: string;\n className?: string;\n};\n\nexport function LastNameField<T extends FieldValues>({\n control,\n name,\n label,\n placeholder,\n className,\n}: LastNameFieldProps<T>) {\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }) => (\n <FormItem className={className}>\n <FormLabel>{label}</FormLabel>\n <FormControl>\n <Input placeholder={placeholder} autoComplete=\"family-name\" {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n}\n","import type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage, Input } from '../../ui';\n\ntype NameFieldProps<T extends FieldValues> = {\n control: Control<T>;\n name: FieldPath<T>;\n label: string;\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n};\n\nexport function NameField<T extends FieldValues>({\n control,\n name,\n label,\n placeholder,\n className,\n disabled,\n}: NameFieldProps<T>) {\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }) => (\n <FormItem className={className}>\n <FormLabel>{label}</FormLabel>\n <FormControl>\n <Input placeholder={placeholder} disabled={disabled} autoComplete=\"off\" {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n}\n","import type { ReactNode } from 'react';\nimport type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage, Input } from '../../ui';\n\ntype PasswordFieldProps<T extends FieldValues> = {\n control: Control<T>;\n name: FieldPath<T>;\n label: string;\n placeholder?: string;\n autoComplete?: 'current-password' | 'new-password';\n /** Optional node to show on the right of the label (e.g. \"Forgot password?\" link) */\n rightLabel?: ReactNode;\n className?: string;\n};\n\nexport function PasswordField<T extends FieldValues>({\n control,\n name,\n label,\n placeholder,\n autoComplete = 'current-password',\n rightLabel,\n className,\n}: PasswordFieldProps<T>) {\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }) => (\n <FormItem className={className}>\n <div className=\"flex items-center justify-between\">\n <FormLabel>{label}</FormLabel>\n {rightLabel}\n </div>\n <FormControl>\n <Input\n type=\"password\"\n placeholder={placeholder}\n autoComplete={autoComplete}\n {...field}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n}\n","import { Info } from 'lucide-react';\nimport type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport type { PermissionGroup, PermissionOption } from '../../../types';\nimport { Checkbox, FormField, FormItem, FormLabel, FormMessage, Tooltip } from '../../ui';\n\nexport type {\n PermissionAction,\n PermissionGroup,\n PermissionOption,\n} from '../../../types';\n\ntype PermissionsFieldProps<T extends FieldValues> = {\n control: Control<T>;\n name: FieldPath<T>;\n label: string;\n groups: PermissionGroup[];\n t: (key: string) => string;\n disabled?: boolean;\n};\n\nexport function PermissionsField<T extends FieldValues>({\n control,\n name,\n label,\n groups,\n t,\n disabled = false,\n}: PermissionsFieldProps<T>) {\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }) => {\n const selected = (field.value as string[]) ?? [];\n\n const togglePermission = (key: string, group: PermissionOption[]) => {\n const readKey = getReadKeyForGroup(group);\n const opt = group.find((p) => p.key === key);\n if (!opt) return;\n\n const next = selected.includes(key)\n ? selected.filter((k) => k !== key)\n : [...selected, key];\n\n if (opt.action === 'write' || opt.action === 'delete') {\n if (next.includes(key) && readKey && !next.includes(readKey)) {\n next.push(readKey);\n }\n }\n if (opt.action === 'delete') {\n const writeKey = getWriteKeyForGroup(group);\n if (next.includes(key) && writeKey && !next.includes(writeKey)) {\n next.push(writeKey);\n }\n }\n\n field.onChange(next);\n };\n\n return (\n <FormItem>\n <FormLabel>{label}</FormLabel>\n <div className=\"space-y-4\">\n {groups.map((group) => {\n const readKey = getReadKeyForGroup(group.permissions);\n const writeKey = getWriteKeyForGroup(group.permissions);\n const readDisabled = readKey\n ? hasWriteOrDelete(group.permissions, selected)\n : false;\n const writeDisabled = writeKey ? hasDelete(group.permissions, selected) : false;\n const readChecked =\n readKey !== null && (selected.includes(readKey) || readDisabled);\n const writeChecked =\n writeKey !== null && (selected.includes(writeKey) || writeDisabled);\n\n return (\n <div key={group.contextKey} className=\"space-y-2\">\n <div className=\"flex items-center gap-1.5\">\n <p className=\"text-sm font-medium\">{t(group.labelKey)}</p>\n <Tooltip content={t(group.descriptionKey)} side=\"top\" align=\"start\">\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground cursor-help inline-flex rounded p-0.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={t(group.descriptionKey)}\n >\n <Info className=\"size-3.5\" aria-hidden />\n </button>\n </Tooltip>\n </div>\n <div className=\"flex flex-wrap gap-4 pl-2\">\n {group.permissions.map((perm) => {\n const isRead = perm.action === 'read';\n const isWrite = perm.action === 'write';\n const checked = isRead\n ? readChecked\n : isWrite\n ? writeChecked\n : selected.includes(perm.key);\n const permissionDisabled =\n (isRead && readDisabled) || (isWrite && writeDisabled);\n const globallyDisabled = disabled || permissionDisabled;\n\n return (\n <div key={perm.key} className=\"flex items-center space-x-2\">\n <Checkbox\n id={perm.key}\n checked={isRead ? readChecked : checked}\n disabled={globallyDisabled}\n onCheckedChange={() =>\n !globallyDisabled && togglePermission(perm.key, group.permissions)\n }\n />\n <label\n htmlFor={perm.key}\n className=\"text-sm font-normal leading-none cursor-pointer peer-disabled:opacity-70\"\n >\n {t(perm.labelKey)}\n </label>\n </div>\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n <FormMessage />\n </FormItem>\n );\n }}\n />\n );\n}\n\nfunction getReadKeyForGroup(permissions: PermissionOption[]): string | null {\n const readOpt = permissions.find((p) => p.action === 'read');\n return readOpt?.key ?? null;\n}\n\nfunction getWriteKeyForGroup(permissions: PermissionOption[]): string | null {\n const writeOpt = permissions.find((p) => p.action === 'write');\n return writeOpt?.key ?? null;\n}\n\nfunction hasWriteOrDelete(permissions: PermissionOption[], selected: string[]): boolean {\n return permissions.some(\n (p) => (p.action === 'write' || p.action === 'delete') && selected.includes(p.key),\n );\n}\n\nfunction hasDelete(permissions: PermissionOption[], selected: string[]): boolean {\n return permissions.some((p) => p.action === 'delete' && selected.includes(p.key));\n}\n","import { ChevronDown } from 'lucide-react';\nimport type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport { cn } from '../../../lib/utils';\nimport type { RoleOption } from '../../../types';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from '../../ui';\n\nexport type { RoleOption } from '../../../types';\n\ntype RoleSelectFieldProps<T extends FieldValues> = {\n control: Control<T>;\n name: FieldPath<T>;\n label: string;\n options: RoleOption[];\n className?: string;\n};\n\nexport function RoleSelectField<T extends FieldValues>({\n control,\n name,\n label,\n options,\n className,\n}: RoleSelectFieldProps<T>) {\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }) => {\n const selectedOption = options.find((opt) => opt.value === field.value);\n const displayValue = selectedOption?.label ?? label;\n\n return (\n <FormItem className={className}>\n <FormLabel>{label}</FormLabel>\n <FormControl>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n role=\"combobox\"\n aria-label={label}\n onBlur={field.onBlur}\n className={cn(\n 'flex h-9 w-full cursor-pointer items-center justify-between rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs outline-none transition-colors',\n 'hover:bg-accent/50 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:pointer-events-none disabled:opacity-50',\n 'aria-invalid:ring-destructive/20 aria-invalid:border-destructive',\n !field.value && 'text-muted-foreground',\n )}\n >\n <span className=\"min-w-0 truncate text-left\">{displayValue}</span>\n <ChevronDown className=\"ml-2 h-4 w-4 shrink-0 text-muted-foreground\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n sideOffset={0}\n className={cn('min-w-(--radix-dropdown-menu-trigger-width) z-101')}\n >\n {options.map((opt) => (\n <DropdownMenuItem key={opt.value} onClick={() => field.onChange(opt.value)}>\n {opt.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </FormControl>\n <FormMessage />\n </FormItem>\n );\n }}\n />\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/forms/description-field/index.tsx","../src/components/forms/email-field/index.tsx","../src/components/forms/expires-at-field/index.tsx","../src/components/forms/first-name-field/index.tsx","../src/components/forms/last-name-field/index.tsx","../src/components/forms/name-field/index.tsx","../src/components/forms/password-field/index.tsx","../src/components/forms/permissions-field/index.tsx","../src/components/forms/role-select-field/index.tsx"],"names":["jsx","jsxs"],"mappings":"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","file":"chunk-SQOHQ3YP.js","sourcesContent":["import type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage, Textarea } from '../../ui';\n\ntype DescriptionFieldProps<T extends FieldValues> = {\n control: Control<T>;\n name: FieldPath<T>;\n label: string;\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n};\n\nexport function DescriptionField<T extends FieldValues>({\n control,\n name,\n label,\n placeholder,\n className,\n disabled,\n}: DescriptionFieldProps<T>) {\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }) => (\n <FormItem className={className}>\n <FormLabel>{label}</FormLabel>\n <FormControl>\n <Textarea placeholder={placeholder} disabled={disabled} {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n}\n","import type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage, Input } from '../../ui';\n\ntype EmailFieldProps<T extends FieldValues> = {\n control: Control<T>;\n name: FieldPath<T>;\n label: string;\n placeholder?: string;\n description?: string;\n autoComplete?: 'email' | 'username';\n className?: string;\n};\n\nexport function EmailField<T extends FieldValues>({\n control,\n name,\n label,\n placeholder,\n description,\n autoComplete = 'email',\n className,\n}: EmailFieldProps<T>) {\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }) => (\n <FormItem className={className}>\n <FormLabel>{label}</FormLabel>\n {description && <p className=\"text-sm text-muted-foreground mt-0.5\">{description}</p>}\n <FormControl>\n <Input type=\"email\" placeholder={placeholder} autoComplete={autoComplete} {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n}\n","import type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport { FormField, FormItem, FormLabel, FormMessage, Select } from '../../ui';\n\ntype ExpiresAtOption = {\n value: string;\n label: string;\n};\n\ntype ExpiresAtFieldProps<T extends FieldValues> = {\n control: Control<T>;\n name: FieldPath<T>;\n label: string;\n placeholder?: string;\n ariaLabel?: string;\n options: ExpiresAtOption[];\n};\n\nexport function ExpiresAtField<T extends FieldValues>({\n control,\n name,\n label,\n placeholder,\n ariaLabel,\n options,\n}: ExpiresAtFieldProps<T>) {\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }) => (\n <FormItem>\n <FormLabel>{label}</FormLabel>\n <Select\n value={(field.value as string) ?? ''}\n onValueChange={(next) => {\n field.onChange(next);\n }}\n options={options}\n placeholder={placeholder}\n aria-label={ariaLabel ?? label}\n />\n <FormMessage />\n </FormItem>\n )}\n />\n );\n}\n","import type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage, Input } from '../../ui';\n\ntype FirstNameFieldProps<T extends FieldValues> = {\n control: Control<T>;\n name: FieldPath<T>;\n label: string;\n placeholder?: string;\n className?: string;\n};\n\nexport function FirstNameField<T extends FieldValues>({\n control,\n name,\n label,\n placeholder,\n className,\n}: FirstNameFieldProps<T>) {\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }) => (\n <FormItem className={className}>\n <FormLabel>{label}</FormLabel>\n <FormControl>\n <Input placeholder={placeholder} autoComplete=\"given-name\" {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n}\n","import type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage, Input } from '../../ui';\n\ntype LastNameFieldProps<T extends FieldValues> = {\n control: Control<T>;\n name: FieldPath<T>;\n label: string;\n placeholder?: string;\n className?: string;\n};\n\nexport function LastNameField<T extends FieldValues>({\n control,\n name,\n label,\n placeholder,\n className,\n}: LastNameFieldProps<T>) {\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }) => (\n <FormItem className={className}>\n <FormLabel>{label}</FormLabel>\n <FormControl>\n <Input placeholder={placeholder} autoComplete=\"family-name\" {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n}\n","import type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage, Input } from '../../ui';\n\ntype NameFieldProps<T extends FieldValues> = {\n control: Control<T>;\n name: FieldPath<T>;\n label: string;\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n};\n\nexport function NameField<T extends FieldValues>({\n control,\n name,\n label,\n placeholder,\n className,\n disabled,\n}: NameFieldProps<T>) {\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }) => (\n <FormItem className={className}>\n <FormLabel>{label}</FormLabel>\n <FormControl>\n <Input placeholder={placeholder} disabled={disabled} autoComplete=\"off\" {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n}\n","import type { ReactNode } from 'react';\nimport type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage, Input } from '../../ui';\n\ntype PasswordFieldProps<T extends FieldValues> = {\n control: Control<T>;\n name: FieldPath<T>;\n label: string;\n placeholder?: string;\n autoComplete?: 'current-password' | 'new-password';\n /** Optional node to show on the right of the label (e.g. \"Forgot password?\" link) */\n rightLabel?: ReactNode;\n className?: string;\n};\n\nexport function PasswordField<T extends FieldValues>({\n control,\n name,\n label,\n placeholder,\n autoComplete = 'current-password',\n rightLabel,\n className,\n}: PasswordFieldProps<T>) {\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }) => (\n <FormItem className={className}>\n <div className=\"flex items-center justify-between\">\n <FormLabel>{label}</FormLabel>\n {rightLabel}\n </div>\n <FormControl>\n <Input\n type=\"password\"\n placeholder={placeholder}\n autoComplete={autoComplete}\n {...field}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n}\n","import { Info } from 'lucide-react';\nimport type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport type { PermissionGroup, PermissionOption } from '../../../types';\nimport { Checkbox, FormField, FormItem, FormLabel, FormMessage, Tooltip } from '../../ui';\n\nexport type {\n PermissionAction,\n PermissionGroup,\n PermissionOption,\n} from '../../../types';\n\ntype PermissionsFieldProps<T extends FieldValues> = {\n control: Control<T>;\n name: FieldPath<T>;\n label: string;\n groups: PermissionGroup[];\n t: (key: string) => string;\n disabled?: boolean;\n};\n\nexport function PermissionsField<T extends FieldValues>({\n control,\n name,\n label,\n groups,\n t,\n disabled = false,\n}: PermissionsFieldProps<T>) {\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }) => {\n const selected = (field.value as string[]) ?? [];\n\n const togglePermission = (key: string, group: PermissionOption[]) => {\n const readKey = getReadKeyForGroup(group);\n const opt = group.find((p) => p.key === key);\n if (!opt) return;\n\n const next = selected.includes(key)\n ? selected.filter((k) => k !== key)\n : [...selected, key];\n\n if (opt.action === 'write' || opt.action === 'delete') {\n if (next.includes(key) && readKey && !next.includes(readKey)) {\n next.push(readKey);\n }\n }\n if (opt.action === 'delete') {\n const writeKey = getWriteKeyForGroup(group);\n if (next.includes(key) && writeKey && !next.includes(writeKey)) {\n next.push(writeKey);\n }\n }\n\n field.onChange(next);\n };\n\n return (\n <FormItem>\n <FormLabel>{label}</FormLabel>\n <div className=\"space-y-4\">\n {groups.map((group) => {\n const readKey = getReadKeyForGroup(group.permissions);\n const writeKey = getWriteKeyForGroup(group.permissions);\n const readDisabled = readKey\n ? hasWriteOrDelete(group.permissions, selected)\n : false;\n const writeDisabled = writeKey ? hasDelete(group.permissions, selected) : false;\n const readChecked =\n readKey !== null && (selected.includes(readKey) || readDisabled);\n const writeChecked =\n writeKey !== null && (selected.includes(writeKey) || writeDisabled);\n\n return (\n <div key={group.contextKey} className=\"space-y-2\">\n <div className=\"flex items-center gap-1.5\">\n <p className=\"text-sm font-medium\">{t(group.labelKey)}</p>\n <Tooltip content={t(group.descriptionKey)} side=\"top\" align=\"start\">\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground cursor-help inline-flex rounded p-0.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={t(group.descriptionKey)}\n >\n <Info className=\"size-3.5\" aria-hidden />\n </button>\n </Tooltip>\n </div>\n <div className=\"flex flex-wrap gap-4 pl-2\">\n {group.permissions.map((perm) => {\n const isRead = perm.action === 'read';\n const isWrite = perm.action === 'write';\n const checked = isRead\n ? readChecked\n : isWrite\n ? writeChecked\n : selected.includes(perm.key);\n const permissionDisabled =\n (isRead && readDisabled) || (isWrite && writeDisabled);\n const globallyDisabled = disabled || permissionDisabled;\n\n return (\n <div key={perm.key} className=\"flex items-center space-x-2\">\n <Checkbox\n id={perm.key}\n checked={isRead ? readChecked : checked}\n disabled={globallyDisabled}\n onCheckedChange={() =>\n !globallyDisabled && togglePermission(perm.key, group.permissions)\n }\n />\n <label\n htmlFor={perm.key}\n className=\"text-sm font-normal leading-none cursor-pointer peer-disabled:opacity-70\"\n >\n {t(perm.labelKey)}\n </label>\n </div>\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n <FormMessage />\n </FormItem>\n );\n }}\n />\n );\n}\n\nfunction getReadKeyForGroup(permissions: PermissionOption[]): string | null {\n const readOpt = permissions.find((p) => p.action === 'read');\n return readOpt?.key ?? null;\n}\n\nfunction getWriteKeyForGroup(permissions: PermissionOption[]): string | null {\n const writeOpt = permissions.find((p) => p.action === 'write');\n return writeOpt?.key ?? null;\n}\n\nfunction hasWriteOrDelete(permissions: PermissionOption[], selected: string[]): boolean {\n return permissions.some(\n (p) => (p.action === 'write' || p.action === 'delete') && selected.includes(p.key),\n );\n}\n\nfunction hasDelete(permissions: PermissionOption[], selected: string[]): boolean {\n return permissions.some((p) => p.action === 'delete' && selected.includes(p.key));\n}\n","import { ChevronDown } from 'lucide-react';\nimport type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport { cn } from '../../../lib/utils';\nimport type { RoleOption } from '../../../types';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from '../../ui';\n\nexport type { RoleOption } from '../../../types';\n\ntype RoleSelectFieldProps<T extends FieldValues> = {\n control: Control<T>;\n name: FieldPath<T>;\n label: string;\n options: RoleOption[];\n className?: string;\n};\n\nexport function RoleSelectField<T extends FieldValues>({\n control,\n name,\n label,\n options,\n className,\n}: RoleSelectFieldProps<T>) {\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }) => {\n const selectedOption = options.find((opt) => opt.value === field.value);\n const displayValue = selectedOption?.label ?? label;\n\n return (\n <FormItem className={className}>\n <FormLabel>{label}</FormLabel>\n <FormControl>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n role=\"combobox\"\n aria-label={label}\n onBlur={field.onBlur}\n className={cn(\n 'flex h-9 w-full cursor-pointer items-center justify-between rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs outline-none transition-colors',\n 'hover:bg-accent/50 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:pointer-events-none disabled:opacity-50',\n 'aria-invalid:ring-destructive/20 aria-invalid:border-destructive',\n !field.value && 'text-muted-foreground',\n )}\n >\n <span className=\"min-w-0 truncate text-left\">{displayValue}</span>\n <ChevronDown className=\"ml-2 h-4 w-4 shrink-0 text-muted-foreground\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n sideOffset={0}\n className={cn('min-w-(--radix-dropdown-menu-trigger-width) z-101')}\n >\n {options.map((opt) => (\n <DropdownMenuItem key={opt.value} onClick={() => field.onChange(opt.value)}>\n {opt.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </FormControl>\n <FormMessage />\n </FormItem>\n );\n }}\n />\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
- export { DescriptionField, EmailField, ExpiresAtField, FirstNameField, LastNameField, NameField, PasswordField, PermissionsField, RoleSelectField } from '../../chunk-OMADWGPL.js';
2
- import '../../chunk-FJLMQNZ3.js';
1
+ export { DescriptionField, EmailField, ExpiresAtField, FirstNameField, LastNameField, NameField, PasswordField, PermissionsField, RoleSelectField } from '../../chunk-SQOHQ3YP.js';
2
+ import '../../chunk-KRAKQWFP.js';
3
3
  import '../../chunk-3AYG73DK.js';
4
4
  import '../../chunk-TSXUUD64.js';
5
5
  import '../../chunk-GXWVFQCK.js';
@@ -1,5 +1,5 @@
1
- export { AdminDetailPage, AdminListPage, AuditLogListFilters, DateRangeFilter, DetailFieldList, EntityRow, PageLoader, QueryState, RouteSuspense, ThemeProvider, ThemeToggle, createBoundQueryState, useDefaultThemeStore, useThemeStoreContext } from '../../chunk-IRCBRWBK.js';
2
- import '../../chunk-FJLMQNZ3.js';
1
+ export { AdminDetailPage, AdminListPage, AuditLogListFilters, DateRangeFilter, DetailFieldList, EntityRow, PageLoader, QueryState, RouteSuspense, ThemeProvider, ThemeToggle, createBoundQueryState, useDefaultThemeStore, useThemeStoreContext } from '../../chunk-DACYIKGX.js';
2
+ import '../../chunk-KRAKQWFP.js';
3
3
  import '../../chunk-3AYG73DK.js';
4
4
  export { dateRangePickerTranslations } from '../../chunk-UCJ76BEC.js';
5
5
  import '../../chunk-TSXUUD64.js';
@@ -1,4 +1,4 @@
1
- export { Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, Avatar, AvatarFallback, AvatarImage, Badge, Calendar, Checkbox, ConfirmDialog, DatePicker, DateRangePicker, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, DropdownScrollableList, DropdownSelectSearchInput, Form, FormControl, FormDescription, FormDrawer, FormField, FormItem, FormLabel, FormMessage, H3, Heading, Label, Link, MultiSelect, Paragraph, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, SEARCHABLE_SELECT_MIN_OPTIONS, ScrollArea, ScrollBar, Select, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Tooltip, TooltipProvider, UploadDropzone, badgeVariants, dropdownMenuSelectOptionsMaxHeightClassName, filterSelectOptions, headingVariants, isSelectSearchable, linkStyles, paragraphVariants, useFormField } from '../../chunk-FJLMQNZ3.js';
1
+ export { Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, Avatar, AvatarFallback, AvatarImage, Badge, Calendar, Checkbox, ConfirmDialog, DatePicker, DateRangePicker, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, DropdownScrollableList, DropdownSelectSearchInput, Form, FormControl, FormDescription, FormDrawer, FormField, FormItem, FormLabel, FormMessage, H3, Heading, Label, Link, MultiSelect, Paragraph, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, SEARCHABLE_SELECT_MIN_OPTIONS, ScrollArea, ScrollBar, Select, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Tooltip, TooltipProvider, UploadDropzone, badgeVariants, dropdownMenuSelectOptionsMaxHeightClassName, filterSelectOptions, headingVariants, isSelectSearchable, linkStyles, paragraphVariants, useFormField } from '../../chunk-KRAKQWFP.js';
2
2
  export { Button, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Input, buttonVariants } from '../../chunk-3AYG73DK.js';
3
3
  export { isRadixPortaledOverlay } from '../../chunk-TSXUUD64.js';
4
4
  import '../../chunk-GXWVFQCK.js';
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import './chunk-NL4NAHXG.js';
2
- export { DescriptionField, EmailField, ExpiresAtField, FirstNameField, LastNameField, NameField, PasswordField, PermissionsField, RoleSelectField } from './chunk-OMADWGPL.js';
2
+ export { DescriptionField, EmailField, ExpiresAtField, FirstNameField, LastNameField, NameField, PasswordField, PermissionsField, RoleSelectField } from './chunk-SQOHQ3YP.js';
3
3
  export { BentoFeatures, BlogTeaser, ContactSection, CtaBanner, ErrorSpotlight, FaqSection, FeatureMedia, Footer, Hero, HeroSplit, LogoCloud, Navigation, Newsletter, PricingSection, ProjectLaunches, PromoBanner, Section, ServiceCard, StatsStrip, TeamGrid, Testimonial, TrustBadges, VideoShowcase } from './chunk-QFKVPVFC.js';
4
- export { AdminDetailPage, AdminListPage, AuditLogListFilters, DateRangeFilter, DetailFieldList, EntityRow, PageLoader, QueryState, RouteSuspense, ThemeProvider, ThemeToggle, createBoundQueryState, useDefaultThemeStore, useThemeStoreContext } from './chunk-IRCBRWBK.js';
5
- export { Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, Avatar, AvatarFallback, AvatarImage, Badge, Calendar, Checkbox, ConfirmDialog, DatePicker, DateRangePicker, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, DropdownScrollableList, DropdownSelectSearchInput, Form, FormControl, FormDescription, FormDrawer, FormField, FormItem, FormLabel, FormMessage, H3, Heading, Label, Link, MultiSelect, Paragraph, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, SEARCHABLE_SELECT_MIN_OPTIONS, ScrollArea, ScrollBar, Select, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Tooltip, TooltipProvider, UploadDropzone, badgeVariants, dropdownMenuSelectOptionsMaxHeightClassName, filterSelectOptions, headingVariants, isSelectSearchable, linkStyles, paragraphVariants, useFormField } from './chunk-FJLMQNZ3.js';
4
+ export { AdminDetailPage, AdminListPage, AuditLogListFilters, DateRangeFilter, DetailFieldList, EntityRow, PageLoader, QueryState, RouteSuspense, ThemeProvider, ThemeToggle, createBoundQueryState, useDefaultThemeStore, useThemeStoreContext } from './chunk-DACYIKGX.js';
5
+ export { Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, Avatar, AvatarFallback, AvatarImage, Badge, Calendar, Checkbox, ConfirmDialog, DatePicker, DateRangePicker, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, DropdownScrollableList, DropdownSelectSearchInput, Form, FormControl, FormDescription, FormDrawer, FormField, FormItem, FormLabel, FormMessage, H3, Heading, Label, Link, MultiSelect, Paragraph, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, SEARCHABLE_SELECT_MIN_OPTIONS, ScrollArea, ScrollBar, Select, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Tooltip, TooltipProvider, UploadDropzone, badgeVariants, dropdownMenuSelectOptionsMaxHeightClassName, filterSelectOptions, headingVariants, isSelectSearchable, linkStyles, paragraphVariants, useFormField } from './chunk-KRAKQWFP.js';
6
6
  export { Button, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Input, buttonVariants } from './chunk-3AYG73DK.js';
7
7
  export { getAdminDetailErrorKind } from './chunk-3ZLODBRJ.js';
8
- export { ApiClientProvider, DEFAULT_REFRESH_ENDPOINT, DEFAULT_REFRESH_EXCLUDED_PREFIXES, buildRequestUrl, createApiProvider, createDefaultRefreshRequest, createResponseHandler, executeConfiguredRefresh, getRequestHeaders, getRequestOptions, performAccessTokenRefresh, useAPI, useApiClientConfig } from './chunk-6LO5O4G6.js';
8
+ export { ApiClientProvider, DEFAULT_REFRESH_ENDPOINT, DEFAULT_REFRESH_EXCLUDED_PREFIXES, buildRequestUrl, createApiProvider, createDefaultRefreshRequest, createResponseHandler, executeConfiguredRefresh, getRequestHeaders, getRequestOptions, performAccessTokenRefresh, useAPI, useApiClientConfig } from './chunk-OCJCQXEB.js';
9
9
  export { getAccessInfoFromToken, getAccessTokenFromCookies, getCookieConsentFromCookies, getInitials, getRefreshTokenFromCookies, removeAccessTokenCookie, removeCookieConsentCookie, removeRefreshTokenCookie, setAccessTokenCookie, setCookieConsentCookie, setRefreshTokenCookie, setTokens } from './chunk-APZVW5SW.js';
10
10
  export { createCookieNames } from './chunk-KG4JVAKS.js';
11
11
  export { constraintNameToErrorKey, errorCodeFromHttpStatus, formatApiError, getApiErrorFromRequestError, getConflictFieldFromError, getConflictFieldFromExtra, getConstraintNameFromError, getConstraintNameFromExtra, handleApiMutationError, isApiErrorBody, resolveApiError, useQueryApiErrorToast } from './chunk-KZH56VPP.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yca-software/yca-react-core",
3
- "version": "0.0.8",
3
+ "version": "0.0.11",
4
4
  "description": "Shared React components and helpers for YCA apps.",
5
5
  "license": "MIT",
6
6
  "packageManager": "pnpm@11.12.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/api/request.ts","../src/api/responseHandler.ts","../src/api/ApiClientContext.tsx","../src/api/createApiProvider.tsx"],"names":["useMemo","jsx"],"mappings":"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","file":"chunk-6LO5O4G6.js","sourcesContent":["import type {\n ApiClientConfig,\n RefreshBodyContext,\n RefreshRequestConfig,\n RequestConfig,\n} from './types';\n\nexport const DEFAULT_REFRESH_ENDPOINT = 'auth/refresh';\nexport const DEFAULT_REFRESH_EXCLUDED_PREFIXES = ['auth/'];\n\nexport interface DefaultRefreshRequestOptions {\n endpoint?: string;\n excludedRetryPrefixes?: string[];\n}\n\nexport function createDefaultRefreshRequest({\n endpoint = DEFAULT_REFRESH_ENDPOINT,\n excludedRetryPrefixes = DEFAULT_REFRESH_EXCLUDED_PREFIXES,\n}: DefaultRefreshRequestOptions = {}): RefreshRequestConfig {\n return {\n endpoint,\n method: 'POST',\n buildBody: ({ refreshToken }: RefreshBodyContext) => (refreshToken ? { refreshToken } : {}),\n parseAccessToken: (data: unknown) => {\n if (data && typeof data === 'object' && 'accessToken' in data) {\n const token = (data as { accessToken: unknown }).accessToken;\n return typeof token === 'string' ? token : null;\n }\n return null;\n },\n excludedRetryPrefixes,\n };\n}\n\nexport function buildRequestUrl(baseURL: string, endpoint: string): string {\n const base = baseURL.replace(/\\/$/, '');\n const path = endpoint.replace(/^\\//, '');\n return `${base}/${path}`;\n}\n\nexport function getRequestHeaders(\n accessToken: string | null,\n options?: { multipart?: boolean; acceptLanguage?: string },\n): HeadersInit {\n const headers: HeadersInit = {};\n if (!options?.multipart) {\n headers['Content-Type'] = 'application/json';\n }\n if (accessToken) {\n headers.Authorization = `Bearer ${accessToken}`;\n }\n if (options?.acceptLanguage) {\n headers['Accept-Language'] = options.acceptLanguage;\n }\n return headers;\n}\n\nexport function getRequestOptions(\n config: RequestConfig,\n token: string | null,\n acceptLanguage?: string,\n): RequestInit {\n const init: RequestInit = {\n method: config.method,\n headers: getRequestHeaders(token, {\n multipart: config.multipart,\n acceptLanguage,\n }),\n body: config.multipart\n ? (config.body as BodyInit)\n : config.body != null\n ? JSON.stringify(config.body)\n : undefined,\n };\n if (config.credentials) {\n init.credentials = config.credentials;\n }\n return init;\n}\n\nexport async function performAccessTokenRefresh(params: {\n baseURL: string;\n getRefreshToken: () => string | null;\n request: RefreshRequestConfig;\n useCookieCredentials: boolean;\n setAccessToken: (token: string) => void;\n onFailure: () => void;\n acceptLanguage?: string;\n}): Promise<string> {\n const refreshToken = params.useCookieCredentials ? null : params.getRefreshToken();\n if (!params.useCookieCredentials && !refreshToken) {\n params.onFailure();\n throw { error: new Error('missing refresh token'), status: 401 };\n }\n\n const bodyContext: RefreshBodyContext = {\n refreshToken,\n useCookieCredentials: params.useCookieCredentials,\n };\n\n const requestConfig: RequestConfig = {\n endpoint: params.request.endpoint,\n method: params.request.method,\n body: params.request.buildBody(bodyContext),\n credentials: params.useCookieCredentials ? 'include' : params.request.credentials,\n };\n\n const response = await fetch(\n buildRequestUrl(params.baseURL, requestConfig.endpoint),\n getRequestOptions(requestConfig, null, params.acceptLanguage),\n );\n const responseText = await response.text();\n\n let data: unknown = null;\n if (responseText) {\n try {\n data = JSON.parse(responseText);\n } catch {\n params.onFailure();\n throw { error: new Error('invalid refresh response'), status: 401 };\n }\n }\n\n const accessToken = params.request.parseAccessToken(data);\n if (!response.ok || !accessToken) {\n params.onFailure();\n throw { error: new Error('failed to refresh access token'), status: 401 };\n }\n\n params.setAccessToken(accessToken);\n return accessToken;\n}\n\nexport async function executeConfiguredRefresh(config: ApiClientConfig): Promise<string> {\n const refresh = config.refresh;\n if (!refresh) {\n throw new Error('refresh is not configured');\n }\n\n refresh.onStart?.();\n try {\n return await performAccessTokenRefresh({\n baseURL: config.baseURL,\n getRefreshToken: config.getRefreshToken,\n request: refresh.request,\n useCookieCredentials: refresh.cookieCredentialsEnabled(),\n setAccessToken: refresh.setAccessToken,\n onFailure: refresh.onFailure,\n acceptLanguage: config.getAcceptLanguage?.(),\n });\n } finally {\n refresh.onEnd?.();\n }\n}\n","import { buildRequestUrl, executeConfiguredRefresh, getRequestOptions } from './request';\nimport type { ApiClientConfig, ApiErrorBody, RequestConfig, RequestError } from './types';\n\nfunction shouldRetryWithRefresh(\n status: number,\n endpoint: string | undefined,\n isRetry: boolean | undefined,\n refreshToken: string | null | undefined,\n refresh: ApiClientConfig['refresh'],\n): boolean {\n if (status !== 401 || !refreshToken || !refresh || !endpoint || isRetry) {\n return false;\n }\n const normalized = endpoint.replace(/^\\//, '');\n return !refresh.request.excludedRetryPrefixes.some((prefix) =>\n normalized.startsWith(prefix.replace(/^\\//, '')),\n );\n}\n\nexport function createResponseHandler(config: ApiClientConfig) {\n const { baseURL, getRefreshToken, refresh } = config;\n\n async function handleResponse(\n response: Response,\n options?: { config?: RequestConfig; isRetry?: boolean },\n ): Promise<unknown> {\n const responseText = await response.text();\n let data: unknown;\n if (responseText) {\n try {\n data = JSON.parse(responseText);\n } catch {\n data = responseText;\n }\n }\n\n if (!response.ok) {\n const refreshToken = getRefreshToken();\n if (\n shouldRetryWithRefresh(\n response.status,\n options?.config?.endpoint,\n options?.isRetry,\n refreshToken,\n refresh,\n ) &&\n options?.config\n ) {\n const newToken = await executeConfiguredRefresh(config);\n const retryResponse = await fetch(\n buildRequestUrl(baseURL, options.config.endpoint),\n getRequestOptions(options.config, newToken, config.getAcceptLanguage?.()),\n );\n return handleResponse(retryResponse, { ...options, isRetry: true });\n }\n\n throw {\n error: data as ApiErrorBody,\n status: response.status,\n retry: response.status >= 500,\n } satisfies RequestError;\n }\n\n return data;\n }\n\n return handleResponse;\n}\n","import { createContext, type ReactNode, useCallback, useContext, useMemo } from 'react';\nimport { buildRequestUrl, getRequestOptions } from './request';\nimport { createResponseHandler } from './responseHandler';\nimport type { ApiClientConfig, ApiClientProviderConfig, FetchFn, RequestConfig } from './types';\n\nconst ApiClientContext = createContext<ApiClientConfig | null>(null);\n\nexport function ApiClientProvider({\n baseURL,\n config,\n children,\n}: {\n baseURL: string;\n config: ApiClientProviderConfig;\n children: ReactNode;\n}) {\n const value = useMemo<ApiClientConfig>(() => ({ ...config, baseURL }), [baseURL, config]);\n\n return <ApiClientContext.Provider value={value}>{children}</ApiClientContext.Provider>;\n}\n\nexport function useApiClientConfig(): ApiClientConfig {\n const ctx = useContext(ApiClientContext);\n if (!ctx) {\n throw new Error('useApiClientConfig must be used within ApiClientProvider');\n }\n return ctx;\n}\n\nexport function useAPI(): FetchFn {\n const config = useApiClientConfig();\n const responseHandler = useMemo(() => createResponseHandler(config), [config]);\n\n return useCallback(\n (requestConfig: RequestConfig) => {\n const accessToken = config.getAccessToken();\n return fetch(\n buildRequestUrl(config.baseURL, requestConfig.endpoint),\n getRequestOptions(requestConfig, accessToken, config.getAcceptLanguage?.()),\n ).then((response) => responseHandler(response, { config: requestConfig }));\n },\n [config, responseHandler],\n );\n}\n","import { type ReactNode, useMemo } from 'react';\n\nimport { ApiClientProvider } from './ApiClientContext';\nimport { createDefaultRefreshRequest } from './request';\nimport type { ApiClientProviderConfig } from './types';\n\nexport interface CreateApiProviderOptions {\n baseURL: string;\n getAccessToken: () => string | null;\n getRefreshToken: () => string | null;\n /** When true, refresh uses HttpOnly cookie credentials instead of body token. */\n cookieCredentialsEnabled: () => boolean;\n setAccessToken: (token: string) => void;\n onRefreshFailure: () => void;\n getAcceptLanguage?: () => string;\n onRefreshStart?: () => void;\n onRefreshEnd?: () => void;\n /** Refresh endpoint path relative to baseURL. Defaults to `auth/refresh`. */\n refreshEndpoint?: string;\n /** Paths that must not trigger automatic refresh retry on 401. Defaults to `['auth/']`. */\n refreshExcludedPrefixes?: string[];\n}\n\n/**\n * Factory for app `ApiProvider` components. Pass a hook that returns wiring options\n * (cookies, i18n, zustand). Memoize that return value with `useMemo` so the API\n * client context is not rebuilt on every parent render.\n */\nexport function createApiProvider(useOptions: () => CreateApiProviderOptions) {\n return function ApiProvider({ children }: { children: ReactNode }) {\n const options = useOptions();\n\n const apiConfig = useMemo<ApiClientProviderConfig>(\n () => ({\n getAccessToken: options.getAccessToken,\n getRefreshToken: options.getRefreshToken,\n getAcceptLanguage: options.getAcceptLanguage,\n refresh: {\n request: createDefaultRefreshRequest({\n endpoint: options.refreshEndpoint,\n excludedRetryPrefixes: options.refreshExcludedPrefixes,\n }),\n cookieCredentialsEnabled: options.cookieCredentialsEnabled,\n setAccessToken: options.setAccessToken,\n onFailure: options.onRefreshFailure,\n onStart: options.onRefreshStart,\n onEnd: options.onRefreshEnd,\n },\n }),\n [options],\n );\n\n return (\n <ApiClientProvider baseURL={options.baseURL} config={apiConfig}>\n {children}\n </ApiClientProvider>\n );\n };\n}\n"]}