@a13y/react 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +241 -0
- package/dist/components/index.d.ts +374 -0
- package/dist/components/index.js +849 -0
- package/dist/components/index.js.map +1 -0
- package/dist/hooks/index.d.ts +725 -0
- package/dist/hooks/index.js +648 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +1875 -0
- package/dist/index.js.map +1 -0
- package/dist/patterns/index.d.ts +539 -0
- package/dist/patterns/index.js +1170 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/use-accessible-button-B0syf-Az.d.ts +83 -0
- package/package.json +101 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/use-accessible-button.ts","../../src/components/AccessibleButton.tsx","../../src/hooks/use-focus-trap.ts","../../src/hooks/use-accessible-dialog.ts","../../src/components/AccessibleDialog.tsx","../../src/hooks/use-keyboard-navigation.ts","../../src/components/AccessibleMenu.tsx","../../src/components/AccessibleModal.tsx","../../src/components/AccessibleTabs.tsx"],"names":["useRef","useEffect","jsx","useCallback","useState","jsxs","Fragment"],"mappings":";;;AAyFO,IAAM,mBAAA,GAAsB,CAAC,KAAA,KAA+D;AACjG,EAAA,MAAM,EAAE,OAAO,OAAA,EAAS,UAAA,GAAa,OAAO,IAAA,GAAO,QAAA,EAAU,WAAA,GAAc,QAAA,EAAS,GAAI,KAAA;AAExF,EAAA,MAAM,SAAA,GAAY,OAA2B,IAAI,CAAA;AACjD,EAAA,MAAM,YAAA,GAAe,OAAO,KAAK,CAAA;AAGjC,EAAA,SAAA,CAAU,MAAM;AACd,IAA+C;AAC7C,MAAA,OAAO,mCAAmC,CAAA,CAAE,IAAA;AAAA,QAC1C,CAAC,EAAE,uBAAA,EAAyB,wBAAA,EAAyB,KAAM;AACzD,UAAA,IAAI,UAAU,OAAA,EAAS;AAErB,YAAA,uBAAA,CAAwB,SAAA,CAAU,SAAS,qBAAqB,CAAA;AAGhE,YAAA,wBAAA,CAAyB,SAAA,CAAU,SAAS,qBAAqB,CAAA;AAAA,UACnE;AAAA,QACF;AAAA,OACF;AAAA,IACF;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAClB,CAAC,KAAA,KAAsB;AACrB,MAAA,IAAI,UAAA,EAAY;AACd,QAAA;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf,CAAA;AAAA,IACA,CAAC,SAAS,UAAU;AAAA,GACtB;AAEA,EAAA,MAAM,iBAAA,GAAoB,WAAA;AAAA,IACxB,CAAC,KAAA,KAA8B;AAC7B,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA;AAAA,MACF;AAEA,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,MAAA,WAAA,CAAY,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,IAC/B,CAAA;AAAA,IACA,CAAC,aAAa,UAAU;AAAA,GAC1B;AAEA,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,KAAA,KAA+B;AAC9B,MAAA,IAAI,UAAA,EAAY;AACd,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,OAAA,IAAW,KAAA,CAAM,QAAQ,GAAA,EAAK;AAC9C,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,WAAA,CAAY,EAAE,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,KAAA,CAAM,KAAK,CAAA;AAAA,MAClD;AAAA,IACF,CAAA;AAAA,IACA,CAAC,aAAa,UAAU;AAAA,GAC1B;AAEA,EAAA,MAAM,WAAA,GAAqC;AAAA,IACzC,IAAA;AAAA,IACA,QAAA,EAAU,aAAa,EAAA,GAAK,CAAA;AAAA,IAC5B,YAAA,EAAc,KAAA;AAAA,IACd,eAAA,EAAiB,aAAa,IAAA,GAAO,MAAA;AAAA,IACrC,QAAA,EAAU,WAAA,KAAgB,QAAA,GAAW,UAAA,GAAa,MAAA;AAAA,IAClD,aAAA,EAAe,iBAAA;AAAA,IACf,SAAA,EAAW;AAAA,GACb;AAEA,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,WAAW,YAAA,CAAa;AAAA,GAC1B;AACF,CAAA;ACpFO,IAAM,gBAAA,GAAmB,CAAC,KAAA,KAAiC;AAChE,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,OAAA,GAAU,SAAA;AAAA,IACV,SAAA,GAAY,EAAA;AAAA,IACZ,IAAA,GAAO;AAAA,GACT,GAAI,KAAA;AAEJ,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,mBAAA,CAAoB;AAAA,IAC1C,KAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA,EAAY;AAAA,GACb,CAAA;AAGD,EAAA,MAAM,UAAA,GACJ,oMAAA;AAGF,EAAA,MAAM,aAAA,GAA+C;AAAA,IACnD,OAAA,EAAS,yEAAA;AAAA,IACT,SAAA,EAAW,4EAAA;AAAA,IACX,MAAA,EAAQ,sEAAA;AAAA,IACR,KAAA,EAAO;AAAA,GACT;AAEA,EAAA,MAAM,iBAAA,GAAoB,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,aAAA,CAAc,OAAO,CAAC,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAEtF,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACE,GAAG,WAAA;AAAA,MACJ,IAAA;AAAA,MACA,SAAA,EAAW,iBAAA;AAAA,MACX,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,aAAA;AAAA,QACT,YAAA,EAAc,UAAA;AAAA,QACd,MAAA,EAAQ,MAAA;AAAA,QACR,MAAA,EAAQ,WAAW,aAAA,GAAgB;AAAA,OACrC;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;ACzDO,IAAM,YAAA,GAAe,CAAC,KAAA,KAAiD;AAC5E,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAU,eAAe,IAAA,EAAM,SAAA,GAAY,MAAK,GAAI,KAAA;AAEtE,EAAA,MAAM,OAAA,GAAUA,OAAoB,IAAI,CAAA;AACxC,EAAA,MAAM,YAAA,GAAeA,OAAyB,IAAI,CAAA;AAClD,EAAA,MAAM,gBAAA,GAAmBA,OAA2B,IAAI,CAAA;AAExD,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,OAAA,CAAQ,OAAA,EAAS;AACjC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,gBAAA,CAAiB,UAAU,QAAA,CAAS,aAAA;AAAA,IACtC;AAGA,IAAA,OAAO,0BAA0B,CAAA,CAAE,IAAA,CAAK,CAAC,EAAE,iBAAgB,KAAM;AAC/D,MAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAA+D;AAAA,QACnE,WAAA,EAAa,KAAA;AAAA,QACb;AAAA,OACF;AAGA,MAAA,IAAI,SAAA,EAAW;AAEb,QAAA,OAAA,CAAQ,YAAA,GAAe,MAAA;AAAA,MACzB;AAEA,MAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,OAAA,CAAQ,OAAA,EAAS,OAAO,CAAA;AAErD,MAAA,IAAA,CAAK,QAAA,EAAS;AACd,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAGvB,MAA+C;AAC7C,QAAA,OAAO,mCAAmC,CAAA,CAAE,IAAA,CAAK,CAAC,EAAE,gBAAe,KAAM;AACvE,UAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,YAAA,cAAA,CAAe,iBAAA,CAAkB,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AAAA,UACxD;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,YAAA,CAAa,QAAQ,UAAA,EAAW;AAChC,QAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAAA,MACzB;AAGA,MAAA,IAAI,YAAA,IAAgB,iBAAiB,OAAA,EAAS;AAC5C,QAAA,gBAAA,CAAiB,QAAQ,KAAA,EAAM;AAG/B,QAA+C;AAC7C,UAAA,OAAO,mCAAmC,CAAA,CAAE,IAAA,CAAK,CAAC,EAAE,gBAAe,KAAM;AACvE,YAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,cAAA,cAAA,CAAe,sBAAA;AAAA,gBACb,gBAAA,CAAiB,OAAA;AAAA,gBACjB;AAAA,eACF;AAAA,YACF;AAAA,UACF,CAAC,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAA;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,QAAA,EAAU,YAAA,EAAc,SAAS,CAAC,CAAA;AAEhD,EAAA,OAAO;AAAA,IACL;AAAA,GACF;AACF,CAAA;;;ACZO,IAAM,mBAAA,GAAsB,CAAC,KAAA,KAA+D;AACjG,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,IAAA,GAAO,QAAA;AAAA,IACP,OAAA,GAAU,IAAA;AAAA,IACV,oBAAA,GAAuB;AAAA,GACzB,GAAI,KAAA;AAGJ,EAA+C;AAC7C,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACvC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAYD,OAAoB,IAAI,CAAA;AAC1C,EAAA,MAAM,UAAU,KAAA,EAAM;AACtB,EAAA,MAAM,gBAAgB,KAAA,EAAM;AAG5B,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,YAAA,CAAa;AAAA,IAC/B,QAAA,EAAU,MAAA;AAAA,IACV,QAAA,EAAU,OAAA;AAAA,IACV,YAAA,EAAc,IAAA;AAAA,IACd,SAAA,EAAW;AAAA,GACZ,CAAA;AAGD,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,CAAU,OAAA,IAAW,OAAA,CAAQ,OAAA,KAAY,UAAU,OAAA,EAAS;AAC9D,MAAC,OAAA,CAAuD,UAAU,SAAA,CAAU,OAAA;AAAA,IAC9E;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAA,EAAS;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA;AAC7C,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAE/B,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,gBAAA;AAAA,IACjC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AAGpB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAiD,MAAA,EAAQ;AACvD,MAAA,OAAO,mCAAmC,CAAA,CAAE,IAAA;AAAA,QAC1C,CAAC,EAAE,uBAAA,EAAyB,yBAAA,EAA0B,KAAM;AAC1D,UAAA,IAAI,UAAU,OAAA,EAAS;AACrB,YAAA,uBAAA,CAAwB,SAAA,CAAU,SAAS,qBAAqB,CAAA;AAChE,YAAA,yBAAA,CAA0B,UAAU,OAAO,CAAA;AAAA,UAC7C;AAAA,QACF;AAAA,OACF;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,WAAA,GAAoC;AAAA,IACxC,GAAA,EAAK,SAAA;AAAA,IACL,IAAA;AAAA,IACA,iBAAA,EAAmB,OAAA;AAAA,IACnB,kBAAA,EAAoB,cAAc,aAAA,GAAgB,MAAA;AAAA,IAClD,YAAA,EAAc,OAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,MAAM,UAAA,GAA+B;AAAA,IACnC,EAAA,EAAI;AAAA,GACN;AAEA,EAAA,MAAM,gBAAA,GAAkD,WAAA,GACpD,EAAE,EAAA,EAAI,eAAc,GACpB,IAAA;AAEJ,EAAA,MAAM,aAAA,GACJ,wBAAwB,OAAA,GACpB;AAAA,IACE,OAAA,EAAS,OAAA;AAAA,IACT,aAAA,EAAe;AAAA,GACjB,GACA,IAAA;AAEN,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,UAAA;AAAA,IACA,gBAAA;AAAA,IACA,aAAA;AAAA,IACA,KAAA,EAAO;AAAA,GACT;AACF,CAAA;ACrJO,IAAM,gBAAA,GAAmB,CAAC,KAAA,KAAiC;AAChE,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,IAAA,GAAO,QAAA;AAAA,IACP,eAAA,GAAkB,IAAA;AAAA,IAClB,SAAA,GAAY,EAAA;AAAA,IACZ,iBAAA,GAAoB;AAAA,GACtB,GAAI,KAAA;AAEJ,EAAA,MAAM,EAAE,WAAA,EAAa,UAAA,EAAY,kBAAkB,aAAA,EAAe,KAAA,KAAU,mBAAA,CAAoB;AAAA,IAC9F,MAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA,EAAS,IAAA;AAAA,IACT,oBAAA,EAAsB;AAAA,GACvB,CAAA;AAED,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EAEG,QAAA,EAAA;AAAA,IAAA,aAAA,oBACCC,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACE,GAAG,aAAA;AAAA,QACJ,SAAA,EAAW,iBAAA;AAAA,QACX,KAAA,EAAO;AAAA,UACL,QAAA,EAAU,OAAA;AAAA,UACV,KAAA,EAAO,CAAA;AAAA,UACP,eAAA,EAAiB,oBAAA;AAAA,UACjB,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,MAAA,EAAQ;AAAA;AACV;AAAA,KACF;AAAA,oBAIF,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAK,WAAA,CAAY,GAAA;AAAA,QACjB,MAAM,WAAA,CAAY,IAAA;AAAA,QAClB,iBAAA,EAAiB,YAAY,iBAAiB,CAAA;AAAA,QAC9C,kBAAA,EAAkB,YAAY,kBAAkB,CAAA;AAAA,QAChD,YAAA,EAAY,YAAY,YAAY,CAAA;AAAA,QACpC,UAAU,WAAA,CAAY,QAAA;AAAA,QACtB,SAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,QAAA,EAAU,OAAA;AAAA,UACV,GAAA,EAAK,KAAA;AAAA,UACL,IAAA,EAAM,KAAA;AAAA,UACN,SAAA,EAAW,uBAAA;AAAA,UACX,eAAA,EAAiB,OAAA;AAAA,UACjB,YAAA,EAAc,QAAA;AAAA,UACd,SAAA,EAAW,qCAAA;AAAA,UACX,OAAA,EAAS,QAAA;AAAA,UACT,QAAA,EAAU,OAAA;AAAA,UACV,KAAA,EAAO,MAAA;AAAA,UACP,SAAA,EAAW,MAAA;AAAA,UACX,QAAA,EAAU,MAAA;AAAA,UACV,MAAA,EAAQ;AAAA,SACV;AAAA,QAGC,QAAA,EAAA;AAAA,UAAA,eAAA,oBACCA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,KAAA;AAAA,cACT,YAAA,EAAW,cAAA;AAAA,cACX,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU,UAAA;AAAA,gBACV,GAAA,EAAK,MAAA;AAAA,gBACL,KAAA,EAAO,MAAA;AAAA,gBACP,OAAA,EAAS,QAAA;AAAA,gBACT,MAAA,EAAQ,MAAA;AAAA,gBACR,UAAA,EAAY,aAAA;AAAA,gBACZ,MAAA,EAAQ,SAAA;AAAA,gBACR,QAAA,EAAU,SAAA;AAAA,gBACV,UAAA,EAAY,CAAA;AAAA,gBACZ,KAAA,EAAO;AAAA,eACT;AAAA,cACD,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BAIFA,GAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACE,GAAG,UAAA;AAAA,cACJ,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU,SAAA;AAAA,gBACV,UAAA,EAAY,GAAA;AAAA,gBACZ,YAAA,EAAc,cAAc,QAAA,GAAW,MAAA;AAAA,gBACvC,YAAA,EAAc,kBAAkB,MAAA,GAAS;AAAA,eAC3C;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UAGC,gBAAA,IAAoB,+BACnBA,GAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACE,GAAG,gBAAA;AAAA,cACJ,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU,UAAA;AAAA,gBACV,KAAA,EAAO,SAAA;AAAA,gBACP,YAAA,EAAc;AAAA,eAChB;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,0BAIFA,GAAAA,CAAC,KAAA,EAAA,EAAK,QAAA,EAAS;AAAA;AAAA;AAAA;AACjB,GAAA,EACF,CAAA;AAEJ;AChGO,IAAM,qBAAA,GAAwB,CACnC,KAAA,KACgC;AAChC,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,IAAA,GAAO,KAAA;AAAA,IACP,UAAA;AAAA,IACA,YAAA,GAAe,CAAA;AAAA,IACf,YAAA,EAAc;AAAA,GAChB,GAAI,KAAA;AAEJ,EAAA,MAAM,eAAe,eAAA,KAAoB,MAAA;AACzC,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAS,YAAY,CAAA;AACvE,EAAA,MAAM,YAAA,GAAe,eAAe,eAAA,GAAkB,iBAAA;AAEtD,EAAA,MAAM,QAAA,GAAWF,MAAAA,iBAAiC,IAAI,GAAA,EAAK,CAAA;AAC3D,EAAA,MAAM,YAAA,GAAeA,OAA2B,IAAI,CAAA;AAGpD,EAAA,MAAM,eAAA,GAAkBG,WAAAA;AAAA,IACtB,CAAC,KAAA,KAAkB;AACjB,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,MAC5B;AACA,MAAA,UAAA,GAAa,KAAK,CAAA;AAGlB,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAC1C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,MAChB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,cAAc,UAAU;AAAA,GAC3B;AAGA,EAAA,MAAM,QAAA,GAAWA,WAAAA;AAAA,IACf,CAAC,SAAA,KAAmC;AAClC,MAAA,MAAM,SAAA,GAAY,SAAS,OAAA,CAAQ,IAAA;AACnC,MAAA,IAAI,cAAc,CAAA,EAAG;AACnB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,SAAA,GAAY,YAAA;AAEhB,MAAA,QAAQ,SAAA;AAAW,QACjB,KAAK,SAAA;AACH,UAAA,SAAA,GAAY,YAAA,GAAe,CAAA;AAC3B,UAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,YAAA,SAAA,GAAY,IAAA,GAAO,IAAI,SAAA,GAAY,CAAA;AAAA,UACrC;AACA,UAAA;AAAA,QAEF,KAAK,UAAA;AACH,UAAA,SAAA,GAAY,YAAA,GAAe,CAAA;AAC3B,UAAA,IAAI,YAAY,CAAA,EAAG;AACjB,YAAA,SAAA,GAAY,IAAA,GAAO,YAAY,CAAA,GAAI,CAAA;AAAA,UACrC;AACA,UAAA;AAAA,QAEF,KAAK,OAAA;AACH,UAAA,SAAA,GAAY,CAAA;AACZ,UAAA;AAAA,QAEF,KAAK,MAAA;AACH,UAAA,SAAA,GAAY,SAAA,GAAY,CAAA;AACxB,UAAA;AAAA;AAGJ,MAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,QAAA,eAAA,CAAgB,SAAS,CAAA;AAAA,MAC3B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,YAAA,EAAc,IAAA,EAAM,eAAe;AAAA,GACtC;AAGA,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,CAAC,KAAA,KAA+B;AAC9B,MAAA,MAAM,EAAE,KAAI,GAAI,KAAA;AAEhB,MAAA,IAAI,SAAA,GAAwC,IAAA;AAG5C,MAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,QAAA,IAAI,WAAA,KAAgB,YAAA,IAAgB,WAAA,KAAgB,MAAA,EAAQ;AAC1D,UAAA,SAAA,GAAY,SAAA;AAAA,QACd;AAAA,MACF,CAAA,MAAA,IAAW,QAAQ,WAAA,EAAa;AAC9B,QAAA,IAAI,WAAA,KAAgB,YAAA,IAAgB,WAAA,KAAgB,MAAA,EAAQ;AAC1D,UAAA,SAAA,GAAY,UAAA;AAAA,QACd;AAAA,MACF,CAAA,MAAA,IAAW,QAAQ,WAAA,EAAa;AAC9B,QAAA,IAAI,WAAA,KAAgB,UAAA,IAAc,WAAA,KAAgB,MAAA,EAAQ;AACxD,UAAA,SAAA,GAAY,SAAA;AAAA,QACd;AAAA,MACF,CAAA,MAAA,IAAW,QAAQ,SAAA,EAAW;AAC5B,QAAA,IAAI,WAAA,KAAgB,UAAA,IAAc,WAAA,KAAgB,MAAA,EAAQ;AACxD,UAAA,SAAA,GAAY,UAAA;AAAA,QACd;AAAA,MACF,CAAA,MAAA,IAGS,QAAQ,MAAA,EAAQ;AACvB,QAAA,SAAA,GAAY,OAAA;AAAA,MACd,CAAA,MAAA,IAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,SAAA,GAAY,MAAA;AAAA,MACd;AAEA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,QAAA,CAAS,SAAS,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,aAAa,QAAQ;AAAA,GACxB;AAGA,EAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,IACnB,CAAC,KAAA,KAAsC;AACrC,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,CAAC,OAAA,KAAgC;AACpC,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,OAAO,CAAA;AAAA,UACrC,CAAA,MAAO;AACL,YAAA,QAAA,CAAS,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,UAC/B;AAAA,QACF,CAAA;AAAA,QACA,QAAA,EAAU,KAAA,KAAU,YAAA,GAAe,CAAA,GAAI,EAAA;AAAA,QACvC,SAAA,EAAW,aAAA;AAAA,QACX,YAAA,EAAc;AAAA,OAChB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,cAAc,aAAa;AAAA,GAC9B;AAGA,EAAAF,UAAU,MAAM;AACd,IAA+C;AAC7C,MAAA,OAAO,mCAAmC,CAAA,CAAE,IAAA,CAAK,CAAC,EAAE,mBAAkB,KAAM;AAE1E,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAA,iBAAA,CAAkB,iBAAA,CAAkB,aAAa,OAAO,CAAA;AAAA,QAC1D;AAGA,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,QAAA,CAAS,QAAQ,MAAA,EAAQ,CAAA,CAAE,CAAC,CAAA,EAAG,aAAA;AAC5D,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,iBAAA,CAAkB,uBAAuB,SAAS,CAAA;AAAA,QACpD;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,IAAA,EAAM,SAAA;AAAA,IACN,kBAAA,EAAoB;AAAA,GACtB;AAEA,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,eAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF,CAAA;AC3LO,IAAM,cAAA,GAAiB,CAAC,KAAA,KAA+B;AAC5D,EAAA,MAAM,EAAE,OAAO,OAAA,EAAS,KAAA,EAAO,YAAY,EAAA,EAAI,aAAA,GAAgB,IAAG,GAAI,KAAA;AAEtE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIG,SAAS,KAAK,CAAA;AAG1C,EAAA,MAAM,EAAE,WAAA,EAAa,YAAA,EAAa,GAAI,mBAAA,CAAoB;AAAA,IACxD,KAAA;AAAA,IACA,OAAA,EAAS,MAAM,SAAA,CAAU,CAAC,MAAM;AAAA,GACjC,CAAA;AAGD,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,YAAA,CAAa;AAAA,IAC/B,QAAA,EAAU,MAAA;AAAA,IACV,QAAA,EAAU,MAAM,SAAA,CAAU,KAAK,CAAA;AAAA,IAC/B,YAAA,EAAc;AAAA,GACf,CAAA;AAGD,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,qBAAA,CAAsB;AAAA,IAC7C,WAAA,EAAa,UAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACP,CAAA;AAED,EAAA,MAAM,eAAA,GAAkB,CAAC,IAAA,KAAmB;AAC1C,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,SAAA,CAAU,KAAK,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,uBACEC,KAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,cAAA,EAAe,EAE1D,QAAA,EAAA;AAAA,oBAAAH,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACE,GAAG,YAAA;AAAA,QACJ,SAAA;AAAA,QACA,eAAA,EAAe,MAAA;AAAA,QACf,eAAA,EAAc,MAAA;AAAA,QACd,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,aAAA;AAAA,UACT,MAAA,EAAQ,mBAAA;AAAA,UACR,YAAA,EAAc,UAAA;AAAA,UACd,eAAA,EAAiB,OAAA;AAAA,UACjB,MAAA,EAAQ,SAAA;AAAA,UACR,QAAA,EAAU,UAAA;AAAA,UACV,UAAA,EAAY;AAAA,SACd;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,IAGC,0BACCA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,kBAAA,EAAiB,UAAA;AAAA,QACjB,SAAA,EAAW,aAAA;AAAA,QACX,KAAA,EAAO;AAAA,UACL,QAAA,EAAU,UAAA;AAAA,UACV,GAAA,EAAK,sBAAA;AAAA,UACL,IAAA,EAAM,CAAA;AAAA,UACN,QAAA,EAAU,OAAA;AAAA,UACV,eAAA,EAAiB,OAAA;AAAA,UACjB,MAAA,EAAQ,mBAAA;AAAA,UACR,YAAA,EAAc,UAAA;AAAA,UACd,SAAA,EAAW,qCAAA;AAAA,UACX,OAAA,EAAS,SAAA;AAAA,UACT,MAAA,EAAQ;AAAA,SACV;AAAA,QAEC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU;AAC1B,UAAA,MAAM,SAAA,GAAY,aAAa,KAAK,CAAA;AAEpC,UAAA,uBACEG,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEE,GAAG,SAAA;AAAA,cACJ,IAAA,EAAK,UAAA;AAAA,cACL,UAAU,IAAA,CAAK,QAAA;AAAA,cACf,OAAA,EAAS,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,cACnC,KAAA,EAAO;AAAA,gBACL,OAAA,EAAS,MAAA;AAAA,gBACT,UAAA,EAAY,QAAA;AAAA,gBACZ,GAAA,EAAK,SAAA;AAAA,gBACL,KAAA,EAAO,MAAA;AAAA,gBACP,OAAA,EAAS,gBAAA;AAAA,gBACT,MAAA,EAAQ,MAAA;AAAA,gBACR,UAAA,EAAY,aAAA;AAAA,gBACZ,SAAA,EAAW,MAAA;AAAA,gBACX,QAAA,EAAU,UAAA;AAAA,gBACV,MAAA,EAAQ,IAAA,CAAK,QAAA,GAAW,aAAA,GAAgB,SAAA;AAAA,gBACxC,YAAA,EAAc,SAAA;AAAA,gBACd,KAAA,EAAO,IAAA,CAAK,QAAA,GAAW,SAAA,GAAY,SAAA;AAAA,gBACnC,OAAA,EAAS,IAAA,CAAK,QAAA,GAAW,GAAA,GAAM;AAAA,eACjC;AAAA,cACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,gBAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,kBAAA,CAAA,CAAE,aAAA,CAAc,MAAM,eAAA,GAAkB,SAAA;AAAA,gBAC1C;AAAA,cACF,CAAA;AAAA,cACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,gBAAA,CAAA,CAAE,aAAA,CAAc,MAAM,eAAA,GAAkB,aAAA;AAAA,cAC1C,CAAA;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,IAAA,CAAK,IAAA,oBAAQH,GAAAA,CAAC,MAAA,EAAA,EAAM,eAAK,IAAA,EAAK,CAAA;AAAA,gCAC/BA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM;AAAA;AAAA,aAAA;AAAA,YA9Bb,IAAA,CAAK;AAAA,WA+BZ;AAAA,QAEJ,CAAC;AAAA;AAAA;AACH,GAAA,EAEJ,CAAA;AAEJ;AC9HO,IAAM,eAAA,GAAkB,CAAC,KAAA,KAAgC;AAC9D,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA,GAAO,IAAA;AAAA,IACP,oBAAA,GAAuB,KAAA;AAAA,IACvB,SAAA,GAAY;AAAA,GACd,GAAI,KAAA;AAEJ,EAAA,MAAM,EAAE,WAAA,EAAa,UAAA,EAAY,aAAA,EAAe,KAAA,KAAU,mBAAA,CAAoB;AAAA,IAC5E,MAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT;AAAA,GACD,CAAA;AAED,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,UAAA,GAAqF;AAAA,IACzF,EAAA,EAAI,EAAE,QAAA,EAAU,OAAA,EAAQ;AAAA,IACxB,EAAA,EAAI,EAAE,QAAA,EAAU,OAAA,EAAQ;AAAA,IACxB,EAAA,EAAI,EAAE,QAAA,EAAU,OAAA,EAAQ;AAAA,IACxB,EAAA,EAAI,EAAE,QAAA,EAAU,OAAA,EAAQ;AAAA,IACxB,IAAA,EAAM,EAAE,QAAA,EAAU,MAAA,EAAQ,WAAW,MAAA;AAAO,GAC9C;AAEA,EAAA,uBACEG,IAAAA,CAAAC,QAAAA,EAAA,EAEG,QAAA,EAAA;AAAA,IAAA,aAAA,oBACCJ,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACE,GAAG,aAAA;AAAA,QACJ,KAAA,EAAO;AAAA,UACL,QAAA,EAAU,OAAA;AAAA,UACV,KAAA,EAAO,CAAA;AAAA,UACP,eAAA,EAAiB,oBAAA;AAAA,UACjB,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,MAAA,EAAQ;AAAA;AACV;AAAA,KACF;AAAA,oBAIFG,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAK,WAAA,CAAY,GAAA;AAAA,QACjB,MAAM,WAAA,CAAY,IAAA;AAAA,QAClB,iBAAA,EAAiB,YAAY,iBAAiB,CAAA;AAAA,QAC9C,kBAAA,EAAkB,YAAY,kBAAkB,CAAA;AAAA,QAChD,YAAA,EAAY,YAAY,YAAY,CAAA;AAAA,QACpC,UAAU,WAAA,CAAY,QAAA;AAAA,QACtB,SAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,QAAA,EAAU,OAAA;AAAA,UACV,GAAA,EAAK,KAAA;AAAA,UACL,IAAA,EAAM,KAAA;AAAA,UACN,SAAA,EAAW,uBAAA;AAAA,UACX,eAAA,EAAiB,OAAA;AAAA,UACjB,YAAA,EAAc,QAAA;AAAA,UACd,SAAA,EAAW,uCAAA;AAAA,UACX,KAAA,EAAO,MAAA;AAAA,UACP,SAAA,EAAW,MAAA;AAAA,UACX,OAAA,EAAS,MAAA;AAAA,UACT,aAAA,EAAe,QAAA;AAAA,UACf,MAAA,EAAQ,EAAA;AAAA,UACR,GAAG,WAAW,IAAI;AAAA,SACpB;AAAA,QAGA,QAAA,EAAA;AAAA,0BAAAA,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,OAAA,EAAS,QAAA;AAAA,gBACT,YAAA,EAAc,mBAAA;AAAA,gBACd,OAAA,EAAS,MAAA;AAAA,gBACT,UAAA,EAAY,QAAA;AAAA,gBACZ,cAAA,EAAgB;AAAA,eAClB;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAAH,GAAAA;AAAA,kBAAC,IAAA;AAAA,kBAAA;AAAA,oBACE,GAAG,UAAA;AAAA,oBACJ,KAAA,EAAO;AAAA,sBACL,QAAA,EAAU,SAAA;AAAA,sBACV,UAAA,EAAY,GAAA;AAAA,sBACZ,MAAA,EAAQ;AAAA,qBACV;AAAA,oBAEC,QAAA,EAAA;AAAA;AAAA,iBACH;AAAA,gCAEAA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAS,KAAA;AAAA,oBACT,YAAA,EAAW,aAAA;AAAA,oBACX,KAAA,EAAO;AAAA,sBACL,OAAA,EAAS,QAAA;AAAA,sBACT,MAAA,EAAQ,MAAA;AAAA,sBACR,UAAA,EAAY,aAAA;AAAA,sBACZ,MAAA,EAAQ,SAAA;AAAA,sBACR,QAAA,EAAU,SAAA;AAAA,sBACV,UAAA,EAAY,CAAA;AAAA,sBACZ,KAAA,EAAO,SAAA;AAAA,sBACP,YAAA,EAAc;AAAA,qBAChB;AAAA,oBACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,WACF;AAAA,0BAGAA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,IAAA,EAAM,CAAA;AAAA,gBACN,SAAA,EAAW,MAAA;AAAA,gBACX,OAAA,EAAS;AAAA,eACX;AAAA,cAEC;AAAA;AAAA,WACH;AAAA,UAGC,0BACCA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,OAAA,EAAS,QAAA;AAAA,gBACT,SAAA,EAAW,mBAAA;AAAA,gBACX,OAAA,EAAS,MAAA;AAAA,gBACT,GAAA,EAAK,SAAA;AAAA,gBACL,cAAA,EAAgB;AAAA,eAClB;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA;AAEJ,GAAA,EACF,CAAA;AAEJ;ACxHO,IAAM,cAAA,GAAiB,CAAC,KAAA,KAA+B;AAC5D,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,UAAA,GAAa,CAAA;AAAA,IACb,WAAA,EAAa,aAAA;AAAA,IACb,WAAA;AAAA,IACA,SAAA,GAAY,EAAA;AAAA,IACZ,cAAA,GAAiB;AAAA,GACnB,GAAI,KAAA;AAEJ,EAAA,MAAM,eAAe,aAAA,KAAkB,MAAA;AACvC,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIE,SAAS,UAAU,CAAA;AACjE,EAAA,MAAM,aAAA,GAAgB,eAAe,aAAA,GAAgB,eAAA;AAGrD,EAAA,MAAM,EAAE,YAAA,EAAc,eAAA,EAAgB,GAAI,qBAAA,CAAsB;AAAA,IAC9D,WAAA,EAAa,YAAA;AAAA,IACb,IAAA,EAAM,KAAA;AAAA,IACN,YAAA,EAAc,aAAA;AAAA,IACd,UAAA,EAAY,CAAC,KAAA,KAAU;AAErB,MAAA,IAAI,IAAA,CAAK,KAAK,CAAA,EAAG,QAAA,EAAU;AACzB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,MAC1B;AACA,MAAA,WAAA,GAAc,KAAK,CAAA;AAAA,IACrB;AAAA,GACD,CAAA;AAED,EAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAkB;AACxC,IAAA,IAAI,IAAA,CAAK,KAAK,CAAA,EAAG,QAAA,EAAU;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,eAAA,CAAgB,KAAK,CAAA;AAErB,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,IAC1B;AACA,IAAA,WAAA,GAAc,KAAK,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,KAAK,aAAa,CAAA;AAEtC,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAEH,QAAA,EAAA;AAAA,oBAAAH,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,SAAA;AAAA,QACL,kBAAA,EAAiB,YAAA;AAAA,QACjB,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,MAAA;AAAA,UACT,YAAA,EAAc,mBAAA;AAAA,UACd,GAAA,EAAK;AAAA,SACP;AAAA,QAEC,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,KAAU;AACxB,UAAA,MAAM,SAAA,GAAY,aAAa,KAAK,CAAA;AACpC,UAAA,MAAM,aAAa,KAAA,KAAU,aAAA;AAE7B,UAAA,uBACEG,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEE,GAAG,SAAA;AAAA,cACJ,EAAA,EAAI,CAAA,IAAA,EAAO,GAAA,CAAI,EAAE,CAAA,CAAA;AAAA,cACjB,IAAA,EAAK,KAAA;AAAA,cACL,eAAA,EAAe,UAAA;AAAA,cACf,eAAA,EAAe,CAAA,MAAA,EAAS,GAAA,CAAI,EAAE,CAAA,CAAA;AAAA,cAC9B,UAAU,GAAA,CAAI,QAAA;AAAA,cACd,OAAA,EAAS,MAAM,cAAA,CAAe,KAAK,CAAA;AAAA,cACnC,KAAA,EAAO;AAAA,gBACL,OAAA,EAAS,MAAA;AAAA,gBACT,UAAA,EAAY,QAAA;AAAA,gBACZ,GAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,cAAA;AAAA,gBACT,MAAA,EAAQ,MAAA;AAAA,gBACR,UAAA,EAAY,aAAA;AAAA,gBACZ,MAAA,EAAQ,GAAA,CAAI,QAAA,GAAW,aAAA,GAAgB,SAAA;AAAA,gBACvC,QAAA,EAAU,UAAA;AAAA,gBACV,UAAA,EAAY,aAAa,GAAA,GAAM,GAAA;AAAA,gBAC/B,KAAA,EAAO,GAAA,CAAI,QAAA,GAAW,SAAA,GAAY,aAAa,SAAA,GAAY,SAAA;AAAA,gBAC3D,YAAA,EAAc,aAAa,mBAAA,GAAsB,MAAA;AAAA,gBACjD,YAAA,EAAc,MAAA;AAAA,gBACd,OAAA,EAAS,GAAA,CAAI,QAAA,GAAW,GAAA,GAAM,CAAA;AAAA,gBAC9B,UAAA,EAAY;AAAA,eACd;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,GAAA,CAAI,IAAA,oBAAQH,GAAAA,CAAC,MAAA,EAAA,EAAM,cAAI,IAAA,EAAK,CAAA;AAAA,gCAC7BA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,GAAA,CAAI,KAAA,EAAM;AAAA;AAAA,aAAA;AAAA,YA1BZ,GAAA,CAAI;AAAA,WA2BX;AAAA,QAEJ,CAAC;AAAA;AAAA,KACH;AAAA,IAGC,+BACCA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,CAAA,MAAA,EAAS,WAAA,CAAY,EAAE,CAAA,CAAA;AAAA,QAC3B,IAAA,EAAK,UAAA;AAAA,QACL,iBAAA,EAAiB,CAAA,IAAA,EAAO,WAAA,CAAY,EAAE,CAAA,CAAA;AAAA,QACtC,SAAA,EAAW,cAAA;AAAA,QACX,KAAA,EAAO;AAAA,UACL,OAAA,EAAS;AAAA,SACX;AAAA,QAEC,QAAA,EAAA,WAAA,CAAY;AAAA;AAAA;AACf,GAAA,EAEJ,CAAA;AAEJ","file":"index.js","sourcesContent":["/**\n * @a13y/react - useAccessibleButton\n * Type-safe button hook with keyboard support\n */\n\nimport type { AriaRole } from 'react';\nimport { useCallback, useEffect, useRef } from 'react';\n\n/**\n * Button press event (mouse or keyboard)\n */\nexport interface PressEvent {\n type: 'mouse' | 'keyboard';\n key?: string;\n}\n\n/**\n * Props for useAccessibleButton\n */\nexport interface UseAccessibleButtonProps {\n /**\n * Accessible label for the button\n * Required if button content is not text (e.g., icon-only)\n */\n label?: string;\n\n /**\n * Press handler - called on click or Enter/Space\n */\n onPress: (event: PressEvent) => void;\n\n /**\n * Whether the button is disabled\n */\n isDisabled?: boolean;\n\n /**\n * ARIA role override\n * @default 'button'\n */\n role?: Extract<AriaRole, 'button' | 'link'>;\n\n /**\n * Element type - only 'button' or 'a' allowed\n * @default 'button'\n */\n elementType?: 'button' | 'a';\n}\n\n/**\n * Button props returned by the hook\n */\nexport interface AccessibleButtonProps {\n role: AriaRole;\n tabIndex: number;\n 'aria-label'?: string;\n 'aria-disabled'?: boolean;\n disabled?: boolean;\n onPointerDown: (event: React.PointerEvent) => void;\n onKeyDown: (event: React.KeyboardEvent) => void;\n}\n\n/**\n * Return type\n */\nexport interface UseAccessibleButtonReturn {\n buttonProps: AccessibleButtonProps;\n isPressed: boolean;\n}\n\n/**\n * Hook for creating accessible buttons\n *\n * Features:\n * - Keyboard support (Enter, Space)\n * - Disabled state handling\n * - Automatic ARIA attributes\n * - Development-time validation\n *\n * @example\n * ```tsx\n * const { buttonProps } = useAccessibleButton({\n * label: 'Delete item',\n * onPress: () => console.log('Pressed!'),\n * });\n *\n * return <button {...buttonProps}>🗑️</button>;\n * ```\n */\nexport const useAccessibleButton = (props: UseAccessibleButtonProps): UseAccessibleButtonReturn => {\n const { label, onPress, isDisabled = false, role = 'button', elementType = 'button' } = props;\n\n const buttonRef = useRef<HTMLElement | null>(null);\n const isPressedRef = useRef(false);\n\n // Development-time validation\n useEffect(() => {\n if (typeof __DEV__ !== 'undefined' && __DEV__) {\n import('@a13y/devtools/runtime/invariants').then(\n ({ assertHasAccessibleName, assertKeyboardAccessible }) => {\n if (buttonRef.current) {\n // Validate accessible name\n assertHasAccessibleName(buttonRef.current, 'useAccessibleButton');\n\n // Validate keyboard accessibility\n assertKeyboardAccessible(buttonRef.current, 'useAccessibleButton');\n }\n }\n );\n }\n }, []);\n\n const handlePress = useCallback(\n (event: PressEvent) => {\n if (isDisabled) {\n return;\n }\n onPress(event);\n },\n [onPress, isDisabled]\n );\n\n const handlePointerDown = useCallback(\n (event: React.PointerEvent) => {\n if (isDisabled) {\n event.preventDefault();\n return;\n }\n\n isPressedRef.current = true;\n handlePress({ type: 'mouse' });\n },\n [handlePress, isDisabled]\n );\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (isDisabled) {\n return;\n }\n\n // Enter or Space activates button\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n handlePress({ type: 'keyboard', key: event.key });\n }\n },\n [handlePress, isDisabled]\n );\n\n const buttonProps: AccessibleButtonProps = {\n role,\n tabIndex: isDisabled ? -1 : 0,\n 'aria-label': label,\n 'aria-disabled': isDisabled ? true : undefined,\n disabled: elementType === 'button' ? isDisabled : undefined,\n onPointerDown: handlePointerDown,\n onKeyDown: handleKeyDown,\n };\n\n return {\n buttonProps,\n isPressed: isPressedRef.current,\n };\n};\n","/**\n * @a13y/react - AccessibleButton Component\n * Type-safe button component with enforced accessible name\n */\n\nimport type { ReactNode } from 'react';\nimport { useAccessibleButton } from '../hooks/use-accessible-button';\n\n/**\n * Button variants\n */\nexport type ButtonVariant = 'primary' | 'secondary' | 'danger' | 'ghost';\n\n/**\n * Props for AccessibleButton\n */\nexport interface AccessibleButtonProps {\n /**\n * Button content\n * If content is not text (e.g., icon only), label is REQUIRED\n */\n children: ReactNode;\n\n /**\n * Accessible label\n * REQUIRED if children is not text (e.g., icon-only button)\n */\n label?: string;\n\n /**\n * Click handler\n */\n onPress: (event: import('../hooks/use-accessible-button').PressEvent) => void;\n\n /**\n * Whether button is disabled\n */\n disabled?: boolean;\n\n /**\n * Visual variant (does not affect accessibility)\n */\n variant?: ButtonVariant;\n\n /**\n * Custom className\n */\n className?: string;\n\n /**\n * Button type\n */\n type?: 'button' | 'submit' | 'reset';\n}\n\n/**\n * Accessible Button Component\n *\n * Features:\n * - Automatic keyboard support (Enter, Space)\n * - Required accessible name (compile-time + runtime)\n * - Disabled state handling\n * - Development-time validation\n *\n * @example\n * ```tsx\n * // Text button (label optional)\n * <AccessibleButton onPress={() => console.log('Clicked')}>\n * Save\n * </AccessibleButton>\n *\n * // Icon button (label REQUIRED)\n * <AccessibleButton\n * label=\"Delete item\"\n * onPress={() => console.log('Deleted')}\n * >\n * 🗑️\n * </AccessibleButton>\n * ```\n */\nexport const AccessibleButton = (props: AccessibleButtonProps) => {\n const {\n children,\n label,\n onPress,\n disabled = false,\n variant = 'primary',\n className = '',\n type = 'button',\n } = props;\n\n const { buttonProps } = useAccessibleButton({\n label,\n onPress,\n isDisabled: disabled,\n });\n\n // Base styles (minimal, no framework dependency)\n const baseStyles =\n 'inline-flex items-center justify-center font-medium transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 disabled:opacity-50 disabled:cursor-not-allowed';\n\n // Variant styles\n const variantStyles: Record<ButtonVariant, string> = {\n primary: 'bg-blue-600 text-white hover:bg-blue-700 focus-visible:outline-blue-600',\n secondary: 'bg-gray-200 text-gray-900 hover:bg-gray-300 focus-visible:outline-gray-500',\n danger: 'bg-red-600 text-white hover:bg-red-700 focus-visible:outline-red-600',\n ghost: 'bg-transparent text-gray-700 hover:bg-gray-100 focus-visible:outline-gray-500',\n };\n\n const combinedClassName = `${baseStyles} ${variantStyles[variant]} ${className}`.trim();\n\n return (\n <button\n {...buttonProps}\n type={type}\n className={combinedClassName}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n border: 'none',\n cursor: disabled ? 'not-allowed' : 'pointer',\n }}\n >\n {children}\n </button>\n );\n};\n","/**\n * @a13y/react - useFocusTrap\n * Focus trap hook for modals and dialogs\n */\n\nimport type { FocusTrap } from '@a13y/core/runtime/focus';\nimport { useEffect, useRef } from 'react';\n\n/**\n * Props for useFocusTrap\n */\nexport interface UseFocusTrapProps {\n /**\n * Whether the focus trap is active\n */\n isActive: boolean;\n\n /**\n * Callback when Escape key is pressed\n */\n onEscape?: () => void;\n\n /**\n * Whether to restore focus when trap is deactivated\n * @default true\n */\n restoreFocus?: boolean;\n\n /**\n * Whether to auto-focus first element when activated\n * @default true\n */\n autoFocus?: boolean;\n}\n\n/**\n * Return type\n */\nexport interface UseFocusTrapReturn {\n /**\n * Ref to attach to the container element\n */\n trapRef: React.RefObject<HTMLElement | null>;\n}\n\n/**\n * Hook for creating focus traps\n *\n * Features:\n * - Traps Tab/Shift+Tab within container\n * - Handles Escape key\n * - Restores focus on deactivation\n * - Auto-focuses first element\n * - Development-time validation\n *\n * @example\n * ```tsx\n * const { trapRef } = useFocusTrap({\n * isActive: isOpen,\n * onEscape: () => setIsOpen(false),\n * });\n *\n * return (\n * <div ref={trapRef} role=\"dialog\">\n * <button>Close</button>\n * </div>\n * );\n * ```\n */\nexport const useFocusTrap = (props: UseFocusTrapProps): UseFocusTrapReturn => {\n const { isActive, onEscape, restoreFocus = true, autoFocus = true } = props;\n\n const trapRef = useRef<HTMLElement>(null);\n const focusTrapRef = useRef<FocusTrap | null>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!isActive || !trapRef.current) {\n return;\n }\n\n // Save previous focus\n if (restoreFocus) {\n previousFocusRef.current = document.activeElement as HTMLElement;\n }\n\n // Create focus trap\n import('@a13y/core/runtime/focus').then(({ createFocusTrap }) => {\n if (!trapRef.current) {\n return;\n }\n\n const options: import('@a13y/core/runtime/focus').FocusTrapOptions = {\n returnFocus: false,\n onEscape: onEscape,\n };\n\n // Only set initialFocus if autoFocus is enabled\n if (autoFocus) {\n // undefined means auto-focus first focusable element\n options.initialFocus = undefined;\n }\n\n const trap = createFocusTrap(trapRef.current, options);\n\n trap.activate();\n focusTrapRef.current = trap;\n\n // Development-time validation\n if (typeof __DEV__ !== 'undefined' && __DEV__) {\n import('@a13y/devtools/runtime/validators').then(({ focusValidator }) => {\n if (trapRef.current) {\n focusValidator.validateFocusTrap(trapRef.current, true);\n }\n });\n }\n });\n\n // Cleanup\n return () => {\n if (focusTrapRef.current) {\n focusTrapRef.current.deactivate();\n focusTrapRef.current = null;\n }\n\n // Restore focus\n if (restoreFocus && previousFocusRef.current) {\n previousFocusRef.current.focus();\n\n // Validate focus restoration in dev\n if (typeof __DEV__ !== 'undefined' && __DEV__) {\n import('@a13y/devtools/runtime/validators').then(({ focusValidator }) => {\n if (previousFocusRef.current) {\n focusValidator.expectFocusRestoration(\n previousFocusRef.current,\n 'focus trap deactivation'\n );\n }\n });\n }\n }\n };\n }, [isActive, onEscape, restoreFocus, autoFocus]);\n\n return {\n trapRef,\n };\n};\n","/**\n * @a13y/react - useAccessibleDialog\n * Type-safe dialog/modal hook with full ARIA support\n */\n\nimport type { AriaRole } from 'react';\nimport { useEffect, useId, useRef } from 'react';\nimport { useFocusTrap } from './use-focus-trap';\n\n/**\n * Props for useAccessibleDialog\n */\nexport interface UseAccessibleDialogProps {\n /**\n * Whether the dialog is open\n */\n isOpen: boolean;\n\n /**\n * Callback when dialog should close\n * Called on Escape key or backdrop click\n */\n onClose: () => void;\n\n /**\n * Dialog title - REQUIRED for accessibility\n * This becomes the aria-labelledby target\n */\n title: string;\n\n /**\n * Optional dialog description\n * This becomes the aria-describedby target\n */\n description?: string;\n\n /**\n * ARIA role\n * @default 'dialog'\n */\n role?: Extract<AriaRole, 'dialog' | 'alertdialog'>;\n\n /**\n * Whether dialog is modal (blocking)\n * @default true\n */\n isModal?: boolean;\n\n /**\n * Whether clicking backdrop closes dialog\n * @default true\n */\n closeOnBackdropClick?: boolean;\n}\n\n/**\n * Dialog container props\n */\nexport interface DialogContainerProps {\n ref: React.RefObject<HTMLElement | null>;\n role: AriaRole;\n 'aria-labelledby': string;\n 'aria-describedby'?: string;\n 'aria-modal': boolean;\n tabIndex: -1;\n}\n\n/**\n * Title props\n */\nexport interface DialogTitleProps {\n id: string;\n}\n\n/**\n * Description props\n */\nexport interface DialogDescriptionProps {\n id: string;\n}\n\n/**\n * Backdrop props\n */\nexport interface DialogBackdropProps {\n onClick: () => void;\n 'aria-hidden': true;\n}\n\n/**\n * Return type\n */\nexport interface UseAccessibleDialogReturn {\n dialogProps: DialogContainerProps;\n titleProps: DialogTitleProps;\n descriptionProps: DialogDescriptionProps | null;\n backdropProps: DialogBackdropProps | null;\n close: () => void;\n}\n\n/**\n * Hook for creating accessible dialogs/modals\n *\n * Features:\n * - Focus trap with Tab/Shift+Tab cycling\n * - Escape key to close\n * - Focus restoration on close\n * - ARIA attributes (modal, labelledby, describedby)\n * - Backdrop click handling\n * - Development-time validation\n *\n * @example\n * ```tsx\n * const { dialogProps, titleProps, descriptionProps, backdropProps } =\n * useAccessibleDialog({\n * isOpen,\n * onClose: () => setIsOpen(false),\n * title: 'Delete Item',\n * description: 'This action cannot be undone',\n * });\n *\n * if (!isOpen) return null;\n *\n * return (\n * <>\n * <div {...backdropProps} />\n * <div {...dialogProps}>\n * <h2 {...titleProps}>Delete Item</h2>\n * <p {...descriptionProps}>This action cannot be undone</p>\n * <button onClick={close}>Cancel</button>\n * </div>\n * </>\n * );\n * ```\n */\nexport const useAccessibleDialog = (props: UseAccessibleDialogProps): UseAccessibleDialogReturn => {\n const {\n isOpen,\n onClose,\n title,\n description,\n role = 'dialog',\n isModal = true,\n closeOnBackdropClick = true,\n } = props;\n\n // Compile-time validation: title is required\n if (typeof __DEV__ !== 'undefined' && __DEV__) {\n if (!title || title.trim().length === 0) {\n throw new Error(\n '@a13y/react [useAccessibleDialog]: \"title\" prop is required for accessibility'\n );\n }\n }\n\n const dialogRef = useRef<HTMLElement>(null);\n const titleId = useId();\n const descriptionId = useId();\n\n // Focus trap\n const { trapRef } = useFocusTrap({\n isActive: isOpen,\n onEscape: onClose,\n restoreFocus: true,\n autoFocus: true,\n });\n\n // Sync refs (trapRef and dialogRef point to same element)\n useEffect(() => {\n if (dialogRef.current && trapRef.current !== dialogRef.current) {\n (trapRef as React.MutableRefObject<HTMLElement | null>).current = dialogRef.current;\n }\n }, [trapRef]);\n\n // Body scroll lock when modal is open\n useEffect(() => {\n if (!isOpen || !isModal) {\n return;\n }\n\n const originalOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n\n return () => {\n document.body.style.overflow = originalOverflow;\n };\n }, [isOpen, isModal]);\n\n // Development-time validation\n useEffect(() => {\n if (typeof __DEV__ !== 'undefined' && __DEV__ && isOpen) {\n import('@a13y/devtools/runtime/invariants').then(\n ({ assertHasAccessibleName, assertValidAriaAttributes }) => {\n if (dialogRef.current) {\n assertHasAccessibleName(dialogRef.current, 'useAccessibleDialog');\n assertValidAriaAttributes(dialogRef.current);\n }\n }\n );\n }\n }, [isOpen]);\n\n const dialogProps: DialogContainerProps = {\n ref: dialogRef,\n role,\n 'aria-labelledby': titleId,\n 'aria-describedby': description ? descriptionId : undefined,\n 'aria-modal': isModal,\n tabIndex: -1,\n };\n\n const titleProps: DialogTitleProps = {\n id: titleId,\n };\n\n const descriptionProps: DialogDescriptionProps | null = description\n ? { id: descriptionId }\n : null;\n\n const backdropProps: DialogBackdropProps | null =\n closeOnBackdropClick && isModal\n ? {\n onClick: onClose,\n 'aria-hidden': true,\n }\n : null;\n\n return {\n dialogProps,\n titleProps,\n descriptionProps,\n backdropProps,\n close: onClose,\n };\n};\n","/**\n * @a13y/react - AccessibleDialog Component\n * Type-safe dialog component with enforced title\n */\n\nimport type { ReactNode } from 'react';\nimport { useAccessibleDialog } from '../hooks/use-accessible-dialog';\n\n/**\n * Props for AccessibleDialog\n */\nexport interface AccessibleDialogProps {\n /**\n * Whether dialog is open\n */\n isOpen: boolean;\n\n /**\n * Called when dialog should close\n */\n onClose: () => void;\n\n /**\n * Dialog title - REQUIRED for accessibility\n * This will be announced to screen readers\n */\n title: string;\n\n /**\n * Dialog content\n */\n children: ReactNode;\n\n /**\n * Optional description\n * Provides additional context to screen readers\n */\n description?: string;\n\n /**\n * ARIA role\n */\n role?: 'dialog' | 'alertdialog';\n\n /**\n * Whether to show close button\n */\n showCloseButton?: boolean;\n\n /**\n * Custom className for dialog container\n */\n className?: string;\n\n /**\n * Custom className for backdrop\n */\n backdropClassName?: string;\n}\n\n/**\n * Accessible Dialog Component\n *\n * Features:\n * - Focus trap with Tab/Shift+Tab cycling\n * - Escape key to close\n * - Focus restoration on close\n * - Click outside to close\n * - Required title for screen readers\n * - Body scroll lock when open\n *\n * @example\n * ```tsx\n * <AccessibleDialog\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * title=\"Confirm Action\"\n * description=\"This action cannot be undone\"\n * >\n * <p>Are you sure you want to delete this item?</p>\n * <button onClick={handleConfirm}>Confirm</button>\n * <button onClick={() => setIsOpen(false)}>Cancel</button>\n * </AccessibleDialog>\n * ```\n */\nexport const AccessibleDialog = (props: AccessibleDialogProps) => {\n const {\n isOpen,\n onClose,\n title,\n children,\n description,\n role = 'dialog',\n showCloseButton = true,\n className = '',\n backdropClassName = '',\n } = props;\n\n const { dialogProps, titleProps, descriptionProps, backdropProps, close } = useAccessibleDialog({\n isOpen,\n onClose,\n title,\n description,\n role,\n isModal: true,\n closeOnBackdropClick: true,\n });\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <>\n {/* Backdrop */}\n {backdropProps && (\n <div\n {...backdropProps}\n className={backdropClassName}\n style={{\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 50,\n }}\n />\n )}\n\n {/* Dialog */}\n <div\n ref={dialogProps.ref as React.RefObject<HTMLDivElement>}\n role={dialogProps.role}\n aria-labelledby={dialogProps['aria-labelledby']}\n aria-describedby={dialogProps['aria-describedby']}\n aria-modal={dialogProps['aria-modal']}\n tabIndex={dialogProps.tabIndex}\n className={className}\n style={{\n position: 'fixed',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n backgroundColor: 'white',\n borderRadius: '0.5rem',\n boxShadow: '0 20px 25px -5px rgba(0, 0, 0, 0.1)',\n padding: '1.5rem',\n maxWidth: '32rem',\n width: '90vw',\n maxHeight: '90vh',\n overflow: 'auto',\n zIndex: 51,\n }}\n >\n {/* Close button */}\n {showCloseButton && (\n <button\n type=\"button\"\n onClick={close}\n aria-label=\"Close dialog\"\n style={{\n position: 'absolute',\n top: '1rem',\n right: '1rem',\n padding: '0.5rem',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n fontSize: '1.25rem',\n lineHeight: 1,\n color: '#6b7280',\n }}\n >\n ✕\n </button>\n )}\n\n {/* Title */}\n <h2\n {...titleProps}\n style={{\n fontSize: '1.25rem',\n fontWeight: 600,\n marginBottom: description ? '0.5rem' : '1rem',\n paddingRight: showCloseButton ? '2rem' : 0,\n }}\n >\n {title}\n </h2>\n\n {/* Description */}\n {descriptionProps && description && (\n <p\n {...descriptionProps}\n style={{\n fontSize: '0.875rem',\n color: '#6b7280',\n marginBottom: '1rem',\n }}\n >\n {description}\n </p>\n )}\n\n {/* Content */}\n <div>{children}</div>\n </div>\n </>\n );\n};\n","/**\n * @a13y/react - useKeyboardNavigation\n * Roving tabindex keyboard navigation hook\n */\n\nimport type { NavigationDirection } from '@a13y/core/runtime/keyboard';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\n/**\n * Navigation orientation\n */\nexport type Orientation = 'horizontal' | 'vertical' | 'both';\n\n/**\n * Props for useKeyboardNavigation\n */\nexport interface UseKeyboardNavigationProps {\n /**\n * Navigation orientation\n * - 'horizontal': Arrow Left/Right\n * - 'vertical': Arrow Up/Down\n * - 'both': All arrow keys\n */\n orientation: Orientation;\n\n /**\n * Whether to loop at boundaries\n * @default false\n */\n loop?: boolean;\n\n /**\n * Callback when navigation occurs\n */\n onNavigate?: (index: number) => void;\n\n /**\n * Initial focused index\n * @default 0\n */\n defaultIndex?: number;\n\n /**\n * Controlled current index\n */\n currentIndex?: number;\n}\n\n/**\n * Item props for navigable items\n */\nexport interface NavigableItemProps {\n ref: (element: HTMLElement | null) => void;\n tabIndex: number;\n onKeyDown: (event: React.KeyboardEvent) => void;\n 'data-index': number;\n}\n\n/**\n * Return type\n */\nexport interface UseKeyboardNavigationReturn {\n /**\n * Current focused index\n */\n currentIndex: number;\n\n /**\n * Navigate to specific index\n */\n setCurrentIndex: (index: number) => void;\n\n /**\n * Get props for navigable item\n */\n getItemProps: (index: number) => NavigableItemProps;\n\n /**\n * Container props\n */\n containerProps: {\n role: 'toolbar' | 'listbox' | 'menu';\n 'aria-orientation': Orientation;\n };\n}\n\n/**\n * Hook for keyboard navigation with roving tabindex\n *\n * Features:\n * - Arrow key navigation\n * - Home/End navigation\n * - Roving tabindex pattern\n * - Automatic focus management\n * - Development-time validation\n *\n * @example\n * ```tsx\n * const { containerProps, getItemProps, currentIndex } =\n * useKeyboardNavigation({\n * orientation: 'horizontal',\n * loop: true,\n * });\n *\n * return (\n * <div {...containerProps}>\n * {items.map((item, index) => (\n * <button key={index} {...getItemProps(index)}>\n * {item.label}\n * </button>\n * ))}\n * </div>\n * );\n * ```\n */\nexport const useKeyboardNavigation = (\n props: UseKeyboardNavigationProps\n): UseKeyboardNavigationReturn => {\n const {\n orientation,\n loop = false,\n onNavigate,\n defaultIndex = 0,\n currentIndex: controlledIndex,\n } = props;\n\n const isControlled = controlledIndex !== undefined;\n const [uncontrolledIndex, setUncontrolledIndex] = useState(defaultIndex);\n const currentIndex = isControlled ? controlledIndex : uncontrolledIndex;\n\n const itemsRef = useRef<Map<number, HTMLElement>>(new Map());\n const containerRef = useRef<HTMLElement | null>(null);\n\n // Update current index\n const setCurrentIndex = useCallback(\n (index: number) => {\n if (!isControlled) {\n setUncontrolledIndex(index);\n }\n onNavigate?.(index);\n\n // Focus the element\n const element = itemsRef.current.get(index);\n if (element) {\n element.focus();\n }\n },\n [isControlled, onNavigate]\n );\n\n // Navigate in direction\n const navigate = useCallback(\n (direction: NavigationDirection) => {\n const itemCount = itemsRef.current.size;\n if (itemCount === 0) {\n return;\n }\n\n let nextIndex = currentIndex;\n\n switch (direction) {\n case 'forward':\n nextIndex = currentIndex + 1;\n if (nextIndex >= itemCount) {\n nextIndex = loop ? 0 : itemCount - 1;\n }\n break;\n\n case 'backward':\n nextIndex = currentIndex - 1;\n if (nextIndex < 0) {\n nextIndex = loop ? itemCount - 1 : 0;\n }\n break;\n\n case 'first':\n nextIndex = 0;\n break;\n\n case 'last':\n nextIndex = itemCount - 1;\n break;\n }\n\n if (nextIndex !== currentIndex) {\n setCurrentIndex(nextIndex);\n }\n },\n [currentIndex, loop, setCurrentIndex]\n );\n\n // Handle keyboard events\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n const { key } = event;\n\n let direction: NavigationDirection | null = null;\n\n // Arrow keys\n if (key === 'ArrowRight') {\n if (orientation === 'horizontal' || orientation === 'both') {\n direction = 'forward';\n }\n } else if (key === 'ArrowLeft') {\n if (orientation === 'horizontal' || orientation === 'both') {\n direction = 'backward';\n }\n } else if (key === 'ArrowDown') {\n if (orientation === 'vertical' || orientation === 'both') {\n direction = 'forward';\n }\n } else if (key === 'ArrowUp') {\n if (orientation === 'vertical' || orientation === 'both') {\n direction = 'backward';\n }\n }\n\n // Home/End\n else if (key === 'Home') {\n direction = 'first';\n } else if (key === 'End') {\n direction = 'last';\n }\n\n if (direction) {\n event.preventDefault();\n navigate(direction);\n }\n },\n [orientation, navigate]\n );\n\n // Get props for individual item\n const getItemProps = useCallback(\n (index: number): NavigableItemProps => {\n return {\n ref: (element: HTMLElement | null) => {\n if (element) {\n itemsRef.current.set(index, element);\n } else {\n itemsRef.current.delete(index);\n }\n },\n tabIndex: index === currentIndex ? 0 : -1,\n onKeyDown: handleKeyDown,\n 'data-index': index,\n };\n },\n [currentIndex, handleKeyDown]\n );\n\n // Development-time validation\n useEffect(() => {\n if (typeof __DEV__ !== 'undefined' && __DEV__) {\n import('@a13y/devtools/runtime/validators').then(({ keyboardValidator }) => {\n // Validate container\n if (containerRef.current) {\n keyboardValidator.validateContainer(containerRef.current);\n }\n\n // Validate roving tabindex\n const container = Array.from(itemsRef.current.values())[0]?.parentElement;\n if (container) {\n keyboardValidator.validateRovingTabindex(container);\n }\n });\n }\n }, []);\n\n const containerProps = {\n role: 'toolbar' as const,\n 'aria-orientation': orientation,\n };\n\n return {\n currentIndex,\n setCurrentIndex,\n getItemProps,\n containerProps,\n };\n};\n","/**\n * @a13y/react - AccessibleMenu Component\n * Dropdown menu with keyboard navigation\n */\n\nimport type { ReactNode } from 'react';\nimport { useState } from 'react';\nimport { useAccessibleButton } from '../hooks/use-accessible-button';\nimport { useFocusTrap } from '../hooks/use-focus-trap';\nimport { useKeyboardNavigation } from '../hooks/use-keyboard-navigation';\n\n/**\n * Menu item definition\n */\nexport interface MenuItem {\n /**\n * Unique identifier\n */\n id: string;\n\n /**\n * Item label\n */\n label: string;\n\n /**\n * Click handler\n */\n onPress: () => void;\n\n /**\n * Whether item is disabled\n */\n disabled?: boolean;\n\n /**\n * Optional icon\n */\n icon?: ReactNode;\n}\n\n/**\n * Props for AccessibleMenu\n */\nexport interface AccessibleMenuProps {\n /**\n * Menu trigger button label\n */\n label: string;\n\n /**\n * Trigger button content\n */\n trigger: ReactNode;\n\n /**\n * Menu items\n */\n items: MenuItem[];\n\n /**\n * Custom className for trigger button\n */\n className?: string;\n\n /**\n * Custom className for menu container\n */\n menuClassName?: string;\n}\n\n/**\n * Accessible Menu Component\n *\n * Dropdown menu with full keyboard navigation:\n * - Arrow Up/Down to navigate items\n * - Enter/Space to select\n * - Escape to close\n * - Focus trap when open\n *\n * @example\n * ```tsx\n * <AccessibleMenu\n * label=\"Open actions menu\"\n * trigger=\"Actions ▼\"\n * items={[\n * { id: 'edit', label: 'Edit', onPress: () => console.log('Edit') },\n * { id: 'delete', label: 'Delete', onPress: () => console.log('Delete'), disabled: true },\n * { id: 'share', label: 'Share', onPress: () => console.log('Share') },\n * ]}\n * />\n * ```\n */\nexport const AccessibleMenu = (props: AccessibleMenuProps) => {\n const { label, trigger, items, className = '', menuClassName = '' } = props;\n\n const [isOpen, setIsOpen] = useState(false);\n\n // Trigger button\n const { buttonProps: triggerProps } = useAccessibleButton({\n label,\n onPress: () => setIsOpen(!isOpen),\n });\n\n // Focus trap for menu\n const { trapRef } = useFocusTrap({\n isActive: isOpen,\n onEscape: () => setIsOpen(false),\n restoreFocus: true,\n });\n\n // Keyboard navigation for menu items\n const { getItemProps } = useKeyboardNavigation({\n orientation: 'vertical',\n loop: true,\n });\n\n const handleItemPress = (item: MenuItem) => {\n if (item.disabled) {\n return;\n }\n item.onPress();\n setIsOpen(false);\n };\n\n return (\n <div style={{ position: 'relative', display: 'inline-block' }}>\n {/* Trigger */}\n <button\n {...triggerProps}\n className={className}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n style={{\n padding: '0.5rem 1rem',\n border: '1px solid #d1d5db',\n borderRadius: '0.375rem',\n backgroundColor: 'white',\n cursor: 'pointer',\n fontSize: '0.875rem',\n fontWeight: 500,\n }}\n >\n {trigger}\n </button>\n\n {/* Menu */}\n {isOpen && (\n <div\n ref={trapRef as React.RefObject<HTMLDivElement>}\n role=\"menu\"\n aria-orientation=\"vertical\"\n className={menuClassName}\n style={{\n position: 'absolute',\n top: 'calc(100% + 0.25rem)',\n left: 0,\n minWidth: '12rem',\n backgroundColor: 'white',\n border: '1px solid #e5e7eb',\n borderRadius: '0.375rem',\n boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1)',\n padding: '0.25rem',\n zIndex: 50,\n }}\n >\n {items.map((item, index) => {\n const itemProps = getItemProps(index);\n\n return (\n <button\n key={item.id}\n {...itemProps}\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={() => handleItemPress(item)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n width: '100%',\n padding: '0.5rem 0.75rem',\n border: 'none',\n background: 'transparent',\n textAlign: 'left',\n fontSize: '0.875rem',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n borderRadius: '0.25rem',\n color: item.disabled ? '#9ca3af' : '#111827',\n opacity: item.disabled ? 0.5 : 1,\n }}\n onMouseEnter={(e) => {\n if (!item.disabled) {\n e.currentTarget.style.backgroundColor = '#f3f4f6';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {item.icon && <span>{item.icon}</span>}\n <span>{item.label}</span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n","/**\n * @a13y/react - AccessibleModal Component\n * Full-screen modal with header, body, footer sections\n */\n\nimport type { ReactNode } from 'react';\nimport { useAccessibleDialog } from '../hooks/use-accessible-dialog';\n\n/**\n * Props for AccessibleModal\n */\nexport interface AccessibleModalProps {\n /**\n * Whether modal is open\n */\n isOpen: boolean;\n\n /**\n * Called when modal should close\n */\n onClose: () => void;\n\n /**\n * Modal title - REQUIRED\n */\n title: string;\n\n /**\n * Modal body content\n */\n children: ReactNode;\n\n /**\n * Footer content (typically action buttons)\n */\n footer?: ReactNode;\n\n /**\n * Modal size\n */\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\n /**\n * Whether modal can be closed by clicking outside\n */\n closeOnBackdropClick?: boolean;\n\n /**\n * Custom className for modal container\n */\n className?: string;\n}\n\n/**\n * Accessible Modal Component\n *\n * Full-featured modal with header, body, and footer sections.\n *\n * @example\n * ```tsx\n * <AccessibleModal\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * title=\"Edit Profile\"\n * size=\"md\"\n * footer={\n * <>\n * <AccessibleButton onPress={() => setIsOpen(false)}>\n * Cancel\n * </AccessibleButton>\n * <AccessibleButton onPress={handleSave} variant=\"primary\">\n * Save Changes\n * </AccessibleButton>\n * </>\n * }\n * >\n * <form>\n * <input type=\"text\" placeholder=\"Name\" />\n * <input type=\"email\" placeholder=\"Email\" />\n * </form>\n * </AccessibleModal>\n * ```\n */\nexport const AccessibleModal = (props: AccessibleModalProps) => {\n const {\n isOpen,\n onClose,\n title,\n children,\n footer,\n size = 'md',\n closeOnBackdropClick = false,\n className = '',\n } = props;\n\n const { dialogProps, titleProps, backdropProps, close } = useAccessibleDialog({\n isOpen,\n onClose,\n title,\n role: 'dialog',\n isModal: true,\n closeOnBackdropClick,\n });\n\n if (!isOpen) {\n return null;\n }\n\n // Size variants\n const sizeStyles: Record<NonNullable<AccessibleModalProps['size']>, React.CSSProperties> = {\n sm: { maxWidth: '24rem' },\n md: { maxWidth: '32rem' },\n lg: { maxWidth: '48rem' },\n xl: { maxWidth: '64rem' },\n full: { maxWidth: '95vw', maxHeight: '95vh' },\n };\n\n return (\n <>\n {/* Backdrop */}\n {backdropProps && (\n <div\n {...backdropProps}\n style={{\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 50,\n }}\n />\n )}\n\n {/* Modal */}\n <div\n ref={dialogProps.ref as React.RefObject<HTMLDivElement>}\n role={dialogProps.role}\n aria-labelledby={dialogProps['aria-labelledby']}\n aria-describedby={dialogProps['aria-describedby']}\n aria-modal={dialogProps['aria-modal']}\n tabIndex={dialogProps.tabIndex}\n className={className}\n style={{\n position: 'fixed',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n backgroundColor: 'white',\n borderRadius: '0.5rem',\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n width: '90vw',\n maxHeight: '90vh',\n display: 'flex',\n flexDirection: 'column',\n zIndex: 51,\n ...sizeStyles[size],\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: '1.5rem',\n borderBottom: '1px solid #e5e7eb',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n <h2\n {...titleProps}\n style={{\n fontSize: '1.25rem',\n fontWeight: 600,\n margin: 0,\n }}\n >\n {title}\n </h2>\n\n <button\n type=\"button\"\n onClick={close}\n aria-label=\"Close modal\"\n style={{\n padding: '0.5rem',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n fontSize: '1.25rem',\n lineHeight: 1,\n color: '#6b7280',\n borderRadius: '0.25rem',\n }}\n >\n ✕\n </button>\n </div>\n\n {/* Body */}\n <div\n style={{\n flex: 1,\n overflowY: 'auto',\n padding: '1.5rem',\n }}\n >\n {children}\n </div>\n\n {/* Footer */}\n {footer && (\n <div\n style={{\n padding: '1.5rem',\n borderTop: '1px solid #e5e7eb',\n display: 'flex',\n gap: '0.75rem',\n justifyContent: 'flex-end',\n }}\n >\n {footer}\n </div>\n )}\n </div>\n </>\n );\n};\n","/**\n * @a13y/react - AccessibleTabs Component\n * Tab interface with keyboard navigation\n */\n\nimport type { ReactNode } from 'react';\nimport { useState } from 'react';\nimport { useKeyboardNavigation } from '../hooks/use-keyboard-navigation';\n\n/**\n * Tab definition\n */\nexport interface Tab {\n /**\n * Unique identifier\n */\n id: string;\n\n /**\n * Tab label - REQUIRED for accessibility\n */\n label: string;\n\n /**\n * Tab panel content\n */\n content: ReactNode;\n\n /**\n * Whether tab is disabled\n */\n disabled?: boolean;\n\n /**\n * Optional icon\n */\n icon?: ReactNode;\n}\n\n/**\n * Props for AccessibleTabs\n */\nexport interface AccessibleTabsProps {\n /**\n * Tabs configuration - REQUIRED\n * Must have at least one tab\n */\n tabs: [Tab, ...Tab[]]; // Non-empty array\n\n /**\n * Initially selected tab index\n */\n defaultTab?: number;\n\n /**\n * Controlled selected tab index\n */\n selectedTab?: number;\n\n /**\n * Called when tab changes\n */\n onTabChange?: (index: number) => void;\n\n /**\n * Custom className for tabs container\n */\n className?: string;\n\n /**\n * Custom className for panel\n */\n panelClassName?: string;\n}\n\n/**\n * Accessible Tabs Component\n *\n * Tab interface following WAI-ARIA Tabs pattern:\n * - Arrow Left/Right to navigate tabs\n * - Home/End to jump to first/last\n * - Automatic panel switching\n * - Proper ARIA attributes\n *\n * @example\n * ```tsx\n * <AccessibleTabs\n * tabs={[\n * {\n * id: 'account',\n * label: 'Account',\n * content: <div>Account settings...</div>,\n * },\n * {\n * id: 'security',\n * label: 'Security',\n * content: <div>Security settings...</div>,\n * },\n * {\n * id: 'billing',\n * label: 'Billing',\n * content: <div>Billing information...</div>,\n * disabled: true,\n * },\n * ]}\n * />\n * ```\n */\nexport const AccessibleTabs = (props: AccessibleTabsProps) => {\n const {\n tabs,\n defaultTab = 0,\n selectedTab: controlledTab,\n onTabChange,\n className = '',\n panelClassName = '',\n } = props;\n\n const isControlled = controlledTab !== undefined;\n const [uncontrolledTab, setUncontrolledTab] = useState(defaultTab);\n const selectedIndex = isControlled ? controlledTab : uncontrolledTab;\n\n // Keyboard navigation\n const { getItemProps, setCurrentIndex } = useKeyboardNavigation({\n orientation: 'horizontal',\n loop: false,\n currentIndex: selectedIndex,\n onNavigate: (index) => {\n // Skip disabled tabs\n if (tabs[index]?.disabled) {\n return;\n }\n\n if (!isControlled) {\n setUncontrolledTab(index);\n }\n onTabChange?.(index);\n },\n });\n\n const handleTabClick = (index: number) => {\n if (tabs[index]?.disabled) {\n return;\n }\n\n setCurrentIndex(index);\n\n if (!isControlled) {\n setUncontrolledTab(index);\n }\n onTabChange?.(index);\n };\n\n const selectedTab = tabs[selectedIndex];\n\n return (\n <div className={className}>\n {/* Tab List */}\n <div\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n style={{\n display: 'flex',\n borderBottom: '2px solid #e5e7eb',\n gap: '0.25rem',\n }}\n >\n {tabs.map((tab, index) => {\n const itemProps = getItemProps(index);\n const isSelected = index === selectedIndex;\n\n return (\n <button\n key={tab.id}\n {...itemProps}\n id={`tab-${tab.id}`}\n role=\"tab\"\n aria-selected={isSelected}\n aria-controls={`panel-${tab.id}`}\n disabled={tab.disabled}\n onClick={() => handleTabClick(index)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '0.5rem',\n padding: '0.75rem 1rem',\n border: 'none',\n background: 'transparent',\n cursor: tab.disabled ? 'not-allowed' : 'pointer',\n fontSize: '0.875rem',\n fontWeight: isSelected ? 600 : 400,\n color: tab.disabled ? '#9ca3af' : isSelected ? '#2563eb' : '#6b7280',\n borderBottom: isSelected ? '2px solid #2563eb' : 'none',\n marginBottom: '-2px',\n opacity: tab.disabled ? 0.5 : 1,\n transition: 'color 0.2s',\n }}\n >\n {tab.icon && <span>{tab.icon}</span>}\n <span>{tab.label}</span>\n </button>\n );\n })}\n </div>\n\n {/* Tab Panel */}\n {selectedTab && (\n <div\n id={`panel-${selectedTab.id}`}\n role=\"tabpanel\"\n aria-labelledby={`tab-${selectedTab.id}`}\n className={panelClassName}\n style={{\n padding: '1.5rem',\n }}\n >\n {selectedTab.content}\n </div>\n )}\n </div>\n );\n};\n"]}
|