@prismiq/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/README.md +88 -0
- package/dist/CustomSQLEditor-BXB4rf1q.d.cts +1297 -0
- package/dist/CustomSQLEditor-DYeId0Gp.d.ts +1297 -0
- package/dist/DashboardDialog-B3vYC5Gs.d.ts +1106 -0
- package/dist/DashboardDialog-LHmrtNQU.d.cts +1106 -0
- package/dist/accessibility-2yy5yqRR.d.cts +145 -0
- package/dist/accessibility-2yy5yqRR.d.ts +145 -0
- package/dist/charts/index.cjs +110 -0
- package/dist/charts/index.cjs.map +1 -0
- package/dist/charts/index.d.cts +2 -0
- package/dist/charts/index.d.ts +2 -0
- package/dist/charts/index.js +5 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/chunk-2H5WTH4K.js +2409 -0
- package/dist/chunk-2H5WTH4K.js.map +1 -0
- package/dist/chunk-4AVL6GQK.cjs +470 -0
- package/dist/chunk-4AVL6GQK.cjs.map +1 -0
- package/dist/chunk-EX74SI67.js +455 -0
- package/dist/chunk-EX74SI67.js.map +1 -0
- package/dist/chunk-FEABEF3J.cjs +7543 -0
- package/dist/chunk-FEABEF3J.cjs.map +1 -0
- package/dist/chunk-JTCBZDHY.js +126 -0
- package/dist/chunk-JTCBZDHY.js.map +1 -0
- package/dist/chunk-LMTG3LRC.cjs +326 -0
- package/dist/chunk-LMTG3LRC.cjs.map +1 -0
- package/dist/chunk-MDXGGZSW.cjs +273 -0
- package/dist/chunk-MDXGGZSW.cjs.map +1 -0
- package/dist/chunk-MOAEEF5P.js +7510 -0
- package/dist/chunk-MOAEEF5P.js.map +1 -0
- package/dist/chunk-NK7HKX2J.cjs +2459 -0
- package/dist/chunk-NK7HKX2J.cjs.map +1 -0
- package/dist/chunk-NY6TZLST.cjs +8781 -0
- package/dist/chunk-NY6TZLST.cjs.map +1 -0
- package/dist/chunk-T6STUE7E.js +321 -0
- package/dist/chunk-T6STUE7E.js.map +1 -0
- package/dist/chunk-TRW7DKLP.cjs +141 -0
- package/dist/chunk-TRW7DKLP.cjs.map +1 -0
- package/dist/chunk-UPYINBZU.js +8706 -0
- package/dist/chunk-UPYINBZU.js.map +1 -0
- package/dist/chunk-WWTT2OJ5.js +246 -0
- package/dist/chunk-WWTT2OJ5.js.map +1 -0
- package/dist/components/index.cjs +222 -0
- package/dist/components/index.cjs.map +1 -0
- package/dist/components/index.d.cts +207 -0
- package/dist/components/index.d.ts +207 -0
- package/dist/components/index.js +5 -0
- package/dist/components/index.js.map +1 -0
- package/dist/dashboard/index.cjs +140 -0
- package/dist/dashboard/index.cjs.map +1 -0
- package/dist/dashboard/index.d.cts +302 -0
- package/dist/dashboard/index.d.ts +302 -0
- package/dist/dashboard/index.js +7 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/export/index.cjs +32 -0
- package/dist/export/index.cjs.map +1 -0
- package/dist/export/index.d.cts +197 -0
- package/dist/export/index.d.ts +197 -0
- package/dist/export/index.js +3 -0
- package/dist/export/index.js.map +1 -0
- package/dist/index-C-Qcuu4Y.d.cts +821 -0
- package/dist/index-rPc7ijt8.d.ts +821 -0
- package/dist/index.cjs +1486 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1435 -0
- package/dist/index.d.ts +1435 -0
- package/dist/index.js +926 -0
- package/dist/index.js.map +1 -0
- package/dist/ssr/index.cjs +64 -0
- package/dist/ssr/index.cjs.map +1 -0
- package/dist/ssr/index.d.cts +213 -0
- package/dist/ssr/index.d.ts +213 -0
- package/dist/ssr/index.js +3 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/types-WrCbOeAV.d.cts +569 -0
- package/dist/types-WrCbOeAV.d.ts +569 -0
- package/dist/utils/index.cjs +64 -0
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/index.d.cts +112 -0
- package/dist/utils/index.d.ts +112 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +110 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pins/PinButton.tsx","../src/pins/PinMenu.tsx","../src/pins/PinnedDashboardList.tsx","../src/pins/PinnedDashboardView.tsx","../src/index.ts"],"names":["errorStyles","PinIcon","jsxs","jsx","useState","useCallback","error","UnpinIcon","containerStyles","titleStyles","unpinButtonStyles","contentStyles","errorBannerStyles"],"mappings":";;;;;;;;;;;;AAuCA,IAAM,OAAA,GAAU,CAAC,EAAE,MAAA,EAAQ,MAAK,qBAC9B,IAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAM,SAAS,cAAA,GAAiB,MAAA;AAAA,IAChC,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAY,GAAA;AAAA,IACZ,aAAA,EAAc,OAAA;AAAA,IACd,cAAA,EAAe,OAAA;AAAA,IAEf,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,UAAA,EAAW,CAAA;AAAA,sBACnB,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qLAAA,EAAsL;AAAA;AAAA;AAChM,CAAA;AAOF,IAAM,UAAA,GAA4B;AAAA,EAChC,OAAA,EAAS,aAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,GAAA,EAAK,2BAAA;AAAA,EACL,UAAA,EAAY,0BAAA;AAAA,EACZ,UAAA,EAAY,GAAA;AAAA,EACZ,YAAA,EAAc,0BAAA;AAAA,EACd,MAAA,EAAQ,uCAAA;AAAA,EACR,eAAA,EAAiB,8BAAA;AAAA,EACjB,KAAA,EAAO,2BAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,2DAAA;AAAA,EACZ,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,UAAA,GAAyE;AAAA,EAC7E,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,2BAAA;AAAA,IACT,QAAA,EAAU,6BAAA;AAAA,IACV,QAAA,EAAU,EAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACb;AAAA,EACA,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,2BAAA;AAAA,IACT,QAAA,EAAU,+BAAA;AAAA,IACV,QAAA,EAAU,EAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACb;AAAA,EACA,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,2BAAA;AAAA,IACT,QAAA,EAAU,6BAAA;AAAA,IACV,QAAA,EAAU,EAAA;AAAA,IACV,SAAA,EAAW;AAAA;AAEf,CAAA;AAEA,IAAM,YAAA,GAA8B;AAAA,EAClC,eAAA,EAAiB,6CAAA;AAAA,EACjB,WAAA,EAAa,8BAAA;AAAA,EACb,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,cAAA,GAAgC;AAAA,EACpC,OAAA,EAAS,GAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,SAAA,GAAiE;AAAA,EACrE,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAuBO,SAAS,SAAA,CAAU;AAAA,EACxB,WAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA,GAAQ,KAAA;AAAA,EACR,UAAA,GAAa,OAAA;AAAA,EACb,QAAA,GAAW,KAAA;AAAA,EACX,IAAA,GAAO,IAAA;AAAA,EACP,WAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM,EAAE,QAAA,EAAU,aAAA,EAAe,WAAW,aAAA,EAAe,OAAA,KAAY,qBAAA,CAAsB;AAAA,IAC3F;AAAA,GACD,CAAA;AACD,EAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,aAAA,KAAkB,eAAA,EAAgB;AAC7D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAuB,IAAI,CAAA;AAGjE,EAAA,MAAM,QAAA,GAAW,cAAc,OAAO,CAAA;AACtC,EAAA,MAAM,SAAA,GAAY,iBAAiB,aAAA,CAAc,SAAA;AAEjD,EAAA,MAAM,WAAA,GAAc,YAAY,YAAY;AAC1C,IAAA,IAAI,SAAA,EAAW;AAEf,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,IAAI;AACF,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,KAAA,CAAM,aAAa,OAAO,CAAA;AAChC,QAAA,WAAA,GAAc,KAAK,CAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,MAAM,GAAA,CAAI,aAAa,OAAO,CAAA;AAC9B,QAAA,WAAA,GAAc,IAAI,CAAA;AAAA,MACpB;AAEA,MAAA,MAAM,OAAA,EAAQ;AAAA,IAChB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,KAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,GAAG,CAAA;AAAA,IAC5C;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,OAAA,EAAS,QAAA,EAAU,WAAW,GAAA,EAAK,KAAA,EAAO,WAAA,EAAa,OAAO,CAAC,CAAA;AAEhF,EAAA,MAAMA,YAAAA,GAA6B;AAAA,IACjC,WAAA,EAAa,4BAAA;AAAA,IACb,KAAA,EAAO;AAAA,GACT;AAEA,EAAA,MAAM,cAAA,GAAgC;AAAA,IACpC,GAAG,UAAA;AAAA,IACH,GAAG,WAAW,IAAI,CAAA;AAAA,IAClB,GAAI,QAAA,GAAW,YAAA,GAAe,EAAC;AAAA,IAC/B,GAAI,SAAA,GAAY,cAAA,GAAiB,EAAC;AAAA,IAClC,GAAI,WAAA,GAAcA,YAAAA,GAAc,EAAC;AAAA,IACjC,GAAG;AAAA,GACL;AAEA,EAAA,MAAM,QAAA,GAAW,UAAU,IAAI,CAAA;AAC/B,EAAA,MAAM,YAAA,GAAe,WAAW,UAAA,GAAa,KAAA;AAC7C,EAAA,MAAM,YAAA,GAAe,WAAA,GAAc,CAAA,OAAA,EAAU,WAAA,CAAY,OAAO,CAAA,CAAA,GAAK,MAAA;AACrE,EAAA,MAAM,eAAA,GAAkB,YAAA,KAAiB,QAAA,GAAW,YAAA,GAAe,MAAA,CAAA;AACnE,EAAA,MAAM,YAAA,GAAe,YAAA,KAAiB,QAAA,GAAW,YAAA,GAAe,MAAA,CAAA;AAEhE,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,OAAA,EAAA,EACE,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,EAOH,CAAA;AAAA,oBACA,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,WAAA;AAAA,QACT,QAAA,EAAU,SAAA;AAAA,QACV,SAAA;AAAA,QACA,KAAA,EAAO,cAAA;AAAA,QACP,cAAA,EAAc,QAAA;AAAA,QACd,YAAA,EAAY,eAAA;AAAA,QACZ,cAAA,EAAc,cAAc,IAAA,GAAO,MAAA;AAAA,QACnC,KAAA,EAAO,YAAA;AAAA,QAEN,QAAA,EAAA;AAAA,UAAA,SAAA,mBACC,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,OAAA,EAAS,cAAA;AAAA,gBACT,KAAA,EAAO,QAAA;AAAA,gBACP,MAAA,EAAQ,QAAA;AAAA,gBACR,MAAA,EAAQ,wBAAA;AAAA,gBACR,gBAAA,EAAkB,aAAA;AAAA,gBAClB,YAAA,EAAc,KAAA;AAAA,gBACd,SAAA,EAAW;AAAA;AACb;AAAA,8BAGF,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,MAAM,QAAA,EAAU,CAAA;AAAA,UAE5C,CAAC,QAAA,oBAAY,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,YAAA,EAAa;AAAA;AAAA;AAAA;AACpC,GAAA,EACF,CAAA;AAEJ;ACxNA,IAAM,iBAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,2BAAA;AAAA,EACT,eAAA,EAAiB,2CAAA;AAAA,EACjB,KAAA,EAAO,4BAAA;AAAA,EACP,YAAA,EAAc,0BAAA;AAAA,EACd,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,YAAA,EAAc;AAChB,CAAA;AAiCA,IAAMC,QAAAA,GAAU,CAAC,EAAE,IAAA,uBACjBC,IAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAY,GAAA;AAAA,IACZ,aAAA,EAAc,OAAA;AAAA,IACd,cAAA,EAAe,OAAA;AAAA,IAEf,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,sBACnBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qLAAA,EAAsL;AAAA;AAAA;AAChM,CAAA;AAGF,IAAM,eAAA,GAAkB,CAAC,EAAE,IAAA,uBACzBA,GAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAY,GAAA;AAAA,IACZ,aAAA,EAAc,OAAA;AAAA,IACd,cAAA,EAAe,OAAA;AAAA,IAEf,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,cAAA,EAAe;AAAA;AACzB,CAAA;AAGF,IAAM,SAAA,GAAY,CAAC,EAAE,IAAA,uBACnBA,GAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAY,GAAA;AAAA,IACZ,aAAA,EAAc,OAAA;AAAA,IACd,cAAA,EAAe,OAAA;AAAA,IAEf,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iBAAA,EAAkB;AAAA;AAC5B,CAAA;AAOF,IAAM,aAAA,GAA+B;AAAA,EACnC,OAAA,EAAS,aAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,qDAAA;AAAA,EACT,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,+BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,YAAA,EAAc,0BAAA;AAAA,EACd,MAAA,EAAQ,uCAAA;AAAA,EACR,eAAA,EAAiB,8BAAA;AAAA,EACjB,KAAA,EAAO,2BAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,4CAAA;AAAA,EACZ,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,UAAA,GAA4B;AAAA,EAChC,QAAA,EAAU,UAAA;AAAA,EACV,GAAA,EAAK,MAAA;AAAA,EACL,IAAA,EAAM,CAAA;AAAA,EACN,SAAA,EAAW,2BAAA;AAAA,EACX,QAAA,EAAU,GAAA;AAAA,EACV,OAAA,EAAS,2BAAA;AAAA,EACT,eAAA,EAAiB,8BAAA;AAAA,EACjB,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,SAAA,EAAW,4DAAA;AAAA,EACX,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,cAAA,GAAgC;AAAA,EACpC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,qDAAA;AAAA,EACT,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO,2BAAA;AAAA,EACP,YAAA,EAAc,0BAAA;AAAA,EACd,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,wBAAA;AAAA,EACZ,MAAA,EAAQ,MAAA;AAAA,EACR,eAAA,EAAiB,aAAA;AAAA,EACjB,KAAA,EAAO,MAAA;AAAA,EACP,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,cAAA,GAAgC;AAAA,EACpC,KAAA,EAAO,EAAA;AAAA,EACP,MAAA,EAAQ,EAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,YAAA,EAAc,0BAAA;AAAA,EACd,MAAA,EAAQ,uCAAA;AAAA,EACR,eAAA,EAAiB,8BAAA;AAAA,EACjB,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,qBAAA,GAAuC;AAAA,EAC3C,GAAG,cAAA;AAAA,EACH,eAAA,EAAiB,8BAAA;AAAA,EACjB,WAAA,EAAa,8BAAA;AAAA,EACb,KAAA,EAAO;AACT,CAAA;AAuBO,SAAS,OAAA,CAAQ;AAAA,EACtB,WAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIC,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAuB,IAAI,CAAA;AACjE,EAAA,MAAM,YAAA,GAAe,OAAuB,IAAI,CAAA;AAEhD,EAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,aAAA,KAAkB,qBAAA,CAAsB;AAAA,IAC5E;AAAA,GACD,CAAA;AACD,EAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,aAAA,KAAkB,eAAA,EAAgB;AAE7D,EAAA,MAAM,SAAA,GAAY,iBAAiB,aAAA,CAAc,SAAA;AAGjD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,cAAA,CAAe,IAAI,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAsB;AAChD,MAAA,IAAI,YAAA,CAAa,WAAW,CAAC,YAAA,CAAa,QAAQ,QAAA,CAAS,KAAA,CAAM,MAAc,CAAA,EAAG;AAChF,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AACzD,MAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,kBAAkB,CAAA;AAAA,IAC3E;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAAyB;AAC7C,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,YAAY,CAAA;AACjD,MAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,YAAY,CAAA;AAAA,IACnE;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,YAAA,GAAeC,WAAAA,CAAY,CAAC,GAAA,KAAgB;AAChD,IAAA,OAAO,YAAY;AACjB,MAAA,IAAI,SAAA,EAAW;AAEf,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,SAAS,GAAG,CAAA;AAC3B,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAM,KAAA,CAAM,aAAa,GAAG,CAAA;AAC5B,UAAA,WAAA,GAAc,KAAK,KAAK,CAAA;AAAA,QAC1B,CAAA,MAAO;AACL,UAAA,MAAM,GAAA,CAAI,aAAa,GAAG,CAAA;AAC1B,UAAA,WAAA,GAAc,KAAK,IAAI,CAAA;AAAA,QACzB;AACA,QAAA,MAAM,OAAA,EAAQ;AAAA,MAChB,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,KAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,QAAA,cAAA,CAAe,KAAK,CAAA;AACpB,QAAA,OAAA,CAAQ,KAAA,CAAM,mCAAA,EAAqC,GAAA,EAAK,GAAG,CAAA;AAAA,MAC7D;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,QAAA,EAAU,WAAW,GAAA,EAAK,KAAA,EAAO,WAAA,EAAa,OAAO,CAAC,CAAA;AAGvE,EAAA,MAAM,WAAA,GAAc,SAAS,MAAA,CAAO,CAAC,QAAQ,QAAA,CAAS,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,MAAA;AAE/D,EAAA,uBACEH,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,SAAA;AAAA,MACA,OAAO,EAAE,QAAA,EAAU,YAAY,OAAA,EAAS,cAAA,EAAgB,GAAG,KAAA,EAAM;AAAA,MAEjE,QAAA,EAAA;AAAA,wBAAAA,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,SAAA,CAAU,CAAC,MAAM,CAAA;AAAA,YAChC,KAAA,EAAO,aAAA;AAAA,YACP,eAAA,EAAc,MAAA;AAAA,YACd,eAAA,EAAe,MAAA;AAAA,YAEf,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAACF,QAAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,8BACnBC,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,gBAAA,KAAA;AAAA,gBAAI,WAAA,GAAc,CAAA,GAAI,CAAA,EAAA,EAAK,WAAW,CAAA,CAAA,CAAA,GAAM;AAAA,eAAA,EAAG,CAAA;AAAA,8BACrDC,GAAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA;AAAA,SAC7B;AAAA,QAEC,0BACCD,IAAAA,CAAC,SAAI,KAAA,EAAO,UAAA,EAAY,MAAK,MAAA,EAC1B,QAAA,EAAA;AAAA,UAAA,WAAA,oBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAmB,QAAA,EAAA;AAAA,YAAA,UAAA;AAAA,YACpB,WAAA,CAAY;AAAA,WAAA,EACvB,CAAA;AAAA,UAED,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,KAAQ;AACrB,YAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC9B,YAAA,uBACEA,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,QAAA;AAAA,gBACL,IAAA,EAAK,kBAAA;AAAA,gBACL,cAAA,EAAc,MAAA;AAAA,gBACd,OAAA,EAAS,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA;AAAA,gBAC5B,QAAA,EAAU,SAAA;AAAA,gBACV,KAAA,EAAO;AAAA,kBACL,GAAG,cAAA;AAAA,kBACH,OAAA,EAAS,YAAY,GAAA,GAAM;AAAA,iBAC7B;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,MAAA,GAAS,qBAAA,GAAwB,cAAA,EAC3C,QAAA,EAAA,MAAA,oBAAUA,GAAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAM,EAAA,EAAI,CAAA,EAClC,CAAA;AAAA,kBACC,GAAA,CAAI,IAAA,oBAAQA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAO,EAAI,QAAA,EAAA,GAAA,CAAI,IAAA,EAAK,CAAA;AAAA,kCACzDA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,GAAA,CAAI,KAAA,EAAM;AAAA;AAAA,eAAA;AAAA,cAfZ,GAAA,CAAI;AAAA,aAgBX;AAAA,UAEJ,CAAC;AAAA,SAAA,EACH;AAAA;AAAA;AAAA,GAEJ;AAEJ;ACnSA,IAAM,aAAA,GAAgB,sBACpBD,IAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAY,GAAA;AAAA,IACZ,aAAA,EAAc,OAAA;AAAA,IACd,cAAA,EAAe,OAAA;AAAA,IAEf,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,UAAK,CAAA,EAAE,GAAA,EAAI,GAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,CAAA;AAAA,sBACvCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,GAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,CAAA;AAAA,sBACxCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,GAAE,IAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,CAAA;AAAA,sBACzCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,GAAE,IAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI;AAAA;AAAA;AAC1C,CAAA;AAGF,IAAM,SAAA,GAAY,sBAChBD,IAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAY,GAAA;AAAA,IACZ,aAAA,EAAc,OAAA;AAAA,IACd,cAAA,EAAe,OAAA;AAAA,IAEf,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa,CAAA;AAAA,sBACrBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,sBACnBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iGAAA,EAAkG,CAAA;AAAA,sBAC1GA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uBAAA,EAAwB,CAAA;AAAA,sBAChCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oBAAA,EAAqB;AAAA;AAAA;AAC/B,CAAA;AAOF,IAAM,eAAA,GAAiC;AAAA,EACrC,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,UAAA,GAA4B;AAAA,EAChC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,2BAAA;AAAA,EACT,eAAA,EAAiB,8BAAA;AAAA,EACjB,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,eAAA,GAAiC;AAAA,EACrC,eAAA,EAAiB,6CAAA;AAAA,EACjB,WAAA,EAAa,8BAAA;AAAA,EACb,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,iBAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,KAAA,EAAO,EAAA;AAAA,EACP,MAAA,EAAQ,EAAA;AAAA,EACR,eAAA,EAAiB,6CAAA;AAAA,EACjB,KAAA,EAAO,8BAAA;AAAA,EACP,YAAA,EAAc,0BAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,aAAA,GAA+B;AAAA,EACnC,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,WAAA,GAA6B;AAAA,EACjC,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,+BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,2BAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,QAAA,EAAU,QAAA;AAAA,EACV,YAAA,EAAc,UAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,iBAAA,GAAmC;AAAA,EACvC,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO,iCAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,SAAA,EAAW,2BAAA;AAAA,EACX,QAAA,EAAU,QAAA;AAAA,EACV,YAAA,EAAc,UAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,iBAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,KAAA,EAAO,EAAA;AAAA,EACP,MAAA,EAAQ,EAAA;AAAA,EACR,OAAA,EAAS,CAAA;AAAA,EACT,eAAA,EAAiB,aAAA;AAAA,EACjB,MAAA,EAAQ,uBAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,KAAA,EAAO,iCAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,qCAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,gBAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,OAAA,EAAS,2BAAA;AAAA,EACT,SAAA,EAAW,QAAA;AAAA,EACX,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,aAAA,GAA+B;AAAA,EACnC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,WAAA,GAA6B;AAAA,EACjC,OAAA,EAAS,2BAAA;AAAA,EACT,eAAA,EAAiB,2CAAA;AAAA,EACjB,KAAA,EAAO,4BAAA;AAAA,EACP,YAAA,EAAc,0BAAA;AAAA,EACd,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU;AACZ,CAAA;AAwBO,SAAS,mBAAA,CAAoB;AAAA,EAClC,OAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAwC;AACtC,EAAA,MAAM,EAAE,YAAY,SAAA,EAAW,KAAA,EAAO,SAAQ,GAAI,mBAAA,CAAoB,EAAE,OAAA,EAAS,CAAA;AACjF,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,aAAA,KAAkB,eAAA,EAAgB;AACxD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIC,SAAuB,IAAI,CAAA;AAE/D,EAAA,MAAM,WAAA,GAAcC,WAAAA;AAAA,IAClB,CAAC,WAAA,KAAwB;AACvB,MAAA,OAAO,OAAO,KAAA,KAA4B;AACxC,QAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,QAAA,aAAA,CAAc,IAAI,CAAA;AAClB,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,CAAM,aAAa,OAAO,CAAA;AAChC,UAAA,MAAM,OAAA,EAAQ;AAAA,QAChB,SAAS,GAAA,EAAK;AACZ,UAAA,MAAMC,MAAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,UAAA,aAAA,CAAcA,MAAK,CAAA;AACnB,UAAA,OAAA,CAAQ,KAAA,CAAM,4BAAA,EAA8B,WAAA,EAAa,GAAG,CAAA;AAAA,QAC9D;AAAA,MACF,CAAA;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,KAAA,EAAO,OAAO;AAAA,GAC1B;AAGA,EAAA,MAAM,iBAAA,GAAoBD,WAAAA;AAAA,IACxB,CAAC,WAAA,KAA+C;AAC9C,MAAA,OAAO,YAAY;AACjB,QAAA,aAAA,CAAc,IAAI,CAAA;AAClB,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,CAAM,aAAa,OAAO,CAAA;AAChC,UAAA,MAAM,OAAA,EAAQ;AAAA,QAChB,SAAS,GAAA,EAAK;AACZ,UAAA,MAAMC,MAAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,UAAA,aAAA,CAAcA,MAAK,CAAA;AACnB,UAAA,OAAA,CAAQ,KAAA,CAAM,4BAAA,EAA8B,WAAA,EAAa,GAAG,CAAA;AAC5D,UAAA,MAAMA,MAAAA;AAAA,QACR;AAAA,MACF,CAAA;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,KAAA,EAAO,OAAO;AAAA,GAC1B;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBACEJ,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAG,eAAA,EAAiB,GAAG,KAAA,EAAM,EAC/D,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EACE,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA,EAOH,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,eACV,QAAA,kBAAAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,cAAA;AAAA,YACT,KAAA,EAAO,EAAA;AAAA,YACP,MAAA,EAAQ,EAAA;AAAA,YACR,MAAA,EAAQ,uCAAA;AAAA,YACR,cAAA,EAAgB,8BAAA;AAAA,YAChB,YAAA,EAAc,KAAA;AAAA,YACd,SAAA,EAAW;AAAA;AACb;AAAA,OACF,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAM,EAC/D,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,WAAA,EAAa,QAAA,EAAA;AAAA,MAAA,oCAAA;AAAA,MACY,KAAA,CAAM;AAAA,KAAA,EAC3C,CAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,MAAM,WAAA,GAAc,UAAA,mBAClBA,IAAAA,CAAC,SAAI,KAAA,EAAO,EAAE,GAAG,WAAA,EAAa,SAAS,MAAA,EAAQ,cAAA,EAAgB,eAAA,EAAiB,UAAA,EAAY,UAAS,EACnG,QAAA,EAAA;AAAA,oBAAAA,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,MAAA,mBAAA;AAAA,MAAkB,UAAA,CAAW;AAAA,KAAA,EAAQ,CAAA;AAAA,oBAC3CC,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,QACjC,KAAA,EAAO;AAAA,UACL,UAAA,EAAY,MAAA;AAAA,UACZ,MAAA,EAAQ,MAAA;AAAA,UACR,MAAA,EAAQ,SAAA;AAAA,UACR,KAAA,EAAO,SAAA;AAAA,UACP,QAAA,EAAU,6BAAA;AAAA,UACV,UAAA,EAAY;AAAA,SACd;AAAA,QACA,YAAA,EAAW,eAAA;AAAA,QACZ,QAAA,EAAA;AAAA;AAAA;AAED,GAAA,EACF,CAAA,GACE,IAAA;AAEJ,EAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAC1C,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAG,eAAA,EAAiB,GAAG,KAAA,IACxD,QAAA,EAAA,UAAA,oBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,gBAAA,EACV,QAAA,EAAA;AAAA,sBAAAC,IAAC,aAAA,EAAA,EAAc,CAAA;AAAA,sBACfA,IAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,iCAAA,IAAqC,QAAA,EAAA,sBAAA,EAEzD;AAAA,KAAA,EACF,CAAA,EAEJ,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAG,eAAA,EAAiB,GAAG,KAAA,EAAM,EAC9D,QAAA,EAAA;AAAA,IAAA,WAAA;AAAA,IACA,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,KAAc;AAC7B,MAAA,MAAM,OAAA,GAAsC;AAAA,QAC1C,KAAA,EAAO,iBAAA,CAAkB,SAAA,CAAU,EAAE;AAAA,OACvC;AAEA,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,uBACEC,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,OAAA,EAAS,MAAM,QAAA,CAAS,SAAS,CAAA;AAAA,YACjC,IAAA,EAAK,QAAA;AAAA,YACL,QAAA,EAAU,CAAA;AAAA,YACV,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,cAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,QAAA,CAAS,SAAS,CAAA;AAAA,cACpB;AAAA,YACF,CAAA;AAAA,YAEC,QAAA,EAAA,UAAA,CAAW,WAAW,OAAO;AAAA,WAAA;AAAA,UAXzB,SAAA,CAAU;AAAA,SAYjB;AAAA,MAEJ;AAEA,MAAA,uBACED,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,KAAA,EAAO,UAAA;AAAA,UACP,OAAA,EAAS,MAAM,QAAA,CAAS,SAAS,CAAA;AAAA,UACjC,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,YAAA,MAAA,CAAO,MAAA,CAAO,CAAA,CAAE,aAAA,CAAc,KAAA,EAAO,eAAe,CAAA;AAAA,UACtD,CAAA;AAAA,UACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,YAAA,MAAA,CAAO,MAAA,CAAO,CAAA,CAAE,aAAA,CAAc,KAAA,EAAO,UAAU,CAAA;AAAA,UACjD,CAAA;AAAA,UACA,IAAA,EAAK,QAAA;AAAA,UACL,QAAA,EAAU,CAAA;AAAA,UACV,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,YAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,QAAA,CAAS,SAAS,CAAA;AAAA,YACpB;AAAA,UACF,CAAA;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAC,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,mBACV,QAAA,kBAAAA,GAAAA,CAAC,iBAAc,CAAA,EACjB,CAAA;AAAA,4BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,aAAA,EACV,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,WAAA,EAAc,oBAAU,IAAA,EAAK,CAAA;AAAA,cACvC,SAAA,CAAU,+BACTA,GAAAA,CAAC,OAAE,KAAA,EAAO,iBAAA,EAAoB,oBAAU,WAAA,EAAY;AAAA,aAAA,EAExD,CAAA;AAAA,4BACAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,WAAA,CAAY,SAAA,CAAU,EAAE,CAAA;AAAA,gBACjC,UAAU,aAAA,CAAc,SAAA;AAAA,gBACxB,KAAA,EAAO;AAAA,kBACL,GAAG,iBAAA;AAAA,kBACH,OAAA,EAAS,aAAA,CAAc,SAAA,GAAY,GAAA,GAAM;AAAA,iBAC3C;AAAA,gBACA,KAAA,EAAM,OAAA;AAAA,gBACN,YAAA,EAAW,iBAAA;AAAA,gBAEX,QAAA,kBAAAA,IAAC,SAAA,EAAA,EAAU;AAAA;AAAA;AACb;AAAA,SAAA;AAAA,QAvCK,SAAA,CAAU;AAAA,OAwCjB;AAAA,IAEJ,CAAC;AAAA,GAAA,EACH,CAAA;AAEJ;AC5WA,IAAM,QAAA,GAAW,sBACfD,IAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAY,GAAA;AAAA,IACZ,aAAA,EAAc,OAAA;AAAA,IACd,cAAA,EAAe,OAAA;AAAA,IAEf,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,sBACnBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAA,EAAiB;AAAA;AAAA;AAC3B,CAAA;AAGF,IAAMI,UAAAA,GAAY,sBAChBL,IAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAY,GAAA;AAAA,IACZ,aAAA,EAAc,OAAA;AAAA,IACd,cAAA,EAAe,OAAA;AAAA,IAEf,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa,CAAA;AAAA,sBACrBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,sBACnBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iGAAA,EAAkG,CAAA;AAAA,sBAC1GA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uBAAA,EAAwB,CAAA;AAAA,sBAChCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oBAAA,EAAqB;AAAA;AAAA;AAC/B,CAAA;AAOF,IAAMK,gBAAAA,GAAiC;AAAA,EACrC,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,YAAA,GAA8B;AAAA,EAClC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,2BAAA;AAAA,EACT,YAAA,EAAc,uCAAA;AAAA,EACd,eAAA,EAAiB;AACnB,CAAA;AAEA,IAAM,gBAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,qDAAA;AAAA,EACT,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,eAAA,EAAiB,aAAA;AAAA,EACjB,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,KAAA,EAAO,2BAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AAEA,IAAMC,YAAAA,GAA6B;AAAA,EACjC,IAAA,EAAM,CAAA;AAAA,EACN,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,2BAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,QAAA,EAAU,QAAA;AAAA,EACV,YAAA,EAAc,UAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAEA,IAAMC,kBAAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,qDAAA;AAAA,EACT,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,eAAA,EAAiB,aAAA;AAAA,EACjB,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,KAAA,EAAO,iCAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AAEA,IAAMC,cAAAA,GAA+B;AAAA,EACnC,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,mBAAA,GAAqC;AAAA,EACzC,OAAA,EAAS;AACX,CAAA;AAEA,IAAMC,kBAAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,qDAAA;AAAA,EACT,eAAA,EAAiB,2CAAA;AAAA,EACjB,KAAA,EAAO,4BAAA;AAAA,EACP,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,OAAA,EAAS,MAAA;AAAA,EACT,cAAA,EAAgB,eAAA;AAAA,EAChB,UAAA,EAAY;AACd,CAAA;AA8BO,SAAS,mBAAA,CAAoB;AAAA,EAClC,OAAA;AAAA,EACA,iBAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,SAAA,GAAY,MAAA;AAAA,EACZ,UAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAwC;AACtC,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,aAAA,KAAkB,eAAA,EAAgB;AACxD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIR,SAAuB,IAAI,CAAA;AAE/D,EAAA,MAAM,cAAc,YAAY;AAC9B,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACxB,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,CAAM,iBAAA,CAAkB,EAAA,EAAI,OAAO,CAAA;AACzC,MAAA,MAAA,EAAO;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,KAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,4BAAA,EAA8B,iBAAA,CAAkB,EAAA,EAAI,GAAG,CAAA;AAAA,IACvE;AAAA,EACF,CAAA;AAGA,EAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,IAAA,uBACED,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAGK,gBAAAA,EAAiB,GAAG,KAAA,IACzD,QAAA,kBAAAL,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,qBACV,QAAA,kBAAAA,GAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA;AAAA,OAEJ,CAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAGM,gBAAAA,EAAiB,GAAG,KAAA,EAAM,EAC9D,QAAA,EAAA;AAAA,IAAA,UAAA,oBACCN,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOU,kBAAAA,EACV,QAAA,EAAA;AAAA,sBAAAV,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,QAAA,mBAAA;AAAA,QAAkB,UAAA,CAAW;AAAA,OAAA,EAAQ,CAAA;AAAA,sBAC3CC,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,UACjC,KAAA,EAAO;AAAA,YACL,UAAA,EAAY,MAAA;AAAA,YACZ,MAAA,EAAQ,MAAA;AAAA,YACR,MAAA,EAAQ,SAAA;AAAA,YACR,KAAA,EAAO,SAAA;AAAA,YACP,QAAA,EAAU,6BAAA;AAAA,YACV,UAAA,EAAY;AAAA,WACd;AAAA,UACA,YAAA,EAAW,eAAA;AAAA,UACZ,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,oBAEFD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,EACV,QAAA,EAAA;AAAA,sBAAAA,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAA;AAAA,UACT,KAAA,EAAO,gBAAA;AAAA,UAEP,QAAA,EAAA;AAAA,4BAAAC,IAAC,QAAA,EAAA,EAAS,CAAA;AAAA,4BACVA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,SAAA,EAAU;AAAA;AAAA;AAAA,OACnB;AAAA,sBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAOM,YAAAA,EAAc,4BAAkB,IAAA,EAAK,CAAA;AAAA,MAC/C,6BACCP,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,WAAA;AAAA,UACT,UAAU,aAAA,CAAc,SAAA;AAAA,UACxB,KAAA,EAAO;AAAA,YACL,GAAGQ,kBAAAA;AAAA,YACH,OAAA,EAAS,aAAA,CAAc,SAAA,GAAY,GAAA,GAAM;AAAA,WAC3C;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAP,GAAAA,CAACI,YAAA,EAAU,CAAA;AAAA,4BACXJ,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,OAAA,EAAK;AAAA;AAAA;AAAA;AACb,KAAA,EAEJ,CAAA;AAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOQ,cAAAA,EACV,QAAA,kBAAAR,GAAAA,CAAC,SAAA,EAAA,EAAU,EAAA,EAAI,iBAAA,CAAkB,EAAA,EAAI,CAAA,EACvC;AAAA,GAAA,EACF,CAAA;AAEJ;;;ACgPO,IAAM,OAAA,GAAU","file":"index.js","sourcesContent":["/**\n * PinButton component.\n *\n * A button to pin/unpin a dashboard to a specific context.\n */\n\nimport { useCallback, useState, type CSSProperties, type ReactNode } from 'react';\n\nimport { useDashboardPinStatus, usePinMutations } from '../hooks';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PinButtonProps {\n /** Dashboard ID to pin/unpin. */\n dashboardId: string;\n /** Context to pin to (e.g., \"accounts\", \"dashboard\"). */\n context: string;\n /** Label text (default: \"Pin\"). */\n label?: string;\n /** Label when pinned (default: \"Unpin\"). */\n unpinLabel?: string;\n /** Show as icon only (no label). */\n iconOnly?: boolean;\n /** Size variant. */\n size?: 'sm' | 'md' | 'lg';\n /** Called after pin/unpin completes. */\n onPinChange?: (isPinned: boolean) => void;\n /** Custom class name. */\n className?: string;\n /** Custom styles. */\n style?: CSSProperties;\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nconst PinIcon = ({ filled, size }: { filled: boolean; size: number }): ReactNode => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill={filled ? 'currentColor' : 'none'}\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 17v5\" />\n <path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V6a2 2 0 0 1 2-2h0a2 2 0 0 0 2-2H5a2 2 0 0 0 2 2h0a2 2 0 0 1 2 2z\" />\n </svg>\n);\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst baseStyles: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 'var(--prismiq-spacing-xs)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontWeight: 500,\n borderRadius: 'var(--prismiq-radius-md)',\n border: '1px solid var(--prismiq-color-border)',\n backgroundColor: 'var(--prismiq-color-surface)',\n color: 'var(--prismiq-color-text)',\n cursor: 'pointer',\n transition: 'background-color 0.15s, border-color 0.15s, opacity 0.15s',\n outline: 'none',\n};\n\nconst sizeStyles: Record<NonNullable<PinButtonProps['size']>, CSSProperties> = {\n sm: {\n padding: 'var(--prismiq-spacing-xs)',\n fontSize: 'var(--prismiq-font-size-sm)',\n minWidth: 28,\n minHeight: 28,\n },\n md: {\n padding: 'var(--prismiq-spacing-sm)',\n fontSize: 'var(--prismiq-font-size-base)',\n minWidth: 36,\n minHeight: 36,\n },\n lg: {\n padding: 'var(--prismiq-spacing-md)',\n fontSize: 'var(--prismiq-font-size-lg)',\n minWidth: 44,\n minHeight: 44,\n },\n};\n\nconst pinnedStyles: CSSProperties = {\n backgroundColor: 'var(--prismiq-color-primary-light, #e3f2fd)',\n borderColor: 'var(--prismiq-color-primary)',\n color: 'var(--prismiq-color-primary)',\n};\n\nconst disabledStyles: CSSProperties = {\n opacity: 0.5,\n cursor: 'not-allowed',\n};\n\nconst iconSizes: Record<NonNullable<PinButtonProps['size']>, number> = {\n sm: 14,\n md: 16,\n lg: 20,\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Button to pin/unpin a dashboard to a context.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <PinButton dashboardId={dashboard.id} context=\"accounts\" />\n *\n * // Icon only with custom label\n * <PinButton\n * dashboardId={dashboard.id}\n * context=\"dashboard\"\n * iconOnly\n * onPinChange={(isPinned) => console.log('Pinned:', isPinned)}\n * />\n * ```\n */\nexport function PinButton({\n dashboardId,\n context,\n label = 'Pin',\n unpinLabel = 'Unpin',\n iconOnly = false,\n size = 'md',\n onPinChange,\n className,\n style,\n}: PinButtonProps): ReactNode {\n const { isPinned: checkIsPinned, isLoading: statusLoading, refetch } = useDashboardPinStatus({\n dashboardId,\n });\n const { pin, unpin, state: mutationState } = usePinMutations();\n const [actionError, setActionError] = useState<Error | null>(null);\n\n // Use fetched state directly to avoid race conditions with optimistic updates\n const isPinned = checkIsPinned(context);\n const isLoading = statusLoading || mutationState.isLoading;\n\n const handleClick = useCallback(async () => {\n if (isLoading) return;\n\n setActionError(null);\n try {\n if (isPinned) {\n await unpin(dashboardId, context);\n onPinChange?.(false);\n } else {\n await pin(dashboardId, context);\n onPinChange?.(true);\n }\n // Refresh status after mutation\n await refetch();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setActionError(error);\n console.error('Failed to toggle pin:', err);\n }\n }, [dashboardId, context, isPinned, isLoading, pin, unpin, onPinChange, refetch]);\n\n const errorStyles: CSSProperties = {\n borderColor: 'var(--prismiq-color-error)',\n color: 'var(--prismiq-color-error)',\n };\n\n const combinedStyles: CSSProperties = {\n ...baseStyles,\n ...sizeStyles[size],\n ...(isPinned ? pinnedStyles : {}),\n ...(isLoading ? disabledStyles : {}),\n ...(actionError ? errorStyles : {}),\n ...style,\n };\n\n const iconSize = iconSizes[size];\n const displayLabel = isPinned ? unpinLabel : label;\n const errorMessage = actionError ? `Error: ${actionError.message}` : undefined;\n const accessibleLabel = errorMessage ?? (iconOnly ? displayLabel : undefined);\n const tooltipTitle = errorMessage ?? (iconOnly ? displayLabel : undefined);\n\n return (\n <>\n <style>\n {`\n @keyframes prismiq-spin {\n to {\n transform: rotate(360deg);\n }\n }\n `}\n </style>\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isLoading}\n className={className}\n style={combinedStyles}\n aria-pressed={isPinned}\n aria-label={accessibleLabel}\n aria-invalid={actionError ? true : undefined}\n title={tooltipTitle}\n >\n {isLoading ? (\n <span\n style={{\n display: 'inline-block',\n width: iconSize,\n height: iconSize,\n border: '2px solid currentColor',\n borderRightColor: 'transparent',\n borderRadius: '50%',\n animation: 'prismiq-spin 0.6s linear infinite',\n }}\n />\n ) : (\n <PinIcon filled={isPinned} size={iconSize} />\n )}\n {!iconOnly && <span>{displayLabel}</span>}\n </button>\n </>\n );\n}\n","/**\n * PinMenu component.\n *\n * A dropdown menu showing multiple pin contexts with checkboxes.\n */\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from 'react';\n\nimport { useDashboardPinStatus, usePinMutations } from '../hooks';\n\n// ============================================================================\n// Error Banner Styles\n// ============================================================================\n\nconst errorBannerStyles: CSSProperties = {\n padding: 'var(--prismiq-spacing-sm)',\n backgroundColor: 'var(--prismiq-color-error-light, #ffebee)',\n color: 'var(--prismiq-color-error)',\n borderRadius: 'var(--prismiq-radius-sm)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-xs)',\n marginBottom: 'var(--prismiq-spacing-xs)',\n};\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Configuration for a pin context option. */\nexport interface PinContextOption {\n /** Unique context identifier (e.g., \"accounts\", \"dashboard\"). */\n id: string;\n /** Display label for the context. */\n label: string;\n /** Optional icon to display. */\n icon?: ReactNode;\n}\n\nexport interface PinMenuProps {\n /** Dashboard ID to pin/unpin. */\n dashboardId: string;\n /** Available contexts to pin to. */\n contexts: PinContextOption[];\n /** Called after pin state changes. */\n onPinChange?: (context: string, isPinned: boolean) => void;\n /** Custom class name. */\n className?: string;\n /** Custom styles. */\n style?: CSSProperties;\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nconst PinIcon = ({ size }: { size: number }): ReactNode => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 17v5\" />\n <path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V6a2 2 0 0 1 2-2h0a2 2 0 0 0 2-2H5a2 2 0 0 0 2 2h0a2 2 0 0 1 2 2z\" />\n </svg>\n);\n\nconst ChevronDownIcon = ({ size }: { size: number }): ReactNode => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n);\n\nconst CheckIcon = ({ size }: { size: number }): ReactNode => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n);\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst triggerStyles: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-xs)',\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-base)',\n fontWeight: 500,\n borderRadius: 'var(--prismiq-radius-md)',\n border: '1px solid var(--prismiq-color-border)',\n backgroundColor: 'var(--prismiq-color-surface)',\n color: 'var(--prismiq-color-text)',\n cursor: 'pointer',\n transition: 'background-color 0.15s, border-color 0.15s',\n outline: 'none',\n};\n\nconst menuStyles: CSSProperties = {\n position: 'absolute',\n top: '100%',\n left: 0,\n marginTop: 'var(--prismiq-spacing-xs)',\n minWidth: 200,\n padding: 'var(--prismiq-spacing-xs)',\n backgroundColor: 'var(--prismiq-color-surface)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n boxShadow: 'var(--prismiq-shadow-lg, 0 10px 15px -3px rgba(0,0,0,0.1))',\n zIndex: 50,\n};\n\nconst menuItemStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n color: 'var(--prismiq-color-text)',\n borderRadius: 'var(--prismiq-radius-sm)',\n cursor: 'pointer',\n transition: 'background-color 0.15s',\n border: 'none',\n backgroundColor: 'transparent',\n width: '100%',\n textAlign: 'left',\n};\n\nconst checkboxStyles: CSSProperties = {\n width: 16,\n height: 16,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 'var(--prismiq-radius-sm)',\n border: '1px solid var(--prismiq-color-border)',\n backgroundColor: 'var(--prismiq-color-surface)',\n flexShrink: 0,\n};\n\nconst checkedCheckboxStyles: CSSProperties = {\n ...checkboxStyles,\n backgroundColor: 'var(--prismiq-color-primary)',\n borderColor: 'var(--prismiq-color-primary)',\n color: 'var(--prismiq-color-text-inverse)',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Dropdown menu showing multiple pin contexts with checkboxes.\n *\n * @example\n * ```tsx\n * const PIN_CONTEXTS = [\n * { id: 'dashboard', label: 'Dashboard' },\n * { id: 'accounts', label: 'Accounts' },\n * ];\n *\n * <PinMenu\n * dashboardId={dashboard.id}\n * contexts={PIN_CONTEXTS}\n * onPinChange={(ctx, pinned) => console.log(ctx, pinned)}\n * />\n * ```\n */\nexport function PinMenu({\n dashboardId,\n contexts,\n onPinChange,\n className,\n style,\n}: PinMenuProps): ReactNode {\n const [isOpen, setIsOpen] = useState(false);\n const [toggleError, setToggleError] = useState<Error | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const { isPinned, refetch, isLoading: statusLoading } = useDashboardPinStatus({\n dashboardId,\n });\n const { pin, unpin, state: mutationState } = usePinMutations();\n\n const isLoading = statusLoading || mutationState.isLoading;\n\n // Clear error when menu closes\n useEffect(() => {\n if (!isOpen) {\n setToggleError(null);\n }\n }, [isOpen]);\n\n // Close menu when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n\n // Close on escape\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }\n }, [isOpen]);\n\n const handleToggle = useCallback((ctx: string) => {\n return async () => {\n if (isLoading) return;\n\n setToggleError(null);\n try {\n const pinned = isPinned(ctx);\n if (pinned) {\n await unpin(dashboardId, ctx);\n onPinChange?.(ctx, false);\n } else {\n await pin(dashboardId, ctx);\n onPinChange?.(ctx, true);\n }\n await refetch();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setToggleError(error);\n console.error('Failed to toggle pin for context:', ctx, err);\n }\n };\n }, [dashboardId, isPinned, isLoading, pin, unpin, onPinChange, refetch]);\n\n // Count pinned contexts\n const pinnedCount = contexts.filter((ctx) => isPinned(ctx.id)).length;\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={{ position: 'relative', display: 'inline-block', ...style }}\n >\n <button\n type=\"button\"\n onClick={() => setIsOpen(!isOpen)}\n style={triggerStyles}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n >\n <PinIcon size={16} />\n <span>Pin{pinnedCount > 0 ? ` (${pinnedCount})` : ''}</span>\n <ChevronDownIcon size={14} />\n </button>\n\n {isOpen && (\n <div style={menuStyles} role=\"menu\">\n {toggleError && (\n <div style={errorBannerStyles}>\n Failed: {toggleError.message}\n </div>\n )}\n {contexts.map((ctx) => {\n const pinned = isPinned(ctx.id);\n return (\n <button\n key={ctx.id}\n type=\"button\"\n role=\"menuitemcheckbox\"\n aria-checked={pinned}\n onClick={handleToggle(ctx.id)}\n disabled={isLoading}\n style={{\n ...menuItemStyles,\n opacity: isLoading ? 0.5 : 1,\n }}\n >\n <span style={pinned ? checkedCheckboxStyles : checkboxStyles}>\n {pinned && <CheckIcon size={12} />}\n </span>\n {ctx.icon && <span style={{ display: 'flex' }}>{ctx.icon}</span>}\n <span>{ctx.label}</span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","/**\n * PinnedDashboardList component.\n *\n * Displays a list of dashboards pinned to a context.\n */\n\nimport { useCallback, useState, type CSSProperties, type ReactNode } from 'react';\n\nimport { usePinnedDashboards, usePinMutations } from '../hooks';\nimport type { Dashboard } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Props for custom rendering of a list item. */\nexport interface PinnedDashboardItemActions {\n /** Unpin this dashboard from the context. Returns a promise. */\n unpin: () => Promise<void>;\n}\n\nexport interface PinnedDashboardListProps {\n /** Context to show pins for (e.g., \"accounts\", \"dashboard\"). */\n context: string;\n /** Called when user selects a dashboard. */\n onSelect: (dashboard: Dashboard) => void;\n /** Custom empty state element. */\n emptyState?: ReactNode;\n /** Custom render function for each item. */\n renderItem?: (dashboard: Dashboard, actions: PinnedDashboardItemActions) => ReactNode;\n /** Custom class name. */\n className?: string;\n /** Custom styles. */\n style?: CSSProperties;\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nconst DashboardIcon = (): ReactNode => (\n <svg\n width={20}\n height={20}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" />\n </svg>\n);\n\nconst UnpinIcon = (): ReactNode => (\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M2 2 22 22\" />\n <path d=\"M12 17v5\" />\n <path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9\" />\n <path d=\"M15 6V4a2 2 0 0 1 2-2\" />\n <path d=\"M9 4a2 2 0 0 0-2 2\" />\n </svg>\n);\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\nconst itemStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-md)',\n padding: 'var(--prismiq-spacing-md)',\n backgroundColor: 'var(--prismiq-color-surface)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n cursor: 'pointer',\n transition: 'background-color 0.15s, border-color 0.15s, box-shadow 0.15s',\n};\n\nconst itemHoverStyles: CSSProperties = {\n backgroundColor: 'var(--prismiq-color-surface-hover, #f5f5f5)',\n borderColor: 'var(--prismiq-color-primary)',\n boxShadow: 'var(--prismiq-shadow-sm, 0 1px 2px rgba(0,0,0,0.05))',\n};\n\nconst iconWrapperStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 40,\n height: 40,\n backgroundColor: 'var(--prismiq-color-primary-light, #e3f2fd)',\n color: 'var(--prismiq-color-primary)',\n borderRadius: 'var(--prismiq-radius-md)',\n flexShrink: 0,\n};\n\nconst contentStyles: CSSProperties = {\n flex: 1,\n minWidth: 0,\n};\n\nconst titleStyles: CSSProperties = {\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-base)',\n fontWeight: 500,\n color: 'var(--prismiq-color-text)',\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n};\n\nconst descriptionStyles: CSSProperties = {\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n color: 'var(--prismiq-color-text-muted)',\n margin: 0,\n marginTop: 'var(--prismiq-spacing-xs)',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n};\n\nconst unpinButtonStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 32,\n height: 32,\n padding: 0,\n backgroundColor: 'transparent',\n border: '1px solid transparent',\n borderRadius: 'var(--prismiq-radius-sm)',\n color: 'var(--prismiq-color-text-muted)',\n cursor: 'pointer',\n transition: 'background-color 0.15s, color 0.15s',\n flexShrink: 0,\n};\n\nconst emptyStateStyles: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 'var(--prismiq-spacing-xl)',\n textAlign: 'center',\n color: 'var(--prismiq-color-text-muted)',\n};\n\nconst loadingStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 'var(--prismiq-spacing-xl)',\n};\n\nconst errorStyles: CSSProperties = {\n padding: 'var(--prismiq-spacing-md)',\n backgroundColor: 'var(--prismiq-color-error-light, #ffebee)',\n color: 'var(--prismiq-color-error)',\n borderRadius: 'var(--prismiq-radius-md)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * List of dashboards pinned to a context.\n *\n * @example\n * ```tsx\n * function AccountsDashboards() {\n * const [selected, setSelected] = useState<Dashboard | null>(null);\n *\n * return (\n * <PinnedDashboardList\n * context=\"accounts\"\n * onSelect={setSelected}\n * emptyState={<p>No pinned dashboards</p>}\n * />\n * );\n * }\n * ```\n */\nexport function PinnedDashboardList({\n context,\n onSelect,\n emptyState,\n renderItem,\n className,\n style,\n}: PinnedDashboardListProps): ReactNode {\n const { dashboards, isLoading, error, refetch } = usePinnedDashboards({ context });\n const { unpin, state: mutationState } = usePinMutations();\n const [unpinError, setUnpinError] = useState<Error | null>(null);\n\n const handleUnpin = useCallback(\n (dashboardId: string) => {\n return async (event: React.MouseEvent) => {\n event.stopPropagation();\n setUnpinError(null);\n try {\n await unpin(dashboardId, context);\n await refetch();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setUnpinError(error);\n console.error('Failed to unpin dashboard:', dashboardId, err);\n }\n };\n },\n [context, unpin, refetch]\n );\n\n // Create async unpin handler for renderItem actions\n const createUnpinAction = useCallback(\n (dashboardId: string): (() => Promise<void>) => {\n return async () => {\n setUnpinError(null);\n try {\n await unpin(dashboardId, context);\n await refetch();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setUnpinError(error);\n console.error('Failed to unpin dashboard:', dashboardId, err);\n throw error; // Re-throw so caller can handle if needed\n }\n };\n },\n [context, unpin, refetch]\n );\n\n if (isLoading) {\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <style>\n {`\n @keyframes prismiq-spin {\n to {\n transform: rotate(360deg);\n }\n }\n `}\n </style>\n <div style={loadingStyles}>\n <span\n style={{\n display: 'inline-block',\n width: 24,\n height: 24,\n border: '2px solid var(--prismiq-color-border)',\n borderTopColor: 'var(--prismiq-color-primary)',\n borderRadius: '50%',\n animation: 'prismiq-spin 0.6s linear infinite',\n }}\n />\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <div style={errorStyles}>\n Failed to load pinned dashboards: {error.message}\n </div>\n </div>\n );\n }\n\n // Show unpin error as a dismissible message\n const errorBanner = unpinError ? (\n <div style={{ ...errorStyles, display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <span>Failed to unpin: {unpinError.message}</span>\n <button\n type=\"button\"\n onClick={() => setUnpinError(null)}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n color: 'inherit',\n fontSize: 'var(--prismiq-font-size-lg)',\n lineHeight: 1,\n }}\n aria-label=\"Dismiss error\"\n >\n ×\n </button>\n </div>\n ) : null;\n\n if (!dashboards || dashboards.length === 0) {\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n {emptyState || (\n <div style={emptyStateStyles}>\n <DashboardIcon />\n <p style={{ margin: 'var(--prismiq-spacing-sm) 0 0 0' }}>\n No pinned dashboards\n </p>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n {errorBanner}\n {dashboards.map((dashboard) => {\n const actions: PinnedDashboardItemActions = {\n unpin: createUnpinAction(dashboard.id),\n };\n\n if (renderItem) {\n return (\n <div\n key={dashboard.id}\n onClick={() => onSelect(dashboard)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(dashboard);\n }\n }}\n >\n {renderItem(dashboard, actions)}\n </div>\n );\n }\n\n return (\n <div\n key={dashboard.id}\n style={itemStyles}\n onClick={() => onSelect(dashboard)}\n onMouseEnter={(e) => {\n Object.assign(e.currentTarget.style, itemHoverStyles);\n }}\n onMouseLeave={(e) => {\n Object.assign(e.currentTarget.style, itemStyles);\n }}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(dashboard);\n }\n }}\n >\n <div style={iconWrapperStyles}>\n <DashboardIcon />\n </div>\n <div style={contentStyles}>\n <h3 style={titleStyles}>{dashboard.name}</h3>\n {dashboard.description && (\n <p style={descriptionStyles}>{dashboard.description}</p>\n )}\n </div>\n <button\n type=\"button\"\n onClick={handleUnpin(dashboard.id)}\n disabled={mutationState.isLoading}\n style={{\n ...unpinButtonStyles,\n opacity: mutationState.isLoading ? 0.5 : 1,\n }}\n title=\"Unpin\"\n aria-label=\"Unpin dashboard\"\n >\n <UnpinIcon />\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n","/**\n * PinnedDashboardView component.\n *\n * Full view with pinned dashboard list and selected dashboard display.\n */\n\nimport { useState, type CSSProperties, type ReactNode } from 'react';\n\nimport { Dashboard } from '../dashboard';\nimport { usePinMutations } from '../hooks';\nimport type { Dashboard as DashboardType } from '../types';\n\nimport { PinnedDashboardList } from './PinnedDashboardList';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PinnedDashboardViewProps {\n /** Context this view is for (for unpin action). */\n context: string;\n /** Dashboard to display (null = show list). */\n selectedDashboard: DashboardType | null;\n /** Called when user clicks back or closes. */\n onBack: () => void;\n /** Called when user selects from list. */\n onSelect: (dashboard: DashboardType) => void;\n /** Show unpin button in header. */\n showUnpin?: boolean;\n /** Custom back button label. */\n backLabel?: string;\n /** Custom empty state for list. */\n emptyState?: ReactNode;\n /** Custom class name. */\n className?: string;\n /** Custom styles. */\n style?: CSSProperties;\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nconst BackIcon = (): ReactNode => (\n <svg\n width={20}\n height={20}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M19 12H5\" />\n <path d=\"m12 19-7-7 7-7\" />\n </svg>\n);\n\nconst UnpinIcon = (): ReactNode => (\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M2 2 22 22\" />\n <path d=\"M12 17v5\" />\n <path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9\" />\n <path d=\"M15 6V4a2 2 0 0 1 2-2\" />\n <path d=\"M9 4a2 2 0 0 0-2 2\" />\n </svg>\n);\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n};\n\nconst headerStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-md)',\n padding: 'var(--prismiq-spacing-md)',\n borderBottom: '1px solid var(--prismiq-color-border)',\n backgroundColor: 'var(--prismiq-color-surface)',\n};\n\nconst backButtonStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-xs)',\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n fontWeight: 500,\n backgroundColor: 'transparent',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n color: 'var(--prismiq-color-text)',\n cursor: 'pointer',\n transition: 'background-color 0.15s',\n};\n\nconst titleStyles: CSSProperties = {\n flex: 1,\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-lg)',\n fontWeight: 600,\n color: 'var(--prismiq-color-text)',\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n};\n\nconst unpinButtonStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-xs)',\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n backgroundColor: 'transparent',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n color: 'var(--prismiq-color-text-muted)',\n cursor: 'pointer',\n transition: 'background-color 0.15s, color 0.15s',\n};\n\nconst contentStyles: CSSProperties = {\n flex: 1,\n overflow: 'auto',\n};\n\nconst listContainerStyles: CSSProperties = {\n padding: 'var(--prismiq-spacing-md)',\n};\n\nconst errorBannerStyles: CSSProperties = {\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n backgroundColor: 'var(--prismiq-color-error-light, #ffebee)',\n color: 'var(--prismiq-color-error)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Full view with pinned dashboard list and dashboard display.\n *\n * When no dashboard is selected, shows the list. When a dashboard\n * is selected, shows the dashboard with a back button.\n *\n * @example\n * ```tsx\n * function AccountsDashboardSection() {\n * const [selected, setSelected] = useState<Dashboard | null>(null);\n *\n * return (\n * <PinnedDashboardView\n * context=\"accounts\"\n * selectedDashboard={selected}\n * onSelect={setSelected}\n * onBack={() => setSelected(null)}\n * backLabel=\"Back to Accounts\"\n * emptyState={<p>Pin dashboards from Analytics.</p>}\n * />\n * );\n * }\n * ```\n */\nexport function PinnedDashboardView({\n context,\n selectedDashboard,\n onBack,\n onSelect,\n showUnpin = true,\n backLabel = 'Back',\n emptyState,\n className,\n style,\n}: PinnedDashboardViewProps): ReactNode {\n const { unpin, state: mutationState } = usePinMutations();\n const [unpinError, setUnpinError] = useState<Error | null>(null);\n\n const handleUnpin = async () => {\n if (!selectedDashboard) return;\n setUnpinError(null);\n try {\n await unpin(selectedDashboard.id, context);\n onBack();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setUnpinError(error);\n console.error('Failed to unpin dashboard:', selectedDashboard.id, err);\n }\n };\n\n // Show list when no dashboard selected\n if (!selectedDashboard) {\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <div style={listContainerStyles}>\n <PinnedDashboardList\n context={context}\n onSelect={onSelect}\n emptyState={emptyState}\n />\n </div>\n </div>\n );\n }\n\n // Show selected dashboard with header\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n {unpinError && (\n <div style={errorBannerStyles}>\n <span>Failed to unpin: {unpinError.message}</span>\n <button\n type=\"button\"\n onClick={() => setUnpinError(null)}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n color: 'inherit',\n fontSize: 'var(--prismiq-font-size-lg)',\n lineHeight: 1,\n }}\n aria-label=\"Dismiss error\"\n >\n ×\n </button>\n </div>\n )}\n <div style={headerStyles}>\n <button\n type=\"button\"\n onClick={onBack}\n style={backButtonStyles}\n >\n <BackIcon />\n <span>{backLabel}</span>\n </button>\n <h2 style={titleStyles}>{selectedDashboard.name}</h2>\n {showUnpin && (\n <button\n type=\"button\"\n onClick={handleUnpin}\n disabled={mutationState.isLoading}\n style={{\n ...unpinButtonStyles,\n opacity: mutationState.isLoading ? 0.5 : 1,\n }}\n >\n <UnpinIcon />\n <span>Unpin</span>\n </button>\n )}\n </div>\n <div style={contentStyles}>\n <Dashboard id={selectedDashboard.id} />\n </div>\n </div>\n );\n}\n","/**\n * @prismiq/react - React SDK for Prismiq embedded analytics\n *\n * @example\n * ```tsx\n * import {\n * AnalyticsProvider,\n * ThemeProvider,\n * QueryBuilder,\n * BarChart,\n * Dashboard,\n * useQuery\n * } from '@prismiq/react';\n *\n * function App() {\n * return (\n * <ThemeProvider>\n * <AnalyticsProvider config={{ endpoint: 'https://api.example.com' }}>\n * <Dashboard id=\"my-dashboard\" />\n * </AnalyticsProvider>\n * </ThemeProvider>\n * );\n * }\n * ```\n *\n * For modular imports (smaller bundle size):\n * ```tsx\n * import { BarChart } from '@prismiq/react/charts';\n * import { Dashboard } from '@prismiq/react/dashboard';\n * import { useIsClient } from '@prismiq/react/ssr';\n * import { useFocusTrap } from '@prismiq/react/utils';\n * import { exportToCSV } from '@prismiq/react/export';\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type {\n // Schema types\n ColumnSchema,\n TableSchema,\n Relationship,\n DatabaseSchema,\n // Query types\n QueryTable,\n JoinType,\n JoinDefinition,\n AggregationType,\n ColumnSelection,\n FilterOperator,\n FilterDefinition,\n SortDirection,\n SortDefinition,\n GroupByDefinition,\n QueryDefinition,\n // Result types\n QueryResult,\n ValidationResult,\n // Saved query types\n SavedQuery,\n SavedQueryCreate,\n SavedQueryUpdate,\n // Custom SQL types\n ExecuteSQLRequest,\n SQLValidationResult,\n // Pin types\n PinnedDashboard,\n PinnedDashboardsResponse,\n DashboardPinContextsResponse,\n // Dashboard mutation types\n DashboardCreate,\n DashboardUpdate,\n} from './types';\n\n// ============================================================================\n// API Client\n// ============================================================================\n\nexport { PrismiqClient, PrismiqError } from './api';\nexport type { ClientConfig } from './api';\n\n// ============================================================================\n// Theme\n// ============================================================================\n\nexport { ThemeProvider, useTheme, lightTheme, darkTheme } from './theme';\nexport type {\n PrismiqTheme,\n ThemeMode,\n ThemeContextValue,\n ThemeProviderProps,\n DeepPartial,\n} from './theme';\n\n// ============================================================================\n// Context\n// ============================================================================\n\nexport { AnalyticsProvider, useAnalytics, useAnalyticsCallbacks } from './context';\nexport type {\n AnalyticsContextValue,\n AnalyticsProviderProps,\n AnalyticsCallbacks,\n} from './context';\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\nexport {\n useSchema,\n useQuery,\n useChartData,\n useDashboards,\n useDashboard as useDashboardData,\n useDashboardMutations,\n useSavedQueries,\n useCustomSQL,\n usePinnedDashboards,\n usePinMutations,\n useDashboardPinStatus,\n} from './hooks';\nexport type {\n UseSchemaResult,\n UseQueryResult,\n UseQueryOptions,\n UseDashboardsOptions,\n UseDashboardsResult,\n UseDashboardOptions,\n UseDashboardResult,\n MutationState,\n UseDashboardMutationsResult,\n UseSavedQueriesOptions,\n UseSavedQueriesResult,\n UseCustomSQLOptions,\n UseCustomSQLResult,\n UsePinnedDashboardsOptions,\n UsePinnedDashboardsResult,\n PinMutationState,\n UsePinMutationsResult,\n UseDashboardPinStatusOptions,\n UseDashboardPinStatusResult,\n} from './hooks';\n\n// ============================================================================\n// Charts\n// ============================================================================\n\nexport {\n // Base wrapper\n EChartWrapper,\n // Chart components\n MetricCard,\n TrendIndicator,\n Sparkline,\n BarChart,\n LineChart,\n AreaChart,\n PieChart,\n ScatterChart,\n // Auto suggest\n suggestChartType,\n // Utilities\n queryResultToChartData,\n dataPointsToChartData,\n toChartData,\n createChartTheme,\n applyThemeToOption,\n formatAxisLabel,\n formatCompact,\n formatMetricValue,\n getChartColors,\n createGradientColor,\n isChartDataEmpty,\n} from './charts';\n\nexport type {\n // Data types\n ChartDataPoint,\n ChartSeries,\n // Base props\n BaseChartProps,\n ChartClickParams,\n ReferenceLineConfig,\n AxisFormat,\n LegendPosition,\n EChartWrapperProps,\n // Chart-specific props\n BarChartProps,\n LineChartProps,\n AreaChartProps,\n PieChartProps,\n ScatterChartProps,\n // MetricCard\n TrendConfig,\n MetricCardProps,\n TrendIndicatorProps,\n SparklineProps,\n // Hook types\n ChartDataOptions,\n ChartDataResult,\n // Auto suggest\n ChartType,\n ChartSuggestion,\n} from './charts';\n\n// ============================================================================\n// UI Components\n// ============================================================================\n\nexport {\n // Base UI\n Button,\n Input,\n Select,\n Checkbox,\n Badge,\n Tooltip,\n Dropdown,\n DropdownItem,\n DropdownSeparator,\n Icon,\n Dialog,\n DialogHeader,\n DialogFooter,\n // Skeleton Loading\n Skeleton,\n SkeletonText,\n SkeletonChart,\n SkeletonTable,\n SkeletonMetricCard,\n // Error Boundaries\n ErrorBoundary,\n ErrorFallback,\n WidgetErrorBoundary,\n // Empty States\n EmptyState,\n NoData,\n NoResults,\n EmptyDashboard,\n // Schema Explorer\n SchemaExplorer,\n TableNode,\n ColumnNode,\n // Column Selector\n ColumnSelector,\n SelectedColumn,\n // Filter Builder\n FilterBuilder,\n FilterRow,\n FilterValueInput,\n // Sort Builder\n SortBuilder,\n SortRow,\n // Aggregation Picker\n AggregationPicker,\n // Results Table\n ResultsTable,\n TableHeader,\n TableRow,\n TableCell,\n Pagination,\n // Query Builder\n QueryBuilder,\n QueryBuilderToolbar,\n QueryPreview,\n // Saved Queries\n SavedQueryPicker,\n // Custom SQL\n CustomSQLEditor,\n} from './components';\n\nexport type {\n // Base UI\n ButtonProps,\n InputProps,\n SelectProps,\n SelectOption,\n CheckboxProps,\n BadgeProps,\n TooltipProps,\n DropdownProps,\n DropdownItemProps,\n DropdownSeparatorProps,\n IconProps,\n IconName,\n DialogProps,\n DialogHeaderProps,\n DialogFooterProps,\n // Skeleton Loading\n SkeletonProps,\n SkeletonTextProps,\n SkeletonChartProps,\n SkeletonTableProps,\n SkeletonMetricCardProps,\n // Error Boundaries\n ErrorBoundaryProps,\n ErrorFallbackProps,\n WidgetErrorBoundaryProps,\n // Empty States\n EmptyStateProps,\n NoDataProps,\n NoResultsProps,\n EmptyDashboardProps,\n // Schema Explorer\n SchemaExplorerProps,\n TableNodeProps,\n ColumnNodeProps,\n // Column Selector\n ColumnSelectorProps,\n SelectedColumnProps,\n // Filter Builder\n FilterBuilderProps,\n FilterRowProps,\n FilterValueInputProps,\n // Sort Builder\n SortBuilderProps,\n SortRowProps,\n // Aggregation Picker\n AggregationPickerProps,\n // Results Table\n ResultsTableProps,\n TableHeaderProps,\n TableRowProps,\n TableCellProps,\n PaginationProps,\n // Query Builder\n QueryBuilderProps,\n QueryBuilderState,\n QueryBuilderToolbarProps,\n QueryPreviewProps,\n // Saved Queries\n SavedQueryPickerProps,\n // Custom SQL\n CustomSQLEditorProps,\n} from './components';\n\n// ============================================================================\n// Export Utilities\n// ============================================================================\n\nexport {\n // CSV export\n exportToCSV,\n generateCSV,\n downloadFile,\n // Excel export\n exportToExcel,\n exportMultipleSheets,\n // Hook\n useExport,\n} from './export';\n\nexport type {\n ExportOptions,\n ExcelExportOptions,\n ExcelCellStyle,\n ExportData,\n UseExportOptions,\n UseExportResult,\n} from './export';\n\n// ============================================================================\n// Dashboard\n// ============================================================================\n\nexport {\n // Main components\n Dashboard,\n DashboardProvider,\n DashboardLayoutComponent,\n // Widget components\n Widget,\n WidgetHeader,\n WidgetContent,\n // Filter components\n FilterBar,\n DateRangeFilter,\n SelectFilter,\n MultiSelectFilter,\n TextFilter,\n // Editor components\n DashboardEditor,\n EditorToolbar,\n WidgetPalette,\n WidgetEditor,\n // List components\n DashboardList,\n DashboardCard,\n DashboardDialog,\n // Hooks\n useDashboard,\n useDashboardFilters,\n useWidget,\n useAutoRefresh,\n useFullscreen,\n // Context\n DashboardContext,\n} from './dashboard';\n\nexport type {\n // Widget types\n WidgetType,\n WidgetPosition,\n WidgetConfig,\n WidgetDefinition,\n // Filter types\n DashboardFilterType,\n FilterOption,\n DashboardFilter,\n FilterValue,\n DateRangeValue,\n NumberRangeValue,\n // Dashboard types\n DashboardLayout,\n DashboardDefinition,\n // Context types\n DashboardContextValue,\n DashboardEditorContextValue,\n // Component props\n DashboardProviderProps,\n DashboardProps,\n DashboardEditorProps,\n DashboardLayoutProps,\n WidgetProps,\n WidgetHeaderProps,\n FilterBarProps,\n DateRangeFilterProps,\n SelectFilterProps,\n MultiSelectFilterProps,\n TextFilterProps,\n WidgetPaletteProps,\n WidgetEditorProps,\n WidgetContentProps,\n EditorToolbarProps,\n // List component props\n DashboardListProps,\n DashboardCardProps,\n DashboardDialogProps,\n // Hook result types\n UseDashboardFiltersResult,\n UseWidgetResult,\n UseAutoRefreshOptions,\n UseAutoRefreshResult,\n UseFullscreenResult,\n} from './dashboard';\n\n// ============================================================================\n// Accessibility Utilities\n// ============================================================================\n\nexport {\n useFocusTrap,\n useArrowNavigation,\n useRovingTabIndex,\n useFocusVisible,\n announceToScreenReader,\n focusVisibleStyles,\n skipLinkStyles,\n skipLinkFocusStyles,\n} from './utils';\n\nexport type {\n FocusTrapOptions,\n ArrowNavigationOptions,\n UseFocusTrapResult,\n UseArrowNavigationResult,\n SkipLinkProps,\n} from './utils';\n\n// ============================================================================\n// SSR Utilities\n// ============================================================================\n\nexport {\n useIsClient,\n ClientOnly,\n getWindowWidth,\n getWindowHeight,\n isBrowser,\n isServer,\n getLocalStorage,\n setLocalStorage,\n removeLocalStorage,\n useWindowSize,\n useMediaQuery,\n useBreakpoint,\n useIsBreakpoint,\n BREAKPOINTS,\n} from './ssr';\n\nexport type {\n ClientOnlyProps,\n WindowSize,\n Breakpoint,\n} from './ssr';\n\n// ============================================================================\n// Pin Components\n// ============================================================================\n\nexport {\n PinButton,\n PinMenu,\n PinnedDashboardList,\n PinnedDashboardView,\n} from './pins';\n\nexport type {\n PinButtonProps,\n PinMenuProps,\n PinContextOption,\n PinnedDashboardListProps,\n PinnedDashboardItemActions,\n PinnedDashboardViewProps,\n} from './pins';\n\n// ============================================================================\n// Version\n// ============================================================================\n\nexport const VERSION = '0.1.0';\n"]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkTRW7DKLP_cjs = require('../chunk-TRW7DKLP.cjs');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "BREAKPOINTS", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () { return chunkTRW7DKLP_cjs.BREAKPOINTS; }
|
|
10
|
+
});
|
|
11
|
+
Object.defineProperty(exports, "ClientOnly", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
get: function () { return chunkTRW7DKLP_cjs.ClientOnly; }
|
|
14
|
+
});
|
|
15
|
+
Object.defineProperty(exports, "getLocalStorage", {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return chunkTRW7DKLP_cjs.getLocalStorage; }
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports, "getWindowHeight", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () { return chunkTRW7DKLP_cjs.getWindowHeight; }
|
|
22
|
+
});
|
|
23
|
+
Object.defineProperty(exports, "getWindowWidth", {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
get: function () { return chunkTRW7DKLP_cjs.getWindowWidth; }
|
|
26
|
+
});
|
|
27
|
+
Object.defineProperty(exports, "isBrowser", {
|
|
28
|
+
enumerable: true,
|
|
29
|
+
get: function () { return chunkTRW7DKLP_cjs.isBrowser; }
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(exports, "isServer", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
get: function () { return chunkTRW7DKLP_cjs.isServer; }
|
|
34
|
+
});
|
|
35
|
+
Object.defineProperty(exports, "removeLocalStorage", {
|
|
36
|
+
enumerable: true,
|
|
37
|
+
get: function () { return chunkTRW7DKLP_cjs.removeLocalStorage; }
|
|
38
|
+
});
|
|
39
|
+
Object.defineProperty(exports, "setLocalStorage", {
|
|
40
|
+
enumerable: true,
|
|
41
|
+
get: function () { return chunkTRW7DKLP_cjs.setLocalStorage; }
|
|
42
|
+
});
|
|
43
|
+
Object.defineProperty(exports, "useBreakpoint", {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
get: function () { return chunkTRW7DKLP_cjs.useBreakpoint; }
|
|
46
|
+
});
|
|
47
|
+
Object.defineProperty(exports, "useIsBreakpoint", {
|
|
48
|
+
enumerable: true,
|
|
49
|
+
get: function () { return chunkTRW7DKLP_cjs.useIsBreakpoint; }
|
|
50
|
+
});
|
|
51
|
+
Object.defineProperty(exports, "useIsClient", {
|
|
52
|
+
enumerable: true,
|
|
53
|
+
get: function () { return chunkTRW7DKLP_cjs.useIsClient; }
|
|
54
|
+
});
|
|
55
|
+
Object.defineProperty(exports, "useMediaQuery", {
|
|
56
|
+
enumerable: true,
|
|
57
|
+
get: function () { return chunkTRW7DKLP_cjs.useMediaQuery; }
|
|
58
|
+
});
|
|
59
|
+
Object.defineProperty(exports, "useWindowSize", {
|
|
60
|
+
enumerable: true,
|
|
61
|
+
get: function () { return chunkTRW7DKLP_cjs.useWindowSize; }
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=index.cjs.map
|
|
64
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* SSR (Server-Side Rendering) utilities for Next.js compatibility.
|
|
5
|
+
*
|
|
6
|
+
* These utilities help components work correctly with:
|
|
7
|
+
* - Next.js App Router
|
|
8
|
+
* - React Server Components
|
|
9
|
+
* - Hydration
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* import { useIsClient, ClientOnly } from '@prismiq/react/ssr';
|
|
14
|
+
*
|
|
15
|
+
* function MyComponent() {
|
|
16
|
+
* const isClient = useIsClient();
|
|
17
|
+
*
|
|
18
|
+
* if (!isClient) {
|
|
19
|
+
* return <Skeleton />;
|
|
20
|
+
* }
|
|
21
|
+
*
|
|
22
|
+
* return <Chart data={data} />;
|
|
23
|
+
* }
|
|
24
|
+
*
|
|
25
|
+
* // Or use ClientOnly wrapper
|
|
26
|
+
* <ClientOnly fallback={<Skeleton />}>
|
|
27
|
+
* <Chart data={data} />
|
|
28
|
+
* </ClientOnly>
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Hook that returns true when running in the browser.
|
|
34
|
+
*
|
|
35
|
+
* Useful for:
|
|
36
|
+
* - Conditionally rendering browser-only components
|
|
37
|
+
* - Avoiding hydration mismatches
|
|
38
|
+
* - Waiting for window/document access
|
|
39
|
+
*
|
|
40
|
+
* @returns true when running in browser, false during SSR
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```tsx
|
|
44
|
+
* function WindowSize() {
|
|
45
|
+
* const isClient = useIsClient();
|
|
46
|
+
*
|
|
47
|
+
* if (!isClient) {
|
|
48
|
+
* return <span>Loading...</span>;
|
|
49
|
+
* }
|
|
50
|
+
*
|
|
51
|
+
* return <span>{window.innerWidth}px</span>;
|
|
52
|
+
* }
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
declare function useIsClient(): boolean;
|
|
56
|
+
interface ClientOnlyProps {
|
|
57
|
+
/** Content to render on the client. */
|
|
58
|
+
children: ReactNode;
|
|
59
|
+
/** Fallback content to show during SSR. */
|
|
60
|
+
fallback?: ReactNode;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Component that only renders its children on the client.
|
|
64
|
+
*
|
|
65
|
+
* Use this to wrap components that:
|
|
66
|
+
* - Access window or document
|
|
67
|
+
* - Use browser-only APIs
|
|
68
|
+
* - Would cause hydration mismatches
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```tsx
|
|
72
|
+
* <ClientOnly fallback={<SkeletonChart type="bar" />}>
|
|
73
|
+
* <BarChart data={data} />
|
|
74
|
+
* </ClientOnly>
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
declare function ClientOnly({ children, fallback }: ClientOnlyProps): ReactNode;
|
|
78
|
+
/**
|
|
79
|
+
* Safely get window width (returns default during SSR).
|
|
80
|
+
*
|
|
81
|
+
* @param defaultWidth - Default width to return during SSR
|
|
82
|
+
* @returns Current window width or default
|
|
83
|
+
*/
|
|
84
|
+
declare function getWindowWidth(defaultWidth?: number): number;
|
|
85
|
+
/**
|
|
86
|
+
* Safely get window height (returns default during SSR).
|
|
87
|
+
*
|
|
88
|
+
* @param defaultHeight - Default height to return during SSR
|
|
89
|
+
* @returns Current window height or default
|
|
90
|
+
*/
|
|
91
|
+
declare function getWindowHeight(defaultHeight?: number): number;
|
|
92
|
+
/**
|
|
93
|
+
* Check if code is running in browser environment.
|
|
94
|
+
*
|
|
95
|
+
* @returns true if running in browser
|
|
96
|
+
*/
|
|
97
|
+
declare function isBrowser(): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Check if code is running in server environment.
|
|
100
|
+
*
|
|
101
|
+
* @returns true if running on server
|
|
102
|
+
*/
|
|
103
|
+
declare function isServer(): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Safely get a value from localStorage.
|
|
106
|
+
*
|
|
107
|
+
* @param key - Storage key
|
|
108
|
+
* @param defaultValue - Default value if key doesn't exist or during SSR
|
|
109
|
+
* @returns Stored value or default
|
|
110
|
+
*/
|
|
111
|
+
declare function getLocalStorage<T>(key: string, defaultValue: T): T;
|
|
112
|
+
/**
|
|
113
|
+
* Safely set a value in localStorage.
|
|
114
|
+
*
|
|
115
|
+
* @param key - Storage key
|
|
116
|
+
* @param value - Value to store
|
|
117
|
+
*/
|
|
118
|
+
declare function setLocalStorage<T>(key: string, value: T): void;
|
|
119
|
+
/**
|
|
120
|
+
* Safely remove a value from localStorage.
|
|
121
|
+
*
|
|
122
|
+
* @param key - Storage key to remove
|
|
123
|
+
*/
|
|
124
|
+
declare function removeLocalStorage(key: string): void;
|
|
125
|
+
interface WindowSize {
|
|
126
|
+
width: number;
|
|
127
|
+
height: number;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Hook to get and track window size with SSR support.
|
|
131
|
+
*
|
|
132
|
+
* @param defaultSize - Default size to use during SSR
|
|
133
|
+
* @returns Current window size
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```tsx
|
|
137
|
+
* function ResponsiveComponent() {
|
|
138
|
+
* const { width } = useWindowSize();
|
|
139
|
+
*
|
|
140
|
+
* if (width < 768) {
|
|
141
|
+
* return <MobileView />;
|
|
142
|
+
* }
|
|
143
|
+
*
|
|
144
|
+
* return <DesktopView />;
|
|
145
|
+
* }
|
|
146
|
+
* ```
|
|
147
|
+
*/
|
|
148
|
+
declare function useWindowSize(defaultSize?: WindowSize): WindowSize;
|
|
149
|
+
/**
|
|
150
|
+
* Hook to check if a media query matches with SSR support.
|
|
151
|
+
*
|
|
152
|
+
* @param query - CSS media query string
|
|
153
|
+
* @param defaultValue - Default value during SSR
|
|
154
|
+
* @returns Whether the media query matches
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* ```tsx
|
|
158
|
+
* function ResponsiveComponent() {
|
|
159
|
+
* const isMobile = useMediaQuery('(max-width: 768px)');
|
|
160
|
+
* const prefersDark = useMediaQuery('(prefers-color-scheme: dark)');
|
|
161
|
+
*
|
|
162
|
+
* return isMobile ? <MobileView /> : <DesktopView />;
|
|
163
|
+
* }
|
|
164
|
+
* ```
|
|
165
|
+
*/
|
|
166
|
+
declare function useMediaQuery(query: string, defaultValue?: boolean): boolean;
|
|
167
|
+
/**
|
|
168
|
+
* Default breakpoints matching common design systems.
|
|
169
|
+
*/
|
|
170
|
+
declare const BREAKPOINTS: {
|
|
171
|
+
readonly xs: 0;
|
|
172
|
+
readonly sm: 640;
|
|
173
|
+
readonly md: 768;
|
|
174
|
+
readonly lg: 1024;
|
|
175
|
+
readonly xl: 1280;
|
|
176
|
+
readonly '2xl': 1536;
|
|
177
|
+
};
|
|
178
|
+
type Breakpoint = keyof typeof BREAKPOINTS;
|
|
179
|
+
/**
|
|
180
|
+
* Hook to get current breakpoint with SSR support.
|
|
181
|
+
*
|
|
182
|
+
* @param defaultBreakpoint - Default breakpoint during SSR
|
|
183
|
+
* @returns Current breakpoint
|
|
184
|
+
*
|
|
185
|
+
* @example
|
|
186
|
+
* ```tsx
|
|
187
|
+
* function ResponsiveComponent() {
|
|
188
|
+
* const breakpoint = useBreakpoint();
|
|
189
|
+
*
|
|
190
|
+
* const columns = {
|
|
191
|
+
* xs: 1,
|
|
192
|
+
* sm: 2,
|
|
193
|
+
* md: 3,
|
|
194
|
+
* lg: 4,
|
|
195
|
+
* xl: 6,
|
|
196
|
+
* '2xl': 6,
|
|
197
|
+
* }[breakpoint];
|
|
198
|
+
*
|
|
199
|
+
* return <Grid columns={columns} />;
|
|
200
|
+
* }
|
|
201
|
+
* ```
|
|
202
|
+
*/
|
|
203
|
+
declare function useBreakpoint(defaultBreakpoint?: Breakpoint): Breakpoint;
|
|
204
|
+
/**
|
|
205
|
+
* Hook to check if current width is at or above a breakpoint.
|
|
206
|
+
*
|
|
207
|
+
* @param breakpoint - Breakpoint to check
|
|
208
|
+
* @param defaultValue - Default value during SSR
|
|
209
|
+
* @returns Whether width is at or above breakpoint
|
|
210
|
+
*/
|
|
211
|
+
declare function useIsBreakpoint(breakpoint: Breakpoint, defaultValue?: boolean): boolean;
|
|
212
|
+
|
|
213
|
+
export { BREAKPOINTS, type Breakpoint, ClientOnly, type ClientOnlyProps, type WindowSize, getLocalStorage, getWindowHeight, getWindowWidth, isBrowser, isServer, removeLocalStorage, setLocalStorage, useBreakpoint, useIsBreakpoint, useIsClient, useMediaQuery, useWindowSize };
|