@iris-ui-kit/react 0.2.3 → 0.3.1

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.
Files changed (48) hide show
  1. package/dist/admin.cjs +6 -3
  2. package/dist/admin.cjs.map +1 -1
  3. package/dist/admin.js +1 -1
  4. package/dist/async.cjs +16 -7
  5. package/dist/async.cjs.map +1 -1
  6. package/dist/async.d.cts +7 -6
  7. package/dist/async.d.ts +7 -6
  8. package/dist/async.js +1 -1
  9. package/dist/chunk-3772LKJP.js +942 -0
  10. package/dist/chunk-3772LKJP.js.map +1 -0
  11. package/dist/{chunk-TO7YVSAI.js → chunk-3KYNBLRY.js} +18 -9
  12. package/dist/chunk-3KYNBLRY.js.map +1 -0
  13. package/dist/{chunk-AUA5GBT6.js → chunk-4VPCQ3U4.js} +28 -27
  14. package/dist/chunk-4VPCQ3U4.js.map +1 -0
  15. package/dist/{chunk-V3KHE2WB.js → chunk-QKDOW7FG.js} +15 -9
  16. package/dist/chunk-QKDOW7FG.js.map +1 -0
  17. package/dist/{chunk-KRFZ5KL4.js → chunk-TDVRIHE6.js} +8 -5
  18. package/dist/chunk-TDVRIHE6.js.map +1 -0
  19. package/dist/{chunk-QZJXMCRR.js → chunk-VLWZSOTH.js} +2 -2
  20. package/dist/chunk-VLWZSOTH.js.map +1 -0
  21. package/dist/data.cjs.map +1 -1
  22. package/dist/data.d.cts +2 -2
  23. package/dist/data.d.ts +2 -2
  24. package/dist/data.js +1 -1
  25. package/dist/grid.cjs +1007 -0
  26. package/dist/grid.cjs.map +1 -0
  27. package/dist/grid.d.cts +324 -0
  28. package/dist/grid.d.ts +324 -0
  29. package/dist/grid.js +5 -0
  30. package/dist/grid.js.map +1 -0
  31. package/dist/index.cjs +14296 -2652
  32. package/dist/index.cjs.map +1 -1
  33. package/dist/index.d.cts +1993 -251
  34. package/dist/index.d.ts +1993 -251
  35. package/dist/index.js +13031 -2362
  36. package/dist/index.js.map +1 -1
  37. package/dist/modal-utils.cjs +26 -25
  38. package/dist/modal-utils.cjs.map +1 -1
  39. package/dist/modal-utils.js +1 -1
  40. package/dist/skeletons.cjs +13 -7
  41. package/dist/skeletons.cjs.map +1 -1
  42. package/dist/skeletons.js +1 -1
  43. package/package.json +20 -15
  44. package/dist/chunk-AUA5GBT6.js.map +0 -1
  45. package/dist/chunk-KRFZ5KL4.js.map +0 -1
  46. package/dist/chunk-QZJXMCRR.js.map +0 -1
  47. package/dist/chunk-TO7YVSAI.js.map +0 -1
  48. package/dist/chunk-V3KHE2WB.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/layouts/Stack.tsx","../src/layouts/Container.tsx","../src/primitives/input/Input.tsx","../src/i18n/context.ts","../src/useStore.ts","../src/i18n/useI18n.ts","../src/primitives/password-input/PasswordInput.tsx","../src/primitives/checkbox/Checkbox.tsx","../src/primitives/button/styles.ts","../src/primitives/button/Button.tsx","../src/primitives/form-field/FormField.tsx","../src/primitives/alert/Alert.tsx","../src/primitives/divider/Divider.tsx","../src/skeletons/LoginTemplate.tsx","../src/layouts/SidebarLayout.tsx","../src/layouts/HeaderLayout.tsx","../src/layouts/DashboardGrid.tsx","../src/skeletons/DashboardTemplate.tsx"],"names":["React","IrisStack","jsx","React2","IrisContainer","React3","IrisInput","jsxs","React4","useSyncExternalStore","createI18n","React6","React7","IrisPasswordInput","Fragment","React8","IrisCheckbox","useEffect","Children","isValidElement","cloneElement","composeEventHandlers","React9","IrisFormField","React10","React11","React12","asLen","React13"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,IAAM,SAAA,GAA4C;AAAA,EAChD,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA,EACL,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,WAAA,GAAgD;AAAA,EACpD,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA,EACL,OAAA,EAAS,eAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAEA,SAAS,aAAa,OAAA,EAAkC;AACtD,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,GAAG,OAAO,CAAA,EAAA,CAAA;AAClD,EAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,IAAA,IAAQ,YAAY,IAAA,EAAM;AAC5D,IAAA,OAAO,kBAAkB,OAAO,CAAA,CAAA,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,OAAA;AACT;AAgBO,IAAM,SAAA,GAAkBA,iBAAA,CAAA,UAAA,CAA2C,SAASC,UAAAA,CACjF;AAAA,EACE,SAAA,GAAY,QAAA;AAAA,EACZ,OAAA,GAAU,IAAA;AAAA,EACV,KAAA,GAAQ,SAAA;AAAA,EACR,OAAA,GAAU,OAAA;AAAA,EACV,IAAA,GAAO,KAAA;AAAA,EACP,MAAA,GAAS,KAAA;AAAA,EACT,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GAAA,EACA;AACA,EAAA,uBACEC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,GAAA;AAAA,MACA,iBAAA,EAAgB,EAAA;AAAA,MAChB,2BAAA,EAA2B,SAAA;AAAA,MAC3B,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,SAAS,aAAA,GAAgB,MAAA;AAAA,QAClC,aAAA,EAAe,SAAA;AAAA,QACf,GAAA,EAAK,aAAa,OAAO,CAAA;AAAA,QACzB,UAAA,EAAY,UAAU,KAAK,CAAA;AAAA,QAC3B,cAAA,EAAgB,YAAY,OAAO,CAAA;AAAA,QACnC,QAAA,EAAU,OAAO,MAAA,GAAS,QAAA;AAAA,QAC1B,GAAG;AAAA,OACL;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ,CAAC,CAAA;ACxED,IAAM,SAAA,GAAgE;AAAA,EACpE,EAAA,EAAI,OAAA;AAAA,EACJ,EAAA,EAAI,OAAA;AAAA,EACJ,EAAA,EAAI,QAAA;AAAA,EACJ,EAAA,EAAI,QAAA;AAAA,EACJ,IAAA,EAAM;AACR,CAAA;AAEA,SAAS,gBAAgB,KAAA,EAAsC;AAC7D,EAAA,IAAI,KAAA,KAAU,QAAQ,KAAA,KAAU,IAAA,IAAQ,UAAU,IAAA,IAAQ,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAQ;AAC5F,IAAA,OAAO,UAAU,KAAK,CAAA;AAAA,EACxB;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAe,KAAA,EAAgC;AACtD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,GAAG,KAAK,CAAA,EAAA,CAAA;AAC9C,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,IAAA,IAAQ,UAAU,IAAA,EAAM;AACtD,IAAA,OAAO,sBAAsB,KAAK,CAAA,CAAA,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,KAAA;AACT;AAYO,IAAM,aAAA,GAAsBC,iBAAA,CAAA,UAAA;AAAA,EACjC,SAASC,cAAAA,CACP,EAAE,QAAA,GAAW,MAAM,OAAA,GAAU,IAAA,EAAM,MAAA,GAAS,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,GAAG,IAAA,IACtE,GAAA,EACA;AACA,IAAA,uBACEF,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACE,GAAG,IAAA;AAAA,QACJ,GAAA;AAAA,QACA,qBAAA,EAAoB,EAAA;AAAA,QACpB,+BAAA,EAA+B,QAAA;AAAA,QAC/B,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,MAAA;AAAA,UACP,QAAA,EAAU,gBAAgB,QAAQ,CAAA;AAAA,UAClC,OAAA,EAAS,CAAA,EAAA,EAAK,cAAA,CAAe,OAAO,CAAC,CAAA,CAAA;AAAA,UACrC,GAAI,SAAS,EAAE,iBAAA,EAAmB,QAAQ,eAAA,EAAiB,MAAA,KAAW,EAAC;AAAA,UACvE,GAAG;AAAA,SACL;AAAA,QAEC;AAAA;AAAA,KACH;AAAA,EAEJ;AACF,CAAA;ACvDA,IAAM,QAAA,GAA4F;AAAA,EAChG,IAAI,EAAE,OAAA,EAAS,WAAW,QAAA,EAAU,gCAAA,EAAkC,WAAW,MAAA,EAAO;AAAA,EACxF,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,0DAAA;AAAA,IACT,QAAA,EAAU,gCAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACb;AAAA,EACA,IAAI,EAAE,OAAA,EAAS,YAAY,QAAA,EAAU,gCAAA,EAAkC,WAAW,MAAA;AACpF,CAAA;AAsBO,IAAM,SAAA,GAAkBG,iBAAA,CAAA,UAAA,CAA6C,SAASC,UAAAA,CACnF;AAAA,EACE,IAAA,GAAO,IAAA;AAAA,EACP,IAAA,GAAO,MAAA;AAAA,EACP,OAAA,GAAU,KAAA;AAAA,EACV,eAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUD,2BAAS,KAAK,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,SAAS,IAAI,CAAA;AAEhC,EAAA,MAAM,WAAA,GAAc,OAAA,GAChB,oBAAA,GACA,OAAA,GACE,qBAAA,GACA,oBAAA;AACN,EAAA,MAAM,YAAY,OAAA,GACd,CAAA,UAAA,EAAa,OAAA,GAAU,yDAAA,GAA4D,0DAA0D,CAAA,CAAA,GAC7I,MAAA;AAEJ,EAAA,MAAM,YAAA,GAAoC;AAAA,IACxC,OAAA,EAAS,aAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK,2BAAA;AAAA,IACL,UAAA,EAAY,wBAAA;AAAA,IACZ,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,aAAa,WAAW,CAAA,CAAA;AAAA,IAChC,YAAA,EAAc,4BAAA;AAAA,IACd,MAAA,EAAQ,IAAA,CAAK,QAAA,GAAW,aAAA,GAAgB,MAAA;AAAA,IACxC,OAAA,EAAS,IAAA,CAAK,QAAA,GAAW,GAAA,GAAM,CAAA;AAAA,IAC/B,UAAA,EAAY,gDAAA;AAAA,IACZ,SAAA;AAAA,IACA,SAAS,UAAA,CAAW,OAAA;AAAA,IACpB,WAAW,UAAA,CAAW,SAAA;AAAA,IACtB,UAAU,UAAA,CAAW,QAAA;AAAA,IACrB,GAAG;AAAA,GACL;AAEA,EAAA,MAAM,UAAA,GAAkC;AAAA,IACtC,IAAA,EAAM,CAAA;AAAA,IACN,QAAA,EAAU,CAAA;AAAA,IACV,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,aAAA;AAAA,IACZ,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY,SAAA;AAAA,IACZ,QAAA,EAAU,SAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,uBACEE,eAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,iBAAA,EAAgB,EAAA;AAAA,MAChB,sBAAA,EAAsB,IAAA;AAAA,MACtB,YAAA,EAAY,OAAA,GAAU,SAAA,GAAY,OAAA,GAAU,SAAA,GAAY,MAAA;AAAA,MACxD,KAAA,EAAO,YAAA;AAAA,MAEN,QAAA,EAAA;AAAA,QAAA,MAAA,mBACCL,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,wBAAA,EAAuB,EAAA;AAAA,YACvB,OAAO,EAAE,OAAA,EAAS,eAAe,UAAA,EAAY,QAAA,EAAU,OAAO,mBAAA,EAAoB;AAAA,YAEjF,QAAA,EAAA;AAAA;AAAA,SACH,GACE,IAAA;AAAA,wBACJA,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACE,GAAG,IAAA;AAAA,YACJ,GAAA;AAAA,YACA,IAAA;AAAA,YACA,cAAA,EAAc,UAAU,MAAA,GAAS,MAAA;AAAA,YACjC,kBAAA,EAAkB,eAAA;AAAA,YAClB,KAAA,EAAO,UAAA;AAAA,YACP,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,cAAA,UAAA,CAAW,IAAI,CAAA;AACf,cAAA,OAAA,GAAU,CAAC,CAAA;AAAA,YACb,CAAA;AAAA,YACA,MAAA,EAAQ,CAAC,CAAA,KAAM;AACb,cAAA,UAAA,CAAW,KAAK,CAAA;AAChB,cAAA,MAAA,GAAS,CAAC,CAAA;AAAA,YACZ;AAAA;AAAA,SACF;AAAA,QACC,yBACCA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,wBAAA,EAAuB,EAAA;AAAA,YACvB,OAAO,EAAE,OAAA,EAAS,eAAe,UAAA,EAAY,QAAA,EAAU,OAAO,mBAAA,EAAoB;AAAA,YAEjF,QAAA,EAAA;AAAA;AAAA,SACH,GACE;AAAA;AAAA;AAAA,GACN;AAEJ,CAAC,CAAA;ACjIM,IAAM,WAAA,GAAoBM,gCAA2B,IAAI,CAAA;ACMzD,SAAS,SAAY,KAAA,EAA4B;AACtD,EAAA,OAAOC,2BAAA;AAAA,IACL,KAAA,CAAM,SAAA;AAAA,IACN,KAAA,CAAM,QAAA;AAAA,IACN,KAAA,CAAM;AAAA;AAAA,GACR;AACF;;;ACCA,IAAI,YAAA,GAA4B,IAAA;AAChC,SAAS,WAAA,GAAoB;AAC3B,EAAA,IAAI,YAAA,KAAiB,IAAA,EAAM,YAAA,GAAeC,eAAA,EAAW;AACrD,EAAA,OAAO,YAAA;AACT;AAOO,SAAS,OAAA,GAAyB;AACvC,EAAA,MAAM,GAAA,GAAYC,6BAAW,WAAW,CAAA;AACxC,EAAA,MAAM,IAAA,GAAO,OAAO,WAAA,EAAY;AAChC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAEjC,EAAA,OAAO;AAAA,IACL,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,GAAG,IAAA,CAAK,CAAA;AAAA,IACR,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,cAAc,IAAA,CAAK,YAAA;AAAA,IACnB,oBAAoB,IAAA,CAAK,kBAAA;AAAA,IACzB,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,aAAa,IAAA,CAAK;AAAA,GACpB;AACF;ACzBO,IAAM,iBAAA,GAA0BC,iBAAA,CAAA,UAAA;AAAA,EACrC,SAASC,kBAAAA,CACP,EAAE,UAAA,GAAa,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,QAAA,EAAU,GAAG,IAAA,EAAK,EACjE,GAAA,EACA;AACA,IAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUD,2BAAS,KAAK,CAAA;AAClD,IAAA,MAAM,SAAS,MAAM;AACnB,MAAA,IAAI,YAAY,QAAA,EAAU;AAC1B,MAAA,UAAA,CAAW,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,IACtB,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,6BAChBV,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,iCAAA,EAAgC,EAAA;AAAA,QAChC,cAAY,OAAA,GAAU,CAAA,CAAE,oBAAoB,CAAA,GAAI,EAAE,oBAAoB,CAAA;AAAA,QACtE,cAAA,EAAc,UAAU,MAAA,GAAS,OAAA;AAAA,QACjC,OAAA,EAAS,MAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,UAAA,EAAY,aAAA;AAAA,UACZ,MAAA,EAAQ,MAAA;AAAA,UACR,MAAA,EAAQ,WAAW,aAAA,GAAgB,SAAA;AAAA,UACnC,KAAA,EAAO,mBAAA;AAAA,UACP,OAAA,EAAS,8BAAA;AAAA,UACT,QAAA,EAAU,gCAAA;AAAA,UACV,UAAA,EAAY;AAAA,SACd;AAAA,QAEC,oBAAU,WAAA,GAAO;AAAA;AAAA,KACpB,GACE,IAAA;AAEJ,IAAA,uBACEA,cAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACE,GAAG,IAAA;AAAA,QACJ,GAAA;AAAA,QACA,IAAA,EAAM,UAAU,MAAA,GAAS,UAAA;AAAA,QACzB,QAAA;AAAA,QACA,QAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA,kBACEK,eAAAA,CAAAO,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,UAAA,MAAA;AAAA,UACA;AAAA,SAAA,EACH,CAAA;AAAA,QAEF,0BAAA,EAAyB;AAAA;AAAA,KAC3B;AAAA,EAEJ;AACF,CAAA;AC/DA,IAAM,OAAA,GAA4C;AAAA,EAChD,EAAA,EAAI,MAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AA0BO,IAAM,YAAA,GAAqBC,iBAAA,CAAA,UAAA;AAAA,EAChC,SAASC,aAAAA,CACP;AAAA,IACE,OAAA;AAAA,IACA,cAAA,GAAiB,KAAA;AAAA,IACjB,QAAA;AAAA,IACA,IAAA,GAAO,IAAA;AAAA,IACP,QAAA,GAAW,KAAA;AAAA,IACX,OAAA,GAAU,KAAA;AAAA,IACV,eAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,EACA;AACA,IAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAUD,2BAA4B,cAAc,CAAA;AAC9F,IAAA,MAAM,eAAe,OAAA,KAAY,MAAA;AACjC,IAAA,MAAM,KAAA,GAA2B,eAAgB,OAAA,GAAgC,eAAA;AAEjF,IAAA,MAAM,QAAA,GAAiBA,yBAAgC,IAAI,CAAA;AAC3D,IAAMA,sCAAoB,GAAA,EAAK,MAAM,QAAA,CAAS,OAAA,EAA6B,EAAE,CAAA;AAG7E,IAAMA,4BAAU,MAAM;AACpB,MAAA,MAAM,KAAK,QAAA,CAAS,OAAA;AACpB,MAAA,IAAI,EAAA,EAAI,EAAA,CAAG,aAAA,GAAgB,KAAA,KAAU,eAAA;AAAA,IACvC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAA2C;AAC/D,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,MAAM,IAAA,GAAO,EAAE,MAAA,CAAO,OAAA;AACtB,MAAA,IAAI,CAAC,YAAA,EAAc,kBAAA,CAAmB,IAAI,CAAA;AAC1C,MAAA,QAAA,GAAW,MAAM,CAAC,CAAA;AAAA,IACpB,CAAA;AAEA,IAAA,MAAM,KAAA,GACJ,KAAA,KAAU,eAAA,GAAkB,eAAA,GAAkB,QAAQ,SAAA,GAAY,WAAA;AAEpE,IAAA,MAAM,GAAA,GAAM,QAAQ,IAAI,CAAA;AAExB,IAAA,MAAM,QAAA,GAAgC;AAAA,MACpC,OAAA,EAAS,aAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,QAAA;AAAA,MAChB,KAAA,EAAO,GAAA;AAAA,MACP,MAAA,EAAQ,GAAA;AAAA,MACR,YAAA,EAAc,4BAAA;AAAA,MACd,MAAA,EAAQ,CAAA,UAAA,EAAa,KAAA,KAAU,WAAA,GAAc,uBAAuB,qBAAqB,CAAA,CAAA;AAAA,MACzF,UAAA,EAAY,KAAA,KAAU,WAAA,GAAc,wBAAA,GAA2B,qBAAA;AAAA,MAC/D,KAAA,EAAO,sCAAA;AAAA,MACP,MAAA,EAAQ,WAAW,aAAA,GAAgB,SAAA;AAAA,MACnC,OAAA,EAAS,WAAW,GAAA,GAAM,CAAA;AAAA,MAC1B,UAAA,EAAY,sDAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,MAAM,YAAY,KAAA,KAAU,SAAA,GAAY,QAAA,GAAM,KAAA,KAAU,kBAAkB,QAAA,GAAM,IAAA;AAEhF,IAAA,uBACER,eAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,oBAAA,EAAmB,EAAA;AAAA,QACnB,yBAAA,EAAyB,IAAA;AAAA,QACzB,YAAA,EAAY,KAAA;AAAA,QACZ,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,aAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,GAAA,EAAK,CAAA;AAAA,UACL,MAAA,EAAQ,WAAW,aAAA,GAAgB,SAAA;AAAA,UACnC,UAAA,EAAY,MAAA;AAAA,UACZ,GAAG;AAAA,SACL;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAL,cAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACE,GAAG,IAAA;AAAA,cACJ,GAAA,EAAK,QAAA;AAAA,cACL,IAAA,EAAK,UAAA;AAAA,cACL,SAAS,KAAA,KAAU,IAAA;AAAA,cACnB,QAAA;AAAA,cACA,gBACE,KAAA,KAAU,eAAA,GAAkB,OAAA,GAAU,KAAA,KAAU,YAAY,MAAA,GAAS,OAAA;AAAA,cAEvE,kBAAA,EAAkB,eAAA;AAAA,cAClB,cAAA,EAAc,UAAU,MAAA,GAAS,MAAA;AAAA,cACjC,QAAA,EAAU,YAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU,UAAA;AAAA,gBACV,OAAA,EAAS,CAAA;AAAA,gBACT,KAAA,EAAO,CAAA;AAAA,gBACP,MAAA,EAAQ,CAAA;AAAA,gBACR,aAAA,EAAe;AAAA;AACjB;AAAA,WACF;AAAA,0BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,eAAY,MAAA,EAAO,KAAA,EAAO,UAC7B,QAAA,EAAA,SAAA,EACH,CAAA;AAAA,UACC;AAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AACF,CAAA;;;AChIA,IAAM,QAAA,GAAW,oBAAA;AAEjB,IAAM,GAAA,GAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA0DZ,IAAI,SAAA,GAAY,KAAA;AAET,SAAS,mBAAA,GAA4B;AAC1C,EAAA,IAAI,SAAA,EAAW;AACf,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,IAAI,QAAA,CAAS,cAAA,CAAe,QAAQ,CAAA,EAAG;AACrC,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,EAAA,GAAK,QAAA;AACX,EAAA,KAAA,CAAM,WAAA,GAAc,GAAA;AACpB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAC/B,EAAA,SAAA,GAAY,IAAA;AACd;AC/DA,IAAM,WAAA,GAAgD;AAAA,EACpD,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,+CAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,+CAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,+CAAA;AAAA,IACT,QAAA,EAAU;AAAA;AAEd,CAAA;AAEA,IAAM,cAAA,GAAsD;AAAA,EAC1D,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,qBAAA;AAAA,IACZ,KAAA,EAAO,gCAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,aAAA;AAAA,IACZ,KAAA,EAAO,qBAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,aAAA;AAAA,IACZ,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,UAAA,EAAY,aAAA;AAAA,IACZ,KAAA,EAAO,qBAAA;AAAA,IACP,MAAA,EAAQ,uBAAA;AAAA,IACR,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,UAAA,EAAY,oBAAA;AAAA,IACZ,KAAA,EAAO,+BAAA;AAAA,IACP,MAAA,EAAQ;AAAA;AAEZ,CAAA;AAEA,SAAS,gBAAA,CAAiB,SAA4B,IAAA,EAAqC;AACzF,EAAA,MAAM,IAAA,GAAiB,EAAE,GAAG,WAAA,CAAY,IAAI,CAAA,EAAG,GAAG,cAAA,CAAe,OAAO,CAAA,EAAE;AAC1E,EAAA,IAAI,OAAA,KAAY,MAAA,EAAQ,IAAA,CAAK,OAAA,GAAU,GAAA;AACvC,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,OAAA,GAAU;AACjB,EAAA,uBACEK,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,SAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,aAAA,EAAY,MAAA,EAC/E,QAAA,EAAA;AAAA,oBAAAL,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,MAAA,EAAO,cAAA,EAAe,aAAA,EAAc,MAAA,EAAO,aAAY,GAAA,EAAI,CAAA;AAAA,oBAC1FA,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAE,0BAAA;AAAA,QACF,MAAA,EAAO,cAAA;AAAA,QACP,WAAA,EAAY,GAAA;AAAA,QACZ,aAAA,EAAc;AAAA;AAAA;AAChB,GAAA,EACF,CAAA;AAEJ;AAyCO,SAAS,UAAA,CAAW;AAAA,EACzB,OAAA,GAAU,OAAA;AAAA,EACV,IAAA,GAAO,IAAA;AAAA,EACP,QAAA,GAAW,KAAA;AAAA,EACX,OAAA,GAAU,KAAA;AAAA,EACV,IAAA,GAAO,QAAA;AAAA,EACP,OAAA,GAAU,KAAA;AAAA,EACV,OAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAoB;AAClB,EAAAe,iBAAU,MAAM;AACd,IAAA,mBAAA,EAAoB;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,CAAC,QAAA,IAAY,CAAC,OAAA;AAEpC,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAwC;AAC3D,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,MAAA;AAAA,IACF;AACA,IAAA,OAAA,GAAU,KAAK,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,SAAA,EAAW,CAAC,aAAA,EAAe,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,IAC9D,0BAAA,EAA4B,OAAA;AAAA,IAC5B,uBAAA,EAAyB,IAAA;AAAA,IACzB,eAAA,EAAiB,WAAY,MAAA,GAAmB,MAAA;AAAA,IAChD,WAAA,EAAa,UAAW,MAAA,GAAmB,MAAA;AAAA,IAC3C,KAAA,EAAO,EAAE,GAAG,gBAAA,CAAiB,OAAA,EAAS,IAAI,CAAA,EAAG,GAAI,KAAA,IAAS,EAAC;AAAG,GAChE;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,IAAA,GAAOC,eAAA,CAAS,IAAA,CAAK,QAAQ,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,IAAQ,CAACC,qBAAA,CAAe,IAAI,CAAA,EAAG;AAClC,MAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAK,aAAa,YAAA,EAAc;AAC5E,QAAA,OAAA,CAAQ,KAAK,sEAAsE,CAAA;AAAA,MACrF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,aAAa,IAAA,CAAK,KAAA;AAKxB,IAAA,OAAOC,oBAAa,IAAA,EAAM;AAAA,MACxB,GAAG,IAAA;AAAA,MACH,GAAG,SAAA;AAAA,MACH,SAAA,EAAW,CAAC,SAAA,CAAU,SAAA,EAAW,UAAA,CAAW,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MAC/E,KAAA,EAAO,EAAE,GAAG,SAAA,CAAU,OAAO,GAAI,UAAA,CAAW,KAAA,IAAS,EAAC,EAAG;AAAA,MACzD,OAAA,EAASC,yBAAA;AAAA,QACP,WAAA;AAAA,QACC,UAAA,CAAW,YAAY,MAAM;AAAA,QAAC,CAAA;AAAA,OACjC;AAAA,MACA,GAAI,aAAA,GAAgB,EAAC,GAAI,EAAE,UAAU,IAAA;AAAK,KAChB,CAAA;AAAA,EAC9B;AAEA,EAAA,uBACEd,eAAAA,CAAC,QAAA,EAAA,EAAQ,GAAG,IAAA,EAAM,IAAA,EAAY,QAAA,EAAU,CAAC,aAAA,EAAe,OAAA,EAAS,WAAA,EAAc,GAAG,SAAA,EAC9E,QAAA,EAAA;AAAA,IAAA,CAAA,OAAA,IAAW,OAAA,qBACXL,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,OAAA,mBAAUA,cAAAA,CAAC,OAAA,EAAA,EAAQ,CAAA,GAAK,OAAA,EAAQ,CAAA;AAAA,IAExE;AAAA,GAAA,EACH,CAAA;AAEJ;AChKO,IAAM,aAAA,GAAsBoB,iBAAA,CAAA,UAAA;AAAA,EACjC,SAASC,cAAAA,CACP,EAAE,KAAA,EAAO,IAAA,EAAM,OAAO,QAAA,GAAW,KAAA,EAAO,QAAA,EAAU,IAAA,GAAO,MAAM,KAAA,EAAO,QAAA,EAAU,GAAG,IAAA,IACnF,GAAA,EACA;AACA,IAAA,MAAM,YAAkBD,iBAAA,CAAA,KAAA,EAAM;AAC9B,IAAA,MAAM,SAAA,GAAY,QAAA,IAAY,CAAA,EAAG,SAAS,CAAA,QAAA,CAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,GAAG,SAAS,CAAA,KAAA,CAAA;AAC3B,IAAA,MAAM,OAAA,GAAU,GAAG,SAAS,CAAA,MAAA,CAAA;AAE5B,IAAA,MAAM,WAAA,GAAoBA,0BAAQ,MAAM;AACtC,MAAA,MAAM,MAAgB,EAAC;AACvB,MAAA,IAAI,IAAA,IAAQ,CAAC,KAAA,EAAO,GAAA,CAAI,KAAK,MAAM,CAAA;AACnC,MAAA,IAAI,KAAA,EAAO,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AAC3B,MAAA,OAAO,IAAI,MAAA,GAAS,CAAA,GAAI,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA;AAAA,IAC1C,GAAG,CAAC,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAC,CAAA;AAEjC,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,MAAM,SAAA,GAAkBA,iBAAA,CAAA,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU,CAAC,KAAA,KAAU;AACxD,MAAA,IAAI,CAAC,QAAA,IAAkBA,iBAAA,CAAA,cAAA,CAAe,KAAK,CAAA,EAAG;AAC5C,QAAA,QAAA,GAAW,IAAA;AACX,QAAA,MAAM,aAAA,GAAiC;AAAA,UACrC,EAAA,EAAI,SAAA;AAAA,UACJ,OAAA,EAAS,QAAQ,IAAA,GAAO,MAAA;AAAA,UACxB,eAAA,EAAiB;AAAA,SACnB;AACA,QAAA,OAAaA,iBAAA,CAAA,YAAA,CAAa,OAAO,aAAqD,CAAA;AAAA,MACxF;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,MAAM,UAAA,GAAkC;AAAA,MACtC,QAAA,EAAU,IAAA,KAAS,IAAA,GAAO,MAAA,GAAS,MAAA;AAAA,MACnC,UAAA,EAAY,GAAA;AAAA,MACZ,KAAA,EAAO,QAAQ,oBAAA,GAAuB,wBAAA;AAAA,MACtC,OAAA,EAAS,aAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,GAAA,EAAK;AAAA,KACP;AAEA,IAAA,uBACEf,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACE,GAAG,IAAA;AAAA,QACJ,GAAA;AAAA,QACA,sBAAA,EAAqB,EAAA;AAAA,QACrB,4BAAA,EAA4B,QAAQ,SAAA,GAAY,OAAA;AAAA,QAChD,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,MAAA;AAAA,UACT,aAAA,EAAe,QAAA;AAAA,UACf,GAAA,EAAK,KAAA;AAAA,UACL,GAAG;AAAA,SACL;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,KAAA,mBACCA,gBAAC,OAAA,EAAA,EAAM,OAAA,EAAS,WAAW,4BAAA,EAA2B,EAAA,EAAG,OAAO,UAAA,EAC7D,QAAA,EAAA;AAAA,YAAA,KAAA;AAAA,YACA,2BACCL,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAY,MAAA;AAAA,gBACZ,+BAAA,EAA8B,EAAA;AAAA,gBAC9B,KAAA,EAAO,EAAE,KAAA,EAAO,oBAAA,EAAqB;AAAA,gBACtC,QAAA,EAAA;AAAA;AAAA,aAED,GACE;AAAA,WAAA,EACN,CAAA,GACE,IAAA;AAAA,UACH,SAAA;AAAA,UACA,IAAA,IAAQ,CAAC,KAAA,mBACRA,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI,MAAA;AAAA,cACJ,2BAAA,EAA0B,EAAA;AAAA,cAC1B,KAAA,EAAO,EAAE,QAAA,EAAU,gCAAA,EAAkC,OAAO,mBAAA,EAAoB;AAAA,cAE/E,QAAA,EAAA;AAAA;AAAA,WACH,GACE,IAAA;AAAA,UACH,wBACCA,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI,OAAA;AAAA,cACJ,4BAAA,EAA2B,EAAA;AAAA,cAC3B,IAAA,EAAK,OAAA;AAAA,cACL,KAAA,EAAO,EAAE,QAAA,EAAU,gCAAA,EAAkC,OAAO,oBAAA,EAAqB;AAAA,cAEhF,QAAA,EAAA;AAAA;AAAA,WACH,GACE;AAAA;AAAA;AAAA,KACN;AAAA,EAEJ;AACF,CAAA;ACtHA,IAAM,WAAA,GAA6C;AAAA,EACjD,IAAA,EAAM,aAAA;AAAA,EACN,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,gBAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAoBO,SAAS,SAAA,CAAU;AAAA,EACxB,IAAA,GAAO,MAAA;AAAA,EACP,KAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,IAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA8C;AAC5C,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAUsB,2BAAS,IAAI,CAAA;AAC3D,EAAMA,4BAAU,MAAM;AACpB,IAAA,IAAI,IAAA,KAAS,MAAA,EAAW,eAAA,CAAgB,IAAI,CAAA;AAAA,EAC9C,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,MAAA,GAAS,IAAA,KAAS,MAAA,GAAY,IAAA,GAAO,YAAA;AAC3C,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,QAAA,GAAW,CAAA,IAAA,EAAO,WAAA,CAAY,IAAI,CAAC,CAAA,CAAA,CAAA;AAEzC,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,IAAA,KAAS,MAAA,EAAW,eAAA,CAAgB,KAAK,CAAA;AAC7C,IAAA,OAAA,IAAU;AAAA,EACZ,CAAA;AAEA,EAAA,uBACEjB,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,IAAA,EAAM,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,YAAY,OAAA,GAAU,QAAA;AAAA,MAC1D,iBAAA,EAAgB,EAAA;AAAA,MAChB,sBAAA,EAAsB,IAAA;AAAA,MACtB,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,GAAA,EAAK,0BAAA;AAAA,QACL,OAAA,EAAS,8BAAA;AAAA,QACT,YAAA,EAAc,4BAAA;AAAA,QACd,MAAA,EAAQ,aAAa,QAAQ,CAAA,CAAA;AAAA;AAAA;AAAA,QAG7B,eAAA,EAAiB,CAAA,IAAA,EAAO,WAAA,CAAY,IAAI,CAAC,CAAA,QAAA,CAAA;AAAA,QACzC,UAAA,EAAY,sBAAsB,QAAQ,CAAA,6BAAA,CAAA;AAAA,QAC1C,KAAA,EAAO,wBAAA;AAAA,QACP,UAAA,EAAY,YAAA;AAAA,QACZ,GAAG;AAAA,OACL;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA,mBACCL,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,sBAAA,EAAqB,EAAA;AAAA,YACrB,OAAO,EAAE,KAAA,EAAO,UAAU,UAAA,EAAY,CAAA,EAAG,SAAS,aAAA,EAAc;AAAA,YAE/D,QAAA,EAAA;AAAA;AAAA,SACH,GACE,IAAA;AAAA,wBACJK,eAAAA,CAAC,KAAA,EAAA,EAAI,sBAAA,EAAqB,EAAA,EAAG,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAG,QAAA,EAAU,CAAA,EAAE,EACxD,QAAA,EAAA;AAAA,UAAA,KAAA,mBACCL,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,uBAAA,EAAsB,EAAA;AAAA,cACtB,OAAO,EAAE,UAAA,EAAY,KAAK,YAAA,EAAc,CAAA,EAAG,OAAO,QAAA,EAAS;AAAA,cAE1D,QAAA,EAAA;AAAA;AAAA,WACH,GACE,IAAA;AAAA,0BACJA,cAAAA,CAAC,KAAA,EAAA,EAAI,yBAAA,EAAwB,IAAI,QAAA,EAAS;AAAA,SAAA,EAC5C,CAAA;AAAA,QACC,2BACCA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,uBAAA,EAAsB,EAAA;AAAA,YACtB,YAAA,EAAY,EAAE,aAAa,CAAA;AAAA,YAC3B,OAAA,EAAS,WAAA;AAAA,YACT,KAAA,EAAO;AAAA,cACL,UAAA,EAAY,aAAA;AAAA,cACZ,MAAA,EAAQ,MAAA;AAAA,cACR,MAAA,EAAQ,SAAA;AAAA,cACR,KAAA,EAAO,mBAAA;AAAA,cACP,QAAA,EAAU,gCAAA;AAAA,cACV,OAAA,EAAS,CAAA;AAAA,cACT,UAAA,EAAY,CAAA;AAAA,cACZ,UAAA,EAAY;AAAA,aACd;AAAA,YACD,QAAA,EAAA;AAAA;AAAA,SAED,GACE;AAAA;AAAA;AAAA,GACN;AAEJ;AClHA,IAAM,WAAA,GAAkD;AAAA,EACtD,EAAA,EAAI,KAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAUO,SAAS,WAAA,CAAY;AAAA,EAC1B,WAAA,GAAc,YAAA;AAAA,EACd,KAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,QAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyC;AACvC,EAAA,MAAM,eAAe,WAAA,KAAgB,YAAA;AACrC,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,IAAS,QAAQ,CAAA;AAE1C,EAAA,IAAI,YAAA,IAAgB,CAAC,QAAA,EAAU;AAC7B,IAAA,uBACEA,cAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACE,GAAG,IAAA;AAAA,QACJ,mBAAA,EAAkB,EAAA;AAAA,QAClB,+BAAA,EAA8B,YAAA;AAAA,QAC9B,KAAA,EAAO;AAAA,UACL,MAAA,EAAQ,MAAA;AAAA,UACR,SAAA,EAAW,8BAAA;AAAA,UACX,MAAA,EAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,CAAC,CAAA,EAAA,CAAA;AAAA,UAC/B,KAAA,EAAO,MAAA;AAAA,UACP,GAAG;AAAA;AACL;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,uBACEA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACE,GAAG,IAAA;AAAA,QACJ,IAAA,EAAK,WAAA;AAAA,QACL,kBAAA,EAAiB,UAAA;AAAA,QACjB,mBAAA,EAAkB,EAAA;AAAA,QAClB,+BAAA,EAA8B,UAAA;AAAA,QAC9B,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,cAAA;AAAA,UACT,KAAA,EAAO,CAAA;AAAA,UACP,SAAA,EAAW,SAAA;AAAA,UACX,UAAA,EAAY,oBAAA;AAAA,UACZ,MAAA,EAAQ,CAAA,EAAA,EAAK,WAAA,CAAY,OAAO,CAAC,CAAA,CAAA;AAAA,UACjC,GAAG;AAAA;AACL;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,uBACEK,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,IAAA,EAAK,WAAA;AAAA,MACL,kBAAA,EAAiB,YAAA;AAAA,MACjB,mBAAA,EAAkB,EAAA;AAAA,MAClB,+BAAA,EAA8B,YAAA;AAAA,MAC9B,6BAAA,EAA4B,MAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,GAAA,EAAK,CAAA;AAAA,QACL,MAAA,EAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,CAAC,CAAA,EAAA,CAAA;AAAA,QAC/B,KAAA,EAAO,mBAAA;AAAA,QACP,QAAA,EAAU,gCAAA;AAAA,QACV,aAAA,EAAe,WAAA;AAAA,QACf,aAAA,EAAe,yCAAA;AAAA,QACf,GAAG;AAAA,OACL;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAL,cAAAA,CAAC,MAAA,EAAA,EAAK,wBAAA,EAAuB,QAAA,EAAS,OAAO,SAAA,EAAW,CAAA;AAAA,wBACxDA,cAAAA,CAAC,MAAA,EAAA,EAAK,yBAAA,EAAwB,EAAA,EAAI,sBAAY,KAAA,EAAM,CAAA;AAAA,wBACpDA,cAAAA,CAAC,MAAA,EAAA,EAAK,wBAAA,EAAuB,OAAA,EAAQ,OAAO,SAAA,EAAW;AAAA;AAAA;AAAA,GACzD;AAEJ;AAEA,IAAM,SAAA,GAAiC;AAAA,EACrC,IAAA,EAAM,CAAA;AAAA,EACN,MAAA,EAAQ,CAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AC5DO,SAAS,iBAAA,CAAkB;AAAA,EAChC,KAAA,GAAQ,SAAA;AAAA,EACR,WAAA,GAAc,EAAA;AAAA,EACd,YAAA,GAAe,IAAA;AAAA,EACf,KAAA,GAAQ,EAAA;AAAA,EACR,WAAA,GAAc,SAAA;AAAA,EACd,OAAA,GAAU,KAAA;AAAA,EACV,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAA+C;AAC7C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUuB,2BAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAUA,2BAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAUA,2BAAS,KAAK,CAAA;AAEpD,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAuB;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,QAAA,GAAW,EAAE,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,uBACEvB,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,0BAAA,EAAyB,EAAA;AAAA,MACzB,SAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,OAAA;AAAA,QACX,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,UAAA,EAAY,wBAAA;AAAA,QACZ,KAAA,EAAO,wBAAA;AAAA,QACP,OAAA,EAAS,EAAA;AAAA,QACT,GAAG;AAAA,OACL;AAAA,MAEA,0BAAAA,cAAAA,CAAC,aAAA,EAAA,EAAc,UAAS,OAAA,EAAQ,OAAA,EAAS,GACvC,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,YAAA;AAAA,UACV,sBAAA,EAAqB,EAAA;AAAA,UACrB,KAAA,EAAO;AAAA,YACL,UAAA,EAAY,qBAAA;AAAA,YACZ,MAAA,EAAQ,8BAAA;AAAA,YACR,YAAA,EAAc,4BAAA;AAAA,YACd,OAAA,EAAS,EAAA;AAAA,YACT,SAAA,EAAW;AAAA,WACb;AAAA,UAEA,QAAA,kBAAAK,eAAAA,CAAC,SAAA,EAAA,EAAU,OAAA,EAAQ,IAAA,EAChB,QAAA,EAAA;AAAA,YAAA,MAAA,oBACCA,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,SAAA,EAAW,UAAS,EAChC,QAAA,EAAA;AAAA,8BAAAL,cAAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,MAAA,EAAQ,WAAA;AAAA,oBACR,QAAA,EAAU,iCAAA;AAAA,oBACV,UAAA,EAAY;AAAA,mBACd;AAAA,kBAEC,QAAA,EAAA;AAAA;AAAA,eACH;AAAA,cACC,8BACCA,cAAAA;AAAA,gBAAC,GAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,MAAA,EAAQ,CAAA;AAAA,oBACR,KAAA,EAAO,mBAAA;AAAA,oBACP,QAAA,EAAU;AAAA,mBACZ;AAAA,kBAEC,QAAA,EAAA;AAAA;AAAA,eACH,GACE;AAAA,aAAA,EACN,CAAA;AAAA,YAED,KAAA,mBAAQA,cAAAA,CAAC,SAAA,EAAA,EAAU,MAAK,QAAA,EAAS,KAAA,EAAO,OAAO,CAAA,GAAK,IAAA;AAAA,4BACrDA,cAAAA,CAAC,aAAA,EAAA,EAAc,OAAM,OAAA,EAAQ,QAAA,EAAQ,MACnC,QAAA,kBAAAA,cAAAA;AAAA,cAAC,SAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,OAAA;AAAA,gBACL,KAAA,EAAO,KAAA;AAAA,gBACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBACxC,WAAA,EAAY,iBAAA;AAAA,gBACZ,QAAA,EAAU,OAAA;AAAA,gBACV,YAAA,EAAa;AAAA;AAAA,aACf,EACF,CAAA;AAAA,4BACAA,cAAAA,CAAC,aAAA,EAAA,EAAc,OAAM,UAAA,EAAW,QAAA,EAAQ,MACtC,QAAA,kBAAAA,cAAAA;AAAA,cAAC,iBAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,QAAA;AAAA,gBACP,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC3C,WAAA,EAAY,qBAAA;AAAA,gBACZ,QAAA,EAAU,OAAA;AAAA,gBACV,YAAA,EAAa;AAAA;AAAA,aACf,EACF,CAAA;AAAA,YACC,+BACCK,eAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO;AAAA,kBACL,OAAA,EAAS,MAAA;AAAA,kBACT,UAAA,EAAY,QAAA;AAAA,kBACZ,cAAA,EAAgB;AAAA,iBAClB;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAL,cAAAA;AAAA,oBAAC,YAAA;AAAA,oBAAA;AAAA,sBACC,OAAA,EAAS,QAAA;AAAA,sBACT,QAAA,EAAU,CAAC,IAAA,KAAS,WAAA,CAAY,IAAI,CAAA;AAAA,sBACpC,QAAA,EAAU,OAAA;AAAA,sBACX,QAAA,EAAA;AAAA;AAAA,mBAED;AAAA,kBACC,MAAA,IAAU;AAAA;AAAA;AAAA,aACb,GACE,IAAA;AAAA,4BACJA,cAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAK,QAAA,EAAS,OAAA,EAAQ,OAAA,EAAQ,OAAA,EAAkB,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,IACzE,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,YACC,MAAA,mBACCK,eAAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAAL,cAAAA,CAAC,WAAA,EAAA,EAAY,OAAA,EAAQ,IAAA,EAAK,OAAM,IAAA,EAAK,CAAA;AAAA,cACpC;AAAA,aAAA,EACH,CAAA,GACE;AAAA,WAAA,EACN;AAAA;AAAA,OACF,EACF;AAAA;AAAA,GACF;AAEJ;AC7IA,SAAS,MAAM,CAAA,EAA4B;AACzC,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA,GAAO,CAAA;AAC5C;AAMO,SAAS,iBAAA,CAAkB;AAAA,EAChC,SAAA,EAAW,aAAA;AAAA,EACX,gBAAA,GAAmB,KAAA;AAAA,EACnB,iBAAA;AAAA,EACA,KAAA,GAAQ,GAAA;AAAA,EACR,cAAA,GAAiB,EAAA;AAAA,EACjB,IAAA,GAAO,MAAA;AAAA,EACP,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA+C;AAC7C,EAAA,MAAM,eAAe,aAAA,KAAkB,MAAA;AACvC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAUwB,2BAAS,gBAAgB,CAAA;AAC/D,EAAA,MAAM,SAAA,GAAY,YAAA,GAAe,OAAA,CAAQ,aAAa,CAAA,GAAI,QAAA;AAE1D,EAAA,MAAM,YAAA,GAAqBA,iBAAA,CAAA,WAAA;AAAA,IACzB,CAAC,IAAA,KAAkB;AACjB,MAAA,IAAI,CAAC,YAAA,EAAc,WAAA,CAAY,IAAI,CAAA;AACnC,MAAA,iBAAA,GAAoB,IAAI,CAAA;AAAA,IAC1B,CAAA;AAAA,IACA,CAAC,cAAc,iBAAiB;AAAA,GAClC;AAEA,EAAA,MAAM,cAAA,GACJ,OAAO,OAAA,KAAY,UAAA,GACd,OAAA,CAAkE;AAAA,IACjE,SAAA;AAAA,IACA;AAAA,GACD,CAAA,GACD,OAAA;AAEN,EAAA,MAAM,YAAA,GAAoC;AAAA,IACxC,OAAO,SAAA,GAAY,KAAA,CAAM,cAAc,CAAA,GAAI,MAAM,KAAK,CAAA;AAAA,IACtD,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY,qBAAA;AAAA,IACZ,WAAA,EAAa,IAAA,KAAS,MAAA,GAAS,8BAAA,GAAiC,MAAA;AAAA,IAChE,UAAA,EAAY,IAAA,KAAS,OAAA,GAAU,8BAAA,GAAiC,MAAA;AAAA,IAChE,UAAA,EAAY,kBAAA;AAAA,IACZ,QAAA,EAAU,QAAA;AAAA,IACV,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe;AAAA,GACjB;AAEA,EAAA,uBACEnB,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,0BAAA,EAAyB,EAAA;AAAA,MACzB,gBAAA,EAAgB,YAAY,EAAA,GAAK,MAAA;AAAA,MACjC,WAAA,EAAW,IAAA;AAAA,MACX,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe,IAAA,KAAS,OAAA,GAAU,aAAA,GAAgB,KAAA;AAAA,QAClD,KAAA,EAAO,MAAA;AAAA,QACP,MAAA,EAAQ,MAAA;AAAA,QACR,SAAA,EAAW,CAAA;AAAA,QACX,KAAA,EAAO,wBAAA;AAAA,QACP,GAAG;AAAA,OACL;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAL,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,eAAA;AAAA,YACL,mBAAA,EAAkB,EAAA;AAAA,YAClB,gBAAA,EAAgB,YAAY,EAAA,GAAK,MAAA;AAAA,YACjC,KAAA,EAAO,YAAA;AAAA,YAEN,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBACAA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,wBAAA,EAAuB,EAAA;AAAA,YACvB,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,CAAA;AAAA,cACN,QAAA,EAAU,CAAA;AAAA,cACV,QAAA,EAAU,MAAA;AAAA,cACV,UAAA,EAAY;AAAA,aACd;AAAA,YAEC;AAAA;AAAA;AACH;AAAA;AAAA,GACF;AAEJ;AChGA,SAASyB,OAAM,CAAA,EAA4B;AACzC,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA,GAAO,CAAA;AAC5C;AAMO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,YAAA,GAAe,MAAA;AAAA,EACf,YAAA,GAAe,MAAA;AAAA,EACf,MAAA,GAAS,IAAA;AAAA,EACT,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA8C;AAC5C,EAAA,uBACEpB,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,yBAAA,EAAwB,EAAA;AAAA,MACxB,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe,QAAA;AAAA,QACf,KAAA,EAAO,MAAA;AAAA,QACP,MAAA,EAAQ,MAAA;AAAA,QACR,SAAA,EAAW,CAAA;AAAA,QACX,UAAA,EAAY,wBAAA;AAAA,QACZ,KAAA,EAAO,wBAAA;AAAA,QACP,GAAG;AAAA,OACL;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,MAAA,mBACCL,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,kBAAA,EAAiB,EAAA;AAAA,YACjB,KAAA,EAAO;AAAA,cACL,UAAA,EAAY,CAAA;AAAA,cACZ,MAAA,EAAQyB,OAAM,YAAY,CAAA;AAAA,cAC1B,YAAA,EAAc,8BAAA;AAAA,cACd,UAAA,EAAY,qBAAA;AAAA,cACZ,QAAA,EAAU,SAAS,QAAA,GAAW,QAAA;AAAA,cAC9B,GAAA,EAAK,CAAA;AAAA,cACL,MAAA,EAAQ;AAAA,aACV;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACH,GACE,IAAA;AAAA,wBACJzB,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,uBAAA,EAAsB,EAAA;AAAA,YACtB,OAAO,EAAE,IAAA,EAAM,GAAG,SAAA,EAAW,CAAA,EAAG,UAAU,MAAA,EAAO;AAAA,YAEhD;AAAA;AAAA,SACH;AAAA,QACC,yBACCA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,aAAA;AAAA,YACL,kBAAA,EAAiB,EAAA;AAAA,YACjB,KAAA,EAAO;AAAA,cACL,UAAA,EAAY,CAAA;AAAA,cACZ,MAAA,EAAQyB,OAAM,YAAY,CAAA;AAAA,cAC1B,SAAA,EAAW,8BAAA;AAAA,cACX,UAAA,EAAY;AAAA,aACd;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACH,GACE;AAAA;AAAA;AAAA,GACN;AAEJ;AC7EO,SAAS,iBAAA,CAAkB;AAAA,EAChC,OAAA,GAAU,EAAA;AAAA,EACV,GAAA,GAAM,EAAA;AAAA,EACN,WAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA+C;AAC7C,EAAA,MAAM,SAAS,OAAO,GAAA,KAAQ,QAAA,GAAW,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA,GAAO,GAAA;AACtD,EAAA,MAAM,mBAAA,GAAsB,WAAA,GACxB,CAAA,yBAAA,EACE,OAAO,WAAA,KAAgB,QAAA,GAAW,CAAA,EAAG,WAAW,CAAA,EAAA,CAAA,GAAO,WACzD,CAAA,OAAA,CAAA,GACA,CAAA,OAAA,EAAU,OAAO,CAAA,MAAA,CAAA;AAErB,EAAA,uBACEzB,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,0BAAA,EAAyB,EAAA;AAAA,MACzB,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,GAAA,EAAK,MAAA;AAAA,QACL,mBAAA;AAAA,QACA,KAAA,EAAO,MAAA;AAAA,QACP,GAAG;AAAA,OACL;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AAYO,SAAS,iBAAA,CAAkB;AAAA,EAChC,OAAA,GAAU,CAAA;AAAA,EACV,OAAA,GAAU,CAAA;AAAA,EACV,OAAA,GAAU,IAAA;AAAA,EACV,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA+C;AAC7C,EAAA,MAAM,UAAA,GAAa,OAAA,KAAY,MAAA,GAAS,QAAA,GAAW,QAAQ,OAAO,CAAA,CAAA;AAClE,EAAA,MAAM,OAAA,GAAU,OAAA,GAAU,CAAA,GAAI,CAAA,KAAA,EAAQ,OAAO,CAAA,CAAA,GAAK,MAAA;AAElD,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,0BAAA,EAAyB,EAAA;AAAA,MACzB,KAAA,EAAO;AAAA,QACL,UAAA;AAAA,QACA,OAAA;AAAA,QACA,UAAA,EAAY,UAAU,qBAAA,GAAwB,aAAA;AAAA,QAC9C,MAAA,EAAQ,UAAU,8BAAA,GAAiC,MAAA;AAAA,QACnD,YAAA,EAAc,4BAAA;AAAA,QACd,OAAA,EAAS,UAAU,8BAAA,GAAiC,CAAA;AAAA,QACpD,QAAA,EAAU,CAAA;AAAA,QACV,GAAG;AAAA,OACL;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;ACtCO,SAAS,qBAAA,CAAsB;AAAA,EACpC,KAAA,GAAQ,WAAA;AAAA,EACR,YAAA,GAAe,EAAA;AAAA,EACf,MAAM,EAAC;AAAA,EACP,QAAA,GAAW,EAAA;AAAA,EACX,gBAAA;AAAA,EACA,QAAQ,EAAC;AAAA,EACT,gBAAA,GAAmB,KAAA;AAAA,EACnB,iBAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAmD;AACjD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAU0B,2BAAS,gBAAgB,CAAA;AAEjE,EAAA,MAAM,eAAA,GAAkB,CAAC,IAAA,KAAkB;AACzC,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,iBAAA,GAAoB,IAAI,CAAA;AAAA,EAC1B,CAAA;AAEA,EAAA,uBACE1B,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,8BAAA,EAA6B,EAAA;AAAA,MAC7B,SAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,MAAA;AAAA,QACP,MAAA,EAAQ,OAAA;AAAA,QACR,UAAA,EAAY,wBAAA;AAAA,QACZ,KAAA,EAAO,wBAAA;AAAA,QACP,GAAG;AAAA,OACL;AAAA,MAEA,QAAA,kBAAAA,cAAAA;AAAA,QAAC,iBAAA;AAAA,QAAA;AAAA,UACC,SAAA;AAAA,UACA,iBAAA,EAAmB,eAAA;AAAA,UACnB,KAAA,EAAO,GAAA;AAAA,UACP,cAAA,EAAgB,EAAA;AAAA,UAChB,OAAA,EAAS,CAAC,KAAA,qBACRK,eAAAA,CAAC,SAAA,EAAA,EAAU,OAAA,EAAQ,IAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,EAAA,EAAG,EAC1C,QAAA,EAAA;AAAA,YAAA,aAAA,GACC,aAAA,CAAc,KAAK,CAAA,GACjB,YAAA,mBACFL,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO;AAAA,kBACL,OAAA,EAAS,UAAA;AAAA,kBACT,QAAA,EAAU,gCAAA;AAAA,kBACV,UAAA,EAAY,GAAA;AAAA,kBACZ,KAAA,EAAO,wBAAA;AAAA,kBACP,OAAA,EAAS,KAAA,CAAM,SAAA,GAAY,CAAA,GAAI,CAAA;AAAA,kBAC/B,UAAA,EAAY,oBAAA;AAAA,kBACZ,UAAA,EAAY,QAAA;AAAA,kBACZ,QAAA,EAAU;AAAA,iBACZ;AAAA,gBAEC,QAAA,EAAA;AAAA;AAAA,aACH,GACE,IAAA;AAAA,4BACJA,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,YAAA,EAAW,SAAA;AAAA,gBACX,KAAA,EAAO;AAAA,kBACL,OAAA,EAAS,MAAA;AAAA,kBACT,aAAA,EAAe,QAAA;AAAA,kBACf,GAAA,EAAK;AAAA,iBACP;AAAA,gBAEC,QAAA,EAAA,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,KAAS;AACjB,kBAAA,MAAM,QAAA,GAAW,KAAK,EAAA,KAAO,QAAA;AAC7B,kBAAA,uBACEK,eAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBAEC,IAAA,EAAK,QAAA;AAAA,sBACL,gCAA8B,IAAA,CAAK,EAAA;AAAA,sBACnC,gCAAA,EAAgC,WAAW,MAAA,GAAS,MAAA;AAAA,sBACpD,OAAA,EAAS,MAAM,gBAAA,GAAmB,IAAA,CAAK,EAAE,CAAA;AAAA,sBACzC,KAAA,EAAO;AAAA,wBACL,OAAA,EAAS,MAAA;AAAA,wBACT,UAAA,EAAY,QAAA;AAAA,wBACZ,GAAA,EAAK,4BAAA;AAAA,wBACL,OAAA,EAAS,UAAA;AAAA,wBACT,UAAA,EAAY,WAAW,qBAAA,GAAwB,aAAA;AAAA,wBAC/C,KAAA,EAAO,WACH,sCAAA,GACA,wBAAA;AAAA,wBACJ,MAAA,EAAQ,MAAA;AAAA,wBACR,YAAA,EAAc,4BAAA;AAAA,wBACd,MAAA,EAAQ,SAAA;AAAA,wBACR,QAAA,EAAU,gCAAA;AAAA,wBACV,UAAA,EAAY,SAAA;AAAA,wBACZ,SAAA,EAAW,OAAA;AAAA,wBACX,OAAA,EAAS;AAAA,uBACX;AAAA,sBAEC,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAK,uBACJL,cAAAA;AAAA,0BAAC,MAAA;AAAA,0BAAA;AAAA,4BACC,aAAA,EAAY,MAAA;AAAA,4BACZ,OAAO,EAAE,KAAA,EAAO,IAAI,OAAA,EAAS,aAAA,EAAe,gBAAgB,QAAA,EAAS;AAAA,4BAEpE,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,yBACR,GACE,IAAA;AAAA,wCACJA,cAAAA;AAAA,0BAAC,MAAA;AAAA,0BAAA;AAAA,4BACC,KAAA,EAAO;AAAA,8BACL,OAAA,EAAS,KAAA,CAAM,SAAA,GAAY,CAAA,GAAI,CAAA;AAAA,8BAC/B,UAAA,EAAY,oBAAA;AAAA,8BACZ,UAAA,EAAY;AAAA,6BACd;AAAA,4BAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA;AACR;AAAA,qBAAA;AAAA,oBAvCK,IAAA,CAAK;AAAA,mBAwCZ;AAAA,gBAEJ,CAAC;AAAA;AAAA;AACH,WAAA,EACF,CAAA;AAAA,UAGF,QAAA,kBAAAA,cAAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,MAAA,EACE,0BACEA,cAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,OAAA,EAAS,WAAA;AAAA,oBACT,QAAA,EAAU,gCAAA;AAAA,oBACV,UAAA,EAAY;AAAA,mBACd;AAAA,kBAEC,QAAA,EAAA;AAAA;AAAA,eACH;AAAA,cAIH,QAAA,EAAA,QAAA,oBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,OAAA,EAAS,IAAG,EACxB,QAAA,kBAAAA,eAAC,iBAAA,EAAA,EAAkB,OAAA,EAAS,IAAI,GAAA,EAAK,EAAA,EAClC,gBAAM,GAAA,CAAI,CAAC,yBACVK,eAAAA;AAAA,gBAAC,iBAAA;AAAA,gBAAA;AAAA,kBAEC,OAAA,EAAS,KAAK,OAAA,IAAW,CAAA;AAAA,kBACzB,OAAA,EAAS,KAAK,OAAA,IAAW,CAAA;AAAA,kBACzB,+BAA6B,IAAA,CAAK,EAAA;AAAA,kBAElC,QAAA,EAAA;AAAA,oCAAAL,cAAAA;AAAA,sBAAC,IAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAO;AAAA,0BACL,MAAA,EAAQ,WAAA;AAAA,0BACR,QAAA,EAAU,gCAAA;AAAA,0BACV,UAAA,EAAY,GAAA;AAAA,0BACZ,KAAA,EAAO;AAAA,yBACT;AAAA,wBAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,qBACR;AAAA,oBACC,SAAA,GAAY,IAAA,CAAK,EAAE,CAAA,KAAM,MAAA,GACxB,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA,GACf,IAAA,CAAK,IAAA,mBACPA,cAAAA;AAAA,sBAAC,KAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAO;AAAA,0BACL,QAAA,EAAU,gCAAA;AAAA,0BACV,KAAA,EAAO;AAAA,yBACT;AAAA,wBAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,qBACR,GACE;AAAA;AAAA,iBAAA;AAAA,gBA1BC,IAAA,CAAK;AAAA,eA4Bb,GACH,CAAA,EACF;AAAA;AAAA;AAEJ;AAAA;AACF;AAAA,GACF;AAEJ","file":"skeletons.cjs","sourcesContent":["import * as React from 'react'\n\nexport type IrisStackDirection = 'row' | 'column'\nexport type IrisStackAlign = 'start' | 'center' | 'end' | 'stretch'\nexport type IrisStackJustify = 'start' | 'center' | 'end' | 'between' | 'around'\n\nconst ALIGN_MAP: Record<IrisStackAlign, string> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n stretch: 'stretch',\n}\n\nconst JUSTIFY_MAP: Record<IrisStackJustify, string> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n between: 'space-between',\n around: 'space-around',\n}\n\nfunction toCssSpacing(spacing: string | number): string {\n if (typeof spacing === 'number') return `${spacing}px`\n if (spacing === 'sm' || spacing === 'md' || spacing === 'lg') {\n return `var(--iris-gap-${spacing})`\n }\n return spacing\n}\n\nexport interface IrisStackProps extends React.HTMLAttributes<HTMLDivElement> {\n direction?: IrisStackDirection\n spacing?: string | number\n align?: IrisStackAlign\n justify?: IrisStackJustify\n wrap?: boolean\n /** When true, renders as `inline-flex`. */\n inline?: boolean\n}\n\n/**\n * Flex container with token-driven spacing. The lightest possible layout\n * primitive — saves hand-writing `display: flex` everywhere.\n */\nexport const IrisStack = React.forwardRef<HTMLDivElement, IrisStackProps>(function IrisStack(\n {\n direction = 'column',\n spacing = 'md',\n align = 'stretch',\n justify = 'start',\n wrap = false,\n inline = false,\n style,\n children,\n ...rest\n },\n ref,\n) {\n return (\n <div\n {...rest}\n ref={ref}\n data-iris-stack=\"\"\n data-iris-stack-direction={direction}\n style={{\n display: inline ? 'inline-flex' : 'flex',\n flexDirection: direction,\n gap: toCssSpacing(spacing),\n alignItems: ALIGN_MAP[align],\n justifyContent: JUSTIFY_MAP[justify],\n flexWrap: wrap ? 'wrap' : 'nowrap',\n ...style,\n }}\n >\n {children}\n </div>\n )\n})\n","import * as React from 'react'\n\nexport type IrisContainerMaxWidth = 'sm' | 'md' | 'lg' | 'xl' | 'full' | string\n\nconst WIDTH_MAP: Record<'sm' | 'md' | 'lg' | 'xl' | 'full', string> = {\n sm: '640px',\n md: '768px',\n lg: '1024px',\n xl: '1280px',\n full: '100%',\n}\n\nfunction resolveMaxWidth(input: IrisContainerMaxWidth): string {\n if (input === 'sm' || input === 'md' || input === 'lg' || input === 'xl' || input === 'full') {\n return WIDTH_MAP[input]\n }\n return input\n}\n\nfunction resolvePadding(input: string | number): string {\n if (typeof input === 'number') return `${input}px`\n if (input === 'sm' || input === 'md' || input === 'lg') {\n return `var(--iris-padding-${input})`\n }\n return input\n}\n\nexport interface IrisContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n maxWidth?: IrisContainerMaxWidth\n padding?: string | number\n center?: boolean\n}\n\n/**\n * Centered max-width wrapper. Use to bound content width on large screens\n * without rewriting flex/grid plumbing.\n */\nexport const IrisContainer = React.forwardRef<HTMLDivElement, IrisContainerProps>(\n function IrisContainer(\n { maxWidth = 'lg', padding = 'md', center = true, style, children, ...rest },\n ref,\n ) {\n return (\n <div\n {...rest}\n ref={ref}\n data-iris-container=\"\"\n data-iris-container-max-width={maxWidth}\n style={{\n width: '100%',\n maxWidth: resolveMaxWidth(maxWidth),\n padding: `0 ${resolvePadding(padding)}`,\n ...(center ? { marginInlineStart: 'auto', marginInlineEnd: 'auto' } : {}),\n ...style,\n }}\n >\n {children}\n </div>\n )\n },\n)\n","import * as React from 'react'\n\nexport type IrisInputSize = 'sm' | 'md' | 'lg'\nexport type IrisInputType = 'text' | 'password' | 'email' | 'number' | 'search' | 'tel' | 'url'\n\nconst SIZE_MAP: Record<IrisInputSize, { padding: string; fontSize: string; minHeight: string }> = {\n sm: { padding: '4px 8px', fontSize: 'var(--iris-font-size-xs, 12px)', minHeight: '28px' },\n md: {\n padding: 'var(--iris-padding-sm, 6px) var(--iris-padding-md, 12px)',\n fontSize: 'var(--iris-font-size-md, 14px)',\n minHeight: '34px',\n },\n lg: { padding: '8px 12px', fontSize: 'var(--iris-font-size-lg, 16px)', minHeight: '40px' },\n}\n\nexport interface IrisInputProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'type' | 'prefix'\n> {\n size?: IrisInputSize\n type?: IrisInputType\n invalid?: boolean\n /** Forwarded as aria-describedby. */\n ariaDescribedby?: string\n prefix?: React.ReactNode\n suffix?: React.ReactNode\n}\n\n/**\n * Single-line text input with size variants, an `invalid` state, and optional\n * `prefix`/`suffix` adornments. Forwards its ref to the native `<input>`.\n *\n * @example\n * <IrisInput value={name} onChange={(e) => setName(e.target.value)} placeholder=\"Name\" />\n */\nexport const IrisInput = React.forwardRef<HTMLInputElement, IrisInputProps>(function IrisInput(\n {\n size = 'md',\n type = 'text',\n invalid = false,\n ariaDescribedby,\n prefix,\n suffix,\n style,\n onFocus,\n onBlur,\n ...rest\n },\n ref,\n) {\n const [focused, setFocused] = React.useState(false)\n const sizeStyles = SIZE_MAP[size]\n\n const borderColor = invalid\n ? 'var(--iris-danger)'\n : focused\n ? 'var(--iris-primary)'\n : 'var(--iris-border)'\n const boxShadow = focused\n ? `0 0 0 3px ${invalid ? 'color-mix(in srgb, var(--iris-danger) 18%, transparent)' : 'color-mix(in srgb, var(--iris-primary) 18%, transparent)'}`\n : 'none'\n\n const wrapperStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--iris-space-xs, 8px)',\n background: 'var(--iris-background)',\n color: 'var(--iris-foreground)',\n border: `1px solid ${borderColor}`,\n borderRadius: 'var(--iris-radius-md, 6px)',\n cursor: rest.disabled ? 'not-allowed' : 'text',\n opacity: rest.disabled ? 0.6 : 1,\n transition: 'border-color 120ms ease, box-shadow 120ms ease',\n boxShadow,\n padding: sizeStyles.padding,\n minHeight: sizeStyles.minHeight,\n fontSize: sizeStyles.fontSize,\n ...style,\n }\n\n const inputStyle: React.CSSProperties = {\n flex: 1,\n minWidth: 0,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n color: 'inherit',\n fontFamily: 'inherit',\n fontSize: 'inherit',\n padding: 0,\n }\n\n return (\n <label\n data-iris-input=\"\"\n data-iris-input-size={size}\n data-state={invalid ? 'invalid' : focused ? 'focused' : 'idle'}\n style={wrapperStyle}\n >\n {prefix ? (\n <span\n data-iris-input-prefix=\"\"\n style={{ display: 'inline-flex', alignItems: 'center', color: 'var(--iris-muted)' }}\n >\n {prefix}\n </span>\n ) : null}\n <input\n {...rest}\n ref={ref}\n type={type}\n aria-invalid={invalid ? 'true' : undefined}\n aria-describedby={ariaDescribedby}\n style={inputStyle}\n onFocus={(e) => {\n setFocused(true)\n onFocus?.(e)\n }}\n onBlur={(e) => {\n setFocused(false)\n onBlur?.(e)\n }}\n />\n {suffix ? (\n <span\n data-iris-input-suffix=\"\"\n style={{ display: 'inline-flex', alignItems: 'center', color: 'var(--iris-muted)' }}\n >\n {suffix}\n </span>\n ) : null}\n </label>\n )\n})\n","import * as React from 'react'\nimport type { I18n } from '@iris-ui-kit/core'\n\n/** Carries the active {@link I18n} instance to descendants via `useI18n`. */\nexport const I18nContext = React.createContext<I18n | null>(null)\n","import * as React from 'react'\nimport { useSyncExternalStore } from 'react'\nimport type { ReadonlyStore, Store } from '@iris-ui-kit/core'\n\n/**\n * Bridge a framework-agnostic `@iris-ui-kit/core` store into React reactivity.\n * Uses React 18's `useSyncExternalStore` — the contract is identical to the\n * one Vue uses via `ref + onMounted` and Solid uses via `createSignal`. The\n * **same** store can power Button, Popover, Dialog, etc. on any framework.\n */\nexport function useStore<T>(store: ReadonlyStore<T>): T {\n return useSyncExternalStore(\n store.subscribe,\n store.getState,\n store.getState, // SSR fallback — same as client snapshot in our case.\n )\n}\n\n/**\n * Subscribe to a DERIVED slice of a core store — the component re-renders only\n * when `selector(state)` changes per `isEqual` (default `Object.is`), not on\n * every store emission. Built on {@link Store.subscribeWith}. Inline closures\n * for `selector`/`isEqual` are fine (captured via refs; the subscription is not\n * re-created between renders).\n */\nexport function useStoreSelector<T, U>(\n store: Store<T>,\n selector: (state: T) => U,\n isEqual?: (a: U, b: U) => boolean,\n): U {\n const [slice, setSlice] = React.useState(() => selector(store.getState()))\n const selRef = React.useRef(selector)\n selRef.current = selector\n const eqRef = React.useRef(isEqual)\n eqRef.current = isEqual\n React.useEffect(() => {\n const read = (s: T): U => selRef.current(s)\n const eq = (a: U, b: U): boolean => (eqRef.current ?? Object.is)(a, b)\n // Re-sync in case the store moved between render and this effect.\n setSlice((prev) => {\n const next = read(store.getState())\n return eq(prev, next) ? prev : next\n })\n return store.subscribeWith(read, setSlice, eq)\n }, [store])\n return slice\n}\n","import * as React from 'react'\nimport { createI18n, type I18n } from '@iris-ui-kit/core'\nimport { useStore } from '../useStore'\nimport { I18nContext } from './context'\n\nexport interface UseI18nReturn {\n locale: string\n t: I18n['t']\n formatDate: I18n['formatDate']\n formatNumber: I18n['formatNumber']\n formatRelativeTime: I18n['formatRelativeTime']\n setLocale: I18n['setLocale']\n setMessages: I18n['setMessages']\n}\n\n// Shared fallback so components can call `useI18n()` without an enclosing\n// provider — they get English defaults rather than throwing.\nlet fallbackI18n: I18n | null = null\nfunction getFallback(): I18n {\n if (fallbackI18n === null) fallbackI18n = createI18n()\n return fallbackI18n\n}\n\n/**\n * Reactive access to the active locale + translation/formatting helpers.\n * Re-renders the host when the locale or messages change. Works with or\n * without an `<IrisI18nProvider>` (falls back to English defaults).\n */\nexport function useI18n(): UseI18nReturn {\n const ctx = React.useContext(I18nContext)\n const i18n = ctx ?? getFallback()\n const state = useStore(i18n.store)\n\n return {\n locale: state.locale,\n t: i18n.t,\n formatDate: i18n.formatDate,\n formatNumber: i18n.formatNumber,\n formatRelativeTime: i18n.formatRelativeTime,\n setLocale: i18n.setLocale,\n setMessages: i18n.setMessages,\n }\n}\n","import * as React from 'react'\nimport { useI18n } from '../../i18n'\nimport { IrisInput, type IrisInputProps } from '../input/Input'\n\nexport interface IrisPasswordInputProps extends Omit<\n IrisInputProps,\n 'type' | 'prefix' | 'suffix' | 'children'\n> {\n /** Allow toggling visibility. Default true. */\n showToggle?: boolean\n /** Custom suffix slot (rendered before the toggle). */\n suffix?: React.ReactNode\n /** Custom prefix slot. */\n prefix?: React.ReactNode\n}\n\n/** React port of {@link import('@iris-ui-kit/vue').IrisPasswordInput}. */\nexport const IrisPasswordInput = React.forwardRef<HTMLInputElement, IrisPasswordInputProps>(\n function IrisPasswordInput(\n { showToggle = true, suffix, prefix, disabled, readOnly, ...rest },\n ref,\n ) {\n const { t } = useI18n()\n const [visible, setVisible] = React.useState(false)\n const toggle = () => {\n if (disabled || readOnly) return\n setVisible((v) => !v)\n }\n\n const toggleBtn = showToggle ? (\n <button\n type=\"button\"\n data-iris-password-input-toggle=\"\"\n aria-label={visible ? t('passwordInput.hide') : t('passwordInput.show')}\n aria-pressed={visible ? 'true' : 'false'}\n onClick={toggle}\n style={{\n background: 'transparent',\n border: 'none',\n cursor: disabled ? 'not-allowed' : 'pointer',\n color: 'var(--iris-muted)',\n padding: '0 var(--iris-space-xxs, 4px)',\n fontSize: 'var(--iris-font-size-sm, 13px)',\n lineHeight: 1,\n }}\n >\n {visible ? '🙈' : '👁'}\n </button>\n ) : null\n\n return (\n <IrisInput\n {...rest}\n ref={ref}\n type={visible ? 'text' : 'password'}\n disabled={disabled}\n readOnly={readOnly}\n prefix={prefix}\n suffix={\n <>\n {suffix}\n {toggleBtn}\n </>\n }\n data-iris-password-input=\"\"\n />\n )\n },\n)\n","import * as React from 'react'\n\nexport type IrisCheckboxSize = 'sm' | 'md' | 'lg'\nexport type IrisCheckboxValue = boolean | 'indeterminate'\n\nconst DIM_MAP: Record<IrisCheckboxSize, string> = {\n sm: '14px',\n md: '18px',\n lg: '22px',\n}\n\nexport interface IrisCheckboxProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'size' | 'value' | 'checked' | 'defaultChecked' | 'onChange'\n> {\n /** `true`, `false`, or `'indeterminate'`. */\n checked?: IrisCheckboxValue\n defaultChecked?: IrisCheckboxValue\n onChange?: (next: boolean, event: React.ChangeEvent<HTMLInputElement>) => void\n size?: IrisCheckboxSize\n invalid?: boolean\n ariaDescribedby?: string\n /** Label content rendered next to the box. */\n children?: React.ReactNode\n}\n\n/**\n * Tri-state checkbox supporting `true`, `false`, and `'indeterminate'`, in both\n * controlled (`checked`) and uncontrolled (`defaultChecked`) modes.\n *\n * @example\n * <IrisCheckbox checked={agreed} onChange={(next) => setAgreed(next)}>\n * I agree to the terms\n * </IrisCheckbox>\n */\nexport const IrisCheckbox = React.forwardRef<HTMLInputElement, IrisCheckboxProps>(\n function IrisCheckbox(\n {\n checked,\n defaultChecked = false,\n onChange,\n size = 'md',\n disabled = false,\n invalid = false,\n ariaDescribedby,\n children,\n style,\n ...rest\n },\n ref,\n ) {\n const [internalChecked, setInternalChecked] = React.useState<IrisCheckboxValue>(defaultChecked)\n const isControlled = checked !== undefined\n const value: IrisCheckboxValue = isControlled ? (checked as IrisCheckboxValue) : internalChecked\n\n const innerRef = React.useRef<HTMLInputElement | null>(null)\n React.useImperativeHandle(ref, () => innerRef.current as HTMLInputElement, [])\n\n // Sync `indeterminate` (it's a DOM-only attribute, not a JSX prop).\n React.useEffect(() => {\n const el = innerRef.current\n if (el) el.indeterminate = value === 'indeterminate'\n }, [value])\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return\n const next = e.target.checked\n if (!isControlled) setInternalChecked(next)\n onChange?.(next, e)\n }\n\n const state: 'checked' | 'unchecked' | 'indeterminate' =\n value === 'indeterminate' ? 'indeterminate' : value ? 'checked' : 'unchecked'\n\n const dim = DIM_MAP[size]\n\n const boxStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: dim,\n height: dim,\n borderRadius: 'var(--iris-radius-sm, 4px)',\n border: `1px solid ${state === 'unchecked' ? 'var(--iris-border)' : 'var(--iris-primary)'}`,\n background: state === 'unchecked' ? 'var(--iris-background)' : 'var(--iris-primary)',\n color: 'var(--iris-primary-foreground, #fff)',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.6 : 1,\n transition: 'background-color 120ms ease, border-color 120ms ease',\n flexShrink: 0,\n }\n\n const indicator = state === 'checked' ? '✓' : state === 'indeterminate' ? '—' : null\n\n return (\n <label\n data-iris-checkbox=\"\"\n data-iris-checkbox-size={size}\n data-state={state}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 8,\n cursor: disabled ? 'not-allowed' : 'pointer',\n userSelect: 'none',\n ...style,\n }}\n >\n <input\n {...rest}\n ref={innerRef}\n type=\"checkbox\"\n checked={value === true}\n disabled={disabled}\n aria-checked={\n state === 'indeterminate' ? 'mixed' : state === 'checked' ? 'true' : 'false'\n }\n aria-describedby={ariaDescribedby}\n aria-invalid={invalid ? 'true' : undefined}\n onChange={handleChange}\n style={{\n position: 'absolute',\n opacity: 0,\n width: 0,\n height: 0,\n pointerEvents: 'none',\n }}\n />\n <span aria-hidden=\"true\" style={boxStyle}>\n {indicator}\n </span>\n {children}\n </label>\n )\n },\n)\n","/**\n * Singleton stylesheet for the React `IrisButton`. Functionally identical to\n * the one in `@iris-ui-kit/vue` — both adapters end up writing the same DOM with\n * the same selectors, so the same CSS works. (Were we to ship both adapters\n * on the same page, the second installation would no-op because the\n * `<style id>` is shared.)\n */\nconst STYLE_ID = 'iris-button-styles'\n\nconst CSS = `\n.iris-button {\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--iris-gap-sm, 4px);\n font-family: inherit;\n font-weight: 500;\n line-height: 1.2;\n border-radius: var(--iris-radius-md, 6px);\n white-space: nowrap;\n user-select: none;\n position: relative;\n transition:\n background-color 120ms ease,\n border-color 120ms ease,\n color 120ms ease,\n filter 120ms ease;\n}\n.iris-button:focus-visible {\n outline: 2px solid var(--iris-primary);\n outline-offset: 2px;\n}\n.iris-button[disabled],\n.iris-button[aria-busy=\"true\"] {\n cursor: not-allowed;\n opacity: 0.6;\n}\n.iris-button[data-iris-button-variant=\"solid\"]:not([disabled]):not([aria-busy=\"true\"]):hover,\n.iris-button[data-iris-button-variant=\"danger\"]:not([disabled]):not([aria-busy=\"true\"]):hover {\n background: color-mix(in srgb, var(--iris-danger) 92%, var(--iris-surface));\n}\n.iris-button:not([disabled]):not([aria-busy=\"true\"]):active {\n transform: scale(0.98);\n}\n.iris-button[data-iris-button-variant=\"outline\"]:not([disabled]):not([aria-busy=\"true\"]):hover,\n.iris-button[data-iris-button-variant=\"ghost\"]:not([disabled]):not([aria-busy=\"true\"]):hover {\n background-color: var(--iris-surface-hover);\n}\n.iris-button[data-iris-button-variant=\"link\"]:not([disabled]):not([aria-busy=\"true\"]):hover {\n text-decoration: underline;\n}\n.iris-button-leading {\n display: inline-flex;\n align-items: center;\n}\n.iris-button-spinner {\n width: 1em;\n height: 1em;\n display: inline-block;\n animation: iris-button-spin 0.7s linear infinite;\n}\n@keyframes iris-button-spin {\n to { transform: rotate(360deg); }\n}\n`\n\nlet installed = false\n\nexport function installButtonStyles(): void {\n if (installed) return\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID)) {\n installed = true\n return\n }\n const style = document.createElement('style')\n style.id = STYLE_ID\n style.textContent = CSS\n document.head.appendChild(style)\n installed = true\n}\n\n/** Test-only reset. */\nexport function __resetButtonStyles(): void {\n installed = false\n if (typeof document === 'undefined') return\n document.getElementById(STYLE_ID)?.remove()\n}\n\nexport const __BUTTON_STYLE_ID = STYLE_ID\n","import {\n Children,\n cloneElement,\n isValidElement,\n useEffect,\n type ButtonHTMLAttributes,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type MouseEventHandler,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { composeEventHandlers } from '@iris-ui-kit/core'\nimport type { IrisButtonSize, IrisButtonType, IrisButtonVariant } from './types'\nimport { installButtonStyles } from './styles'\n\ntype StyleMap = Record<string, string>\n\nconst SIZE_STYLES: Record<IrisButtonSize, StyleMap> = {\n sm: {\n padding: 'var(--iris-padding-sm) var(--iris-padding-md)',\n fontSize: 'var(--iris-font-size-xs, 12px)',\n },\n md: {\n padding: 'var(--iris-padding-sm) var(--iris-padding-lg)',\n fontSize: 'var(--iris-font-size-md, 14px)',\n },\n lg: {\n padding: 'var(--iris-padding-md) var(--iris-padding-lg)',\n fontSize: 'var(--iris-font-size-lg, 16px)',\n },\n}\n\nconst VARIANT_STYLES: Record<IrisButtonVariant, StyleMap> = {\n solid: {\n background: 'var(--iris-primary)',\n color: 'var(--iris-primary-foreground)',\n border: '1px solid var(--iris-primary)',\n },\n outline: {\n background: 'transparent',\n color: 'var(--iris-primary)',\n border: '1px solid var(--iris-border)',\n },\n ghost: {\n background: 'transparent',\n color: 'var(--iris-foreground)',\n border: '1px solid transparent',\n },\n link: {\n background: 'transparent',\n color: 'var(--iris-primary)',\n border: '1px solid transparent',\n textDecoration: 'none',\n },\n danger: {\n background: 'var(--iris-danger)',\n color: 'var(--iris-on-color, #ffffff)',\n border: '1px solid var(--iris-danger)',\n },\n}\n\nfunction buildInlineStyle(variant: IrisButtonVariant, size: IrisButtonSize): CSSProperties {\n const base: StyleMap = { ...SIZE_STYLES[size], ...VARIANT_STYLES[variant] }\n if (variant === 'link') base.padding = '0'\n return base as CSSProperties\n}\n\nfunction Spinner() {\n return (\n <svg className=\"iris-button-spinner\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"3\" />\n <path\n d=\"M22 12a10 10 0 0 1-10 10\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n />\n </svg>\n )\n}\n\nexport interface IrisButtonProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'type' | 'disabled' | 'onClick' | 'className' | 'style' | 'children'\n> {\n variant?: IrisButtonVariant\n size?: IrisButtonSize\n disabled?: boolean\n loading?: boolean\n type?: IrisButtonType\n asChild?: boolean\n leading?: ReactNode\n children?: ReactNode\n className?: string\n style?: CSSProperties\n onClick?: MouseEventHandler<HTMLElement>\n}\n\n/**\n * Primary action button. Supports four variants (`solid`, `outline`, `ghost`,\n * `link`) and three sizes (`sm`, `md`, `lg`). Each variant is styled via\n * CSS custom properties (`var(--iris-primary)`, `var(--iris-border)` etc.)\n * so the button automatically adapts to the active theme/skin.\n *\n * When `loading` is true a spinner replaces the leading icon and clicks are\n * suppressed. Pass `asChild` to delegate rendering to a single child element\n * (e.g. `<IrisButton asChild><a href=\"…\">link</a></IrisButton>`).\n *\n * All unlisted HTML attributes (`aria-*`, `data-*`, `id`, etc.) are forwarded\n * to the root `<button>` element via `{...rest}`.\n *\n * @example\n * <IrisButton variant=\"solid\" onClick={() => save()}>Save</IrisButton>\n *\n * @example\n * <IrisButton variant=\"outline\" size=\"sm\" loading>Processing</IrisButton>\n *\n * @example\n * <IrisButton asChild><a href=\"/dashboard\">Dashboard</a></IrisButton>\n */\nexport function IrisButton({\n variant = 'solid',\n size = 'md',\n disabled = false,\n loading = false,\n type = 'button',\n asChild = false,\n leading,\n children,\n className,\n style,\n onClick,\n ...rest\n}: IrisButtonProps) {\n useEffect(() => {\n installButtonStyles()\n }, [])\n\n const isInteractive = !disabled && !loading\n\n const handleClick = (event: ReactMouseEvent<HTMLElement>) => {\n if (!isInteractive) {\n event.preventDefault()\n event.stopPropagation()\n return\n }\n onClick?.(event)\n }\n\n const baseProps = {\n className: ['iris-button', className].filter(Boolean).join(' '),\n 'data-iris-button-variant': variant,\n 'data-iris-button-size': size,\n 'aria-disabled': disabled ? ('true' as const) : undefined,\n 'aria-busy': loading ? ('true' as const) : undefined,\n style: { ...buildInlineStyle(variant, size), ...(style ?? {}) },\n }\n\n if (asChild) {\n const only = Children.only(children) as ReactElement | undefined\n if (!only || !isValidElement(only)) {\n if (typeof process === 'undefined' || process.env?.NODE_ENV !== 'production') {\n console.warn('[iris-ui] IrisButton: as-child requires a single React element child')\n }\n return null\n }\n const childProps = only.props as {\n className?: string\n style?: CSSProperties\n onClick?: MouseEventHandler<HTMLElement>\n }\n return cloneElement(only, {\n ...rest,\n ...baseProps,\n className: [baseProps.className, childProps.className].filter(Boolean).join(' '),\n style: { ...baseProps.style, ...(childProps.style ?? {}) },\n onClick: composeEventHandlers(\n handleClick as (e: ReactMouseEvent<HTMLElement>) => void,\n (childProps.onClick ?? (() => {})) as (e: ReactMouseEvent<HTMLElement>) => void,\n ),\n ...(isInteractive ? {} : { disabled: true }),\n } as Record<string, unknown>)\n }\n\n return (\n <button {...rest} type={type} disabled={!isInteractive} onClick={handleClick} {...baseProps}>\n {(loading || leading) && (\n <span className=\"iris-button-leading\">{loading ? <Spinner /> : leading}</span>\n )}\n {children}\n </button>\n )\n}\n","import * as React from 'react'\n\nexport interface IrisFormFieldProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n label?: string\n hint?: string\n error?: string\n required?: boolean\n /** Override the auto-generated control id. */\n labelFor?: string\n /** Visual size of the label. */\n size?: 'sm' | 'md'\n children?: React.ReactNode\n}\n\ntype InjectableProps = {\n id?: string\n invalid?: boolean\n ariaDescribedby?: string\n}\n\n/**\n * Form-field wrapper that handles the label / hint / error trio with the\n * right a11y plumbing. Non-invasive wrapper around any Iris input primitive\n * (`IrisInput`, `IrisTextarea`, `IrisNumberInput`, `IrisSwitch`, `IrisCheckbox`,\n * `IrisPasswordInput`, …): locates the first valid React element in `children`\n * and clones it with the generated `id`, `aria-describedby`, and `invalid`.\n *\n * ```tsx\n * <IrisFormField label=\"Email\" error={errors.email} hint=\"We never share it.\">\n * <IrisInput value={email} onChange={setEmail} />\n * </IrisFormField>\n * ```\n */\nexport const IrisFormField = React.forwardRef<HTMLDivElement, IrisFormFieldProps>(\n function IrisFormField(\n { label, hint, error, required = false, labelFor, size = 'md', style, children, ...rest },\n ref,\n ) {\n const generated = React.useId()\n const controlId = labelFor || `${generated}-control`\n const hintId = `${generated}-hint`\n const errorId = `${generated}-error`\n\n const describedBy = React.useMemo(() => {\n const ids: string[] = []\n if (hint && !error) ids.push(hintId)\n if (error) ids.push(errorId)\n return ids.length > 0 ? ids.join(' ') : undefined\n }, [hint, error, hintId, errorId])\n\n let injected = false\n const decorated = React.Children.map(children, (child) => {\n if (!injected && React.isValidElement(child)) {\n injected = true\n const injectedProps: InjectableProps = {\n id: controlId,\n invalid: error ? true : undefined,\n ariaDescribedby: describedBy,\n }\n return React.cloneElement(child, injectedProps as Partial<unknown> as React.Attributes)\n }\n return child\n })\n\n const labelStyle: React.CSSProperties = {\n fontSize: size === 'sm' ? '12px' : '14px',\n fontWeight: 500,\n color: error ? 'var(--iris-danger)' : 'var(--iris-foreground)',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n }\n\n return (\n <div\n {...rest}\n ref={ref}\n data-iris-form-field=\"\"\n data-iris-form-field-state={error ? 'invalid' : 'valid'}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '4px',\n ...style,\n }}\n >\n {label ? (\n <label htmlFor={controlId} data-iris-form-field-label=\"\" style={labelStyle}>\n {label}\n {required ? (\n <span\n aria-hidden=\"true\"\n data-iris-form-field-required=\"\"\n style={{ color: 'var(--iris-danger)' }}\n >\n *\n </span>\n ) : null}\n </label>\n ) : null}\n {decorated}\n {hint && !error ? (\n <div\n id={hintId}\n data-iris-form-field-hint=\"\"\n style={{ fontSize: 'var(--iris-font-size-xs, 12px)', color: 'var(--iris-muted)' }}\n >\n {hint}\n </div>\n ) : null}\n {error ? (\n <div\n id={errorId}\n data-iris-form-field-error=\"\"\n role=\"alert\"\n style={{ fontSize: 'var(--iris-font-size-xs, 12px)', color: 'var(--iris-danger)' }}\n >\n {error}\n </div>\n ) : null}\n </div>\n )\n },\n)\n","import * as React from 'react'\nimport { useI18n } from '../../i18n'\n\nexport type IrisAlertTone = 'info' | 'success' | 'warning' | 'danger'\n\nconst TONE_TO_VAR: Record<IrisAlertTone, string> = {\n info: '--iris-info',\n success: '--iris-success',\n warning: '--iris-warning',\n danger: '--iris-danger',\n}\n\nexport interface IrisAlertProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n tone?: IrisAlertTone\n title?: React.ReactNode\n closable?: boolean\n open?: boolean\n onClose?: () => void\n icon?: React.ReactNode\n children?: React.ReactNode\n}\n\n/**\n * React port of {@link import('@iris-ui-kit/vue').IrisAlert}.\n *\n * @example\n * <IrisAlert tone=\"warning\" title=\"Heads up\" closable onClose={dismiss}>\n * Your session expires soon.\n * </IrisAlert>\n */\nexport function IrisAlert({\n tone = 'info',\n title,\n closable = false,\n open,\n onClose,\n icon,\n children,\n style,\n ...rest\n}: IrisAlertProps): React.ReactElement | null {\n const { t } = useI18n()\n const [internalOpen, setInternalOpen] = React.useState(true)\n React.useEffect(() => {\n if (open !== undefined) setInternalOpen(open)\n }, [open])\n\n const isOpen = open !== undefined ? open : internalOpen\n if (!isOpen) return null\n\n const tonalVar = `var(${TONE_TO_VAR[tone]})`\n\n const handleClose = () => {\n if (open === undefined) setInternalOpen(false)\n onClose?.()\n }\n\n return (\n <div\n {...rest}\n role={tone === 'danger' || tone === 'warning' ? 'alert' : 'status'}\n data-iris-alert=\"\"\n data-iris-alert-tone={tone}\n style={{\n display: 'flex',\n gap: 'var(--iris-gap-md, 12px)',\n padding: 'var(--iris-padding-md, 12px)',\n borderRadius: 'var(--iris-radius-md, 6px)',\n border: `1px solid ${tonalVar}`,\n // `backgroundColor` is the precomputed fallback under color-mix (engines\n // without it); the `background` shorthand overrides with the exact mix.\n backgroundColor: `var(${TONE_TO_VAR[tone]}-subtle)`,\n background: `color-mix(in srgb, ${tonalVar} 10%, var(--iris-background))`,\n color: 'var(--iris-foreground)',\n alignItems: 'flex-start',\n ...style,\n }}\n >\n {icon ? (\n <span\n data-iris-alert-icon=\"\"\n style={{ color: tonalVar, flexShrink: 0, display: 'inline-flex' }}\n >\n {icon}\n </span>\n ) : null}\n <div data-iris-alert-body=\"\" style={{ flex: 1, minWidth: 0 }}>\n {title ? (\n <div\n data-iris-alert-title=\"\"\n style={{ fontWeight: 600, marginBottom: 4, color: tonalVar }}\n >\n {title}\n </div>\n ) : null}\n <div data-iris-alert-content=\"\">{children}</div>\n </div>\n {closable ? (\n <button\n type=\"button\"\n data-iris-alert-close=\"\"\n aria-label={t('alert.close')}\n onClick={handleClose}\n style={{\n background: 'transparent',\n border: 'none',\n cursor: 'pointer',\n color: 'var(--iris-muted)',\n fontSize: 'var(--iris-font-size-lg, 16px)',\n padding: 0,\n lineHeight: 1,\n flexShrink: 0,\n }}\n >\n ✕\n </button>\n ) : null}\n </div>\n )\n}\n","import * as React from 'react'\n\nexport type IrisDividerOrientation = 'horizontal' | 'vertical'\nexport type IrisDividerSpacing = 'sm' | 'md' | 'lg'\n\nconst SPACING_MAP: Record<IrisDividerSpacing, string> = {\n sm: '8px',\n md: '16px',\n lg: '24px',\n}\n\nexport interface IrisDividerProps extends Omit<React.HTMLAttributes<HTMLElement>, 'children'> {\n orientation?: IrisDividerOrientation\n label?: React.ReactNode\n spacing?: IrisDividerSpacing\n children?: React.ReactNode\n}\n\n/** React port of {@link import('@iris-ui-kit/vue').IrisDivider}. */\nexport function IrisDivider({\n orientation = 'horizontal',\n label,\n spacing = 'md',\n children,\n style,\n ...rest\n}: IrisDividerProps): React.ReactElement {\n const isHorizontal = orientation === 'horizontal'\n const hasLabel = Boolean(label || children)\n\n if (isHorizontal && !hasLabel) {\n return (\n <hr\n {...rest}\n data-iris-divider=\"\"\n data-iris-divider-orientation=\"horizontal\"\n style={{\n border: 'none',\n borderTop: '1px solid var(--iris-border)',\n margin: `${SPACING_MAP[spacing]} 0`,\n width: '100%',\n ...style,\n }}\n />\n )\n }\n\n if (!isHorizontal) {\n return (\n <div\n {...rest}\n role=\"separator\"\n aria-orientation=\"vertical\"\n data-iris-divider=\"\"\n data-iris-divider-orientation=\"vertical\"\n style={{\n display: 'inline-block',\n width: 1,\n alignSelf: 'stretch',\n background: 'var(--iris-border)',\n margin: `0 ${SPACING_MAP[spacing]}`,\n ...style,\n }}\n />\n )\n }\n\n return (\n <div\n {...rest}\n role=\"separator\"\n aria-orientation=\"horizontal\"\n data-iris-divider=\"\"\n data-iris-divider-orientation=\"horizontal\"\n data-iris-divider-has-label=\"true\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n margin: `${SPACING_MAP[spacing]} 0`,\n color: 'var(--iris-muted)',\n fontSize: 'var(--iris-font-size-xs, 12px)',\n textTransform: 'uppercase',\n letterSpacing: 'var(--iris-letter-spacing-wide, 0.04em)',\n ...style,\n }}\n >\n <span data-iris-divider-line=\"before\" style={lineStyle} />\n <span data-iris-divider-label=\"\">{children ?? label}</span>\n <span data-iris-divider-line=\"after\" style={lineStyle} />\n </div>\n )\n}\n\nconst lineStyle: React.CSSProperties = {\n flex: 1,\n height: 1,\n background: 'var(--iris-border)',\n}\n","import * as React from 'react'\nimport { IrisStack } from '../layouts/Stack'\nimport { IrisContainer } from '../layouts/Container'\nimport { IrisInput } from '../primitives/input/Input'\nimport { IrisPasswordInput } from '../primitives/password-input/PasswordInput'\nimport { IrisCheckbox } from '../primitives/checkbox/Checkbox'\nimport { IrisButton } from '../primitives/button/Button'\nimport { IrisFormField } from '../primitives/form-field/FormField'\nimport { IrisAlert } from '../primitives/alert/Alert'\nimport { IrisDivider } from '../primitives/divider/Divider'\n\nexport interface IrisLoginSubmitPayload {\n email: string\n password: string\n remember: boolean\n}\n\nexport interface IrisLoginTemplateProps {\n title?: string\n description?: string\n showRemember?: boolean\n error?: string\n submitLabel?: string\n loading?: boolean\n /** Custom header replaces title/description block. */\n header?: React.ReactNode\n /** Slot for \"Forgot password?\" link (rendered next to Remember checkbox). */\n forgot?: React.ReactNode\n /** Content rendered below the form (separated by a divider). */\n footer?: React.ReactNode\n onSubmit?: (payload: IrisLoginSubmitPayload) => void\n style?: React.CSSProperties\n className?: string\n}\n\n/**\n * Layer 4 system skeleton: centered login page composed from Iris primitives.\n */\nexport function IrisLoginTemplate({\n title = 'Sign in',\n description = '',\n showRemember = true,\n error = '',\n submitLabel = 'Sign in',\n loading = false,\n header,\n forgot,\n footer,\n onSubmit,\n style,\n className,\n}: IrisLoginTemplateProps): React.ReactElement {\n const [email, setEmail] = React.useState('')\n const [password, setPassword] = React.useState('')\n const [remember, setRemember] = React.useState(false)\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n onSubmit?.({ email, password, remember })\n }\n\n return (\n <div\n data-iris-login-template=\"\"\n className={className}\n style={{\n minHeight: '100vh',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'var(--iris-background)',\n color: 'var(--iris-foreground)',\n padding: 24,\n ...style,\n }}\n >\n <IrisContainer maxWidth=\"420px\" padding={0}>\n <form\n onSubmit={handleSubmit}\n data-iris-login-form=\"\"\n style={{\n background: 'var(--iris-surface)',\n border: '1px solid var(--iris-border)',\n borderRadius: 'var(--iris-radius-lg, 8px)',\n padding: 32,\n boxShadow: 'var(--iris-shadow-md)',\n }}\n >\n <IrisStack spacing=\"lg\">\n {header ?? (\n <div style={{ textAlign: 'center' }}>\n <h1\n style={{\n margin: '0 0 4px 0',\n fontSize: 'var(--iris-font-size-2xl, 20px)',\n fontWeight: 700,\n }}\n >\n {title}\n </h1>\n {description ? (\n <p\n style={{\n margin: 0,\n color: 'var(--iris-muted)',\n fontSize: 'var(--iris-font-size-md, 14px)',\n }}\n >\n {description}\n </p>\n ) : null}\n </div>\n )}\n {error ? <IrisAlert tone=\"danger\" title={error} /> : null}\n <IrisFormField label=\"Email\" required>\n <IrisInput\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n disabled={loading}\n autoComplete=\"email\"\n />\n </IrisFormField>\n <IrisFormField label=\"Password\" required>\n <IrisPasswordInput\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Enter your password\"\n disabled={loading}\n autoComplete=\"current-password\"\n />\n </IrisFormField>\n {showRemember ? (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n <IrisCheckbox\n checked={remember}\n onChange={(next) => setRemember(next)}\n disabled={loading}\n >\n Remember me\n </IrisCheckbox>\n {forgot ?? null}\n </div>\n ) : null}\n <IrisButton type=\"submit\" variant=\"solid\" loading={loading} style={{ width: '100%' }}>\n {submitLabel}\n </IrisButton>\n {footer ? (\n <div>\n <IrisDivider spacing=\"md\" label=\"or\" />\n {footer}\n </div>\n ) : null}\n </IrisStack>\n </form>\n </IrisContainer>\n </div>\n )\n}\n","import * as React from 'react'\n\nexport interface IrisSidebarLayoutSidebarState {\n collapsed: boolean\n setCollapsed: (next: boolean) => void\n}\n\nexport interface IrisSidebarLayoutProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n> {\n collapsed?: boolean\n defaultCollapsed?: boolean\n onCollapsedChange?: (next: boolean) => void\n /** Sidebar width when expanded (px or CSS length). */\n width?: number | string\n /** Sidebar width when collapsed. */\n collapsedWidth?: number | string\n side?: 'left' | 'right'\n /** Sidebar content. May be a render function that receives `{ collapsed, setCollapsed }`. */\n sidebar?: React.ReactNode | ((state: IrisSidebarLayoutSidebarState) => React.ReactNode)\n children?: React.ReactNode\n}\n\nfunction asLen(v: number | string): string {\n return typeof v === 'number' ? `${v}px` : v\n}\n\n/**\n * Two-column layout with a collapsible sidebar. The sidebar is kept mounted\n * across collapses (only its width animates) so component state survives.\n */\nexport function IrisSidebarLayout({\n collapsed: collapsedProp,\n defaultCollapsed = false,\n onCollapsedChange,\n width = 240,\n collapsedWidth = 60,\n side = 'left',\n sidebar,\n style,\n children,\n ...rest\n}: IrisSidebarLayoutProps): React.ReactElement {\n const isControlled = collapsedProp !== undefined\n const [internal, setInternal] = React.useState(defaultCollapsed)\n const collapsed = isControlled ? Boolean(collapsedProp) : internal\n\n const setCollapsed = React.useCallback(\n (next: boolean) => {\n if (!isControlled) setInternal(next)\n onCollapsedChange?.(next)\n },\n [isControlled, onCollapsedChange],\n )\n\n const sidebarContent =\n typeof sidebar === 'function'\n ? (sidebar as (s: IrisSidebarLayoutSidebarState) => React.ReactNode)({\n collapsed,\n setCollapsed,\n })\n : sidebar\n\n const sidebarStyle: React.CSSProperties = {\n width: collapsed ? asLen(collapsedWidth) : asLen(width),\n flexShrink: 0,\n background: 'var(--iris-surface)',\n borderRight: side === 'left' ? '1px solid var(--iris-border)' : 'none',\n borderLeft: side === 'right' ? '1px solid var(--iris-border)' : 'none',\n transition: 'width 180ms ease',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n }\n\n return (\n <div\n {...rest}\n data-iris-sidebar-layout=\"\"\n data-collapsed={collapsed ? '' : undefined}\n data-side={side}\n style={{\n display: 'flex',\n flexDirection: side === 'right' ? 'row-reverse' : 'row',\n width: '100%',\n height: '100%',\n minHeight: 0,\n color: 'var(--iris-foreground)',\n ...style,\n }}\n >\n <aside\n role=\"complementary\"\n data-iris-sidebar=\"\"\n data-collapsed={collapsed ? '' : undefined}\n style={sidebarStyle}\n >\n {sidebarContent}\n </aside>\n <div\n data-iris-sidebar-main=\"\"\n style={{\n flex: 1,\n minWidth: 0,\n overflow: 'auto',\n background: 'var(--iris-background)',\n }}\n >\n {children}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\n\nexport interface IrisHeaderLayoutProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n> {\n /** Header height (px or CSS length). Default `'auto'`. */\n headerHeight?: number | string\n /** Footer height (px or CSS length). Default `'auto'`. */\n footerHeight?: number | string\n /** Header sticks via `position: sticky` instead of static. Default true. */\n sticky?: boolean\n header?: React.ReactNode\n footer?: React.ReactNode\n children?: React.ReactNode\n}\n\nfunction asLen(v: number | string): string {\n return typeof v === 'number' ? `${v}px` : v\n}\n\n/**\n * Two- (or three-) region vertical layout: a sticky header on top, a\n * scrollable main region, and an optional footer.\n */\nexport function IrisHeaderLayout({\n headerHeight = 'auto',\n footerHeight = 'auto',\n sticky = true,\n header,\n footer,\n style,\n children,\n ...rest\n}: IrisHeaderLayoutProps): React.ReactElement {\n return (\n <div\n {...rest}\n data-iris-header-layout=\"\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n height: '100%',\n minHeight: 0,\n background: 'var(--iris-background)',\n color: 'var(--iris-foreground)',\n ...style,\n }}\n >\n {header ? (\n <header\n role=\"banner\"\n data-iris-header=\"\"\n style={{\n flexShrink: 0,\n height: asLen(headerHeight),\n borderBottom: '1px solid var(--iris-border)',\n background: 'var(--iris-surface)',\n position: sticky ? 'sticky' : 'static',\n top: 0,\n zIndex: 50,\n }}\n >\n {header}\n </header>\n ) : null}\n <main\n role=\"main\"\n data-iris-header-main=\"\"\n style={{ flex: 1, minHeight: 0, overflow: 'auto' }}\n >\n {children}\n </main>\n {footer ? (\n <footer\n role=\"contentinfo\"\n data-iris-footer=\"\"\n style={{\n flexShrink: 0,\n height: asLen(footerHeight),\n borderTop: '1px solid var(--iris-border)',\n background: 'var(--iris-surface)',\n }}\n >\n {footer}\n </footer>\n ) : null}\n </div>\n )\n}\n","import * as React from 'react'\n\nexport interface IrisDashboardGridProps extends React.HTMLAttributes<HTMLDivElement> {\n columns?: number\n gap?: number | string\n /** Use `repeat(auto-fill, minmax(<minColWidth>, 1fr))` instead of fixed `columns`. */\n minColWidth?: number | string\n}\n\n/**\n * 12-column responsive grid for dashboard composition. Each child controls\n * its span via `gridColumn` style or by wrapping with `IrisDashboardCard`.\n */\nexport function IrisDashboardGrid({\n columns = 12,\n gap = 16,\n minColWidth,\n style,\n children,\n ...rest\n}: IrisDashboardGridProps): React.ReactElement {\n const gapCss = typeof gap === 'number' ? `${gap}px` : gap\n const gridTemplateColumns = minColWidth\n ? `repeat(auto-fill, minmax(${\n typeof minColWidth === 'number' ? `${minColWidth}px` : minColWidth\n }, 1fr))`\n : `repeat(${columns}, 1fr)`\n\n return (\n <div\n {...rest}\n data-iris-dashboard-grid=\"\"\n style={{\n display: 'grid',\n gap: gapCss,\n gridTemplateColumns,\n width: '100%',\n ...style,\n }}\n >\n {children}\n </div>\n )\n}\n\nexport interface IrisDashboardCardProps extends React.HTMLAttributes<HTMLDivElement> {\n colSpan?: number | 'full'\n rowSpan?: number\n /** Show the styled card surface (background + border). Default true. */\n surface?: boolean\n}\n\n/**\n * A single dashboard grid cell. `colSpan='full'` makes it fill the row.\n */\nexport function IrisDashboardCard({\n colSpan = 1,\n rowSpan = 1,\n surface = true,\n style,\n children,\n ...rest\n}: IrisDashboardCardProps): React.ReactElement {\n const gridColumn = colSpan === 'full' ? '1 / -1' : `span ${colSpan}`\n const gridRow = rowSpan > 1 ? `span ${rowSpan}` : undefined\n\n return (\n <div\n {...rest}\n data-iris-dashboard-card=\"\"\n style={{\n gridColumn,\n gridRow,\n background: surface ? 'var(--iris-surface)' : 'transparent',\n border: surface ? '1px solid var(--iris-border)' : 'none',\n borderRadius: 'var(--iris-radius-md, 6px)',\n padding: surface ? 'var(--iris-padding-lg, 20px)' : 0,\n minWidth: 0,\n ...style,\n }}\n >\n {children}\n </div>\n )\n}\n","import * as React from 'react'\nimport { IrisSidebarLayout, type IrisSidebarLayoutSidebarState } from '../layouts/SidebarLayout'\nimport { IrisHeaderLayout } from '../layouts/HeaderLayout'\nimport { IrisDashboardGrid, IrisDashboardCard } from '../layouts/DashboardGrid'\nimport { IrisStack } from '../layouts/Stack'\n\nexport interface IrisDashboardNavItem {\n id: string\n label: string\n icon?: React.ReactNode\n}\n\nexport interface IrisDashboardCardSpec {\n id: string\n title: string\n colSpan?: number | 'full'\n rowSpan?: number\n body?: React.ReactNode\n}\n\nexport interface IrisDashboardTemplateProps {\n title?: string\n sidebarTitle?: string\n nav?: IrisDashboardNavItem[]\n activeId?: string\n onActiveIdChange?: (id: string) => void\n cards?: IrisDashboardCardSpec[]\n defaultCollapsed?: boolean\n onCollapsedChange?: (next: boolean) => void\n /** Custom header content (replaces default title). */\n header?: React.ReactNode\n /** Custom sidebar header. Receives `{ collapsed, setCollapsed }`. */\n sidebarHeader?: (state: IrisSidebarLayoutSidebarState) => React.ReactNode\n /** Custom main body content (replaces default grid). */\n children?: React.ReactNode\n /** Per-card body override, keyed by card id. */\n cardSlots?: Record<string, React.ReactNode>\n style?: React.CSSProperties\n className?: string\n}\n\n/**\n * Layer 4 system skeleton: 3-region dashboard shell — sidebar + header +\n * main grid. Built from `IrisSidebarLayout` + `IrisHeaderLayout` +\n * `IrisDashboardGrid`.\n */\nexport function IrisDashboardTemplate({\n title = 'Dashboard',\n sidebarTitle = '',\n nav = [],\n activeId = '',\n onActiveIdChange,\n cards = [],\n defaultCollapsed = false,\n onCollapsedChange,\n header,\n sidebarHeader,\n children,\n cardSlots,\n style,\n className,\n}: IrisDashboardTemplateProps): React.ReactElement {\n const [collapsed, setCollapsed] = React.useState(defaultCollapsed)\n\n const handleCollapsed = (next: boolean) => {\n setCollapsed(next)\n onCollapsedChange?.(next)\n }\n\n return (\n <div\n data-iris-dashboard-template=\"\"\n className={className}\n style={{\n width: '100%',\n height: '100vh',\n background: 'var(--iris-background)',\n color: 'var(--iris-foreground)',\n ...style,\n }}\n >\n <IrisSidebarLayout\n collapsed={collapsed}\n onCollapsedChange={handleCollapsed}\n width={240}\n collapsedWidth={64}\n sidebar={(state) => (\n <IrisStack spacing=\"sm\" style={{ padding: 12 }}>\n {sidebarHeader ? (\n sidebarHeader(state)\n ) : sidebarTitle ? (\n <div\n style={{\n padding: '8px 12px',\n fontSize: 'var(--iris-font-size-md, 14px)',\n fontWeight: 600,\n color: 'var(--iris-foreground)',\n opacity: state.collapsed ? 0 : 1,\n transition: 'opacity 120ms ease',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n }}\n >\n {sidebarTitle}\n </div>\n ) : null}\n <nav\n aria-label=\"Primary\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--iris-space-xxs, 4px)',\n }}\n >\n {nav.map((item) => {\n const isActive = item.id === activeId\n return (\n <button\n key={item.id}\n type=\"button\"\n data-iris-dashboard-nav-item={item.id}\n data-iris-dashboard-nav-active={isActive ? 'true' : undefined}\n onClick={() => onActiveIdChange?.(item.id)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--iris-space-sm, 12px)',\n padding: '8px 12px',\n background: isActive ? 'var(--iris-primary)' : 'transparent',\n color: isActive\n ? 'var(--iris-primary-foreground, #fff)'\n : 'var(--iris-foreground)',\n border: 'none',\n borderRadius: 'var(--iris-radius-sm, 4px)',\n cursor: 'pointer',\n fontSize: 'var(--iris-font-size-md, 14px)',\n fontFamily: 'inherit',\n textAlign: 'start',\n outline: 'none',\n }}\n >\n {item.icon ? (\n <span\n aria-hidden=\"true\"\n style={{ width: 16, display: 'inline-flex', justifyContent: 'center' }}\n >\n {item.icon}\n </span>\n ) : null}\n <span\n style={{\n opacity: state.collapsed ? 0 : 1,\n transition: 'opacity 120ms ease',\n whiteSpace: 'nowrap',\n }}\n >\n {item.label}\n </span>\n </button>\n )\n })}\n </nav>\n </IrisStack>\n )}\n >\n <IrisHeaderLayout\n header={\n header ?? (\n <div\n style={{\n padding: '12px 20px',\n fontSize: 'var(--iris-font-size-lg, 16px)',\n fontWeight: 600,\n }}\n >\n {title}\n </div>\n )\n }\n >\n {children ?? (\n <div style={{ padding: 20 }}>\n <IrisDashboardGrid columns={12} gap={16}>\n {cards.map((card) => (\n <IrisDashboardCard\n key={card.id}\n colSpan={card.colSpan ?? 4}\n rowSpan={card.rowSpan ?? 1}\n data-iris-dashboard-card-id={card.id}\n >\n <h3\n style={{\n margin: '0 0 8px 0',\n fontSize: 'var(--iris-font-size-md, 14px)',\n fontWeight: 600,\n color: 'var(--iris-foreground)',\n }}\n >\n {card.title}\n </h3>\n {cardSlots?.[card.id] !== undefined ? (\n cardSlots[card.id]\n ) : card.body ? (\n <div\n style={{\n fontSize: 'var(--iris-font-size-sm, 13px)',\n color: 'var(--iris-muted)',\n }}\n >\n {card.body}\n </div>\n ) : null}\n </IrisDashboardCard>\n ))}\n </IrisDashboardGrid>\n </div>\n )}\n </IrisHeaderLayout>\n </IrisSidebarLayout>\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/layouts/Stack.tsx","../src/layouts/Container.tsx","../src/primitives/input/Input.tsx","../src/i18n/context.ts","../src/useStore.ts","../src/i18n/useI18n.ts","../src/primitives/password-input/PasswordInput.tsx","../src/primitives/checkbox/Checkbox.tsx","../src/primitives/button/styles.ts","../src/primitives/button/Button.tsx","../src/primitives/form-field/FormField.tsx","../src/primitives/alert/Alert.tsx","../src/primitives/divider/Divider.tsx","../src/skeletons/LoginTemplate.tsx","../src/layouts/SidebarLayout.tsx","../src/layouts/HeaderLayout.tsx","../src/layouts/DashboardGrid.tsx","../src/skeletons/DashboardTemplate.tsx"],"names":["React","IrisStack","jsx","React2","IrisContainer","React3","IrisInput","jsxs","React4","useSyncExternalStore","createI18n","React6","React7","IrisPasswordInput","Fragment","React8","IrisCheckbox","useEffect","Children","isValidElement","cloneElement","composeEventHandlers","React9","IrisFormField","React10","React11","React12","asLen","React13"],"mappings":"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","file":"skeletons.cjs","sourcesContent":["import * as React from 'react'\n\nexport type IrisStackDirection = 'row' | 'column'\nexport type IrisStackAlign = 'start' | 'center' | 'end' | 'stretch'\nexport type IrisStackJustify = 'start' | 'center' | 'end' | 'between' | 'around'\n\nconst ALIGN_MAP: Record<IrisStackAlign, string> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n stretch: 'stretch',\n}\n\nconst JUSTIFY_MAP: Record<IrisStackJustify, string> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n between: 'space-between',\n around: 'space-around',\n}\n\nfunction toCssSpacing(spacing: string | number): string {\n if (typeof spacing === 'number') return `${spacing}px`\n if (spacing === 'sm' || spacing === 'md' || spacing === 'lg') {\n return `var(--iris-gap-${spacing})`\n }\n return spacing\n}\n\nexport interface IrisStackProps extends React.HTMLAttributes<HTMLDivElement> {\n direction?: IrisStackDirection\n spacing?: string | number\n align?: IrisStackAlign\n justify?: IrisStackJustify\n wrap?: boolean\n /** When true, renders as `inline-flex`. */\n inline?: boolean\n}\n\n/**\n * Flex container with token-driven spacing. The lightest possible layout\n * primitive — saves hand-writing `display: flex` everywhere.\n */\nexport const IrisStack = React.forwardRef<HTMLDivElement, IrisStackProps>(function IrisStack(\n {\n direction = 'column',\n spacing = 'md',\n align = 'stretch',\n justify = 'start',\n wrap = false,\n inline = false,\n style,\n children,\n ...rest\n },\n ref,\n) {\n return (\n <div\n {...rest}\n ref={ref}\n data-iris-stack=\"\"\n data-iris-stack-direction={direction}\n style={{\n display: inline ? 'inline-flex' : 'flex',\n flexDirection: direction,\n gap: toCssSpacing(spacing),\n alignItems: ALIGN_MAP[align],\n justifyContent: JUSTIFY_MAP[justify],\n flexWrap: wrap ? 'wrap' : 'nowrap',\n ...style,\n }}\n >\n {children}\n </div>\n )\n})\n","import * as React from 'react'\n\nexport type IrisContainerMaxWidth = 'sm' | 'md' | 'lg' | 'xl' | 'full' | string\n\nconst WIDTH_MAP: Record<'sm' | 'md' | 'lg' | 'xl' | 'full', string> = {\n sm: '640px',\n md: '768px',\n lg: '1024px',\n xl: '1280px',\n full: '100%',\n}\n\nfunction resolveMaxWidth(input: IrisContainerMaxWidth): string {\n if (input === 'sm' || input === 'md' || input === 'lg' || input === 'xl' || input === 'full') {\n return WIDTH_MAP[input]\n }\n return input\n}\n\nfunction resolvePadding(input: string | number): string {\n if (typeof input === 'number') return `${input}px`\n if (input === 'sm' || input === 'md' || input === 'lg') {\n return `var(--iris-padding-${input})`\n }\n return input\n}\n\nexport interface IrisContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n maxWidth?: IrisContainerMaxWidth\n padding?: string | number\n center?: boolean\n}\n\n/**\n * Centered max-width wrapper. Use to bound content width on large screens\n * without rewriting flex/grid plumbing.\n */\nexport const IrisContainer = React.forwardRef<HTMLDivElement, IrisContainerProps>(\n function IrisContainer(\n { maxWidth = 'lg', padding = 'md', center = true, style, children, ...rest },\n ref,\n ) {\n return (\n <div\n {...rest}\n ref={ref}\n data-iris-container=\"\"\n data-iris-container-max-width={maxWidth}\n style={{\n width: '100%',\n maxWidth: resolveMaxWidth(maxWidth),\n padding: `0 ${resolvePadding(padding)}`,\n ...(center ? { marginInlineStart: 'auto', marginInlineEnd: 'auto' } : {}),\n ...style,\n }}\n >\n {children}\n </div>\n )\n },\n)\n","import * as React from 'react'\n\nexport type IrisInputSize = 'sm' | 'md' | 'lg'\nexport type IrisInputType = 'text' | 'password' | 'email' | 'number' | 'search' | 'tel' | 'url'\n\nconst SIZE_MAP: Record<IrisInputSize, { padding: string; fontSize: string; minHeight: string }> = {\n sm: { padding: '4px 8px', fontSize: 'var(--iris-font-size-xs, 12px)', minHeight: '28px' },\n md: {\n padding: 'var(--iris-padding-sm, 6px) var(--iris-padding-md, 12px)',\n fontSize: 'var(--iris-font-size-md, 14px)',\n minHeight: '34px',\n },\n lg: { padding: '8px 12px', fontSize: 'var(--iris-font-size-lg, 16px)', minHeight: '40px' },\n}\n\nexport interface IrisInputProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'type' | 'prefix'\n> {\n size?: IrisInputSize\n type?: IrisInputType\n invalid?: boolean\n /** Forwarded as aria-describedby. */\n ariaDescribedby?: string\n prefix?: React.ReactNode\n suffix?: React.ReactNode\n}\n\n/**\n * Single-line text input with size variants, an `invalid` state, and optional\n * `prefix`/`suffix` adornments. Forwards its ref to the native `<input>`.\n *\n * @example\n * <IrisInput value={name} onChange={(e) => setName(e.target.value)} placeholder=\"Name\" />\n */\nexport const IrisInput = React.forwardRef<HTMLInputElement, IrisInputProps>(function IrisInput(\n {\n size = 'md',\n type = 'text',\n invalid = false,\n ariaDescribedby,\n prefix,\n suffix,\n style,\n onFocus,\n onBlur,\n ...rest\n },\n ref,\n) {\n const [focused, setFocused] = React.useState(false)\n const sizeStyles = SIZE_MAP[size]\n\n const borderColor = invalid\n ? 'var(--iris-danger)'\n : focused\n ? 'var(--iris-primary)'\n : 'var(--iris-border)'\n const boxShadow = focused\n ? `0 0 0 3px ${invalid ? 'color-mix(in srgb, var(--iris-danger) 18%, transparent)' : 'color-mix(in srgb, var(--iris-primary) 18%, transparent)'}`\n : 'none'\n\n const wrapperStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--iris-space-xs, 8px)',\n background: rest.readOnly ? 'var(--iris-surface)' : 'var(--iris-background)',\n color: 'var(--iris-foreground)',\n border: `1px solid ${borderColor}`,\n borderRadius: 'var(--iris-radius-md, 6px)',\n cursor: rest.disabled ? 'not-allowed' : rest.readOnly ? 'default' : 'text',\n opacity: rest.disabled ? 0.6 : 1,\n transition: 'border-color 120ms ease, box-shadow 120ms ease',\n boxShadow,\n padding: sizeStyles.padding,\n minHeight: sizeStyles.minHeight,\n fontSize: sizeStyles.fontSize,\n ...style,\n }\n\n const inputStyle: React.CSSProperties = {\n flex: 1,\n minWidth: 0,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n color: 'inherit',\n fontFamily: 'inherit',\n fontSize: 'inherit',\n padding: 0,\n }\n\n return (\n <label\n data-iris-input=\"\"\n data-iris-input-size={size}\n data-state={invalid ? 'invalid' : focused ? 'focused' : rest.readOnly ? 'readonly' : 'idle'}\n style={wrapperStyle}\n >\n {prefix ? (\n <span\n data-iris-input-prefix=\"\"\n style={{ display: 'inline-flex', alignItems: 'center', color: 'var(--iris-muted)' }}\n >\n {prefix}\n </span>\n ) : null}\n <input\n {...rest}\n ref={ref}\n type={type}\n aria-invalid={invalid ? 'true' : undefined}\n aria-describedby={ariaDescribedby}\n style={inputStyle}\n onFocus={(e) => {\n setFocused(true)\n onFocus?.(e)\n }}\n onBlur={(e) => {\n setFocused(false)\n onBlur?.(e)\n }}\n />\n {suffix ? (\n <span\n data-iris-input-suffix=\"\"\n style={{ display: 'inline-flex', alignItems: 'center', color: 'var(--iris-muted)' }}\n >\n {suffix}\n </span>\n ) : null}\n </label>\n )\n})\n","import * as React from 'react'\nimport type { I18n } from '@iris-ui-kit/core'\n\n/** Carries the active {@link I18n} instance to descendants via `useI18n`. */\nexport const I18nContext = React.createContext<I18n | null>(null)\n","import * as React from 'react'\nimport { useSyncExternalStore } from 'react'\nimport type { ReadonlyStore, Store } from '@iris-ui-kit/core'\n\n/**\n * Bridge a framework-agnostic `@iris-ui-kit/core` store into React reactivity.\n * Uses React 18's `useSyncExternalStore` — the contract is identical to the\n * one Vue uses via `ref + onMounted` and Solid uses via `createSignal`. The\n * **same** store can power Button, Popover, Dialog, etc. on any framework.\n */\nexport function useStore<T>(store: ReadonlyStore<T>): T {\n return useSyncExternalStore(\n store.subscribe,\n store.getState,\n store.getState, // SSR fallback — same as client snapshot in our case.\n )\n}\n\n/**\n * Subscribe to a DERIVED slice of a core store — the component re-renders only\n * when `selector(state)` changes per `isEqual` (default `Object.is`), not on\n * every store emission. Built on {@link Store.subscribeWith}. Inline closures\n * for `selector`/`isEqual` are fine (captured via refs; the subscription is not\n * re-created between renders).\n */\nexport function useStoreSelector<T, U>(\n store: Store<T>,\n selector: (state: T) => U,\n isEqual?: (a: U, b: U) => boolean,\n): U {\n const [slice, setSlice] = React.useState(() => selector(store.getState()))\n const selRef = React.useRef(selector)\n selRef.current = selector\n const eqRef = React.useRef(isEqual)\n eqRef.current = isEqual\n React.useEffect(() => {\n const read = (s: T): U => selRef.current(s)\n const eq = (a: U, b: U): boolean => (eqRef.current ?? Object.is)(a, b)\n // Re-sync in case the store moved between render and this effect.\n setSlice((prev) => {\n const next = read(store.getState())\n return eq(prev, next) ? prev : next\n })\n return store.subscribeWith(read, setSlice, eq)\n }, [store])\n return slice\n}\n","import * as React from 'react'\nimport { createI18n, type I18n } from '@iris-ui-kit/core'\nimport { useStore } from '../useStore'\nimport { I18nContext } from './context'\n\nexport interface UseI18nReturn {\n locale: string\n t: I18n['t']\n formatDate: I18n['formatDate']\n formatNumber: I18n['formatNumber']\n formatRelativeTime: I18n['formatRelativeTime']\n setLocale: I18n['setLocale']\n setMessages: I18n['setMessages']\n}\n\n// Shared fallback so components can call `useI18n()` without an enclosing\n// provider — they get English defaults rather than throwing.\nlet fallbackI18n: I18n | null = null\nfunction getFallback(): I18n {\n if (fallbackI18n === null) fallbackI18n = createI18n()\n return fallbackI18n\n}\n\n/**\n * Reactive access to the active locale + translation/formatting helpers.\n * Re-renders the host when the locale or messages change. Works with or\n * without an `<IrisI18nProvider>` (falls back to English defaults).\n */\nexport function useI18n(): UseI18nReturn {\n const ctx = React.useContext(I18nContext)\n const i18n = ctx ?? getFallback()\n const state = useStore(i18n.store)\n\n return {\n locale: state.locale,\n t: i18n.t,\n formatDate: i18n.formatDate,\n formatNumber: i18n.formatNumber,\n formatRelativeTime: i18n.formatRelativeTime,\n setLocale: i18n.setLocale,\n setMessages: i18n.setMessages,\n }\n}\n","import * as React from 'react'\nimport { useI18n } from '../../i18n'\nimport { IrisInput, type IrisInputProps } from '../input/Input'\n\nexport interface IrisPasswordInputProps extends Omit<\n IrisInputProps,\n 'type' | 'prefix' | 'suffix' | 'children'\n> {\n /** Allow toggling visibility. Default true. */\n showToggle?: boolean\n /** Custom suffix slot (rendered before the toggle). */\n suffix?: React.ReactNode\n /** Custom prefix slot. */\n prefix?: React.ReactNode\n}\n\n/** React port of {@link import('@iris-ui-kit/vue').IrisPasswordInput}. */\nexport const IrisPasswordInput = React.forwardRef<HTMLInputElement, IrisPasswordInputProps>(\n function IrisPasswordInput(\n { showToggle = true, suffix, prefix, disabled, readOnly, ...rest },\n ref,\n ) {\n const { t } = useI18n()\n const [visible, setVisible] = React.useState(false)\n const toggle = () => {\n if (disabled || readOnly) return\n setVisible((v) => !v)\n }\n\n const toggleBtn = showToggle ? (\n <button\n type=\"button\"\n data-iris-password-input-toggle=\"\"\n aria-label={visible ? t('passwordInput.hide') : t('passwordInput.show')}\n aria-pressed={visible ? 'true' : 'false'}\n onClick={toggle}\n style={{\n background: 'transparent',\n border: 'none',\n cursor: disabled ? 'not-allowed' : 'pointer',\n color: 'var(--iris-muted)',\n padding: '0 var(--iris-space-xxs, 4px)',\n fontSize: 'var(--iris-font-size-sm, 13px)',\n lineHeight: 1,\n }}\n >\n {visible ? '🙈' : '👁'}\n </button>\n ) : null\n\n return (\n <IrisInput\n {...rest}\n ref={ref}\n type={visible ? 'text' : 'password'}\n disabled={disabled}\n readOnly={readOnly}\n prefix={prefix}\n suffix={\n <>\n {suffix}\n {toggleBtn}\n </>\n }\n data-iris-password-input=\"\"\n />\n )\n },\n)\n","import * as React from 'react'\n\nexport type IrisCheckboxSize = 'sm' | 'md' | 'lg'\nexport type IrisCheckboxValue = boolean | 'indeterminate'\n\nconst DIM_MAP: Record<IrisCheckboxSize, string> = {\n sm: '14px',\n md: '18px',\n lg: '22px',\n}\n\nexport interface IrisCheckboxProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'size' | 'value' | 'checked' | 'defaultChecked' | 'onChange'\n> {\n /** `true`, `false`, or `'indeterminate'`. */\n checked?: IrisCheckboxValue\n defaultChecked?: IrisCheckboxValue\n onChange?: (next: boolean, event: React.ChangeEvent<HTMLInputElement>) => void\n size?: IrisCheckboxSize\n invalid?: boolean\n ariaDescribedby?: string\n /** Label content rendered next to the box. */\n children?: React.ReactNode\n}\n\n/**\n * Tri-state checkbox supporting `true`, `false`, and `'indeterminate'`, in both\n * controlled (`checked`) and uncontrolled (`defaultChecked`) modes.\n *\n * @example\n * <IrisCheckbox checked={agreed} onChange={(next) => setAgreed(next)}>\n * I agree to the terms\n * </IrisCheckbox>\n */\nexport const IrisCheckbox = React.forwardRef<HTMLInputElement, IrisCheckboxProps>(\n function IrisCheckbox(\n {\n checked,\n defaultChecked = false,\n onChange,\n size = 'md',\n disabled = false,\n invalid = false,\n ariaDescribedby,\n children,\n style,\n ...rest\n },\n ref,\n ) {\n const [internalChecked, setInternalChecked] = React.useState<IrisCheckboxValue>(defaultChecked)\n const isControlled = checked !== undefined\n const value: IrisCheckboxValue = isControlled ? (checked as IrisCheckboxValue) : internalChecked\n\n const innerRef = React.useRef<HTMLInputElement | null>(null)\n React.useImperativeHandle(ref, () => innerRef.current as HTMLInputElement, [])\n\n // Sync `indeterminate` (it's a DOM-only attribute, not a JSX prop).\n React.useEffect(() => {\n const el = innerRef.current\n if (el) el.indeterminate = value === 'indeterminate'\n }, [value])\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return\n const next = e.target.checked\n if (!isControlled) setInternalChecked(next)\n onChange?.(next, e)\n }\n\n const state: 'checked' | 'unchecked' | 'indeterminate' =\n value === 'indeterminate' ? 'indeterminate' : value ? 'checked' : 'unchecked'\n\n const dim = DIM_MAP[size]\n\n const boxStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: dim,\n height: dim,\n borderRadius: 'var(--iris-radius-sm, 4px)',\n border: `1px solid ${state === 'unchecked' ? 'var(--iris-border)' : 'var(--iris-primary)'}`,\n background: state === 'unchecked' ? 'var(--iris-background)' : 'var(--iris-primary)',\n color: 'var(--iris-primary-foreground, #fff)',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.6 : 1,\n transition: 'background-color 120ms ease, border-color 120ms ease',\n flexShrink: 0,\n }\n\n const indicator = state === 'checked' ? '✓' : state === 'indeterminate' ? '—' : null\n\n return (\n <label\n data-iris-checkbox=\"\"\n data-iris-checkbox-size={size}\n data-state={state}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 8,\n cursor: disabled ? 'not-allowed' : 'pointer',\n userSelect: 'none',\n ...style,\n }}\n >\n <input\n {...rest}\n ref={innerRef}\n type=\"checkbox\"\n checked={value === true}\n disabled={disabled}\n aria-checked={\n state === 'indeterminate' ? 'mixed' : state === 'checked' ? 'true' : 'false'\n }\n aria-describedby={ariaDescribedby}\n aria-invalid={invalid ? 'true' : undefined}\n onChange={handleChange}\n style={{\n position: 'absolute',\n opacity: 0,\n width: 0,\n height: 0,\n pointerEvents: 'none',\n }}\n />\n <span aria-hidden=\"true\" style={boxStyle}>\n {indicator}\n </span>\n {children}\n </label>\n )\n },\n)\n","/**\n * Singleton stylesheet for the React `IrisButton`. Functionally identical to\n * the one in `@iris-ui-kit/vue` — both adapters end up writing the same DOM with\n * the same selectors, so the same CSS works. (Were we to ship both adapters\n * on the same page, the second installation would no-op because the\n * `<style id>` is shared.)\n */\nconst STYLE_ID = 'iris-button-styles'\n\nconst CSS = `\n.iris-button {\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--iris-gap-sm, 4px);\n font-family: inherit;\n font-weight: 500;\n line-height: 1.2;\n border-radius: var(--iris-radius-md, 6px);\n white-space: nowrap;\n user-select: none;\n position: relative;\n transition:\n background-color 120ms ease,\n border-color 120ms ease,\n color 120ms ease,\n filter 120ms ease;\n}\n.iris-button:focus-visible {\n outline: 2px solid var(--iris-primary);\n outline-offset: 2px;\n}\n.iris-button[disabled],\n.iris-button[aria-busy=\"true\"] {\n cursor: not-allowed;\n opacity: 0.6;\n}\n.iris-button[data-iris-button-variant=\"solid\"]:not([disabled]):not([aria-busy=\"true\"]):hover,\n.iris-button[data-iris-button-variant=\"danger\"]:not([disabled]):not([aria-busy=\"true\"]):hover {\n background: color-mix(in srgb, var(--iris-danger) 92%, var(--iris-surface));\n}\n.iris-button:not([disabled]):not([aria-busy=\"true\"]):active {\n transform: scale(0.98);\n}\n.iris-button[data-iris-button-variant=\"outline\"]:not([disabled]):not([aria-busy=\"true\"]):hover,\n.iris-button[data-iris-button-variant=\"ghost\"]:not([disabled]):not([aria-busy=\"true\"]):hover {\n background-color: var(--iris-surface-hover);\n}\n.iris-button[data-iris-button-variant=\"link\"]:not([disabled]):not([aria-busy=\"true\"]):hover {\n text-decoration: underline;\n}\n.iris-button-leading {\n display: inline-flex;\n align-items: center;\n}\n.iris-button-spinner {\n width: 1em;\n height: 1em;\n display: inline-block;\n animation: iris-button-spin 0.7s linear infinite;\n}\n@keyframes iris-button-spin {\n to { transform: rotate(360deg); }\n}\n`\n\nlet installed = false\n\nexport function installButtonStyles(): void {\n if (installed) return\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID)) {\n installed = true\n return\n }\n const style = document.createElement('style')\n style.id = STYLE_ID\n style.textContent = CSS\n document.head.appendChild(style)\n installed = true\n}\n\n/** Test-only reset. */\nexport function __resetButtonStyles(): void {\n installed = false\n if (typeof document === 'undefined') return\n document.getElementById(STYLE_ID)?.remove()\n}\n\nexport const __BUTTON_STYLE_ID = STYLE_ID\n","import {\n Children,\n cloneElement,\n isValidElement,\n useEffect,\n type ButtonHTMLAttributes,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type MouseEventHandler,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { composeEventHandlers } from '@iris-ui-kit/core'\nimport type { IrisButtonSize, IrisButtonType, IrisButtonVariant } from './types'\nimport { installButtonStyles } from './styles'\n\ntype StyleMap = Record<string, string>\n\nconst SIZE_STYLES: Record<IrisButtonSize, StyleMap> = {\n sm: {\n padding: 'var(--iris-padding-sm) var(--iris-padding-md)',\n fontSize: 'var(--iris-font-size-xs, 12px)',\n minHeight: 'var(--iris-control-height-sm, 28px)',\n },\n md: {\n padding: 'var(--iris-padding-sm) var(--iris-padding-lg)',\n fontSize: 'var(--iris-font-size-md, 14px)',\n minHeight: 'var(--iris-control-height-md, 34px)',\n },\n lg: {\n padding: 'var(--iris-padding-md) var(--iris-padding-lg)',\n fontSize: 'var(--iris-font-size-lg, 16px)',\n minHeight: 'var(--iris-control-height-lg, 40px)',\n },\n}\n\nconst VARIANT_STYLES: Record<IrisButtonVariant, StyleMap> = {\n solid: {\n background: 'var(--iris-primary)',\n color: 'var(--iris-primary-foreground)',\n border: '1px solid var(--iris-primary)',\n },\n outline: {\n background: 'transparent',\n color: 'var(--iris-primary)',\n border: '1px solid var(--iris-border)',\n },\n ghost: {\n background: 'transparent',\n color: 'var(--iris-foreground)',\n border: '1px solid transparent',\n },\n link: {\n background: 'transparent',\n color: 'var(--iris-primary)',\n border: '1px solid transparent',\n textDecoration: 'none',\n },\n danger: {\n background: 'var(--iris-danger)',\n color: 'var(--iris-on-color, #ffffff)',\n border: '1px solid var(--iris-danger)',\n },\n}\n\nfunction buildInlineStyle(variant: IrisButtonVariant, size: IrisButtonSize): CSSProperties {\n const base: StyleMap = { ...SIZE_STYLES[size], ...VARIANT_STYLES[variant] }\n if (variant === 'link') {\n base.padding = '0'\n delete base.minHeight\n }\n return base as CSSProperties\n}\n\nfunction Spinner() {\n return (\n <svg className=\"iris-button-spinner\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"3\" />\n <path\n d=\"M22 12a10 10 0 0 1-10 10\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n />\n </svg>\n )\n}\n\nexport interface IrisButtonProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'type' | 'disabled' | 'onClick' | 'className' | 'style' | 'children'\n> {\n variant?: IrisButtonVariant\n size?: IrisButtonSize\n disabled?: boolean\n loading?: boolean\n type?: IrisButtonType\n asChild?: boolean\n leading?: ReactNode\n children?: ReactNode\n className?: string\n style?: CSSProperties\n onClick?: MouseEventHandler<HTMLElement>\n}\n\n/**\n * Primary action button. Supports four variants (`solid`, `outline`, `ghost`,\n * `link`) and three sizes (`sm`, `md`, `lg`). Each variant is styled via\n * CSS custom properties (`var(--iris-primary)`, `var(--iris-border)` etc.)\n * so the button automatically adapts to the active theme/skin.\n *\n * When `loading` is true a spinner replaces the leading icon and clicks are\n * suppressed. Pass `asChild` to delegate rendering to a single child element\n * (e.g. `<IrisButton asChild><a href=\"…\">link</a></IrisButton>`).\n *\n * All unlisted HTML attributes (`aria-*`, `data-*`, `id`, etc.) are forwarded\n * to the root `<button>` element via `{...rest}`.\n *\n * @example\n * <IrisButton variant=\"solid\" onClick={() => save()}>Save</IrisButton>\n *\n * @example\n * <IrisButton variant=\"outline\" size=\"sm\" loading>Processing</IrisButton>\n *\n * @example\n * <IrisButton asChild><a href=\"/dashboard\">Dashboard</a></IrisButton>\n */\nexport function IrisButton({\n variant = 'solid',\n size = 'md',\n disabled = false,\n loading = false,\n type = 'button',\n asChild = false,\n leading,\n children,\n className,\n style,\n onClick,\n ...rest\n}: IrisButtonProps) {\n useEffect(() => {\n installButtonStyles()\n }, [])\n\n const isInteractive = !disabled && !loading\n\n const handleClick = (event: ReactMouseEvent<HTMLElement>) => {\n if (!isInteractive) {\n event.preventDefault()\n event.stopPropagation()\n return\n }\n onClick?.(event)\n }\n\n const baseProps = {\n className: ['iris-button', className].filter(Boolean).join(' '),\n 'data-iris-button-variant': variant,\n 'data-iris-button-size': size,\n 'aria-disabled': disabled ? ('true' as const) : undefined,\n 'aria-busy': loading ? ('true' as const) : undefined,\n style: { ...buildInlineStyle(variant, size), ...(style ?? {}) },\n }\n\n if (asChild) {\n const only = Children.only(children) as ReactElement | undefined\n if (!only || !isValidElement(only)) {\n if (typeof process === 'undefined' || process.env?.NODE_ENV !== 'production') {\n console.warn('[iris-ui] IrisButton: as-child requires a single React element child')\n }\n return null\n }\n const childProps = only.props as {\n className?: string\n style?: CSSProperties\n onClick?: MouseEventHandler<HTMLElement>\n }\n return cloneElement(only, {\n ...rest,\n ...baseProps,\n className: [baseProps.className, childProps.className].filter(Boolean).join(' '),\n style: { ...baseProps.style, ...(childProps.style ?? {}) },\n onClick: composeEventHandlers(\n handleClick as (e: ReactMouseEvent<HTMLElement>) => void,\n (childProps.onClick ?? (() => {})) as (e: ReactMouseEvent<HTMLElement>) => void,\n ),\n ...(isInteractive ? {} : { disabled: true }),\n } as Record<string, unknown>)\n }\n\n return (\n <button {...rest} type={type} disabled={!isInteractive} onClick={handleClick} {...baseProps}>\n {(loading || leading) && (\n <span className=\"iris-button-leading\">{loading ? <Spinner /> : leading}</span>\n )}\n {children}\n </button>\n )\n}\n","import * as React from 'react'\n\nexport interface IrisFormFieldProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n label?: string\n hint?: string\n error?: string\n required?: boolean\n /** Override the auto-generated control id. */\n labelFor?: string\n /** Visual size of the label. */\n size?: 'sm' | 'md'\n children?: React.ReactNode\n}\n\ntype InjectableProps = {\n id?: string\n invalid?: boolean\n ariaDescribedby?: string\n}\n\n/**\n * Form-field wrapper that handles the label / hint / error trio with the\n * right a11y plumbing. Non-invasive wrapper around any Iris input primitive\n * (`IrisInput`, `IrisTextarea`, `IrisNumberInput`, `IrisSwitch`, `IrisCheckbox`,\n * `IrisPasswordInput`, …): locates the first valid React element in `children`\n * and clones it with the generated `id`, `aria-describedby`, and `invalid`.\n *\n * ```tsx\n * <IrisFormField label=\"Email\" error={errors.email} hint=\"We never share it.\">\n * <IrisInput value={email} onChange={setEmail} />\n * </IrisFormField>\n * ```\n */\nexport const IrisFormField = React.forwardRef<HTMLDivElement, IrisFormFieldProps>(\n function IrisFormField(\n { label, hint, error, required = false, labelFor, size = 'md', style, children, ...rest },\n ref,\n ) {\n const generated = React.useId()\n const controlId = labelFor || `${generated}-control`\n const hintId = `${generated}-hint`\n const errorId = `${generated}-error`\n\n const describedBy = React.useMemo(() => {\n const ids: string[] = []\n if (hint && !error) ids.push(hintId)\n if (error) ids.push(errorId)\n return ids.length > 0 ? ids.join(' ') : undefined\n }, [hint, error, hintId, errorId])\n\n let injected = false\n const decorated = React.Children.map(children, (child) => {\n if (!injected && React.isValidElement(child)) {\n injected = true\n const injectedProps: InjectableProps = {\n id: controlId,\n invalid: error ? true : undefined,\n ariaDescribedby: describedBy,\n }\n return React.cloneElement(child, injectedProps as Partial<unknown> as React.Attributes)\n }\n return child\n })\n\n const labelStyle: React.CSSProperties = {\n fontSize: size === 'sm' ? '12px' : '14px',\n fontWeight: 500,\n color: error ? 'var(--iris-danger)' : 'var(--iris-foreground)',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n }\n\n return (\n <div\n {...rest}\n ref={ref}\n data-iris-form-field=\"\"\n data-iris-form-field-state={error ? 'invalid' : 'valid'}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '4px',\n ...style,\n }}\n >\n {label ? (\n <label htmlFor={controlId} data-iris-form-field-label=\"\" style={labelStyle}>\n {label}\n {required ? (\n <span\n aria-hidden=\"true\"\n data-iris-form-field-required=\"\"\n style={{ color: 'var(--iris-danger)' }}\n >\n *\n </span>\n ) : null}\n </label>\n ) : null}\n {decorated}\n {hint && !error ? (\n <div\n id={hintId}\n data-iris-form-field-hint=\"\"\n style={{ fontSize: 'var(--iris-font-size-xs, 12px)', color: 'var(--iris-muted)' }}\n >\n {hint}\n </div>\n ) : null}\n {error ? (\n <div\n id={errorId}\n data-iris-form-field-error=\"\"\n role=\"alert\"\n style={{ fontSize: 'var(--iris-font-size-xs, 12px)', color: 'var(--iris-danger)' }}\n >\n {error}\n </div>\n ) : null}\n </div>\n )\n },\n)\n","import * as React from 'react'\nimport { useI18n } from '../../i18n'\n\nexport type IrisAlertTone = 'info' | 'success' | 'warning' | 'danger'\n\nconst TONE_TO_VAR: Record<IrisAlertTone, string> = {\n info: '--iris-info',\n success: '--iris-success',\n warning: '--iris-warning',\n danger: '--iris-danger',\n}\n\nexport interface IrisAlertProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n tone?: IrisAlertTone\n title?: React.ReactNode\n closable?: boolean\n open?: boolean\n onClose?: () => void\n icon?: React.ReactNode\n children?: React.ReactNode\n}\n\n/**\n * React port of {@link import('@iris-ui-kit/vue').IrisAlert}.\n *\n * @example\n * <IrisAlert tone=\"warning\" title=\"Heads up\" closable onClose={dismiss}>\n * Your session expires soon.\n * </IrisAlert>\n */\nexport function IrisAlert({\n tone = 'info',\n title,\n closable = false,\n open,\n onClose,\n icon,\n children,\n style,\n ...rest\n}: IrisAlertProps): React.ReactElement | null {\n const { t } = useI18n()\n const [internalOpen, setInternalOpen] = React.useState(true)\n React.useEffect(() => {\n if (open !== undefined) setInternalOpen(open)\n }, [open])\n\n const isOpen = open !== undefined ? open : internalOpen\n if (!isOpen) return null\n\n const tonalVar = `var(${TONE_TO_VAR[tone]})`\n\n const handleClose = () => {\n if (open === undefined) setInternalOpen(false)\n onClose?.()\n }\n\n return (\n <div\n {...rest}\n role={tone === 'danger' || tone === 'warning' ? 'alert' : 'status'}\n data-iris-alert=\"\"\n data-iris-alert-tone={tone}\n style={{\n display: 'flex',\n gap: 'var(--iris-gap-md, 12px)',\n padding: 'var(--iris-padding-md, 12px)',\n borderRadius: 'var(--iris-radius-md, 6px)',\n border: `1px solid ${tonalVar}`,\n // `backgroundColor` is the precomputed fallback under color-mix (engines\n // without it); the `background` shorthand overrides with the exact mix.\n backgroundColor: `var(${TONE_TO_VAR[tone]}-subtle)`,\n background: `color-mix(in srgb, ${tonalVar} 10%, var(--iris-background))`,\n color: 'var(--iris-foreground)',\n alignItems: 'flex-start',\n ...style,\n }}\n >\n {icon ? (\n <span\n data-iris-alert-icon=\"\"\n style={{ color: tonalVar, flexShrink: 0, display: 'inline-flex' }}\n >\n {icon}\n </span>\n ) : null}\n <div data-iris-alert-body=\"\" style={{ flex: 1, minWidth: 0 }}>\n {title ? (\n <div\n data-iris-alert-title=\"\"\n style={{ fontWeight: 600, marginBottom: 4, color: tonalVar }}\n >\n {title}\n </div>\n ) : null}\n <div data-iris-alert-content=\"\">{children}</div>\n </div>\n {closable ? (\n <button\n type=\"button\"\n data-iris-alert-close=\"\"\n aria-label={t('alert.close')}\n onClick={handleClose}\n style={{\n background: 'transparent',\n border: 'none',\n cursor: 'pointer',\n color: 'var(--iris-muted)',\n fontSize: 'var(--iris-font-size-lg, 16px)',\n padding: 0,\n lineHeight: 1,\n flexShrink: 0,\n }}\n >\n ✕\n </button>\n ) : null}\n </div>\n )\n}\n","import * as React from 'react'\n\nexport type IrisDividerOrientation = 'horizontal' | 'vertical'\nexport type IrisDividerSpacing = 'sm' | 'md' | 'lg'\n\nconst SPACING_MAP: Record<IrisDividerSpacing, string> = {\n sm: '8px',\n md: '16px',\n lg: '24px',\n}\n\nexport interface IrisDividerProps extends Omit<React.HTMLAttributes<HTMLElement>, 'children'> {\n orientation?: IrisDividerOrientation\n label?: React.ReactNode\n spacing?: IrisDividerSpacing\n children?: React.ReactNode\n}\n\n/** React port of {@link import('@iris-ui-kit/vue').IrisDivider}. */\nexport function IrisDivider({\n orientation = 'horizontal',\n label,\n spacing = 'md',\n children,\n style,\n ...rest\n}: IrisDividerProps): React.ReactElement {\n const isHorizontal = orientation === 'horizontal'\n const hasLabel = Boolean(label || children)\n\n if (isHorizontal && !hasLabel) {\n return (\n <hr\n {...rest}\n data-iris-divider=\"\"\n data-iris-divider-orientation=\"horizontal\"\n style={{\n border: 'none',\n borderTop: '1px solid var(--iris-border)',\n margin: `${SPACING_MAP[spacing]} 0`,\n width: '100%',\n ...style,\n }}\n />\n )\n }\n\n if (!isHorizontal) {\n return (\n <div\n {...rest}\n role=\"separator\"\n aria-orientation=\"vertical\"\n data-iris-divider=\"\"\n data-iris-divider-orientation=\"vertical\"\n style={{\n display: 'inline-block',\n width: 1,\n alignSelf: 'stretch',\n background: 'var(--iris-border)',\n margin: `0 ${SPACING_MAP[spacing]}`,\n ...style,\n }}\n />\n )\n }\n\n return (\n <div\n {...rest}\n role=\"separator\"\n aria-orientation=\"horizontal\"\n data-iris-divider=\"\"\n data-iris-divider-orientation=\"horizontal\"\n data-iris-divider-has-label=\"true\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n margin: `${SPACING_MAP[spacing]} 0`,\n color: 'var(--iris-muted)',\n fontSize: 'var(--iris-font-size-xs, 12px)',\n textTransform: 'uppercase',\n letterSpacing: 'var(--iris-letter-spacing-wide, 0.04em)',\n ...style,\n }}\n >\n <span data-iris-divider-line=\"before\" style={lineStyle} />\n <span data-iris-divider-label=\"\">{children ?? label}</span>\n <span data-iris-divider-line=\"after\" style={lineStyle} />\n </div>\n )\n}\n\nconst lineStyle: React.CSSProperties = {\n flex: 1,\n height: 1,\n background: 'var(--iris-border)',\n}\n","import * as React from 'react'\nimport { IrisStack } from '../layouts/Stack'\nimport { IrisContainer } from '../layouts/Container'\nimport { IrisInput } from '../primitives/input/Input'\nimport { IrisPasswordInput } from '../primitives/password-input/PasswordInput'\nimport { IrisCheckbox } from '../primitives/checkbox/Checkbox'\nimport { IrisButton } from '../primitives/button/Button'\nimport { IrisFormField } from '../primitives/form-field/FormField'\nimport { IrisAlert } from '../primitives/alert/Alert'\nimport { IrisDivider } from '../primitives/divider/Divider'\n\nexport interface IrisLoginSubmitPayload {\n email: string\n password: string\n remember: boolean\n}\n\nexport interface IrisLoginTemplateProps {\n title?: string\n description?: string\n showRemember?: boolean\n error?: string\n submitLabel?: string\n loading?: boolean\n /** Custom header replaces title/description block. */\n header?: React.ReactNode\n /** Slot for \"Forgot password?\" link (rendered next to Remember checkbox). */\n forgot?: React.ReactNode\n /** Content rendered below the form (separated by a divider). */\n footer?: React.ReactNode\n onSubmit?: (payload: IrisLoginSubmitPayload) => void\n style?: React.CSSProperties\n className?: string\n}\n\n/**\n * Layer 4 system skeleton: centered login page composed from Iris primitives.\n */\nexport function IrisLoginTemplate({\n title = 'Sign in',\n description = '',\n showRemember = true,\n error = '',\n submitLabel = 'Sign in',\n loading = false,\n header,\n forgot,\n footer,\n onSubmit,\n style,\n className,\n}: IrisLoginTemplateProps): React.ReactElement {\n const [email, setEmail] = React.useState('')\n const [password, setPassword] = React.useState('')\n const [remember, setRemember] = React.useState(false)\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n onSubmit?.({ email, password, remember })\n }\n\n return (\n <div\n data-iris-login-template=\"\"\n className={className}\n style={{\n minHeight: '100vh',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'var(--iris-background)',\n color: 'var(--iris-foreground)',\n padding: 24,\n ...style,\n }}\n >\n <IrisContainer maxWidth=\"420px\" padding={0}>\n <form\n onSubmit={handleSubmit}\n data-iris-login-form=\"\"\n style={{\n background: 'var(--iris-surface)',\n border: '1px solid var(--iris-border)',\n borderRadius: 'var(--iris-radius-lg, 8px)',\n padding: 32,\n boxShadow: 'var(--iris-shadow-md)',\n }}\n >\n <IrisStack spacing=\"lg\">\n {header ?? (\n <div style={{ textAlign: 'center' }}>\n <h1\n style={{\n margin: '0 0 4px 0',\n fontSize: 'var(--iris-font-size-2xl, 20px)',\n fontWeight: 700,\n }}\n >\n {title}\n </h1>\n {description ? (\n <p\n style={{\n margin: 0,\n color: 'var(--iris-muted)',\n fontSize: 'var(--iris-font-size-md, 14px)',\n }}\n >\n {description}\n </p>\n ) : null}\n </div>\n )}\n {error ? <IrisAlert tone=\"danger\" title={error} /> : null}\n <IrisFormField label=\"Email\" required>\n <IrisInput\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n disabled={loading}\n autoComplete=\"email\"\n />\n </IrisFormField>\n <IrisFormField label=\"Password\" required>\n <IrisPasswordInput\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Enter your password\"\n disabled={loading}\n autoComplete=\"current-password\"\n />\n </IrisFormField>\n {showRemember ? (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n <IrisCheckbox\n checked={remember}\n onChange={(next) => setRemember(next)}\n disabled={loading}\n >\n Remember me\n </IrisCheckbox>\n {forgot ?? null}\n </div>\n ) : null}\n <IrisButton type=\"submit\" variant=\"solid\" loading={loading} style={{ width: '100%' }}>\n {submitLabel}\n </IrisButton>\n {footer ? (\n <div>\n <IrisDivider spacing=\"md\" label=\"or\" />\n {footer}\n </div>\n ) : null}\n </IrisStack>\n </form>\n </IrisContainer>\n </div>\n )\n}\n","import * as React from 'react'\n\nexport interface IrisSidebarLayoutSidebarState {\n collapsed: boolean\n setCollapsed: (next: boolean) => void\n}\n\nexport interface IrisSidebarLayoutProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n> {\n collapsed?: boolean\n defaultCollapsed?: boolean\n onCollapsedChange?: (next: boolean) => void\n /** Sidebar width when expanded (px or CSS length). */\n width?: number | string\n /** Sidebar width when collapsed. */\n collapsedWidth?: number | string\n side?: 'left' | 'right'\n /** Sidebar content. May be a render function that receives `{ collapsed, setCollapsed }`. */\n sidebar?: React.ReactNode | ((state: IrisSidebarLayoutSidebarState) => React.ReactNode)\n children?: React.ReactNode\n}\n\nfunction asLen(v: number | string): string {\n return typeof v === 'number' ? `${v}px` : v\n}\n\n/**\n * Two-column layout with a collapsible sidebar. The sidebar is kept mounted\n * across collapses (only its width animates) so component state survives.\n */\nexport function IrisSidebarLayout({\n collapsed: collapsedProp,\n defaultCollapsed = false,\n onCollapsedChange,\n width = 240,\n collapsedWidth = 60,\n side = 'left',\n sidebar,\n style,\n children,\n ...rest\n}: IrisSidebarLayoutProps): React.ReactElement {\n const isControlled = collapsedProp !== undefined\n const [internal, setInternal] = React.useState(defaultCollapsed)\n const collapsed = isControlled ? Boolean(collapsedProp) : internal\n\n const setCollapsed = React.useCallback(\n (next: boolean) => {\n if (!isControlled) setInternal(next)\n onCollapsedChange?.(next)\n },\n [isControlled, onCollapsedChange],\n )\n\n const sidebarContent =\n typeof sidebar === 'function'\n ? (sidebar as (s: IrisSidebarLayoutSidebarState) => React.ReactNode)({\n collapsed,\n setCollapsed,\n })\n : sidebar\n\n const sidebarStyle: React.CSSProperties = {\n width: collapsed ? asLen(collapsedWidth) : asLen(width),\n flexShrink: 0,\n background: 'var(--iris-surface)',\n borderRight: side === 'left' ? '1px solid var(--iris-border)' : 'none',\n borderLeft: side === 'right' ? '1px solid var(--iris-border)' : 'none',\n transition: 'width 180ms ease',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n }\n\n return (\n <div\n {...rest}\n data-iris-sidebar-layout=\"\"\n data-collapsed={collapsed ? '' : undefined}\n data-side={side}\n style={{\n display: 'flex',\n flexDirection: side === 'right' ? 'row-reverse' : 'row',\n width: '100%',\n height: '100%',\n minHeight: 0,\n color: 'var(--iris-foreground)',\n ...style,\n }}\n >\n <aside\n role=\"complementary\"\n data-iris-sidebar=\"\"\n data-collapsed={collapsed ? '' : undefined}\n style={sidebarStyle}\n >\n {sidebarContent}\n </aside>\n <div\n data-iris-sidebar-main=\"\"\n style={{\n flex: 1,\n minWidth: 0,\n overflow: 'auto',\n background: 'var(--iris-background)',\n }}\n >\n {children}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\n\nexport interface IrisHeaderLayoutProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n> {\n /** Header height (px or CSS length). Default `'auto'`. */\n headerHeight?: number | string\n /** Footer height (px or CSS length). Default `'auto'`. */\n footerHeight?: number | string\n /** Header sticks via `position: sticky` instead of static. Default true. */\n sticky?: boolean\n header?: React.ReactNode\n footer?: React.ReactNode\n children?: React.ReactNode\n}\n\nfunction asLen(v: number | string): string {\n return typeof v === 'number' ? `${v}px` : v\n}\n\n/**\n * Two- (or three-) region vertical layout: a sticky header on top, a\n * scrollable main region, and an optional footer.\n */\nexport function IrisHeaderLayout({\n headerHeight = 'auto',\n footerHeight = 'auto',\n sticky = true,\n header,\n footer,\n style,\n children,\n ...rest\n}: IrisHeaderLayoutProps): React.ReactElement {\n return (\n <div\n {...rest}\n data-iris-header-layout=\"\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n height: '100%',\n minHeight: 0,\n background: 'var(--iris-background)',\n color: 'var(--iris-foreground)',\n ...style,\n }}\n >\n {header ? (\n <header\n role=\"banner\"\n data-iris-header=\"\"\n style={{\n flexShrink: 0,\n height: asLen(headerHeight),\n borderBottom: '1px solid var(--iris-border)',\n background: 'var(--iris-surface)',\n position: sticky ? 'sticky' : 'static',\n top: 0,\n zIndex: 50,\n }}\n >\n {header}\n </header>\n ) : null}\n <main\n role=\"main\"\n data-iris-header-main=\"\"\n style={{ flex: 1, minHeight: 0, overflow: 'auto' }}\n >\n {children}\n </main>\n {footer ? (\n <footer\n role=\"contentinfo\"\n data-iris-footer=\"\"\n style={{\n flexShrink: 0,\n height: asLen(footerHeight),\n borderTop: '1px solid var(--iris-border)',\n background: 'var(--iris-surface)',\n }}\n >\n {footer}\n </footer>\n ) : null}\n </div>\n )\n}\n","import * as React from 'react'\n\nexport interface IrisDashboardGridProps extends React.HTMLAttributes<HTMLDivElement> {\n columns?: number\n gap?: number | string\n /** Use `repeat(auto-fill, minmax(<minColWidth>, 1fr))` instead of fixed `columns`. */\n minColWidth?: number | string\n}\n\n/**\n * 12-column responsive grid for dashboard composition. Each child controls\n * its span via `gridColumn` style or by wrapping with `IrisDashboardCard`.\n */\nexport function IrisDashboardGrid({\n columns = 12,\n gap = 16,\n minColWidth,\n style,\n children,\n ...rest\n}: IrisDashboardGridProps): React.ReactElement {\n const gapCss = typeof gap === 'number' ? `${gap}px` : gap\n const gridTemplateColumns = minColWidth\n ? `repeat(auto-fill, minmax(${\n typeof minColWidth === 'number' ? `${minColWidth}px` : minColWidth\n }, 1fr))`\n : `repeat(${columns}, 1fr)`\n\n return (\n <div\n {...rest}\n data-iris-dashboard-grid=\"\"\n style={{\n display: 'grid',\n gap: gapCss,\n gridTemplateColumns,\n width: '100%',\n ...style,\n }}\n >\n {children}\n </div>\n )\n}\n\nexport interface IrisDashboardCardProps extends React.HTMLAttributes<HTMLDivElement> {\n colSpan?: number | 'full'\n rowSpan?: number\n /** Show the styled card surface (background + border). Default true. */\n surface?: boolean\n}\n\n/**\n * A single dashboard grid cell. `colSpan='full'` makes it fill the row.\n */\nexport function IrisDashboardCard({\n colSpan = 1,\n rowSpan = 1,\n surface = true,\n style,\n children,\n ...rest\n}: IrisDashboardCardProps): React.ReactElement {\n const gridColumn = colSpan === 'full' ? '1 / -1' : `span ${colSpan}`\n const gridRow = rowSpan > 1 ? `span ${rowSpan}` : undefined\n\n return (\n <div\n {...rest}\n data-iris-dashboard-card=\"\"\n style={{\n gridColumn,\n gridRow,\n background: surface ? 'var(--iris-surface)' : 'transparent',\n border: surface ? '1px solid var(--iris-border)' : 'none',\n borderRadius: 'var(--iris-radius-md, 6px)',\n padding: surface ? 'var(--iris-padding-lg, 20px)' : 0,\n minWidth: 0,\n ...style,\n }}\n >\n {children}\n </div>\n )\n}\n","import * as React from 'react'\nimport { IrisSidebarLayout, type IrisSidebarLayoutSidebarState } from '../layouts/SidebarLayout'\nimport { IrisHeaderLayout } from '../layouts/HeaderLayout'\nimport { IrisDashboardGrid, IrisDashboardCard } from '../layouts/DashboardGrid'\nimport { IrisStack } from '../layouts/Stack'\n\nexport interface IrisDashboardNavItem {\n id: string\n label: string\n icon?: React.ReactNode\n}\n\nexport interface IrisDashboardCardSpec {\n id: string\n title: string\n colSpan?: number | 'full'\n rowSpan?: number\n body?: React.ReactNode\n}\n\nexport interface IrisDashboardTemplateProps {\n title?: string\n sidebarTitle?: string\n nav?: IrisDashboardNavItem[]\n activeId?: string\n onActiveIdChange?: (id: string) => void\n cards?: IrisDashboardCardSpec[]\n defaultCollapsed?: boolean\n onCollapsedChange?: (next: boolean) => void\n /** Custom header content (replaces default title). */\n header?: React.ReactNode\n /** Custom sidebar header. Receives `{ collapsed, setCollapsed }`. */\n sidebarHeader?: (state: IrisSidebarLayoutSidebarState) => React.ReactNode\n /** Custom main body content (replaces default grid). */\n children?: React.ReactNode\n /** Per-card body override, keyed by card id. */\n cardSlots?: Record<string, React.ReactNode>\n style?: React.CSSProperties\n className?: string\n}\n\n/**\n * Layer 4 system skeleton: 3-region dashboard shell — sidebar + header +\n * main grid. Built from `IrisSidebarLayout` + `IrisHeaderLayout` +\n * `IrisDashboardGrid`.\n */\nexport function IrisDashboardTemplate({\n title = 'Dashboard',\n sidebarTitle = '',\n nav = [],\n activeId = '',\n onActiveIdChange,\n cards = [],\n defaultCollapsed = false,\n onCollapsedChange,\n header,\n sidebarHeader,\n children,\n cardSlots,\n style,\n className,\n}: IrisDashboardTemplateProps): React.ReactElement {\n const [collapsed, setCollapsed] = React.useState(defaultCollapsed)\n\n const handleCollapsed = (next: boolean) => {\n setCollapsed(next)\n onCollapsedChange?.(next)\n }\n\n return (\n <div\n data-iris-dashboard-template=\"\"\n className={className}\n style={{\n width: '100%',\n height: '100vh',\n background: 'var(--iris-background)',\n color: 'var(--iris-foreground)',\n ...style,\n }}\n >\n <IrisSidebarLayout\n collapsed={collapsed}\n onCollapsedChange={handleCollapsed}\n width={240}\n collapsedWidth={64}\n sidebar={(state) => (\n <IrisStack spacing=\"sm\" style={{ padding: 12 }}>\n {sidebarHeader ? (\n sidebarHeader(state)\n ) : sidebarTitle ? (\n <div\n style={{\n padding: '8px 12px',\n fontSize: 'var(--iris-font-size-md, 14px)',\n fontWeight: 600,\n color: 'var(--iris-foreground)',\n opacity: state.collapsed ? 0 : 1,\n transition: 'opacity 120ms ease',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n }}\n >\n {sidebarTitle}\n </div>\n ) : null}\n <nav\n aria-label=\"Primary\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--iris-space-xxs, 4px)',\n }}\n >\n {nav.map((item) => {\n const isActive = item.id === activeId\n return (\n <button\n key={item.id}\n type=\"button\"\n data-iris-dashboard-nav-item={item.id}\n data-iris-dashboard-nav-active={isActive ? 'true' : undefined}\n onClick={() => onActiveIdChange?.(item.id)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--iris-space-sm, 12px)',\n padding: '8px 12px',\n background: isActive ? 'var(--iris-primary)' : 'transparent',\n color: isActive\n ? 'var(--iris-primary-foreground, #fff)'\n : 'var(--iris-foreground)',\n border: 'none',\n borderRadius: 'var(--iris-radius-sm, 4px)',\n cursor: 'pointer',\n fontSize: 'var(--iris-font-size-md, 14px)',\n fontFamily: 'inherit',\n textAlign: 'start',\n outline: 'none',\n }}\n >\n {item.icon ? (\n <span\n aria-hidden=\"true\"\n style={{ width: 16, display: 'inline-flex', justifyContent: 'center' }}\n >\n {item.icon}\n </span>\n ) : null}\n <span\n style={{\n opacity: state.collapsed ? 0 : 1,\n transition: 'opacity 120ms ease',\n whiteSpace: 'nowrap',\n }}\n >\n {item.label}\n </span>\n </button>\n )\n })}\n </nav>\n </IrisStack>\n )}\n >\n <IrisHeaderLayout\n header={\n header ?? (\n <div\n style={{\n padding: '12px 20px',\n fontSize: 'var(--iris-font-size-lg, 16px)',\n fontWeight: 600,\n }}\n >\n {title}\n </div>\n )\n }\n >\n {children ?? (\n <div style={{ padding: 20 }}>\n <IrisDashboardGrid columns={12} gap={16}>\n {cards.map((card) => (\n <IrisDashboardCard\n key={card.id}\n colSpan={card.colSpan ?? 4}\n rowSpan={card.rowSpan ?? 1}\n data-iris-dashboard-card-id={card.id}\n >\n <h3\n style={{\n margin: '0 0 8px 0',\n fontSize: 'var(--iris-font-size-md, 14px)',\n fontWeight: 600,\n color: 'var(--iris-foreground)',\n }}\n >\n {card.title}\n </h3>\n {cardSlots?.[card.id] !== undefined ? (\n cardSlots[card.id]\n ) : card.body ? (\n <div\n style={{\n fontSize: 'var(--iris-font-size-sm, 13px)',\n color: 'var(--iris-muted)',\n }}\n >\n {card.body}\n </div>\n ) : null}\n </IrisDashboardCard>\n ))}\n </IrisDashboardGrid>\n </div>\n )}\n </IrisHeaderLayout>\n </IrisSidebarLayout>\n </div>\n )\n}\n"]}
