react-scale-break-chart 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +94 -0
- package/dist/index.d.mts +46 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.js +686 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +680 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts","../src/ScaleBreakBarChart.tsx"],"names":["useRef","useState","useEffect","useMemo","useCallback","clsx","jsxs","jsx","barTop","Fragment"],"mappings":";;;;;;;;;;;;;AAiHO,SAAS,gBAAA,CACZ,IAAA,EACA,MAAA,EACA,WAAA,EACA,cAAA,EACa;AACb,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,WAAW,CAAA,EAAG;AAC1C,IAAA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,MAAM,CAAA,EAAG,QAAA,EAAU,GAAG,QAAA,EAAU,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,SAAS,WAAA,EAAa,WAAA,EAAa,GAAG,OAAA,EAAS,CAAA,EAAG,cAAc,CAAA,EAAE;AAAA,EAChJ;AAGA,EAAA,MAAM,cAAc,MAAA,CAAO,GAAA;AAAA,IAAI,CAAC,CAAA,KAC5B,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,OAAO,CAAA,CAAE,CAAA,CAAE,OAAO,CAAC,CAAA,IAAK,CAAC,CAAC;AAAA,GAC7D;AAEA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,aAAa,CAAC,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,CAAC,GAAG,WAAW,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACxD,EAAA,MAAM,gBAAA,GAAmB,WAAW,CAAC,CAAA;AACrC,EAAA,MAAM,sBAAA,GAAyB,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAGhD,EAAA,MAAM,cACF,MAAA,CAAO,MAAA,GAAS,KAChB,sBAAA,GAAyB,CAAA,IACzB,mBAAmB,sBAAA,GAAyB,cAAA;AAIhD,EAAA,MAAM,YAAY,CAAC,GAAG,WAAW,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,EAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAC5E,EAAA,MAAM,aAAA,GACF,SAAA,CAAU,MAAA,IAAU,CAAA,IACpB,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA,IACf,SAAA,CAAU,CAAC,CAAA,GAAI,SAAA,CAAU,CAAC,CAAA,GAAI,cAAA;AAElC,EAAA,IAAI,CAAC,WAAA,IAAe,CAAC,aAAA,EAAe;AAIhC,IAAA,MAAM,YAAY,IAAA,CAAK,OAAA;AAAA,MAAQ,CAAC,CAAA,KAC5B,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,CAAA,CAAE,OAAO,CAAC,CAAA,IAAK,CAAC;AAAA,KAC/C,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA;AACrB,IAAA,MAAM,SAAA,GAAY,UAAU,MAAA,GAAS,CAAA,GAAI,KAAK,GAAA,CAAI,GAAG,SAAS,CAAA,GAAI,CAAA;AAElE,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,IAAA,GAAO,SAAA;AAGX,IAAA,IAAI,YAAY,CAAA,IAAK,SAAA,GAAY,CAAA,IAAK,SAAA,GAAY,YAAY,GAAA,EAAK;AAE/D,MAAA,MAAM,YAAY,SAAA,GAAY,SAAA;AAC9B,MAAA,IAAI,YAAY,CAAA,EAAG;AACf,QAAA,IAAA,GAAO,YAAY,SAAA,GAAY,GAAA;AAC/B,QAAA,IAAA,GAAO,YAAY,SAAA,GAAY,GAAA;AAAA,MACnC,CAAA,MAAO;AAEH,QAAA,IAAA,GAAO,SAAA,GAAY,IAAA;AACnB,QAAA,IAAA,GAAO,SAAA,GAAY,IAAA;AAAA,MACvB;AACA,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA;AAGvB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,KAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,SAAA,EAAW,IAAA,GAAO,IAAI,CAAC,CAAC,CAAC,CAAA;AACrF,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,OAAO,CAAA,GAAI,OAAA;AAAA,IACxC,CAAA,MAAO;AACH,MAAA,IAAA,GAAO,SAAA,GAAY,IAAA;AAAA,IACvB;AAEA,IAAA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,MAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,SAAS,WAAA,EAAa,WAAA,EAAa,GAAG,OAAA,EAAS,CAAA,EAAG,cAAc,CAAA,EAAE;AAAA,EACtJ;AAGA,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,iBAAiB,WAAA,EAAa;AAE9B,IAAA,QAAA,GAAW,KAAK,GAAA,CAAI,SAAA,CAAU,CAAC,CAAA,GAAI,GAAA,EAAK,yBAAyB,GAAG,CAAA;AAAA,EACxE,WAAW,aAAA,EAAe;AAEtB,IAAA,QAAA,GAAW,SAAA,CAAU,CAAC,CAAA,GAAI,GAAA;AAAA,EAC9B,CAAA,MAAO;AAEH,IAAA,QAAA,GAAW,sBAAA,GAAyB,GAAA;AAAA,EACxC;AAIA,EAAA,MAAM,cAAc,WAAA,CAAY,OAAA,CAAQ,KAAK,GAAA,CAAI,GAAG,WAAW,CAAC,CAAA;AAChE,EAAA,MAAM,iBAAiB,IAAA,CAClB,GAAA,CAAI,CAAA,CAAA,KAAK,MAAA,CAAO,EAAE,MAAA,CAAO,WAAW,CAAA,CAAE,OAAO,CAAC,CAAA,IAAK,CAAC,EACpD,MAAA,CAAO,CAAA,CAAA,KAAK,IAAI,QAAQ,CAAA;AAE7B,EAAA,IAAI,QAAA,GAAW,QAAA;AACf,EAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC3B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,cAAc,CAAA;AACzC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,cAAc,CAAA;AACzC,IAAA,MAAM,WAAW,MAAA,GAAS,MAAA;AAE1B,IAAA,IAAI,WAAW,CAAA,IAAK,MAAA,GAAS,CAAA,IAAK,QAAA,GAAW,SAAS,GAAA,EAAK;AACvD,MAAA,QAAA,GAAW,SAAS,QAAA,GAAW,GAAA;AAC/B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,KAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,CAAC,CAAC,CAAC,CAAC,CAAA;AAC1E,MAAA,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,OAAO,CAAA,GAAI,OAAA;AAC5C,MAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,QAAQ,CAAA;AAAA,IAC1C;AAAA,EACJ;AAGA,EAAA,IAAI,gBAAA;AACJ,EAAA,IAAI,WAAW,QAAA,EAAU;AACrB,IAAA,MAAM,cAAc,SAAA,GAAY,QAAA;AAChC,IAAA,gBAAA,GAAmB,YAAY,WAAA,GAAc,IAAA;AAAA,EACjD,CAAA,MAAO;AACH,IAAA,gBAAA,GAAmB,SAAA,GAAY,IAAA;AAAA,EACnC;AAEA,EAAA,MAAM,WAAA,GAAc,EAAA;AACpB,EAAA,MAAM,UAAU,WAAA,GAAc,GAAA;AAC9B,EAAA,MAAM,OAAA,GAAU,cAAc,OAAA,GAAU,WAAA;AAExC,EAAA,MAAM,YAAA,GAAe,QAAA,GAAW,QAAA,GAAW,OAAA,GAAU,IAAA,GAAO,CAAA;AAE5D,EAAA,OAAO;AAAA,IACH,QAAA,EAAU,IAAA;AAAA,IACV,IAAA,EAAM,CAAA;AAAA,IACN,QAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA,EAAU,gBAAA;AAAA,IACV,OAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACJ;AACJ;AAKO,SAAS,qBAAA,CACZ,IAAA,EACA,MAAA,EACA,SAAA,EACkB;AAClB,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,KAAA,KAAU;AACvB,IAAA,MAAM,IAAA,GAA2B,MAAA,CAAO,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAClD,MAAA,MAAM,QAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,CAAE,OAAO,CAAC,CAAA,IAAK,CAAA;AAE1C,MAAA,IAAI,CAAC,SAAA,CAAU,QAAA,IAAY,KAAA,IAAS,UAAU,QAAA,EAAU;AAEpD,QAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,QAAA,GAAW,SAAA,CAAU,IAAA;AAC7C,QAAA,MAAM,MAAA,GAAS,QAAQ,CAAA,GAAA,CACf,KAAA,GAAQ,UAAU,IAAA,IAAQ,KAAA,GAAS,UAAU,OAAA,GAC/C,CAAA;AACN,QAAA,OAAO;AAAA,UACH,WAAA,EAAa,CAAA;AAAA,UACb,KAAA;AAAA,UACA,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,WAAA,EAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA;AAAA,UAC/B,WAAA,EAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA;AAAA,UAC/B,WAAA,EAAa,CAAA;AAAA,UACb,QAAA,EAAU;AAAA,SACd;AAAA,MACJ;AAGA,MAAA,MAAM,cAAc,SAAA,CAAU,OAAA;AAC9B,MAAA,MAAM,UAAA,GAAa,SAAA,CAAU,QAAA,GAAW,SAAA,CAAU,QAAA;AAElD,MAAA,IAAI,WAAA;AACJ,MAAA,IAAI,SAAA,CAAU,eAAe,CAAA,EAAG;AAE5B,QAAA,MAAM,WAAA,GAAc,SAAA,CAAU,OAAA,GAAU,SAAA,CAAU,YAAA;AAClD,QAAA,IAAI,KAAA,IAAS,UAAU,QAAA,EAAU;AAE7B,UAAA,MAAM,QAAA,GAAW,SAAA,CAAU,QAAA,GAAW,SAAA,CAAU,QAAA;AAChD,UAAA,MAAM,UAAU,QAAA,GAAW,CAAA,GAAA,CAAK,KAAA,GAAQ,SAAA,CAAU,YAAY,QAAA,GAAW,CAAA;AACzE,UAAA,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,GAAI,SAAA,CAAU,YAAA;AAAA,QACjD,CAAA,MAAO;AAEH,UAAA,MAAM,aAAa,UAAA,GAAa,CAAA,GAAA,CAAK,KAAA,GAAQ,SAAA,CAAU,YAAY,UAAA,GAAa,CAAA;AAChF,UAAA,WAAA,GAAc,SAAA,CAAU,eAAe,UAAA,GAAa,WAAA;AAAA,QACxD;AAAA,MACJ,CAAA,MAAO;AAEH,QAAA,MAAM,aAAA,GAAgB,UAAA,GAAa,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAI,KAAA,GAAQ,SAAA,CAAU,QAAA,IAAY,UAAU,CAAA,GAAI,CAAA;AAChG,QAAA,WAAA,GAAc,gBAAgB,SAAA,CAAU,OAAA;AAAA,MAC5C;AAEA,MAAA,MAAM,WAAA,GAAc,WAAA,GAAc,SAAA,CAAU,WAAA,GAAc,WAAA;AAE1D,MAAA,OAAO;AAAA,QACH,WAAA,EAAa,CAAA;AAAA,QACb,KAAA;AAAA,QACA,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,WAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA,EAAU;AAAA,OACd;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,IAAA,EAAK;AAAA,EACpC,CAAC,CAAA;AACL;AC1SA,IAAM,WAAA,GAAc,EAAA;AACpB,IAAM,cAAA,GAAiB,EAAA;AACvB,IAAM,gBAAA,GAAmB,EAAA;AACzB,IAAM,yBAAA,GAA4B,EAAA;AAClC,IAAM,aAAA,GAAgB,EAAA;AAEtB,IAAM,aAAA,GAAgB,IAAA;AACtB,IAAM,aAAA,GAAgB,CAAA;AACtB,IAAM,oBAAA,GAAuB,EAAA;AAC7B,IAAM,eAAA,GAAkB,CAAA;AACxB,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,eAAA,GAAkB,CAAA;AAGxB,SAAS,aAAA,CAAc,MAAA,EAAgB,SAAA,EAAmB,MAAA,GAAiB,CAAA,EAAa;AACpF,EAAA,IAAI,MAAA,IAAU,MAAA,EAAQ,OAAO,CAAC,MAAM,CAAA;AACpC,EAAA,MAAM,QAAQ,MAAA,GAAS,MAAA;AACvB,EAAA,MAAM,KAAA,GAAQ,SAAS,SAAA,GAAY,CAAA,CAAA;AACnC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAC,CAAA;AACtD,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,GAAI,GAAA,IAAO,KAAK,CAAA,IAAK,EAAA;AACjE,EAAA,MAAM,OAAO,IAAA,GAAO,GAAA;AACpB,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,IAAI,CAAA,GAAI,IAAA;AAC1C,EAAA,KAAA,IAAS,IAAI,KAAA,EAAO,CAAA,IAAK,SAAS,IAAA,GAAO,IAAA,EAAM,KAAK,IAAA,EAAM;AACtD,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,EAChB;AACA,EAAA,IAAI,MAAM,MAAA,GAAS,SAAA,GAAY,GAAG,KAAA,CAAM,MAAA,CAAO,YAAY,CAAC,CAAA;AAC5D,EAAA,OAAO,KAAA;AACX;AAGA,SAAS,SAAS,GAAA,EAAuC;AACrD,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA;AAC7B,EAAA,OAAO;AAAA,IACH,SAAS,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAAA,IAC9B,SAAS,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAAA,IAC9B,SAAS,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAC,GAAG,EAAE;AAAA,GAClC;AACJ;AAGA,SAAS,SAAA,CAAU,KAAa,MAAA,EAAwB;AACpD,EAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,SAAS,GAAG,CAAA;AAC9B,EAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,CAAA,IAAK,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA;AACnD,EAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,CAAA,IAAK,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA;AACnD,EAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,CAAA,IAAK,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA;AACnD,EAAA,OAAO,CAAA,CAAA,EAAI,EAAA,CAAG,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,EAAA,CAAG,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,EAAA,CAAG,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AACrH;AAGA,SAAS,UAAU,GAAA,EAAqB;AACpC,EAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,SAAS,GAAG,CAAA;AAC9B,EAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,EAAK,CAAA,GAAI,GAAA,EAAK,CAAA,GAAI,GAAG,CAAA,CAAE,GAAA;AAAA,IAAI,CAAC,CAAA,KAClD,CAAA,IAAK,OAAA,GAAU,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAA,CAAK,CAAA,GAAI,KAAA,IAAS,KAAA,EAAO,GAAG;AAAA,GAChE;AACA,EAAA,OAAO,MAAA,GAAS,EAAA,GAAK,MAAA,GAAS,EAAA,GAAK,MAAA,GAAS,EAAA;AAChD;AAGA,SAAS,aAAa,QAAA,EAA0B;AAC5C,EAAA,OAAO,SAAA,CAAU,QAAQ,CAAA,GAAI,GAAA,GAAM,SAAA,GAAY,SAAA;AACnD;AAMA,SAAS,eAAA,CACL,CAAA,EACA,OAAA,EACA,KAAA,EACA,UACA,QAAA,GAAmB,eAAA,EACnB,GAAA,GAAc,EAAA,EACd,SAAA,GAAoB,CAAA,EACpB,UAAA,GAAqB,EAAA,EACrB,QAAgB,CAAA,EACsE;AACtF,EAAA,MAAM,OAAO,CAAA,GAAI,QAAA;AACjB,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,GAAW,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,QAAA,GAAW,UAAU,CAAC,CAAA;AAC1D,EAAA,MAAM,OAAO,QAAA,GAAW,KAAA;AAExB,EAAA,MAAM,aAAa,KAAA,GAAQ,QAAA;AAE3B,EAAA,MAAM,WAAuC,EAAC;AAC9C,EAAA,MAAM,UAAA,GAAa,UAAU,GAAA,GAAM,CAAA;AACnC,EAAA,QAAA,CAAS,KAAK,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,YAAY,CAAA;AACxC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC5B,IAAA,MAAM,IAAA,GAAO,IAAA,GAAO,IAAA,GAAO,CAAA,GAAI,IAAA,GAAO,CAAA;AACtC,IAAA,MAAM,IAAA,GAAO,IAAA,GAAO,IAAA,IAAQ,CAAA,GAAI,CAAA,CAAA;AAChC,IAAA,MAAM,QAAA,GAAA,CAAY,OAAO,IAAA,IAAQ,UAAA;AACjC,IAAA,MAAM,QAAA,GAAA,CAAY,OAAO,IAAA,IAAQ,UAAA;AACjC,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,EAAM,GAAG,UAAA,GAAa,QAAA,GAAW,WAAW,CAAA;AAC/D,IAAA,QAAA,CAAS,KAAK,EAAE,CAAA,EAAG,MAAM,CAAA,EAAG,UAAA,GAAa,UAAU,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,WAAuC,EAAC;AAC9C,EAAA,MAAM,UAAA,GAAa,UAAU,GAAA,GAAM,CAAA;AACnC,EAAA,QAAA,CAAS,KAAK,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,YAAY,CAAA;AACxC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC5B,IAAA,MAAM,IAAA,GAAO,IAAA,GAAO,IAAA,GAAO,CAAA,GAAI,IAAA,GAAO,CAAA;AACtC,IAAA,MAAM,IAAA,GAAO,IAAA,GAAO,IAAA,IAAQ,CAAA,GAAI,CAAA,CAAA;AAChC,IAAA,MAAM,QAAA,GAAA,CAAY,OAAO,IAAA,IAAQ,UAAA;AACjC,IAAA,MAAM,QAAA,GAAA,CAAY,OAAO,IAAA,IAAQ,UAAA;AACjC,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,EAAM,GAAG,UAAA,GAAa,QAAA,GAAW,WAAW,CAAA;AAC/D,IAAA,QAAA,CAAS,KAAK,EAAE,CAAA,EAAG,MAAM,CAAA,EAAG,UAAA,GAAa,UAAU,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KACZ,CAAA,EAAA,EAAK,GAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,GACzB,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,GAAA,EAAM,CAAA,CAAE,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA,CAAE,KAAK,EAAE,CAAA;AAEvD,EAAA,MAAM,QACF,MAAA,CAAO,QAAQ,IACf,CAAA,GAAA,EAAM,QAAA,CAAS,SAAS,MAAA,GAAS,CAAC,CAAA,CAAE,CAAC,IAAI,QAAA,CAAS,QAAA,CAAS,SAAS,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,GACxE,CAAC,GAAG,QAAQ,EAAE,OAAA,EAAQ,CAAE,MAAM,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,MAAM,CAAA,CAAE,CAAC,IAAI,CAAA,CAAE,CAAC,EAAE,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,GACvE,IAAA;AAEJ,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,OAAO,QAAQ,CAAA;AAAA,IACtB,KAAA,EAAO,OAAO,QAAQ,CAAA;AAAA,IACtB,IAAA,EAAM,KAAA;AAAA,IACN,SAAA,EAAW,SAAA,CAAU,QAAA,EAAU,IAAI,CAAA;AAAA,IACnC,WAAA,EAAa,SAAA,CAAU,QAAA,EAAU,GAAG;AAAA,GACxC;AACJ;AAEO,SAAS,kBAAA,CAAmB;AAAA,EAC/B,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA,GAAS,GAAA;AAAA,EACT,cAAA,GAAiB,CAAA;AAAA,EACjB,WAAA,GAAc,MAAA;AAAA,EACd;AACJ,CAAA,EAA4B;AACxB,EAAA,MAAM,eAAe,MAAA,KAAW,MAAA;AAChC,EAAA,MAAM,YAAA,GAAeA,aAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIC,eAAS,CAAC,CAAA;AACtD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,eAAS,CAAC,CAAA;AACxD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAiD,IAAI,CAAA;AACzF,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAA0C,IAAI,CAAA;AAElF,EAAAC,eAAA,CAAU,MAAM;AACZ,IAAA,MAAM,KAAK,YAAA,CAAa,OAAA;AACxB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,CAAC,OAAA,KAAY;AACvC,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AACzB,QAAA,iBAAA,CAAkB,KAAA,CAAM,YAAY,KAAK,CAAA;AACzC,QAAA,IAAI,YAAA,EAAc,kBAAA,CAAmB,KAAA,CAAM,WAAA,CAAY,MAAM,CAAA;AAAA,MACjE;AAAA,IACJ,CAAC,CAAA;AACD,IAAA,EAAA,CAAG,QAAQ,EAAE,CAAA;AACb,IAAA,MAAM,IAAA,GAAO,GAAG,qBAAA,EAAsB;AACtC,IAAA,iBAAA,CAAkB,KAAK,KAAK,CAAA;AAC5B,IAAA,IAAI,YAAA,EAAc,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA;AAChD,IAAA,OAAO,MAAM,GAAG,UAAA,EAAW;AAAA,EAC/B,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,cAAA,GAAiB,eAAe,eAAA,GAAmB,MAAA;AACzD,EAAA,MAAM,SAAA,GAAY,cAAA;AAClB,EAAA,MAAM,SAAA,GAAY,YAAA;AAClB,EAAA,MAAM,UAAA,GAAa,iBAAiB,SAAA,GAAY,aAAA;AAGhD,EAAA,MAAM,kBAAA,GAAqBC,cAAQ,MAAM;AACrC,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,MAAA,EAAQ,CAAC,CAAA,IAAK,KAAK,MAAA,IAAU,CAAA,CAAA;AAClF,IAAA,MAAM,SAAA,GAAY,KAAK,MAAA,IAAU,CAAA;AACjC,IAAA,MAAM,QAAQ,UAAA,GAAa,SAAA;AAC3B,IAAA,MAAM,MAAA,GAAA,CAAU,SAAA,GAAY,CAAA,GAAI,CAAA,GAAI,oBAAA,IAAwB,IAAA;AAC5D,IAAA,OAAO,WAAA,GAAc,SAAS,KAAA,GAAQ,IAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,IAAA,EAAM,UAAU,CAAC,CAAA;AAErB,EAAA,MAAM,UAAA,GAAa,gBAAA,IAAoB,kBAAA,GAAqB,yBAAA,GAA4B,CAAA,CAAA;AAExF,EAAA,MAAM,YAAA,GAAe,WAAA;AACrB,EAAA,MAAM,eAAA,GAAkB,YAAY,cAAA,GAAiB,UAAA;AACrD,EAAA,MAAM,cAAc,eAAA,GAAkB,YAAA;AAGtC,EAAA,MAAM,SAAA,GAAYA,aAAA;AAAA,IACd,MAAM,gBAAA,CAAiB,IAAA,EAAM,MAAA,EAAQ,aAAa,cAAc,CAAA;AAAA,IAChE,CAAC,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,cAAc;AAAA,GAC9C;AAGA,EAAA,MAAM,OAAA,GAAUA,aAAA;AAAA,IACZ,MAAM,qBAAA,CAAsB,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAA;AAAA,IACnD,CAAC,IAAA,EAAM,MAAA,EAAQ,SAAS;AAAA,GAC5B;AAGA,EAAA,MAAM,iBAAA,GAAoB,eAAA;AAC1B,EAAA,MAAM,cAAA,GAAiB,kBAAkB,SAAA,CAAU,OAAA;AACnD,EAAA,MAAM,YAAA,GAAe,iBAAiB,SAAA,CAAU,WAAA;AAGhD,EAAA,MAAM,UAAA,GAAaA,aAAA;AAAA,IACf,MAAM,cAAc,SAAA,CAAU,QAAA,EAAU,UAAU,QAAA,GAAW,CAAA,GAAI,CAAA,EAAG,SAAA,CAAU,IAAI,CAAA;AAAA,IAClF,CAAC,SAAA,CAAU,QAAA,EAAU,SAAA,CAAU,QAAA,EAAU,UAAU,IAAI;AAAA,GAC3D;AAGA,EAAA,MAAM,UAAA,GAAaA,cAAQ,MAAM;AAC7B,IAAA,IAAI,CAAC,SAAA,CAAU,QAAA,EAAU,OAAO,EAAC;AAEjC,IAAA,MAAM,KAAK,SAAA,CAAU,QAAA;AACrB,IAAA,MAAM,KAAK,SAAA,CAAU,QAAA;AACrB,IAAA,MAAM,QAAQ,EAAA,GAAK,EAAA;AACnB,IAAA,IAAI,KAAA,IAAS,CAAA,EAAG,OAAO,EAAC;AACxB,IAAA,MAAM,QAAQ,KAAA,GAAQ,CAAA;AACtB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAC,CAAA;AACtD,IAAA,MAAM,IAAA,GAAO,CAAC,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,GAAI,GAAA,IAAO,KAAK,CAAA,IAAK,EAAA;AACjE,IAAA,MAAM,OAAO,IAAA,GAAO,GAAA;AACpB,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,IAAI,CAAA,GAAI,IAAA;AACrC,IAAA,KAAA,IAAS,IAAI,KAAA,EAAO,CAAA,IAAK,KAAK,IAAA,GAAO,IAAA,EAAM,KAAK,IAAA,EAAM;AAClD,MAAA,IAAI,CAAA,GAAI,EAAA,EAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAAA,IAC5B;AACA,IAAA,OAAO,KAAA;AAAA,EACX,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAGd,EAAA,MAAM,QAAA,GAAWC,iBAAA,CAAY,CAAC,KAAA,KAA0B;AACpD,IAAA,IAAI,CAAC,SAAA,CAAU,QAAA,IAAY,KAAA,IAAS,UAAU,QAAA,EAAU;AACpD,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,QAAA,GAAW,SAAA,CAAU,IAAA;AAC7C,MAAA,IAAI,KAAA,KAAU,GAAG,OAAO,iBAAA;AACxB,MAAA,OAAO,iBAAA,GAAA,CAAsB,KAAA,GAAQ,SAAA,CAAU,IAAA,IAAQ,QAAS,SAAA,CAAU,OAAA;AAAA,IAC9E;AACA,IAAA,MAAM,UAAA,GAAa,SAAA,CAAU,QAAA,GAAW,SAAA,CAAU,QAAA;AAClD,IAAA,IAAI,UAAA,KAAe,GAAG,OAAO,YAAA;AAC7B,IAAA,IAAI,SAAA,CAAU,eAAe,CAAA,EAAG;AAE5B,MAAA,MAAM,WAAA,GAAc,SAAA,CAAU,OAAA,GAAU,SAAA,CAAU,YAAA;AAClD,MAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,IAAI,KAAA,GAAQ,SAAA,CAAU,YAAY,UAAU,CAAA;AACxE,MAAA,OAAO,YAAA,GAAe,SAAA,CAAU,YAAA,GAAe,UAAA,GAAa,WAAA;AAAA,IAChE;AACA,IAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA,CAAI,IAAI,KAAA,GAAQ,SAAA,CAAU,YAAY,UAAU,CAAA;AAC3E,IAAA,OAAO,YAAA,GAAe,gBAAgB,SAAA,CAAU,OAAA;AAAA,EACpD,CAAA,EAAG,CAAC,SAAA,EAAW,iBAAA,EAAmB,YAAY,CAAC,CAAA;AAG/C,EAAA,MAAM,WAAA,GAAc,KAAK,MAAA,IAAU,CAAA;AACnC,EAAA,MAAM,iBAAiB,UAAA,GAAa,WAAA;AACpC,EAAA,MAAM,YAAA,GAAe,kBAAkB,CAAA,GAAI,aAAA,CAAA;AAC3C,EAAA,MAAM,kBAAkB,YAAA,GAAe,aAAA,IAAiB,MAAA,CAAO,MAAA,GAAS,MAAM,MAAA,CAAO,MAAA;AACrF,EAAA,MAAM,YAAA,GAAA,CAAgB,iBAAiB,YAAA,IAAgB,CAAA;AAEvD,EAAA,MAAM,gBAAA,GAAmBA,iBAAA;AAAA,IACrB,CAAC,MAAA,EAAgB,GAAA,EAAa,CAAA,KAAqC;AAC/D,MAAA,aAAA,CAAc,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAC7B,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,EAAS,qBAAA,EAAsB;AACzD,MAAA,IAAI,IAAA,EAAM,aAAA,CAAc,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,KAAK,CAAA;AAAA,IACjF,CAAA;AAAA,IAAG;AAAC,GACR;AAEA,EAAA,MAAM,eAAA,GAAkBA,iBAAA,CAAY,CAAC,CAAA,KAAqC;AACtE,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,EAAS,qBAAA,EAAsB;AACzD,IAAA,IAAI,IAAA,EAAM,aAAA,CAAc,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,KAAK,CAAA;AAAA,EACjF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,kBAAY,MAAM;AACvC,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAa,sCAAA;AAEnB,EAAA,IAAI,cAAA,KAAmB,CAAA,IAAM,YAAA,IAAgB,eAAA,KAAoB,CAAA,EAAI;AACjE,IAAA,sCAAQ,KAAA,EAAA,EAAI,GAAA,EAAK,cAAc,SAAA,EAAWC,qBAAA,CAAK,UAAU,SAAS,CAAA,EAAG,OAAO,YAAA,GAAe,EAAE,QAAQ,MAAA,EAAQ,SAAA,EAAW,KAAI,GAAI,EAAE,QAAO,EAAG,CAAA;AAAA,EAChJ;AAEA,EAAA,uBACIC,eAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAA,EAAc,SAAA,EAAWD,sBAAK,QAAA,EAAU,SAAS,CAAA,EAAG,KAAA,EAAO,EAAE,QAAA,EAAU,YAAY,GAAI,YAAA,GAAe,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,KAAI,GAAI,EAAE,MAAA,EAAO,EAAG,EAC7J,QAAA,EAAA;AAAA,oBAAAC,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,KAAA,EAAO,cAAA;AAAA,QACP,MAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAS,CAAA,IAAA,EAAO,cAAc,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,QAC3C,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,EAAO;AAAA,QAG3B,QAAA,EAAA;AAAA,UAAA,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,KAAS;AACtB,YAAA,MAAM,GAAA,GAAM,SAAS,IAAI,CAAA;AACzB,YAAA,IAAI,KAAA,CAAM,GAAG,CAAA,EAAG,OAAO,IAAA;AACvB,YAAA,uBACIC,cAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBAEG,GAAG,SAAA,GAAY,CAAA;AAAA,gBACf,CAAA,EAAG,GAAA;AAAA,gBACH,UAAA,EAAW,KAAA;AAAA,gBACX,gBAAA,EAAiB,SAAA;AAAA,gBACjB,QAAA,EAAU,oBAAA;AAAA,gBACV,IAAA,EAAK,MAAA;AAAA,gBACL,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA,EAAQ,UAAA,EAAW;AAAA,gBAE1C,sBAAY,IAAI;AAAA,eAAA;AAAA,cATZ,QAAQ,IAAI,CAAA;AAAA,aAUrB;AAAA,UAER,CAAC,CAAA;AAAA,UAGA,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,KAAS;AACtB,YAAA,MAAM,GAAA,GAAM,SAAS,IAAI,CAAA;AACzB,YAAA,IAAI,GAAA,GAAM,YAAA,IAAgB,GAAA,GAAM,eAAA,EAAiB,OAAO,IAAA;AACxD,YAAA,uBACIA,cAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBAEG,GAAG,SAAA,GAAY,CAAA;AAAA,gBACf,CAAA,EAAG,GAAA;AAAA,gBACH,UAAA,EAAW,KAAA;AAAA,gBACX,gBAAA,EAAiB,SAAA;AAAA,gBACjB,QAAA,EAAU,oBAAA;AAAA,gBACV,IAAA,EAAK,MAAA;AAAA,gBACL,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA,EAAQ,UAAA,EAAW;AAAA,gBAE1C,sBAAY,IAAI;AAAA,eAAA;AAAA,cATZ,QAAQ,IAAI,CAAA;AAAA,aAUrB;AAAA,UAER,CAAC,CAAA;AAAA,0BAGDA,cAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACG,EAAA,EAAI,SAAA;AAAA,cACJ,EAAA,EAAI,YAAA;AAAA,cACJ,EAAA,EAAI,SAAA;AAAA,cACJ,EAAA,EAAI,eAAA;AAAA,cACJ,MAAA,EAAO,MAAA;AAAA,cACP,WAAA,EAAa,CAAA;AAAA,cACb,OAAA,EAAS;AAAA;AAAA,WACb;AAAA,UAGC,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,IAAA,KAAS;AAC3B,YAAA,MAAM,MAAA,GAAS,YAAY,IAAA,GAAO,cAAA;AAClC,YAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAC,MAAM,IAAA,KAAS;AACnC,cAAA,MAAM,IAAA,GAAO,MAAA,GAAS,YAAA,GAAe,IAAA,IAAQ,cAAA,GAAiB,aAAA,CAAA;AAC9D,cAAA,MAAM,OAAA,GAAU,OAAO,cAAA,GAAiB,CAAA;AACxC,cAAA,uBACIA,cAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBAEG,EAAA,EAAI,OAAA;AAAA,kBACJ,EAAA,EAAI,YAAA;AAAA,kBACJ,EAAA,EAAI,OAAA;AAAA,kBACJ,EAAA,EAAI,eAAA;AAAA,kBACJ,MAAA,EAAO,MAAA;AAAA,kBACP,WAAA,EAAa,GAAA;AAAA,kBACb,eAAA,EAAgB,KAAA;AAAA,kBAChB,OAAA,EAAS;AAAA,iBAAA;AAAA,gBARJ,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA;AAAA,eAS9B;AAAA,YAER,CAAC,CAAA;AAAA,UACL,CAAC,CAAA;AAAA,UAGA,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,EAAM,GAAA,KAAQ;AAC3B,YAAA,MAAM,GAAA,GAAM,SAAS,IAAI,CAAA;AACzB,YAAA,IAAI,KAAA,CAAM,GAAG,CAAA,EAAG,OAAO,IAAA;AACvB,YAAA,MAAM,UAAA,GAAa,GAAA,KAAQ,CAAA,IAAK,IAAA,KAAS,CAAA;AACzC,YAAA,uBACIA,cAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBAEG,EAAA,EAAI,SAAA;AAAA,gBACJ,EAAA,EAAI,GAAA;AAAA,gBACJ,IAAI,cAAA,GAAiB,aAAA;AAAA,gBACrB,EAAA,EAAI,GAAA;AAAA,gBACJ,MAAA,EAAO,MAAA;AAAA,gBACP,WAAA,EAAa,aAAa,CAAA,GAAI,GAAA;AAAA,gBAC9B,eAAA,EAAiB,aAAa,MAAA,GAAY,KAAA;AAAA,gBAC1C,OAAA,EAAS,aAAa,GAAA,GAAM;AAAA,eAAA;AAAA,cARvB,aAAa,IAAI,CAAA;AAAA,aAS1B;AAAA,UAER,CAAC,CAAA;AAAA,UAGA,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,KAAS;AACtB,YAAA,MAAM,GAAA,GAAM,SAAS,IAAI,CAAA;AACzB,YAAA,IAAI,MAAM,GAAG,CAAA,IAAK,MAAM,YAAA,IAAgB,GAAA,GAAM,iBAAiB,OAAO,IAAA;AACtE,YAAA,uBACIA,cAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBAEG,EAAA,EAAI,SAAA;AAAA,gBACJ,EAAA,EAAI,GAAA;AAAA,gBACJ,IAAI,cAAA,GAAiB,aAAA;AAAA,gBACrB,EAAA,EAAI,GAAA;AAAA,gBACJ,MAAA,EAAO,MAAA;AAAA,gBACP,WAAA,EAAa,GAAA;AAAA,gBACb,eAAA,EAAgB,KAAA;AAAA,gBAChB,OAAA,EAAS;AAAA,eAAA;AAAA,cARJ,aAAa,IAAI,CAAA;AAAA,aAS1B;AAAA,UAER,CAAC,CAAA;AAAA,UAGA,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,EAAO,IAAA,KAAS;AAC1B,YAAA,MAAM,MAAA,GAAS,YAAY,IAAA,GAAO,cAAA;AAElC,YAAA,uCACK,GAAA,EAAA,EACI,QAAA,EAAA;AAAA,cAAA,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,IAAA,KAAS;AAC3B,gBAAA,MAAM,IAAA,GAAO,MAAA,GAAS,YAAA,GAAe,IAAA,IAAQ,cAAA,GAAiB,aAAA,CAAA;AAC9D,gBAAA,MAAM,SAAA,GAAY,UAAA,EAAY,MAAA,KAAW,IAAA,IAAQ,YAAY,GAAA,KAAQ,IAAA;AACrE,gBAAA,MAAM,aAAa,UAAA,KAAe,IAAA;AAElC,gBAAA,IAAI,CAAC,IAAI,QAAA,EAAU;AAEf,kBAAA,MAAMC,OAAAA,GAAS,oBAAoB,GAAA,CAAI,WAAA;AACvC,kBAAA,uBACIF,eAAA;AAAA,oBAAC,GAAA;AAAA,oBAAA;AAAA,sBAEG,cAAc,CAAC,CAAA,KAAM,gBAAA,CAAiB,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,sBACnD,WAAA,EAAa,eAAA;AAAA,sBACb,YAAA,EAAc,gBAAA;AAAA,sBACd,KAAA,EAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,OAAA,EAAS,UAAA,IAAc,CAAC,SAAA,GAAY,GAAA,GAAM,CAAA,EAAG,UAAA,EAAY,oBAAA,EAAqB;AAAA,sBAE1G,QAAA,EAAA;AAAA,wCAAAC,cAAA;AAAA,0BAAC,MAAA;AAAA,0BAAA;AAAA,4BACG,CAAA,EAAG,IAAA;AAAA,4BACH,CAAA,EAAGC,OAAAA;AAAA,4BACH,KAAA,EAAO,cAAA;AAAA,4BACP,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,aAAa,CAAC,CAAA;AAAA,4BACnC,MAAM,GAAA,CAAI,KAAA;AAAA,4BACV,EAAA,EAAI;AAAA;AAAA,yBACR;AAAA,wBAEC,GAAA,CAAI,WAAA,IAAe,EAAA,IAAM,cAAA,IAAkB,EAAA,oBACxCD,cAAA;AAAA,0BAAC,MAAA;AAAA,0BAAA;AAAA,4BACG,CAAA,EAAG,OAAO,cAAA,GAAiB,CAAA;AAAA,4BAC3B,CAAA,EAAGC,OAAAA,GAAS,GAAA,CAAI,WAAA,GAAc,CAAA;AAAA,4BAC9B,UAAA,EAAW,QAAA;AAAA,4BACX,gBAAA,EAAiB,SAAA;AAAA,4BACjB,QAAA,EAAU,eAAA;AAAA,4BACV,IAAA,EAAM,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA;AAAA,4BAC5B,OAAA,EAAS,IAAA;AAAA,4BACT,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA,EAAQ,UAAA,EAAW;AAAA,4BAC3C,UAAA,EAAY,GAAA;AAAA,4BAEX,QAAA,EAAA,WAAA,CAAY,IAAI,KAAK;AAAA;AAAA;AAC1B;AAAA,qBAAA;AAAA,oBA5BC;AAAA,mBA8BT;AAAA,gBAER;AAGA,gBAAA,MAAM,MAAA,GAAS,eAAe,GAAA,CAAI,WAAA;AAClC,gBAAA,MAAM,YAAA,GAAe,cAAA,GAAiB,SAAA,CAAU,WAAA,GAAc,CAAA;AAE9D,gBAAA,uBACIF,eAAA;AAAA,kBAAC,GAAA;AAAA,kBAAA;AAAA,oBAEG,cAAc,CAAC,CAAA,KAAM,gBAAA,CAAiB,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,oBACnD,WAAA,EAAa,eAAA;AAAA,oBACb,YAAA,EAAc,gBAAA;AAAA,oBACd,KAAA,EAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,OAAA,EAAS,UAAA,IAAc,CAAC,SAAA,GAAY,GAAA,GAAM,CAAA,EAAG,UAAA,EAAY,oBAAA,EAAqB;AAAA,oBAG1G,QAAA,EAAA;AAAA,sCAAAC,cAAA;AAAA,wBAAC,MAAA;AAAA,wBAAA;AAAA,0BACG,CAAA,EAAG,IAAA;AAAA,0BACH,CAAA,EAAG,MAAA;AAAA,0BACH,KAAA,EAAO,cAAA;AAAA,0BACP,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,iBAAA,GAAoB,QAAQ,CAAC,CAAA;AAAA,0BAC9C,MAAM,GAAA,CAAI,KAAA;AAAA,0BACV,EAAA,EAAI;AAAA;AAAA,uBACR;AAAA,sBAAA,CAGE,MAAM;AACJ,wBAAA,MAAM,EAAA,GAAK,eAAA,CAAgB,IAAA,EAAM,YAAA,EAAc,cAAA,EAAgB,GAAA,CAAI,KAAA,EAAO,eAAA,EAAiB,SAAA,CAAU,WAAA,GAAc,IAAA,EAAM,CAAA,EAAG,IAAI,EAAE,CAAA;AAClI,wBAAA,uBACID,eAAA,CAAAG,mBAAA,EAAA,EACI,QAAA,EAAA;AAAA,0CAAAF,cAAA,CAAC,MAAA,EAAA,EAAK,GAAG,EAAA,CAAG,IAAA,EAAM,MAAM,EAAA,CAAG,SAAA,EAAW,SAAS,IAAA,EAAM,CAAA;AAAA,0CACrDA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAG,EAAA,CAAG,OAAO,IAAA,EAAK,MAAA,EAAO,MAAA,EAAQ,EAAA,CAAG,aAAa,WAAA,EAAa,GAAA,EAAK,cAAA,EAAe,OAAA,EAAQ,SAAS,GAAA,EAAK,CAAA;AAAA,0CAC9GA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAG,EAAA,CAAG,OAAO,IAAA,EAAK,MAAA,EAAO,MAAA,EAAQ,EAAA,CAAG,aAAa,WAAA,EAAa,GAAA,EAAK,cAAA,EAAe,OAAA,EAAQ,SAAS,GAAA,EAAK;AAAA,yBAAA,EAClH,CAAA;AAAA,sBAER,CAAA,GAAG;AAAA,sBAGF,kBAAkB,EAAA,oBACfA,cAAA;AAAA,wBAAC,MAAA;AAAA,wBAAA;AAAA,0BACG,CAAA,EAAG,OAAO,cAAA,GAAiB,CAAA;AAAA,0BAC3B,CAAA,EAAG,MAAA,GAAS,GAAA,CAAI,WAAA,GAAc,GAAA;AAAA,0BAC9B,UAAA,EAAW,QAAA;AAAA,0BACX,gBAAA,EAAiB,SAAA;AAAA,0BACjB,QAAA,EAAU,eAAA;AAAA,0BACV,IAAA,EAAM,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA;AAAA,0BAC5B,OAAA,EAAS,IAAA;AAAA,0BACT,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA,EAAQ,UAAA,EAAW;AAAA,0BAC3C,UAAA,EAAY,GAAA;AAAA,0BAEX,QAAA,EAAA,WAAA,CAAY,IAAI,KAAK;AAAA;AAAA;AAC1B;AAAA,mBAAA;AAAA,kBA1CC;AAAA,iBA4CT;AAAA,cAER,CAAC,CAAA;AAAA,cAAA,CAGC,MAAM;AACJ,gBAAA,MAAM,gBAAgB,WAAA,GAAc,CAAA,GAAI,CAAA,GAAI,WAAA,GAAc,IAAI,EAAA,GAAK,oBAAA;AACnE,gBAAA,IAAI,kBAAA,EAAoB;AACpB,kBAAA,uBACIA,cAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACG,CAAA,EAAG,SAAS,cAAA,GAAiB,CAAA;AAAA,sBAC7B,GAAG,eAAA,GAAkB,CAAA;AAAA,sBACrB,UAAA,EAAW,KAAA;AAAA,sBACX,QAAA,EAAU,aAAA;AAAA,sBACV,IAAA,EAAK,MAAA;AAAA,sBACL,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA,EAAQ,UAAA,EAAW;AAAA,sBAC3C,WAAW,CAAA,YAAA,EAAe,MAAA,GAAS,iBAAiB,CAAC,CAAA,EAAA,EAAK,kBAAkB,CAAC,CAAA,CAAA,CAAA;AAAA,sBAE5E,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,mBACX;AAAA,gBAER;AACA,gBAAA,uBACIA,cAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACG,CAAA,EAAG,SAAS,cAAA,GAAiB,CAAA;AAAA,oBAC7B,GAAG,eAAA,GAAkB,EAAA;AAAA,oBACrB,UAAA,EAAW,QAAA;AAAA,oBACX,QAAA,EAAU,aAAA;AAAA,oBACV,IAAA,EAAK,MAAA;AAAA,oBACL,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA,EAAQ,UAAA,EAAW;AAAA,oBAE1C,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,iBACX;AAAA,cAER,CAAA;AAAG,aAAA,EAAA,EAjIC,MAAM,IAkId,CAAA;AAAA,UAER,CAAC,CAAA;AAAA,UAKA,SAAA,CAAU,aAAa,MAAM;AAC1B,YAAA,MAAM,MAAA,GAAS,cAAA,GAAiB,SAAA,CAAU,WAAA,GAAc,CAAA;AACxD,YAAA,uBACID,eAAA,CAAAG,mBAAA,EAAA,EACI,QAAA,EAAA;AAAA,8BAAAF,cAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACG,EAAA,EAAI,SAAA;AAAA,kBACJ,IAAI,MAAA,GAAS,CAAA;AAAA,kBACb,EAAA,EAAI,SAAA;AAAA,kBACJ,IAAI,MAAA,GAAS,CAAA;AAAA,kBACb,MAAA,EAAO,MAAA;AAAA,kBACP,WAAA,EAAa;AAAA;AAAA,eACjB;AAAA,6CACC,MAAA,EAAA,EAAK,EAAA,EAAI,SAAA,GAAY,CAAA,EAAG,IAAI,MAAA,GAAS,CAAA,EAAG,EAAA,EAAI,SAAA,GAAY,GAAG,EAAA,EAAI,MAAA,GAAS,GAAG,MAAA,EAAO,MAAA,EAAO,aAAa,CAAA,EAAG,CAAA;AAAA,6CACzG,MAAA,EAAA,EAAK,EAAA,EAAI,SAAA,GAAY,CAAA,EAAG,IAAI,MAAA,GAAS,CAAA,EAAG,EAAA,EAAI,SAAA,GAAY,GAAG,EAAA,EAAI,MAAA,GAAS,GAAG,MAAA,EAAO,MAAA,EAAO,aAAa,CAAA,EAAG;AAAA,aAAA,EAC9G,CAAA;AAAA,UAER,CAAA,GAAG;AAAA,UAAA,CAGD,MAAM;AACJ,YAAA,MAAM,WAAA,GAAc,EAAA;AACpB,YAAA,MAAM,UAAA,GAAa,CAAA;AACnB,YAAA,MAAM,UAAA,GAAa,EAAA;AACnB,YAAA,MAAM,WAAA,GAAc,EAAA;AACpB,YAAA,MAAM,QAAQ,WAAA,GAAc,IAAA;AAC5B,YAAA,MAAM,UAAA,GAAa,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,WAAA,GAAc,UAAA,GAAa,CAAA,CAAE,KAAA,CAAM,MAAA,GAAS,KAAA,GAAQ,UAAU,CAAA;AACnG,YAAA,MAAM,MAAA,GAAS,WAAW,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACnD,YAAA,MAAM,MAAA,GAAS,SAAA,GAAa,UAAA,GAAa,CAAA,GAAM,MAAA,GAAS,CAAA;AACxD,YAAA,MAAM,UAAU,SAAA,GAAY,UAAA,GAAa,CAAA,IAAK,kBAAA,GAAqB,4BAA4B,CAAA,GAAI,CAAA,CAAA;AACnG,YAAA,IAAI,IAAA,GAAO,MAAA;AACX,YAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,cAAA,MAAM,CAAA,GAAI,IAAA;AACV,cAAA,IAAA,IAAQ,WAAW,CAAC,CAAA;AACpB,cAAA,uCACK,GAAA,EAAA,EACG,QAAA,EAAA;AAAA,gCAAAA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAM,CAAA,EAAG,OAAA,GAAU,CAAA,EAAG,KAAA,EAAO,WAAA,EAAa,MAAA,EAAQ,WAAA,EAAa,EAAA,EAAI,CAAA,EAAG,IAAA,EAAM,EAAE,KAAA,EAAO,CAAA;AAAA,gCAC3FA,cAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACG,CAAA,EAAG,IAAI,WAAA,GAAc,UAAA;AAAA,oBACrB,CAAA,EAAG,OAAA;AAAA,oBACH,gBAAA,EAAiB,SAAA;AAAA,oBACjB,QAAA,EAAU,WAAA;AAAA,oBACV,IAAA,EAAK,MAAA;AAAA,oBACL,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA,EAAQ,UAAA,EAAW;AAAA,oBAE1C,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA;AACP,eAAA,EAAA,EAXI,EAAE,OAYV,CAAA;AAAA,YAER,CAAC,CAAA;AAAA,UACL,CAAA;AAAG;AAAA;AAAA,KACP;AAAA,IAGC,eAAe,IAAA,IAAQ,UAAA,IAAc,QAAQ,UAAA,CAAW,MAAM,MAAM,MAAM;AACvE,MAAA,MAAM,MAAM,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA,CAAE,IAAA,CAAK,WAAW,GAAG,CAAA;AAC1D,MAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,MAAA,uBACID,eAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACG,KAAA,EAAO;AAAA,YACH,QAAA,EAAU,UAAA;AAAA,YACV,MAAA,EAAQ,EAAA;AAAA,YACR,aAAA,EAAe,MAAA;AAAA,YACf,eAAA,EAAiB,MAAA;AAAA,YACjB,MAAA,EAAQ,mBAAA;AAAA,YACR,YAAA,EAAc,CAAA;AAAA,YACd,SAAA,EAAW,4BAAA;AAAA,YACX,OAAA,EAAS,MAAA;AAAA,YACT,QAAA,EAAU,EAAA;AAAA,YACV,MAAM,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,GAAI,EAAA,EAAI,iBAAiB,GAAG,CAAA;AAAA,YACtD,KAAK,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,YAClC;AAAA,WACJ;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAC,cAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,UAAA,EAAY,GAAA,EAAK,YAAA,EAAc,CAAA,EAAE,EAAI,QAAA,EAAA,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA,CAAE,IAAA,EAAK,CAAA;AAAA,4BACjFD,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,EAAA,EAAG,EACtE,QAAA,EAAA;AAAA,8BAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,gBAAgB,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,YAAA,EAAc,CAAA,EAAG,eAAA,EAAiB,GAAA,CAAI,OAAM,EAAG,CAAA;AAAA,8CAC7G,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,QAAO,EAAI,QAAA,EAAA;AAAA,gBAAA,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA,CAAE,KAAA;AAAA,gBAAM;AAAA,eAAA,EAAC,CAAA;AAAA,8BAChEA,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,YAAY,GAAA,EAAK,UAAA,EAAY,MAAA,EAAQ,WAAA,EAAa,EAAA,EAAG,EAAI,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA,EAAE;AAAA,aAAA,EACnG;AAAA;AAAA;AAAA,OACJ;AAAA,IAER,CAAA;AAAG,GAAA,EACP,CAAA;AAER","file":"index.js","sourcesContent":["/**\n * Scale-Break Bar Chart — Layout utilities\n *\n * Computes segment heights for stacked bars and grouped bars with\n * Y-axis scale breaks for extreme value ranges.\n */\n\nimport type {\n ScaleBreakDataPoint,\n SeriesConfig,\n BarLayout,\n SegmentLayout,\n GroupedBarLayout,\n GroupedSingleBar,\n AxisBreakInfo,\n} from './types';\n\n// ── Stacked bar layouts (legacy) ──────────────────────────────────\n\nexport function computeBarLayouts(\n data: ScaleBreakDataPoint[],\n series: SeriesConfig[],\n chartHeight: number,\n breakThreshold: number,\n minSegmentPx: number,\n): BarLayout[] {\n if (data.length === 0 || series.length === 0) return [];\n\n const totals = data.map((d) =>\n series.reduce((sum, s) => sum + (Number(d[s.dataKey]) || 0), 0),\n );\n const globalMaxTotal = Math.max(...totals, 1);\n\n return data.map((point) => {\n const values = series.map((s) => Number(point[s.dataKey]) || 0);\n const barTotal = values.reduce((a, b) => a + b, 0);\n const barMaxPx = (barTotal / globalMaxTotal) * chartHeight;\n\n const sorted = [...values].sort((a, b) => b - a);\n const largest = sorted[0] || 0;\n const secondLargest = sorted[1] || 0;\n const isDominated =\n series.length > 1 && secondLargest > 0 && largest / secondLargest > breakThreshold;\n\n let segments: SegmentLayout[];\n\n if (isDominated) {\n const dominantIdx = values.indexOf(largest);\n const nonDominantCount = series.length - 1;\n const reservedPx = nonDominantCount * minSegmentPx * 1.8;\n const dominantPx = Math.max(barMaxPx - reservedPx, minSegmentPx);\n const totalPx = dominantPx + reservedPx;\n\n const nonDomValues = values.map((v, i) => (i === dominantIdx ? 0 : v));\n const nonDominantMax = Math.max(...nonDomValues);\n\n let yOffset = 0;\n segments = values.map((v, i) => {\n let height: number;\n let hasBreak = false;\n\n if (i === dominantIdx) {\n height = dominantPx;\n hasBreak = true;\n } else if (v <= 0) {\n height = 0;\n } else {\n const baseHeight = reservedPx * 0.4;\n const variableHeight = reservedPx * 0.6;\n height = nonDominantMax > 0\n ? baseHeight + (v / nonDominantMax) * variableHeight\n : minSegmentPx;\n }\n\n const seg: SegmentLayout = { seriesIndex: i, value: v, y: yOffset, height, hasBreak, color: series[i].color };\n yOffset += height;\n return seg;\n });\n\n const actualSum = segments.reduce((s, seg) => s + seg.height, 0);\n if (actualSum > 0 && Math.abs(actualSum - totalPx) > 1) {\n const scale = totalPx / actualSum;\n let newY = 0;\n for (const seg of segments) {\n seg.height *= scale;\n seg.y = newY;\n newY += seg.height;\n }\n }\n } else {\n let yOffset = 0;\n segments = values.map((v, i) => {\n const height = barTotal > 0 ? (v / barTotal) * barMaxPx : 0;\n const seg: SegmentLayout = { seriesIndex: i, value: v, y: yOffset, height, hasBreak: false, color: series[i].color };\n yOffset += height;\n return seg;\n });\n }\n\n return { name: point.name, segments };\n });\n}\n\n// ── Grouped bar layouts with Y-axis break ──────────────────────\n\n/**\n * Compute the Y-axis break regions for grouped bars.\n *\n * The chart is split into:\n * - Lower region: 0 → lowerMax (proportional to small values)\n * - Break band: zigzag indicator\n * - Upper region: lowerMax → upperMax (compressed scale for large values)\n */\nexport function computeAxisBreak(\n data: ScaleBreakDataPoint[],\n series: SeriesConfig[],\n chartHeight: number,\n breakThreshold: number,\n): AxisBreakInfo {\n if (data.length === 0 || series.length === 0) {\n return { hasBreak: false, yMin: 0, lowerMax: 0, upperMin: 0, upperMax: 0, lowerPx: chartHeight, breakBandPx: 0, upperPx: 0, transitionPx: 0 };\n }\n\n // Compute per-series max values\n const seriesMaxes = series.map((s) =>\n Math.max(0, ...data.map((d) => Number(d[s.dataKey]) || 0)),\n );\n\n const globalMax = Math.max(...seriesMaxes, 1);\n const sortedDesc = [...seriesMaxes].sort((a, b) => b - a);\n const largestSeriesMax = sortedDesc[0];\n const secondLargestSeriesMax = sortedDesc[1] || 0;\n\n // Check 1: largest dominates second-largest (original check)\n const topDominant =\n series.length > 1 &&\n secondLargestSeriesMax > 0 &&\n largestSeriesMax / secondLargestSeriesMax > breakThreshold;\n\n // Check 2: smallest is dwarfed by the rest\n // e.g. OTC ~100 vs Voice ~2.7M → ratio 27000 >> threshold\n const sortedAsc = [...seriesMaxes].filter((v) => v > 0).sort((a, b) => a - b);\n const bottomDwarfed =\n sortedAsc.length >= 2 &&\n sortedAsc[0] > 0 &&\n sortedAsc[1] / sortedAsc[0] > breakThreshold;\n\n if (!topDominant && !bottomDwarfed) {\n // No break needed — linear scale\n // Compute dynamic yMin: if all values are clustered (within 20% of each other),\n // start the axis near the minimum so differences are prominent.\n const allValues = data.flatMap((d) =>\n series.map((s) => Number(d[s.dataKey]) || 0),\n ).filter((v) => v > 0);\n const globalMin = allValues.length > 0 ? Math.min(...allValues) : 0;\n\n let yMin = 0;\n let yMax = globalMax;\n\n // Only offset yMin when values are tightly clustered\n if (globalMin > 0 && globalMax > 0 && globalMin / globalMax > 0.8) {\n // Values are clustered — zoom proportional to actual data range\n const dataRange = globalMax - globalMin;\n if (dataRange > 0) {\n yMin = globalMin - dataRange * 1.5;\n yMax = globalMax + dataRange * 0.8;\n } else {\n // All values identical\n yMin = globalMin * 0.95;\n yMax = globalMax * 1.05;\n }\n yMin = Math.max(0, yMin);\n\n // Snap yMin down based on data granularity (not full range)\n const snapMag = Math.pow(10, Math.floor(Math.log10(Math.max(dataRange, yMax * 0.01))));\n yMin = Math.floor(yMin / snapMag) * snapMag;\n } else {\n yMax = globalMax * 1.05; // small headroom even for wide-range data\n }\n\n return { hasBreak: false, yMin, lowerMax: yMax, upperMin: yMax, upperMax: yMax, lowerPx: chartHeight, breakBandPx: 0, upperPx: 0, transitionPx: 0 };\n }\n\n // Compute lower region max based on which check triggered\n let lowerMax: number;\n if (bottomDwarfed && topDominant) {\n // Both triggered — use the smaller (more aggressive) lowerMax\n lowerMax = Math.min(sortedAsc[0] * 1.5, secondLargestSeriesMax * 1.3);\n } else if (bottomDwarfed) {\n // Smallest series is dwarfed — lowerMax just above the smallest\n lowerMax = sortedAsc[0] * 1.5;\n } else {\n // Top dominant — lowerMax just above the second largest\n lowerMax = secondLargestSeriesMax * 1.3;\n }\n\n // Compute upperMin: zoom the dominant series so clustered large bars are distinguishable\n // Focus on the dominant series (highest max) — other series may be at a different magnitude\n const dominantIdx = seriesMaxes.indexOf(Math.max(...seriesMaxes));\n const dominantValues = data\n .map(d => Number(d[series[dominantIdx].dataKey]) || 0)\n .filter(v => v > lowerMax);\n\n let upperMin = lowerMax;\n if (dominantValues.length > 1) {\n const minDom = Math.min(...dominantValues);\n const maxDom = Math.max(...dominantValues);\n const domRange = maxDom - minDom;\n // Zoom when dominant values are tightly clustered (variation < 10% of minimum)\n if (domRange > 0 && minDom > 0 && domRange / minDom < 0.1) {\n upperMin = minDom - domRange * 1.5;\n const snapMag = Math.pow(10, Math.floor(Math.log10(Math.max(domRange, 1))));\n upperMin = Math.floor(upperMin / snapMag) * snapMag;\n upperMin = Math.max(upperMin, lowerMax);\n }\n }\n\n // Headroom: tighter when zoomed so bars fill the upper region well\n let computedUpperMax: number;\n if (upperMin > lowerMax) {\n const zoomedRange = globalMax - upperMin;\n computedUpperMax = globalMax + zoomedRange * 0.15;\n } else {\n computedUpperMax = globalMax * 1.15;\n }\n\n const breakBandPx = 14; // fixed height for zigzag band\n const lowerPx = chartHeight * 0.40; // 40% for lower region\n const upperPx = chartHeight - lowerPx - breakBandPx;\n // Reserve 15% of upper region for the gap transition zone (bars between lowerMax and upperMin)\n const transitionPx = upperMin > lowerMax ? upperPx * 0.15 : 0;\n\n return {\n hasBreak: true,\n yMin: 0,\n lowerMax,\n upperMin,\n upperMax: computedUpperMax,\n lowerPx,\n breakBandPx,\n upperPx,\n transitionPx,\n };\n}\n\n/**\n * Compute grouped bar layouts using the axis break info.\n */\nexport function computeGroupedLayouts(\n data: ScaleBreakDataPoint[],\n series: SeriesConfig[],\n axisBreak: AxisBreakInfo,\n): GroupedBarLayout[] {\n return data.map((point) => {\n const bars: GroupedSingleBar[] = series.map((s, i) => {\n const value = Number(point[s.dataKey]) || 0;\n\n if (!axisBreak.hasBreak || value <= axisBreak.lowerMax) {\n // Bar fits entirely in lower region\n const range = axisBreak.lowerMax - axisBreak.yMin;\n const height = range > 0\n ? ((value - axisBreak.yMin) / range) * axisBreak.lowerPx\n : 0;\n return {\n seriesIndex: i,\n value,\n color: s.color,\n totalHeight: Math.max(0, height),\n lowerHeight: Math.max(0, height),\n upperHeight: 0,\n hasBreak: false,\n };\n }\n\n // Bar crosses the break\n const lowerHeight = axisBreak.lowerPx; // fills entire lower region\n const upperRange = axisBreak.upperMax - axisBreak.upperMin;\n\n let upperHeight: number;\n if (axisBreak.transitionPx > 0) {\n // Zoomed upper region: use transition zone for gap bars\n const remainingPx = axisBreak.upperPx - axisBreak.transitionPx;\n if (value <= axisBreak.upperMin) {\n // Bar is in the gap (lowerMax < value ≤ upperMin) → transition zone\n const gapRange = axisBreak.upperMin - axisBreak.lowerMax;\n const gapFrac = gapRange > 0 ? (value - axisBreak.lowerMax) / gapRange : 1;\n upperHeight = Math.sqrt(gapFrac) * axisBreak.transitionPx;\n } else {\n // Bar is in the zoomed region → starts from above transition ceiling\n const zoomedFrac = upperRange > 0 ? (value - axisBreak.upperMin) / upperRange : 0;\n upperHeight = axisBreak.transitionPx + zoomedFrac * remainingPx;\n }\n } else {\n // No zoom — normal mapping\n const upperFraction = upperRange > 0 ? Math.max(0, (value - axisBreak.upperMin) / upperRange) : 0;\n upperHeight = upperFraction * axisBreak.upperPx;\n }\n\n const totalHeight = lowerHeight + axisBreak.breakBandPx + upperHeight;\n\n return {\n seriesIndex: i,\n value,\n color: s.color,\n totalHeight,\n lowerHeight,\n upperHeight,\n hasBreak: true,\n };\n });\n\n return { name: point.name, bars };\n });\n}\n\n// ── Shared utilities ──────────────────────────────────────────────\n\nexport function computeBreakPath(\n x: number,\n y: number,\n width: number,\n amplitude: number = 4,\n teeth: number = 6,\n): string {\n const step = width / (teeth * 2);\n let d = `M ${x} ${y}`;\n for (let i = 0; i < teeth * 2; i++) {\n const px = x + step * (i + 1);\n const py = i % 2 === 0 ? y - amplitude : y + amplitude;\n d += ` L ${px} ${py}`;\n }\n return d;\n}\n","/**\n * Scale-Break Bar Chart — Grouped mode\n *\n * A custom SVG chart that renders N bars side-by-side per period.\n * When one series has values orders of magnitude larger, a Y-axis\n * scale break compresses the upper region so small values stay visible.\n * The zigzag break indicator extends past bar borders.\n */\n\nimport React, { useRef, useState, useEffect, useMemo, useCallback } from 'react';\nimport clsx from 'clsx';\nimport type { ScaleBreakBarChartProps } from './types';\nimport { computeAxisBreak, computeGroupedLayouts } from './utils';\n\n// Layout constants\nconst PADDING_TOP = 12;\nconst PADDING_BOTTOM = 10;\nconst LEGEND_AREA_BASE = 36;\nconst LEGEND_AREA_ROTATED_EXTRA = 40; // extra space when x-axis labels are rotated\nconst PADDING_RIGHT = 12;\nconst X_LABEL_ROTATE_THRESHOLD = 4; // rotate labels if avg chars exceed slot width at this ratio\nconst BAR_GAP_RATIO = 0.15; // gap between groups\nconst INNER_BAR_GAP = 3; // gap between bars within a group\nconst AXIS_LABEL_FONT_SIZE = 12;\nconst VALUE_FONT_SIZE = 9;\nconst Y_AXIS_WIDTH = 76;\nconst ZIGZAG_OVERFLOW = 5; // px the zigzag extends past bar borders\n\n/** Compute nice Y-axis ticks */\nfunction computeYTicks(maxVal: number, tickCount: number, minVal: number = 0): number[] {\n if (maxVal <= minVal) return [minVal];\n const range = maxVal - minVal;\n const rough = range / (tickCount - 1);\n const mag = Math.pow(10, Math.floor(Math.log10(rough)));\n const nice = [1, 2, 2.5, 5, 10].find((n) => n * mag >= rough) || 10;\n const step = nice * mag;\n const ticks: number[] = [];\n // Start from a nice number at or below minVal\n const start = Math.floor(minVal / step) * step;\n for (let v = start; v <= maxVal + step * 0.01; v += step) {\n ticks.push(v);\n }\n if (ticks.length > tickCount + 2) ticks.splice(tickCount + 2);\n return ticks;\n}\n\n/** Parse hex to RGB tuple. */\nfunction hexToRgb(hex: string): [number, number, number] {\n const h = hex.replace('#', '');\n return [\n parseInt(h.substring(0, 2), 16),\n parseInt(h.substring(2, 4), 16),\n parseInt(h.substring(4, 6), 16),\n ];\n}\n\n/** Darken a hex colour by a fraction (0–1). */\nfunction darkenHex(hex: string, amount: number): string {\n const [r, g, b] = hexToRgb(hex);\n const dr = Math.max(0, Math.round(r * (1 - amount)));\n const dg = Math.max(0, Math.round(g * (1 - amount)));\n const db = Math.max(0, Math.round(b * (1 - amount)));\n return `#${dr.toString(16).padStart(2, '0')}${dg.toString(16).padStart(2, '0')}${db.toString(16).padStart(2, '0')}`;\n}\n\n/** Relative luminance (0 = black, 1 = white). */\nfunction luminance(hex: string): number {\n const [r, g, b] = hexToRgb(hex);\n const [rs, gs, bs] = [r / 255, g / 255, b / 255].map((c) =>\n c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4),\n );\n return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;\n}\n\n/** Return a contrasting text colour for a given bar colour. */\nfunction contrastText(barColor: string): string {\n return luminance(barColor) > 0.4 ? '#1a1a1a' : '#f5f5f5';\n}\n\n/**\n * Generates the inclined sawtooth break indicator paths.\n * Teeth slope upward from left to right. Fill colour is a darker shade of the bar's own colour.\n */\nfunction buildBreakPaths(\n x: number,\n yCenter: number,\n width: number,\n barColor: string,\n overflow: number = ZIGZAG_OVERFLOW,\n gap: number = 10,\n amplitude: number = 5,\n toothWidth: number = 12,\n slope: number = 6,\n): { upper: string; lower: string; fill: string; fillColor: string; strokeColor: string } {\n const extX = x - overflow;\n const extWidth = width + overflow * 2;\n const teeth = Math.max(2, Math.ceil(extWidth / toothWidth));\n const step = extWidth / teeth;\n // slope applied per pixel across the width\n const slopePerPx = slope / extWidth;\n\n const upperPts: { x: number; y: number }[] = [];\n const yUpperLeft = yCenter - gap / 2;\n upperPts.push({ x: extX, y: yUpperLeft });\n for (let i = 0; i < teeth; i++) {\n const midX = extX + step * i + step / 2;\n const endX = extX + step * (i + 1);\n const midSlope = (midX - extX) * slopePerPx;\n const endSlope = (endX - extX) * slopePerPx;\n upperPts.push({ x: midX, y: yUpperLeft - midSlope - amplitude });\n upperPts.push({ x: endX, y: yUpperLeft - endSlope });\n }\n\n const lowerPts: { x: number; y: number }[] = [];\n const yLowerLeft = yCenter + gap / 2;\n lowerPts.push({ x: extX, y: yLowerLeft });\n for (let i = 0; i < teeth; i++) {\n const midX = extX + step * i + step / 2;\n const endX = extX + step * (i + 1);\n const midSlope = (midX - extX) * slopePerPx;\n const endSlope = (endX - extX) * slopePerPx;\n lowerPts.push({ x: midX, y: yLowerLeft - midSlope + amplitude });\n lowerPts.push({ x: endX, y: yLowerLeft - endSlope });\n }\n\n const toPath = (pts: { x: number; y: number }[]): string =>\n `M ${pts[0].x} ${pts[0].y}` +\n pts.slice(1).map((p) => ` L ${p.x} ${p.y}`).join('');\n\n const fillD =\n toPath(upperPts) +\n ` L ${lowerPts[lowerPts.length - 1].x} ${lowerPts[lowerPts.length - 1].y}` +\n [...lowerPts].reverse().slice(1).map((p) => ` L ${p.x} ${p.y}`).join('') +\n ' Z';\n\n return {\n upper: toPath(upperPts),\n lower: toPath(lowerPts),\n fill: fillD,\n fillColor: darkenHex(barColor, 0.25),\n strokeColor: darkenHex(barColor, 0.4),\n };\n}\n\nexport function ScaleBreakBarChart({\n data,\n series,\n height = 350,\n breakThreshold = 5,\n formatValue = String,\n className,\n}: ScaleBreakBarChartProps) {\n const isAutoHeight = height === 'auto';\n const containerRef = useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = useState(0);\n const [containerHeight, setContainerHeight] = useState(0);\n const [hoveredBar, setHoveredBar] = useState<{ period: number; bar: number } | null>(null);\n const [tooltipPos, setTooltipPos] = useState<{ x: number; y: number } | null>(null);\n\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n const ro = new ResizeObserver((entries) => {\n for (const entry of entries) {\n setContainerWidth(entry.contentRect.width);\n if (isAutoHeight) setContainerHeight(entry.contentRect.height);\n }\n });\n ro.observe(el);\n const rect = el.getBoundingClientRect();\n setContainerWidth(rect.width);\n if (isAutoHeight) setContainerHeight(rect.height);\n return () => ro.disconnect();\n }, [isAutoHeight]);\n\n const resolvedHeight = isAutoHeight ? containerHeight : (height as number);\n const svgHeight = resolvedHeight;\n const chartLeft = Y_AXIS_WIDTH;\n const chartWidth = containerWidth - chartLeft - PADDING_RIGHT;\n\n // Detect whether labels need rotation (computed once for the entire chart)\n const needsRotatedLabels = useMemo(() => {\n const avgLabelLen = data.reduce((s, d) => s + d.name.length, 0) / (data.length || 1);\n const periodCnt = data.length || 1;\n const slotW = chartWidth / periodCnt;\n const charPx = (periodCnt > 6 ? 9 : AXIS_LABEL_FONT_SIZE) * 0.55;\n return avgLabelLen * charPx > slotW * 0.85;\n }, [data, chartWidth]);\n\n const legendArea = LEGEND_AREA_BASE + (needsRotatedLabels ? LEGEND_AREA_ROTATED_EXTRA : 0);\n\n const chartAreaTop = PADDING_TOP;\n const chartAreaBottom = svgHeight - PADDING_BOTTOM - legendArea;\n const chartHeight = chartAreaBottom - chartAreaTop;\n\n // Compute axis break regions\n const axisBreak = useMemo(\n () => computeAxisBreak(data, series, chartHeight, breakThreshold),\n [data, series, chartHeight, breakThreshold],\n );\n\n // Compute grouped layouts\n const layouts = useMemo(\n () => computeGroupedLayouts(data, series, axisBreak),\n [data, series, axisBreak],\n );\n\n // Break region pixel positions\n const lowerRegionBottom = chartAreaBottom;\n const lowerRegionTop = chartAreaBottom - axisBreak.lowerPx;\n const breakBandTop = lowerRegionTop - axisBreak.breakBandPx;\n\n // Y-axis ticks for lower region\n const lowerTicks = useMemo(\n () => computeYTicks(axisBreak.lowerMax, axisBreak.hasBreak ? 6 : 8, axisBreak.yMin),\n [axisBreak.lowerMax, axisBreak.hasBreak, axisBreak.yMin],\n );\n\n // Y-axis ticks for upper region (if break exists)\n const upperTicks = useMemo(() => {\n if (!axisBreak.hasBreak) return [];\n // Generate nice round ticks directly in absolute value space\n const lo = axisBreak.upperMin;\n const hi = axisBreak.upperMax;\n const range = hi - lo;\n if (range <= 0) return [];\n const rough = range / 3; // aim for ~4 ticks\n const mag = Math.pow(10, Math.floor(Math.log10(rough)));\n const nice = [1, 2, 2.5, 5, 10].find((n) => n * mag >= rough) || 10;\n const step = nice * mag;\n const ticks: number[] = [];\n // Start from the first nice number above lowerMax\n const start = Math.ceil(lo / step) * step;\n for (let v = start; v <= hi + step * 0.01; v += step) {\n if (v > lo) ticks.push(v);\n }\n return ticks;\n }, [axisBreak]);\n\n // Convert a value to pixel Y position\n const valueToY = useCallback((value: number): number => {\n if (!axisBreak.hasBreak || value <= axisBreak.lowerMax) {\n const range = axisBreak.lowerMax - axisBreak.yMin;\n if (range === 0) return lowerRegionBottom;\n return lowerRegionBottom - ((value - axisBreak.yMin) / range) * axisBreak.lowerPx;\n }\n const upperRange = axisBreak.upperMax - axisBreak.upperMin;\n if (upperRange === 0) return breakBandTop;\n if (axisBreak.transitionPx > 0) {\n // Zoomed: ticks live in the zoomed sub-region above the transition zone\n const remainingPx = axisBreak.upperPx - axisBreak.transitionPx;\n const zoomedFrac = Math.max(0, (value - axisBreak.upperMin) / upperRange);\n return breakBandTop - axisBreak.transitionPx - zoomedFrac * remainingPx;\n }\n const upperFraction = Math.max(0, (value - axisBreak.upperMin) / upperRange);\n return breakBandTop - upperFraction * axisBreak.upperPx;\n }, [axisBreak, lowerRegionBottom, breakBandTop]);\n\n // Bar sizing\n const periodCount = data.length || 1;\n const groupSlotWidth = chartWidth / periodCount;\n const groupBarArea = groupSlotWidth * (1 - BAR_GAP_RATIO);\n const singleBarWidth = (groupBarArea - INNER_BAR_GAP * (series.length - 1)) / series.length;\n const groupPadding = (groupSlotWidth - groupBarArea) / 2;\n\n const handleMouseEnter = useCallback(\n (period: number, bar: number, e: React.MouseEvent<SVGGElement>) => {\n setHoveredBar({ period, bar });\n const rect = containerRef.current?.getBoundingClientRect();\n if (rect) setTooltipPos({ x: e.clientX - rect.left, y: e.clientY - rect.top });\n }, [],\n );\n\n const handleMouseMove = useCallback((e: React.MouseEvent<SVGGElement>) => {\n const rect = containerRef.current?.getBoundingClientRect();\n if (rect) setTooltipPos({ x: e.clientX - rect.left, y: e.clientY - rect.top });\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setHoveredBar(null);\n setTooltipPos(null);\n }, []);\n\n const fontFamily = 'system-ui, -apple-system, sans-serif';\n\n if (containerWidth === 0 || (isAutoHeight && containerHeight === 0)) {\n return <div ref={containerRef} className={clsx('w-full', className)} style={isAutoHeight ? { height: '100%', minHeight: 200 } : { height }} />;\n }\n\n return (\n <div ref={containerRef} className={clsx('w-full', className)} style={{ position: 'relative', ...(isAutoHeight ? { height: '100%', minHeight: 200 } : { height }) }}>\n <svg\n width={containerWidth}\n height={svgHeight}\n viewBox={`0 0 ${containerWidth} ${svgHeight}`}\n style={{ userSelect: 'none' }}\n >\n {/* ── Y-axis labels — lower region ── */}\n {lowerTicks.map((tick) => {\n const yPx = valueToY(tick);\n if (isNaN(yPx)) return null;\n return (\n <text\n key={`ylow-${tick}`}\n x={chartLeft - 6}\n y={yPx}\n textAnchor=\"end\"\n dominantBaseline=\"central\"\n fontSize={AXIS_LABEL_FONT_SIZE}\n fill=\"#999\"\n style={{ pointerEvents: 'none', fontFamily }}\n >\n {formatValue(tick)}\n </text>\n );\n })}\n\n {/* ── Y-axis labels — upper region ── */}\n {upperTicks.map((tick) => {\n const yPx = valueToY(tick);\n if (yPx < chartAreaTop || yPx > chartAreaBottom) return null;\n return (\n <text\n key={`yupp-${tick}`}\n x={chartLeft - 6}\n y={yPx}\n textAnchor=\"end\"\n dominantBaseline=\"central\"\n fontSize={AXIS_LABEL_FONT_SIZE}\n fill=\"#999\"\n style={{ pointerEvents: 'none', fontFamily }}\n >\n {formatValue(tick)}\n </text>\n );\n })}\n\n {/* ── Y-axis vertical line ── */}\n <line\n x1={chartLeft}\n y1={chartAreaTop}\n x2={chartLeft}\n y2={chartAreaBottom}\n stroke=\"#999\"\n strokeWidth={1}\n opacity={0.3}\n />\n\n {/* ── Vertical gridlines (behind bars) ── */}\n {layouts.map((_group, gIdx) => {\n const groupX = chartLeft + gIdx * groupSlotWidth;\n return _group.bars.map((_bar, bIdx) => {\n const barX = groupX + groupPadding + bIdx * (singleBarWidth + INNER_BAR_GAP);\n const centerX = barX + singleBarWidth / 2;\n return (\n <line\n key={`vgrid-${gIdx}-${bIdx}`}\n x1={centerX}\n y1={chartAreaTop}\n x2={centerX}\n y2={chartAreaBottom}\n stroke=\"#999\"\n strokeWidth={0.8}\n strokeDasharray=\"4 4\"\n opacity={0.2}\n />\n );\n });\n })}\n\n {/* ── Horizontal gridlines — lower region (behind bars) ── */}\n {lowerTicks.map((tick, idx) => {\n const yPx = valueToY(tick);\n if (isNaN(yPx)) return null;\n const isBaseline = idx === 0 || tick === 0;\n return (\n <line\n key={`hgrid-low-${tick}`}\n x1={chartLeft}\n y1={yPx}\n x2={containerWidth - PADDING_RIGHT}\n y2={yPx}\n stroke=\"#999\"\n strokeWidth={isBaseline ? 1 : 0.8}\n strokeDasharray={isBaseline ? undefined : '6 4'}\n opacity={isBaseline ? 0.4 : 0.2}\n />\n );\n })}\n\n {/* ── Horizontal gridlines — upper region (behind bars) ── */}\n {upperTicks.map((tick) => {\n const yPx = valueToY(tick);\n if (isNaN(yPx) || yPx < chartAreaTop || yPx > chartAreaBottom) return null;\n return (\n <line\n key={`hgrid-upp-${tick}`}\n x1={chartLeft}\n y1={yPx}\n x2={containerWidth - PADDING_RIGHT}\n y2={yPx}\n stroke=\"#999\"\n strokeWidth={0.8}\n strokeDasharray=\"6 4\"\n opacity={0.2}\n />\n );\n })}\n\n {/* ── Bars ── */}\n {layouts.map((group, gIdx) => {\n const groupX = chartLeft + gIdx * groupSlotWidth;\n\n return (\n <g key={group.name}>\n {group.bars.map((bar, bIdx) => {\n const barX = groupX + groupPadding + bIdx * (singleBarWidth + INNER_BAR_GAP);\n const isHovered = hoveredBar?.period === gIdx && hoveredBar?.bar === bIdx;\n const anyHovered = hoveredBar !== null;\n\n if (!bar.hasBreak) {\n // Simple bar — fits in lower region\n const barTop = lowerRegionBottom - bar.lowerHeight;\n return (\n <g\n key={bIdx}\n onMouseEnter={(e) => handleMouseEnter(gIdx, bIdx, e)}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n style={{ cursor: 'pointer', opacity: anyHovered && !isHovered ? 0.4 : 1, transition: 'opacity 150ms ease' }}\n >\n <rect\n x={barX}\n y={barTop}\n width={singleBarWidth}\n height={Math.max(bar.lowerHeight, 0)}\n fill={bar.color}\n rx={2}\n />\n {/* Value label */}\n {bar.lowerHeight >= 18 && singleBarWidth >= 30 && (\n <text\n x={barX + singleBarWidth / 2}\n y={barTop + bar.lowerHeight / 2}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fontSize={VALUE_FONT_SIZE}\n fill={contrastText(bar.color)}\n opacity={0.85}\n style={{ pointerEvents: 'none', fontFamily }}\n fontWeight={500}\n >\n {formatValue(bar.value)}\n </text>\n )}\n </g>\n );\n }\n\n // Bar with break — crosses into upper region\n const barTop = breakBandTop - bar.upperHeight;\n const breakCenterY = lowerRegionTop - axisBreak.breakBandPx / 2;\n\n return (\n <g\n key={bIdx}\n onMouseEnter={(e) => handleMouseEnter(gIdx, bIdx, e)}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n style={{ cursor: 'pointer', opacity: anyHovered && !isHovered ? 0.4 : 1, transition: 'opacity 150ms ease' }}\n >\n {/* Full bar rectangle */}\n <rect\n x={barX}\n y={barTop}\n width={singleBarWidth}\n height={Math.max(lowerRegionBottom - barTop, 0)}\n fill={bar.color}\n rx={2}\n />\n\n {/* Inclined sawtooth break — darker shade of bar colour */}\n {(() => {\n const bp = buildBreakPaths(barX, breakCenterY, singleBarWidth, bar.color, ZIGZAG_OVERFLOW, axisBreak.breakBandPx * 0.45, 4, 10, 16);\n return (\n <>\n <path d={bp.fill} fill={bp.fillColor} opacity={0.92} />\n <path d={bp.upper} fill=\"none\" stroke={bp.strokeColor} strokeWidth={1.2} strokeLinejoin=\"bevel\" opacity={0.7} />\n <path d={bp.lower} fill=\"none\" stroke={bp.strokeColor} strokeWidth={1.2} strokeLinejoin=\"bevel\" opacity={0.7} />\n </>\n );\n })()}\n\n {/* Value label above the break */}\n {singleBarWidth >= 30 && (\n <text\n x={barX + singleBarWidth / 2}\n y={barTop + bar.upperHeight * 0.5}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fontSize={VALUE_FONT_SIZE}\n fill={contrastText(bar.color)}\n opacity={0.85}\n style={{ pointerEvents: 'none', fontFamily }}\n fontWeight={500}\n >\n {formatValue(bar.value)}\n </text>\n )}\n </g>\n );\n })}\n\n {/* X-axis label for this period */}\n {(() => {\n const labelFontSize = periodCount > 8 ? 9 : periodCount > 6 ? 10 : AXIS_LABEL_FONT_SIZE;\n if (needsRotatedLabels) {\n return (\n <text\n x={groupX + groupSlotWidth / 2}\n y={chartAreaBottom + 6}\n textAnchor=\"end\"\n fontSize={labelFontSize}\n fill=\"#999\"\n style={{ pointerEvents: 'none', fontFamily }}\n transform={`rotate(-55, ${groupX + groupSlotWidth / 2}, ${chartAreaBottom + 6})`}\n >\n {group.name}\n </text>\n );\n }\n return (\n <text\n x={groupX + groupSlotWidth / 2}\n y={chartAreaBottom + 14}\n textAnchor=\"middle\"\n fontSize={labelFontSize}\n fill=\"#999\"\n style={{ pointerEvents: 'none', fontFamily }}\n >\n {group.name}\n </text>\n );\n })()}\n </g>\n );\n })}\n\n\n\n {/* ── Y-axis break indicator on the axis itself ── */}\n {axisBreak.hasBreak && (() => {\n const breakY = lowerRegionTop - axisBreak.breakBandPx / 2;\n return (\n <>\n <line\n x1={chartLeft}\n y1={breakY - 3}\n x2={chartLeft}\n y2={breakY + 3}\n stroke=\"#fff\"\n strokeWidth={4}\n />\n <line x1={chartLeft - 4} y1={breakY - 3} x2={chartLeft + 4} y2={breakY - 1} stroke=\"#888\" strokeWidth={1} />\n <line x1={chartLeft - 4} y1={breakY + 1} x2={chartLeft + 4} y2={breakY + 3} stroke=\"#888\" strokeWidth={1} />\n </>\n );\n })()}\n\n {/* ── Legend ── */}\n {(() => {\n const LEGEND_ICON = 10;\n const LEGEND_GAP = 6;\n const LEGEND_PAD = 16;\n const LEGEND_FONT = 10;\n const charW = LEGEND_FONT * 0.58;\n const itemWidths = series.map((s) => LEGEND_ICON + LEGEND_GAP + s.label.length * charW + LEGEND_PAD);\n const totalW = itemWidths.reduce((a, b) => a + b, 0);\n const startX = chartLeft + (chartWidth / 2) - (totalW / 2);\n const legendY = svgHeight - legendArea / 2 + (needsRotatedLabels ? LEGEND_AREA_ROTATED_EXTRA / 2 : 0);\n let curX = startX;\n return series.map((s, i) => {\n const x = curX;\n curX += itemWidths[i];\n return (\n <g key={s.dataKey}>\n <rect x={x} y={legendY - 5} width={LEGEND_ICON} height={LEGEND_ICON} rx={2} fill={s.color} />\n <text\n x={x + LEGEND_ICON + LEGEND_GAP}\n y={legendY}\n dominantBaseline=\"central\"\n fontSize={LEGEND_FONT}\n fill=\"#999\"\n style={{ pointerEvents: 'none', fontFamily }}\n >\n {s.label}\n </text>\n </g>\n );\n });\n })()}\n </svg>\n\n {/* Tooltip */}\n {hoveredBar !== null && tooltipPos && layouts[hoveredBar.period] && (() => {\n const bar = layouts[hoveredBar.period].bars[hoveredBar.bar];\n if (!bar) return null;\n return (\n <div\n style={{\n position: 'absolute',\n zIndex: 50,\n pointerEvents: 'none',\n backgroundColor: '#fff',\n border: '1px solid #e0e0e0',\n borderRadius: 8,\n boxShadow: '0 2px 8px rgba(0,0,0,0.12)',\n padding: '12px',\n fontSize: 14,\n left: Math.min(tooltipPos.x + 12, containerWidth - 200),\n top: Math.max(tooltipPos.y - 20, 0),\n fontFamily,\n }}\n >\n <p style={{ fontWeight: 600, marginBottom: 4 }}>{layouts[hoveredBar.period].name}</p>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, fontSize: 12 }}>\n <span style={{ display: 'inline-block', width: 10, height: 10, borderRadius: 2, backgroundColor: bar.color }} />\n <span style={{ color: '#888' }}>{series[bar.seriesIndex].label}:</span>\n <span style={{ fontWeight: 500, marginLeft: 'auto', paddingLeft: 12 }}>{formatValue(bar.value)}</span>\n </div>\n </div>\n );\n })()}\n </div>\n );\n}\n"]}
|