@aiready/components 0.1.21 → 0.1.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +92 -3
- package/dist/index.js +358 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/code-block/CodeBlock.tsx +147 -0
- package/src/code-block/index.ts +1 -0
- package/src/data-display/ScoreBar.tsx +118 -0
- package/src/data-display/index.ts +1 -0
- package/src/feedback/ErrorDisplay.tsx +86 -0
- package/src/feedback/LoadingSpinner.tsx +35 -0
- package/src/feedback/index.ts +2 -0
- package/src/index.ts +24 -0
- package/src/navigation/Breadcrumb.tsx +61 -0
- package/src/navigation/index.ts +1 -0
- package/src/theme/ThemeProvider.tsx +124 -0
- package/src/theme/index.ts +1 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/cn.ts","../src/components/button.tsx","../src/components/card.tsx","../src/components/input.tsx","../src/components/label.tsx","../src/components/badge.tsx","../src/components/container.tsx","../src/components/grid.tsx","../src/components/stack.tsx","../src/components/separator.tsx","../src/components/checkbox.tsx","../src/components/radio-group.tsx","../src/components/switch.tsx","../src/components/textarea.tsx","../src/components/select.tsx","../src/utils/colors.ts","../src/utils/formatters.ts","../src/hooks/useDebounce.ts","../src/hooks/useD3.ts","../src/hooks/useForceSimulation.ts","../src/charts/NodeItem.tsx","../src/charts/LinkItem.tsx","../src/charts/ForceDirectedGraph.tsx","../src/charts/GraphControls.tsx"],"names":["React","jsx","React3","cva","React4","React5","React6","React7","React8","React9","React10","jsxs","React11","React12","React13","useEffect","d3","useState","useRef","d32","e","forwardRef","zoom"],"mappings":";;;;;;;;;AAQO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACNA,IAAM,cAAA,GAAiB,GAAA;AAAA,EACrB,wRAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,wDAAA;AAAA,QACT,WAAA,EACE,oEAAA;AAAA,QACF,OAAA,EACE,gFAAA;AAAA,QACF,SAAA,EACE,8DAAA;AAAA,QACF,KAAA,EAAO,8CAAA;AAAA,QACP,IAAA,EAAM;AAAA,OACR;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,gBAAA;AAAA,QACT,EAAA,EAAI,qBAAA;AAAA,QACJ,EAAA,EAAI,sBAAA;AAAA,QACJ,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ;AAQA,IAAM,MAAA,GAAeA,MAAA,CAAA,UAAA;AAAA,EACnB,CAAC,EAAE,SAAA,EAAW,OAAA,EAAS,MAAM,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC/C,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,SAAS,IAAA,EAAM,SAAA,EAAW,CAAC,CAAA;AAAA,QAC1D,GAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,MAAA,CAAO,WAAA,GAAc,QAAA;AC/CrB,IAAM,IAAA,GAAa,kBAGjB,CAAC,EAAE,WAAW,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1BC,GAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,0DAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,IAAA,CAAK,WAAA,GAAc,MAAA;AAEnB,IAAM,UAAA,GAAmB,kBAGvB,CAAC,EAAE,WAAW,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1BA,GAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA,CAAG,+BAAA,EAAiC,SAAS,CAAA;AAAA,IACvD,GAAG;AAAA;AACN,CACD;AACD,UAAA,CAAW,WAAA,GAAc,YAAA;AAEzB,IAAM,SAAA,GAAkB,kBAGtB,CAAC,EAAE,WAAW,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1BA,GAAAA;AAAA,EAAC,IAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,oDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,SAAA,CAAU,WAAA,GAAc,WAAA;AAExB,IAAM,eAAA,GAAwB,kBAG5B,CAAC,EAAE,WAAW,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1BA,GAAAA;AAAA,EAAC,GAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA,CAAG,+BAAA,EAAiC,SAAS,CAAA;AAAA,IACvD,GAAG;AAAA;AACN,CACD;AACD,eAAA,CAAgB,WAAA,GAAc,iBAAA;AAE9B,IAAM,WAAA,GAAoB,kBAGxB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1BA,IAAC,KAAA,EAAA,EAAI,GAAA,EAAU,WAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA,EAAI,GAAG,OAAO,CACjE;AACD,WAAA,CAAY,WAAA,GAAc,aAAA;AAE1B,IAAM,UAAA,GAAmB,kBAGvB,CAAC,EAAE,WAAW,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1BA,GAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA,CAAG,4BAAA,EAA8B,SAAS,CAAA;AAAA,IACpD,GAAG;AAAA;AACN,CACD;AACD,UAAA,CAAW,WAAA,GAAc,YAAA;ACrEzB,IAAM,KAAA,GAAcC,MAAA,CAAA,UAAA;AAAA,EAClB,CAAC,EAAE,SAAA,EAAW,MAAM,GAAG,KAAA,IAAS,GAAA,KAAQ;AACtC,IAAA,uBACED,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,8VAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,KAAA,CAAM,WAAA,GAAc,OAAA;ACjBpB,IAAM,aAAA,GAAgBE,GAAAA;AAAA,EACpB;AACF,CAAA;AAMA,IAAM,KAAA,GAAcC,MAAA,CAAA,UAAA;AAAA,EAClB,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,wBACxBH,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,aAAA,EAAc,EAAG,SAAS,CAAA;AAAA,MACvC,GAAG;AAAA;AAAA;AAGV;AACA,KAAA,CAAM,WAAA,GAAc,OAAA;ACjBpB,IAAM,aAAA,GAAgBE,GAAAA;AAAA,EACpB,wKAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EACE,2EAAA;AAAA,QACF,SAAA,EACE,iFAAA;AAAA,QACF,WAAA,EACE,uFAAA;AAAA,QACF,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS;AAAA;AACX;AAEJ;AAMA,SAAS,MAAM,EAAE,SAAA,EAAW,OAAA,EAAS,GAAG,OAAM,EAAe;AAC3D,EAAA,uBACEF,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,aAAA,CAAc,EAAE,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAE1E;ACzBA,IAAM,SAAA,GAAkBI,MAAA,CAAA,UAAA;AAAA,EACtB,CAAC,EAAE,SAAA,EAAW,IAAA,GAAO,MAAM,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC7C,IAAA,uBACEJ,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,qCAAA;AAAA,UACA;AAAA,YACE,mBAAmB,IAAA,KAAS,IAAA;AAAA,YAC5B,mBAAmB,IAAA,KAAS,IAAA;AAAA,YAC5B,mBAAmB,IAAA,KAAS,IAAA;AAAA,YAC5B,mBAAmB,IAAA,KAAS,IAAA;AAAA,YAC5B,cAAc,IAAA,KAAS;AAAA,WACzB;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,SAAA,CAAU,WAAA,GAAc,WAAA;ACpBxB,IAAM,IAAA,GAAaK,MAAA,CAAA,UAAA;AAAA,EACjB,CAAC,EAAE,SAAA,EAAW,IAAA,GAAO,CAAA,EAAG,MAAM,IAAA,EAAM,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACtD,IAAA,uBACEL,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,MAAA;AAAA,UACA;AAAA,YACE,eAAe,IAAA,KAAS,CAAA;AAAA,YACxB,8BAA8B,IAAA,KAAS,CAAA;AAAA,YACvC,6CAA6C,IAAA,KAAS,CAAA;AAAA,YACtD,6CAA6C,IAAA,KAAS,CAAA;AAAA,YACtD,6CAA6C,IAAA,KAAS,CAAA;AAAA,YACtD,6CAA6C,IAAA,KAAS,CAAA;AAAA,YACtD,8CAA8C,IAAA,KAAS;AAAA,WACzD;AAAA,UACA;AAAA,YACE,SAAS,GAAA,KAAQ,IAAA;AAAA,YACjB,SAAS,GAAA,KAAQ,IAAA;AAAA,YACjB,SAAS,GAAA,KAAQ,IAAA;AAAA,YACjB,SAAS,GAAA,KAAQ;AAAA,WACnB;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,IAAA,CAAK,WAAA,GAAc,MAAA;AC3BnB,IAAM,KAAA,GAAcM,MAAA,CAAA,UAAA;AAAA,EAClB,CACE;AAAA,IACE,SAAA;AAAA,IACA,SAAA,GAAY,UAAA;AAAA,IACZ,OAAA,GAAU,IAAA;AAAA,IACV,KAAA,GAAQ,SAAA;AAAA,IACR,OAAA,GAAU,OAAA;AAAA,IACV,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,uBACEN,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,MAAA;AAAA,UACA;AAAA,YACE,YAAY,SAAA,KAAc,UAAA;AAAA,YAC1B,YAAY,SAAA,KAAc;AAAA,WAC5B;AAAA,UACA;AAAA,YACE,SAAS,OAAA,KAAY,IAAA;AAAA,YACrB,SAAS,OAAA,KAAY,IAAA;AAAA,YACrB,SAAS,OAAA,KAAY,IAAA;AAAA,YACrB,SAAS,OAAA,KAAY,IAAA;AAAA,YACrB,SAAS,OAAA,KAAY;AAAA,WACvB;AAAA,UACA;AAAA,YACE,eAAe,KAAA,KAAU,OAAA;AAAA,YACzB,gBAAgB,KAAA,KAAU,QAAA;AAAA,YAC1B,aAAa,KAAA,KAAU,KAAA;AAAA,YACvB,iBAAiB,KAAA,KAAU;AAAA,WAC7B;AAAA,UACA;AAAA,YACE,iBAAiB,OAAA,KAAY,OAAA;AAAA,YAC7B,kBAAkB,OAAA,KAAY,QAAA;AAAA,YAC9B,eAAe,OAAA,KAAY,KAAA;AAAA,YAC3B,mBAAmB,OAAA,KAAY,SAAA;AAAA,YAC/B,kBAAkB,OAAA,KAAY;AAAA,WAChC;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,KAAA,CAAM,WAAA,GAAc,OAAA;AClDpB,IAAM,SAAA,GAAkBO,MAAA,CAAA,UAAA;AAAA,EACtB,CACE,EAAE,SAAA,EAAW,WAAA,GAAc,YAAA,EAAc,UAAA,GAAa,IAAA,EAAM,GAAG,KAAA,EAAM,EACrE,GAAA,qBAEAP,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAM,aAAa,MAAA,GAAS,WAAA;AAAA,MAC5B,kBAAA,EAAkB,WAAA;AAAA,MAClB,SAAA,EAAW,EAAA;AAAA,QACT,oBAAA;AAAA,QACA,WAAA,KAAgB,eAAe,gBAAA,GAAmB,gBAAA;AAAA,QAClD;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA;AAGV;AACA,SAAA,CAAU,WAAA,GAAc,WAAA;AClBxB,IAAM,QAAA,GAAiBQ,MAAA,CAAA,UAAA;AAAA,EACrB,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,IAAI,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC3C,IAAA,MAAM,UAAA,GAAa,MAAYA,MAAA,CAAA,KAAA,EAAM;AAErC,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,EAAA;AAAA,sBAAAR,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,UAAA;AAAA,UACL,EAAA,EAAI,UAAA;AAAA,UACJ,GAAA;AAAA,UACA,SAAA,EAAW,EAAA;AAAA,YACT,+IAAA;AAAA,YACA;AAAA,WACF;AAAA,UACC,GAAG;AAAA;AAAA,OACN;AAAA,MACC,yBACCA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,UAAA;AAAA,UACT,SAAA,EAAU,iGAAA;AAAA,UAET,QAAA,EAAA;AAAA;AAAA;AACH,KAAA,EAEJ,CAAA;AAAA,EAEJ;AACF;AACA,QAAA,CAAS,WAAA,GAAc,UAAA;AClBvB,IAAM,UAAA,GAAmBS,MAAA,CAAA,UAAA;AAAA,EACvB,CACE;AAAA,IACE,SAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,WAAA,GAAc,UAAA;AAAA,IACd,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,uBACET,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,MAAA;AAAA,UACA,WAAA,KAAgB,aAAa,gBAAA,GAAmB,gBAAA;AAAA,UAChD;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACvB,UAAA,MAAM,EAAA,GAAK,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,OAAO,KAAK,CAAA,CAAA;AAClC,UAAA,uBACEU,IAAAA,CAAC,KAAA,EAAA,EAAuB,SAAA,EAAU,mBAAA,EAChC,QAAA,EAAA;AAAA,4BAAAV,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,OAAA;AAAA,gBACL,EAAA;AAAA,gBACA,IAAA;AAAA,gBACA,OAAO,MAAA,CAAO,KAAA;AAAA,gBACd,OAAA,EAAS,UAAU,MAAA,CAAO,KAAA;AAAA,gBAC1B,UAAU,MAAA,CAAO,QAAA;AAAA,gBACjB,UAAU,CAAC,CAAA,KAAM,QAAA,GAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC1C,SAAA,EAAU;AAAA;AAAA,aACZ;AAAA,4BACAA,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,EAAA;AAAA,gBACT,SAAA,EAAU,iGAAA;AAAA,gBAET,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA;AACV,WAAA,EAAA,EAhBQ,OAAO,KAiBjB,CAAA;AAAA,QAEJ,CAAC;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AACA,UAAA,CAAW,WAAA,GAAc,YAAA;AC3DzB,IAAM,MAAA,GAAeW,MAAA,CAAA,UAAA;AAAA,EACnB,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,EAAA,EAAI,OAAA,EAAS,eAAA,EAAiB,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC/E,IAAA,MAAM,QAAA,GAAW,MAAYA,MAAA,CAAA,KAAA,EAAM;AAEnC,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAA2C;AAC/D,MAAA,QAAA,GAAW,CAAC,CAAA;AACZ,MAAA,eAAA,GAAkB,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,IACpC,CAAA;AAEA,IAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAS,QAAA,EAAU,WAAU,kDAAA,EAClC,QAAA,EAAA;AAAA,wBAAAV,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,UAAA;AAAA,YACL,EAAA,EAAI,QAAA;AAAA,YACJ,GAAA;AAAA,YACA,OAAA;AAAA,YACA,QAAA,EAAU,YAAA;AAAA,YACV,SAAA,EAAU,cAAA;AAAA,YACT,GAAG;AAAA;AAAA,SACN;AAAA,wBACAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,ucAAA;AAAA,cACA;AAAA;AACF;AAAA;AACF,OAAA,EACF,CAAA;AAAA,MACC,yBACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CACb,QAAA,EAAA,KAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ;AACF;AACA,MAAA,CAAO,WAAA,GAAc,QAAA;ACxCrB,IAAM,QAAA,GAAiBY,MAAA,CAAA,UAAA;AAAA,EACrB,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAChC,IAAA,uBACEZ,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,sSAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,QAAA,CAAS,WAAA,GAAc,UAAA;ACJvB,IAAM,MAAA,GAAea,MAAA,CAAA,UAAA;AAAA,EACnB,CAAC,EAAE,SAAA,EAAW,OAAA,EAAS,aAAa,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAChE,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAA4C;AAChE,MAAA,QAAA,GAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,IAC3B,CAAA;AAEA,IAAA,uBACEH,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,4NAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,QAAA,EAAU,YAAA;AAAA,QACT,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,WAAA,oBACCV,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAM,EAAA,EAAG,QAAA,EAAQ,MACtB,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,UAED,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,OAAO,MAAA,CAAO,KAAA;AAAA,cACd,UAAU,MAAA,CAAO,QAAA;AAAA,cAEhB,QAAA,EAAA,MAAA,CAAO;AAAA,aAAA;AAAA,YAJH,MAAA,CAAO;AAAA,WAMf;AAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AACA,MAAA,CAAO,WAAA,GAAc,QAAA;;;AC7Cd,IAAM,cAAA,GAAiB;AAAA,EAC5B,QAAA,EAAU,SAAA;AAAA;AAAA,EACV,KAAA,EAAO,SAAA;AAAA;AAAA,EACP,KAAA,EAAO,SAAA;AAAA;AAAA,EACP,IAAA,EAAM;AAAA;AACR;AAGO,IAAM,YAAA,GAAe;AAAA,EAC1B,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA;AAAA;AACF;AAGO,IAAM,WAAA,GAAc;AAAA,EACzB,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,SAAA;AAAA,EACR,IAAA,EAAM;AACR;AAKO,SAAS,eAAe,KAAA,EAAuB;AACpD,EAAA,OAAO,YAAA,CAAa,KAAA,GAAQ,YAAA,CAAa,MAAM,CAAA;AACjD;AAKO,SAAS,iBACd,QAAA,EACQ;AACR,EAAA,OAAO,eAAe,QAAQ,CAAA;AAChC;AAKO,SAAS,SAAA,CAAU,KAAa,KAAA,EAAuB;AAC5D,EAAA,MAAM,IAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACtC,EAAA,MAAM,IAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACtC,EAAA,MAAM,IAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACtC,EAAA,OAAO,QAAQ,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,KAAK,KAAK,CAAA,CAAA,CAAA;AACxC;;;ACjDO,SAAS,aAAa,KAAA,EAAuB;AAClD,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AACpD;AAOO,SAAS,oBAAoB,KAAA,EAAuB;AACzD,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,IACpC,QAAA,EAAU,SAAA;AAAA,IACV,qBAAA,EAAuB;AAAA,GACxB,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACjB;AAOO,SAAS,gBAAA,CAAiB,KAAA,EAAe,QAAA,GAAmB,CAAA,EAAW;AAC5E,EAAA,OAAO,CAAA,EAAA,CAAI,KAAA,GAAQ,GAAA,EAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAA,CAAA;AAC3C;AAOO,SAAS,eAAe,KAAA,EAAuB;AACpD,EAAA,MAAM,QAAQ,CAAC,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAC1C,EAAA,IAAI,IAAA,GAAO,KAAA;AACX,EAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,EAAA,OAAO,IAAA,IAAQ,IAAA,IAAQ,SAAA,GAAY,KAAA,CAAM,SAAS,CAAA,EAAG;AACnD,IAAA,IAAA,IAAQ,IAAA;AACR,IAAA,SAAA,EAAA;AAAA,EACF;AAEA,EAAA,OAAO,CAAA,EAAG,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AAC/C;AAMO,SAAS,mBAAmB,IAAA,EAAoB;AACrD,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,EAAQ,GAAI,KAAK,OAAA,EAAQ;AAC5C,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,GAAI,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,EAAE,CAAA;AACxC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACzC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,GAAG,CAAA;AAEzC,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,OAAO,GAAG,QAAQ,CAAA,KAAA,EAAQ,QAAA,GAAW,CAAA,GAAI,MAAM,EAAE,CAAA,IAAA,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,OAAO,GAAG,SAAS,CAAA,MAAA,EAAS,SAAA,GAAY,CAAA,GAAI,MAAM,EAAE,CAAA,IAAA,CAAA;AAAA,EACtD;AACA,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,OAAO,GAAG,OAAO,CAAA,IAAA,EAAO,OAAA,GAAU,CAAA,GAAI,MAAM,EAAE,CAAA,IAAA,CAAA;AAAA,EAChD;AACA,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,OAAO,GAAG,QAAQ,CAAA,KAAA,EAAQ,QAAA,GAAW,CAAA,GAAI,MAAM,EAAE,CAAA,IAAA,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,OAAO,GAAG,OAAO,CAAA,OAAA,EAAU,OAAA,GAAU,CAAA,GAAI,MAAM,EAAE,CAAA,IAAA,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,UAAA;AACT;AAKO,SAAS,WAAW,IAAA,EAAoB;AAC7C,EAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS;AAAA,IACtC,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,GAAA,EAAK;AAAA,GACN,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA;AAChB;AAKO,SAAS,eAAe,IAAA,EAAoB;AACjD,EAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS;AAAA,IACtC,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,GAAA,EAAK,SAAA;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,MAAA,EAAQ,SAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACT,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA;AAChB;AAMO,SAAS,eAAe,EAAA,EAAoB;AACjD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AACpC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACvC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AAErC,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,OAAO,GAAG,KAAK,CAAA,EAAA,EAAK,UAAU,EAAE,CAAA,EAAA,EAAK,UAAU,EAAE,CAAA,CAAA,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,OAAA,GAAU,EAAE,CAAA,CAAA,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,GAAG,OAAO,CAAA,CAAA,CAAA;AACnB;AAMO,SAAS,YAAA,CACd,KAAA,EACA,IAAA,GAAuD,QAAA,EAC/C;AACR,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,OAAA;AACH,MAAA,OAAO,eAAe,KAAK,CAAA;AAAA,IAC7B,KAAK,YAAA;AACH,MAAA,OAAO,iBAAiB,KAAK,CAAA;AAAA,IAC/B,KAAK,UAAA;AACH,MAAA,OAAO,eAAe,KAAK,CAAA;AAAA,IAC7B;AACE,MAAA,OAAO,oBAAoB,KAAK,CAAA;AAAA;AAEtC;AAMO,SAAS,WAAA,CAAY,KAAa,GAAA,EAAqB;AAC5D,EAAA,OAAO,GAAG,mBAAA,CAAoB,GAAG,CAAC,CAAA,GAAA,EAAM,mBAAA,CAAoB,GAAG,CAAC,CAAA,CAAA;AAClE;AAMO,SAAS,aAAA,CAAc,KAAA,EAAe,QAAA,GAAmB,CAAA,EAAW;AACzE,EAAA,OAAO,KAAA,CAAM,QAAQ,QAAQ,CAAA;AAC/B;ACrIO,SAAS,WAAA,CAAe,KAAA,EAAU,KAAA,GAAgB,GAAA,EAAQ;AAC/D,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAY,KAAK,CAAA;AAE7D,EAAA,SAAA,CAAU,MAAM;AAEd,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,IACzB,GAAG,KAAK,CAAA;AAGR,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,KAAK,CAAC,CAAA;AAEjB,EAAA,OAAO,cAAA;AACT;ACOO,SAAS,KAAA,CACd,QAAA,EACA,YAAA,GAAqC,EAAC,EACX;AAC3B,EAAA,MAAM,GAAA,GAAM,OAAiB,IAAI,CAAA;AAEjC,EAAAc,UAAU,MAAM;AACd,IAAA,IAAI,IAAI,OAAA,EAAS;AACf,MAAA,MAAM,SAAA,GAAeC,GAAA,CAAA,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACvC,MAAA,QAAA,CAAS,SAAS,CAAA;AAAA,IACpB;AAAA,EAEF,GAAG,YAAY,CAAA;AAEf,EAAA,OAAO,GAAA;AACT;AA6BO,SAAS,eAAA,CACd,QAAA,EACA,YAAA,GAAqC,EAAC,EACX;AAC3B,EAAA,MAAM,GAAA,GAAM,OAAiB,IAAI,CAAA;AAEjC,EAAAD,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAElB,IAAA,MAAM,SAAA,GAAeC,GAAA,CAAA,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,SAAS,CAAA;AAGvC,IAAA,MAAA,EAAO;AAGP,IAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe,MAAM;AAC9C,MAAA,MAAA,EAAO;AAAA,IACT,CAAC,CAAA;AAED,IAAA,cAAA,CAAe,OAAA,CAAQ,IAAI,OAAO,CAAA;AAGlC,IAAA,OAAO,MAAM;AACX,MAAA,cAAA,CAAe,UAAA,EAAW;AAAA,IAC5B,CAAA;AAAA,EAEF,GAAG,YAAY,CAAA;AAEf,EAAA,OAAO,GAAA;AACT;ACqFO,SAAS,kBAAA,CACd,YAAA,EACA,YAAA,EACA,OAAA,EAC6E;AAC7E,EAAA,MAAM;AAAA,IACJ,cAAA,GAAiB,IAAA;AAAA,IACjB,YAAA,GAAe,GAAA;AAAA,IACf,YAAA,GAAe,CAAA;AAAA,IACf,iBAAA,GAAoB,CAAA;AAAA,IACpB,eAAA,GAAkB,EAAA;AAAA,IAClB,cAAA,GAAiB,GAAA;AAAA,IACjB,KAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA,GAAa,MAAA;AAAA,IACb,aAAA,GAAgB,GAAA;AAAA,IAChB,WAAA,GAAc,CAAA;AAAA,IACd,SAAA,GAAY,GAAA;AAAA,IACZ,QAAA,GAAW,IAAA;AAAA;AAAA,IAEX,eAAA,GAAkB,IAAA;AAAA,IAClB,MAAA;AAAA;AAAA;AAAA;AAAA,IAIA,cAAA,GAAiB,EAAA;AAAA;AAAA,IAEjB,mBAAA,GAAsB;AAAA,GACxB,GAAI,OAAA;AAEJ,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,SAA2B,YAAY,CAAA;AACjE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAA2B,YAAY,CAAA;AACjE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,CAAC,CAAA;AAEpC,EAAA,MAAM,aAAA,GAAgBC,OAA6D,IAAI,CAAA;AACvF,EAAA,MAAM,cAAA,GAAiBA,OAAsB,IAAI,CAAA;AAKjD,EAAA,MAAM,QAAA,GAAW,aAAa,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACvD,EAAA,MAAM,YAAY,YAAA,IAAgB,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM;AAC/C,IAAA,MAAM,CAAA,GAAI,OAAO,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA,GAAU,EAAE,MAAA,EAAgB,EAAA;AACvE,IAAA,MAAM,CAAA,GAAI,OAAO,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA,GAAU,EAAE,MAAA,EAAgB,EAAA;AACvE,IAAA,OAAO,GAAG,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAK,CAAA,CAAU,QAAQ,EAAE,CAAA,CAAA;AAAA,EAC5C,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAEX,EAAAH,UAAU,MAAM;AAEd,IAAA,MAAM,SAAA,GAAY,aAAa,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,MAAK,CAAE,CAAA;AAC1D,IAAA,MAAM,SAAA,GAAY,aAAa,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,MAAK,CAAE,CAAA;AAI1D,IAAA,IAAI;AAGF,MAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AAE1B,QAAA,MAAM,KAAA,GAAS,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,KAAM,SAAA,CAAU,MAAA;AAE5C,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA,GAAI,IAAA;AACzC,QAAA,CAAA,CAAE,IAAI,KAAA,GAAQ,CAAA,GAAI,MAAA,GAAS,IAAA,CAAK,IAAI,KAAK,CAAA;AACzC,QAAA,CAAA,CAAE,IAAI,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,IAAA,CAAK,IAAI,KAAK,CAAA;AAE1C,QAAC,CAAA,CAAU,EAAA,GAAA,CAAM,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,CAAA;AACxC,QAAC,CAAA,CAAU,EAAA,GAAA,CAAM,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,CAAA;AAAA,MAC1C,CAAC,CAAA;AAAA,IACH,SAAS,CAAA,EAAG;AAEV,MAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAA,KAAM;AACvB,QAAA,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,MAAA,EAAO,GAAI,KAAA;AACtB,QAAA,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,MAAA,EAAO,GAAI,MAAA;AACtB,QAAC,CAAA,CAAU,EAAA,GAAA,CAAM,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,EAAA;AACxC,QAAC,CAAA,CAAU,EAAA,GAAA,CAAM,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,EAAA;AAAA,MAC1C,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,UAAA,GAAiBI,oBAAgB,SAAgB,CAAA;AAGvD,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAgBA,cAAU,SAAgB,CAAA;AAChD,MAAA,SAAA,CAAU,GAAG,CAAC,CAAA,KAAW,EAAE,EAAE,CAAA,CAAE,SAAS,CAAC,CAAA,KAAY,CAAA,IAAK,CAAA,CAAE,YAAY,IAAA,GAAO,CAAA,CAAE,WAAW,YAAa,CAAA,CAAE,SAAS,YAAY,CAAA;AAChI,MAAA,UAAA,CAAW,KAAA,CAAM,QAAQ,SAAgB,CAAA;AAAA,IAC3C,SAAS,CAAA,EAAG;AAEV,MAAA,IAAI;AAAE,QAAA,UAAA,CAAW,KAAA,CAAM,MAAA,EAAWA,GAAA,CAAA,SAAA,CAAU,SAAgB,CAAQ,CAAA;AAAA,MAAG,SAASC,EAAAA,EAAG;AAAA,MAAC;AAAA,IACtF;AAGA,IAAA,IAAI;AACF,MAAA,UAAA,CAAW,MAAM,QAAA,EAAaD,GAAA,CAAA,aAAA,EAAc,CAAE,QAAA,CAAS,cAAc,CAAQ,CAAA;AAC7E,MAAA,UAAA,CAAW,KAAA,CAAM,QAAA,EAAaA,GAAA,CAAA,WAAA,CAAY,KAAA,GAAQ,CAAA,EAAG,SAAS,CAAC,CAAA,CAAE,QAAA,CAAS,cAAc,CAAQ,CAAA;AAChG,MAAA,MAAM,OAAA,GAAaA,GAAA,CAAA,YAAA,EAAa,CAAE,MAAA,CAAO,CAAC,CAAA,KAAW;AACnD,QAAA,MAAM,QAAA,GAAY,CAAA,IAAK,CAAA,CAAE,IAAA,GAAQ,EAAE,IAAA,GAAO,EAAA;AAC1C,QAAA,OAAO,QAAA,GAAW,eAAA;AAAA,MACpB,CAAC,CAAA,CAAE,QAAA,CAAS,iBAAwB,CAAA;AACpC,MAAA,UAAA,CAAW,KAAA,CAAM,aAAa,OAAO,CAAA;AACrC,MAAA,UAAA,CAAW,KAAA,CAAM,GAAA,EAAQA,GAAA,CAAA,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA,CAAE,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,cAAA,GAAiB,GAAG,CAAC,CAAQ,CAAA;AAChG,MAAA,UAAA,CAAW,KAAA,CAAM,GAAA,EAAQA,GAAA,CAAA,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,CAAE,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,cAAA,GAAiB,GAAG,CAAC,CAAQ,CAAA;AACjG,MAAA,UAAA,CAAW,WAAW,UAAU,CAAA;AAChC,MAAA,UAAA,CAAW,cAAc,aAAa,CAAA;AACtC,MAAA,UAAA,CAAW,SAAS,QAAQ,CAAA;AAC5B,MAAA,IAAI;AAAE,QAAA,UAAA,CAAW,YAAY,WAAW,CAAA;AAAA,MAAG,SAAS,CAAA,EAAG;AAAA,MAAC;AACxD,MAAA,IAAI;AAAE,QAAA,UAAA,CAAW,MAAM,SAAS,CAAA;AAAA,MAAG,SAAS,CAAA,EAAG;AAAA,MAAC;AAAA,IAClD,SAAS,CAAA,EAAG;AAAA,IAEZ;AAEA,IAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AAGxB,IAAA,IAAI,cAAA,CAAe,WAAW,IAAA,EAAM;AAClC,MAAA,IAAI;AAAE,QAAC,UAAA,CAAW,YAAA,CAAqB,cAAA,CAAe,OAAO,CAAA;AAAA,MAAG,SAAS,CAAA,EAAG;AAAA,MAAC;AAC7E,MAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAAA,IAC3B;AACA,IAAA,IAAI,mBAAA,IAAuB,sBAAsB,CAAA,EAAG;AAClD,MAAA,cAAA,CAAe,OAAA,GAAW,UAAA,CAAW,UAAA,CAAmB,MAAM;AAC5D,QAAA,IAAI;AACF,UAAA,IAAI,eAAA,EAAiB;AACnB,YAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAA,KAAM;AACvB,cAAC,EAAU,EAAA,GAAK,CAAA;AAChB,cAAC,EAAU,EAAA,GAAK,CAAA;AAChB,cAAA,IAAI,OAAO,CAAA,CAAE,CAAA,KAAM,QAAA,EAAU,CAAA,CAAE,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AACxD,cAAA,IAAI,OAAO,CAAA,CAAE,CAAA,KAAM,QAAA,EAAU,CAAA,CAAE,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,YAC1D,CAAC,CAAA;AAAA,UACH;AACA,UAAA,UAAA,CAAW,MAAM,CAAC,CAAA;AAClB,UAAA,UAAA,CAAW,IAAA,EAAK;AAAA,QAClB,SAAS,CAAA,EAAG;AAAA,QAAC;AACb,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,QAAA,CAAS,CAAC,GAAG,SAAS,CAAC,CAAA;AACvB,QAAA,QAAA,CAAS,CAAC,GAAG,SAAS,CAAC,CAAA;AAAA,MACzB,GAAG,mBAAmB,CAAA;AAAA,IACxB;AAIA,IAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,IAAI;AACF,QAAA,IAAI,OAAO,MAAA,KAAW,UAAA,EAAY,MAAA,CAAO,SAAA,EAAW,WAAW,UAAU,CAAA;AAAA,MAC3E,SAAS,CAAA,EAAG;AAAA,MAEZ;AAIA,MAAA,IAAI;AACF,QAAA,IAAI,UAAA,CAAW,KAAA,EAAM,IAAM,QAAA,EAAqB;AAC9C,UAAA,IAAI;AACF,YAAA,IAAI,eAAA,EAAiB;AACnB,cAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAA,KAAM;AACvB,gBAAC,EAAU,EAAA,GAAK,CAAA;AAChB,gBAAC,EAAU,EAAA,GAAK,CAAA;AAChB,gBAAA,IAAI,OAAO,CAAA,CAAE,CAAA,KAAM,QAAA,EAAU,CAAA,CAAE,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AACxD,gBAAA,IAAI,OAAO,CAAA,CAAE,CAAA,KAAM,QAAA,EAAU,CAAA,CAAE,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,cAC1D,CAAC,CAAA;AAAA,YACH;AACA,YAAA,UAAA,CAAW,IAAA,EAAK;AAAA,UAClB,SAAS,CAAA,EAAG;AAAA,UAAC;AACb,UAAA,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA;AAC3B,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,QAAA,CAAS,CAAC,GAAG,SAAS,CAAC,CAAA;AACvB,UAAA,QAAA,CAAS,CAAC,GAAG,SAAS,CAAC,CAAA;AACvB,UAAA;AAAA,QACF;AAAA,MACF,SAAS,CAAA,EAAG;AAAA,MAEZ;AAEA,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,YAAA,GAAe,MAAM,UAAA,IAAe,cAAA;AAC1C,MAAA,IAAI,KAAA,IAAS,QAAQ,YAAA,EAAc;AACjC,QAAA,KAAA,GAAA,CAAS,UAAA,CAAW,0BAA0B,CAAC,EAAA,KAA6B,WAAW,EAAA,EAAI,EAAE,IAAI,MAAM;AACrG,UAAA,KAAA,GAAQ,IAAA;AACR,UAAA,UAAA,GAAa,KAAK,GAAA,EAAI;AACtB,UAAA,QAAA,CAAS,CAAC,GAAG,SAAS,CAAC,CAAA;AACvB,UAAA,QAAA,CAAS,CAAC,GAAG,SAAS,CAAC,CAAA;AACvB,UAAA,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA;AAC3B,UAAA,YAAA,CAAa,UAAA,CAAW,KAAA,EAAM,GAAI,UAAA,CAAW,UAAU,CAAA;AAAA,QACzD,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAEA,IAAA,UAAA,CAAW,EAAA,CAAG,QAAQ,WAAW,CAAA;AAEjC,IAAA,UAAA,CAAW,EAAA,CAAG,OAAO,MAAM;AACzB,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAC,CAAA;AAGD,IAAA,OAAO,MAAM;AACX,MAAA,IAAI;AACF,QAAA,UAAA,CAAW,EAAA,CAAG,QAAQ,IAAW,CAAA;AAAA,MACnC,SAAS,CAAA,EAAG;AAAA,MAAC;AACb,MAAA,IAAI,cAAA,CAAe,WAAW,IAAA,EAAM;AAClC,QAAA,IAAI;AAAE,UAAC,UAAA,CAAW,YAAA,CAAqB,cAAA,CAAe,OAAO,CAAA;AAAA,QAAG,SAAS,CAAA,EAAG;AAAA,QAAC;AAC7E,QAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAAA,MAC3B;AACA,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,IAAI;AAAE,UAAA,CAAC,WAAW,oBAAA,KAAyB,CAAC,OAAe,YAAA,CAAa,EAAE,IAAI,KAAK,CAAA;AAAA,QAAG,SAAS,CAAA,EAAG;AAAA,QAAC;AACnG,QAAA,KAAA,GAAQ,IAAA;AAAA,MACV;AACA,MAAA,UAAA,CAAW,IAAA,EAAK;AAAA,IAClB,CAAA;AAAA,EACF,CAAA,EAAG;AAAA,IACD,QAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,iBAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,IAAI,cAAc,OAAA,EAAS;AAGzB,MAAA,IAAI;AAAE,QAAA,aAAA,CAAc,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA,MAAG,SAAS,CAAA,EAAG;AAAE,QAAA,aAAA,CAAc,QAAQ,OAAA,EAAQ;AAAA,MAAG;AAC7G,MAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,MAAA,IAAI,cAAA,CAAe,WAAW,IAAA,EAAM;AAClC,QAAA,IAAI;AAAE,UAAC,UAAA,CAAW,YAAA,CAAqB,cAAA,CAAe,OAAO,CAAA;AAAA,QAAG,SAAS,CAAA,EAAG;AAAA,QAAC;AAC7E,QAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAAA,MAC3B;AACA,MAAA,IAAI,mBAAA,IAAuB,sBAAsB,CAAA,EAAG;AAClD,QAAA,cAAA,CAAe,OAAA,GAAW,UAAA,CAAW,UAAA,CAAmB,MAAM;AAC5D,UAAA,IAAI;AAAE,YAAA,aAAA,CAAc,OAAA,EAAS,MAAM,CAAC,CAAA;AAAG,YAAA,aAAA,CAAc,SAAS,IAAA,EAAK;AAAA,UAAG,SAAS,CAAA,EAAG;AAAA,UAAC;AACnF,UAAA,YAAA,CAAa,KAAK,CAAA;AAAA,QACpB,GAAG,mBAAmB,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,IAAI,cAAc,OAAA,EAAS;AACzB,MAAA,aAAA,CAAc,QAAQ,IAAA,EAAK;AAC3B,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoBD,OAAO,EAAE,MAAA,EAAQ,gBAAgB,IAAA,EAAM,YAAA,EAAc,SAAA,EAAW,iBAAA,EAAmB,CAAA;AAC7G,EAAA,MAAM,gBAAA,GAAmBA,OAAO,IAAI,CAAA;AAEpC,EAAA,MAAM,gBAAA,GAAmB,CAAC,OAAA,KAAqB;AAC7C,IAAA,MAAM,MAAM,aAAA,CAAc,OAAA;AAC1B,IAAA,IAAI,CAAC,GAAA,EAAK;AAEV,IAAA,IAAI,gBAAA,CAAiB,YAAY,OAAA,EAAS;AAC1C,IAAA,gBAAA,CAAiB,OAAA,GAAU,OAAA;AAE3B,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAc,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA;AACtC,MAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,QAAA,KAAa,UAAA,EAAY;AACnD,QAAA,MAAA,CAAO,QAAA,CAAS,OAAA,GAAU,iBAAA,CAAkB,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,MAChE;AAEA,MAAA,MAAM,IAAA,GAAY,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AAClC,MAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,CAAK,QAAA,KAAa,UAAA,EAAY;AAC/C,QAAA,IAAA,CAAK,QAAA,CAAS,OAAA,GAAU,iBAAA,CAAkB,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA,MAC5D;AAAA,IACF,SAAS,CAAA,EAAG;AAAA,IAEZ;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AA+BO,SAAS,QAAQ,UAAA,EAAmE;AACzF,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,EAAY,IAAA,KAAyB;AACxD,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,aAAmB,WAAA,CAAY,GAAG,EAAE,OAAA,EAAQ;AACvD,IAAA,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA;AACf,IAAA,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,EAAY,IAAA,KAAyB;AACpD,IAAA,IAAA,CAAK,KAAK,KAAA,CAAM,CAAA;AAChB,IAAA,IAAA,CAAK,KAAK,KAAA,CAAM,CAAA;AAAA,EAClB,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,EAAY,IAAA,KAAyB;AACtD,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,UAAA,CAAW,YAAY,CAAC,CAAA;AAC3C,IAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,IAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,EACZ,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,WAAA;AAAA,IACb,MAAA,EAAQ,OAAA;AAAA,IACR,SAAA,EAAW;AAAA,GACb;AACF;AC3hBO,IAAM,WAAoC,CAAC;AAAA,EAChD,IAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,OAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,QAAA,GAAW,KAAK,IAAA,IAAQ,eAAA;AAC9B,EAAA,MAAM,SAAA,GAAY,KAAK,KAAA,IAAS,gBAAA;AAEhC,EAAA,MAAM,CAAA,GAAI,KAAK,CAAA,IAAK,CAAA;AACpB,EAAA,MAAM,CAAA,GAAI,KAAK,CAAA,IAAK,CAAA;AAEpB,EAAA,uBACEP,IAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MAEC,SAAA,EAAU,qBAAA;AAAA,MACV,WAAS,IAAA,CAAK,EAAA;AAAA,MACd,SAAA,EAAW,CAAA,UAAA,EAAa,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MAC9B,OAAA,EAAS,MAAM,OAAA,GAAU,IAAI,CAAA;AAAA,MAC7B,aAAA,EAAe,CAAC,CAAA,KAAM,aAAA,GAAgB,GAAG,IAAI,CAAA;AAAA,MAC7C,YAAA,EAAc,MAAM,YAAA,GAAe,IAAI,CAAA;AAAA,MACvC,YAAA,EAAc,MAAM,YAAA,IAAe;AAAA,MACnC,WAAA,EAAa,CAAC,CAAA,KAAM,WAAA,GAAc,GAAG,IAAI,CAAA;AAAA,MAEzC,QAAA,EAAA;AAAA,wBAAAV,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAG,QAAA;AAAA,YACH,IAAA,EAAM,SAAA;AAAA,YACN,MAAA,EAAQ,UAAA,GAAa,MAAA,GAAS,SAAA,GAAY,MAAA,GAAS,MAAA;AAAA,YACnD,aAAa,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,GAAA,GAAM,YAAY,CAAA,GAAI,GAAA;AAAA,YAC7D,OAAA,EAAS,SAAA,IAAa,UAAA,GAAa,CAAA,GAAI;AAAA;AAAA,SACzC;AAAA,QACC,0BACCA,GAAAA,CAAC,QAAA,EAAA,EAAO,CAAA,EAAG,WAAW,CAAA,EAAG,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,WAAU,WAAA,EAAa,CAAA,EAAG,OAAA,EAAS,GAAA,EAAK,WAAU,qBAAA,EAAsB,CAAA;AAAA,QAErH,SAAA,IAAa,KAAK,KAAA,oBACjBA,IAAC,MAAA,EAAA,EAAK,CAAA,EAAG,QAAA,GAAW,EAAA,EAAI,IAAA,EAAK,MAAA,EAAO,UAAS,IAAA,EAAK,UAAA,EAAW,UAAS,gBAAA,EAAiB,QAAA,EAAS,eAAc,MAAA,EAAO,SAAA,EAAU,aAAA,EAC5H,QAAA,EAAA,IAAA,CAAK,KAAA,EACR;AAAA;AAAA,KAAA;AAAA,IAvBG,IAAA,CAAK;AAAA,GAyBZ;AAEJ,CAAA;AAEA,IAAO,gBAAA,GAAQ,QAAA;AC1DR,IAAM,QAAA,GAAoC,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,YAAA,EAAc,SAAA,GAAY,IAAA,EAAM,KAAA,GAAQ,EAAC,EAAE,KAAM;AAClH,EAAA,MAAM,GAAA,GAAO,KAAK,MAAA,EAAgB,EAAA,KAAO,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,GAAW,IAAA,CAAK,MAAA,GAAS,MAAA,CAAA;AACzF,EAAA,MAAM,GAAA,GAAO,KAAK,MAAA,EAAgB,EAAA,KAAO,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,GAAW,IAAA,CAAK,MAAA,GAAS,MAAA,CAAA;AAGzF,EAAA,MAAM,eAAA,GAAkB,CAAC,QAAA,KAAkE;AACzF,IAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,KAAa,IAAA,EAAM;AAErD,MAAA,MAAM,IAAA,GAAO,QAAA;AACb,MAAA,OAAO,EAAE,GAAG,IAAA,CAAK,CAAA,IAAK,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAE;AAAA,IAC1C,CAAA,MAAA,IAAW,OAAO,QAAA,KAAa,QAAA,EAAU;AAEvC,MAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,QAAQ,CAAA;AAC/C,MAAA,IAAI,KAAA,EAAO,OAAO,EAAE,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,EAAG,CAAA,EAAG,KAAA,CAAM,CAAA,IAAK,CAAA,EAAE;AAAA,IACvD;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,IAAA,CAAK,MAAM,CAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,IAAA,CAAK,MAAM,CAAA;AAG7C,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,SAAA,EAAW;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,IAAA,GAAA,CAAQ,SAAA,CAAU,CAAA,GAAI,SAAA,CAAU,CAAA,IAAK,CAAA;AAC3C,EAAA,MAAM,IAAA,GAAA,CAAQ,SAAA,CAAU,CAAA,GAAI,SAAA,CAAU,CAAA,IAAK,CAAA;AAE3C,EAAA,uBACEU,KAAC,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAV,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,IAAI,SAAA,CAAU,CAAA;AAAA,QACd,IAAI,SAAA,CAAU,CAAA;AAAA,QACd,IAAI,SAAA,CAAU,CAAA;AAAA,QACd,IAAI,SAAA,CAAU,CAAA;AAAA,QACd,aAAA,EAAa,GAAA;AAAA,QACb,aAAA,EAAa,GAAA;AAAA,QACb,QAAQ,IAAA,CAAK,KAAA;AAAA,QACb,WAAA,EAAa,IAAA,CAAK,KAAA,IAAS,YAAA,IAAgB,CAAA;AAAA,QAC3C,OAAA,EAAS,GAAA;AAAA,QACT,SAAA,EAAU,qDAAA;AAAA,QACV,OAAA,EAAS,MAAM,OAAA,GAAU,IAAI;AAAA;AAAA,KAC/B;AAAA,IACC,SAAA,IAAa,IAAA,CAAK,KAAA,oBACjBA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAG,IAAA;AAAA,QACH,CAAA,EAAG,IAAA;AAAA,QACH,IAAA,EAAK,MAAA;AAAA,QACL,QAAA,EAAS,IAAA;AAAA,QACT,UAAA,EAAW,QAAA;AAAA,QACX,gBAAA,EAAiB,QAAA;AAAA,QACjB,aAAA,EAAc,MAAA;AAAA,QAEb,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA;AACR,GAAA,EAEJ,CAAA;AAEJ,CAAA;AAEA,IAAO,gBAAA,GAAQ,QAAA;ACLR,IAAM,kBAAA,GAAqBoB,UAAAA;AAAA,EAChC,CACE;AAAA,IACE,KAAA,EAAO,YAAA;AAAA,IACP,KAAA,EAAO,YAAA;AAAA,IACP,KAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA,GAAa,IAAA;AAAA,IACb,UAAA,GAAa,IAAA;AAAA,IACb,WAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA,GAAmB,SAAA;AAAA,IACnB,eAAA,GAAkB,EAAA;AAAA,IAClB,gBAAA,GAAmB,MAAA;AAAA,IACnB,gBAAA,GAAmB,CAAA;AAAA,IACnB,cAAA,GAAiB,IAAA;AAAA,IACjB,cAAA,GAAiB,KAAA;AAAA,IACjB,SAAA;AAAA,IACA,YAAA,GAAe,KAAA;AAAA,IACf,oBAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA,EAAQ,cAAA;AAAA,IACR;AAAA,KAEF,GAAA,KACG;AACL,IAAA,MAAM,MAAA,GAASH,OAAsB,IAAI,CAAA;AACzC,IAAA,MAAM,IAAA,GAAOA,OAAoB,IAAI,CAAA;AACrC,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAID,QAAAA,CAAS,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAeC,OAAO,SAAS,CAAA;AACrC,IAAA,MAAM,WAAA,GAAcA,OAAyB,IAAI,CAAA;AACjD,IAAA,MAAM,aAAA,GAAgBA,OAAO,KAAK,CAAA;AAClC,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,IAAID,QAAAA,iBAAsB,IAAI,KAAK,CAAA;AACrE,IAAA,MAAM,sBAAA,GAAyBC,OAAO,UAAU,CAAA;AAChD,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAID,QAAAA,CAAqB,kBAAkB,OAAO,CAAA;AAG1E,IAAAF,UAAU,MAAM;AACd,MAAA,IAAI,cAAA,IAAkB,mBAAmB,MAAA,EAAQ;AAC/C,QAAA,SAAA,CAAU,cAAc,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAGnB,IAAA,MAAM,kBAAA,GAAqB,WAAA,CAAY,CAAC,SAAA,KAA0B;AAChE,MAAA,SAAA,CAAU,SAAS,CAAA;AACnB,MAAA,cAAA,GAAiB,SAAS,CAAA;AAAA,IAC5B,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAGnB,IAAAA,UAAU,MAAM;AACd,MAAA,sBAAA,CAAuB,OAAA,GAAU,UAAA;AAAA,IACnC,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAIf,IAAA,MAAM,KAAA,GAAQf,eAAAA,CAAM,OAAA,CAAQ,MAAM;AAChC,MAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,YAAA,CAAa,QAAQ,OAAO,YAAA;AAElD,MAAA,MAAM,KAAK,KAAA,GAAQ,CAAA;AACnB,MAAA,MAAM,KAAK,MAAA,GAAS,CAAA;AAGpB,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,OAAO,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,MAAY;AAAA,UACnC,GAAG,CAAA;AAAA,UACH,CAAA,EAAG,IAAA,CAAK,MAAA,EAAO,GAAI,KAAA;AAAA,UACnB,CAAA,EAAG,IAAA,CAAK,MAAA,EAAO,GAAI;AAAA,SACrB,CAAE,CAAA;AAAA,MACJ;AAGA,MAAA,IAAI,WAAW,UAAA,EAAY;AACzB,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA,GAAI,IAAA;AACzC,QAAA,OAAO,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,EAAQ,CAAA,MAAe;AAAA,UAC9C,GAAG,CAAA;AAAA,UACH,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,GAAA,CAAK,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA,GAAK,YAAA,CAAa,MAAM,CAAA,GAAI,MAAA;AAAA,UAC5D,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,GAAA,CAAK,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA,GAAK,YAAA,CAAa,MAAM,CAAA,GAAI;AAAA,SAC9D,CAAE,CAAA;AAAA,MACJ;AAGA,MAAA,IAAI,WAAW,cAAA,EAAgB;AAC7B,QAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,KAAK,IAAA,CAAK,YAAA,CAAa,MAAM,CAAC,CAAA;AACrD,QAAA,MAAM,QAAA,GAAW,SAAS,IAAA,GAAO,CAAA,CAAA;AACjC,QAAA,MAAM,WAAW,MAAA,IAAU,IAAA,CAAK,KAAK,YAAA,CAAa,MAAA,GAAS,IAAI,CAAA,GAAI,CAAA,CAAA;AACnE,QAAA,OAAO,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,EAAQ,CAAA,MAAe;AAAA,UAC9C,GAAG,CAAA;AAAA,UACH,CAAA,EAAG,QAAA,IAAa,CAAA,GAAI,IAAA,GAAQ,CAAA,CAAA;AAAA,UAC5B,GAAG,QAAA,IAAY,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAAA,SACxC,CAAE,CAAA;AAAA,MACJ;AAEA,MAAA,OAAO,YAAA;AAAA,IACT,GAAG,CAAC,YAAA,EAAc,KAAA,EAAO,MAAA,EAAQ,MAAM,CAAC,CAAA;AAGxC,IAAA,MAAM,KAAA,GAAQ,YAAA;AAGd,IAAA,MAAM,OAAA,GAAUA,eAAAA,CAAM,WAAA,CAAY,MAAM;AAAA,IAExC,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,IAAA,GAAOA,eAAAA,CAAM,WAAA,CAAY,MAAM;AAAA,IAErC,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,gBAAA,GAAmBA,eAAAA,CAAM,WAAA,CAAY,CAAC,QAAA,KAAsB;AAAA,IAElE,CAAA,EAAG,EAAE,CAAA;AAKL,IAAAe,UAAU,MAAM;AACd,MAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAElC,MAAA,MAAM,cAAc,MAAM;AACxB,QAAA,MAAM,KAAK,KAAA,GAAQ,CAAA;AACnB,QAAA,MAAM,KAAK,MAAA,GAAS,CAAA;AAEpB,QAAA,IAAI,WAAW,UAAA,EAAY;AAEzB,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA,GAAI,IAAA;AACzC,UAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAA,KAAM;AACzB,YAAA,MAAM,KAAA,GAAS,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,IAAK,KAAA,CAAM,MAAA;AACxC,YAAA,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,MAAA;AACjC,YAAA,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,MAAA;AAAA,UACnC,CAAC,CAAA;AAAA,QACH,CAAA,MAAA,IAAW,WAAW,cAAA,EAAgB;AAEpC,UAAA,MAAM,MAAA,uBAAa,GAAA,EAA0B;AAC7C,UAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,KAAW;AACxB,YAAA,MAAM,GAAA,GAAM,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAE,KAAA,IAAS,MAAA;AACzC,YAAA,IAAI,CAAC,OAAO,GAAA,CAAI,GAAG,GAAG,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,EAAE,CAAA;AACxC,YAAA,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,CAAG,IAAA,CAAK,CAAC,CAAA;AAAA,UACzB,CAAC,CAAA;AAED,UAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAC9C,UAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,KAAK,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA;AACnD,UAAA,MAAM,aAAA,GAAgB,QAAQ,GAAA,GAAM,IAAA;AACpC,UAAA,MAAM,gBAAgB,MAAA,GAAS,GAAA,GAAM,KAAK,IAAA,CAAK,UAAA,CAAW,SAAS,IAAI,CAAA;AAEvE,UAAA,UAAA,CAAW,QAAQ,CAAC,CAAC,QAAA,EAAU,UAAU,GAAG,EAAA,KAAO;AACjD,YAAA,MAAM,MAAM,EAAA,GAAK,IAAA;AACjB,YAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,IAAI,CAAA;AAChC,YAAA,MAAM,MAAA,GAAA,CAAU,MAAM,GAAA,IAAO,aAAA;AAC7B,YAAA,MAAM,MAAA,GAAA,CAAU,MAAM,GAAA,IAAO,aAAA;AAG7B,YAAA,IAAI,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,IAAK,aAAa,QAAA,EAAU;AACxD,cAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAA,EAAG,EAAA,KAAO;AAC5B,gBAAA,MAAM,KAAA,GAAS,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,KAAM,UAAA,CAAW,MAAA;AAC9C,gBAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,EAAA,GAAK,UAAA,CAAW,SAAS,CAAC,CAAA;AACjD,gBAAA,CAAA,CAAE,EAAA,GAAK,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,CAAA;AAClC,gBAAA,CAAA,CAAE,EAAA,GAAK,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,CAAA;AAAA,cACpC,CAAC,CAAA;AAAA,YACH;AAAA,UACF,CAAC,CAAA;AAAA,QACH;AAGA,QAAA,IAAI;AAAE,UAAA,OAAA,EAAQ;AAAA,QAAG,SAAS,CAAA,EAAG;AAAA,QAAe;AAAA,MAC9C,CAAA;AAEA,MAAA,WAAA,EAAY;AAAA,IACd,GAAG,CAAC,MAAA,EAAQ,OAAO,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAC,CAAA;AAG1C,IAAAA,UAAU,MAAM;AACd,MAAA,IAAI;AACF,QAAA,IAAI,YAAA,IAAgB,WAAA,CAAY,IAAA,GAAO,CAAA,mBAAoB,KAAK,CAAA;AAAA,8BAC1C,IAAI,CAAA;AAAA,MAC5B,SAAS,CAAA,EAAG;AAAA,MAEZ;AAAA,IACF,CAAA,EAAG,CAAC,YAAA,EAAc,WAAA,EAAa,gBAAgB,CAAC,CAAA;AAGhD,IAAA,mBAAA;AAAA,MACE,GAAA;AAAA,MACA,OAAO;AAAA,QACL,QAAQ,MAAM;AACZ,UAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,UAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,YAAA,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA;AACf,YAAA,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA;AACf,YAAA,SAAA,CAAU,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,UACvB,CAAC,CAAA;AACD,UAAA,cAAA,CAAe,SAAS,CAAA;AACxB,UAAA,OAAA,EAAQ;AAAA,QACV,CAAA;AAAA,QAEA,UAAU,MAAM;AACd,UAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,YAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,YAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,UACZ,CAAC,CAAA;AACD,UAAA,cAAA,iBAAe,IAAI,KAAK,CAAA;AACxB,UAAA,OAAA,EAAQ;AAAA,QACV,CAAA;AAAA,QAEA,aAAa,MAAM;AACjB,UAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,YAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,YAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,UACZ,CAAC,CAAA;AACD,UAAA,cAAA,iBAAe,IAAI,KAAK,CAAA;AACxB,UAAA,OAAA,EAAQ;AAAA,QACV,CAAA;AAAA,QAEA,SAAS,MAAM;AACb,UAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,MAAM,MAAA,EAAQ;AAGtC,UAAA,IAAI,OAAO,QAAA,EAAU,IAAA,GAAO,CAAA,QAAA,EAAW,IAAA,GAAO,UAAU,IAAA,GAAO,CAAA,QAAA;AAC/D,UAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,YAAA,IAAI,IAAA,CAAK,CAAA,KAAM,MAAA,IAAa,IAAA,CAAK,MAAM,MAAA,EAAW;AAChD,cAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,EAAA;AAC1B,cAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,IAAI,IAAI,CAAA;AACnC,cAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,IAAI,IAAI,CAAA;AACnC,cAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,IAAI,IAAI,CAAA;AACnC,cAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,YACrC;AAAA,UACF,CAAC,CAAA;AAED,UAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,EAAG;AAErB,UAAA,MAAM,OAAA,GAAU,EAAA;AAChB,UAAA,MAAM,YAAY,IAAA,GAAO,IAAA;AACzB,UAAA,MAAM,aAAa,IAAA,GAAO,IAAA;AAC1B,UAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AAAA,YAAA,CAChB,KAAA,GAAQ,UAAU,CAAA,IAAK,SAAA;AAAA,YAAA,CACvB,MAAA,GAAS,UAAU,CAAA,IAAK,UAAA;AAAA,YACzB;AAAA,WACF;AAEA,UAAA,MAAM,OAAA,GAAA,CAAW,OAAO,IAAA,IAAQ,CAAA;AAChC,UAAA,MAAM,OAAA,GAAA,CAAW,OAAO,IAAA,IAAQ,CAAA;AAEhC,UAAA,MAAM,CAAA,GAAI,KAAA,GAAQ,CAAA,GAAI,OAAA,GAAU,KAAA;AAChC,UAAA,MAAM,CAAA,GAAI,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,KAAA;AAEjC,UAAA,IAAI,IAAA,CAAK,OAAA,IAAW,MAAA,CAAO,OAAA,EAAS;AAClC,YAAA,MAAM,GAAA,GAAS,GAAA,CAAA,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AACpC,YAAA,MAAM,eAAkB,GAAA,CAAA,YAAA,CAAa,SAAA,CAAU,GAAG,CAAC,CAAA,CAAE,MAAM,KAAK,CAAA;AAChE,YAAA,GAAA,CAAI,UAAA,GAAa,QAAA,CAAS,GAAG,EAAE,IAAA,CAAQ,GAAA,CAAA,IAAA,EAA6B,CAAE,SAAA,EAAkB,YAAY,CAAA;AACpG,YAAA,YAAA,CAAa,YAAY,CAAA;AAAA,UAC3B;AAAA,QACF,CAAA;AAAA,QAEA,cAAA,EAAgB,MAAM,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA;AAAA,QAE5C,WAAA,EAAa,CAAC,OAAA,KAAqB;AACjC,UAAA,sBAAA,CAAuB,OAAA,GAAU,OAAA;AAAA,QACnC,CAAA;AAAA,QAEA,SAAA,EAAW,CAAC,SAAA,KAA0B;AACpC,UAAA,kBAAA,CAAmB,SAAS,CAAA;AAAA,QAC9B,CAAA;AAAA,QAEA,WAAW,MAAM;AAAA,OACnB,CAAA;AAAA,MACA,CAAC,KAAA,EAAO,WAAA,EAAa,SAAS,KAAA,EAAO,MAAA,EAAQ,QAAQ,kBAAkB;AAAA,KACzE;AAGA,IAAAA,UAAU,MAAM;AACd,MAAA,IAAI;AACF,QAAA,IAAI,OAAO,oBAAA,KAAyB,UAAA,EAAY,oBAAA,CAAqB,YAAY,CAAA;AAAA,MACnF,SAAS,CAAA,EAAG;AAAA,MAEZ;AAAA,IACF,CAAA,EAAG,CAAC,YAAA,EAAc,oBAAoB,CAAC,CAAA;AAGvC,IAAAA,UAAU,MAAM;AACd,MAAA,IAAI,CAAC,UAAA,IAAc,CAAC,OAAO,OAAA,IAAW,CAAC,KAAK,OAAA,EAAS;AAErD,MAAA,MAAM,GAAA,GAAS,GAAA,CAAA,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AACpC,MAAA,MAAM,CAAA,GAAO,GAAA,CAAA,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAEhC,MAAA,MAAMO,KAAAA,GACH,GAAA,CAAA,IAAA,EAA6B,CAC7B,WAAA,CAAY,CAAC,GAAA,EAAK,EAAE,CAAC,CAAA,CACrB,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAU;AACrB,QAAA,CAAA,CAAE,IAAA,CAAK,WAAA,EAAa,KAAA,CAAM,SAAS,CAAA;AACnC,QAAA,YAAA,CAAa,UAAU,KAAA,CAAM,SAAA;AAC7B,QAAA,YAAA,CAAa,MAAM,SAAS,CAAA;AAAA,MAC9B,CAAC,CAAA;AAEH,MAAA,GAAA,CAAI,KAAKA,KAAI,CAAA;AAEb,MAAA,OAAO,MAAM;AACX,QAAA,GAAA,CAAI,EAAA,CAAG,SAAS,IAAI,CAAA;AAAA,MACtB,CAAA;AAAA,IACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAIf,IAAAP,UAAU,MAAM;AACd,MAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,CAAA,GAAO,GAAA,CAAA,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAChC,QAAA,CAAA,CAAE,SAAA,CAA4B,QAAQ,CAAA,CAAE,IAAA,CAAK,WAA6B;AACxE,UAAA,MAAM,KAAA,GAAW,GAAA,CAAA,MAAA,CAAO,IAAI,CAAA,CAAE,KAAA,EAAM;AACpC,UAAA,IAAI,CAAC,KAAA,EAAO;AACZ,UAAG,GAAA,CAAA,MAAA,CAAO,IAAI,CAAA,CAAE,IAAA,CAAK,WAAA,EAAa,CAAA,UAAA,EAAa,KAAA,CAAM,CAAA,IAAK,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAA,IAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,QAChF,CAAC,CAAA;AAED,QAAA,CAAA,CAAE,SAAA,CAA+B,MAAM,CAAA,CAAE,IAAA,CAAK,WAAgC;AAC5E,UAAA,MAAM,CAAA,GAAO,GAAA,CAAA,MAAA,CAAO,IAAI,CAAA,CAAE,KAAA,EAAM;AAChC,UAAA,IAAI,CAAC,CAAA,EAAG;AACR,UAAA,MAAM,IAAS,OAAO,CAAA,CAAE,MAAA,KAAW,QAAA,GAAW,EAAE,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,CAAA,CAAE,MAAM,KAAK,CAAA,CAAE,MAAA;AACnG,UAAA,MAAM,IAAS,OAAO,CAAA,CAAE,MAAA,KAAW,QAAA,GAAW,EAAE,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,CAAA,CAAE,MAAM,KAAK,CAAA,CAAE,MAAA;AACnG,UAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,EAAG;AACd,UAAG,GAAA,CAAA,MAAA,CAAO,IAAI,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,CAAE,CAAC,EAAE,IAAA,CAAK,IAAA,EAAM,EAAE,CAAC,CAAA,CAAE,KAAK,IAAA,EAAM,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,CAAK,IAAA,EAAM,CAAA,CAAE,CAAC,CAAA;AAAA,QAChF,CAAC,CAAA;AAAA,MACH,SAAS,CAAA,EAAG;AAAA,MAEZ;AAAA,IACF,CAAA,EAAG,CAAC,KAAA,EAAO,KAAK,CAAC,CAAA;AAGjB,IAAA,MAAM,eAAA,GAAkB,WAAA;AAAA,MACtB,CAAC,OAAyB,IAAA,KAAoB;AAC5C,QAAA,IAAI,CAAC,UAAA,EAAY;AACjB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,KAAA,CAAM,eAAA,EAAgB;AAEtB,QAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AACxB,QAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,QAAA,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA;AACf,QAAA,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA;AACf,QAAA,cAAA,CAAe,CAAC,IAAA,qBAAS,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,EAAM,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AACpD,QAAA,IAAI;AAAE,UAAA,IAAA,EAAK;AAAA,QAAG,SAAS,CAAA,EAAG;AAAA,QAAC;AAAA,MAC7B,CAAA;AAAA,MACA,CAAC,YAAY,OAAO;AAAA,KACtB;AAEA,IAAAA,UAAU,MAAM;AACd,MAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,MAAA,MAAM,gBAAA,GAAmB,CAAC,KAAA,KAAsB;AAC9C,QAAA,IAAI,CAAC,aAAA,CAAc,OAAA,IAAW,CAAC,YAAY,OAAA,EAAS;AACpD,QAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,QAAA,IAAI,CAAC,GAAA,EAAK;AACV,QAAA,MAAM,IAAA,GAAO,IAAI,qBAAA,EAAsB;AACvC,QAAA,MAAM,IAAS,YAAA,CAAa,OAAA;AAC5B,QAAA,MAAM,KAAK,KAAA,CAAM,OAAA,GAAU,KAAK,IAAA,GAAO,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAChD,QAAA,MAAM,KAAK,KAAA,CAAM,OAAA,GAAU,KAAK,GAAA,GAAM,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAC/C,QAAA,WAAA,CAAY,QAAQ,EAAA,GAAK,CAAA;AACzB,QAAA,WAAA,CAAY,QAAQ,EAAA,GAAK,CAAA;AAAA,MAC3B,CAAA;AAEA,MAAA,MAAM,iBAAiB,MAAM;AAC3B,QAAA,IAAI,CAAC,cAAc,OAAA,EAAS;AAE5B,QAAA,IAAI;AAAE,UAAA,gBAAA,CAAiB,IAAI,CAAA;AAAG,UAAA,OAAA,EAAQ;AAAA,QAAG,SAAS,CAAA,EAAG;AAAA,QAAC;AACtD,QAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,QAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AAAA,MAC1B,CAAA;AAEA,MAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAAsB;AAC/C,QAAA,IAAI,KAAA,CAAM,aAAA,KAAkB,IAAA,EAAM,cAAA,EAAe;AAAA,MACnD,CAAA;AAEA,MAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,gBAAgB,CAAA;AACrD,MAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,cAAc,CAAA;AACjD,MAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,iBAAiB,CAAA;AACrD,MAAA,MAAA,CAAO,gBAAA,CAAiB,QAAQ,cAAc,CAAA;AAE9C,MAAA,OAAO,MAAM;AACX,QAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,gBAAgB,CAAA;AACxD,QAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,cAAc,CAAA;AACpD,QAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,iBAAiB,CAAA;AACxD,QAAA,MAAA,CAAO,mBAAA,CAAoB,QAAQ,cAAc,CAAA;AAAA,MACnD,CAAA;AAAA,IACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAIf,IAAAA,UAAU,MAAM;AACd,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,UAAA,EAAY;AAClC,MAAA,MAAM,CAAA,GAAO,GAAA,CAAA,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAChC,MAAA,MAAM,eACH,GAAA,CAAA,IAAA,EAA2B,CAC3B,EAAA,CAAG,OAAA,EAAS,SAAU,KAAA,EAAO;AAC5B,QAAA,IAAI;AACF,UAAA,MAAM,SAAU,KAAA,CAAM,WAAA,IAAgB,KAAA,CAAM,WAAA,CAAY,UAAwB,KAAA,CAAM,MAAA;AACtF,UAAA,MAAM,GAAA,GAAM,MAAA,CAAO,OAAA,GAAU,QAAQ,CAAA;AACrC,UAAA,MAAM,EAAA,GAAK,GAAA,EAAK,YAAA,CAAa,SAAS,CAAA;AACtC,UAAA,IAAI,CAAC,EAAA,EAAI;AACT,UAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC1C,UAAA,IAAI,CAAC,IAAA,EAAM;AACX,UAAA,IAAI,CAAC,uBAAuB,OAAA,EAAS;AACrC,UAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAA,EAAQ;AAC3B,UAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AACxB,UAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,UAAA,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA;AACf,UAAA,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA;AACf,UAAA,cAAA,CAAe,CAAC,IAAA,qBAAS,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,EAAM,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AAAA,QACtD,SAAS,CAAA,EAAG;AAAA,QAEZ;AAAA,MACF,CAAC,CAAA,CACA,EAAA,CAAG,MAAA,EAAQ,SAAU,KAAA,EAAO;AAC3B,QAAA,IAAI,CAAC,aAAA,CAAc,OAAA,IAAW,CAAC,YAAY,OAAA,EAAS;AACpD,QAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,QAAA,IAAI,CAAC,GAAA,EAAK;AACV,QAAA,MAAM,IAAA,GAAO,IAAI,qBAAA,EAAsB;AACvC,QAAA,MAAM,CAAA,GAAA,CAAK,MAAM,WAAA,CAAY,OAAA,GAAU,KAAK,IAAA,GAAO,SAAA,CAAU,KAAK,SAAA,CAAU,CAAA;AAC5E,QAAA,MAAM,CAAA,GAAA,CAAK,MAAM,WAAA,CAAY,OAAA,GAAU,KAAK,GAAA,GAAM,SAAA,CAAU,KAAK,SAAA,CAAU,CAAA;AAC3E,QAAA,WAAA,CAAY,QAAQ,EAAA,GAAK,CAAA;AACzB,QAAA,WAAA,CAAY,QAAQ,EAAA,GAAK,CAAA;AAAA,MAC3B,CAAC,CAAA,CACA,EAAA,CAAG,KAAA,EAAO,WAAY;AAErB,QAAA,IAAI;AAAE,UAAA,gBAAA,CAAiB,IAAI,CAAA;AAAG,UAAA,OAAA,EAAQ;AAAA,QAAG,SAAS,CAAA,EAAG;AAAA,QAAC;AACtD,QAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,QAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AAAA,MAC1B,CAAC,CAAA;AAEH,MAAA,IAAI;AACF,QAAA,CAAA,CAAE,SAAA,CAAU,QAAQ,CAAA,CAAE,IAAA,CAAK,YAAmB,CAAA;AAAA,MAChD,SAAS,CAAA,EAAG;AAAA,MAEZ;AAEA,MAAA,OAAO,MAAM;AACX,QAAA,IAAI;AACF,UAAA,CAAA,CAAE,SAAA,CAAU,QAAQ,CAAA,CAAE,EAAA,CAAG,SAAS,IAAW,CAAA;AAAA,QAC/C,SAAS,CAAA,EAAG;AAAA,QAEZ;AAAA,MACF,CAAA;AAAA,IACF,GAAG,CAAC,IAAA,EAAM,YAAY,KAAA,EAAO,SAAA,EAAW,OAAO,CAAC,CAAA;AAEhD,IAAA,MAAM,eAAA,GAAkB,WAAA;AAAA,MACtB,CAAC,IAAA,KAAoB;AACnB,QAAA,WAAA,GAAc,IAAI,CAAA;AAAA,MACpB,CAAA;AAAA,MACA,CAAC,WAAW;AAAA,KACd;AAEA,IAAA,MAAM,qBAAA,GAAwB,WAAA;AAAA,MAC5B,CAAC,OAAyB,IAAA,KAAoB;AAC5C,QAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,QAAA,IAAI,CAAC,UAAA,EAAY;AACjB,QAAA,IAAI,IAAA,CAAK,EAAA,KAAO,IAAA,IAAQ,IAAA,CAAK,OAAO,MAAA,EAAW;AAC7C,UAAA,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA;AACf,UAAA,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA;AACf,UAAA,cAAA,CAAe,CAAC,IAAA,qBAAS,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,EAAM,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AAAA,QACtD,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,UAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,UAAA,cAAA,CAAe,CAAC,IAAA,KAAS;AACvB,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,YAAA,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,CAAA;AACnB,YAAA,OAAO,IAAA;AAAA,UACT,CAAC,CAAA;AAAA,QACH;AACA,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA;AAAA,MACA,CAAC,YAAY,OAAO;AAAA,KACtB;AAEA,IAAA,MAAM,uBAAA,GAA0B,YAAY,MAAM;AAChD,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,QAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,QAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,MACZ,CAAC,CAAA;AACD,MAAA,cAAA,iBAAe,IAAI,KAAK,CAAA;AACxB,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA,EAAG,CAAC,KAAA,EAAO,OAAO,CAAC,CAAA;AAEnB,IAAA,MAAM,oBAAA,GAAuB,WAAA;AAAA,MAC3B,CAAC,IAAA,KAAoB;AACnB,QAAA,WAAA,GAAc,IAAI,CAAA;AAAA,MACpB,CAAA;AAAA,MACA,CAAC,WAAW;AAAA,KACd;AAEA,IAAA,MAAM,oBAAA,GAAuB,YAAY,MAAM;AAC7C,MAAA,WAAA,GAAc,IAAI,CAAA;AAAA,IACpB,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,IAAA,MAAM,eAAA,GAAkB,WAAA;AAAA,MACtB,CAAC,IAAA,KAAoB;AACnB,QAAA,WAAA,GAAc,IAAI,CAAA;AAAA,MACpB,CAAA;AAAA,MACA,CAAC,WAAW;AAAA,KACd;AAEA,IAAA,uBACEJ,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,MAAA;AAAA,QACL,KAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,2BAAA,EAA6B,SAAS,CAAA;AAAA,QACpD,aAAA,EAAe,uBAAA;AAAA,QAEf,QAAA,EAAA;AAAA,0BAAAV,GAAAA,CAAC,UAEC,QAAA,kBAAAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAG,OAAA;AAAA,cACH,OAAA,EAAQ,WAAA;AAAA,cACR,IAAA,EAAK,IAAA;AAAA,cACL,IAAA,EAAK,GAAA;AAAA,cACL,WAAA,EAAY,GAAA;AAAA,cACZ,YAAA,EAAa,GAAA;AAAA,cACb,MAAA,EAAO,MAAA;AAAA,cAEP,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uBAAA,EAAwB,MAAM,gBAAA,EAAkB;AAAA;AAAA,WAC1D,EACF,CAAA;AAAA,0BAEAU,IAAAA,CAAC,GAAA,EAAA,EAAE,GAAA,EAAK,IAAA,EAGL,QAAA,EAAA;AAAA,YAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBAChBV,GAAAA;AAAA,cAAC,gBAAA;AAAA,cAAA;AAAA,gBAEC,IAAA;AAAA,gBACA,OAAA,EAAS,eAAA;AAAA,gBACT,YAAA,EAAc,gBAAA;AAAA,gBACd,SAAA,EAAW,cAAA;AAAA,gBACX;AAAA,eAAA;AAAA,cALK,QAAQ,CAAC,CAAA;AAAA,aAOjB,CAAA;AAAA,YAGA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVA,GAAAA;AAAA,cAAC,gBAAA;AAAA,cAAA;AAAA,gBAEC,IAAA;AAAA,gBACA,UAAA,EAAY,mBAAmB,IAAA,CAAK,EAAA;AAAA,gBACpC,SAAA,EAAW,kBAAkB,IAAA,CAAK,EAAA;AAAA,gBAClC,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAAA,gBAC/B,eAAA;AAAA,gBACA,gBAAA;AAAA,gBACA,SAAA,EAAW,cAAA;AAAA,gBACX,OAAA,EAAS,eAAA;AAAA,gBACT,aAAA,EAAe,qBAAA;AAAA,gBACf,YAAA,EAAc,oBAAA;AAAA,gBACd,YAAA,EAAc,oBAAA;AAAA,gBACd,WAAA,EAAa;AAAA,eAAA;AAAA,cAZR,IAAA,CAAK;AAAA,aAcb,CAAA;AAAA,YAEA,aAAA,IAAiB,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,CAAE,MAAA,GAAS,CAAA,oBACpDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oBAAA,EAAqB,aAAA,EAAc,QAC7C,QAAA,EAAA,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,CAAC,CAAA,qBACzCU,IAAAA,CAAC,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAAV,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAI,CAAA,CAAE,CAAA;AAAA,kBACN,IAAI,CAAA,CAAE,CAAA;AAAA,kBACN,GAAG,CAAA,CAAE,CAAA;AAAA,kBACL,IAAA,EAAK,wBAAA;AAAA,kBACL,MAAA,EAAO,SAAA;AAAA,kBACP,WAAA,EAAa,CAAA;AAAA,kBACb,eAAA,EAAgB,KAAA;AAAA,kBAChB,OAAA,EAAS;AAAA;AAAA,eACX;AAAA,8BACAA,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,GAAG,CAAA,CAAE,CAAA;AAAA,kBACL,CAAA,EAAG,KAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAI,CAAA,CAAE,IAAI,EAAE,CAAA;AAAA,kBAC9B,IAAA,EAAK,SAAA;AAAA,kBACL,QAAA,EAAU,EAAA;AAAA,kBACV,UAAA,EAAW,QAAA;AAAA,kBACX,aAAA,EAAc,MAAA;AAAA,kBAEb,QAAA,EAAA,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS,EAAE;AAAA;AAAA;AAC1B,aAAA,EAAA,EApBM,GAqBR,CACD,CAAA,EACH;AAAA,WAAA,EAEJ;AAAA;AAAA;AAAA,KACF;AAAA,EAEF;AACF;AAEA,kBAAA,CAAmB,WAAA,GAAc,oBAAA;ACpkB1B,IAAM,gBAA8C,CAAC;AAAA,EAC1D,WAAA,GAAc,IAAA;AAAA,EACd,YAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf,oBAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA,GAAc,CAAA;AAAA,EACd,UAAA,GAAa,CAAA;AAAA,EACb,OAAA,GAAU,IAAA;AAAA,EACV,QAAA,GAAW,UAAA;AAAA,EACX;AACF,CAAA,KAAM;AAEJ,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,MAAM,eAAA,GAA0C;AAAA,IAC9C,UAAA,EAAY,cAAA;AAAA,IACZ,WAAA,EAAa,eAAA;AAAA,IACb,aAAA,EAAe,iBAAA;AAAA,IACf,cAAA,EAAgB;AAAA,GAClB;AAEA,EAAA,MAAM,aAAA,GAMD,CAAC,EAAE,OAAA,EAAS,SAAS,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,QAAA,GAAW,OAAM,qBAC7DU,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gBAAA,EACb,QAAA,EAAA;AAAA,oBAAAV,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,4CAAA;AAAA,UACA,SACI,oDAAA,GACA,6CAAA;AAAA,UACJ,QAAA,IAAY,iDAAA;AAAA,UACZ;AAAA,SACF;AAAA,QACA,KAAA,EAAO,KAAA;AAAA,QAEP,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAW,QAAA,EAAA,IAAA,EAAK;AAAA;AAAA,KAClC;AAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yLACZ,QAAA,EAAA,KAAA,EACH;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,uBACEU,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,2GAAA;AAAA,QACA,gBAAgB,QAAQ,CAAA;AAAA,QACxB;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAEb,QAAA,EAAA;AAAA,0BAAAV,GAAAA;AAAA,YAAC,aAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,YAAA,GAAe,CAAC,WAAW,CAAA;AAAA,cAC1C,MAAA,EAAQ,WAAA;AAAA,cACR,IAAA,EAAK,QAAA;AAAA,cACL,KAAA,EAAO,cAAc,cAAA,GAAiB;AAAA;AAAA,WACxC;AAAA,0BAGAA,GAAAA;AAAA,YAAC,aAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,oBAAA,GAAuB,CAAC,YAAY,CAAA;AAAA,cACnD,MAAA,EAAQ,YAAA;AAAA,cACR,IAAA,EAAK,WAAA;AAAA,cACL,KAAA,EAAO,eAAe,iCAAA,GAAoC;AAAA;AAAA,WAC5D;AAAA,0BAGAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EAAqD,CAAA;AAAA,0BAGpEU,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,4BAAAV,GAAAA;AAAA,cAAC,aAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,QAAA,IAAW;AAAA,gBAC1B,UAAU,UAAA,KAAe,CAAA;AAAA,gBACzB,IAAA,EAAK,WAAA;AAAA,gBACL,KAAA,EAAO,kBAAkB,UAAU,CAAA,CAAA;AAAA;AAAA,aACrC;AAAA,4BACAA,GAAAA;AAAA,cAAC,aAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,UAAA,IAAa;AAAA,gBAC5B,UAAU,WAAA,KAAgB,CAAA;AAAA,gBAC1B,IAAA,EAAK,WAAA;AAAA,gBACL,KAAA,EAAO,cAAc,WAAW,CAAA,QAAA;AAAA;AAAA;AAClC,WAAA,EACF,CAAA;AAAA,0BAGAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EAAqD,CAAA;AAAA,0BAGpEA,GAAAA;AAAA,YAAC,aAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,SAAA,IAAY;AAAA,cAC3B,UAAU,UAAA,KAAe,CAAA;AAAA,cACzB,IAAA,EAAK,WAAA;AAAA,cACL,KAAA,EAAM;AAAA;AAAA,WACR;AAAA,0BAEAA,GAAAA;AAAA,YAAC,aAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,OAAA,IAAU;AAAA,cACzB,UAAU,UAAA,KAAe,CAAA;AAAA,cACzB,IAAA,EAAK,QAAA;AAAA,cACL,KAAA,EAAM;AAAA;AAAA;AACR,SAAA,EACF,CAAA;AAAA,wBAGAU,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kGAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,EAAA;AAAA,4BAAAV,GAAAA,CAAC,YAAO,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,YAAS,GAAA;AAAA,YAAE;AAAA,WAAA,EAC3B,CAAA;AAAA,UACC,cAAc,CAAA,oBACbU,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mBAAA,EACb,QAAA,EAAA;AAAA,4BAAAV,GAAAA,CAAC,YAAO,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,YAAS,GAAA;AAAA,YAAE;AAAA,WAAA,EAC5B,CAAA;AAAA,0BAEFU,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EACb,QAAA,EAAA;AAAA,4BAAAV,GAAAA,CAAC,YAAO,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,4BACbU,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EACZ,QAAA,EAAA;AAAA,8BAAAV,GAAAA,CAAC,QAAG,QAAA,EAAA,iCAAA,EAA0B,CAAA;AAAA,8BAC9BA,GAAAA,CAAC,IAAA,EAAA,EAAG,QAAA,EAAA,kCAAA,EAA2B,CAAA;AAAA,8BAC/BA,GAAAA,CAAC,IAAA,EAAA,EAAG,QAAA,EAAA,yCAAA,EAAkC,CAAA;AAAA,8BACtCA,GAAAA,CAAC,IAAA,EAAA,EAAG,QAAA,EAAA,uBAAA,EAAgB;AAAA,aAAA,EACtB;AAAA,WAAA,EACF;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,aAAA,CAAc,WAAA,GAAc,eAAA","file":"index.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Merges class names using clsx and tailwind-merge\n * @param inputs - Class values to merge\n * @returns Merged class names\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../utils/cn';\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n destructive:\n 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n outline:\n 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',\n secondary:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-10 px-4 py-2',\n sm: 'h-9 rounded-md px-3',\n lg: 'h-11 rounded-md px-8',\n icon: 'h-10 w-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, ...props }, ref) => {\n return (\n <button\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n }\n);\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'rounded-lg border bg-card text-card-foreground shadow-sm',\n className\n )}\n {...props}\n />\n));\nCard.displayName = 'Card';\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex flex-col space-y-1.5 p-6', className)}\n {...props}\n />\n));\nCardHeader.displayName = 'CardHeader';\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n 'text-2xl font-semibold leading-none tracking-tight',\n className\n )}\n {...props}\n />\n));\nCardTitle.displayName = 'CardTitle';\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n));\nCardDescription.displayName = 'CardDescription';\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />\n));\nCardContent.displayName = 'CardContent';\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex items-center p-6 pt-0', className)}\n {...props}\n />\n));\nCardFooter.displayName = 'CardFooter';\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n 'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\nInput.displayName = 'Input';\n\nexport { Input };","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../utils/cn';\n\nconst labelVariants = cva(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70'\n);\n\nexport interface LabelProps\n extends React.LabelHTMLAttributes<HTMLLabelElement>,\n VariantProps<typeof labelVariants> {}\n\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({ className, ...props }, ref) => (\n <label\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n )\n);\nLabel.displayName = 'Label';\n\nexport { Label };","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../utils/cn';\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n default:\n 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\n secondary:\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\n destructive:\n 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80',\n outline: 'text-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n );\n}\n\nexport { Badge, badgeVariants };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n}\n\nconst Container = React.forwardRef<HTMLDivElement, ContainerProps>(\n ({ className, size = 'lg', ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'mx-auto w-full px-4 sm:px-6 lg:px-8',\n {\n 'max-w-screen-sm': size === 'sm',\n 'max-w-screen-md': size === 'md',\n 'max-w-screen-lg': size === 'lg',\n 'max-w-screen-xl': size === 'xl',\n 'max-w-full': size === 'full',\n },\n className\n )}\n {...props}\n />\n );\n }\n);\nContainer.displayName = 'Container';\n\nexport { Container };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface GridProps extends React.HTMLAttributes<HTMLDivElement> {\n cols?: 1 | 2 | 3 | 4 | 5 | 6 | 12;\n gap?: 'sm' | 'md' | 'lg' | 'xl';\n}\n\nconst Grid = React.forwardRef<HTMLDivElement, GridProps>(\n ({ className, cols = 3, gap = 'md', ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'grid',\n {\n 'grid-cols-1': cols === 1,\n 'grid-cols-1 sm:grid-cols-2': cols === 2,\n 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3': cols === 3,\n 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4': cols === 4,\n 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-5': cols === 5,\n 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-6': cols === 6,\n 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-12': cols === 12,\n },\n {\n 'gap-2': gap === 'sm',\n 'gap-4': gap === 'md',\n 'gap-6': gap === 'lg',\n 'gap-8': gap === 'xl',\n },\n className\n )}\n {...props}\n />\n );\n }\n);\nGrid.displayName = 'Grid';\n\nexport { Grid };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface StackProps extends React.HTMLAttributes<HTMLDivElement> {\n direction?: 'horizontal' | 'vertical';\n spacing?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n align?: 'start' | 'center' | 'end' | 'stretch';\n justify?: 'start' | 'center' | 'end' | 'between' | 'around';\n}\n\nconst Stack = React.forwardRef<HTMLDivElement, StackProps>(\n (\n {\n className,\n direction = 'vertical',\n spacing = 'md',\n align = 'stretch',\n justify = 'start',\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'flex',\n {\n 'flex-col': direction === 'vertical',\n 'flex-row': direction === 'horizontal',\n },\n {\n 'gap-1': spacing === 'xs',\n 'gap-2': spacing === 'sm',\n 'gap-4': spacing === 'md',\n 'gap-6': spacing === 'lg',\n 'gap-8': spacing === 'xl',\n },\n {\n 'items-start': align === 'start',\n 'items-center': align === 'center',\n 'items-end': align === 'end',\n 'items-stretch': align === 'stretch',\n },\n {\n 'justify-start': justify === 'start',\n 'justify-center': justify === 'center',\n 'justify-end': justify === 'end',\n 'justify-between': justify === 'between',\n 'justify-around': justify === 'around',\n },\n className\n )}\n {...props}\n />\n );\n }\n);\nStack.displayName = 'Stack';\n\nexport { Stack };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: 'horizontal' | 'vertical';\n decorative?: boolean;\n}\n\nconst Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(\n (\n { className, orientation = 'horizontal', decorative = true, ...props },\n ref\n ) => (\n <div\n ref={ref}\n role={decorative ? 'none' : 'separator'}\n aria-orientation={orientation}\n className={cn(\n 'shrink-0 bg-border',\n orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]',\n className\n )}\n {...props}\n />\n )\n);\nSeparator.displayName = 'Separator';\n\nexport { Separator };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface CheckboxProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n label?: string;\n}\n\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ className, label, id, ...props }, ref) => {\n const checkboxId = id || React.useId();\n \n return (\n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id={checkboxId}\n ref={ref}\n className={cn(\n 'h-4 w-4 rounded border-gray-300 text-primary focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n {...props}\n />\n {label && (\n <label\n htmlFor={checkboxId}\n className=\"ml-2 text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n </label>\n )}\n </div>\n );\n }\n);\nCheckbox.displayName = 'Checkbox';\n\nexport { Checkbox };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface RadioOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface RadioGroupProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n options: RadioOption[];\n value?: string;\n onChange?: (value: string) => void;\n name: string;\n orientation?: 'horizontal' | 'vertical';\n}\n\nconst RadioGroup = React.forwardRef<HTMLDivElement, RadioGroupProps>(\n (\n {\n className,\n options,\n value,\n onChange,\n name,\n orientation = 'vertical',\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'flex',\n orientation === 'vertical' ? 'flex-col gap-2' : 'flex-row gap-4',\n className\n )}\n {...props}\n >\n {options.map((option) => {\n const id = `${name}-${option.value}`;\n return (\n <div key={option.value} className=\"flex items-center\">\n <input\n type=\"radio\"\n id={id}\n name={name}\n value={option.value}\n checked={value === option.value}\n disabled={option.disabled}\n onChange={(e) => onChange?.(e.target.value)}\n className=\"h-4 w-4 border-gray-300 text-primary focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n />\n <label\n htmlFor={id}\n className=\"ml-2 text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {option.label}\n </label>\n </div>\n );\n })}\n </div>\n );\n }\n);\nRadioGroup.displayName = 'RadioGroup';\n\nexport { RadioGroup };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface SwitchProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n label?: string;\n onCheckedChange?: (checked: boolean) => void;\n}\n\nconst Switch = React.forwardRef<HTMLInputElement, SwitchProps>(\n ({ className, label, id, checked, onCheckedChange, onChange, ...props }, ref) => {\n const switchId = id || React.useId();\n \n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e);\n onCheckedChange?.(e.target.checked);\n };\n \n return (\n <div className=\"flex items-center\">\n <label htmlFor={switchId} className=\"relative inline-flex cursor-pointer items-center\">\n <input\n type=\"checkbox\"\n id={switchId}\n ref={ref}\n checked={checked}\n onChange={handleChange}\n className=\"peer sr-only\"\n {...props}\n />\n <div\n className={cn(\n 'peer h-6 w-11 rounded-full bg-gray-200 after:absolute after:left-[2px] after:top-[2px] after:h-5 after:w-5 after:rounded-full after:border after:border-gray-300 after:bg-white after:transition-all after:content-[\"\"] peer-checked:bg-primary peer-checked:after:translate-x-full peer-checked:after:border-white peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-ring peer-focus:ring-offset-2 peer-disabled:cursor-not-allowed peer-disabled:opacity-50',\n className\n )}\n />\n </label>\n {label && (\n <span className=\"ml-3 text-sm font-medium text-foreground\">\n {label}\n </span>\n )}\n </div>\n );\n }\n);\nSwitch.displayName = 'Switch';\n\nexport { Switch };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface TextareaProps\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n 'flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\nTextarea.displayName = 'Textarea';\n\nexport { Textarea };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface SelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps\n extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, 'onChange'> {\n options: SelectOption[];\n placeholder?: string;\n onChange?: (value: string) => void;\n}\n\nconst Select = React.forwardRef<HTMLSelectElement, SelectProps>(\n ({ className, options, placeholder, onChange, ...props }, ref) => {\n const handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n onChange?.(e.target.value);\n };\n\n return (\n <select\n ref={ref}\n className={cn(\n 'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n onChange={handleChange}\n {...props}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((option) => (\n <option\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n >\n {option.label}\n </option>\n ))}\n </select>\n );\n }\n);\nSelect.displayName = 'Select';\n\nexport { Select };","/**\n * Color utilities for charts and visualizations\n */\n\n// Severity colors for issue highlighting\nexport const severityColors = {\n critical: '#ef4444', // red-500\n major: '#f59e0b', // amber-500\n minor: '#eab308', // yellow-500\n info: '#60a5fa', // blue-400\n} as const;\n\n// Domain colors for clustering and categorization\nexport const domainColors = [\n '#3b82f6', // blue-500\n '#8b5cf6', // violet-500\n '#ec4899', // pink-500\n '#10b981', // green-500\n '#f59e0b', // amber-500\n '#06b6d4', // cyan-500\n '#f97316', // orange-500\n '#a855f7', // purple-500\n] as const;\n\n// Chart colors\nexport const chartColors = {\n primary: '#3b82f6',\n success: '#10b981',\n warning: '#f59e0b',\n danger: '#ef4444',\n info: '#06b6d4',\n} as const;\n\n/**\n * Get a color for a domain/category by index\n */\nexport function getDomainColor(index: number): string {\n return domainColors[index % domainColors.length];\n}\n\n/**\n * Get severity color by level\n */\nexport function getSeverityColor(\n severity: keyof typeof severityColors\n): string {\n return severityColors[severity];\n}\n\n/**\n * Convert hex color to RGBA\n */\nexport function hexToRgba(hex: string, alpha: number): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}","/**\n * Number formatting utilities for data visualization\n */\n\n/**\n * Format a number with commas for thousands\n * @example formatNumber(1234567) => \"1,234,567\"\n */\nexport function formatNumber(value: number): string {\n return new Intl.NumberFormat('en-US').format(value);\n}\n\n/**\n * Format a number with K/M/B abbreviations\n * @example formatCompactNumber(1234) => \"1.2K\"\n * @example formatCompactNumber(1234567) => \"1.2M\"\n */\nexport function formatCompactNumber(value: number): string {\n return new Intl.NumberFormat('en-US', {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(value);\n}\n\n/**\n * Format a percentage with optional decimal places\n * @example formatPercentage(0.1234) => \"12.3%\"\n * @example formatPercentage(0.1234, 0) => \"12%\"\n */\nexport function formatPercentage(value: number, decimals: number = 1): string {\n return `${(value * 100).toFixed(decimals)}%`;\n}\n\n/**\n * Format file size in bytes to human-readable format\n * @example formatFileSize(1024) => \"1.0 KB\"\n * @example formatFileSize(1048576) => \"1.0 MB\"\n */\nexport function formatFileSize(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let size = bytes;\n let unitIndex = 0;\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n\n return `${size.toFixed(1)} ${units[unitIndex]}`;\n}\n\n/**\n * Format a date as relative time (e.g., \"2 hours ago\")\n * @example formatRelativeTime(new Date(Date.now() - 3600000)) => \"1 hour ago\"\n */\nexport function formatRelativeTime(date: Date): string {\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n const diffDay = Math.floor(diffHour / 24);\n const diffMonth = Math.floor(diffDay / 30);\n const diffYear = Math.floor(diffDay / 365);\n\n if (diffYear > 0) {\n return `${diffYear} year${diffYear > 1 ? 's' : ''} ago`;\n }\n if (diffMonth > 0) {\n return `${diffMonth} month${diffMonth > 1 ? 's' : ''} ago`;\n }\n if (diffDay > 0) {\n return `${diffDay} day${diffDay > 1 ? 's' : ''} ago`;\n }\n if (diffHour > 0) {\n return `${diffHour} hour${diffHour > 1 ? 's' : ''} ago`;\n }\n if (diffMin > 0) {\n return `${diffMin} minute${diffMin > 1 ? 's' : ''} ago`;\n }\n return 'just now';\n}\n\n/**\n * Format a date in short format (e.g., \"Jan 15, 2024\")\n */\nexport function formatDate(date: Date): string {\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n }).format(date);\n}\n\n/**\n * Format a date with time (e.g., \"Jan 15, 2024 at 3:45 PM\")\n */\nexport function formatDateTime(date: Date): string {\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n }).format(date);\n}\n\n/**\n * Format duration in milliseconds to human-readable format\n * @example formatDuration(3661000) => \"1h 1m 1s\"\n */\nexport function formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m ${seconds % 60}s`;\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n}\n\n/**\n * Format a metric value with appropriate unit and precision\n * Useful for displaying various metrics in charts\n */\nexport function formatMetric(\n value: number,\n unit: 'number' | 'bytes' | 'percentage' | 'duration' = 'number'\n): string {\n switch (unit) {\n case 'bytes':\n return formatFileSize(value);\n case 'percentage':\n return formatPercentage(value);\n case 'duration':\n return formatDuration(value);\n default:\n return formatCompactNumber(value);\n }\n}\n\n/**\n * Format a range of values\n * @example formatRange(100, 200) => \"100 - 200\"\n */\nexport function formatRange(min: number, max: number): string {\n return `${formatCompactNumber(min)} - ${formatCompactNumber(max)}`;\n}\n\n/**\n * Format a number with a specific number of decimal places\n * @example formatDecimal(3.14159, 2) => \"3.14\"\n */\nexport function formatDecimal(value: number, decimals: number = 2): string {\n return value.toFixed(decimals);\n}","import { useEffect, useState } from 'react';\n\n/**\n * Debounce a value with a specified delay\n * Useful for search inputs, filters, and other frequently changing values\n *\n * @param value - The value to debounce\n * @param delay - Delay in milliseconds (default: 300ms)\n * @returns The debounced value\n *\n * @example\n * ```tsx\n * function SearchInput() {\n * const [searchTerm, setSearchTerm] = useState('');\n * const debouncedSearchTerm = useDebounce(searchTerm, 500);\n *\n * useEffect(() => {\n * // This will only run when user stops typing for 500ms\n * if (debouncedSearchTerm) {\n * performSearch(debouncedSearchTerm);\n * }\n * }, [debouncedSearchTerm]);\n *\n * return <input value={searchTerm} onChange={(e) => setSearchTerm(e.target.value)} />;\n * }\n * ```\n */\nexport function useDebounce<T>(value: T, delay: number = 300): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n // Set up the timeout to update debounced value after delay\n const timer = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n // Clean up the timeout if value changes or component unmounts\n return () => {\n clearTimeout(timer);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}","import { useEffect, useRef } from 'react';\nimport * as d3 from 'd3';\n\n/**\n * Hook for managing D3 selections with React lifecycle\n * Provides a ref to the SVG/container element and runs a render function when dependencies change\n *\n * @param renderFn - Function that receives the D3 selection and performs rendering\n * @param dependencies - Array of dependencies that trigger re-render\n * @returns Ref to attach to the SVG/container element\n *\n * @example\n * ```tsx\n * function BarChart({ data }: { data: number[] }) {\n * const ref = useD3(\n * (svg) => {\n * const width = 600;\n * const height = 400;\n * const margin = { top: 20, right: 20, bottom: 30, left: 40 };\n *\n * // Clear previous content\n * svg.selectAll('*').remove();\n *\n * // Set up scales\n * const x = d3.scaleBand()\n * .domain(data.map((_, i) => i.toString()))\n * .range([margin.left, width - margin.right])\n * .padding(0.1);\n *\n * const y = d3.scaleLinear()\n * .domain([0, d3.max(data) || 0])\n * .range([height - margin.bottom, margin.top]);\n *\n * // Draw bars\n * svg.selectAll('rect')\n * .data(data)\n * .join('rect')\n * .attr('x', (_, i) => x(i.toString())!)\n * .attr('y', d => y(d))\n * .attr('width', x.bandwidth())\n * .attr('height', d => y(0) - y(d))\n * .attr('fill', 'steelblue');\n * },\n * [data]\n * );\n *\n * return <svg ref={ref} width={600} height={400} />;\n * }\n * ```\n */\nexport function useD3<T extends SVGSVGElement | HTMLDivElement>(\n renderFn: (selection: d3.Selection<T, unknown, null, undefined>) => void,\n dependencies: React.DependencyList = []\n): React.RefObject<T | null> {\n const ref = useRef<T | null>(null);\n\n useEffect(() => {\n if (ref.current) {\n const selection = d3.select(ref.current);\n renderFn(selection);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n return ref;\n}\n\n/**\n * Hook for managing D3 selections with automatic resize handling\n * Similar to useD3 but also triggers re-render on window resize\n *\n * @param renderFn - Function that receives the D3 selection and performs rendering\n * @param dependencies - Array of dependencies that trigger re-render\n * @returns Ref to attach to the SVG/container element\n *\n * @example\n * ```tsx\n * function ResponsiveChart({ data }: { data: number[] }) {\n * const ref = useD3WithResize(\n * (svg) => {\n * const container = svg.node();\n * const width = container?.clientWidth || 600;\n * const height = container?.clientHeight || 400;\n *\n * // Render with responsive dimensions\n * // ...\n * },\n * [data]\n * );\n *\n * return <svg ref={ref} style={{ width: '100%', height: '400px' }} />;\n * }\n * ```\n */\nexport function useD3WithResize<T extends SVGSVGElement | HTMLDivElement>(\n renderFn: (selection: d3.Selection<T, unknown, null, undefined>) => void,\n dependencies: React.DependencyList = []\n): React.RefObject<T | null> {\n const ref = useRef<T | null>(null);\n\n useEffect(() => {\n if (!ref.current) return;\n\n const selection = d3.select(ref.current);\n const render = () => renderFn(selection);\n\n // Initial render\n render();\n\n // Set up resize observer\n const resizeObserver = new ResizeObserver(() => {\n render();\n });\n\n resizeObserver.observe(ref.current);\n\n // Cleanup\n return () => {\n resizeObserver.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n return ref;\n}","import { useEffect, useRef, useState } from 'react';\nimport * as d3 from 'd3';\n\nexport interface SimulationNode extends d3.SimulationNodeDatum {\n id: string;\n [key: string]: any;\n}\n\nexport interface SimulationLink extends d3.SimulationLinkDatum<SimulationNode> {\n source: string | SimulationNode;\n target: string | SimulationNode;\n [key: string]: any;\n}\n\nexport interface ForceSimulationOptions {\n /**\n * Strength of the charge force (repulsion between nodes)\n * @default -300\n */\n chargeStrength?: number;\n\n /**\n * Distance for links between nodes\n * @default 100\n */\n linkDistance?: number;\n\n /**\n * Strength of the link force\n * @default 1\n */\n linkStrength?: number;\n\n /**\n * Strength of collision detection\n * @default 1\n */\n collisionStrength?: number;\n\n /**\n * Radius for collision detection (node size)\n * @default 10\n */\n collisionRadius?: number;\n\n /**\n * Strength of centering force\n * @default 0.1\n */\n centerStrength?: number;\n\n /**\n * Width of the simulation space\n */\n width: number;\n\n /**\n * Height of the simulation space\n */\n height: number;\n\n /**\n * Alpha decay rate (how quickly the simulation cools down)\n * @default 0.0228\n */\n alphaDecay?: number;\n\n /**\n * Alpha target controls the resting energy of the simulation. When set to 0\n * the simulation will cool and stop moving once forces settle. Increase to\n * keep the graph more dynamic.\n * @default 0\n */\n alphaTarget?: number;\n\n /**\n * Warm alpha used when (re)starting the simulation to give it a small amount\n * of energy. This mirrors the Observable example which sets a modest\n * alphaTarget when dragging instead of forcing alpha to 1.\n * @default 0.3\n */\n warmAlpha?: number;\n\n /**\n * Minimum alpha threshold below which the simulation is considered cooled\n * and will stop. Increasing this makes the simulation stop earlier.\n * @default 0.01\n */\n alphaMin?: number;\n\n /**\n * When true, zero node velocities and snap positions when the simulation\n * stops to reduce residual jitter.\n * @default true\n */\n stabilizeOnStop?: boolean;\n\n /**\n * Maximum time (ms) to allow the simulation to run after creation/restart.\n * If the simulation hasn't cooled by this time, it will be force-stopped\n * to prevent indefinite animation. Set to 0 to disable.\n * @default 3000\n */\n maxSimulationTimeMs?: number;\n\n /**\n * Velocity decay (friction)\n * @default 0.4\n */\n velocityDecay?: number;\n\n /**\n * Optional tick callback invoked on each simulation tick with current nodes/links and the simulation instance\n */\n onTick?: (nodes: SimulationNode[], links: SimulationLink[], sim: d3.Simulation<SimulationNode, SimulationLink>) => void;\n}\n\nexport interface UseForceSimulationReturn {\n /**\n * Current nodes with positions\n */\n nodes: SimulationNode[];\n\n /**\n * Current links\n */\n links: SimulationLink[];\n\n /**\n * Restart the simulation\n */\n restart: () => void;\n\n /**\n * Stop the simulation\n */\n stop: () => void;\n\n /**\n * Whether the simulation is currently running\n */\n isRunning: boolean;\n\n /**\n * Current alpha value (simulation heat)\n */\n alpha: number;\n}\n\n/**\n * Hook for managing d3-force simulations\n * Automatically handles simulation lifecycle, tick updates, and cleanup\n *\n * @param initialNodes - Initial nodes for the simulation\n * @param initialLinks - Initial links for the simulation\n * @param options - Configuration options for the force simulation\n * @returns Simulation state and control functions\n *\n * @example\n * ```tsx\n * function NetworkGraph() {\n * const nodes = [\n * { id: 'node1', name: 'Node 1' },\n * { id: 'node2', name: 'Node 2' },\n * { id: 'node3', name: 'Node 3' },\n * ];\n *\n * const links = [\n * { source: 'node1', target: 'node2' },\n * { source: 'node2', target: 'node3' },\n * ];\n *\n * const { nodes: simulatedNodes, links: simulatedLinks, restart } = useForceSimulation(\n * nodes,\n * links,\n * {\n * width: 800,\n * height: 600,\n * chargeStrength: -500,\n * linkDistance: 150,\n * }\n * );\n *\n * return (\n * <svg width={800} height={600}>\n * {simulatedLinks.map((link, i) => (\n * <line\n * key={i}\n * x1={(link.source as SimulationNode).x}\n * y1={(link.source as SimulationNode).y}\n * x2={(link.target as SimulationNode).x}\n * y2={(link.target as SimulationNode).y}\n * stroke=\"#999\"\n * />\n * ))}\n * {simulatedNodes.map((node) => (\n * <circle\n * key={node.id}\n * cx={node.x}\n * cy={node.y}\n * r={10}\n * fill=\"#69b3a2\"\n * />\n * ))}\n * </svg>\n * );\n * }\n * ```\n */\nexport function useForceSimulation(\n initialNodes: SimulationNode[],\n initialLinks: SimulationLink[],\n options: ForceSimulationOptions\n): UseForceSimulationReturn & { setForcesEnabled: (enabled: boolean) => void } {\n const {\n chargeStrength = -300,\n linkDistance = 100,\n linkStrength = 1,\n collisionStrength = 1,\n collisionRadius = 10,\n centerStrength = 0.1,\n width,\n height,\n alphaDecay = 0.0228,\n velocityDecay = 0.4,\n alphaTarget = 0,\n warmAlpha = 0.3,\n alphaMin = 0.01,\n // @ts-ignore allow extra option\n stabilizeOnStop = true,\n onTick,\n // Optional throttle in milliseconds for tick updates (reduce React re-renders)\n // Lower values = smoother but more CPU; default ~30ms (~33fps)\n // @ts-ignore allow extra option\n tickThrottleMs = 33,\n // @ts-ignore allow extra option\n maxSimulationTimeMs = 3000,\n } = options;\n\n const [nodes, setNodes] = useState<SimulationNode[]>(initialNodes);\n const [links, setLinks] = useState<SimulationLink[]>(initialLinks);\n const [isRunning, setIsRunning] = useState(false);\n const [alpha, setAlpha] = useState(1);\n\n const simulationRef = useRef<d3.Simulation<SimulationNode, SimulationLink> | null>(null);\n const stopTimeoutRef = useRef<number | null>(null);\n\n // Create lightweight keys for nodes/links so we only recreate the simulation\n // when the actual identity/content of inputs change (not when parent passes\n // new array references on each render).\n const nodesKey = initialNodes.map((n) => n.id).join('|');\n const linksKey = (initialLinks || []).map((l) => {\n const s = typeof l.source === 'string' ? l.source : (l.source as any)?.id;\n const t = typeof l.target === 'string' ? l.target : (l.target as any)?.id;\n return `${s}->${t}:${(l as any).type || ''}`;\n }).join('|');\n\n useEffect(() => {\n // Create a copy of nodes and links to avoid mutating the original data\n const nodesCopy = initialNodes.map((node) => ({ ...node }));\n const linksCopy = initialLinks.map((link) => ({ ...link }));\n\n // ALWAYS seed initial positions to ensure nodes don't stack at origin\n // This is critical for force-directed graphs to work properly\n try {\n // Always seed positions for all nodes when simulation is created\n // This ensures nodes start spread out even if they have coordinates\n nodesCopy.forEach((n, i) => {\n // Use deterministic but more widely spread positions based on index\n const angle = (i * 2 * Math.PI) / nodesCopy.length;\n // Larger seed radius to encourage an initial spread\n const radius = Math.min(width, height) * 0.45;\n n.x = width / 2 + radius * Math.cos(angle);\n n.y = height / 2 + radius * Math.sin(angle);\n // Add very small random velocity to avoid large initial motion\n (n as any).vx = (Math.random() - 0.5) * 2;\n (n as any).vy = (Math.random() - 0.5) * 2;\n });\n } catch (e) {\n // If error, fall back to random positions\n nodesCopy.forEach((n) => {\n n.x = Math.random() * width;\n n.y = Math.random() * height;\n (n as any).vx = (Math.random() - 0.5) * 10;\n (n as any).vy = (Math.random() - 0.5) * 10;\n });\n }\n\n // Create the simulation\n const simulation = (d3.forceSimulation(nodesCopy as any) as unknown) as d3.Simulation<SimulationNode, SimulationLink>;\n\n // Configure link force separately to avoid using generic type args on d3 helpers\n try {\n const linkForce = (d3.forceLink(linksCopy as any) as unknown) as d3.ForceLink<SimulationNode, SimulationLink>;\n linkForce.id((d: any) => d.id).distance((d: any) => (d && d.distance != null ? d.distance : linkDistance)).strength(linkStrength);\n simulation.force('link', linkForce as any);\n } catch (e) {\n // fallback: attach a plain link force\n try { simulation.force('link', d3.forceLink(linksCopy as any) as any); } catch (e) {}\n }\n ;\n\n try {\n simulation.force('charge', d3.forceManyBody().strength(chargeStrength) as any);\n simulation.force('center', d3.forceCenter(width / 2, height / 2).strength(centerStrength) as any);\n const collide = d3.forceCollide().radius((d: any) => {\n const nodeSize = (d && d.size) ? d.size : 10;\n return nodeSize + collisionRadius;\n }).strength(collisionStrength as any) as any;\n simulation.force('collision', collide);\n simulation.force('x', d3.forceX(width / 2).strength(Math.max(0.02, centerStrength * 0.5)) as any);\n simulation.force('y', d3.forceY(height / 2).strength(Math.max(0.02, centerStrength * 0.5)) as any);\n simulation.alphaDecay(alphaDecay);\n simulation.velocityDecay(velocityDecay);\n simulation.alphaMin(alphaMin);\n try { simulation.alphaTarget(alphaTarget); } catch (e) {}\n try { simulation.alpha(warmAlpha); } catch (e) {}\n } catch (e) {\n // ignore force configuration errors\n }\n\n simulationRef.current = simulation;\n\n // Force-stop timeout to ensure simulation doesn't run forever.\n if (stopTimeoutRef.current != null) {\n try { (globalThis.clearTimeout as any)(stopTimeoutRef.current); } catch (e) {}\n stopTimeoutRef.current = null;\n }\n if (maxSimulationTimeMs && maxSimulationTimeMs > 0) {\n stopTimeoutRef.current = (globalThis.setTimeout as any)(() => {\n try {\n if (stabilizeOnStop) {\n nodesCopy.forEach((n) => {\n (n as any).vx = 0;\n (n as any).vy = 0;\n if (typeof n.x === 'number') n.x = Number(n.x.toFixed(3));\n if (typeof n.y === 'number') n.y = Number(n.y.toFixed(3));\n });\n }\n simulation.alpha(0);\n simulation.stop();\n } catch (e) {}\n setIsRunning(false);\n setNodes([...nodesCopy]);\n setLinks([...linksCopy]);\n }, maxSimulationTimeMs) as unknown as number;\n }\n\n // Update state on each tick. Batch updates via requestAnimationFrame to avoid\n // excessive React re-renders which can cause visual flicker.\n let rafId: number | null = null;\n let lastUpdate = 0;\n const tickHandler = () => {\n try {\n if (typeof onTick === 'function') onTick(nodesCopy, linksCopy, simulation);\n } catch (e) {\n // ignore user tick errors\n }\n\n // If simulation alpha has cooled below the configured minimum, stop it to\n // ensure nodes don't drift indefinitely (acts as a hard-stop safeguard).\n try {\n if (simulation.alpha() <= (alphaMin as number)) {\n try {\n if (stabilizeOnStop) {\n nodesCopy.forEach((n) => {\n (n as any).vx = 0;\n (n as any).vy = 0;\n if (typeof n.x === 'number') n.x = Number(n.x.toFixed(3));\n if (typeof n.y === 'number') n.y = Number(n.y.toFixed(3));\n });\n }\n simulation.stop();\n } catch (e) {}\n setAlpha(simulation.alpha());\n setIsRunning(false);\n setNodes([...nodesCopy]);\n setLinks([...linksCopy]);\n return;\n }\n } catch (e) {\n // ignore\n }\n\n const now = Date.now();\n const shouldUpdate = now - lastUpdate >= (tickThrottleMs as number);\n if (rafId == null && shouldUpdate) {\n rafId = (globalThis.requestAnimationFrame || ((cb: FrameRequestCallback) => setTimeout(cb, 16)))(() => {\n rafId = null;\n lastUpdate = Date.now();\n setNodes([...nodesCopy]);\n setLinks([...linksCopy]);\n setAlpha(simulation.alpha());\n setIsRunning(simulation.alpha() > simulation.alphaMin());\n }) as unknown as number;\n }\n };\n\n simulation.on('tick', tickHandler);\n\n simulation.on('end', () => {\n setIsRunning(false);\n });\n\n // Cleanup on unmount\n return () => {\n try {\n simulation.on('tick', null as any);\n } catch (e) {}\n if (stopTimeoutRef.current != null) {\n try { (globalThis.clearTimeout as any)(stopTimeoutRef.current); } catch (e) {}\n stopTimeoutRef.current = null;\n }\n if (rafId != null) {\n try { (globalThis.cancelAnimationFrame || ((id: number) => clearTimeout(id)))(rafId); } catch (e) {}\n rafId = null;\n }\n simulation.stop();\n };\n }, [\n nodesKey,\n linksKey,\n chargeStrength,\n linkDistance,\n linkStrength,\n collisionStrength,\n collisionRadius,\n centerStrength,\n width,\n height,\n alphaDecay,\n velocityDecay,\n alphaTarget,\n alphaMin,\n stabilizeOnStop,\n tickThrottleMs,\n maxSimulationTimeMs,\n ]);\n\n const restart = () => {\n if (simulationRef.current) {\n // Reheat the simulation to a modest alpha target rather than forcing\n // full heat; this matches the Observable pattern and helps stability.\n try { simulationRef.current.alphaTarget(warmAlpha).restart(); } catch (e) { simulationRef.current.restart(); }\n setIsRunning(true);\n // Reset safety timeout when simulation is manually restarted\n if (stopTimeoutRef.current != null) {\n try { (globalThis.clearTimeout as any)(stopTimeoutRef.current); } catch (e) {}\n stopTimeoutRef.current = null;\n }\n if (maxSimulationTimeMs && maxSimulationTimeMs > 0) {\n stopTimeoutRef.current = (globalThis.setTimeout as any)(() => {\n try { simulationRef.current?.alpha(0); simulationRef.current?.stop(); } catch (e) {}\n setIsRunning(false);\n }, maxSimulationTimeMs) as unknown as number;\n }\n }\n };\n\n const stop = () => {\n if (simulationRef.current) {\n simulationRef.current.stop();\n setIsRunning(false);\n }\n };\n\n const originalForcesRef = useRef({ charge: chargeStrength, link: linkStrength, collision: collisionStrength });\n const forcesEnabledRef = useRef(true);\n\n const setForcesEnabled = (enabled: boolean) => {\n const sim = simulationRef.current;\n if (!sim) return;\n // avoid repeated updates\n if (forcesEnabledRef.current === enabled) return;\n forcesEnabledRef.current = enabled;\n\n try {\n // Only toggle charge and link forces to avoid collapse; keep collision/centering\n const charge: any = sim.force('charge');\n if (charge && typeof charge.strength === 'function') {\n charge.strength(enabled ? originalForcesRef.current.charge : 0);\n }\n\n const link: any = sim.force('link');\n if (link && typeof link.strength === 'function') {\n link.strength(enabled ? originalForcesRef.current.link : 0);\n }\n } catch (e) {\n // ignore\n }\n };\n\n return {\n nodes,\n links,\n restart,\n stop,\n isRunning,\n alpha,\n setForcesEnabled,\n };\n}\n\n/**\n * Hook for creating a draggable force simulation\n * Provides drag handlers that can be attached to node elements\n *\n * @param simulation - The d3 force simulation instance\n * @returns Drag behavior that can be applied to nodes\n *\n * @example\n * ```tsx\n * function DraggableNetworkGraph() {\n * const simulation = useRef<d3.Simulation<SimulationNode, SimulationLink>>();\n * const drag = useDrag(simulation.current);\n *\n * return (\n * <svg>\n * {nodes.map((node) => (\n * <circle\n * key={node.id}\n * {...drag}\n * cx={node.x}\n * cy={node.y}\n * r={10}\n * />\n * ))}\n * </svg>\n * );\n * }\n * ```\n */\nexport function useDrag(simulation: d3.Simulation<SimulationNode, any> | null | undefined) {\n const dragStarted = (event: any, node: SimulationNode) => {\n if (!simulation) return;\n if (!event.active) simulation.alphaTarget(0.3).restart();\n node.fx = node.x;\n node.fy = node.y;\n };\n\n const dragged = (event: any, node: SimulationNode) => {\n node.fx = event.x;\n node.fy = event.y;\n };\n\n const dragEnded = (event: any, node: SimulationNode) => {\n if (!simulation) return;\n if (!event.active) simulation.alphaTarget(0);\n node.fx = null;\n node.fy = null;\n };\n\n return {\n onDragStart: dragStarted,\n onDrag: dragged,\n onDragEnd: dragEnded,\n };\n}","import React from 'react';\nimport type { GraphNode } from './ForceDirectedGraph';\n\nexport interface NodeItemProps {\n node: GraphNode;\n isSelected: boolean;\n isHovered: boolean;\n pinned: boolean;\n defaultNodeSize: number;\n defaultNodeColor: string;\n showLabel?: boolean;\n onClick?: (n: GraphNode) => void;\n onDoubleClick?: (e: React.MouseEvent, n: GraphNode) => void;\n onMouseEnter?: (n: GraphNode) => void;\n onMouseLeave?: () => void;\n onMouseDown?: (e: React.MouseEvent, n: GraphNode) => void;\n}\n\nexport const NodeItem: React.FC<NodeItemProps> = ({\n node,\n isSelected,\n isHovered,\n pinned,\n defaultNodeSize,\n defaultNodeColor,\n showLabel = true,\n onClick,\n onDoubleClick,\n onMouseEnter,\n onMouseLeave,\n onMouseDown,\n}) => {\n const nodeSize = node.size || defaultNodeSize;\n const nodeColor = node.color || defaultNodeColor;\n\n const x = node.x ?? 0;\n const y = node.y ?? 0;\n\n return (\n <g\n key={node.id}\n className=\"cursor-pointer node\"\n data-id={node.id}\n transform={`translate(${x},${y})`}\n onClick={() => onClick?.(node)}\n onDoubleClick={(e) => onDoubleClick?.(e, node)}\n onMouseEnter={() => onMouseEnter?.(node)}\n onMouseLeave={() => onMouseLeave?.()}\n onMouseDown={(e) => onMouseDown?.(e, node)}\n >\n <circle\n r={nodeSize}\n fill={nodeColor}\n stroke={isSelected ? '#000' : isHovered ? '#666' : 'none'}\n strokeWidth={pinned ? 3 : isSelected ? 2.5 : isHovered ? 2 : 1.5}\n opacity={isHovered || isSelected ? 1 : 0.9}\n />\n {pinned && (\n <circle r={nodeSize + 4} fill=\"none\" stroke=\"#ff6b6b\" strokeWidth={1} opacity={0.5} className=\"pointer-events-none\" />\n )}\n {showLabel && node.label && (\n <text y={nodeSize + 15} fill=\"#333\" fontSize=\"12\" textAnchor=\"middle\" dominantBaseline=\"middle\" pointerEvents=\"none\" className=\"select-none\">\n {node.label}\n </text>\n )}\n </g>\n );\n};\n\nexport default NodeItem;\n","import React from 'react';\nimport type { GraphLink, GraphNode } from './ForceDirectedGraph';\n\nexport interface LinkItemProps {\n link: GraphLink;\n onClick?: (l: GraphLink) => void;\n defaultWidth?: number;\n showLabel?: boolean;\n nodes?: GraphNode[]; // Optional nodes array to resolve string IDs to node objects\n}\n\nexport const LinkItem: React.FC<LinkItemProps> = ({ link, onClick, defaultWidth, showLabel = true, nodes = [] }) => {\n const src = (link.source as any)?.id ?? (typeof link.source === 'string' ? link.source : undefined);\n const tgt = (link.target as any)?.id ?? (typeof link.target === 'string' ? link.target : undefined);\n\n // Helper to get node position from source/target (which could be node object or string ID)\n const getNodePosition = (nodeOrId: string | GraphNode): { x: number; y: number } | null => {\n if (typeof nodeOrId === 'object' && nodeOrId !== null) {\n // It's a node object\n const node = nodeOrId as GraphNode;\n return { x: node.x ?? 0, y: node.y ?? 0 };\n } else if (typeof nodeOrId === 'string') {\n // It's a string ID, try to find in nodes array\n const found = nodes.find(n => n.id === nodeOrId);\n if (found) return { x: found.x ?? 0, y: found.y ?? 0 };\n }\n return null;\n };\n\n const sourcePos = getNodePosition(link.source);\n const targetPos = getNodePosition(link.target);\n\n // If we can't get positions, render nothing (or a placeholder)\n if (!sourcePos || !targetPos) {\n return null;\n }\n\n // Calculate midpoint for label positioning\n const midX = (sourcePos.x + targetPos.x) / 2;\n const midY = (sourcePos.y + targetPos.y) / 2;\n\n return (\n <g>\n <line\n x1={sourcePos.x}\n y1={sourcePos.y}\n x2={targetPos.x}\n y2={targetPos.y}\n data-source={src}\n data-target={tgt}\n stroke={link.color}\n strokeWidth={link.width ?? defaultWidth ?? 1}\n opacity={0.6}\n className=\"cursor-pointer transition-opacity hover:opacity-100\"\n onClick={() => onClick?.(link)}\n />\n {showLabel && link.label && (\n <text\n x={midX}\n y={midY}\n fill=\"#666\"\n fontSize=\"10\"\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n pointerEvents=\"none\"\n >\n {link.label}\n </text>\n )}\n </g>\n );\n};\n\nexport default LinkItem;\n","import React, { useCallback, useEffect, useRef, useState, forwardRef, useImperativeHandle } from 'react';\nimport * as d3 from 'd3';\nimport { cn } from '../utils/cn';\nimport NodeItem from './NodeItem';\nimport LinkItem from './LinkItem';\n\nexport interface GraphNode {\n id: string;\n label?: string;\n color?: string;\n size?: number;\n group?: string;\n kind?: 'file' | 'package';\n packageGroup?: string;\n x?: number;\n y?: number;\n fx?: number | null;\n fy?: number | null;\n}\n\nexport interface GraphLink {\n source: string | GraphNode;\n target: string | GraphNode;\n color?: string;\n width?: number;\n label?: string;\n type?: string;\n}\n\nexport type LayoutType = 'force' | 'hierarchical' | 'circular';\n\nexport interface ForceDirectedGraphHandle {\n pinAll: () => void;\n unpinAll: () => void;\n resetLayout: () => void;\n fitView: () => void;\n getPinnedNodes: () => string[];\n setDragMode: (enabled: boolean) => void;\n setLayout: (layout: LayoutType) => void;\n getLayout: () => LayoutType;\n}\n\nexport interface ForceDirectedGraphProps {\n nodes: GraphNode[];\n links: GraphLink[];\n width: number;\n height: number;\n enableZoom?: boolean;\n enableDrag?: boolean;\n onNodeClick?: (node: GraphNode) => void;\n onNodeHover?: (node: GraphNode | null) => void;\n onLinkClick?: (link: GraphLink) => void;\n selectedNodeId?: string;\n hoveredNodeId?: string;\n defaultNodeColor?: string;\n defaultNodeSize?: number;\n defaultLinkColor?: string;\n defaultLinkWidth?: number;\n showNodeLabels?: boolean;\n showLinkLabels?: boolean;\n className?: string;\n manualLayout?: boolean;\n onManualLayoutChange?: (enabled: boolean) => void;\n packageBounds?: Record<string, { x: number; y: number; r: number }>;\n layout?: LayoutType;\n onLayoutChange?: (layout: LayoutType) => void;\n}\n\nexport const ForceDirectedGraph = forwardRef<ForceDirectedGraphHandle, ForceDirectedGraphProps>(\n (\n {\n nodes: initialNodes,\n links: initialLinks,\n width,\n height,\n enableZoom = true,\n enableDrag = true,\n onNodeClick,\n onNodeHover,\n onLinkClick,\n selectedNodeId,\n hoveredNodeId,\n defaultNodeColor = '#69b3a2',\n defaultNodeSize = 10,\n defaultLinkColor = '#999',\n defaultLinkWidth = 1,\n showNodeLabels = true,\n showLinkLabels = false,\n className,\n manualLayout = false,\n onManualLayoutChange,\n packageBounds,\n layout: externalLayout,\n onLayoutChange,\n },\n ref\n ) => {\n const svgRef = useRef<SVGSVGElement>(null);\n const gRef = useRef<SVGGElement>(null);\n const [transform, setTransform] = useState({ k: 1, x: 0, y: 0 });\n const transformRef = useRef(transform);\n const dragNodeRef = useRef<GraphNode | null>(null);\n const dragActiveRef = useRef(false);\n const [pinnedNodes, setPinnedNodes] = useState<Set<string>>(new Set());\n const internalDragEnabledRef = useRef(enableDrag);\n const [layout, setLayout] = useState<LayoutType>(externalLayout || 'force');\n \n // Sync external layout prop with internal state\n useEffect(() => {\n if (externalLayout && externalLayout !== layout) {\n setLayout(externalLayout);\n }\n }, [externalLayout]);\n\n // Handle layout change and notify parent\n const handleLayoutChange = useCallback((newLayout: LayoutType) => {\n setLayout(newLayout);\n onLayoutChange?.(newLayout);\n }, [onLayoutChange]);\n\n // Update the ref when enableDrag prop changes\n useEffect(() => {\n internalDragEnabledRef.current = enableDrag;\n }, [enableDrag]);\n\n\n // Static layout - compute positions directly without force simulation\n const nodes = React.useMemo(() => {\n if (!initialNodes || !initialNodes.length) return initialNodes;\n \n const cx = width / 2;\n const cy = height / 2;\n \n // For force layout, use random positions but don't animate\n if (layout === 'force') {\n return initialNodes.map((n: any) => ({\n ...n,\n x: Math.random() * width,\n y: Math.random() * height,\n }));\n }\n \n // For circular layout, arrange in a circle\n if (layout === 'circular') {\n const radius = Math.min(width, height) * 0.35;\n return initialNodes.map((n: any, i: number) => ({\n ...n,\n x: cx + Math.cos((2 * Math.PI * i) / initialNodes.length) * radius,\n y: cy + Math.sin((2 * Math.PI * i) / initialNodes.length) * radius,\n }));\n }\n \n // For hierarchical layout, arrange in a grid\n if (layout === 'hierarchical') {\n const cols = Math.ceil(Math.sqrt(initialNodes.length));\n const spacingX = width / (cols + 1);\n const spacingY = height / (Math.ceil(initialNodes.length / cols) + 1);\n return initialNodes.map((n: any, i: number) => ({\n ...n,\n x: spacingX * ((i % cols) + 1),\n y: spacingY * (Math.floor(i / cols) + 1),\n }));\n }\n \n return initialNodes;\n }, [initialNodes, width, height, layout]);\n\n // Static links - just use initial links\n const links = initialLinks;\n \n // No force simulation - static layout only\n const restart = React.useCallback(() => {\n // No-op for static layout\n }, []);\n \n const stop = React.useCallback(() => {\n // No-op for static layout\n }, []);\n \n const setForcesEnabled = React.useCallback((_enabled: boolean) => {\n // No-op for static layout\n }, []);\n\n // Remove package bounds effect - boundary packing disabled for faster convergence\n\n // Apply layout-specific positioning when layout changes\n useEffect(() => {\n if (!nodes || nodes.length === 0) return;\n \n const applyLayout = () => {\n const cx = width / 2;\n const cy = height / 2;\n \n if (layout === 'circular') {\n // Place all nodes in a circle\n const radius = Math.min(width, height) * 0.35;\n nodes.forEach((node, i) => {\n const angle = (2 * Math.PI * i) / nodes.length;\n node.fx = cx + Math.cos(angle) * radius;\n node.fy = cy + Math.sin(angle) * radius;\n });\n } else if (layout === 'hierarchical') {\n // Place packages in rows, files within packages in columns\n const groups = new Map<string, typeof nodes>();\n nodes.forEach((n: any) => {\n const key = n.packageGroup || n.group || 'root';\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(n);\n });\n \n const groupArray = Array.from(groups.entries());\n const cols = Math.ceil(Math.sqrt(groupArray.length));\n const groupSpacingX = width * 0.8 / cols;\n const groupSpacingY = height * 0.8 / Math.ceil(groupArray.length / cols);\n \n groupArray.forEach(([groupKey, groupNodes], gi) => {\n const col = gi % cols;\n const row = Math.floor(gi / cols);\n const groupX = (col + 0.5) * groupSpacingX;\n const groupY = (row + 0.5) * groupSpacingY;\n \n // Place group nodes in a small circle within their area\n if (groupKey.startsWith('pkg:') || groupKey === groupKey) {\n groupNodes.forEach((n, ni) => {\n const angle = (2 * Math.PI * ni) / groupNodes.length;\n const r = Math.min(80, 20 + groupNodes.length * 8);\n n.fx = groupX + Math.cos(angle) * r;\n n.fy = groupY + Math.sin(angle) * r;\n });\n }\n });\n }\n // 'force' layout - just restart with default behavior (no fx/fy set)\n \n try { restart(); } catch (e) { /* ignore */ }\n };\n \n applyLayout();\n }, [layout, nodes, width, height, restart]);\n\n // If manual layout is enabled or any nodes are pinned, disable forces\n useEffect(() => {\n try {\n if (manualLayout || pinnedNodes.size > 0) setForcesEnabled(false);\n else setForcesEnabled(true);\n } catch (e) {\n // ignore\n }\n }, [manualLayout, pinnedNodes, setForcesEnabled]);\n\n // Expose imperative handle for parent components\n useImperativeHandle(\n ref,\n () => ({\n pinAll: () => {\n const newPinned = new Set<string>();\n nodes.forEach((node) => {\n node.fx = node.x;\n node.fy = node.y;\n newPinned.add(node.id);\n });\n setPinnedNodes(newPinned);\n restart();\n },\n\n unpinAll: () => {\n nodes.forEach((node) => {\n node.fx = null;\n node.fy = null;\n });\n setPinnedNodes(new Set());\n restart();\n },\n\n resetLayout: () => {\n nodes.forEach((node) => {\n node.fx = null;\n node.fy = null;\n });\n setPinnedNodes(new Set());\n restart();\n },\n\n fitView: () => {\n if (!svgRef.current || !nodes.length) return;\n\n // Calculate bounds\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n nodes.forEach((node) => {\n if (node.x !== undefined && node.y !== undefined) {\n const size = node.size || 10;\n minX = Math.min(minX, node.x - size);\n maxX = Math.max(maxX, node.x + size);\n minY = Math.min(minY, node.y - size);\n maxY = Math.max(maxY, node.y + size);\n }\n });\n\n if (!isFinite(minX)) return;\n\n const padding = 40;\n const nodeWidth = maxX - minX;\n const nodeHeight = maxY - minY;\n const scale = Math.min(\n (width - padding * 2) / nodeWidth,\n (height - padding * 2) / nodeHeight,\n 10\n );\n\n const centerX = (minX + maxX) / 2;\n const centerY = (minY + maxY) / 2;\n\n const x = width / 2 - centerX * scale;\n const y = height / 2 - centerY * scale;\n\n if (gRef.current && svgRef.current) {\n const svg = d3.select(svgRef.current);\n const newTransform = d3.zoomIdentity.translate(x, y).scale(scale);\n svg.transition().duration(300).call(d3.zoom<SVGSVGElement, unknown>().transform as any, newTransform);\n setTransform(newTransform);\n }\n },\n\n getPinnedNodes: () => Array.from(pinnedNodes),\n\n setDragMode: (enabled: boolean) => {\n internalDragEnabledRef.current = enabled;\n },\n \n setLayout: (newLayout: LayoutType) => {\n handleLayoutChange(newLayout);\n },\n \n getLayout: () => layout,\n }),\n [nodes, pinnedNodes, restart, width, height, layout, handleLayoutChange]\n );\n\n // Notify parent when manual layout mode changes (uses the prop so it's not unused)\n useEffect(() => {\n try {\n if (typeof onManualLayoutChange === 'function') onManualLayoutChange(manualLayout);\n } catch (e) {\n // ignore errors from callbacks\n }\n }, [manualLayout, onManualLayoutChange]);\n\n // Set up zoom behavior\n useEffect(() => {\n if (!enableZoom || !svgRef.current || !gRef.current) return;\n\n const svg = d3.select(svgRef.current);\n const g = d3.select(gRef.current);\n\n const zoom = d3\n .zoom<SVGSVGElement, unknown>()\n .scaleExtent([0.1, 10])\n .on('zoom', (event) => {\n g.attr('transform', event.transform);\n transformRef.current = event.transform;\n setTransform(event.transform);\n });\n\n svg.call(zoom);\n\n return () => {\n svg.on('.zoom', null);\n };\n }, [enableZoom]);\n\n // Run a one-time DOM positioning pass when nodes/links change so elements\n // rendered by React are positioned to the simulation's seeded coordinates\n useEffect(() => {\n if (!gRef.current) return;\n try {\n const g = d3.select(gRef.current);\n g.selectAll<SVGGElement, any>('g.node').each(function (this: SVGGElement) {\n const datum = d3.select(this).datum() as any;\n if (!datum) return;\n d3.select(this).attr('transform', `translate(${datum.x || 0},${datum.y || 0})`);\n });\n\n g.selectAll<SVGLineElement, any>('line').each(function (this: SVGLineElement) {\n const l = d3.select(this).datum() as any;\n if (!l) return;\n const s: any = typeof l.source === 'object' ? l.source : nodes.find((n) => n.id === l.source) || l.source;\n const t: any = typeof l.target === 'object' ? l.target : nodes.find((n) => n.id === l.target) || l.target;\n if (!s || !t) return;\n d3.select(this).attr('x1', s.x).attr('y1', s.y).attr('x2', t.x).attr('y2', t.y);\n });\n } catch (e) {\n // ignore\n }\n }, [nodes, links]);\n\n // Set up drag behavior with global listeners for smoother dragging\n const handleDragStart = useCallback(\n (event: React.MouseEvent, node: GraphNode) => {\n if (!enableDrag) return;\n event.preventDefault();\n event.stopPropagation();\n // pause forces while dragging to avoid the whole graph moving\n dragActiveRef.current = true;\n dragNodeRef.current = node;\n node.fx = node.x;\n node.fy = node.y;\n setPinnedNodes((prev) => new Set([...prev, node.id]));\n try { stop(); } catch (e) {}\n },\n [enableDrag, restart]\n );\n\n useEffect(() => {\n if (!enableDrag) return;\n\n const handleWindowMove = (event: MouseEvent) => {\n if (!dragActiveRef.current || !dragNodeRef.current) return;\n const svg = svgRef.current;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n const t: any = transformRef.current;\n const x = (event.clientX - rect.left - t.x) / t.k;\n const y = (event.clientY - rect.top - t.y) / t.k;\n dragNodeRef.current.fx = x;\n dragNodeRef.current.fy = y;\n };\n\n const handleWindowUp = () => {\n if (!dragActiveRef.current) return;\n // Keep fx/fy set to pin the node where it was dropped.\n try { setForcesEnabled(true); restart(); } catch (e) {}\n dragNodeRef.current = null;\n dragActiveRef.current = false;\n };\n\n const handleWindowLeave = (event: MouseEvent) => {\n if (event.relatedTarget === null) handleWindowUp();\n };\n\n window.addEventListener('mousemove', handleWindowMove);\n window.addEventListener('mouseup', handleWindowUp);\n window.addEventListener('mouseout', handleWindowLeave);\n window.addEventListener('blur', handleWindowUp);\n\n return () => {\n window.removeEventListener('mousemove', handleWindowMove);\n window.removeEventListener('mouseup', handleWindowUp);\n window.removeEventListener('mouseout', handleWindowLeave);\n window.removeEventListener('blur', handleWindowUp);\n };\n }, [enableDrag]);\n\n // Attach d3.drag behavior to node groups rendered by React. This helps make\n // dragging more robust across transforms and pointer behaviors.\n useEffect(() => {\n if (!gRef.current || !enableDrag) return;\n const g = d3.select(gRef.current);\n const dragBehavior = d3\n .drag<SVGGElement, unknown>()\n .on('start', function (event) {\n try {\n const target = (event.sourceEvent && (event.sourceEvent.target as Element)) || (event.target as Element);\n const grp = target.closest?.('g.node') as Element | null;\n const id = grp?.getAttribute('data-id');\n if (!id) return;\n const node = nodes.find((n) => n.id === id) as GraphNode | undefined;\n if (!node) return;\n if (!internalDragEnabledRef.current) return;\n if (!event.active) restart();\n dragActiveRef.current = true;\n dragNodeRef.current = node;\n node.fx = node.x;\n node.fy = node.y;\n setPinnedNodes((prev) => new Set([...prev, node.id]));\n } catch (e) {\n // ignore\n }\n })\n .on('drag', function (event) {\n if (!dragActiveRef.current || !dragNodeRef.current) return;\n const svg = svgRef.current;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n const x = (event.sourceEvent.clientX - rect.left - transform.x) / transform.k;\n const y = (event.sourceEvent.clientY - rect.top - transform.y) / transform.k;\n dragNodeRef.current.fx = x;\n dragNodeRef.current.fy = y;\n })\n .on('end', function () {\n // re-enable forces when drag ends\n try { setForcesEnabled(true); restart(); } catch (e) {}\n dragNodeRef.current = null;\n dragActiveRef.current = false;\n });\n\n try {\n g.selectAll('g.node').call(dragBehavior as any);\n } catch (e) {\n // ignore attach errors\n }\n\n return () => {\n try {\n g.selectAll('g.node').on('.drag', null as any);\n } catch (e) {\n /* ignore */\n }\n };\n }, [gRef, enableDrag, nodes, transform, restart]);\n\n const handleNodeClick = useCallback(\n (node: GraphNode) => {\n onNodeClick?.(node);\n },\n [onNodeClick]\n );\n\n const handleNodeDoubleClick = useCallback(\n (event: React.MouseEvent, node: GraphNode) => {\n event.stopPropagation();\n if (!enableDrag) return;\n if (node.fx === null || node.fx === undefined) {\n node.fx = node.x;\n node.fy = node.y;\n setPinnedNodes((prev) => new Set([...prev, node.id]));\n } else {\n node.fx = null;\n node.fy = null;\n setPinnedNodes((prev) => {\n const next = new Set(prev);\n next.delete(node.id);\n return next;\n });\n }\n restart();\n },\n [enableDrag, restart]\n );\n\n const handleCanvasDoubleClick = useCallback(() => {\n nodes.forEach((node) => {\n node.fx = null;\n node.fy = null;\n });\n setPinnedNodes(new Set());\n restart();\n }, [nodes, restart]);\n\n const handleNodeMouseEnter = useCallback(\n (node: GraphNode) => {\n onNodeHover?.(node);\n },\n [onNodeHover]\n );\n\n const handleNodeMouseLeave = useCallback(() => {\n onNodeHover?.(null);\n }, [onNodeHover]);\n\n const handleLinkClick = useCallback(\n (link: GraphLink) => {\n onLinkClick?.(link);\n },\n [onLinkClick]\n );\n\n return (\n <svg\n ref={svgRef}\n width={width}\n height={height}\n className={cn('bg-white dark:bg-gray-900', className)}\n onDoubleClick={handleCanvasDoubleClick}\n >\n <defs>\n {/* Arrow marker for directed graphs */}\n <marker\n id=\"arrow\"\n viewBox=\"0 0 10 10\"\n refX=\"20\"\n refY=\"5\"\n markerWidth=\"6\"\n markerHeight=\"6\"\n orient=\"auto\"\n >\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill={defaultLinkColor} />\n </marker>\n </defs>\n\n <g ref={gRef}>\n \n {/* Render links via LinkItem (positions updated by D3) */}\n {links.map((link, i) => (\n <LinkItem\n key={`link-${i}`}\n link={link as GraphLink}\n onClick={handleLinkClick}\n defaultWidth={defaultLinkWidth}\n showLabel={showLinkLabels}\n nodes={nodes}\n />\n ))}\n\n {/* Render nodes via NodeItem (D3 will set transforms) */}\n {nodes.map((node) => (\n <NodeItem\n key={node.id}\n node={node as GraphNode}\n isSelected={selectedNodeId === node.id}\n isHovered={hoveredNodeId === node.id}\n pinned={pinnedNodes.has(node.id)}\n defaultNodeSize={defaultNodeSize}\n defaultNodeColor={defaultNodeColor}\n showLabel={showNodeLabels}\n onClick={handleNodeClick}\n onDoubleClick={handleNodeDoubleClick}\n onMouseEnter={handleNodeMouseEnter}\n onMouseLeave={handleNodeMouseLeave}\n onMouseDown={handleDragStart}\n />\n ))}\n {/* Package boundary circles (from parent pack layout) - drawn on top for visibility */}\n {packageBounds && Object.keys(packageBounds).length > 0 && (\n <g className=\"package-boundaries\" pointerEvents=\"none\">\n {Object.entries(packageBounds).map(([pid, b]) => (\n <g key={pid}>\n <circle\n cx={b.x}\n cy={b.y}\n r={b.r}\n fill=\"rgba(148,163,184,0.06)\"\n stroke=\"#475569\"\n strokeWidth={2}\n strokeDasharray=\"6 6\"\n opacity={0.9}\n />\n <text\n x={b.x}\n y={Math.max(12, b.y - b.r + 14)}\n fill=\"#475569\"\n fontSize={11}\n textAnchor=\"middle\"\n pointerEvents=\"none\"\n >\n {pid.replace(/^pkg:/, '')}\n </text>\n </g>\n ))}\n </g>\n )}\n </g>\n </svg>\n );\n }\n);\n\nForceDirectedGraph.displayName = 'ForceDirectedGraph';","import React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface GraphControlsProps {\n /**\n * Whether dragging is enabled\n */\n dragEnabled?: boolean;\n\n /**\n * Callback to toggle drag mode\n */\n onDragToggle?: (enabled: boolean) => void;\n\n /**\n * Whether manual layout mode is enabled\n */\n manualLayout?: boolean;\n\n /**\n * Callback to toggle manual layout mode\n */\n onManualLayoutToggle?: (enabled: boolean) => void;\n\n /**\n * Callback to pin all nodes\n */\n onPinAll?: () => void;\n\n /**\n * Callback to unpin all nodes\n */\n onUnpinAll?: () => void;\n\n /**\n * Callback to center/reset the view\n */\n onReset?: () => void;\n\n /**\n * Callback to fit all nodes in view\n */\n onFitView?: () => void;\n\n /**\n * Number of pinned nodes\n */\n pinnedCount?: number;\n\n /**\n * Total number of nodes\n */\n totalNodes?: number;\n\n /**\n * Whether to show the controls\n * @default true\n */\n visible?: boolean;\n\n /**\n * Position of the controls\n * @default \"top-left\"\n */\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n\n /**\n * Additional CSS classes\n */\n className?: string;\n}\n\n/**\n * GraphControls: Floating toolbar for manipulating graph layout and dragging\n * Provides controls for toggling drag mode, manual layout, pinning nodes, and resetting the view\n */\nexport const GraphControls: React.FC<GraphControlsProps> = ({\n dragEnabled = true,\n onDragToggle,\n manualLayout = false,\n onManualLayoutToggle,\n onPinAll,\n onUnpinAll,\n onReset,\n onFitView,\n pinnedCount = 0,\n totalNodes = 0,\n visible = true,\n position = 'top-left',\n className,\n}) => {\n\n if (!visible) return null;\n\n const positionClasses: Record<string, string> = {\n 'top-left': 'top-4 left-4',\n 'top-right': 'top-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'bottom-right': 'bottom-4 right-4',\n };\n\n const ControlButton: React.FC<{\n onClick: () => void;\n active?: boolean;\n icon: string;\n label: string;\n disabled?: boolean;\n }> = ({ onClick, active = false, icon, label, disabled = false }) => (\n <div className=\"relative group\">\n <button\n onClick={onClick}\n disabled={disabled}\n className={cn(\n 'p-2 rounded-lg transition-all duration-200',\n active\n ? 'bg-blue-500 text-white shadow-md hover:bg-blue-600'\n : 'bg-gray-100 text-gray-700 hover:bg-gray-200',\n disabled && 'opacity-50 cursor-not-allowed hover:bg-gray-100',\n 'dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600 dark:active:bg-blue-600'\n )}\n title={label}\n >\n <span className=\"text-lg\">{icon}</span>\n </button>\n <div className=\"absolute left-full ml-2 px-2 py-1 bg-gray-900 text-white text-xs rounded whitespace-nowrap opacity-0 group-hover:opacity-100 transition-opacity duration-200 pointer-events-none z-50\">\n {label}\n </div>\n </div>\n );\n\n return (\n <div\n className={cn(\n 'fixed z-40 bg-white dark:bg-gray-800 rounded-lg shadow-lg p-2 border border-gray-200 dark:border-gray-700',\n positionClasses[position],\n className\n )}\n >\n <div className=\"flex flex-col gap-2\">\n {/* Drag Mode Toggle */}\n <ControlButton\n onClick={() => onDragToggle?.(!dragEnabled)}\n active={dragEnabled}\n icon=\"✋\"\n label={dragEnabled ? 'Drag enabled' : 'Drag disabled'}\n />\n\n {/* Manual Layout Toggle */}\n <ControlButton\n onClick={() => onManualLayoutToggle?.(!manualLayout)}\n active={manualLayout}\n icon=\"🔧\"\n label={manualLayout ? 'Manual layout: ON (drag freely)' : 'Manual layout: OFF (forces active)'}\n />\n\n {/* Divider */}\n <div className=\"w-8 h-px bg-gray-300 dark:bg-gray-600 mx-auto my-1\" />\n\n {/* Pin/Unpin Controls */}\n <div className=\"flex gap-1\">\n <ControlButton\n onClick={() => onPinAll?.()}\n disabled={totalNodes === 0}\n icon=\"📌\"\n label={`Pin all nodes (${totalNodes})`}\n />\n <ControlButton\n onClick={() => onUnpinAll?.()}\n disabled={pinnedCount === 0}\n icon=\"📍\"\n label={`Unpin all (${pinnedCount} pinned)`}\n />\n </div>\n\n {/* Divider */}\n <div className=\"w-8 h-px bg-gray-300 dark:bg-gray-600 mx-auto my-1\" />\n\n {/* View Controls */}\n <ControlButton\n onClick={() => onFitView?.()}\n disabled={totalNodes === 0}\n icon=\"🎯\"\n label=\"Fit all nodes in view\"\n />\n\n <ControlButton\n onClick={() => onReset?.()}\n disabled={totalNodes === 0}\n icon=\"↺\"\n label=\"Reset to auto-layout\"\n />\n </div>\n\n {/* Info Panel */}\n <div className=\"mt-3 pt-3 border-t border-gray-200 dark:border-gray-700 text-xs text-gray-600 dark:text-gray-400\">\n <div className=\"whitespace-nowrap\">\n <strong>Nodes:</strong> {totalNodes}\n </div>\n {pinnedCount > 0 && (\n <div className=\"whitespace-nowrap\">\n <strong>Pinned:</strong> {pinnedCount}\n </div>\n )}\n <div className=\"mt-2 text-gray-500 dark:text-gray-500 leading-snug\">\n <strong>Tips:</strong>\n <ul className=\"mt-1 ml-1 space-y-0.5\">\n <li>• Drag nodes to reposition</li>\n <li>• Double-click to pin/unpin</li>\n <li>• Double-click canvas to unpin all</li>\n <li>• Scroll to zoom</li>\n </ul>\n </div>\n </div>\n </div>\n );\n};\n\nGraphControls.displayName = 'GraphControls';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/cn.ts","../src/components/button.tsx","../src/components/card.tsx","../src/components/input.tsx","../src/components/label.tsx","../src/components/badge.tsx","../src/components/container.tsx","../src/components/grid.tsx","../src/components/stack.tsx","../src/components/separator.tsx","../src/components/checkbox.tsx","../src/components/radio-group.tsx","../src/components/switch.tsx","../src/components/textarea.tsx","../src/components/select.tsx","../src/code-block/CodeBlock.tsx","../src/navigation/Breadcrumb.tsx","../src/data-display/ScoreBar.tsx","../src/feedback/LoadingSpinner.tsx","../src/feedback/ErrorDisplay.tsx","../src/theme/ThemeProvider.tsx","../src/utils/colors.ts","../src/utils/formatters.ts","../src/hooks/useDebounce.ts","../src/hooks/useD3.ts","../src/hooks/useForceSimulation.ts","../src/charts/NodeItem.tsx","../src/charts/LinkItem.tsx","../src/charts/ForceDirectedGraph.tsx","../src/charts/GraphControls.tsx"],"names":["React","jsx","React3","cva","React4","React5","React6","React7","React8","React9","React10","jsxs","React11","React12","React13","Separator","useState","useEffect","d3","useRef","d32","e","forwardRef","useCallback","zoom"],"mappings":"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","file":"index.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Merges class names using clsx and tailwind-merge\n * @param inputs - Class values to merge\n * @returns Merged class names\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../utils/cn';\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n destructive:\n 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n outline:\n 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',\n secondary:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-10 px-4 py-2',\n sm: 'h-9 rounded-md px-3',\n lg: 'h-11 rounded-md px-8',\n icon: 'h-10 w-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, ...props }, ref) => {\n return (\n <button\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n }\n);\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'rounded-lg border bg-card text-card-foreground shadow-sm',\n className\n )}\n {...props}\n />\n));\nCard.displayName = 'Card';\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex flex-col space-y-1.5 p-6', className)}\n {...props}\n />\n));\nCardHeader.displayName = 'CardHeader';\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n 'text-2xl font-semibold leading-none tracking-tight',\n className\n )}\n {...props}\n />\n));\nCardTitle.displayName = 'CardTitle';\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n));\nCardDescription.displayName = 'CardDescription';\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />\n));\nCardContent.displayName = 'CardContent';\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex items-center p-6 pt-0', className)}\n {...props}\n />\n));\nCardFooter.displayName = 'CardFooter';\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n 'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\nInput.displayName = 'Input';\n\nexport { Input };","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../utils/cn';\n\nconst labelVariants = cva(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70'\n);\n\nexport interface LabelProps\n extends React.LabelHTMLAttributes<HTMLLabelElement>,\n VariantProps<typeof labelVariants> {}\n\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({ className, ...props }, ref) => (\n <label\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n )\n);\nLabel.displayName = 'Label';\n\nexport { Label };","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../utils/cn';\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n default:\n 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\n secondary:\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\n destructive:\n 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80',\n outline: 'text-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n );\n}\n\nexport { Badge, badgeVariants };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n}\n\nconst Container = React.forwardRef<HTMLDivElement, ContainerProps>(\n ({ className, size = 'lg', ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'mx-auto w-full px-4 sm:px-6 lg:px-8',\n {\n 'max-w-screen-sm': size === 'sm',\n 'max-w-screen-md': size === 'md',\n 'max-w-screen-lg': size === 'lg',\n 'max-w-screen-xl': size === 'xl',\n 'max-w-full': size === 'full',\n },\n className\n )}\n {...props}\n />\n );\n }\n);\nContainer.displayName = 'Container';\n\nexport { Container };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface GridProps extends React.HTMLAttributes<HTMLDivElement> {\n cols?: 1 | 2 | 3 | 4 | 5 | 6 | 12;\n gap?: 'sm' | 'md' | 'lg' | 'xl';\n}\n\nconst Grid = React.forwardRef<HTMLDivElement, GridProps>(\n ({ className, cols = 3, gap = 'md', ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'grid',\n {\n 'grid-cols-1': cols === 1,\n 'grid-cols-1 sm:grid-cols-2': cols === 2,\n 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3': cols === 3,\n 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4': cols === 4,\n 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-5': cols === 5,\n 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-6': cols === 6,\n 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-12': cols === 12,\n },\n {\n 'gap-2': gap === 'sm',\n 'gap-4': gap === 'md',\n 'gap-6': gap === 'lg',\n 'gap-8': gap === 'xl',\n },\n className\n )}\n {...props}\n />\n );\n }\n);\nGrid.displayName = 'Grid';\n\nexport { Grid };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface StackProps extends React.HTMLAttributes<HTMLDivElement> {\n direction?: 'horizontal' | 'vertical';\n spacing?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n align?: 'start' | 'center' | 'end' | 'stretch';\n justify?: 'start' | 'center' | 'end' | 'between' | 'around';\n}\n\nconst Stack = React.forwardRef<HTMLDivElement, StackProps>(\n (\n {\n className,\n direction = 'vertical',\n spacing = 'md',\n align = 'stretch',\n justify = 'start',\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'flex',\n {\n 'flex-col': direction === 'vertical',\n 'flex-row': direction === 'horizontal',\n },\n {\n 'gap-1': spacing === 'xs',\n 'gap-2': spacing === 'sm',\n 'gap-4': spacing === 'md',\n 'gap-6': spacing === 'lg',\n 'gap-8': spacing === 'xl',\n },\n {\n 'items-start': align === 'start',\n 'items-center': align === 'center',\n 'items-end': align === 'end',\n 'items-stretch': align === 'stretch',\n },\n {\n 'justify-start': justify === 'start',\n 'justify-center': justify === 'center',\n 'justify-end': justify === 'end',\n 'justify-between': justify === 'between',\n 'justify-around': justify === 'around',\n },\n className\n )}\n {...props}\n />\n );\n }\n);\nStack.displayName = 'Stack';\n\nexport { Stack };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: 'horizontal' | 'vertical';\n decorative?: boolean;\n}\n\nconst Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(\n (\n { className, orientation = 'horizontal', decorative = true, ...props },\n ref\n ) => (\n <div\n ref={ref}\n role={decorative ? 'none' : 'separator'}\n aria-orientation={orientation}\n className={cn(\n 'shrink-0 bg-border',\n orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]',\n className\n )}\n {...props}\n />\n )\n);\nSeparator.displayName = 'Separator';\n\nexport { Separator };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface CheckboxProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n label?: string;\n}\n\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ className, label, id, ...props }, ref) => {\n const checkboxId = id || React.useId();\n \n return (\n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id={checkboxId}\n ref={ref}\n className={cn(\n 'h-4 w-4 rounded border-gray-300 text-primary focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n {...props}\n />\n {label && (\n <label\n htmlFor={checkboxId}\n className=\"ml-2 text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n </label>\n )}\n </div>\n );\n }\n);\nCheckbox.displayName = 'Checkbox';\n\nexport { Checkbox };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface RadioOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface RadioGroupProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n options: RadioOption[];\n value?: string;\n onChange?: (value: string) => void;\n name: string;\n orientation?: 'horizontal' | 'vertical';\n}\n\nconst RadioGroup = React.forwardRef<HTMLDivElement, RadioGroupProps>(\n (\n {\n className,\n options,\n value,\n onChange,\n name,\n orientation = 'vertical',\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'flex',\n orientation === 'vertical' ? 'flex-col gap-2' : 'flex-row gap-4',\n className\n )}\n {...props}\n >\n {options.map((option) => {\n const id = `${name}-${option.value}`;\n return (\n <div key={option.value} className=\"flex items-center\">\n <input\n type=\"radio\"\n id={id}\n name={name}\n value={option.value}\n checked={value === option.value}\n disabled={option.disabled}\n onChange={(e) => onChange?.(e.target.value)}\n className=\"h-4 w-4 border-gray-300 text-primary focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n />\n <label\n htmlFor={id}\n className=\"ml-2 text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {option.label}\n </label>\n </div>\n );\n })}\n </div>\n );\n }\n);\nRadioGroup.displayName = 'RadioGroup';\n\nexport { RadioGroup };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface SwitchProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n label?: string;\n onCheckedChange?: (checked: boolean) => void;\n}\n\nconst Switch = React.forwardRef<HTMLInputElement, SwitchProps>(\n ({ className, label, id, checked, onCheckedChange, onChange, ...props }, ref) => {\n const switchId = id || React.useId();\n \n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e);\n onCheckedChange?.(e.target.checked);\n };\n \n return (\n <div className=\"flex items-center\">\n <label htmlFor={switchId} className=\"relative inline-flex cursor-pointer items-center\">\n <input\n type=\"checkbox\"\n id={switchId}\n ref={ref}\n checked={checked}\n onChange={handleChange}\n className=\"peer sr-only\"\n {...props}\n />\n <div\n className={cn(\n 'peer h-6 w-11 rounded-full bg-gray-200 after:absolute after:left-[2px] after:top-[2px] after:h-5 after:w-5 after:rounded-full after:border after:border-gray-300 after:bg-white after:transition-all after:content-[\"\"] peer-checked:bg-primary peer-checked:after:translate-x-full peer-checked:after:border-white peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-ring peer-focus:ring-offset-2 peer-disabled:cursor-not-allowed peer-disabled:opacity-50',\n className\n )}\n />\n </label>\n {label && (\n <span className=\"ml-3 text-sm font-medium text-foreground\">\n {label}\n </span>\n )}\n </div>\n );\n }\n);\nSwitch.displayName = 'Switch';\n\nexport { Switch };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface TextareaProps\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n 'flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\nTextarea.displayName = 'Textarea';\n\nexport { Textarea };","import * as React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface SelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps\n extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, 'onChange'> {\n options: SelectOption[];\n placeholder?: string;\n onChange?: (value: string) => void;\n}\n\nconst Select = React.forwardRef<HTMLSelectElement, SelectProps>(\n ({ className, options, placeholder, onChange, ...props }, ref) => {\n const handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n onChange?.(e.target.value);\n };\n\n return (\n <select\n ref={ref}\n className={cn(\n 'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n onChange={handleChange}\n {...props}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((option) => (\n <option\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n >\n {option.label}\n </option>\n ))}\n </select>\n );\n }\n);\nSelect.displayName = 'Select';\n\nexport { Select };","'use client';\n\nimport React, { useState, useCallback, useMemo } from 'react';\n\nexport interface CodeBlockProps {\n children: React.ReactNode;\n language?: string;\n showCopy?: boolean;\n showHeader?: boolean;\n className?: string;\n}\n\n// Dedent helper - removes common leading indentation\nfunction dedentCode(code: string): string {\n // Normalize tabs to two spaces\n let normalized = code.replace(/\\t/g, ' ').replace(/[ \\t]+$/gm, '');\n \n const lines = normalized.split('\\n');\n if (lines.length <= 1) return normalized.trim();\n\n // Remove leading/trailing empty lines\n let start = 0;\n while (start < lines.length && lines[start].trim() === '') start++;\n let end = lines.length - 1;\n while (end >= 0 && lines[end].trim() === '') end--;\n \n if (start > end) return '';\n const relevantLines = lines.slice(start, end + 1);\n\n // Find minimum indent across non-empty lines\n const nonEmpty = relevantLines.filter((l) => l.trim() !== '');\n const minIndent = nonEmpty.reduce((min, line) => {\n const m = line.match(/^\\s*/)?.[0].length ?? 0;\n return Math.min(min, m);\n }, Infinity);\n\n // Remove common indentation\n const dedented = minIndent === Infinity || minIndent === 0\n ? relevantLines.join('\\n')\n : relevantLines.map((l) => (l.startsWith(' '.repeat(minIndent)) ? l.slice(minIndent) : l)).join('\\n');\n \n return dedented;\n}\n\n// Simple Copy Button\nfunction CopyButton({ code }: { code: string }) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Fallback for older browsers\n const textarea = document.createElement('textarea');\n textarea.value = code;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n }, [code]);\n\n return (\n <button\n onClick={handleCopy}\n className=\"rounded-md p-1.5 text-slate-400 hover:text-slate-200 hover:bg-slate-700/50 transition-colors\"\n title={copied ? 'Copied!' : 'Copy code'}\n >\n {copied ? (\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth=\"1.5\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" />\n </svg>\n ) : (\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth=\"1.5\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.666 3.888A2.25 2.25 0 0013.5 2.25h-3c-1.03 0-1.9.693-2.166 1.638m7.332 0c.055.194.084.4.084.612v0a.75.75 0 01-.75.75H9a.75.75 0 01-.75-.75v0c0-.212.03-.418.084-.612m7.332 0c.646.049 1.288.11 1.927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 01-2.25 2.25H6.75A2.25 2.25 0 014.5 19.5V6.257c0-1.108.806-2.057 1.907-2.185a48.208 48.208 0 011.927-.184\" />\n </svg>\n )}\n </button>\n );\n}\n\nexport function CodeBlock({\n children,\n language = 'typescript',\n showCopy = true,\n showHeader = true,\n className = '',\n}: CodeBlockProps) {\n // Get code string from children\n const codeString = useMemo(() => {\n if (typeof children === 'string') {\n return dedentCode(children);\n }\n // Handle template literal children\n try {\n const raw = React.Children.toArray(children)\n .map((c) => (typeof c === 'string' ? c : typeof c === 'number' ? String(c) : ''))\n .join('');\n return dedentCode(raw);\n } catch {\n return '';\n }\n }, [children]);\n\n return (\n <div className={`group relative my-4 overflow-hidden rounded-xl border border-slate-700 bg-slate-900 shadow-lg ${className}`}>\n {/* Header bar */}\n {showHeader && (\n <div className=\"flex items-center justify-between border-b border-slate-700 bg-slate-800/50 px-4 py-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-1.5\">\n <div className=\"h-3 w-3 rounded-full bg-red-500/50\" />\n <div className=\"h-3 w-3 rounded-full bg-amber-500/50\" />\n <div className=\"h-3 w-3 rounded-full bg-emerald-500/50\" />\n </div>\n <span className=\"ml-2 text-xs font-semibold uppercase tracking-wider text-slate-500 font-mono\">\n {language}\n </span>\n </div>\n {showCopy && <CopyButton code={codeString} />}\n </div>\n )}\n\n {/* Code body */}\n <pre className=\"overflow-x-auto p-4 text-sm leading-relaxed\">\n <code className=\"font-mono block whitespace-pre text-slate-300\">\n {codeString}\n </code>\n </pre>\n </div>\n );\n}\n\n// Inline code component\nexport function InlineCode({ children, className = '' }: { children: React.ReactNode; className?: string }) {\n return (\n <code className={`rounded-md bg-slate-100 px-1.5 py-0.5 text-sm font-mono text-slate-800 ${className}`}>\n {children}\n </code>\n );\n}","'use client';\n\nimport React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n}\n\nexport interface BreadcrumbProps {\n items: BreadcrumbItem[];\n separator?: React.ReactNode;\n className?: string;\n}\n\nconst DefaultSeparator = () => (\n <svg\n className=\"h-4 w-4 text-slate-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"1.5\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" />\n </svg>\n);\n\nexport function Breadcrumb({ items, separator, className }: BreadcrumbProps) {\n const Separator = separator || <DefaultSeparator />;\n\n return (\n <nav className={cn('flex items-center gap-1 text-sm', className)} aria-label=\"Breadcrumb\">\n <ol className=\"flex items-center gap-1\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n \n return (\n <li key={index} className=\"flex items-center gap-1\">\n {index > 0 && (\n <span className=\"flex-shrink-0\">{Separator}</span>\n )}\n {item.href && !isLast ? (\n <a\n href={item.href}\n className=\"text-slate-600 hover:text-slate-900 transition-colors\"\n >\n {item.label}\n </a>\n ) : (\n <span className={isLast ? 'font-medium text-slate-900' : 'text-slate-600'}>\n {item.label}\n </span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}","'use client';\n\nimport { cn } from '../utils/cn';\n\nexport type ScoreRating = 'excellent' | 'good' | 'fair' | 'needs-work' | 'critical';\n\nexport interface ScoreBarProps {\n score: number;\n maxScore?: number;\n label: string;\n showScore?: boolean;\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n}\n\nconst ratingConfig: Record<ScoreRating, { color: string; bgColor: string; label: string }> = {\n excellent: { color: 'bg-green-500', bgColor: 'bg-green-100', label: 'Excellent' },\n good: { color: 'bg-emerald-500', bgColor: 'bg-emerald-100', label: 'Good' },\n fair: { color: 'bg-amber-500', bgColor: 'bg-amber-100', label: 'Fair' },\n 'needs-work': { color: 'bg-orange-500', bgColor: 'bg-orange-100', label: 'Needs Work' },\n critical: { color: 'bg-red-500', bgColor: 'bg-red-100', label: 'Critical' },\n};\n\nfunction getRating(score: number): ScoreRating {\n if (score >= 90) return 'excellent';\n if (score >= 75) return 'good';\n if (score >= 60) return 'fair';\n if (score >= 40) return 'needs-work';\n return 'critical';\n}\n\nconst sizeConfig = {\n sm: { height: 'h-1.5', text: 'text-xs', score: 'text-sm' },\n md: { height: 'h-2', text: 'text-sm', score: 'text-base' },\n lg: { height: 'h-3', text: 'text-base', score: 'text-lg' },\n};\n\nexport function ScoreBar({\n score,\n maxScore = 100,\n label,\n showScore = true,\n size = 'md',\n className,\n}: ScoreBarProps) {\n const percentage = Math.min(100, Math.max(0, (score / maxScore) * 100));\n const rating = getRating(percentage);\n const config = ratingConfig[rating];\n const sizes = sizeConfig[size];\n\n return (\n <div className={cn('space-y-1', className)}>\n <div className=\"flex items-center justify-between\">\n <span className={cn('text-slate-700', sizes.text)}>{label}</span>\n {showScore && (\n <span className={cn('font-bold text-slate-900', sizes.score)}>\n {score}/{maxScore}\n </span>\n )}\n </div>\n <div className={cn('w-full rounded-full bg-slate-200', sizes.height)}>\n <div\n className={cn('rounded-full transition-all duration-500', config.color, sizes.height)}\n style={{ width: `${percentage}%` }}\n />\n </div>\n </div>\n );\n}\n\nexport interface ScoreCardProps {\n score: number;\n title?: string;\n breakdown?: Array<{\n label: string;\n score: number;\n weight?: number;\n }>;\n className?: string;\n}\n\nexport function ScoreCard({ score, title, breakdown, className }: ScoreCardProps) {\n const rating = getRating(score);\n const config = ratingConfig[rating];\n\n return (\n <div className={cn('rounded-xl border-2 border-slate-200 bg-white p-6 shadow-lg', className)}>\n <div className=\"mb-4\">\n <div className=\"text-4xl font-black text-slate-900\">{score}/100</div>\n <div className={cn('text-lg font-bold', `text-${rating === 'excellent' ? 'green' : rating === 'good' ? 'emerald' : rating === 'fair' ? 'amber' : rating === 'needs-work' ? 'orange' : 'red'}-600`)}>\n {config.label} Rating\n </div>\n {title && <p className=\"text-sm text-slate-600 mt-1\">{title}</p>}\n </div>\n\n {breakdown && breakdown.length > 0 && (\n <div className=\"space-y-3\">\n {breakdown.map((item, index) => (\n <ScoreBar\n key={index}\n score={item.score}\n label={item.label}\n size=\"sm\"\n />\n ))}\n </div>\n )}\n\n {breakdown && breakdown.length > 0 && (\n <div className=\"mt-4 text-xs text-slate-600 bg-slate-50 p-3 rounded-lg\">\n <strong>Formula:</strong> {breakdown.map(item => \n `${item.score}×${item.weight || 1}`\n ).join(' + ')} / 100 = {score}\n </div>\n )}\n </div>\n );\n}","'use client';\n\nexport interface LoadingSpinnerProps {\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n}\n\nconst sizeClasses = {\n sm: 'h-4 w-4',\n md: 'h-8 w-8',\n lg: 'h-12 w-12',\n};\n\nexport function LoadingSpinner({ size = 'md', className = '' }: LoadingSpinnerProps) {\n return (\n <div className={`flex items-center justify-center ${className}`}>\n <div\n className={`${sizeClasses[size]} animate-spin rounded-full border-2 border-slate-300 border-t-blue-600`}\n />\n </div>\n );\n}\n\nexport interface LoadingOverlayProps {\n message?: string;\n}\n\nexport function LoadingOverlay({ message = 'Loading...' }: LoadingOverlayProps) {\n return (\n <div className=\"flex flex-col items-center justify-center min-h-[200px] gap-4\">\n <LoadingSpinner size=\"lg\" />\n <p className=\"text-sm text-slate-500 animate-pulse\">{message}</p>\n </div>\n );\n}","'use client';\n\nimport React from 'react';\n\nexport interface ErrorDisplayProps {\n title?: string;\n message: string;\n retry?: () => void;\n retryLabel?: string;\n}\n\nexport function ErrorDisplay({\n title = 'Something went wrong',\n message,\n retry,\n retryLabel = 'Try again',\n}: ErrorDisplayProps) {\n return (\n <div className=\"flex flex-col items-center justify-center min-h-[200px] gap-4 p-8\">\n <div className=\"rounded-full bg-red-100 p-3\">\n <svg\n className=\"h-6 w-6 text-red-600\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"1.5\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z\"\n />\n </svg>\n </div>\n <div className=\"text-center\">\n <h3 className=\"text-lg font-semibold text-slate-900\">{title}</h3>\n <p className=\"mt-2 text-sm text-slate-500\">{message}</p>\n </div>\n {retry && (\n <button\n onClick={retry}\n className=\"mt-2 inline-flex items-center gap-2 rounded-lg bg-blue-600 px-4 py-2 text-sm font-medium text-white hover:bg-blue-700 transition-colors\"\n >\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth=\"1.5\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99\"\n />\n </svg>\n {retryLabel}\n </button>\n )}\n </div>\n );\n}\n\nexport interface EmptyStateProps {\n title: string;\n description?: string;\n icon?: React.ReactNode;\n action?: {\n label: string;\n onClick: () => void;\n };\n}\n\nexport function EmptyState({ title, description, icon, action }: EmptyStateProps) {\n return (\n <div className=\"flex flex-col items-center justify-center min-h-[200px] gap-4 p-8\">\n {icon && <div className=\"rounded-full bg-slate-100 p-3\">{icon}</div>}\n <div className=\"text-center\">\n <h3 className=\"text-lg font-semibold text-slate-900\">{title}</h3>\n {description && <p className=\"mt-2 text-sm text-slate-500\">{description}</p>}\n </div>\n {action && (\n <button\n onClick={action.onClick}\n className=\"mt-2 inline-flex items-center gap-2 rounded-lg bg-blue-600 px-4 py-2 text-sm font-medium text-white hover:bg-blue-700 transition-colors\"\n >\n {action.label}\n </button>\n )}\n </div>\n );\n}","'use client';\n\nimport React, { createContext, useContext, useEffect, useState } from 'react';\n\nexport type Theme = 'dark' | 'light' | 'system';\nexport type EffectiveTheme = 'dark' | 'light';\n\ninterface ThemeContextValue {\n theme: Theme;\n setTheme: (theme: Theme) => void;\n effectiveTheme: EffectiveTheme;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\nconst STORAGE_KEY = 'aiready-theme';\n\nfunction getSystemTheme(): EffectiveTheme {\n if (typeof window === 'undefined') return 'light';\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n}\n\nfunction getStoredTheme(): Theme {\n if (typeof window === 'undefined') return 'system';\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored === 'dark' || stored === 'light' || stored === 'system') {\n return stored;\n }\n } catch {\n // localStorage not available\n }\n return 'system';\n}\n\ninterface ThemeProviderProps {\n children: React.ReactNode;\n defaultTheme?: Theme;\n storageKey?: string;\n}\n\nexport function ThemeProvider({\n children,\n defaultTheme = 'system',\n storageKey = STORAGE_KEY,\n}: ThemeProviderProps) {\n const [theme, setThemeState] = useState<Theme>(defaultTheme);\n const [effectiveTheme, setEffectiveTheme] = useState<EffectiveTheme>('light');\n const [mounted, setMounted] = useState(false);\n\n // Initialize theme from storage on mount\n useEffect(() => {\n const storedTheme = getStoredTheme();\n setThemeState(storedTheme);\n setMounted(true);\n }, []);\n\n // Update effective theme when theme or system preference changes\n useEffect(() => {\n if (!mounted) return;\n\n const updateEffectiveTheme = () => {\n if (theme === 'system') {\n setEffectiveTheme(getSystemTheme());\n } else {\n setEffectiveTheme(theme);\n }\n };\n\n updateEffectiveTheme();\n\n // Listen for system theme changes\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const handleChange = () => {\n if (theme === 'system') {\n setEffectiveTheme(getSystemTheme());\n }\n };\n\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }, [theme, mounted]);\n\n // Apply theme class to document\n useEffect(() => {\n if (!mounted) return;\n\n const root = document.documentElement;\n root.classList.remove('light', 'dark');\n root.classList.add(effectiveTheme);\n }, [effectiveTheme, mounted]);\n\n const setTheme = (newTheme: Theme) => {\n setThemeState(newTheme);\n try {\n localStorage.setItem(storageKey, newTheme);\n } catch {\n // localStorage not available\n }\n };\n\n // Prevent hydration mismatch\n if (!mounted) {\n return (\n <ThemeContext.Provider value={{ theme: defaultTheme, setTheme: () => {}, effectiveTheme: 'light' }}>\n {children}\n </ThemeContext.Provider>\n );\n }\n\n return (\n <ThemeContext.Provider value={{ theme, setTheme, effectiveTheme }}>\n {children}\n </ThemeContext.Provider>\n );\n}\n\nexport function useTheme(): ThemeContextValue {\n const context = useContext(ThemeContext);\n if (context === undefined) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n}","/**\n * Color utilities for charts and visualizations\n */\n\n// Severity colors for issue highlighting\nexport const severityColors = {\n critical: '#ef4444', // red-500\n major: '#f59e0b', // amber-500\n minor: '#eab308', // yellow-500\n info: '#60a5fa', // blue-400\n} as const;\n\n// Domain colors for clustering and categorization\nexport const domainColors = [\n '#3b82f6', // blue-500\n '#8b5cf6', // violet-500\n '#ec4899', // pink-500\n '#10b981', // green-500\n '#f59e0b', // amber-500\n '#06b6d4', // cyan-500\n '#f97316', // orange-500\n '#a855f7', // purple-500\n] as const;\n\n// Chart colors\nexport const chartColors = {\n primary: '#3b82f6',\n success: '#10b981',\n warning: '#f59e0b',\n danger: '#ef4444',\n info: '#06b6d4',\n} as const;\n\n/**\n * Get a color for a domain/category by index\n */\nexport function getDomainColor(index: number): string {\n return domainColors[index % domainColors.length];\n}\n\n/**\n * Get severity color by level\n */\nexport function getSeverityColor(\n severity: keyof typeof severityColors\n): string {\n return severityColors[severity];\n}\n\n/**\n * Convert hex color to RGBA\n */\nexport function hexToRgba(hex: string, alpha: number): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}","/**\n * Number formatting utilities for data visualization\n */\n\n/**\n * Format a number with commas for thousands\n * @example formatNumber(1234567) => \"1,234,567\"\n */\nexport function formatNumber(value: number): string {\n return new Intl.NumberFormat('en-US').format(value);\n}\n\n/**\n * Format a number with K/M/B abbreviations\n * @example formatCompactNumber(1234) => \"1.2K\"\n * @example formatCompactNumber(1234567) => \"1.2M\"\n */\nexport function formatCompactNumber(value: number): string {\n return new Intl.NumberFormat('en-US', {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(value);\n}\n\n/**\n * Format a percentage with optional decimal places\n * @example formatPercentage(0.1234) => \"12.3%\"\n * @example formatPercentage(0.1234, 0) => \"12%\"\n */\nexport function formatPercentage(value: number, decimals: number = 1): string {\n return `${(value * 100).toFixed(decimals)}%`;\n}\n\n/**\n * Format file size in bytes to human-readable format\n * @example formatFileSize(1024) => \"1.0 KB\"\n * @example formatFileSize(1048576) => \"1.0 MB\"\n */\nexport function formatFileSize(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let size = bytes;\n let unitIndex = 0;\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n\n return `${size.toFixed(1)} ${units[unitIndex]}`;\n}\n\n/**\n * Format a date as relative time (e.g., \"2 hours ago\")\n * @example formatRelativeTime(new Date(Date.now() - 3600000)) => \"1 hour ago\"\n */\nexport function formatRelativeTime(date: Date): string {\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n const diffDay = Math.floor(diffHour / 24);\n const diffMonth = Math.floor(diffDay / 30);\n const diffYear = Math.floor(diffDay / 365);\n\n if (diffYear > 0) {\n return `${diffYear} year${diffYear > 1 ? 's' : ''} ago`;\n }\n if (diffMonth > 0) {\n return `${diffMonth} month${diffMonth > 1 ? 's' : ''} ago`;\n }\n if (diffDay > 0) {\n return `${diffDay} day${diffDay > 1 ? 's' : ''} ago`;\n }\n if (diffHour > 0) {\n return `${diffHour} hour${diffHour > 1 ? 's' : ''} ago`;\n }\n if (diffMin > 0) {\n return `${diffMin} minute${diffMin > 1 ? 's' : ''} ago`;\n }\n return 'just now';\n}\n\n/**\n * Format a date in short format (e.g., \"Jan 15, 2024\")\n */\nexport function formatDate(date: Date): string {\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n }).format(date);\n}\n\n/**\n * Format a date with time (e.g., \"Jan 15, 2024 at 3:45 PM\")\n */\nexport function formatDateTime(date: Date): string {\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n }).format(date);\n}\n\n/**\n * Format duration in milliseconds to human-readable format\n * @example formatDuration(3661000) => \"1h 1m 1s\"\n */\nexport function formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m ${seconds % 60}s`;\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n}\n\n/**\n * Format a metric value with appropriate unit and precision\n * Useful for displaying various metrics in charts\n */\nexport function formatMetric(\n value: number,\n unit: 'number' | 'bytes' | 'percentage' | 'duration' = 'number'\n): string {\n switch (unit) {\n case 'bytes':\n return formatFileSize(value);\n case 'percentage':\n return formatPercentage(value);\n case 'duration':\n return formatDuration(value);\n default:\n return formatCompactNumber(value);\n }\n}\n\n/**\n * Format a range of values\n * @example formatRange(100, 200) => \"100 - 200\"\n */\nexport function formatRange(min: number, max: number): string {\n return `${formatCompactNumber(min)} - ${formatCompactNumber(max)}`;\n}\n\n/**\n * Format a number with a specific number of decimal places\n * @example formatDecimal(3.14159, 2) => \"3.14\"\n */\nexport function formatDecimal(value: number, decimals: number = 2): string {\n return value.toFixed(decimals);\n}","import { useEffect, useState } from 'react';\n\n/**\n * Debounce a value with a specified delay\n * Useful for search inputs, filters, and other frequently changing values\n *\n * @param value - The value to debounce\n * @param delay - Delay in milliseconds (default: 300ms)\n * @returns The debounced value\n *\n * @example\n * ```tsx\n * function SearchInput() {\n * const [searchTerm, setSearchTerm] = useState('');\n * const debouncedSearchTerm = useDebounce(searchTerm, 500);\n *\n * useEffect(() => {\n * // This will only run when user stops typing for 500ms\n * if (debouncedSearchTerm) {\n * performSearch(debouncedSearchTerm);\n * }\n * }, [debouncedSearchTerm]);\n *\n * return <input value={searchTerm} onChange={(e) => setSearchTerm(e.target.value)} />;\n * }\n * ```\n */\nexport function useDebounce<T>(value: T, delay: number = 300): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n // Set up the timeout to update debounced value after delay\n const timer = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n // Clean up the timeout if value changes or component unmounts\n return () => {\n clearTimeout(timer);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}","import { useEffect, useRef } from 'react';\nimport * as d3 from 'd3';\n\n/**\n * Hook for managing D3 selections with React lifecycle\n * Provides a ref to the SVG/container element and runs a render function when dependencies change\n *\n * @param renderFn - Function that receives the D3 selection and performs rendering\n * @param dependencies - Array of dependencies that trigger re-render\n * @returns Ref to attach to the SVG/container element\n *\n * @example\n * ```tsx\n * function BarChart({ data }: { data: number[] }) {\n * const ref = useD3(\n * (svg) => {\n * const width = 600;\n * const height = 400;\n * const margin = { top: 20, right: 20, bottom: 30, left: 40 };\n *\n * // Clear previous content\n * svg.selectAll('*').remove();\n *\n * // Set up scales\n * const x = d3.scaleBand()\n * .domain(data.map((_, i) => i.toString()))\n * .range([margin.left, width - margin.right])\n * .padding(0.1);\n *\n * const y = d3.scaleLinear()\n * .domain([0, d3.max(data) || 0])\n * .range([height - margin.bottom, margin.top]);\n *\n * // Draw bars\n * svg.selectAll('rect')\n * .data(data)\n * .join('rect')\n * .attr('x', (_, i) => x(i.toString())!)\n * .attr('y', d => y(d))\n * .attr('width', x.bandwidth())\n * .attr('height', d => y(0) - y(d))\n * .attr('fill', 'steelblue');\n * },\n * [data]\n * );\n *\n * return <svg ref={ref} width={600} height={400} />;\n * }\n * ```\n */\nexport function useD3<T extends SVGSVGElement | HTMLDivElement>(\n renderFn: (selection: d3.Selection<T, unknown, null, undefined>) => void,\n dependencies: React.DependencyList = []\n): React.RefObject<T | null> {\n const ref = useRef<T | null>(null);\n\n useEffect(() => {\n if (ref.current) {\n const selection = d3.select(ref.current);\n renderFn(selection);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n return ref;\n}\n\n/**\n * Hook for managing D3 selections with automatic resize handling\n * Similar to useD3 but also triggers re-render on window resize\n *\n * @param renderFn - Function that receives the D3 selection and performs rendering\n * @param dependencies - Array of dependencies that trigger re-render\n * @returns Ref to attach to the SVG/container element\n *\n * @example\n * ```tsx\n * function ResponsiveChart({ data }: { data: number[] }) {\n * const ref = useD3WithResize(\n * (svg) => {\n * const container = svg.node();\n * const width = container?.clientWidth || 600;\n * const height = container?.clientHeight || 400;\n *\n * // Render with responsive dimensions\n * // ...\n * },\n * [data]\n * );\n *\n * return <svg ref={ref} style={{ width: '100%', height: '400px' }} />;\n * }\n * ```\n */\nexport function useD3WithResize<T extends SVGSVGElement | HTMLDivElement>(\n renderFn: (selection: d3.Selection<T, unknown, null, undefined>) => void,\n dependencies: React.DependencyList = []\n): React.RefObject<T | null> {\n const ref = useRef<T | null>(null);\n\n useEffect(() => {\n if (!ref.current) return;\n\n const selection = d3.select(ref.current);\n const render = () => renderFn(selection);\n\n // Initial render\n render();\n\n // Set up resize observer\n const resizeObserver = new ResizeObserver(() => {\n render();\n });\n\n resizeObserver.observe(ref.current);\n\n // Cleanup\n return () => {\n resizeObserver.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n return ref;\n}","import { useEffect, useRef, useState } from 'react';\nimport * as d3 from 'd3';\n\nexport interface SimulationNode extends d3.SimulationNodeDatum {\n id: string;\n [key: string]: any;\n}\n\nexport interface SimulationLink extends d3.SimulationLinkDatum<SimulationNode> {\n source: string | SimulationNode;\n target: string | SimulationNode;\n [key: string]: any;\n}\n\nexport interface ForceSimulationOptions {\n /**\n * Strength of the charge force (repulsion between nodes)\n * @default -300\n */\n chargeStrength?: number;\n\n /**\n * Distance for links between nodes\n * @default 100\n */\n linkDistance?: number;\n\n /**\n * Strength of the link force\n * @default 1\n */\n linkStrength?: number;\n\n /**\n * Strength of collision detection\n * @default 1\n */\n collisionStrength?: number;\n\n /**\n * Radius for collision detection (node size)\n * @default 10\n */\n collisionRadius?: number;\n\n /**\n * Strength of centering force\n * @default 0.1\n */\n centerStrength?: number;\n\n /**\n * Width of the simulation space\n */\n width: number;\n\n /**\n * Height of the simulation space\n */\n height: number;\n\n /**\n * Alpha decay rate (how quickly the simulation cools down)\n * @default 0.0228\n */\n alphaDecay?: number;\n\n /**\n * Alpha target controls the resting energy of the simulation. When set to 0\n * the simulation will cool and stop moving once forces settle. Increase to\n * keep the graph more dynamic.\n * @default 0\n */\n alphaTarget?: number;\n\n /**\n * Warm alpha used when (re)starting the simulation to give it a small amount\n * of energy. This mirrors the Observable example which sets a modest\n * alphaTarget when dragging instead of forcing alpha to 1.\n * @default 0.3\n */\n warmAlpha?: number;\n\n /**\n * Minimum alpha threshold below which the simulation is considered cooled\n * and will stop. Increasing this makes the simulation stop earlier.\n * @default 0.01\n */\n alphaMin?: number;\n\n /**\n * When true, zero node velocities and snap positions when the simulation\n * stops to reduce residual jitter.\n * @default true\n */\n stabilizeOnStop?: boolean;\n\n /**\n * Maximum time (ms) to allow the simulation to run after creation/restart.\n * If the simulation hasn't cooled by this time, it will be force-stopped\n * to prevent indefinite animation. Set to 0 to disable.\n * @default 3000\n */\n maxSimulationTimeMs?: number;\n\n /**\n * Velocity decay (friction)\n * @default 0.4\n */\n velocityDecay?: number;\n\n /**\n * Optional tick callback invoked on each simulation tick with current nodes/links and the simulation instance\n */\n onTick?: (nodes: SimulationNode[], links: SimulationLink[], sim: d3.Simulation<SimulationNode, SimulationLink>) => void;\n}\n\nexport interface UseForceSimulationReturn {\n /**\n * Current nodes with positions\n */\n nodes: SimulationNode[];\n\n /**\n * Current links\n */\n links: SimulationLink[];\n\n /**\n * Restart the simulation\n */\n restart: () => void;\n\n /**\n * Stop the simulation\n */\n stop: () => void;\n\n /**\n * Whether the simulation is currently running\n */\n isRunning: boolean;\n\n /**\n * Current alpha value (simulation heat)\n */\n alpha: number;\n}\n\n/**\n * Hook for managing d3-force simulations\n * Automatically handles simulation lifecycle, tick updates, and cleanup\n *\n * @param initialNodes - Initial nodes for the simulation\n * @param initialLinks - Initial links for the simulation\n * @param options - Configuration options for the force simulation\n * @returns Simulation state and control functions\n *\n * @example\n * ```tsx\n * function NetworkGraph() {\n * const nodes = [\n * { id: 'node1', name: 'Node 1' },\n * { id: 'node2', name: 'Node 2' },\n * { id: 'node3', name: 'Node 3' },\n * ];\n *\n * const links = [\n * { source: 'node1', target: 'node2' },\n * { source: 'node2', target: 'node3' },\n * ];\n *\n * const { nodes: simulatedNodes, links: simulatedLinks, restart } = useForceSimulation(\n * nodes,\n * links,\n * {\n * width: 800,\n * height: 600,\n * chargeStrength: -500,\n * linkDistance: 150,\n * }\n * );\n *\n * return (\n * <svg width={800} height={600}>\n * {simulatedLinks.map((link, i) => (\n * <line\n * key={i}\n * x1={(link.source as SimulationNode).x}\n * y1={(link.source as SimulationNode).y}\n * x2={(link.target as SimulationNode).x}\n * y2={(link.target as SimulationNode).y}\n * stroke=\"#999\"\n * />\n * ))}\n * {simulatedNodes.map((node) => (\n * <circle\n * key={node.id}\n * cx={node.x}\n * cy={node.y}\n * r={10}\n * fill=\"#69b3a2\"\n * />\n * ))}\n * </svg>\n * );\n * }\n * ```\n */\nexport function useForceSimulation(\n initialNodes: SimulationNode[],\n initialLinks: SimulationLink[],\n options: ForceSimulationOptions\n): UseForceSimulationReturn & { setForcesEnabled: (enabled: boolean) => void } {\n const {\n chargeStrength = -300,\n linkDistance = 100,\n linkStrength = 1,\n collisionStrength = 1,\n collisionRadius = 10,\n centerStrength = 0.1,\n width,\n height,\n alphaDecay = 0.0228,\n velocityDecay = 0.4,\n alphaTarget = 0,\n warmAlpha = 0.3,\n alphaMin = 0.01,\n // @ts-ignore allow extra option\n stabilizeOnStop = true,\n onTick,\n // Optional throttle in milliseconds for tick updates (reduce React re-renders)\n // Lower values = smoother but more CPU; default ~30ms (~33fps)\n // @ts-ignore allow extra option\n tickThrottleMs = 33,\n // @ts-ignore allow extra option\n maxSimulationTimeMs = 3000,\n } = options;\n\n const [nodes, setNodes] = useState<SimulationNode[]>(initialNodes);\n const [links, setLinks] = useState<SimulationLink[]>(initialLinks);\n const [isRunning, setIsRunning] = useState(false);\n const [alpha, setAlpha] = useState(1);\n\n const simulationRef = useRef<d3.Simulation<SimulationNode, SimulationLink> | null>(null);\n const stopTimeoutRef = useRef<number | null>(null);\n\n // Create lightweight keys for nodes/links so we only recreate the simulation\n // when the actual identity/content of inputs change (not when parent passes\n // new array references on each render).\n const nodesKey = initialNodes.map((n) => n.id).join('|');\n const linksKey = (initialLinks || []).map((l) => {\n const s = typeof l.source === 'string' ? l.source : (l.source as any)?.id;\n const t = typeof l.target === 'string' ? l.target : (l.target as any)?.id;\n return `${s}->${t}:${(l as any).type || ''}`;\n }).join('|');\n\n useEffect(() => {\n // Create a copy of nodes and links to avoid mutating the original data\n const nodesCopy = initialNodes.map((node) => ({ ...node }));\n const linksCopy = initialLinks.map((link) => ({ ...link }));\n\n // ALWAYS seed initial positions to ensure nodes don't stack at origin\n // This is critical for force-directed graphs to work properly\n try {\n // Always seed positions for all nodes when simulation is created\n // This ensures nodes start spread out even if they have coordinates\n nodesCopy.forEach((n, i) => {\n // Use deterministic but more widely spread positions based on index\n const angle = (i * 2 * Math.PI) / nodesCopy.length;\n // Larger seed radius to encourage an initial spread\n const radius = Math.min(width, height) * 0.45;\n n.x = width / 2 + radius * Math.cos(angle);\n n.y = height / 2 + radius * Math.sin(angle);\n // Add very small random velocity to avoid large initial motion\n (n as any).vx = (Math.random() - 0.5) * 2;\n (n as any).vy = (Math.random() - 0.5) * 2;\n });\n } catch (e) {\n // If error, fall back to random positions\n nodesCopy.forEach((n) => {\n n.x = Math.random() * width;\n n.y = Math.random() * height;\n (n as any).vx = (Math.random() - 0.5) * 10;\n (n as any).vy = (Math.random() - 0.5) * 10;\n });\n }\n\n // Create the simulation\n const simulation = (d3.forceSimulation(nodesCopy as any) as unknown) as d3.Simulation<SimulationNode, SimulationLink>;\n\n // Configure link force separately to avoid using generic type args on d3 helpers\n try {\n const linkForce = (d3.forceLink(linksCopy as any) as unknown) as d3.ForceLink<SimulationNode, SimulationLink>;\n linkForce.id((d: any) => d.id).distance((d: any) => (d && d.distance != null ? d.distance : linkDistance)).strength(linkStrength);\n simulation.force('link', linkForce as any);\n } catch (e) {\n // fallback: attach a plain link force\n try { simulation.force('link', d3.forceLink(linksCopy as any) as any); } catch (e) {}\n }\n ;\n\n try {\n simulation.force('charge', d3.forceManyBody().strength(chargeStrength) as any);\n simulation.force('center', d3.forceCenter(width / 2, height / 2).strength(centerStrength) as any);\n const collide = d3.forceCollide().radius((d: any) => {\n const nodeSize = (d && d.size) ? d.size : 10;\n return nodeSize + collisionRadius;\n }).strength(collisionStrength as any) as any;\n simulation.force('collision', collide);\n simulation.force('x', d3.forceX(width / 2).strength(Math.max(0.02, centerStrength * 0.5)) as any);\n simulation.force('y', d3.forceY(height / 2).strength(Math.max(0.02, centerStrength * 0.5)) as any);\n simulation.alphaDecay(alphaDecay);\n simulation.velocityDecay(velocityDecay);\n simulation.alphaMin(alphaMin);\n try { simulation.alphaTarget(alphaTarget); } catch (e) {}\n try { simulation.alpha(warmAlpha); } catch (e) {}\n } catch (e) {\n // ignore force configuration errors\n }\n\n simulationRef.current = simulation;\n\n // Force-stop timeout to ensure simulation doesn't run forever.\n if (stopTimeoutRef.current != null) {\n try { (globalThis.clearTimeout as any)(stopTimeoutRef.current); } catch (e) {}\n stopTimeoutRef.current = null;\n }\n if (maxSimulationTimeMs && maxSimulationTimeMs > 0) {\n stopTimeoutRef.current = (globalThis.setTimeout as any)(() => {\n try {\n if (stabilizeOnStop) {\n nodesCopy.forEach((n) => {\n (n as any).vx = 0;\n (n as any).vy = 0;\n if (typeof n.x === 'number') n.x = Number(n.x.toFixed(3));\n if (typeof n.y === 'number') n.y = Number(n.y.toFixed(3));\n });\n }\n simulation.alpha(0);\n simulation.stop();\n } catch (e) {}\n setIsRunning(false);\n setNodes([...nodesCopy]);\n setLinks([...linksCopy]);\n }, maxSimulationTimeMs) as unknown as number;\n }\n\n // Update state on each tick. Batch updates via requestAnimationFrame to avoid\n // excessive React re-renders which can cause visual flicker.\n let rafId: number | null = null;\n let lastUpdate = 0;\n const tickHandler = () => {\n try {\n if (typeof onTick === 'function') onTick(nodesCopy, linksCopy, simulation);\n } catch (e) {\n // ignore user tick errors\n }\n\n // If simulation alpha has cooled below the configured minimum, stop it to\n // ensure nodes don't drift indefinitely (acts as a hard-stop safeguard).\n try {\n if (simulation.alpha() <= (alphaMin as number)) {\n try {\n if (stabilizeOnStop) {\n nodesCopy.forEach((n) => {\n (n as any).vx = 0;\n (n as any).vy = 0;\n if (typeof n.x === 'number') n.x = Number(n.x.toFixed(3));\n if (typeof n.y === 'number') n.y = Number(n.y.toFixed(3));\n });\n }\n simulation.stop();\n } catch (e) {}\n setAlpha(simulation.alpha());\n setIsRunning(false);\n setNodes([...nodesCopy]);\n setLinks([...linksCopy]);\n return;\n }\n } catch (e) {\n // ignore\n }\n\n const now = Date.now();\n const shouldUpdate = now - lastUpdate >= (tickThrottleMs as number);\n if (rafId == null && shouldUpdate) {\n rafId = (globalThis.requestAnimationFrame || ((cb: FrameRequestCallback) => setTimeout(cb, 16)))(() => {\n rafId = null;\n lastUpdate = Date.now();\n setNodes([...nodesCopy]);\n setLinks([...linksCopy]);\n setAlpha(simulation.alpha());\n setIsRunning(simulation.alpha() > simulation.alphaMin());\n }) as unknown as number;\n }\n };\n\n simulation.on('tick', tickHandler);\n\n simulation.on('end', () => {\n setIsRunning(false);\n });\n\n // Cleanup on unmount\n return () => {\n try {\n simulation.on('tick', null as any);\n } catch (e) {}\n if (stopTimeoutRef.current != null) {\n try { (globalThis.clearTimeout as any)(stopTimeoutRef.current); } catch (e) {}\n stopTimeoutRef.current = null;\n }\n if (rafId != null) {\n try { (globalThis.cancelAnimationFrame || ((id: number) => clearTimeout(id)))(rafId); } catch (e) {}\n rafId = null;\n }\n simulation.stop();\n };\n }, [\n nodesKey,\n linksKey,\n chargeStrength,\n linkDistance,\n linkStrength,\n collisionStrength,\n collisionRadius,\n centerStrength,\n width,\n height,\n alphaDecay,\n velocityDecay,\n alphaTarget,\n alphaMin,\n stabilizeOnStop,\n tickThrottleMs,\n maxSimulationTimeMs,\n ]);\n\n const restart = () => {\n if (simulationRef.current) {\n // Reheat the simulation to a modest alpha target rather than forcing\n // full heat; this matches the Observable pattern and helps stability.\n try { simulationRef.current.alphaTarget(warmAlpha).restart(); } catch (e) { simulationRef.current.restart(); }\n setIsRunning(true);\n // Reset safety timeout when simulation is manually restarted\n if (stopTimeoutRef.current != null) {\n try { (globalThis.clearTimeout as any)(stopTimeoutRef.current); } catch (e) {}\n stopTimeoutRef.current = null;\n }\n if (maxSimulationTimeMs && maxSimulationTimeMs > 0) {\n stopTimeoutRef.current = (globalThis.setTimeout as any)(() => {\n try { simulationRef.current?.alpha(0); simulationRef.current?.stop(); } catch (e) {}\n setIsRunning(false);\n }, maxSimulationTimeMs) as unknown as number;\n }\n }\n };\n\n const stop = () => {\n if (simulationRef.current) {\n simulationRef.current.stop();\n setIsRunning(false);\n }\n };\n\n const originalForcesRef = useRef({ charge: chargeStrength, link: linkStrength, collision: collisionStrength });\n const forcesEnabledRef = useRef(true);\n\n const setForcesEnabled = (enabled: boolean) => {\n const sim = simulationRef.current;\n if (!sim) return;\n // avoid repeated updates\n if (forcesEnabledRef.current === enabled) return;\n forcesEnabledRef.current = enabled;\n\n try {\n // Only toggle charge and link forces to avoid collapse; keep collision/centering\n const charge: any = sim.force('charge');\n if (charge && typeof charge.strength === 'function') {\n charge.strength(enabled ? originalForcesRef.current.charge : 0);\n }\n\n const link: any = sim.force('link');\n if (link && typeof link.strength === 'function') {\n link.strength(enabled ? originalForcesRef.current.link : 0);\n }\n } catch (e) {\n // ignore\n }\n };\n\n return {\n nodes,\n links,\n restart,\n stop,\n isRunning,\n alpha,\n setForcesEnabled,\n };\n}\n\n/**\n * Hook for creating a draggable force simulation\n * Provides drag handlers that can be attached to node elements\n *\n * @param simulation - The d3 force simulation instance\n * @returns Drag behavior that can be applied to nodes\n *\n * @example\n * ```tsx\n * function DraggableNetworkGraph() {\n * const simulation = useRef<d3.Simulation<SimulationNode, SimulationLink>>();\n * const drag = useDrag(simulation.current);\n *\n * return (\n * <svg>\n * {nodes.map((node) => (\n * <circle\n * key={node.id}\n * {...drag}\n * cx={node.x}\n * cy={node.y}\n * r={10}\n * />\n * ))}\n * </svg>\n * );\n * }\n * ```\n */\nexport function useDrag(simulation: d3.Simulation<SimulationNode, any> | null | undefined) {\n const dragStarted = (event: any, node: SimulationNode) => {\n if (!simulation) return;\n if (!event.active) simulation.alphaTarget(0.3).restart();\n node.fx = node.x;\n node.fy = node.y;\n };\n\n const dragged = (event: any, node: SimulationNode) => {\n node.fx = event.x;\n node.fy = event.y;\n };\n\n const dragEnded = (event: any, node: SimulationNode) => {\n if (!simulation) return;\n if (!event.active) simulation.alphaTarget(0);\n node.fx = null;\n node.fy = null;\n };\n\n return {\n onDragStart: dragStarted,\n onDrag: dragged,\n onDragEnd: dragEnded,\n };\n}","import React from 'react';\nimport type { GraphNode } from './ForceDirectedGraph';\n\nexport interface NodeItemProps {\n node: GraphNode;\n isSelected: boolean;\n isHovered: boolean;\n pinned: boolean;\n defaultNodeSize: number;\n defaultNodeColor: string;\n showLabel?: boolean;\n onClick?: (n: GraphNode) => void;\n onDoubleClick?: (e: React.MouseEvent, n: GraphNode) => void;\n onMouseEnter?: (n: GraphNode) => void;\n onMouseLeave?: () => void;\n onMouseDown?: (e: React.MouseEvent, n: GraphNode) => void;\n}\n\nexport const NodeItem: React.FC<NodeItemProps> = ({\n node,\n isSelected,\n isHovered,\n pinned,\n defaultNodeSize,\n defaultNodeColor,\n showLabel = true,\n onClick,\n onDoubleClick,\n onMouseEnter,\n onMouseLeave,\n onMouseDown,\n}) => {\n const nodeSize = node.size || defaultNodeSize;\n const nodeColor = node.color || defaultNodeColor;\n\n const x = node.x ?? 0;\n const y = node.y ?? 0;\n\n return (\n <g\n key={node.id}\n className=\"cursor-pointer node\"\n data-id={node.id}\n transform={`translate(${x},${y})`}\n onClick={() => onClick?.(node)}\n onDoubleClick={(e) => onDoubleClick?.(e, node)}\n onMouseEnter={() => onMouseEnter?.(node)}\n onMouseLeave={() => onMouseLeave?.()}\n onMouseDown={(e) => onMouseDown?.(e, node)}\n >\n <circle\n r={nodeSize}\n fill={nodeColor}\n stroke={isSelected ? '#000' : isHovered ? '#666' : 'none'}\n strokeWidth={pinned ? 3 : isSelected ? 2.5 : isHovered ? 2 : 1.5}\n opacity={isHovered || isSelected ? 1 : 0.9}\n />\n {pinned && (\n <circle r={nodeSize + 4} fill=\"none\" stroke=\"#ff6b6b\" strokeWidth={1} opacity={0.5} className=\"pointer-events-none\" />\n )}\n {showLabel && node.label && (\n <text y={nodeSize + 15} fill=\"#333\" fontSize=\"12\" textAnchor=\"middle\" dominantBaseline=\"middle\" pointerEvents=\"none\" className=\"select-none\">\n {node.label}\n </text>\n )}\n </g>\n );\n};\n\nexport default NodeItem;\n","import React from 'react';\nimport type { GraphLink, GraphNode } from './ForceDirectedGraph';\n\nexport interface LinkItemProps {\n link: GraphLink;\n onClick?: (l: GraphLink) => void;\n defaultWidth?: number;\n showLabel?: boolean;\n nodes?: GraphNode[]; // Optional nodes array to resolve string IDs to node objects\n}\n\nexport const LinkItem: React.FC<LinkItemProps> = ({ link, onClick, defaultWidth, showLabel = true, nodes = [] }) => {\n const src = (link.source as any)?.id ?? (typeof link.source === 'string' ? link.source : undefined);\n const tgt = (link.target as any)?.id ?? (typeof link.target === 'string' ? link.target : undefined);\n\n // Helper to get node position from source/target (which could be node object or string ID)\n const getNodePosition = (nodeOrId: string | GraphNode): { x: number; y: number } | null => {\n if (typeof nodeOrId === 'object' && nodeOrId !== null) {\n // It's a node object\n const node = nodeOrId as GraphNode;\n return { x: node.x ?? 0, y: node.y ?? 0 };\n } else if (typeof nodeOrId === 'string') {\n // It's a string ID, try to find in nodes array\n const found = nodes.find(n => n.id === nodeOrId);\n if (found) return { x: found.x ?? 0, y: found.y ?? 0 };\n }\n return null;\n };\n\n const sourcePos = getNodePosition(link.source);\n const targetPos = getNodePosition(link.target);\n\n // If we can't get positions, render nothing (or a placeholder)\n if (!sourcePos || !targetPos) {\n return null;\n }\n\n // Calculate midpoint for label positioning\n const midX = (sourcePos.x + targetPos.x) / 2;\n const midY = (sourcePos.y + targetPos.y) / 2;\n\n return (\n <g>\n <line\n x1={sourcePos.x}\n y1={sourcePos.y}\n x2={targetPos.x}\n y2={targetPos.y}\n data-source={src}\n data-target={tgt}\n stroke={link.color}\n strokeWidth={link.width ?? defaultWidth ?? 1}\n opacity={0.6}\n className=\"cursor-pointer transition-opacity hover:opacity-100\"\n onClick={() => onClick?.(link)}\n />\n {showLabel && link.label && (\n <text\n x={midX}\n y={midY}\n fill=\"#666\"\n fontSize=\"10\"\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n pointerEvents=\"none\"\n >\n {link.label}\n </text>\n )}\n </g>\n );\n};\n\nexport default LinkItem;\n","import React, { useCallback, useEffect, useRef, useState, forwardRef, useImperativeHandle } from 'react';\nimport * as d3 from 'd3';\nimport { cn } from '../utils/cn';\nimport NodeItem from './NodeItem';\nimport LinkItem from './LinkItem';\n\nexport interface GraphNode {\n id: string;\n label?: string;\n color?: string;\n size?: number;\n group?: string;\n kind?: 'file' | 'package';\n packageGroup?: string;\n x?: number;\n y?: number;\n fx?: number | null;\n fy?: number | null;\n}\n\nexport interface GraphLink {\n source: string | GraphNode;\n target: string | GraphNode;\n color?: string;\n width?: number;\n label?: string;\n type?: string;\n}\n\nexport type LayoutType = 'force' | 'hierarchical' | 'circular';\n\nexport interface ForceDirectedGraphHandle {\n pinAll: () => void;\n unpinAll: () => void;\n resetLayout: () => void;\n fitView: () => void;\n getPinnedNodes: () => string[];\n setDragMode: (enabled: boolean) => void;\n setLayout: (layout: LayoutType) => void;\n getLayout: () => LayoutType;\n}\n\nexport interface ForceDirectedGraphProps {\n nodes: GraphNode[];\n links: GraphLink[];\n width: number;\n height: number;\n enableZoom?: boolean;\n enableDrag?: boolean;\n onNodeClick?: (node: GraphNode) => void;\n onNodeHover?: (node: GraphNode | null) => void;\n onLinkClick?: (link: GraphLink) => void;\n selectedNodeId?: string;\n hoveredNodeId?: string;\n defaultNodeColor?: string;\n defaultNodeSize?: number;\n defaultLinkColor?: string;\n defaultLinkWidth?: number;\n showNodeLabels?: boolean;\n showLinkLabels?: boolean;\n className?: string;\n manualLayout?: boolean;\n onManualLayoutChange?: (enabled: boolean) => void;\n packageBounds?: Record<string, { x: number; y: number; r: number }>;\n layout?: LayoutType;\n onLayoutChange?: (layout: LayoutType) => void;\n}\n\nexport const ForceDirectedGraph = forwardRef<ForceDirectedGraphHandle, ForceDirectedGraphProps>(\n (\n {\n nodes: initialNodes,\n links: initialLinks,\n width,\n height,\n enableZoom = true,\n enableDrag = true,\n onNodeClick,\n onNodeHover,\n onLinkClick,\n selectedNodeId,\n hoveredNodeId,\n defaultNodeColor = '#69b3a2',\n defaultNodeSize = 10,\n defaultLinkColor = '#999',\n defaultLinkWidth = 1,\n showNodeLabels = true,\n showLinkLabels = false,\n className,\n manualLayout = false,\n onManualLayoutChange,\n packageBounds,\n layout: externalLayout,\n onLayoutChange,\n },\n ref\n ) => {\n const svgRef = useRef<SVGSVGElement>(null);\n const gRef = useRef<SVGGElement>(null);\n const [transform, setTransform] = useState({ k: 1, x: 0, y: 0 });\n const transformRef = useRef(transform);\n const dragNodeRef = useRef<GraphNode | null>(null);\n const dragActiveRef = useRef(false);\n const [pinnedNodes, setPinnedNodes] = useState<Set<string>>(new Set());\n const internalDragEnabledRef = useRef(enableDrag);\n const [layout, setLayout] = useState<LayoutType>(externalLayout || 'force');\n \n // Sync external layout prop with internal state\n useEffect(() => {\n if (externalLayout && externalLayout !== layout) {\n setLayout(externalLayout);\n }\n }, [externalLayout]);\n\n // Handle layout change and notify parent\n const handleLayoutChange = useCallback((newLayout: LayoutType) => {\n setLayout(newLayout);\n onLayoutChange?.(newLayout);\n }, [onLayoutChange]);\n\n // Update the ref when enableDrag prop changes\n useEffect(() => {\n internalDragEnabledRef.current = enableDrag;\n }, [enableDrag]);\n\n\n // Static layout - compute positions directly without force simulation\n const nodes = React.useMemo(() => {\n if (!initialNodes || !initialNodes.length) return initialNodes;\n \n const cx = width / 2;\n const cy = height / 2;\n \n // For force layout, use random positions but don't animate\n if (layout === 'force') {\n return initialNodes.map((n: any) => ({\n ...n,\n x: Math.random() * width,\n y: Math.random() * height,\n }));\n }\n \n // For circular layout, arrange in a circle\n if (layout === 'circular') {\n const radius = Math.min(width, height) * 0.35;\n return initialNodes.map((n: any, i: number) => ({\n ...n,\n x: cx + Math.cos((2 * Math.PI * i) / initialNodes.length) * radius,\n y: cy + Math.sin((2 * Math.PI * i) / initialNodes.length) * radius,\n }));\n }\n \n // For hierarchical layout, arrange in a grid\n if (layout === 'hierarchical') {\n const cols = Math.ceil(Math.sqrt(initialNodes.length));\n const spacingX = width / (cols + 1);\n const spacingY = height / (Math.ceil(initialNodes.length / cols) + 1);\n return initialNodes.map((n: any, i: number) => ({\n ...n,\n x: spacingX * ((i % cols) + 1),\n y: spacingY * (Math.floor(i / cols) + 1),\n }));\n }\n \n return initialNodes;\n }, [initialNodes, width, height, layout]);\n\n // Static links - just use initial links\n const links = initialLinks;\n \n // No force simulation - static layout only\n const restart = React.useCallback(() => {\n // No-op for static layout\n }, []);\n \n const stop = React.useCallback(() => {\n // No-op for static layout\n }, []);\n \n const setForcesEnabled = React.useCallback((_enabled: boolean) => {\n // No-op for static layout\n }, []);\n\n // Remove package bounds effect - boundary packing disabled for faster convergence\n\n // Apply layout-specific positioning when layout changes\n useEffect(() => {\n if (!nodes || nodes.length === 0) return;\n \n const applyLayout = () => {\n const cx = width / 2;\n const cy = height / 2;\n \n if (layout === 'circular') {\n // Place all nodes in a circle\n const radius = Math.min(width, height) * 0.35;\n nodes.forEach((node, i) => {\n const angle = (2 * Math.PI * i) / nodes.length;\n node.fx = cx + Math.cos(angle) * radius;\n node.fy = cy + Math.sin(angle) * radius;\n });\n } else if (layout === 'hierarchical') {\n // Place packages in rows, files within packages in columns\n const groups = new Map<string, typeof nodes>();\n nodes.forEach((n: any) => {\n const key = n.packageGroup || n.group || 'root';\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(n);\n });\n \n const groupArray = Array.from(groups.entries());\n const cols = Math.ceil(Math.sqrt(groupArray.length));\n const groupSpacingX = width * 0.8 / cols;\n const groupSpacingY = height * 0.8 / Math.ceil(groupArray.length / cols);\n \n groupArray.forEach(([groupKey, groupNodes], gi) => {\n const col = gi % cols;\n const row = Math.floor(gi / cols);\n const groupX = (col + 0.5) * groupSpacingX;\n const groupY = (row + 0.5) * groupSpacingY;\n \n // Place group nodes in a small circle within their area\n if (groupKey.startsWith('pkg:') || groupKey === groupKey) {\n groupNodes.forEach((n, ni) => {\n const angle = (2 * Math.PI * ni) / groupNodes.length;\n const r = Math.min(80, 20 + groupNodes.length * 8);\n n.fx = groupX + Math.cos(angle) * r;\n n.fy = groupY + Math.sin(angle) * r;\n });\n }\n });\n }\n // 'force' layout - just restart with default behavior (no fx/fy set)\n \n try { restart(); } catch (e) { /* ignore */ }\n };\n \n applyLayout();\n }, [layout, nodes, width, height, restart]);\n\n // If manual layout is enabled or any nodes are pinned, disable forces\n useEffect(() => {\n try {\n if (manualLayout || pinnedNodes.size > 0) setForcesEnabled(false);\n else setForcesEnabled(true);\n } catch (e) {\n // ignore\n }\n }, [manualLayout, pinnedNodes, setForcesEnabled]);\n\n // Expose imperative handle for parent components\n useImperativeHandle(\n ref,\n () => ({\n pinAll: () => {\n const newPinned = new Set<string>();\n nodes.forEach((node) => {\n node.fx = node.x;\n node.fy = node.y;\n newPinned.add(node.id);\n });\n setPinnedNodes(newPinned);\n restart();\n },\n\n unpinAll: () => {\n nodes.forEach((node) => {\n node.fx = null;\n node.fy = null;\n });\n setPinnedNodes(new Set());\n restart();\n },\n\n resetLayout: () => {\n nodes.forEach((node) => {\n node.fx = null;\n node.fy = null;\n });\n setPinnedNodes(new Set());\n restart();\n },\n\n fitView: () => {\n if (!svgRef.current || !nodes.length) return;\n\n // Calculate bounds\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n nodes.forEach((node) => {\n if (node.x !== undefined && node.y !== undefined) {\n const size = node.size || 10;\n minX = Math.min(minX, node.x - size);\n maxX = Math.max(maxX, node.x + size);\n minY = Math.min(minY, node.y - size);\n maxY = Math.max(maxY, node.y + size);\n }\n });\n\n if (!isFinite(minX)) return;\n\n const padding = 40;\n const nodeWidth = maxX - minX;\n const nodeHeight = maxY - minY;\n const scale = Math.min(\n (width - padding * 2) / nodeWidth,\n (height - padding * 2) / nodeHeight,\n 10\n );\n\n const centerX = (minX + maxX) / 2;\n const centerY = (minY + maxY) / 2;\n\n const x = width / 2 - centerX * scale;\n const y = height / 2 - centerY * scale;\n\n if (gRef.current && svgRef.current) {\n const svg = d3.select(svgRef.current);\n const newTransform = d3.zoomIdentity.translate(x, y).scale(scale);\n svg.transition().duration(300).call(d3.zoom<SVGSVGElement, unknown>().transform as any, newTransform);\n setTransform(newTransform);\n }\n },\n\n getPinnedNodes: () => Array.from(pinnedNodes),\n\n setDragMode: (enabled: boolean) => {\n internalDragEnabledRef.current = enabled;\n },\n \n setLayout: (newLayout: LayoutType) => {\n handleLayoutChange(newLayout);\n },\n \n getLayout: () => layout,\n }),\n [nodes, pinnedNodes, restart, width, height, layout, handleLayoutChange]\n );\n\n // Notify parent when manual layout mode changes (uses the prop so it's not unused)\n useEffect(() => {\n try {\n if (typeof onManualLayoutChange === 'function') onManualLayoutChange(manualLayout);\n } catch (e) {\n // ignore errors from callbacks\n }\n }, [manualLayout, onManualLayoutChange]);\n\n // Set up zoom behavior\n useEffect(() => {\n if (!enableZoom || !svgRef.current || !gRef.current) return;\n\n const svg = d3.select(svgRef.current);\n const g = d3.select(gRef.current);\n\n const zoom = d3\n .zoom<SVGSVGElement, unknown>()\n .scaleExtent([0.1, 10])\n .on('zoom', (event) => {\n g.attr('transform', event.transform);\n transformRef.current = event.transform;\n setTransform(event.transform);\n });\n\n svg.call(zoom);\n\n return () => {\n svg.on('.zoom', null);\n };\n }, [enableZoom]);\n\n // Run a one-time DOM positioning pass when nodes/links change so elements\n // rendered by React are positioned to the simulation's seeded coordinates\n useEffect(() => {\n if (!gRef.current) return;\n try {\n const g = d3.select(gRef.current);\n g.selectAll<SVGGElement, any>('g.node').each(function (this: SVGGElement) {\n const datum = d3.select(this).datum() as any;\n if (!datum) return;\n d3.select(this).attr('transform', `translate(${datum.x || 0},${datum.y || 0})`);\n });\n\n g.selectAll<SVGLineElement, any>('line').each(function (this: SVGLineElement) {\n const l = d3.select(this).datum() as any;\n if (!l) return;\n const s: any = typeof l.source === 'object' ? l.source : nodes.find((n) => n.id === l.source) || l.source;\n const t: any = typeof l.target === 'object' ? l.target : nodes.find((n) => n.id === l.target) || l.target;\n if (!s || !t) return;\n d3.select(this).attr('x1', s.x).attr('y1', s.y).attr('x2', t.x).attr('y2', t.y);\n });\n } catch (e) {\n // ignore\n }\n }, [nodes, links]);\n\n // Set up drag behavior with global listeners for smoother dragging\n const handleDragStart = useCallback(\n (event: React.MouseEvent, node: GraphNode) => {\n if (!enableDrag) return;\n event.preventDefault();\n event.stopPropagation();\n // pause forces while dragging to avoid the whole graph moving\n dragActiveRef.current = true;\n dragNodeRef.current = node;\n node.fx = node.x;\n node.fy = node.y;\n setPinnedNodes((prev) => new Set([...prev, node.id]));\n try { stop(); } catch (e) {}\n },\n [enableDrag, restart]\n );\n\n useEffect(() => {\n if (!enableDrag) return;\n\n const handleWindowMove = (event: MouseEvent) => {\n if (!dragActiveRef.current || !dragNodeRef.current) return;\n const svg = svgRef.current;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n const t: any = transformRef.current;\n const x = (event.clientX - rect.left - t.x) / t.k;\n const y = (event.clientY - rect.top - t.y) / t.k;\n dragNodeRef.current.fx = x;\n dragNodeRef.current.fy = y;\n };\n\n const handleWindowUp = () => {\n if (!dragActiveRef.current) return;\n // Keep fx/fy set to pin the node where it was dropped.\n try { setForcesEnabled(true); restart(); } catch (e) {}\n dragNodeRef.current = null;\n dragActiveRef.current = false;\n };\n\n const handleWindowLeave = (event: MouseEvent) => {\n if (event.relatedTarget === null) handleWindowUp();\n };\n\n window.addEventListener('mousemove', handleWindowMove);\n window.addEventListener('mouseup', handleWindowUp);\n window.addEventListener('mouseout', handleWindowLeave);\n window.addEventListener('blur', handleWindowUp);\n\n return () => {\n window.removeEventListener('mousemove', handleWindowMove);\n window.removeEventListener('mouseup', handleWindowUp);\n window.removeEventListener('mouseout', handleWindowLeave);\n window.removeEventListener('blur', handleWindowUp);\n };\n }, [enableDrag]);\n\n // Attach d3.drag behavior to node groups rendered by React. This helps make\n // dragging more robust across transforms and pointer behaviors.\n useEffect(() => {\n if (!gRef.current || !enableDrag) return;\n const g = d3.select(gRef.current);\n const dragBehavior = d3\n .drag<SVGGElement, unknown>()\n .on('start', function (event) {\n try {\n const target = (event.sourceEvent && (event.sourceEvent.target as Element)) || (event.target as Element);\n const grp = target.closest?.('g.node') as Element | null;\n const id = grp?.getAttribute('data-id');\n if (!id) return;\n const node = nodes.find((n) => n.id === id) as GraphNode | undefined;\n if (!node) return;\n if (!internalDragEnabledRef.current) return;\n if (!event.active) restart();\n dragActiveRef.current = true;\n dragNodeRef.current = node;\n node.fx = node.x;\n node.fy = node.y;\n setPinnedNodes((prev) => new Set([...prev, node.id]));\n } catch (e) {\n // ignore\n }\n })\n .on('drag', function (event) {\n if (!dragActiveRef.current || !dragNodeRef.current) return;\n const svg = svgRef.current;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n const x = (event.sourceEvent.clientX - rect.left - transform.x) / transform.k;\n const y = (event.sourceEvent.clientY - rect.top - transform.y) / transform.k;\n dragNodeRef.current.fx = x;\n dragNodeRef.current.fy = y;\n })\n .on('end', function () {\n // re-enable forces when drag ends\n try { setForcesEnabled(true); restart(); } catch (e) {}\n dragNodeRef.current = null;\n dragActiveRef.current = false;\n });\n\n try {\n g.selectAll('g.node').call(dragBehavior as any);\n } catch (e) {\n // ignore attach errors\n }\n\n return () => {\n try {\n g.selectAll('g.node').on('.drag', null as any);\n } catch (e) {\n /* ignore */\n }\n };\n }, [gRef, enableDrag, nodes, transform, restart]);\n\n const handleNodeClick = useCallback(\n (node: GraphNode) => {\n onNodeClick?.(node);\n },\n [onNodeClick]\n );\n\n const handleNodeDoubleClick = useCallback(\n (event: React.MouseEvent, node: GraphNode) => {\n event.stopPropagation();\n if (!enableDrag) return;\n if (node.fx === null || node.fx === undefined) {\n node.fx = node.x;\n node.fy = node.y;\n setPinnedNodes((prev) => new Set([...prev, node.id]));\n } else {\n node.fx = null;\n node.fy = null;\n setPinnedNodes((prev) => {\n const next = new Set(prev);\n next.delete(node.id);\n return next;\n });\n }\n restart();\n },\n [enableDrag, restart]\n );\n\n const handleCanvasDoubleClick = useCallback(() => {\n nodes.forEach((node) => {\n node.fx = null;\n node.fy = null;\n });\n setPinnedNodes(new Set());\n restart();\n }, [nodes, restart]);\n\n const handleNodeMouseEnter = useCallback(\n (node: GraphNode) => {\n onNodeHover?.(node);\n },\n [onNodeHover]\n );\n\n const handleNodeMouseLeave = useCallback(() => {\n onNodeHover?.(null);\n }, [onNodeHover]);\n\n const handleLinkClick = useCallback(\n (link: GraphLink) => {\n onLinkClick?.(link);\n },\n [onLinkClick]\n );\n\n return (\n <svg\n ref={svgRef}\n width={width}\n height={height}\n className={cn('bg-white dark:bg-gray-900', className)}\n onDoubleClick={handleCanvasDoubleClick}\n >\n <defs>\n {/* Arrow marker for directed graphs */}\n <marker\n id=\"arrow\"\n viewBox=\"0 0 10 10\"\n refX=\"20\"\n refY=\"5\"\n markerWidth=\"6\"\n markerHeight=\"6\"\n orient=\"auto\"\n >\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill={defaultLinkColor} />\n </marker>\n </defs>\n\n <g ref={gRef}>\n \n {/* Render links via LinkItem (positions updated by D3) */}\n {links.map((link, i) => (\n <LinkItem\n key={`link-${i}`}\n link={link as GraphLink}\n onClick={handleLinkClick}\n defaultWidth={defaultLinkWidth}\n showLabel={showLinkLabels}\n nodes={nodes}\n />\n ))}\n\n {/* Render nodes via NodeItem (D3 will set transforms) */}\n {nodes.map((node) => (\n <NodeItem\n key={node.id}\n node={node as GraphNode}\n isSelected={selectedNodeId === node.id}\n isHovered={hoveredNodeId === node.id}\n pinned={pinnedNodes.has(node.id)}\n defaultNodeSize={defaultNodeSize}\n defaultNodeColor={defaultNodeColor}\n showLabel={showNodeLabels}\n onClick={handleNodeClick}\n onDoubleClick={handleNodeDoubleClick}\n onMouseEnter={handleNodeMouseEnter}\n onMouseLeave={handleNodeMouseLeave}\n onMouseDown={handleDragStart}\n />\n ))}\n {/* Package boundary circles (from parent pack layout) - drawn on top for visibility */}\n {packageBounds && Object.keys(packageBounds).length > 0 && (\n <g className=\"package-boundaries\" pointerEvents=\"none\">\n {Object.entries(packageBounds).map(([pid, b]) => (\n <g key={pid}>\n <circle\n cx={b.x}\n cy={b.y}\n r={b.r}\n fill=\"rgba(148,163,184,0.06)\"\n stroke=\"#475569\"\n strokeWidth={2}\n strokeDasharray=\"6 6\"\n opacity={0.9}\n />\n <text\n x={b.x}\n y={Math.max(12, b.y - b.r + 14)}\n fill=\"#475569\"\n fontSize={11}\n textAnchor=\"middle\"\n pointerEvents=\"none\"\n >\n {pid.replace(/^pkg:/, '')}\n </text>\n </g>\n ))}\n </g>\n )}\n </g>\n </svg>\n );\n }\n);\n\nForceDirectedGraph.displayName = 'ForceDirectedGraph';","import React from 'react';\nimport { cn } from '../utils/cn';\n\nexport interface GraphControlsProps {\n /**\n * Whether dragging is enabled\n */\n dragEnabled?: boolean;\n\n /**\n * Callback to toggle drag mode\n */\n onDragToggle?: (enabled: boolean) => void;\n\n /**\n * Whether manual layout mode is enabled\n */\n manualLayout?: boolean;\n\n /**\n * Callback to toggle manual layout mode\n */\n onManualLayoutToggle?: (enabled: boolean) => void;\n\n /**\n * Callback to pin all nodes\n */\n onPinAll?: () => void;\n\n /**\n * Callback to unpin all nodes\n */\n onUnpinAll?: () => void;\n\n /**\n * Callback to center/reset the view\n */\n onReset?: () => void;\n\n /**\n * Callback to fit all nodes in view\n */\n onFitView?: () => void;\n\n /**\n * Number of pinned nodes\n */\n pinnedCount?: number;\n\n /**\n * Total number of nodes\n */\n totalNodes?: number;\n\n /**\n * Whether to show the controls\n * @default true\n */\n visible?: boolean;\n\n /**\n * Position of the controls\n * @default \"top-left\"\n */\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n\n /**\n * Additional CSS classes\n */\n className?: string;\n}\n\n/**\n * GraphControls: Floating toolbar for manipulating graph layout and dragging\n * Provides controls for toggling drag mode, manual layout, pinning nodes, and resetting the view\n */\nexport const GraphControls: React.FC<GraphControlsProps> = ({\n dragEnabled = true,\n onDragToggle,\n manualLayout = false,\n onManualLayoutToggle,\n onPinAll,\n onUnpinAll,\n onReset,\n onFitView,\n pinnedCount = 0,\n totalNodes = 0,\n visible = true,\n position = 'top-left',\n className,\n}) => {\n\n if (!visible) return null;\n\n const positionClasses: Record<string, string> = {\n 'top-left': 'top-4 left-4',\n 'top-right': 'top-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'bottom-right': 'bottom-4 right-4',\n };\n\n const ControlButton: React.FC<{\n onClick: () => void;\n active?: boolean;\n icon: string;\n label: string;\n disabled?: boolean;\n }> = ({ onClick, active = false, icon, label, disabled = false }) => (\n <div className=\"relative group\">\n <button\n onClick={onClick}\n disabled={disabled}\n className={cn(\n 'p-2 rounded-lg transition-all duration-200',\n active\n ? 'bg-blue-500 text-white shadow-md hover:bg-blue-600'\n : 'bg-gray-100 text-gray-700 hover:bg-gray-200',\n disabled && 'opacity-50 cursor-not-allowed hover:bg-gray-100',\n 'dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600 dark:active:bg-blue-600'\n )}\n title={label}\n >\n <span className=\"text-lg\">{icon}</span>\n </button>\n <div className=\"absolute left-full ml-2 px-2 py-1 bg-gray-900 text-white text-xs rounded whitespace-nowrap opacity-0 group-hover:opacity-100 transition-opacity duration-200 pointer-events-none z-50\">\n {label}\n </div>\n </div>\n );\n\n return (\n <div\n className={cn(\n 'fixed z-40 bg-white dark:bg-gray-800 rounded-lg shadow-lg p-2 border border-gray-200 dark:border-gray-700',\n positionClasses[position],\n className\n )}\n >\n <div className=\"flex flex-col gap-2\">\n {/* Drag Mode Toggle */}\n <ControlButton\n onClick={() => onDragToggle?.(!dragEnabled)}\n active={dragEnabled}\n icon=\"✋\"\n label={dragEnabled ? 'Drag enabled' : 'Drag disabled'}\n />\n\n {/* Manual Layout Toggle */}\n <ControlButton\n onClick={() => onManualLayoutToggle?.(!manualLayout)}\n active={manualLayout}\n icon=\"🔧\"\n label={manualLayout ? 'Manual layout: ON (drag freely)' : 'Manual layout: OFF (forces active)'}\n />\n\n {/* Divider */}\n <div className=\"w-8 h-px bg-gray-300 dark:bg-gray-600 mx-auto my-1\" />\n\n {/* Pin/Unpin Controls */}\n <div className=\"flex gap-1\">\n <ControlButton\n onClick={() => onPinAll?.()}\n disabled={totalNodes === 0}\n icon=\"📌\"\n label={`Pin all nodes (${totalNodes})`}\n />\n <ControlButton\n onClick={() => onUnpinAll?.()}\n disabled={pinnedCount === 0}\n icon=\"📍\"\n label={`Unpin all (${pinnedCount} pinned)`}\n />\n </div>\n\n {/* Divider */}\n <div className=\"w-8 h-px bg-gray-300 dark:bg-gray-600 mx-auto my-1\" />\n\n {/* View Controls */}\n <ControlButton\n onClick={() => onFitView?.()}\n disabled={totalNodes === 0}\n icon=\"🎯\"\n label=\"Fit all nodes in view\"\n />\n\n <ControlButton\n onClick={() => onReset?.()}\n disabled={totalNodes === 0}\n icon=\"↺\"\n label=\"Reset to auto-layout\"\n />\n </div>\n\n {/* Info Panel */}\n <div className=\"mt-3 pt-3 border-t border-gray-200 dark:border-gray-700 text-xs text-gray-600 dark:text-gray-400\">\n <div className=\"whitespace-nowrap\">\n <strong>Nodes:</strong> {totalNodes}\n </div>\n {pinnedCount > 0 && (\n <div className=\"whitespace-nowrap\">\n <strong>Pinned:</strong> {pinnedCount}\n </div>\n )}\n <div className=\"mt-2 text-gray-500 dark:text-gray-500 leading-snug\">\n <strong>Tips:</strong>\n <ul className=\"mt-1 ml-1 space-y-0.5\">\n <li>• Drag nodes to reposition</li>\n <li>• Double-click to pin/unpin</li>\n <li>• Double-click canvas to unpin all</li>\n <li>• Scroll to zoom</li>\n </ul>\n </div>\n </div>\n </div>\n );\n};\n\nGraphControls.displayName = 'GraphControls';\n"]}
|