package/dist/skeletons.js CHANGED
@@ -1,5 +1,5 @@
1
1
  'use client'
2
- export { IrisDashboardTemplate, IrisLoginTemplate } from './chunk-V3KHE2WB.js';
2
+ export { IrisDashboardTemplate, IrisLoginTemplate } from './chunk-QKDOW7FG.js';
3
3
  import './chunk-ZKBDUWUD.js';
4
4
  import './chunk-J5FB2UB2.js';
5
5
  import './chunk-OMOTUHYI.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iris-ui-kit/react",
3
- "version": "0.2.3",
3
+ "version": "0.3.1",
4
4
  "description": "React 18/19 adapter for Iris UI — full component set",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -48,6 +48,11 @@
48
48
  "import": "./dist/form.js",
49
49
  "require": "./dist/form.cjs"
50
50
  },
51
+ "./grid": {
52
+ "types": "./dist/grid.d.ts",
53
+ "import": "./dist/grid.js",
54
+ "require": "./dist/grid.cjs"
55
+ },
51
56
  "./i18n": {
52
57
  "types": "./dist/i18n.d.ts",
53
58
  "import": "./dist/i18n.js",
@@ -104,21 +109,13 @@
104
109
  "dist"
105
110
  ],
106
111
  "sideEffects": false,
