@arqel-dev/ui 0.16.0 → 0.17.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/ArqelEditPage-7OFWPULE.js +12 -0
- package/dist/{ArqelEditPage-RRYFYOTC.js.map → ArqelEditPage-7OFWPULE.js.map} +1 -1
- package/dist/ArqelIndexPage-ZAVCCM6V.js +14 -0
- package/dist/{ArqelIndexPage-J2EUV2PI.js.map → ArqelIndexPage-ZAVCCM6V.js.map} +1 -1
- package/dist/action.js +2 -1
- package/dist/{chunk-SK6H7ARE.js → chunk-3E66JNQO.js} +3 -18
- package/dist/chunk-3E66JNQO.js.map +1 -0
- package/dist/chunk-53J74IYR.js +22 -0
- package/dist/chunk-53J74IYR.js.map +1 -0
- package/dist/{chunk-SLLTFOOS.js → chunk-7NGUPQON.js} +5 -192
- package/dist/chunk-7NGUPQON.js.map +1 -0
- package/dist/chunk-DO3PRGVV.js +198 -0
- package/dist/chunk-DO3PRGVV.js.map +1 -0
- package/dist/{chunk-X4ZFKOPX.js → chunk-DOQUHQND.js} +4 -4
- package/dist/{chunk-X4ZFKOPX.js.map → chunk-DOQUHQND.js.map} +1 -1
- package/dist/{chunk-S5UNPCMQ.js → chunk-JKD6SE75.js} +3 -269
- package/dist/chunk-JKD6SE75.js.map +1 -0
- package/dist/{chunk-EG2DASKR.js → chunk-KGAY2AZH.js} +4 -3
- package/dist/chunk-KGAY2AZH.js.map +1 -0
- package/dist/chunk-WKIYS2FQ.js +509 -0
- package/dist/chunk-WKIYS2FQ.js.map +1 -0
- package/dist/chunk-YEPQWAD6.js +275 -0
- package/dist/chunk-YEPQWAD6.js.map +1 -0
- package/dist/index.js +7 -4
- package/dist/pages.js +10 -7
- package/dist/pages.js.map +1 -1
- package/dist/resource.js +3 -2
- package/dist/table.js +2 -1
- package/dist/utility.js +2 -1
- package/package.json +6 -6
- package/dist/ArqelEditPage-RRYFYOTC.js +0 -8
- package/dist/ArqelIndexPage-J2EUV2PI.js +0 -12
- package/dist/chunk-EG2DASKR.js.map +0 -1
- package/dist/chunk-S5UNPCMQ.js.map +0 -1
- package/dist/chunk-SK6H7ARE.js.map +0 -1
- package/dist/chunk-SLLTFOOS.js.map +0 -1
- package/dist/chunk-YQ6KXR3U.js +0 -55
- package/dist/chunk-YQ6KXR3U.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/table/cells.tsx","../src/table/DataTable.tsx","../src/table/TableFilters.tsx","../src/table/TablePagination.tsx","../src/table/TableToolbar.tsx"],"names":["useArqelTranslations","jsx","jsxs","useArqelLocale","useMemo"],"mappings":";;;;;;;;AA8BO,SAAS,SAAA,CAAU,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAc;AACtD,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,MAAA;AACH,MAAA,uBAAO,GAAA,CAAC,QAAA,EAAA,EAAS,MAAA,EAAgB,KAAA,EAAc,CAAA;AAAA,IACjD,KAAK,OAAA;AACH,MAAA,uBAAO,GAAA,CAAC,SAAA,EAAA,EAAU,MAAA,EAAgB,KAAA,EAAc,CAAA;AAAA,IAClD,KAAK,SAAA;AACH,MAAA,uBAAO,GAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAgB,KAAA,EAAc,CAAA;AAAA,IACpD,KAAK,MAAA;AACH,MAAA,uBAAO,GAAA,CAAC,QAAA,EAAA,EAAS,MAAA,EAAgB,KAAA,EAAc,CAAA;AAAA,IACjD,KAAK,QAAA;AACH,MAAA,uBAAO,GAAA,CAAC,UAAA,EAAA,EAAW,MAAA,EAAgB,KAAA,EAAc,CAAA;AAAA,IACnD,KAAK,MAAA;AACH,MAAA,uBAAO,GAAA,CAAC,YAAS,MAAA,EAAgB,CAAA;AAAA,IACnC,KAAK,OAAA;AACH,MAAA,uBAAO,GAAA,CAAC,SAAA,EAAA,EAAU,MAAA,EAAgB,KAAA,EAAc,CAAA;AAAA,IAClD,KAAK,cAAA;AACH,MAAA,uBAAO,GAAA,CAAC,gBAAA,EAAA,EAAiB,MAAA,EAAgB,KAAA,EAAc,CAAA;AAAA,IACzD,KAAK,UAAA;AACH,MAAA,uBAAO,GAAA,CAAC,YAAA,EAAA,EAAa,MAAA,EAAgB,KAAA,EAAc,CAAA;AAAA;AAEzD;AAEA,SAAS,SAAS,KAAA,EAAwB;AACxC,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,EAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,SAAA,EAAW,OAAO,OAAO,KAAK,CAAA;AAChF,EAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAC7B;AAEA,SAAS,QAAA,CAAS,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAiD;AACjF,EAAA,MAAM,GAAA,GAAM,SAAS,KAAK,CAAA;AAC1B,EAAA,MAAM,YACJ,MAAA,CAAO,KAAA,CAAM,QAAA,IAAY,GAAA,CAAI,SAAS,MAAA,CAAO,KAAA,CAAM,QAAA,GAC/C,CAAA,EAAG,IAAI,KAAA,CAAM,CAAA,EAAG,OAAO,KAAA,CAAM,QAAQ,CAAC,CAAA,MAAA,CAAA,GACtC,GAAA;AACN,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,MAAA,IAAU,WAAA;AAAA,QAClC,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,QAAA,IAAY;AAAA,OACtC;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AASA,IAAM,iBAAA,GAA4C;AAAA,EAChD,IAAA,EAAM,0BAAA;AAAA,EACN,KAAA,EAAO,sEAAA;AAAA,EACP,IAAA,EAAM,kEAAA;AAAA,EACN,GAAA,EAAK,8DAAA;AAAA,EACL,MAAA,EAAQ,0EAAA;AAAA,EACR,KAAA,EAAO,sEAAA;AAAA,EACP,MAAA,EAAQ,0EAAA;AAAA,EACR,IAAA,EAAM,kEAAA;AAAA,EACN,KAAA,EAAO,sEAAA;AAAA,EACP,OAAA,EAAS,8EAAA;AAAA,EACT,IAAA,EAAM,kEAAA;AAAA,EACN,IAAA,EAAM,kEAAA;AAAA,EACN,GAAA,EAAK,8DAAA;AAAA,EACL,IAAA,EAAM,kEAAA;AAAA,EACN,MAAA,EAAQ,0EAAA;AAAA,EACR,MAAA,EAAQ,0EAAA;AAAA,EACR,MAAA,EAAQ,0EAAA;AAAA,EACR,OAAA,EAAS,8EAAA;AAAA,EACT,IAAA,EAAM,kEAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAEA,IAAM,iBAAA,GAAoB,0BAAA;AAE1B,SAAS,SAAA,CAAU,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAkD;AACnF,EAAA,MAAM,GAAA,GAAM,SAAS,KAAK,CAAA;AAC1B,EAAA,MAAM,MAAA,GAAS,OAAO,KAAA,CAAM,OAAA,EAAS,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,KAAK,CAAA;AAClE,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,GAAA;AAE/B,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,MAAA,GAAS,GAAG,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAc,UAAA,IAAc,iBAAA,CAAkB,UAAU,CAAA,IAAM,iBAAA;AAEpE,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,QAAA,GAAW,iBAAA,CAAkB,QAAQ,CAAA,GAAI,MAAA;AAEtD,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,gEAAA;AAAA,QACA,MAAA,CAAO,KAAA,CAAM,IAAA,GAAO,cAAA,GAAiB,YAAA;AAAA,QACrC;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA,uBAAQ,IAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAkB,aAAA,EAAW,MAAC,CAAA,GAAK,IAAA;AAAA,QAC1D;AAAA;AAAA;AAAA,GACH;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAoD;AACvF,EAAA,MAAM,IAAI,oBAAA,EAAqB;AAC/B,EAAA,MAAM,MAAA,GAAS,QAAQ,KAAK,CAAA;AAG5B,EAAA,MAAM,SAAA,GAAY,SACd,CAAA,CAAE,0BAAA,EAA4B,MAAM,CAAA,GACpC,CAAA,CAAE,6BAA6B,OAAO,CAAA;AAC1C,EAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAK,IAAA,EAAK,KAAA,EAAM,cAAY,SAAA,EAC1B,QAAA,EAAA,MAAA,GAAU,MAAA,CAAO,KAAA,CAAM,QAAA,IAAY,QAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,aAAa,QAAA,EACxE,CAAA;AAEJ;AAEA,SAAS,QAAA,CAAS,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAiD;AAGjF,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,IAAI,CAAC,KAAA,EAAO,2BAAQ,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,QAAA,EAAC,CAAA;AAC5D,EAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,GAAG,CAAA;AACzB,EAAA,IAAI,MAAA,CAAO,MAAM,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,GAAA,EAAI,CAAA;AAGpD,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,QAAA,IAAY,MAAA;AAC1C,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AACjC,IAAA,uBAAO,GAAA,CAAC,UAAK,QAAA,EAAU,IAAA,CAAK,aAAY,EAAI,QAAA,EAAA,cAAA,CAAe,IAAA,EAAM,MAAM,CAAA,EAAE,CAAA;AAAA,EAC3E;AACA,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,IAAA,KAAS,UAAA,EAAY;AACpC,IAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,IAAA,CAAK,WAAA,EAAY,EAAI,QAAA,EAAA,UAAA,CAAW,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAY,QAAQ,CAAA,EAAE,CAAA;AAAA,EAExF;AACA,EAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,IAAA,CAAK,WAAA,EAAY,EAAI,QAAA,EAAA,UAAA,CAAW,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,QAAQ,CAAA,EAAE,CAAA;AACzF;AAEA,SAAS,UAAA,CACP,IAAA,EACA,MAAA,EACA,IAAA,EACA,QAAA,EACQ;AACR,EAAA,MAAM,OAAA,GACJ,IAAA,KAAS,UAAA,GAAa,EAAE,SAAA,EAAW,QAAA,EAAU,SAAA,EAAW,OAAA,EAAQ,GAAI,EAAE,SAAA,EAAW,QAAA,EAAS;AAC5F,EAAA,IAAI,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,QAAA,GAAW,QAAA;AAC/C,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,QAAQ,OAAO,CAAA,CAAE,OAAO,IAAI,CAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AAEN,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,GAAG,MAAK,GAAI,OAAA;AACrC,MAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,QAAQ,IAAI,CAAA,CAAE,OAAO,IAAI,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,IAAA,KAAS,UAAA,GAAa,IAAA,CAAK,WAAA,EAAY,GAAI,KAAK,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EAClF;AACF;AAEA,SAAS,cAAA,CAAe,MAAY,MAAA,EAAwB;AAC1D,EAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAA,CAAO,IAAA,CAAK,KAAI,GAAI,IAAA,CAAK,OAAA,EAAQ,IAAK,GAAI,CAAA;AAC/D,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,kBAAA,CAAmB,QAAQ,EAAE,OAAA,EAAS,QAAQ,CAAA;AAEnE,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AACnC,EAAA,IAAI,aAAa,EAAA,EAAI,OAAO,IAAI,MAAA,CAAO,CAAC,SAAS,QAAQ,CAAA;AACzD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACvC,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,GAAI,EAAA,SAAW,GAAA,CAAI,MAAA,CAAO,CAAC,OAAA,EAAS,QAAQ,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACrC,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,EAAA,SAAW,GAAA,CAAI,MAAA,CAAO,CAAC,KAAA,EAAO,MAAM,CAAA;AAC1D,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,EAAE,CAAA;AAClC,EAAA,OAAO,GAAA,CAAI,MAAA,CAAO,CAAC,IAAA,EAAM,KAAK,CAAA;AAChC;AAEA,SAAS,UAAA,CAAW,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAmD;AACrF,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,KAAU,QAAW,uBAAO,GAAA,CAAC,UAAK,QAAA,EAAA,QAAA,EAAC,CAAA;AACzD,EAAA,MAAM,MAAM,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC5D,EAAA,IAAI,MAAA,CAAO,MAAM,GAAG,CAAA,yBAAU,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,QAAA,CAAS,KAAK,CAAA,EAAE,CAAA;AAIrD,EAAA,IAAI,MAAA,CAAO,MAAM,QAAA,EAAU;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ;AAAA,QAC9C,KAAA,EAAO,UAAA;AAAA,QACP,QAAA,EAAU,OAAO,KAAA,CAAM,QAAA;AAAA,QACvB,GAAI,MAAA,CAAO,KAAA,CAAM,QAAA,KAAa,KAAA,CAAA,GAC1B;AAAA,UACE,qBAAA,EAAuB,OAAO,KAAA,CAAM,QAAA;AAAA,UACpC,qBAAA,EAAuB,OAAO,KAAA,CAAM;AAAA,YAEtC;AAAC,OACN,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA;AACb,MAAA,4BACG,MAAA,EAAA,EACE,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,MAAM,MAAA,IAAU,EAAA;AAAA,QACvB,SAAA;AAAA,QACA,MAAA,CAAO,MAAM,MAAA,IAAU;AAAA,OAAA,EAC1B,CAAA;AAAA,IAEJ,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,QAAA,IAAY,CAAA;AAG1C,EAAA,MAAM,EAAA,GAAK,OAAO,KAAA,CAAM,kBAAA;AACxB,EAAA,MAAM,EAAA,GAAK,OAAO,KAAA,CAAM,gBAAA;AACxB,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,MAAA,EAAW;AACxC,IAAA,IAAA,GAAO,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ;AAAA,MACnC,qBAAA,EAAuB,QAAA;AAAA,MACvB,qBAAA,EAAuB;AAAA,KACxB,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA;AAAA,EACf,CAAA,MAAO;AACL,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,OAAA,CAAQ,QAAQ,CAAA;AACtC,IAAA,MAAM,CAAC,KAAA,EAAO,GAAG,CAAA,GAAI,SAAA,CAAU,MAAM,GAAG,CAAA;AACxC,IAAA,MAAM,YAAY,KAAA,IAAS,GAAA;AAC3B,IAAA,MAAM,aAAa,EAAA,GAAK,SAAA,CAAU,OAAA,CAAQ,uBAAA,EAAyB,EAAE,CAAA,GAAI,SAAA;AACzE,IAAA,IAAA,GAAO,GAAA,GAAM,GAAG,UAAU,CAAA,EAAG,MAAM,GAAG,CAAA,EAAG,GAAG,CAAA,CAAA,GAAK,UAAA;AAAA,EACnD;AACA,EAAA,4BACG,MAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,MAAM,MAAA,IAAU,EAAA;AAAA,IACvB,IAAA;AAAA,IACA,MAAA,CAAO,MAAM,MAAA,IAAU;AAAA,GAAA,EAC1B,CAAA;AAEJ;AAEA,SAAS,QAAA,CAAS,EAAE,MAAA,EAAO,EAAiC;AAC1D,EAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAK,IAAA,EAAK,KAAA,EAAM,cAAY,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,IAAA,EACjE,QAAA,EAAA,MAAA,CAAO,MAAM,IAAA,EAChB,CAAA;AAEJ;AAEA,SAAS,SAAA,CAAU,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAkD;AACnF,EAAA,MAAM,GAAA,GAAM,SAAS,KAAK,CAAA;AAC1B,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,EAAA;AAClC,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,GAAA,EAAI,EAAA;AAAA,MACJ,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,MACnC,WAAW,EAAA,CAAG,MAAA,CAAO,MAAM,KAAA,KAAU,UAAA,GAAa,iBAAiB,SAAS;AAAA;AAAA,GAC9E;AAEJ;AAEA,SAAS,gBAAA,CAAiB,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAyD;AACjG,EAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,KAAU,QAAW,uBAAO,GAAA,CAAC,UAAK,QAAA,EAAA,QAAA,EAAC,CAAA;AACzD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,IAAA,GAAQ,KAAA,CAAkC,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA;AACtE,IAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,QAAA,CAAS,IAAI,CAAA,EAAE,CAAA;AAAA,EAC/B;AACA,EAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,QAAA,CAAS,KAAK,CAAA,EAAE,CAAA;AAChC;AAEA,SAAS,YAAA,CAAa,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAqD;AACzF,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,2BAAQ,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAyB,QAAA,EAAA,MAAA,CAAO,KAAA,CAAM,eAAe,QAAA,EAAI,CAAA;AAAA,EAClF;AACA,EAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,QAAA,CAAS,KAAK,CAAA,EAAE,CAAA;AAChC;ACxPO,SAAS,SAAA,CAA2C;AAAA,EACzD,OAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,cAAc,EAAC;AAAA,EACf,iBAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,YAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,UAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,IAAIA,oBAAAA,EAAqB;AAC/B,EAAA,MAAM,mBAAA,GAAsB,OAAsB,IAAI,CAAA;AAEtD,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,MAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEpF,EAAA,MAAM,YAAA,GAAe,OAAA;AAAA,IACnB,MACE,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MAC3B,IAAI,GAAA,CAAI,IAAA;AAAA,MACR,UAAA,EAAY,CAAC,GAAA,KAAS,GAAA,CAAgC,IAAI,IAAI,CAAA;AAAA,MAC9D,MAAA,EAAQ,MAAM,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,IAAA;AAAA,MAC/B,IAAA,EAAM,CAAC,IAAA,qBAASC,GAAAA,CAAC,SAAA,EAAA,EAAU,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,IAAA,CAAK,QAAA,EAAS,EAAG,CAAA;AAAA,MAChE,eAAe,GAAA,CAAI;AAAA,KACrB,CAAE,CAAA;AAAA,IACJ,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,QAAQ,aAAA,CAAc;AAAA,IAC1B,IAAA,EAAM,OAAA;AAAA,IACN,OAAA,EAAS,YAAA;AAAA,IACT,iBAAiB,eAAA;AAAgB,GAClC,CAAA;AAED,EAAA,MAAM,cACJ,eAAA,IAAmB,OAAA,CAAQ,SAAS,CAAA,IAAK,WAAA,CAAY,WAAW,OAAA,CAAQ,MAAA;AAC1E,EAAA,MAAM,eACJ,eAAA,IAAmB,WAAA,CAAY,SAAS,CAAA,IAAK,WAAA,CAAY,SAAS,OAAA,CAAQ,MAAA;AAE5E,EAAA,MAAM,SAAA,GAAY,YAAY,MAAM;AAClC,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACxB,IAAA,IAAI,WAAA,EAAa,iBAAA,CAAkB,EAAE,CAAA;AAAA,2BACd,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAAA,EACjD,CAAA,EAAG,CAAC,WAAA,EAAa,OAAA,EAAS,iBAAiB,CAAC,CAAA;AAE5C,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IAChB,CAAC,EAAA,EAAW,KAAA,EAAe,QAAA,KAAsB;AAC/C,MAAA,IAAI,CAAC,iBAAA,EAAmB;AAMxB,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAW,WAAW,CAAA;AACtC,MAAA,MAAM,YAAY,mBAAA,CAAoB,OAAA;AAEtC,MAAA,IAAI,QAAA,IAAY,cAAc,IAAA,EAAM;AAClC,QAAA,MAAM,CAAC,IAAA,EAAM,EAAE,CAAA,GAAI,SAAA,GAAY,KAAA,GAAQ,CAAC,SAAA,EAAW,KAAK,CAAA,GAAI,CAAC,KAAA,EAAO,SAAS,CAAA;AAC7E,QAAA,MAAM,YAAA,GAAe,CAAC,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AAChC,QAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,IAAK,EAAA,EAAI,CAAA,EAAA,EAAK;AAC/B,UAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,EAAA;AAC1B,UAAA,IAAI,UAAU,MAAA,EAAW;AACzB,UAAA,IAAI,YAAA,EAAc,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AAAA,eAC1B,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,QACvB;AAAA,MACF,CAAA,MAAA,IAAW,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,EAAG;AACtB,QAAA,GAAA,CAAI,OAAO,EAAE,CAAA;AAAA,MACf,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,IAAI,EAAE,CAAA;AAAA,MACZ;AAEA,MAAA,mBAAA,CAAoB,OAAA,GAAU,KAAA;AAC9B,MAAA,iBAAA,CAAkB,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,IACnC,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,WAAA,EAAa,iBAAiB;AAAA,GAC1C;AAEA,EAAA,MAAM,mBAAA,GAAsB,CAAC,UAAA,KAA6C;AACxE,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,YAAY,OAAO,IAAA;AAChD,IAAA,OAAO,IAAA,CAAK,SAAA,KAAc,MAAA,GAAS,MAAA,GAAS,KAAA;AAAA,EAC9C,CAAA;AAEA,EAAA,uBACEC,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,gDAAA,EAAkD,SAAS,CAAA,EAC5E,QAAA,kBAAAC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,gCAAA,EACf,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,4BAAA,EACd,gBAAM,eAAA,EAAgB,CAAE,GAAA,CAAI,CAAC,KAAA,qBAC5BC,IAAAA,CAAC,IAAA,EAAA,EAAkB,WAAU,wBAAA,EAC1B,QAAA,EAAA;AAAA,QAAA,eAAA,oBACCD,GAAAA,CAAC,IAAA,EAAA,EAAG,OAAM,KAAA,EAAM,SAAA,EAAU,4BACxB,QAAA,kBAAAA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,UAAA;AAAA,YACL,YAAA,EAAY,CAAA,CAAE,4BAAA,EAA8B,iBAAiB,CAAA;AAAA,YAC7D,OAAA,EAAS,WAAA;AAAA,YACT,GAAA,EAAK,CAAC,EAAA,KAAO;AACX,cAAA,IAAI,EAAA,KAAO,aAAA,GAAgB,YAAA;AAAA,YAC7B,CAAA;AAAA,YACA,QAAA,EAAU;AAAA;AAAA,SACZ,EACF,CAAA;AAAA,QAED,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAC7B,UAAA,MAAM,GAAA,GAAM,eAAe,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAClE,UAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,YAAA;AAClC,UAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AACtD,UAAA,uBACEA,GAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,KAAA,EAAM,KAAA;AAAA,cACN,SAAA,EAAW,EAAA;AAAA,gBACT,uDAAA;AAAA,gBACA,GAAA,EAAK,UAAU,QAAA,IAAY,aAAA;AAAA,gBAC3B,GAAA,EAAK,UAAU,KAAA,IAAS,YAAA;AAAA,gBACxB,KAAK,cAAA,IAAkB;AAAA,eACzB;AAAA,cACA,aACE,SAAA,KAAc,KAAA,GACV,WAAA,GACA,SAAA,KAAc,SACZ,YAAA,GACA,MAAA;AAAA,cAGP,qCACCC,IAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,SAAA,EAAW,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAKT,iFAAA;AAAA,oBACA,GAAA,EAAK,UAAU,QAAA,IAAY,gBAAA;AAAA,oBAC3B,GAAA,EAAK,UAAU,KAAA,IAAS;AAAA,mBAC1B;AAAA,kBACA,OAAA,EAAS,MACP,YAAA,CAAa,MAAA,CAAO,OAAO,EAAA,EAAI,SAAA,KAAc,KAAA,GAAQ,MAAA,GAAS,KAAK,CAAA;AAAA,kBAGpE,QAAA,EAAA;AAAA,oBAAA,UAAA,CAAW,OAAO,MAAA,CAAO,SAAA,CAAU,MAAA,EAAQ,MAAA,CAAO,YAAY,CAAA;AAAA,oCAC/DD,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAY,MAAA,EACf,QAAA,EAAA,SAAA,KAAc,KAAA,GAAQ,QAAA,GAAM,SAAA,KAAc,MAAA,GAAS,QAAA,GAAM,QAAA,EAC5D;AAAA;AAAA;AAAA,eACF,GAEA,WAAW,MAAA,CAAO,MAAA,CAAO,UAAU,MAAA,EAAQ,MAAA,CAAO,YAAY;AAAA,aAAA;AAAA,YAtC3D,MAAA,CAAO;AAAA,WAwCd;AAAA,QAEJ,CAAC,CAAA;AAAA,QACA,8BACCA,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,KAAA;AAAA,YACN,SAAA,EAAU,2BAAA;AAAA,YACV,YAAA,EAAY,CAAA,CAAE,sBAAA,EAAwB,SAAS;AAAA;AAAA;AACjD,OAAA,EAAA,EApEK,KAAA,CAAM,EAsEf,CACD,CAAA,EACH,CAAA;AAAA,sBACAC,KAAC,OAAA,EAAA,EACE,QAAA,EAAA;AAAA,QAAA,OAAA,oBACCD,GAAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,SAAS,cAAA,CAAe,MAAA,IAAU,kBAAkB,CAAA,GAAI,CAAA,CAAA,IAAM,aAAa,CAAA,GAAI,CAAA,CAAA;AAAA,YAC/E,SAAA,EAAU,6CAAA;AAAA,YAET,QAAA,EAAA,CAAA,CAAE,iBAAiB,eAAU;AAAA;AAAA,SAChC,EACF,CAAA;AAAA,QAED,CAAC,WAAW,OAAA,CAAQ,MAAA,KAAW,qBAC9BA,GAAAA,CAAC,QACC,QAAA,kBAAAA,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,SAAS,cAAA,CAAe,MAAA,IAAU,kBAAkB,CAAA,GAAI,CAAA,CAAA,IAAM,aAAa,CAAA,GAAI,CAAA,CAAA;AAAA,YAC/E,SAAA,EAAU,6CAAA;AAAA,YAET,QAAA,EAAA,UAAA,IAAc,CAAA,CAAE,aAAA,EAAe,mBAAmB;AAAA;AAAA,SACrD,EACF,CAAA;AAAA,QAED,CAAC,WACA,KAAA,CAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,KAAU;AAC3C,UAAA,MAAM,SAAS,GAAA,CAAI,QAAA;AACnB,UAAA,MAAM,OAAA,GAAU,WAAA,CAAY,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA;AAC9C,UAAA,uBACEC,IAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,iBAAe,OAAA,IAAW,MAAA;AAAA,cAC1B,SAAA,EAAW,EAAA,CAAG,wBAAA,EAA0B,OAAA,IAAW,UAAU,CAAA;AAAA,cAE5D,QAAA,EAAA;AAAA,gBAAA,eAAA,oBACCD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kBACZ,QAAA,kBAAAA,GAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,UAAA;AAAA,oBACL,cAAY,CAAA,CAAE,uBAAA,EAAyB,CAAA,WAAA,EAAc,MAAA,CAAO,EAAE,CAAA,CAAA,EAAI;AAAA,sBAChE,EAAA,EAAI,MAAA,CAAO,MAAA,CAAO,EAAE;AAAA,qBACrB,CAAA;AAAA,oBACD,OAAA;AAAA,oBACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,sBAAA,MAAM,SAAS,KAAA,CAAM,WAAA;AACrB,sBAAA,SAAA,CAAU,MAAA,CAAO,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA,oBACtD;AAAA;AAAA,iBACF,EACF,CAAA;AAAA,gBAED,GAAA,CAAI,eAAA,EAAgB,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS;AACnC,kBAAA,MAAM,GAAA,GAAM,eAAe,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,IAAA,CAAK,MAAA,CAAO,EAAE,CAAA;AAChE,kBAAA,uBACEA,GAAAA;AAAA,oBAAC,IAAA;AAAA,oBAAA;AAAA,sBAEC,SAAA,EAAW,EAAA;AAAA,wBACT,WAAA;AAAA,wBACA,GAAA,EAAK,UAAU,QAAA,IAAY,aAAA;AAAA,wBAC3B,GAAA,EAAK,UAAU,KAAA,IAAS,YAAA;AAAA,wBACxB,KAAK,cAAA,IAAkB;AAAA,uBACzB;AAAA,sBAEC,qBAAW,IAAA,CAAK,MAAA,CAAO,UAAU,IAAA,EAAM,IAAA,CAAK,YAAY;AAAA,qBAAA;AAAA,oBARpD,IAAA,CAAK;AAAA,mBASZ;AAAA,gBAEJ,CAAC,CAAA;AAAA,gBACA,UAAA,oBACCA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,2BAAA,EAA6B,QAAA,EAAA,UAAA,CAAW,MAAM,CAAA,EAAE;AAAA;AAAA,aAAA;AAAA,YApC3D,GAAA,CAAI;AAAA,WAsCX;AAAA,QAEJ,CAAC;AAAA,OAAA,EACL;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBACAA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,cAAA;AAAA,QACT,IAAA,EAAM,KAAA,CAAM,WAAA,EAAY,CAAE,IAAA;AAAA,QAC1B,eAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA,EAAa,SAAA;AAAA,QACb,UAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAaA,SAAS,SAAA,CAA2C;AAAA,EAClD,OAAA;AAAA,EACA,IAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,IAAID,oBAAAA,EAAqB;AAG/B,EAAA,MAAM,cAAc,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,KAAQ,CAAC,IAAI,cAAc,CAAA;AAE/D,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACEC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDACZ,QAAA,EAAA,CAAA,CAAE,eAAA,EAAiB,eAAU,CAAA,EAChC,CAAA;AAAA,EAEJ;AACA,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDACZ,QAAA,EAAA,UAAA,IAAc,CAAA,CAAE,aAAA,EAAe,mBAAmB,CAAA,EACrD,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCACZ,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,KAAU;AACxB,IAAA,MAAM,SAAS,GAAA,CAAI,QAAA;AACnB,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA;AAC9C,IAAA,uBACEC,IAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QAEC,sBAAA,EAAqB,EAAA;AAAA,QACrB,iBAAe,OAAA,IAAW,MAAA;AAAA,QAC1B,SAAA,EAAW,EAAA,CAAG,6CAAA,EAA+C,OAAA,IAAW,UAAU,CAAA;AAAA,QAEhF,QAAA,EAAA;AAAA,UAAA,CAAA,eAAA,IAAmB,UAAA,qBACnBA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8CAAA,EACZ,QAAA,EAAA;AAAA,YAAA,eAAA,mBACCD,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,+EACf,QAAA,kBAAAA,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,UAAA;AAAA,gBACL,cAAY,CAAA,CAAE,uBAAA,EAAyB,CAAA,WAAA,EAAc,MAAA,CAAO,EAAE,CAAA,CAAA,EAAI;AAAA,kBAChE,EAAA,EAAI,MAAA,CAAO,MAAA,CAAO,EAAE;AAAA,iBACrB,CAAA;AAAA,gBACD,SAAA,EAAU,QAAA;AAAA,gBACV,OAAA;AAAA,gBACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,kBAAA,MAAM,SAAS,KAAA,CAAM,WAAA;AACrB,kBAAA,WAAA,CAAY,MAAA,CAAO,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA,gBACxD;AAAA;AAAA,aACF,EACF,CAAA,mBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA;AAAA,YAEP,UAAA,mBAAaA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,SAAA,EAAW,QAAA,EAAA,UAAA,CAAW,MAAM,CAAA,EAAE,CAAA,GAAS;AAAA,WAAA,EACtE,CAAA;AAAA,0BAEFA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qDAAA,EACX,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,qBAChBC,IAAAA,CAAC,KAAA,EAAA,EAAmB,WAAU,UAAA,EAC5B,QAAA,EAAA;AAAA,4BAAAD,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qCAAqC,QAAA,EAAA,GAAA,CAAI,KAAA,IAAS,IAAI,IAAA,EAAK,CAAA;AAAA,4BACzEA,GAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,EAAA;AAAA,kBACT,qBAAA;AAAA,kBACA,GAAA,CAAI,UAAU,KAAA,IAAS,YAAA;AAAA,kBACvB,GAAA,CAAI,UAAU,QAAA,IAAY;AAAA,iBAC5B;AAAA,gBAEA,QAAA,kBAAAA,IAAC,SAAA,EAAA,EAAU,MAAA,EAAQ,KAAK,KAAA,EAAQ,MAAA,CAAmC,GAAA,CAAI,IAAI,CAAA,EAAG;AAAA;AAAA;AAChF,WAAA,EAAA,EAVQ,GAAA,CAAI,IAWd,CACD,CAAA,EACH;AAAA;AAAA,OAAA;AAAA,MA3CK,GAAA,CAAI;AAAA,KA4CX;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AClXO,SAAS,YAAA,CAAa;AAAA,EAC3B,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,IAAID,oBAAAA,EAAqB;AAC/B,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEjC,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM;AAC7C,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,IAAI,CAAA;AACvB,IAAA,OAAO,MAAM,MAAA,IAAa,CAAA,KAAM,QAAQ,CAAA,KAAM,EAAA,GAAK,MAAM,CAAA,GAAI,GAAA;AAAA,EAC/D,GAAG,CAAC,CAAA;AAEJ,EAAA,uBACEE,IAAAA,CAAC,UAAA,EAAA,EAAS,WAAW,EAAA,CAAG,6CAAA,EAA+C,SAAS,CAAA,EAC9E,QAAA,EAAA;AAAA,oBAAAD,IAAC,QAAA,EAAA,EAAO,SAAA,EAAU,WAAW,QAAA,EAAA,CAAA,CAAE,sBAAA,EAAwB,SAAS,CAAA,EAAE,CAAA;AAAA,IACjE,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QAEC,MAAA;AAAA,QACA,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,QACzB,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,MAAA,CAAO,MAAM,CAAC;AAAA,OAAA;AAAA,MAHnC,MAAA,CAAO;AAAA,KAKf,CAAA;AAAA,IACA,WAAA,GAAc,KAAK,UAAA,oBAClBA,IAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,SAAQ,IAAA,EAAK,IAAA,EAAK,SAAS,UAAA,EACxC,QAAA,EAAA,CAAA,CAAE,uBAAuB,CAAA,eAAA,EAAkB,WAAW,KAAK,EAAE,KAAA,EAAO,WAAA,EAAa,CAAA,EACpF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,QAAA;AACH,MAAA,uBAAOA,GAAAA,CAAC,YAAA,EAAA,EAAa,MAAA,EAAgB,OAAc,QAAA,EAAoB,CAAA;AAAA,IACzE,KAAK,aAAA;AACH,MAAA,uBAAOA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,MAAA,EAAgB,OAAc,QAAA,EAAoB,CAAA;AAAA,IAC9E,KAAK,MAAA;AACH,MAAA,uBAAOA,GAAAA,CAAC,UAAA,EAAA,EAAW,MAAA,EAAgB,OAAc,QAAA,EAAoB,CAAA;AAAA,IACvE,KAAK,SAAA;AACH,MAAA,uBAAOA,GAAAA,CAAC,aAAA,EAAA,EAAc,MAAA,EAAgB,OAAc,QAAA,EAAoB,CAAA;AAAA,IAC1E,KAAK,WAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,OAAO,IAAA;AAAA;AAEb;AAEA,SAAS,cAAA,GAAiB;AACxB,EAAA,OAAO,EAAA;AAAA;AAAA,IAEL,qDAAA;AAAA,IACA,4BAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,YAAA,CAAa;AAAA,EACpB,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,IAAID,oBAAAA,EAAqB;AAC/B,EAAA,uBACEE,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,mDAAA,EACd,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,SAAS,MAAA,CAAO,IAAA;AAAA,oBACxBA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,WAAW,cAAA,EAAe;AAAA,QAC1B,OAAO,KAAA,KAAU,MAAA,IAAa,UAAU,IAAA,GAAO,EAAA,GAAK,OAAO,KAAK,CAAA;AAAA,QAChE,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,MAAA,CAAO,KAAA,KAAU,EAAA,GAAK,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,QAEvE,QAAA,EAAA;AAAA,0BAAAD,IAAC,QAAA,EAAA,EAAO,KAAA,EAAM,IAAI,QAAA,EAAA,CAAA,CAAE,mBAAA,EAAqB,KAAK,CAAA,EAAE,CAAA;AAAA,UAC/C,OAAO,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,wBACzBA,GAAAA,CAAC,QAAA,EAAA,EAAuB,KAAA,EAAO,IAAI,KAAA,EAChC,QAAA,EAAA,GAAA,CAAI,KAAA,EAAA,EADM,GAAA,CAAI,KAEjB,CACD;AAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,iBAAA,CAAkB;AAAA,EACzB,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,QAAmC,EAAC;AACxE,EAAA,uBACEC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,mDAAA,EACd,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,SAAS,MAAA,CAAO,IAAA;AAAA,oBACxBD,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAQ,IAAA;AAAA,QACR,SAAA,EAAW,EAAA,CAAG,cAAA,EAAe,EAAG,yCAAyC,CAAA;AAAA,QACzE,KAAA,EAAO,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA;AAAA,QACrB,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,UAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,CAAA,CAAE,OAAO,eAAA,EAAiB,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA;AAChE,UAAA,QAAA,CAAS,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,IAAA,GAAO,IAAI,CAAA;AAAA,QAC1C,CAAA;AAAA,QAEC,iBAAO,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,wBACzBA,GAAAA,CAAC,QAAA,EAAA,EAAuB,KAAA,EAAO,IAAI,KAAA,EAChC,QAAA,EAAA,GAAA,CAAI,KAAA,EAAA,EADM,GAAA,CAAI,KAEjB,CACD;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,UAAA,CAAW;AAAA,EAClB,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACEC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,mDAAA,EACd,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,SAAS,MAAA,CAAO,IAAA;AAAA,oBACxBD,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,WAAW,cAAA,EAAe;AAAA,QAC1B,KAAA,EAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,EAAA;AAAA,QAC3C,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,MAAA,CAAO,KAAA,KAAU,EAAA,GAAK,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,KAAK;AAAA;AAAA;AACzE,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,IAAID,oBAAAA,EAAqB;AAC/B,EAAA,MAAM,UAAU,KAAA,KAAU,MAAA,IAAa,UAAU,IAAA,GAAO,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC5E,EAAA,uBACEE,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,mDAAA,EACd,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,SAAS,MAAA,CAAO,IAAA;AAAA,oBACxBA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,WAAW,cAAA,EAAe;AAAA,QAC1B,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,UAAA,MAAM,CAAA,GAAI,EAAE,MAAA,CAAO,KAAA;AACnB,UAAA,QAAA,CAAS,CAAA,KAAM,KAAA,GAAQ,IAAA,GAAO,CAAC,CAAA;AAAA,QACjC,CAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,KAAA,EAAO,QAAA,EAAA,MAAA,CAAO,MAAM,QAAA,IAAY,CAAA,CAAE,mBAAA,EAAqB,KAAK,CAAA,EAAE,CAAA;AAAA,0BAC5EA,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,MAAA,EAAQ,QAAA,EAAA,MAAA,CAAO,KAAA,CAAM,SAAA,IAAa,CAAA,CAAE,mBAAA,EAAqB,KAAK,CAAA,EAAE,CAAA;AAAA,0BAC9EA,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,OAAA,EAAS,QAAA,EAAA,MAAA,CAAO,KAAA,CAAM,UAAA,IAAc,CAAA,CAAE,kBAAA,EAAoB,IAAI,CAAA,EAAE;AAAA;AAAA;AAAA;AAChF,GAAA,EACF,CAAA;AAEJ;AC3LO,SAAS,eAAA,CAAgB;AAAA,EAC9B,IAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA,GAAiB,CAAC,EAAA,EAAI,EAAA,EAAI,IAAI,GAAG,CAAA;AAAA,EACjC;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,IAAID,oBAAAA,EAAqB;AAC/B,EAAA,MAAM,SAASG,cAAAA,EAAe;AAC9B,EAAA,MAAM,eAAA,GAAkBC,OAAAA,CAAQ,MAAM,IAAI,IAAA,CAAK,aAAa,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAC7E,EAAA,MAAM,OAAA,GAAA,CAAW,IAAA,CAAK,WAAA,GAAc,CAAA,IAAK,KAAK,OAAA,GAAU,CAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,IAAA,CAAK,cAAc,IAAA,CAAK,OAAA,EAAS,KAAK,KAAK,CAAA;AAGlE,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,MAAA,CAAO,OAAO,CAAA;AAC3C,EAAA,MAAM,EAAA,GAAK,eAAA,CAAgB,MAAA,CAAO,KAAK,CAAA;AACvC,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,KAAK,WAAA,IAAe,CAAA;AACpC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,QAAA;AAExC,EAAA,uBACEF,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,4FAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,YAAA,EAAY,CAAA,CAAE,wBAAA,EAA0B,YAAY,CAAA;AAAA,MAEpD,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA,IAAA,CAAK,UAAU,CAAA,GACZ,CAAA,CAAE,aAAA,EAAe,mBAAmB,CAAA,GACpC,CAAA;AAAA,UACE,0BAAA;AAAA;AAAA;AAAA;AAAA,UAIA,CAAA,QAAA,EAAW,IAAI,CAAA,IAAA,EAAO,EAAE,OAAO,KAAK,CAAA,QAAA,CAAA;AAAA,UACpC,EAAE,IAAA,EAAM,EAAA,EAAI,KAAA;AAAM,SACpB,EACN,CAAA;AAAA,wBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,UAAA,eAAA,oBACCA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,uDAAA,EACd,QAAA,EAAA;AAAA,YAAA,CAAA,CAAE,kBAAkB,UAAU,CAAA;AAAA,4BAE/BD,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,wEAAA;AAAA,gBACV,OAAO,IAAA,CAAK,OAAA;AAAA,gBACZ,QAAA,EAAU,CAAC,CAAA,KAAM,eAAA,CAAgB,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,gBAEtD,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,qBACnBA,GAAAA,CAAC,QAAA,EAAA,EAAe,KAAA,EAAO,CAAA,EACpB,QAAA,EAAA,CAAA,EAAA,EADU,CAEb,CACD;AAAA;AAAA;AACH,WAAA,EACF,CAAA;AAAA,0BAIFA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,SAAA;AAAA,cACR,IAAA,EAAK,IAAA;AAAA,cACL,SAAA,EAAU,aAAA;AAAA,cACV,QAAA,EAAU,OAAA;AAAA,cACV,OAAA,EAAS,MAAM,YAAA,CAAa,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,cAChD,YAAA,EAAY,CAAA,CAAE,gCAAA,EAAkC,eAAe,CAAA;AAAA,cAE9D,QAAA,EAAA,CAAA,CAAE,6BAA6B,MAAM;AAAA;AAAA,WACxC;AAAA,0BACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,YAAA,eAAA,CAAgB,MAAA,CAAO,KAAK,WAAW,CAAA;AAAA,YAAE,KAAA;AAAA,YAAI,eAAA,CAAgB,MAAA,CAAO,IAAA,CAAK,QAAQ;AAAA,WAAA,EACpF,CAAA;AAAA,0BACAD,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,SAAA;AAAA,cACR,IAAA,EAAK,IAAA;AAAA,cACL,SAAA,EAAU,aAAA;AAAA,cACV,QAAA,EAAU,MAAA;AAAA,cACV,OAAA,EAAS,MAAM,YAAA,CAAa,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,cAChD,YAAA,EAAY,CAAA,CAAE,4BAAA,EAA8B,WAAW,CAAA;AAAA,cAEtD,QAAA,EAAA,CAAA,CAAE,yBAAyB,MAAM;AAAA;AAAA;AACpC,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;ACtFO,SAAS,YAAA,CAAa;AAAA,EAC3B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA,GAAgB,CAAA;AAAA,EAChB,WAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,IAAID,oBAAAA,EAAqB;AAC/B,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,+BAAA,EAAiC,SAAS,CAAA,EAC3D,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACZ,QAAA,EAAA;AAAA,MAAA,MAAA;AAAA,MACA;AAAA,KAAA,EACH,CAAA;AAAA,IACC,aAAA,GAAgB,qBACfA,IAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,sFAAA;AAAA,QACV,YAAA,EAAY,CAAA,CAAE,kBAAA,EAAoB,cAAc,CAAA;AAAA,QAEhD,QAAA,EAAA;AAAA,0BAAAD,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA,CAAA,CAAE,uBAAuB,+CAAA,EAAiD;AAAA,YACzE,KAAA,EAAO;AAAA,WACR,CAAA,EACH,CAAA;AAAA,0BACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACZ,QAAA,EAAA;AAAA,YAAA,WAAA;AAAA,YACA,oCACCD,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,+CAAA;AAAA,gBACV,OAAA,EAAS,gBAAA;AAAA,gBAER,QAAA,EAAA,CAAA,CAAE,oBAAoB,OAAO;AAAA;AAAA;AAChC,WAAA,EAEJ;AAAA;AAAA;AAAA;AACF,GAAA,EAEJ,CAAA;AAEJ","file":"chunk-S5UNPCMQ.js","sourcesContent":["/**\n * Column cell renderers — one per `ColumnType` discriminant.\n *\n * `<TableCell column={column} value={...} record={...} />` dispatches on\n * `column.type` so DataTable stays free of polymorphic rendering. Cells\n * never reach into the network themselves; everything they need comes\n * from props serialised server-side.\n */\n\nimport { useArqelLocale, useArqelTranslations } from '@arqel-dev/react/utils';\nimport type {\n BadgeColumnSchema,\n BooleanColumnSchema,\n ColumnSchema,\n ComputedColumnSchema,\n DateColumnSchema,\n IconColumnSchema,\n ImageColumnSchema,\n NumberColumnSchema,\n RelationshipColumnSchema,\n TextColumnSchema,\n} from '@arqel-dev/types/tables';\nimport { cn } from '../utils/cn.js';\nimport { resolveLucideIcon } from '../utils/icon.js';\n\nexport interface CellProps {\n column: ColumnSchema;\n value: unknown;\n}\n\nexport function TableCell({ column, value }: CellProps) {\n switch (column.type) {\n case 'text':\n return <TextCell column={column} value={value} />;\n case 'badge':\n return <BadgeCell column={column} value={value} />;\n case 'boolean':\n return <BooleanCell column={column} value={value} />;\n case 'date':\n return <DateCell column={column} value={value} />;\n case 'number':\n return <NumberCell column={column} value={value} />;\n case 'icon':\n return <IconCell column={column} />;\n case 'image':\n return <ImageCell column={column} value={value} />;\n case 'relationship':\n return <RelationshipCell column={column} value={value} />;\n case 'computed':\n return <ComputedCell column={column} value={value} />;\n }\n}\n\nfunction asString(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n return JSON.stringify(value);\n}\n\nfunction TextCell({ column, value }: { column: TextColumnSchema; value: unknown }) {\n const str = asString(value);\n const truncated =\n column.props.truncate && str.length > column.props.truncate\n ? `${str.slice(0, column.props.truncate)}…`\n : str;\n return (\n <span\n className={cn(\n column.props.weight === 'bold' && 'font-bold',\n column.props.weight === 'medium' && 'font-medium',\n )}\n >\n {truncated}\n </span>\n );\n}\n\n/**\n * Colour token → Tailwind classes for `BadgeColumn::colors()`.\n *\n * Tokens mirror the values the PHP producer emits (e.g. `'green'`,\n * `'yellow'`, `'blue'`). Classes are written out in full so Tailwind's\n * JIT can statically discover them. Unknown tokens fall back to muted.\n */\nconst BADGE_COLOR_CLASS: Record<string, string> = {\n gray: 'bg-muted text-foreground',\n slate: 'bg-slate-100 text-slate-800 dark:bg-slate-800/40 dark:text-slate-200',\n zinc: 'bg-zinc-100 text-zinc-800 dark:bg-zinc-800/40 dark:text-zinc-200',\n red: 'bg-red-100 text-red-800 dark:bg-red-900/40 dark:text-red-200',\n orange: 'bg-orange-100 text-orange-800 dark:bg-orange-900/40 dark:text-orange-200',\n amber: 'bg-amber-100 text-amber-800 dark:bg-amber-900/40 dark:text-amber-200',\n yellow: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/40 dark:text-yellow-200',\n lime: 'bg-lime-100 text-lime-800 dark:bg-lime-900/40 dark:text-lime-200',\n green: 'bg-green-100 text-green-800 dark:bg-green-900/40 dark:text-green-200',\n emerald: 'bg-emerald-100 text-emerald-800 dark:bg-emerald-900/40 dark:text-emerald-200',\n teal: 'bg-teal-100 text-teal-800 dark:bg-teal-900/40 dark:text-teal-200',\n cyan: 'bg-cyan-100 text-cyan-800 dark:bg-cyan-900/40 dark:text-cyan-200',\n sky: 'bg-sky-100 text-sky-800 dark:bg-sky-900/40 dark:text-sky-200',\n blue: 'bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-200',\n indigo: 'bg-indigo-100 text-indigo-800 dark:bg-indigo-900/40 dark:text-indigo-200',\n violet: 'bg-violet-100 text-violet-800 dark:bg-violet-900/40 dark:text-violet-200',\n purple: 'bg-purple-100 text-purple-800 dark:bg-purple-900/40 dark:text-purple-200',\n fuchsia: 'bg-fuchsia-100 text-fuchsia-800 dark:bg-fuchsia-900/40 dark:text-fuchsia-200',\n pink: 'bg-pink-100 text-pink-800 dark:bg-pink-900/40 dark:text-pink-200',\n rose: 'bg-rose-100 text-rose-800 dark:bg-rose-900/40 dark:text-rose-200',\n};\n\nconst BADGE_MUTED_CLASS = 'bg-muted text-foreground';\n\nfunction BadgeCell({ column, value }: { column: BadgeColumnSchema; value: unknown }) {\n const key = asString(value);\n const option = column.props.options?.find((o) => o.value === value);\n const label = option?.label ?? key;\n\n const colorToken = column.props.colors?.[key];\n const colorClass = (colorToken && BADGE_COLOR_CLASS[colorToken]) || BADGE_MUTED_CLASS;\n\n const iconName = column.props.icons?.[key];\n const Icon = iconName ? resolveLucideIcon(iconName) : undefined;\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium',\n column.props.pill ? 'rounded-full' : 'rounded-sm',\n colorClass,\n )}\n >\n {Icon ? <Icon className=\"size-3 shrink-0\" aria-hidden /> : null}\n {label}\n </span>\n );\n}\n\nfunction BooleanCell({ column, value }: { column: BooleanColumnSchema; value: unknown }) {\n const t = useArqelTranslations();\n const truthy = Boolean(value);\n // The glyph stays language-neutral; only the screen-reader accessible name is\n // localized so a pt-BR viewer hears \"sim\"/\"não\" instead of \"true\"/\"false\".\n const ariaLabel = truthy\n ? t('table.boolean.true_label', 'true')\n : t('table.boolean.false_label', 'false');\n return (\n <span role=\"img\" aria-label={ariaLabel}>\n {truthy ? (column.props.trueIcon ?? '✓') : (column.props.falseIcon ?? '—')}\n </span>\n );\n}\n\nfunction DateCell({ column, value }: { column: DateColumnSchema; value: unknown }) {\n // Active panel locale (BCP-47), so dates format in the viewer's locale rather\n // than the runtime default (commonly en-US 'MM/DD/YYYY').\n const locale = useArqelLocale();\n if (!value) return <span className=\"text-muted-foreground\">—</span>;\n const raw = String(value);\n const date = new Date(raw);\n if (Number.isNaN(date.getTime())) return <span>{raw}</span>;\n // `timezone` is honoured when the server emits it; an invalid zone would make\n // `Intl` throw, so fall back to the runtime zone defensively.\n const timeZone = column.props.timezone || undefined;\n if (column.props.mode === 'since') {\n return <time dateTime={date.toISOString()}>{formatRelative(date, locale)}</time>;\n }\n if (column.props.mode === 'datetime') {\n return (\n <time dateTime={date.toISOString()}>{formatDate(date, locale, 'datetime', timeZone)}</time>\n );\n }\n return <time dateTime={date.toISOString()}>{formatDate(date, locale, 'date', timeZone)}</time>;\n}\n\nfunction formatDate(\n date: Date,\n locale: string,\n mode: 'date' | 'datetime',\n timeZone: string | undefined,\n): string {\n const options: Intl.DateTimeFormatOptions =\n mode === 'datetime' ? { dateStyle: 'medium', timeStyle: 'short' } : { dateStyle: 'medium' };\n if (timeZone !== undefined) options.timeZone = timeZone;\n try {\n return new Intl.DateTimeFormat(locale, options).format(date);\n } catch {\n // Invalid timezone (or other Intl error) — retry without it.\n if (timeZone !== undefined) {\n const { timeZone: _drop, ...rest } = options;\n return new Intl.DateTimeFormat(locale, rest).format(date);\n }\n return mode === 'datetime' ? date.toISOString() : date.toISOString().slice(0, 10);\n }\n}\n\nfunction formatRelative(date: Date, locale: string): string {\n const seconds = Math.round((Date.now() - date.getTime()) / 1000);\n const rtf = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' });\n // Negative values render as \"X ago\"; the elapsed time is always in the past.\n const absSeconds = Math.abs(seconds);\n if (absSeconds < 60) return rtf.format(-seconds, 'second');\n const minutes = Math.round(seconds / 60);\n if (Math.abs(minutes) < 60) return rtf.format(-minutes, 'minute');\n const hours = Math.round(minutes / 60);\n if (Math.abs(hours) < 24) return rtf.format(-hours, 'hour');\n const days = Math.round(hours / 24);\n return rtf.format(-days, 'day');\n}\n\nfunction NumberCell({ column, value }: { column: NumberColumnSchema; value: unknown }) {\n const locale = useArqelLocale();\n if (value === null || value === undefined) return <span>—</span>;\n const num = typeof value === 'number' ? value : Number(value);\n if (Number.isNaN(num)) return <span>{asString(value)}</span>;\n\n // `money($currency)` → render through `Intl.NumberFormat` in the active locale\n // so the currency symbol, grouping and decimals follow the viewer's panel.\n if (column.props.currency) {\n try {\n const formatted = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: column.props.currency,\n ...(column.props.decimals !== undefined\n ? {\n minimumFractionDigits: column.props.decimals,\n maximumFractionDigits: column.props.decimals,\n }\n : {}),\n }).format(num);\n return (\n <span>\n {column.props.prefix ?? ''}\n {formatted}\n {column.props.suffix ?? ''}\n </span>\n );\n } catch {\n // Unknown currency code — fall through to the plain numeric path below.\n }\n }\n\n const decimals = column.props.decimals ?? 0;\n // Explicit separators win (developer override). Otherwise group/decimal in the\n // active locale via Intl instead of the previous en-US-shaped raw output.\n const ts = column.props.thousandsSeparator;\n const ds = column.props.decimalSeparator;\n let body: string;\n if (ts === undefined && ds === undefined) {\n body = new Intl.NumberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(num);\n } else {\n const formatted = num.toFixed(decimals);\n const [whole, dec] = formatted.split('.');\n const safeWhole = whole ?? '0';\n const finalWhole = ts ? safeWhole.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ts) : safeWhole;\n body = dec ? `${finalWhole}${ds ?? '.'}${dec}` : finalWhole;\n }\n return (\n <span>\n {column.props.prefix ?? ''}\n {body}\n {column.props.suffix ?? ''}\n </span>\n );\n}\n\nfunction IconCell({ column }: { column: IconColumnSchema }) {\n return (\n <span role=\"img\" aria-label={column.props.icon} title={column.props.icon}>\n {column.props.icon}\n </span>\n );\n}\n\nfunction ImageCell({ column, value }: { column: ImageColumnSchema; value: unknown }) {\n const src = asString(value);\n if (!src) return null;\n const size = column.props.size ?? 32;\n return (\n <img\n src={src}\n alt=\"\"\n style={{ width: size, height: size }}\n className={cn(column.props.shape === 'circular' ? 'rounded-full' : 'rounded')}\n />\n );\n}\n\nfunction RelationshipCell({ column, value }: { column: RelationshipColumnSchema; value: unknown }) {\n if (value === null || value === undefined) return <span>—</span>;\n if (typeof value === 'object') {\n const attr = (value as Record<string, unknown>)[column.props.attribute];\n return <span>{asString(attr)}</span>;\n }\n return <span>{asString(value)}</span>;\n}\n\nfunction ComputedCell({ column, value }: { column: ComputedColumnSchema; value: unknown }) {\n if (value === null || value === undefined) {\n return <span className=\"text-muted-foreground\">{column.props.placeholder ?? '—'}</span>;\n }\n return <span>{asString(value)}</span>;\n}\n","/**\n * `<DataTable>` — generic table built on TanStack Table v8.\n *\n * Columns come from `ColumnSchema[]` (server-emitted). Two structural\n * extras live outside the schema list: a leading selection checkbox\n * (when `enableSelection`) and a trailing actions cell (when\n * `rowActions` resolver is provided).\n *\n * Selection model is controlled — pass `selectedIds` + `onSelectionChange`\n * — so callers (ResourceIndex, custom dashboards) keep ownership. Shift+\n * click on a row checkbox selects the range from the last clicked row,\n * matching the canonical Filament/Linear UX.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { ColumnSchema, SortDirection, TableSort } from '@arqel-dev/types/tables';\nimport {\n type ColumnDef,\n flexRender,\n getCoreRowModel,\n type Row,\n useReactTable,\n} from '@tanstack/react-table';\nimport type { ReactNode } from 'react';\nimport { useCallback, useMemo, useRef } from 'react';\nimport { cn } from '../utils/cn.js';\nimport { TableCell } from './cells.js';\n\ntype RowId = string | number;\n\nexport interface DataTableRecord {\n id: RowId;\n [key: string]: unknown;\n}\n\nexport interface DataTableProps<TRecord extends DataTableRecord> {\n columns: ColumnSchema[];\n records: TRecord[];\n\n enableSelection?: boolean;\n selectedIds?: ReadonlyArray<RowId>;\n onSelectionChange?: ((ids: RowId[]) => void) | undefined;\n\n sort?: TableSort | null;\n onSortChange?: ((column: string, direction: SortDirection) => void) | undefined;\n\n rowActions?: ((record: TRecord) => ReactNode) | undefined;\n\n loading?: boolean;\n emptyState?: ReactNode;\n\n className?: string;\n}\n\nexport function DataTable<TRecord extends DataTableRecord>({\n columns,\n records,\n enableSelection = false,\n selectedIds = [],\n onSelectionChange,\n sort = null,\n onSortChange,\n rowActions,\n loading = false,\n emptyState,\n className,\n}: DataTableProps<TRecord>) {\n const t = useArqelTranslations();\n const lastClickedIndexRef = useRef<number | null>(null);\n\n const visibleColumns = useMemo(() => columns.filter((col) => !col.hidden), [columns]);\n\n const tableColumns = useMemo<ColumnDef<TRecord>[]>(\n () =>\n visibleColumns.map((col) => ({\n id: col.name,\n accessorFn: (row) => (row as Record<string, unknown>)[col.name],\n header: () => col.label ?? col.name,\n cell: (info) => <TableCell column={col} value={info.getValue()} />,\n enableSorting: col.sortable,\n })),\n [visibleColumns],\n );\n\n const table = useReactTable({\n data: records,\n columns: tableColumns,\n getCoreRowModel: getCoreRowModel(),\n });\n\n const allSelected =\n enableSelection && records.length > 0 && selectedIds.length === records.length;\n const someSelected =\n enableSelection && selectedIds.length > 0 && selectedIds.length < records.length;\n\n const toggleAll = useCallback(() => {\n if (!onSelectionChange) return;\n if (allSelected) onSelectionChange([]);\n else onSelectionChange(records.map((r) => r.id));\n }, [allSelected, records, onSelectionChange]);\n\n const toggleRow = useCallback(\n (id: RowId, index: number, shiftKey: boolean) => {\n if (!onSelectionChange) return;\n // `index` is the row's position in the core row-model, which today equals the\n // `records` prop order (only getCoreRowModel is wired — no client sort/filter\n // row model). The shift-range loop resolves ids from `records[i]`, so this\n // holds only while that ordering parity is true; revisit if a client-side\n // sorted/filtered row model is added.\n const set = new Set<RowId>(selectedIds);\n const lastIndex = lastClickedIndexRef.current;\n\n if (shiftKey && lastIndex !== null) {\n const [from, to] = lastIndex < index ? [lastIndex, index] : [index, lastIndex];\n const shouldSelect = !set.has(id);\n for (let i = from; i <= to; i++) {\n const rowId = records[i]?.id;\n if (rowId === undefined) continue;\n if (shouldSelect) set.add(rowId);\n else set.delete(rowId);\n }\n } else if (set.has(id)) {\n set.delete(id);\n } else {\n set.add(id);\n }\n\n lastClickedIndexRef.current = index;\n onSelectionChange(Array.from(set));\n },\n [records, selectedIds, onSelectionChange],\n );\n\n const headerSortDirection = (columnName: string): SortDirection | null => {\n if (!sort || sort.column !== columnName) return null;\n return sort.direction === 'desc' ? 'desc' : 'asc';\n };\n\n return (\n <>\n <div className={cn('hidden w-full min-w-0 overflow-x-auto md:block', className)}>\n <table className=\"w-full border-collapse text-sm\">\n <thead className=\"sticky top-0 bg-background\">\n {table.getHeaderGroups().map((group) => (\n <tr key={group.id} className=\"border-b border-border\">\n {enableSelection && (\n <th scope=\"col\" className=\"w-10 px-3 py-2 text-left\">\n <input\n type=\"checkbox\"\n aria-label={t('table.bulk.select_all_rows', 'Select all rows')}\n checked={allSelected}\n ref={(el) => {\n if (el) el.indeterminate = someSelected;\n }}\n onChange={toggleAll}\n />\n </th>\n )}\n {group.headers.map((header) => {\n const col = visibleColumns.find((c) => c.name === header.column.id);\n const sortable = col?.sortable && onSortChange;\n const direction = headerSortDirection(header.column.id);\n return (\n <th\n key={header.id}\n scope=\"col\"\n className={cn(\n 'px-3 py-2 text-left font-medium text-muted-foreground',\n col?.align === 'center' && 'text-center',\n col?.align === 'end' && 'text-right',\n col?.hiddenOnMobile && 'hidden md:table-cell',\n )}\n aria-sort={\n direction === 'asc'\n ? 'ascending'\n : direction === 'desc'\n ? 'descending'\n : 'none'\n }\n >\n {sortable ? (\n <button\n type=\"button\"\n className={cn(\n // -mx-3 px-3 stretches the button across the cell's\n // horizontal padding; min-h-11 + w-full give a ≥44px\n // touch target on mobile (WCAG 2.5.5) without changing\n // the header's visual density.\n '-mx-3 inline-flex min-h-11 w-full items-center gap-1 px-3 hover:text-foreground',\n col?.align === 'center' && 'justify-center',\n col?.align === 'end' && 'justify-end',\n )}\n onClick={() =>\n onSortChange(header.column.id, direction === 'asc' ? 'desc' : 'asc')\n }\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n <span aria-hidden=\"true\">\n {direction === 'asc' ? '▲' : direction === 'desc' ? '▼' : '↕'}\n </span>\n </button>\n ) : (\n flexRender(header.column.columnDef.header, header.getContext())\n )}\n </th>\n );\n })}\n {rowActions && (\n <th\n scope=\"col\"\n className=\"w-24 px-3 py-2 text-right\"\n aria-label={t('table.column.actions', 'Actions')}\n />\n )}\n </tr>\n ))}\n </thead>\n <tbody>\n {loading && (\n <tr>\n <td\n colSpan={visibleColumns.length + (enableSelection ? 1 : 0) + (rowActions ? 1 : 0)}\n className=\"px-3 py-4 text-center text-muted-foreground\"\n >\n {t('table.loading', 'Loading…')}\n </td>\n </tr>\n )}\n {!loading && records.length === 0 && (\n <tr>\n <td\n colSpan={visibleColumns.length + (enableSelection ? 1 : 0) + (rowActions ? 1 : 0)}\n className=\"px-3 py-8 text-center text-muted-foreground\"\n >\n {emptyState ?? t('table.empty', 'No records found.')}\n </td>\n </tr>\n )}\n {!loading &&\n table.getRowModel().rows.map((row, index) => {\n const record = row.original;\n const checked = selectedIds.includes(record.id);\n return (\n <tr\n key={row.id}\n data-selected={checked || undefined}\n className={cn('border-b border-border', checked && 'bg-muted')}\n >\n {enableSelection && (\n <td className=\"w-10 px-3 py-2\">\n <input\n type=\"checkbox\"\n aria-label={t('table.bulk.select_row', `Select row ${record.id}`, {\n id: String(record.id),\n })}\n checked={checked}\n onChange={(event) => {\n const native = event.nativeEvent as MouseEvent;\n toggleRow(record.id, index, native.shiftKey === true);\n }}\n />\n </td>\n )}\n {row.getVisibleCells().map((cell) => {\n const col = visibleColumns.find((c) => c.name === cell.column.id);\n return (\n <td\n key={cell.id}\n className={cn(\n 'px-3 py-2',\n col?.align === 'center' && 'text-center',\n col?.align === 'end' && 'text-right',\n col?.hiddenOnMobile && 'hidden md:table-cell',\n )}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n );\n })}\n {rowActions && (\n <td className=\"w-24 px-3 py-2 text-right\">{rowActions(record)}</td>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n <DataCards\n columns={visibleColumns}\n rows={table.getRowModel().rows}\n enableSelection={enableSelection}\n selectedIds={selectedIds}\n onToggleRow={toggleRow}\n rowActions={rowActions}\n loading={loading}\n emptyState={emptyState}\n />\n </>\n );\n}\n\ninterface DataCardsProps<TRecord extends DataTableRecord> {\n columns: ColumnSchema[];\n rows: Row<TRecord>[];\n enableSelection: boolean;\n selectedIds: ReadonlyArray<RowId>;\n onToggleRow: (id: RowId, index: number, shiftKey: boolean) => void;\n rowActions?: ((record: TRecord) => ReactNode) | undefined;\n loading: boolean;\n emptyState?: ReactNode;\n}\n\nfunction DataCards<TRecord extends DataTableRecord>({\n columns,\n rows,\n enableSelection,\n selectedIds,\n onToggleRow,\n rowActions,\n loading,\n emptyState,\n}: DataCardsProps<TRecord>) {\n const t = useArqelTranslations();\n // hiddenOnMobile columns are dropped from the card body (same intent as the\n // table hiding them at < md).\n const cardColumns = columns.filter((col) => !col.hiddenOnMobile);\n\n if (loading) {\n return (\n <div className=\"px-3 py-4 text-center text-muted-foreground md:hidden\">\n {t('table.loading', 'Loading…')}\n </div>\n );\n }\n if (rows.length === 0) {\n return (\n <div className=\"px-3 py-8 text-center text-muted-foreground md:hidden\">\n {emptyState ?? t('table.empty', 'No records found.')}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-3 md:hidden\">\n {rows.map((row, index) => {\n const record = row.original;\n const checked = selectedIds.includes(record.id);\n return (\n <article\n key={row.id}\n data-arqel-data-card=\"\"\n data-selected={checked || undefined}\n className={cn('rounded-lg border border-border p-4 text-sm', checked && 'bg-muted')}\n >\n {(enableSelection || rowActions) && (\n <div className=\"mb-3 flex items-center justify-between gap-2\">\n {enableSelection ? (\n <label className=\"-m-2.5 inline-flex size-11 cursor-pointer items-center justify-center p-2.5\">\n <input\n type=\"checkbox\"\n aria-label={t('table.bulk.select_row', `Select row ${record.id}`, {\n id: String(record.id),\n })}\n className=\"size-5\"\n checked={checked}\n onChange={(event) => {\n const native = event.nativeEvent as MouseEvent;\n onToggleRow(record.id, index, native.shiftKey === true);\n }}\n />\n </label>\n ) : (\n <span />\n )}\n {rowActions ? <div className=\"ml-auto\">{rowActions(record)}</div> : null}\n </div>\n )}\n <dl className=\"grid grid-cols-[minmax(0,auto)_1fr] gap-x-3 gap-y-2\">\n {cardColumns.map((col) => (\n <div key={col.name} className=\"contents\">\n <dt className=\"font-medium text-muted-foreground\">{col.label ?? col.name}</dt>\n <dd\n className={cn(\n 'min-w-0 break-words',\n col.align === 'end' && 'text-right',\n col.align === 'center' && 'text-center',\n )}\n >\n <TableCell column={col} value={(record as Record<string, unknown>)[col.name]} />\n </dd>\n </div>\n ))}\n </dl>\n </article>\n );\n })}\n </div>\n );\n}\n","/**\n * `<TableFilters>` — renders one input per `FilterSchema` and emits\n * a single `onChange(name, value)` callback. Active values render as\n * dismissible chips so users can read state without re-opening menus.\n *\n * Phase 1 covers the four most-used filter types (select, multiSelect,\n * text, ternary). dateRange / scope land alongside FieldRenderer in\n * UI-004, where the date primitives ship.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type {\n FilterSchema,\n MultiSelectFilterSchema,\n SelectFilterSchema,\n TernaryFilterSchema,\n TextFilterSchema,\n} from '@arqel-dev/types/tables';\nimport { Button } from '../action/Button.js';\nimport { cn } from '../utils/cn.js';\n\nexport interface TableFiltersProps {\n filters: FilterSchema[];\n values: Record<string, unknown>;\n onChange: (name: string, value: unknown) => void;\n onClearAll?: (() => void) | undefined;\n className?: string | undefined;\n}\n\nexport function TableFilters({\n filters,\n values,\n onChange,\n onClearAll,\n className,\n}: TableFiltersProps) {\n const t = useArqelTranslations();\n if (filters.length === 0) return null;\n\n const activeCount = filters.reduce((acc, f) => {\n const v = values[f.name];\n return v !== undefined && v !== null && v !== '' ? acc + 1 : acc;\n }, 0);\n\n return (\n <fieldset className={cn('flex flex-wrap items-end gap-2 border-0 p-0', className)}>\n <legend className=\"sr-only\">{t('table.filters.legend', 'Filters')}</legend>\n {filters.map((filter) => (\n <FilterControl\n key={filter.name}\n filter={filter}\n value={values[filter.name]}\n onChange={(v) => onChange(filter.name, v)}\n />\n ))}\n {activeCount > 0 && onClearAll && (\n <Button variant=\"ghost\" size=\"sm\" onClick={onClearAll}>\n {t('table.filters.clear', `Clear filters (${activeCount})`, { count: activeCount })}\n </Button>\n )}\n </fieldset>\n );\n}\n\nfunction FilterControl({\n filter,\n value,\n onChange,\n}: {\n filter: FilterSchema;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n switch (filter.type) {\n case 'select':\n return <SelectFilter filter={filter} value={value} onChange={onChange} />;\n case 'multiSelect':\n return <MultiSelectFilter filter={filter} value={value} onChange={onChange} />;\n case 'text':\n return <TextFilter filter={filter} value={value} onChange={onChange} />;\n case 'ternary':\n return <TernaryFilter filter={filter} value={value} onChange={onChange} />;\n case 'dateRange':\n case 'scope':\n return null;\n }\n}\n\nfunction controlClasses() {\n return cn(\n // 44px touch target on mobile (WCAG 2.5.5); dense 36px on >=md.\n 'h-11 rounded-sm border border-[var(--input)] md:h-9',\n 'bg-background px-3 text-sm',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n );\n}\n\nfunction SelectFilter({\n filter,\n value,\n onChange,\n}: {\n filter: SelectFilterSchema;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n const t = useArqelTranslations();\n return (\n <label className=\"flex flex-col gap-1 text-xs text-muted-foreground\">\n {filter.label ?? filter.name}\n <select\n className={controlClasses()}\n value={value === undefined || value === null ? '' : String(value)}\n onChange={(e) => onChange(e.target.value === '' ? null : e.target.value)}\n >\n <option value=\"\">{t('table.filters.all', 'All')}</option>\n {filter.props.options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </label>\n );\n}\n\nfunction MultiSelectFilter({\n filter,\n value,\n onChange,\n}: {\n filter: MultiSelectFilterSchema;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n const arr = Array.isArray(value) ? (value as Array<string | number>) : [];\n return (\n <label className=\"flex flex-col gap-1 text-xs text-muted-foreground\">\n {filter.label ?? filter.name}\n <select\n multiple\n className={cn(controlClasses(), 'h-auto min-h-11 py-1 md:min-h-[2.25rem]')}\n value={arr.map(String)}\n onChange={(e) => {\n const next = Array.from(e.target.selectedOptions, (o) => o.value);\n onChange(next.length === 0 ? null : next);\n }}\n >\n {filter.props.options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </label>\n );\n}\n\nfunction TextFilter({\n filter,\n value,\n onChange,\n}: {\n filter: TextFilterSchema;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n return (\n <label className=\"flex flex-col gap-1 text-xs text-muted-foreground\">\n {filter.label ?? filter.name}\n <input\n type=\"text\"\n className={controlClasses()}\n value={typeof value === 'string' ? value : ''}\n onChange={(e) => onChange(e.target.value === '' ? null : e.target.value)}\n />\n </label>\n );\n}\n\nfunction TernaryFilter({\n filter,\n value,\n onChange,\n}: {\n filter: TernaryFilterSchema;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n const t = useArqelTranslations();\n const current = value === undefined || value === null ? 'all' : String(value);\n return (\n <label className=\"flex flex-col gap-1 text-xs text-muted-foreground\">\n {filter.label ?? filter.name}\n <select\n className={controlClasses()}\n value={current}\n onChange={(e) => {\n const v = e.target.value;\n onChange(v === 'all' ? null : v);\n }}\n >\n <option value=\"all\">{filter.props.allLabel ?? t('table.filters.all', 'All')}</option>\n <option value=\"true\">{filter.props.trueLabel ?? t('table.filters.yes', 'Yes')}</option>\n <option value=\"false\">{filter.props.falseLabel ?? t('table.filters.no', 'No')}</option>\n </select>\n </label>\n );\n}\n","/**\n * `<TablePagination>` — prev/next + range + per-page picker.\n *\n * Stateless: parent owns `currentPage` / `perPage` and handles transitions\n * (typically via Inertia `router.get` with `preserveState: true`).\n */\n\nimport { useArqelLocale, useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { PaginationMeta } from '@arqel-dev/types/resources';\nimport { useMemo } from 'react';\nimport { Button } from '../action/Button.js';\nimport { cn } from '../utils/cn.js';\n\nexport interface TablePaginationProps {\n meta: PaginationMeta;\n onPageChange: (page: number) => void;\n onPerPageChange?: ((perPage: number) => void) | undefined;\n perPageOptions?: number[];\n className?: string;\n}\n\nexport function TablePagination({\n meta,\n onPageChange,\n onPerPageChange,\n perPageOptions = [10, 25, 50, 100],\n className,\n}: TablePaginationProps) {\n const t = useArqelTranslations();\n const locale = useArqelLocale();\n const numberFormatter = useMemo(() => new Intl.NumberFormat(locale), [locale]);\n const fromRaw = (meta.currentPage - 1) * meta.perPage + 1;\n const toRaw = Math.min(meta.currentPage * meta.perPage, meta.total);\n // Interpolated counts are locale number-grouped (12,345 / 12.345) before they\n // reach the translator, whose applyReplacements does plain String() substitution.\n const from = numberFormatter.format(fromRaw);\n const to = numberFormatter.format(toRaw);\n const total = numberFormatter.format(meta.total);\n const isFirst = meta.currentPage <= 1;\n const isLast = meta.currentPage >= meta.lastPage;\n\n return (\n <nav\n className={cn(\n 'flex flex-wrap items-center justify-between gap-2 border-t border-border px-3 py-2 text-sm',\n className,\n )}\n aria-label={t('table.pagination.label', 'Pagination')}\n >\n <span className=\"text-muted-foreground\">\n {meta.total === 0\n ? t('table.empty', 'No records found.')\n : t(\n 'table.pagination.showing',\n // Fallback is rendered verbatim when the key is missing, so it must\n // already carry the interpolated values (the replacements map only\n // applies to a resolved dictionary string).\n `Showing ${from} to ${to} of ${total} results`,\n { from, to, total },\n )}\n </span>\n <div className=\"flex items-center gap-2\">\n {onPerPageChange && (\n <label className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n {t('table.per_page', 'Per page')}\n {/* 44px touch target on mobile (WCAG 2.5.5); dense 32px on >=md. */}\n <select\n className=\"h-11 rounded-sm border border-[var(--input)] bg-background px-2 md:h-8\"\n value={meta.perPage}\n onChange={(e) => onPerPageChange(Number(e.target.value))}\n >\n {perPageOptions.map((n) => (\n <option key={n} value={n}>\n {n}\n </option>\n ))}\n </select>\n </label>\n )}\n {/* Buttons use size=\"sm\" (h-8) for the dense desktop bar; the responsive\n h-11 override lifts them to a 44px touch target below md. */}\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-11 md:h-8\"\n disabled={isFirst}\n onClick={() => onPageChange(meta.currentPage - 1)}\n aria-label={t('table.pagination.previous_page', 'Previous page')}\n >\n {t('table.pagination.previous', 'Prev')}\n </Button>\n <span className=\"text-xs text-muted-foreground\">\n {numberFormatter.format(meta.currentPage)} / {numberFormatter.format(meta.lastPage)}\n </span>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-11 md:h-8\"\n disabled={isLast}\n onClick={() => onPageChange(meta.currentPage + 1)}\n aria-label={t('table.pagination.next_page', 'Next page')}\n >\n {t('table.pagination.next', 'Next')}\n </Button>\n </div>\n </nav>\n );\n}\n","/**\n * `<TableToolbar>` — search input + filters + bulk-action bar slot.\n *\n * The bulk-action bar appears only when `selectedCount > 0`. ResourceIndex\n * passes `bulkActions` rendered as a row of buttons; the toolbar just\n * positions them.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface TableToolbarProps {\n search?: ReactNode;\n filters?: ReactNode;\n selectedCount?: number;\n bulkActions?: ReactNode;\n onClearSelection?: (() => void) | undefined;\n className?: string;\n}\n\nexport function TableToolbar({\n search,\n filters,\n selectedCount = 0,\n bulkActions,\n onClearSelection,\n className,\n}: TableToolbarProps) {\n const t = useArqelTranslations();\n return (\n <div className={cn('flex flex-col gap-3 px-3 py-3', className)}>\n <div className=\"flex flex-wrap items-end gap-2\">\n {search}\n {filters}\n </div>\n {selectedCount > 0 && (\n <section\n className=\"flex flex-wrap items-center gap-2 rounded-sm border border-border bg-muted px-3 py-2\"\n aria-label={t('table.bulk.label', 'Bulk actions')}\n >\n <span className=\"text-sm font-medium\">\n {t('table.bulk.selected', '{one} :count selected|{other} :count selected', {\n count: selectedCount,\n })}\n </span>\n <div className=\"ml-auto flex flex-wrap items-center gap-2\">\n {bulkActions}\n {onClearSelection && (\n <button\n type=\"button\"\n className=\"text-sm text-muted-foreground hover:underline\"\n onClick={onClearSelection}\n >\n {t('table.bulk.clear', 'Clear')}\n </button>\n )}\n </div>\n </section>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utility/Breadcrumbs.tsx","../src/utility/EmptyState.tsx","../src/utility/ErrorState.tsx","../src/utility/LoadingSkeleton.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"chunk-SK6H7ARE.js","sourcesContent":["/**\n * `<Breadcrumbs>` — renders the panel's breadcrumb trail.\n *\n * Items can be passed explicitly, or auto-resolved from Inertia shared\n * props (`panel.breadcrumbs`, populated server-side by\n * `Arqel\\Nav\\BreadcrumbsBuilder`). Each item is a link unless it's the\n * last entry, which is rendered as plain text and marked\n * `aria-current=\"page\"`.\n *\n * `usePage()` is only invoked when `items` is omitted — explicit-items\n * usage works outside Inertia (e.g. dashboard widgets, tests).\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport { usePage } from '@inertiajs/react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface BreadcrumbItem {\n label: string;\n url?: string | null;\n}\n\nexport interface BreadcrumbsProps {\n items?: BreadcrumbItem[];\n separator?: ReactNode;\n className?: string;\n}\n\ninterface PanelWithCrumbs {\n panel?: { breadcrumbs?: BreadcrumbItem[] } | null;\n}\n\nexport function Breadcrumbs(props: BreadcrumbsProps) {\n if (props.items === undefined) {\n return <SharedBreadcrumbs {...props} />;\n }\n return <BreadcrumbsList {...props} items={props.items} />;\n}\n\nfunction SharedBreadcrumbs(props: BreadcrumbsProps) {\n const page = usePage();\n const items = (page.props as unknown as PanelWithCrumbs).panel?.breadcrumbs ?? [];\n return <BreadcrumbsList {...props} items={items} />;\n}\n\nfunction BreadcrumbsList({\n items,\n separator = <span aria-hidden=\"true\">/</span>,\n className,\n}: BreadcrumbsProps & { items: BreadcrumbItem[] }) {\n const t = useArqelTranslations();\n if (items.length === 0) return null;\n\n return (\n <nav aria-label={t('arqel.aria.breadcrumb', 'Breadcrumb')} className={cn('text-sm', className)}>\n <ol className=\"flex flex-wrap items-center gap-2 text-muted-foreground\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n return (\n <li key={`${item.label}-${item.url ?? 'leaf'}`} className=\"flex items-center gap-2\">\n {isLast || !item.url ? (\n <span aria-current={isLast ? 'page' : undefined} className=\"text-foreground\">\n {item.label}\n </span>\n ) : (\n <a href={item.url} className=\"hover:underline\">\n {item.label}\n </a>\n )}\n {!isLast && separator}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","/**\n * `<EmptyState>` — standardised empty-state block.\n *\n * Used by DataTable's empty slot and as a stand-alone fallback when\n * a resource collection has zero records.\n */\n\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface EmptyStateProps {\n title: ReactNode;\n description?: ReactNode;\n icon?: ReactNode;\n action?: ReactNode;\n className?: string;\n}\n\nexport function EmptyState({ title, description, icon, action, className }: EmptyStateProps) {\n return (\n <div\n className={cn(\n 'flex flex-col items-center gap-3 px-4 py-12 text-center text-muted-foreground',\n className,\n )}\n >\n {icon && <div className=\"text-3xl\">{icon}</div>}\n <h2 className=\"text-base font-semibold text-foreground\">{title}</h2>\n {description && <p className=\"max-w-md text-sm\">{description}</p>}\n {action && <div className=\"mt-2\">{action}</div>}\n </div>\n );\n}\n","/**\n * `<ErrorState>` — generic error block (404 / 403 / 500).\n *\n * Phase 1 ships a plain layout; richer illustrations / Heroicons land\n * with `@arqel-dev/fields` icon registry.\n */\n\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface ErrorStateProps {\n status?: number;\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n className?: string;\n}\n\nexport function ErrorState({ status, title, description, action, className }: ErrorStateProps) {\n return (\n <div\n role=\"alert\"\n className={cn('flex flex-col items-center gap-3 px-4 py-16 text-center', className)}\n >\n {status && <span className=\"text-sm font-mono text-muted-foreground\">{status}</span>}\n <h1 className=\"text-2xl font-semibold tracking-tight\">{title}</h1>\n {description && <p className=\"max-w-md text-sm text-muted-foreground\">{description}</p>}\n {action && <div className=\"mt-2\">{action}</div>}\n </div>\n );\n}\n","/**\n * `<LoadingSkeleton>` — animated placeholder block.\n *\n * Variants:\n * - `line`: single text line (default)\n * - `block`: rectangular block (cards, hero areas)\n * - `circle`: circular (avatars)\n *\n * Heights / widths default to readable values; override via Tailwind\n * classes or explicit `height` / `width` props for bespoke layouts.\n */\n\nimport { cn } from '../utils/cn.js';\n\nexport type SkeletonVariant = 'line' | 'block' | 'circle';\n\nexport interface LoadingSkeletonProps {\n variant?: SkeletonVariant;\n width?: number | string;\n height?: number | string;\n count?: number;\n className?: string;\n}\n\nconst VARIANT_CLASSES: Record<SkeletonVariant, string> = {\n line: 'h-4 w-full',\n block: 'h-24 w-full',\n circle: 'h-10 w-10 rounded-full',\n};\n\nexport function LoadingSkeleton({\n variant = 'line',\n width,\n height,\n count = 1,\n className,\n}: LoadingSkeletonProps) {\n const items = Array.from({ length: count }, (_, i) => i);\n return (\n <div className=\"flex flex-col gap-2\" aria-hidden=\"true\">\n {items.map((i) => (\n <div\n key={i}\n style={{ width, height }}\n className={cn(\n 'animate-pulse bg-muted',\n variant !== 'circle' && 'rounded-sm',\n VARIANT_CLASSES[variant],\n className,\n )}\n />\n ))}\n </div>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shadcn/ui/dialog.tsx","../src/action/ActionFormModal.tsx","../src/action/ConfirmDialog.tsx","../src/action/ActionButton.tsx","../src/action/ActionMenu.tsx"],"names":["DialogPrimitive","jsx","jsxs","useArqelTranslations","useState","Fragment"],"mappings":"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","file":"chunk-SLLTFOOS.js","sourcesContent":["import * as React from \"react\"\nimport { XIcon } from \"lucide-react\"\nimport { Dialog as DialogPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/utils/cn\"\nimport { Button } from \"@/shadcn/ui/button\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n >\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogPrimitive.Close>\n )}\n </div>\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-lg leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","/**\n * `<ActionFormModal>` — modal hosting a `<FormRenderer>` for an Action's\n * companion form (see `arqel-dev/actions` `HasForm`).\n *\n * Action form fields are a flat list — Action FormSchema is built\n * inline from the `ActionFormField[]` since layout components don't\n * apply at this scale. Submit fires `onSubmit(values)`; the parent\n * (typically `useAction`) handles invocation + loading.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { ActionSchema, ModalSize } from '@arqel-dev/types/actions';\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport type { FormSchema } from '@arqel-dev/types/forms';\nimport { useMemo, useState } from 'react';\nimport { FormActions } from '../form/FormActions.js';\nimport { FormRenderer } from '../form/FormRenderer.js';\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from '../shadcn/ui/dialog.js';\nimport { cn } from '../utils/cn.js';\nimport { Button } from './Button.js';\n\nexport interface ActionFormModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n action: ActionSchema;\n fields: FieldSchema[];\n onSubmit: (values: Record<string, unknown>) => void;\n processing?: boolean;\n errors?: Record<string, string[]> | undefined;\n initialValues?: Record<string, unknown>;\n}\n\nconst SIZE_CLASSES: Record<ModalSize, string> = {\n sm: 'sm:max-w-[24rem]',\n md: 'sm:max-w-[32rem]',\n lg: 'sm:max-w-[44rem]',\n xl: 'sm:max-w-[56rem]',\n full: 'sm:max-w-[90vw] h-[90vh]',\n};\n\nexport function ActionFormModal({\n open,\n onOpenChange,\n action,\n fields,\n onSubmit,\n processing = false,\n errors = {},\n initialValues = {},\n}: ActionFormModalProps) {\n const t = useArqelTranslations();\n const [values, setValues] = useState<Record<string, unknown>>(initialValues);\n const size = action.modalSize ?? 'md';\n\n const schema: FormSchema = useMemo(\n () => ({\n schema: (action.form ?? []).map((entry) => ({\n kind: 'field' as const,\n name: entry.name,\n type: entry.type,\n })),\n columns: 1,\n model: null,\n inline: false,\n disabled: false,\n }),\n [action.form],\n );\n\n return (\n <Dialog open={open} onOpenChange={(next) => onOpenChange(next)}>\n <DialogContent className={cn('overflow-auto', SIZE_CLASSES[size])}>\n <DialogHeader>\n <DialogTitle>{action.label}</DialogTitle>\n </DialogHeader>\n <form\n className=\"flex flex-col gap-4\"\n onSubmit={(e) => {\n e.preventDefault();\n onSubmit(values);\n }}\n >\n <FormRenderer\n schema={schema}\n fields={fields}\n values={values}\n errors={errors}\n onChange={(name, value) => setValues((prev) => ({ ...prev, [name]: value }))}\n disabled={processing}\n />\n <FormActions\n processing={processing}\n submitLabel={action.label}\n extra={\n <DialogClose asChild>\n <Button type=\"button\" variant=\"ghost\" disabled={processing}>\n {t('form.cancel', 'Cancel')}\n </Button>\n </DialogClose>\n }\n />\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","/**\n * `<ConfirmDialog>` — confirmation modal driven by the shadcn (Radix) Dialog.\n *\n * Phase 1 supports the canonical `ConfirmationConfig`:\n * - heading / description\n * - color (destructive | warning | info) — drives submit button variant\n * - submit / cancel labels\n * - \"type to confirm\" via `requiresText` (submit stays disabled until\n * the typed value matches exactly)\n *\n * Keyboard: Escape cancels (Radix built-in dismiss); Enter inside the\n * type-to-confirm input fires confirm when the value matches.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { ConfirmationConfig } from '@arqel-dev/types/actions';\nimport { useEffect, useState } from 'react';\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '../shadcn/ui/dialog.js';\nimport { Button, type ButtonProps } from './Button.js';\n\nexport interface ConfirmDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n config?: ConfirmationConfig | undefined;\n onConfirm: () => void;\n processing?: boolean;\n}\n\nconst COLOR_VARIANT: Record<NonNullable<ConfirmationConfig['color']>, ButtonProps['variant']> = {\n destructive: 'destructive',\n warning: 'default',\n info: 'default',\n};\n\nexport function ConfirmDialog({\n open,\n onOpenChange,\n config,\n onConfirm,\n processing = false,\n}: ConfirmDialogProps) {\n const t = useArqelTranslations();\n const [typed, setTyped] = useState('');\n\n useEffect(() => {\n if (!open) setTyped('');\n }, [open]);\n\n const requiresText = config?.requiresText;\n const submitDisabled = processing || (requiresText !== undefined && typed !== requiresText);\n const variant = COLOR_VARIANT[config?.color ?? 'destructive'];\n // Precedence: explicit config > shared translation > English fallback.\n const submitLabel =\n config?.submitLabel ??\n (config?.color === 'info'\n ? t('arqel.actions.confirm', 'Confirm')\n : t('arqel.actions.delete', 'Delete'));\n const cancelLabel = config?.cancelLabel ?? t('arqel.actions.cancel', 'Cancel');\n\n return (\n <Dialog open={open} onOpenChange={(next) => onOpenChange(next)}>\n <DialogContent className=\"sm:max-w-[28rem]\" showCloseButton={false}>\n <DialogHeader>\n <DialogTitle>\n {config?.heading ?? t('arqel.messages.delete_confirm', 'Are you sure?')}\n </DialogTitle>\n {config?.description && <DialogDescription>{config.description}</DialogDescription>}\n </DialogHeader>\n {requiresText !== undefined && (\n <label className=\"flex flex-col gap-1 text-xs text-muted-foreground\">\n <span>\n {(() => {\n // Render the required value as inline <code> while keeping the\n // surrounding prompt translatable: split the localized string on\n // its :value placeholder and splice the <code> element in.\n const [before, after] = t(\n 'arqel.messages.type_to_confirm',\n 'Type :value to confirm',\n ).split(':value');\n return (\n <>\n {before}\n <code className=\"font-mono text-foreground\">{requiresText}</code>\n {after}\n </>\n );\n })()}\n </span>\n <input\n type=\"text\"\n ref={(el) => el?.focus()}\n value={typed}\n onChange={(e) => setTyped(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !submitDisabled) {\n e.preventDefault();\n onConfirm();\n }\n }}\n className=\"h-9 rounded-md border border-input bg-background px-3 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n </label>\n )}\n <DialogFooter>\n <DialogClose asChild>\n <Button type=\"button\" variant=\"ghost\" disabled={processing}>\n {cancelLabel}\n </Button>\n </DialogClose>\n <Button type=\"button\" variant={variant} disabled={submitDisabled} onClick={onConfirm}>\n {processing ? t('form.saving', 'Working…') : submitLabel}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","/**\n * `<ActionButton>` — renders an `ActionSchema` as a button.\n *\n * Behaviour matrix:\n * - `requiresConfirmation` only → opens ConfirmDialog\n * - `form` only → opens ActionFormModal\n * - both → ConfirmDialog first, then form\n * - neither → fires `onInvoke` immediately\n *\n * `onInvoke` receives optional form data so parents (typically using\n * `useAction()` from @arqel-dev/hooks) can dispatch the underlying request.\n */\n\nimport type { ActionColor, ActionSchema, ActionVariant } from '@arqel-dev/types/actions';\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport { useState } from 'react';\nimport { ActionFormModal } from './ActionFormModal.js';\nimport { Button, type ButtonProps } from './Button.js';\nimport { ConfirmDialog } from './ConfirmDialog.js';\n\nexport interface ActionButtonProps {\n action: ActionSchema;\n /**\n * Field schemas for the form modal (resolved server-side from\n * `Action::form` via `FieldSchemaSerializer`). Optional override — when\n * omitted the component reads `action.formFields`, the canonical payload\n * shipped by `Action::toArray()` (#213).\n */\n formFields?: FieldSchema[] | undefined;\n onInvoke: (formValues?: Record<string, unknown>) => void;\n processing?: boolean;\n errors?: Record<string, string[]>;\n size?: ButtonProps['size'];\n className?: string;\n}\n\nconst COLOR_TO_VARIANT: Record<ActionColor, ButtonProps['variant']> = {\n primary: 'default',\n secondary: 'outline',\n destructive: 'destructive',\n success: 'default',\n warning: 'default',\n info: 'default',\n};\n\nconst VARIANT_OVERRIDE: Partial<Record<ActionVariant, ButtonProps['variant']>> = {\n default: 'default',\n outline: 'outline',\n ghost: 'ghost',\n destructive: 'destructive',\n};\n\nexport function ActionButton({\n action,\n formFields,\n onInvoke,\n processing = false,\n errors,\n size = 'default',\n className,\n}: ActionButtonProps) {\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [formOpen, setFormOpen] = useState(false);\n\n // Prefer an explicit prop; otherwise read the schema shipped by\n // `Action::toArray()` so the modal renders real inputs (#213).\n const resolvedFormFields = formFields ?? action.formFields ?? [];\n\n const variant: ButtonProps['variant'] =\n VARIANT_OVERRIDE[action.variant] ?? COLOR_TO_VARIANT[action.color];\n\n const handleClick = () => {\n if (action.disabled) return;\n if (action.requiresConfirmation) {\n setConfirmOpen(true);\n } else if (action.form && action.form.length > 0) {\n setFormOpen(true);\n } else {\n onInvoke();\n }\n };\n\n const handleConfirm = () => {\n setConfirmOpen(false);\n if (action.form && action.form.length > 0) {\n setFormOpen(true);\n } else {\n onInvoke();\n }\n };\n\n const handleFormSubmit = (values: Record<string, unknown>) => {\n onInvoke(values);\n setFormOpen(false);\n };\n\n return (\n <>\n <Button\n variant={variant}\n size={size}\n disabled={action.disabled === true || processing}\n title={action.tooltip}\n onClick={handleClick}\n className={className}\n >\n {action.label}\n </Button>\n {action.requiresConfirmation && (\n <ConfirmDialog\n open={confirmOpen}\n onOpenChange={setConfirmOpen}\n config={action.confirmation}\n onConfirm={handleConfirm}\n processing={processing}\n />\n )}\n {action.form && action.form.length > 0 && (\n <ActionFormModal\n open={formOpen}\n onOpenChange={setFormOpen}\n action={action}\n fields={resolvedFormFields}\n onSubmit={handleFormSubmit}\n processing={processing}\n errors={errors}\n />\n )}\n </>\n );\n}\n","/**\n * `<ActionMenu>` — renders a list of actions inline (≤ `inlineThreshold`)\n * or collapses them into a shadcn (Radix) dropdown menu when the list grows.\n *\n * Each menu item delegates to `<ActionButton>` so confirmation /\n * form-modal behaviour is consistent across surfaces. The dropdown\n * trigger is rendered as a ghost icon button by default; callers can\n * supply a custom `trigger` slot.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { ActionSchema } from '@arqel-dev/types/actions';\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport { type ReactNode, useState } from 'react';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../shadcn/ui/dropdown-menu.js';\nimport { Sheet, SheetContent, SheetHeader, SheetTitle } from '../shadcn/ui/sheet.js';\nimport { cn } from '../utils/cn.js';\nimport { ActionButton } from './ActionButton.js';\nimport { ActionFormModal } from './ActionFormModal.js';\nimport { Button } from './Button.js';\nimport { ConfirmDialog } from './ConfirmDialog.js';\n\n/** Does this action need a gate (confirm/form) before invoking? */\nfunction actionHasForm(action: ActionSchema): boolean {\n return Array.isArray(action.form) && action.form.length > 0;\n}\n\nexport interface ActionMenuProps {\n actions: ActionSchema[];\n /**\n * Optional per-action override map keyed by action name. When an action\n * is absent here, `<ActionButton>` falls back to the action's own\n * `formFields` payload shipped by `Action::toArray()` (#213).\n */\n formFieldsByAction?: Record<string, FieldSchema[]>;\n onInvoke: (action: ActionSchema, formValues?: Record<string, unknown>) => void;\n inlineThreshold?: number;\n processing?: boolean;\n trigger?: ReactNode;\n className?: string;\n}\n\nexport function ActionMenu({\n actions,\n formFieldsByAction = {},\n onInvoke,\n inlineThreshold = 3,\n processing = false,\n trigger,\n className,\n}: ActionMenuProps) {\n const t = useArqelTranslations();\n // Which dropdown action (if any) is currently driving a confirm dialog /\n // form modal. The modals are mounted as siblings of the menu so they\n // survive the menu closing on `onSelect`.\n const [confirmAction, setConfirmAction] = useState<ActionSchema | null>(null);\n const [formAction, setFormAction] = useState<ActionSchema | null>(null);\n // The mobile bottom-sheet is controlled so selecting an item can close it\n // (mirroring the Dropdown's onSelect auto-close).\n const [sheetOpen, setSheetOpen] = useState(false);\n\n if (actions.length === 0) return null;\n\n if (actions.length <= inlineThreshold) {\n return (\n <div className={cn('flex flex-wrap items-center gap-1', className)}>\n {actions.map((action) => (\n <ActionButton\n key={action.name}\n action={action}\n formFields={formFieldsByAction[action.name]}\n onInvoke={(values) => onInvoke(action, values)}\n processing={processing}\n size=\"sm\"\n // 44px touch target on mobile (WCAG 2.5.5); dense 32px on >=md.\n className=\"h-11 md:h-8\"\n />\n ))}\n </div>\n );\n }\n\n const handleSelect = (action: ActionSchema) => {\n if (action.disabled) return;\n // Mirror ActionButton's gating: confirmation first, then form, else\n // invoke directly. The modals open as siblings of the (now closing)\n // menu so destructive/form actions never fire without a gate (#229,\n // #231).\n if (action.requiresConfirmation) {\n setConfirmAction(action);\n } else if (actionHasForm(action)) {\n setFormAction(action);\n } else {\n onInvoke(action);\n }\n };\n\n const handleConfirm = () => {\n const action = confirmAction;\n setConfirmAction(null);\n if (!action) return;\n if (actionHasForm(action)) {\n setFormAction(action);\n } else {\n onInvoke(action);\n }\n };\n\n // One visual trigger shared by both presentation surfaces. The Dropdown\n // wraps it via DropdownMenuTrigger (asChild); the Sheet opens it on click.\n const triggerNode = trigger ?? (\n <Button variant=\"ghost\" size=\"icon-touch\" aria-label={t('arqel.actions.menu', 'Actions')}>\n ⋯\n </Button>\n );\n\n return (\n <>\n {/* Desktop (>=md): the Radix dropdown popper, unchanged. */}\n <div data-arqel-action-dropdown=\"\" className=\"hidden md:contents\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>{triggerNode}</DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n sideOffset={6}\n className={cn('min-w-[12rem]', className)}\n >\n {actions.map((action) => (\n <DropdownMenuItem\n key={action.name}\n disabled={action.disabled === true}\n variant={action.color === 'destructive' ? 'destructive' : 'default'}\n onSelect={() => handleSelect(action)}\n >\n {action.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Mobile (<md): a full-width bottom sheet with >=44px items. */}\n <div className=\"md:hidden\">\n <Sheet open={sheetOpen} onOpenChange={setSheetOpen}>\n <button\n type=\"button\"\n aria-label={t('arqel.actions.menu', 'Actions')}\n className=\"inline-flex size-11 items-center justify-center rounded-md text-lg hover:bg-accent\"\n onClick={() => setSheetOpen(true)}\n >\n ⋯\n </button>\n <SheetContent\n side=\"bottom\"\n className=\"max-h-[80vh] gap-0 overflow-y-auto pb-[env(safe-area-inset-bottom)]\"\n >\n <SheetHeader className=\"px-4 pt-4 pb-2\">\n <SheetTitle>{t('arqel.actions.menu', 'Actions')}</SheetTitle>\n </SheetHeader>\n <div className=\"flex flex-col px-2 pb-2\">\n {actions.map((action) => (\n <button\n key={action.name}\n type=\"button\"\n data-arqel-sheet-action=\"\"\n disabled={action.disabled === true}\n className={cn(\n 'flex min-h-11 w-full items-center rounded-md px-3 text-left text-sm hover:bg-accent disabled:pointer-events-none disabled:opacity-50',\n action.color === 'destructive' && 'text-destructive',\n )}\n onClick={() => {\n setSheetOpen(false);\n handleSelect(action);\n }}\n >\n {action.label}\n </button>\n ))}\n </div>\n </SheetContent>\n </Sheet>\n </div>\n\n {confirmAction && (\n <ConfirmDialog\n open\n onOpenChange={(next) => {\n if (!next) setConfirmAction(null);\n }}\n config={confirmAction.confirmation}\n onConfirm={handleConfirm}\n processing={processing}\n />\n )}\n {formAction && (\n <ActionFormModal\n open\n onOpenChange={(next) => {\n if (!next) setFormAction(null);\n }}\n action={formAction}\n fields={formFieldsByAction[formAction.name] ?? formAction.formFields ?? []}\n onSubmit={(values) => {\n const action = formAction;\n setFormAction(null);\n onInvoke(action, values);\n }}\n processing={processing}\n />\n )}\n </>\n );\n}\n"]}
|
package/dist/chunk-YQ6KXR3U.js
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { PageHeader } from './chunk-MXUXMHOK.js';
|
|
2
|
-
import { FormActions } from './chunk-MZMYV43C.js';
|
|
3
|
-
import { FormRenderer } from './chunk-CMNZLA32.js';
|
|
4
|
-
import { useArqelForm } from '@arqel-dev/hooks';
|
|
5
|
-
import { useArqelTranslations } from '@arqel-dev/react/utils';
|
|
6
|
-
import { usePage, router } from '@inertiajs/react';
|
|
7
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
8
|
-
|
|
9
|
-
var FALLBACK_SCHEMA = {
|
|
10
|
-
schema: [],
|
|
11
|
-
columns: 1,
|
|
12
|
-
model: null,
|
|
13
|
-
inline: false,
|
|
14
|
-
disabled: false
|
|
15
|
-
};
|
|
16
|
-
function ArqelEditPage() {
|
|
17
|
-
const page = usePage();
|
|
18
|
-
const t = useArqelTranslations();
|
|
19
|
-
const props = page.props;
|
|
20
|
-
const fields = props.fields ?? [];
|
|
21
|
-
const record = props.record;
|
|
22
|
-
const schema = props.form ?? FALLBACK_SCHEMA;
|
|
23
|
-
const form = useArqelForm({ fields, record });
|
|
24
|
-
const submit = (e) => {
|
|
25
|
-
e.preventDefault();
|
|
26
|
-
const id = String(record?.id ?? "");
|
|
27
|
-
const slug = props.resource?.slug ?? "";
|
|
28
|
-
const basePath = props.resource?.panelPath ?? "/admin";
|
|
29
|
-
router.put(`${basePath}/${slug}/${id}`, form.data, {
|
|
30
|
-
preserveScroll: true
|
|
31
|
-
});
|
|
32
|
-
};
|
|
33
|
-
const label = props.resource?.label ?? t("arqel.pages.fallback", "record");
|
|
34
|
-
const editTitle = props.recordTitle ?? t("arqel.pages.edit", `Edit ${label}`, { label });
|
|
35
|
-
return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
36
|
-
/* @__PURE__ */ jsx(PageHeader, { title: editTitle, description: props.recordSubtitle ?? null }),
|
|
37
|
-
/* @__PURE__ */ jsxs("form", { onSubmit: submit, className: "space-y-6", children: [
|
|
38
|
-
/* @__PURE__ */ jsx(
|
|
39
|
-
FormRenderer,
|
|
40
|
-
{
|
|
41
|
-
schema,
|
|
42
|
-
fields,
|
|
43
|
-
values: form.data,
|
|
44
|
-
onChange: (name, value) => form.setData(name, value),
|
|
45
|
-
errors: form.errors
|
|
46
|
-
}
|
|
47
|
-
),
|
|
48
|
-
/* @__PURE__ */ jsx(FormActions, { processing: form.processing, onCancel: () => window.history.back() })
|
|
49
|
-
] })
|
|
50
|
-
] });
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export { ArqelEditPage };
|
|
54
|
-
//# sourceMappingURL=chunk-YQ6KXR3U.js.map
|
|
55
|
-
//# sourceMappingURL=chunk-YQ6KXR3U.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pages/ArqelEditPage.tsx"],"names":[],"mappings":";;;;;;;;AAkBA,IAAM,eAAA,GAA8B;AAAA,EAClC,QAAQ,EAAC;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AASe,SAAR,aAAA,GAAuF;AAC5F,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,IAAI,oBAAA,EAAqB;AAC/B,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,MAAM,MAAA,GAAU,KAAA,CAAM,MAAA,IAAU,EAAC;AACjC,EAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,EAAA,MAAM,MAAA,GAAU,MAA2C,IAAA,IAAQ,eAAA;AAEnE,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAE5C,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAuB;AACrC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAQ,MAAA,EAAiD,EAAA,IAAM,EAAE,CAAA;AAC5E,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,EAAU,IAAA,IAAQ,EAAA;AACrC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,EAAU,SAAA,IAAa,QAAA;AAC9C,IAAA,MAAA,CAAO,GAAA,CAAI,GAAG,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,EAA+B;AAAA,MAC1E,cAAA,EAAgB;AAAA,KACjB,CAAA;AAAA,EACH,CAAA;AAKA,EAAA,MAAM,QAAQ,KAAA,CAAM,QAAA,EAAU,KAAA,IAAS,CAAA,CAAE,wBAAwB,QAAQ,CAAA;AACzE,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,WAAA,IAAe,CAAA,CAAE,kBAAA,EAAoB,QAAQ,KAAK,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,CAAA;AAEvF,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,cAAW,KAAA,EAAO,SAAA,EAAW,WAAA,EAAa,KAAA,CAAM,kBAAkB,IAAA,EAAM,CAAA;AAAA,oBACzE,IAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,MAAA,EAAQ,WAAU,WAAA,EAChC,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAQ,IAAA,CAAK,IAAA;AAAA,UACb,UAAU,CAAC,IAAA,EAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA,UACnD,QAAQ,IAAA,CAAK;AAAA;AAAA,OACf;AAAA,sBACA,GAAA,CAAC,WAAA,EAAA,EAAY,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,UAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAK,EAAG;AAAA,KAAA,EACnF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"chunk-YQ6KXR3U.js","sourcesContent":["/**\n * Default Inertia page for `arqel::edit`.\n *\n * Same shape as `ArqelCreatePage` but seeds the form with the\n * server-emitted `record`. Submission posts to PUT `/{slug}/{id}`.\n */\n\nimport { useArqelForm } from '@arqel-dev/hooks';\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport type { FormSchema } from '@arqel-dev/types/forms';\nimport type { RecordType, ResourceEditProps } from '@arqel-dev/types/resources';\nimport { router, usePage } from '@inertiajs/react';\nimport type { FormEvent, JSX } from 'react';\nimport { FormActions } from '../form/FormActions.js';\nimport { FormRenderer } from '../form/FormRenderer.js';\nimport { PageHeader } from '../utility/PageHeader.js';\n\nconst FALLBACK_SCHEMA: FormSchema = {\n schema: [],\n columns: 1,\n model: null,\n inline: false,\n disabled: false,\n};\n\ninterface ArqelFormShape {\n data: Record<string, unknown>;\n setData: (name: string, value: unknown) => void;\n errors: Record<string, string[]>;\n processing: boolean;\n}\n\nexport default function ArqelEditPage<TRecord extends RecordType = RecordType>(): JSX.Element {\n const page = usePage();\n const t = useArqelTranslations();\n const props = page.props as unknown as ResourceEditProps<TRecord>;\n const fields = (props.fields ?? []) as FieldSchema[];\n const record = props.record;\n const schema = (props as unknown as { form?: FormSchema }).form ?? FALLBACK_SCHEMA;\n\n const form = useArqelForm({ fields, record }) as unknown as ArqelFormShape;\n\n const submit = (e: FormEvent): void => {\n e.preventDefault();\n const id = String((record as { id?: string | number } | undefined)?.id ?? '');\n const slug = props.resource?.slug ?? '';\n const basePath = props.resource?.panelPath ?? '/admin';\n router.put(`${basePath}/${slug}/${id}`, form.data as Record<string, never>, {\n preserveScroll: true,\n });\n };\n\n // Pre-interpolate the label into the English fallback so the title stays\n // correct even when the `arqel.pages.edit` key is absent from the shared\n // dictionary (the hook does not re-interpolate a raw fallback).\n const label = props.resource?.label ?? t('arqel.pages.fallback', 'record');\n const editTitle = props.recordTitle ?? t('arqel.pages.edit', `Edit ${label}`, { label });\n\n return (\n <div className=\"space-y-6\">\n <PageHeader title={editTitle} description={props.recordSubtitle ?? null} />\n <form onSubmit={submit} className=\"space-y-6\">\n <FormRenderer\n schema={schema}\n fields={fields}\n values={form.data}\n onChange={(name, value) => form.setData(name, value)}\n errors={form.errors}\n />\n <FormActions processing={form.processing} onCancel={() => window.history.back()} />\n </form>\n </div>\n );\n}\n"]}
|