107
- "scripts": {
108
- "build": "tsup",
109
- "dev": "tsup --watch",
110
- "test": "vitest run",
111
- "typecheck": "tsc --noEmit",
112
- "lint": "eslint src",
113
- "clean": "rm -rf dist .turbo"
114
- },
115
112
  "dependencies": {
116
113
  "@floating-ui/dom": "^1.7.6",
117
- "@iris-ui-kit/core": "workspace:*",
118
- "@iris-ui-kit/icons": "workspace:*",
119
- "@iris-ui-kit/skins": "workspace:*",
120
- "@iris-ui-kit/theme": "workspace:*",
121
- "@iris-ui-kit/tokens": "workspace:*"
114
+ "@iris-ui-kit/core": "0.2.5",
115
+ "@iris-ui-kit/icons": "0.2.1",
116
+ "@iris-ui-kit/theme": "0.3.1",
117
+ "@iris-ui-kit/skins": "0.1.1",
118
+ "@iris-ui-kit/tokens": "0.3.0"
122
119
  },
123
120
  "peerDependencies": {
124
121
  "react": "^18.0.0 || ^19.0.0",
@@ -137,5 +134,13 @@
137
134
  },
138
135
  "publishConfig": {
139
136
  "access": "public"
137
+ },
138
+ "scripts": {
139
+ "build": "tsup",
140
+ "dev": "tsup --watch",
141
+ "test": "vitest run",
142
+ "typecheck": "tsc --noEmit",
143
+ "lint": "eslint src",
144
+ "clean": "rm -rf dist .turbo"
140
145
  }
141
- }
146
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/modal-utils/useBodyScrollLock.ts","../src/modal-utils/useFocusTrap.ts"],"names":["React","active"],"mappings":"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","file":"chunk-AUA5GBT6.js","sourcesContent":["import * as React from 'react'\n\nlet lockCount = 0\nlet savedOverflow: string | null = null\nlet savedPaddingRight: string | null = null\n// What we actually wrote, so unlock can detect a host mutation made while\n// locked and avoid clobbering it.\nlet appliedOverflow: string | null = null\nlet appliedPaddingRight: string | null = null\n\nfunction lock(): void {\n if (typeof document === 'undefined') return\n lockCount += 1\n if (lockCount > 1) return\n const body = document.body\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\n savedOverflow = body.style.overflow\n savedPaddingRight = body.style.paddingRight\n body.style.overflow = 'hidden'\n appliedOverflow = 'hidden'\n if (scrollbarWidth > 0) {\n const currentPadding = parseFloat(getComputedStyle(body).paddingRight || '0')\n appliedPaddingRight = `${currentPadding + scrollbarWidth}px`\n body.style.paddingRight = appliedPaddingRight\n } else {\n appliedPaddingRight = null\n }\n}\n\nfunction unlock(): void {\n if (typeof document === 'undefined') return\n lockCount = Math.max(0, lockCount - 1)\n if (lockCount > 0) return\n const body = document.body\n // Only restore if our locked value is still in place; if a host changed body\n // overflow / padding-right while locked, respect that rather than clobber it.\n if (body.style.overflow === appliedOverflow) {\n body.style.overflow = savedOverflow ?? ''\n }\n if (appliedPaddingRight !== null && body.style.paddingRight === appliedPaddingRight) {\n body.style.paddingRight = savedPaddingRight ?? ''\n }\n savedOverflow = null\n savedPaddingRight = null\n appliedOverflow = null\n appliedPaddingRight = null\n}\n\n/**\n * Lock the document body's scroll while `active` is true. Reference-counted\n * so multiple stacked overlays cooperate. Restores prior `overflow` and\n * `padding-right` (to compensate for the scrollbar gap) when the last lock\n * releases. SSR-safe.\n */\nexport function useBodyScrollLock(active: boolean): void {\n React.useEffect(() => {\n if (!active) return\n lock()\n return () => {\n unlock()\n }\n }, [active])\n}\n\n/** Test-only: read the current lock count. */\nexport function __getBodyScrollLockCount(): number {\n return lockCount\n}\n\n/** Test-only: hard-reset the module-level lock state. */\nexport function __resetBodyScrollLock(): void {\n lockCount = 0\n savedOverflow = null\n savedPaddingRight = null\n appliedOverflow = null\n appliedPaddingRight = null\n if (typeof document !== 'undefined') {\n document.body.style.overflow = ''\n document.body.style.paddingRight = ''\n }\n}\n","import * as React from 'react'\n\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'area[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n 'audio[controls]',\n 'video[controls]',\n 'iframe',\n 'object',\n 'embed',\n].join(',')\n\nfunction getFocusable(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\n (el) => !el.hasAttribute('disabled') && el.tabIndex !== -1,\n )\n}\n\nexport interface UseFocusTrapOptions {\n /** Element whose Tab key cycle is being trapped. */\n container: React.RefObject<HTMLElement | null>\n /** Whether the trap is currently active. */\n active: boolean\n /** Element to restore focus to when the trap deactivates. */\n returnFocusTo?: React.RefObject<HTMLElement | null | undefined>\n /** Whether to focus the first focusable element on activation. Default `true`. */\n initialFocus?: boolean\n}\n\n/**\n * Constrain Tab / Shift+Tab focus traversal to descendants of `container`.\n *\n * Behavior on activation:\n * - Records the currently focused element.\n * - If `initialFocus !== false`, focuses the first focusable descendant\n * (or the container itself if there are none).\n *\n * Behavior while active:\n * - Tab on the last focusable element wraps to the first; Shift+Tab on\n * the first wraps to the last.\n *\n * Behavior on deactivation:\n * - Restores focus to `returnFocusTo?.current` if provided, else to the\n * element that was focused when the trap activated.\n */\nexport function useFocusTrap(options: UseFocusTrapOptions): void {\n const { container, active, returnFocusTo, initialFocus = true } = options\n const previouslyFocusedRef = React.useRef<HTMLElement | null>(null)\n\n React.useEffect(() => {\n if (!active) return\n if (typeof document === 'undefined') return\n\n previouslyFocusedRef.current = (document.activeElement as HTMLElement | null) ?? null\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return\n const root = container.current\n if (!root) return\n const focusables = getFocusable(root)\n if (focusables.length === 0) {\n event.preventDefault()\n root.focus()\n return\n }\n const first = focusables[0]!\n const last = focusables[focusables.length - 1]!\n const active = document.activeElement as HTMLElement | null\n\n if (event.shiftKey) {\n if (active === first || !root.contains(active)) {\n event.preventDefault()\n last.focus()\n }\n } else {\n if (active === last || !root.contains(active)) {\n event.preventDefault()\n first.focus()\n }\n }\n }\n document.addEventListener('keydown', onKeyDown)\n\n let raf: number | undefined\n if (initialFocus) {\n raf = requestAnimationFrame(() => {\n const root = container.current\n if (!root) return\n const focusables = getFocusable(root)\n ;(focusables[0] ?? root).focus()\n })\n }\n\n return () => {\n document.removeEventListener('keydown', onKeyDown)\n if (raf !== undefined) cancelAnimationFrame(raf)\n const target = returnFocusTo?.current ?? previouslyFocusedRef.current\n requestAnimationFrame(() => {\n // The element that had focus when the trap opened may have been\n // unmounted while it was open; focusing a detached node silently drops\n // focus to <body>. Only restore if it is still in the document.\n if (target && target.isConnected) target.focus?.()\n })\n previouslyFocusedRef.current = null\n }\n }, [active, container, returnFocusTo, initialFocus])\n}\n"]}