drizzle-cube 0.4.53 → 0.5.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/dist/adapters/express/index.cjs +2 -2
- package/dist/adapters/express/index.js +92 -83
- package/dist/adapters/fastify/index.cjs +2 -2
- package/dist/adapters/fastify/index.js +126 -116
- package/dist/adapters/{handler-RItnSaEl.js → handler-3LGcjLtr.js} +617 -612
- package/dist/adapters/handler-BzzbVpcl.cjs +25 -0
- package/dist/adapters/hono/index.cjs +1 -1
- package/dist/adapters/hono/index.js +94 -86
- package/dist/adapters/{compiler-S6KHiOY6.js → locale-DTnJrxm1.js} +1700 -1563
- package/dist/adapters/locale-DueXjqMh.cjs +198 -0
- package/dist/adapters/locale.d.ts +8 -0
- package/dist/adapters/mcp-tools.cjs +1 -1
- package/dist/adapters/mcp-tools.js +14 -14
- package/dist/adapters/mcp-transport-45SiFcCH.cjs +39 -0
- package/dist/adapters/mcp-transport-Bxpc4mRy.js +553 -0
- package/dist/adapters/mcp-transport.d.ts +11 -0
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.js +138 -122
- package/dist/adapters/utils-DNrj-ryp.cjs +17 -0
- package/dist/adapters/{utils-IH1ePsBd.js → utils-DOg9oGdt.js} +2341 -819
- package/dist/adapters/utils.cjs +1 -1
- package/dist/adapters/utils.d.ts +7 -0
- package/dist/adapters/utils.js +1 -1
- package/dist/client/charts.js +12 -12
- package/dist/client/chunks/{DashboardEditModal-BTdV528l.js → DashboardEditModal-cSSIAZGy.js} +1968 -1973
- package/dist/client/chunks/DashboardEditModal-cSSIAZGy.js.map +1 -0
- package/dist/client/chunks/{FieldSearchModal-D75vy4Wb.js → FieldSearchModal-CZNo4pNK.js} +550 -536
- package/dist/client/chunks/FieldSearchModal-CZNo4pNK.js.map +1 -0
- package/dist/client/chunks/KpiDelta-Dll_eCV1.js +2 -0
- package/dist/client/chunks/KpiNumber-BPlR92hI.js +2 -0
- package/dist/client/chunks/KpiText-BIxq7Jso.js +2 -0
- package/dist/client/chunks/{RetentionCombinedChart-DIhK5pD8.js → RetentionCombinedChart-BD8tGeM_.js} +96 -96
- package/dist/client/chunks/RetentionCombinedChart-BD8tGeM_.js.map +1 -0
- package/dist/client/chunks/{RetentionHeatmap-CyREolyP.js → RetentionHeatmap-B_5sewwi.js} +77 -77
- package/dist/client/chunks/RetentionHeatmap-B_5sewwi.js.map +1 -0
- package/dist/client/chunks/SchemaVisualization-CCICjhvv.js +2 -0
- package/dist/client/chunks/SchemaVisualizationLazy-DraGsMx6.js +2 -0
- package/dist/client/chunks/af-ZA-xDmO5F0s.js +1431 -0
- package/dist/client/chunks/af-ZA-xDmO5F0s.js.map +1 -0
- package/dist/client/chunks/{analysis-builder-C1CJ0c7L.js → analysis-builder-BeVZhiQ5.js} +1519 -1507
- package/dist/client/chunks/analysis-builder-BeVZhiQ5.js.map +1 -0
- package/dist/client/chunks/{analysis-builder-shared-rkjJfWLT.js → analysis-builder-shared-BWc7ZZnG.js} +925 -954
- package/dist/client/chunks/analysis-builder-shared-BWc7ZZnG.js.map +1 -0
- package/dist/client/chunks/chart-activity-grid-CWT0gLv4.js +2376 -0
- package/dist/client/chunks/chart-activity-grid-CWT0gLv4.js.map +1 -0
- package/dist/client/chunks/{chart-area-BwYaflNk.js → chart-area-D63kG8OT.js} +157 -157
- package/dist/client/chunks/chart-area-D63kG8OT.js.map +1 -0
- package/dist/client/chunks/{chart-bar-BiENfFgE.js → chart-bar-BEfsCLjl.js} +78 -78
- package/dist/client/chunks/chart-bar-BEfsCLjl.js.map +1 -0
- package/dist/client/chunks/{chart-box-plot-BJF1tBXC.js → chart-box-plot-o-h9MRX5.js} +111 -114
- package/dist/client/chunks/chart-box-plot-o-h9MRX5.js.map +1 -0
- package/dist/client/chunks/{chart-bubble-DQQhGVDJ.js → chart-bubble-CMDp4Pfm.js} +121 -121
- package/dist/client/chunks/chart-bubble-CMDp4Pfm.js.map +1 -0
- package/dist/client/chunks/chart-candlestick-WyANJ0Ky.js +303 -0
- package/dist/client/chunks/chart-candlestick-WyANJ0Ky.js.map +1 -0
- package/dist/client/chunks/chart-config-activity-grid-C-EkgYoa.js +51 -0
- package/dist/client/chunks/chart-config-activity-grid-C-EkgYoa.js.map +1 -0
- package/dist/client/chunks/chart-config-area-CMZpbIah.js +93 -0
- package/dist/client/chunks/chart-config-area-CMZpbIah.js.map +1 -0
- package/dist/client/chunks/chart-config-bar-B8_V4YLg.js +87 -0
- package/dist/client/chunks/chart-config-bar-B8_V4YLg.js.map +1 -0
- package/dist/client/chunks/chart-config-box-plot-Dwj7sEbU.js +35 -0
- package/dist/client/chunks/chart-config-box-plot-Dwj7sEbU.js.map +1 -0
- package/dist/client/chunks/chart-config-bubble-B0w0ZVp4.js +82 -0
- package/dist/client/chunks/chart-config-bubble-B0w0ZVp4.js.map +1 -0
- package/dist/client/chunks/chart-config-candlestick-Bvo3zeIn.js +72 -0
- package/dist/client/chunks/chart-config-candlestick-Bvo3zeIn.js.map +1 -0
- package/dist/client/chunks/{chart-config-data-table-Bhdx5Hem.js → chart-config-data-table-BQXSn4b_.js} +9 -9
- package/dist/client/chunks/chart-config-data-table-BQXSn4b_.js.map +1 -0
- package/dist/client/chunks/chart-config-funnel-BzEsHmjR.js +93 -0
- package/dist/client/chunks/chart-config-funnel-BzEsHmjR.js.map +1 -0
- package/dist/client/chunks/chart-config-gauge-C5ZiyZy7.js +64 -0
- package/dist/client/chunks/chart-config-gauge-C5ZiyZy7.js.map +1 -0
- package/dist/client/chunks/chart-config-heat-map-Cv8qNnVP.js +91 -0
- package/dist/client/chunks/chart-config-heat-map-Cv8qNnVP.js.map +1 -0
- package/dist/client/chunks/chart-config-kpi-delta-BraHQc2E.js +94 -0
- package/dist/client/chunks/chart-config-kpi-delta-BraHQc2E.js.map +1 -0
- package/dist/client/chunks/chart-config-kpi-number-CeCkx7mC.js +75 -0
- package/dist/client/chunks/chart-config-kpi-number-CeCkx7mC.js.map +1 -0
- package/dist/client/chunks/chart-config-kpi-text-CImM3SvH.js +47 -0
- package/dist/client/chunks/chart-config-kpi-text-CImM3SvH.js.map +1 -0
- package/dist/client/chunks/chart-config-line-BVKapAQK.js +104 -0
- package/dist/client/chunks/chart-config-line-BVKapAQK.js.map +1 -0
- package/dist/client/chunks/chart-config-markdown-C-_g_8te.js +117 -0
- package/dist/client/chunks/chart-config-markdown-C-_g_8te.js.map +1 -0
- package/dist/client/chunks/chart-config-measure-profile-KTVV1gO3.js +82 -0
- package/dist/client/chunks/chart-config-measure-profile-KTVV1gO3.js.map +1 -0
- package/dist/client/chunks/chart-config-pie-BZxVl25X.js +68 -0
- package/dist/client/chunks/chart-config-pie-BZxVl25X.js.map +1 -0
- package/dist/client/chunks/chart-config-radar-B7FByX3t.js +49 -0
- package/dist/client/chunks/chart-config-radar-B7FByX3t.js.map +1 -0
- package/dist/client/chunks/chart-config-radial-bar-UfW_3yyX.js +38 -0
- package/dist/client/chunks/chart-config-radial-bar-UfW_3yyX.js.map +1 -0
- package/dist/client/chunks/chart-config-sankey-DGAThN9i.js +66 -0
- package/dist/client/chunks/chart-config-sankey-DGAThN9i.js.map +1 -0
- package/dist/client/chunks/chart-config-scatter-BVVJuOnt.js +61 -0
- package/dist/client/chunks/chart-config-scatter-BVVJuOnt.js.map +1 -0
- package/dist/client/chunks/chart-config-sunburst-utejM2YS.js +45 -0
- package/dist/client/chunks/chart-config-sunburst-utejM2YS.js.map +1 -0
- package/dist/client/chunks/chart-config-tree-map-IHp97OyV.js +51 -0
- package/dist/client/chunks/chart-config-tree-map-IHp97OyV.js.map +1 -0
- package/dist/client/chunks/chart-config-waterfall-BdqG1V-x.js +59 -0
- package/dist/client/chunks/chart-config-waterfall-BdqG1V-x.js.map +1 -0
- package/dist/client/chunks/{chart-data-table-2iCsn0CF.js → chart-data-table-C3Xh9jwL.js} +1083 -1086
- package/dist/client/chunks/chart-data-table-C3Xh9jwL.js.map +1 -0
- package/dist/client/chunks/{chart-funnel-poyOf7-e.js → chart-funnel-C7pgktN5.js} +132 -132
- package/dist/client/chunks/chart-funnel-C7pgktN5.js.map +1 -0
- package/dist/client/chunks/{chart-gauge-D5J4gRky.js → chart-gauge-D2r2B_AR.js} +150 -150
- package/dist/client/chunks/chart-gauge-D2r2B_AR.js.map +1 -0
- package/dist/client/chunks/{chart-heat-map-BAMVhLGG.js → chart-heat-map-Dw2yjwfO.js} +75 -80
- package/dist/client/chunks/chart-heat-map-Dw2yjwfO.js.map +1 -0
- package/dist/client/chunks/{chart-kpi-delta-KQjUIeal.js → chart-kpi-delta-CYE0S1x_.js} +117 -117
- package/dist/client/chunks/chart-kpi-delta-CYE0S1x_.js.map +1 -0
- package/dist/client/chunks/chart-kpi-number-BlZ79xHW.js +321 -0
- package/dist/client/chunks/chart-kpi-number-BlZ79xHW.js.map +1 -0
- package/dist/client/chunks/chart-kpi-text-DY1BnxPe.js +148 -0
- package/dist/client/chunks/chart-kpi-text-DY1BnxPe.js.map +1 -0
- package/dist/client/chunks/{chart-line-B5_WntY5.js → chart-line-CBsTThTv.js} +123 -123
- package/dist/client/chunks/chart-line-CBsTThTv.js.map +1 -0
- package/dist/client/chunks/chart-markdown-BWaWVkuz.js +3474 -0
- package/dist/client/chunks/chart-markdown-BWaWVkuz.js.map +1 -0
- package/dist/client/chunks/chart-measure-profile-B41qCTBG.js +179 -0
- package/dist/client/chunks/chart-measure-profile-B41qCTBG.js.map +1 -0
- package/dist/client/chunks/chart-pie-Djbu8x2v.js +172 -0
- package/dist/client/chunks/chart-pie-Djbu8x2v.js.map +1 -0
- package/dist/client/chunks/chart-radar-BsTcKV0K.js +154 -0
- package/dist/client/chunks/chart-radar-BsTcKV0K.js.map +1 -0
- package/dist/client/chunks/chart-radial-bar-Du7XNnwE.js +148 -0
- package/dist/client/chunks/chart-radial-bar-Du7XNnwE.js.map +1 -0
- package/dist/client/chunks/{chart-sankey-BOyxfG1Q.js → chart-sankey-WwkZAhLy.js} +73 -73
- package/dist/client/chunks/chart-sankey-WwkZAhLy.js.map +1 -0
- package/dist/client/chunks/chart-scatter-D8krEYsA.js +255 -0
- package/dist/client/chunks/chart-scatter-D8krEYsA.js.map +1 -0
- package/dist/client/chunks/{chart-sunburst-D9lGEOCc.js → chart-sunburst-CIDB_pTl.js} +66 -66
- package/dist/client/chunks/chart-sunburst-CIDB_pTl.js.map +1 -0
- package/dist/client/chunks/chart-tree-map-C5C2iaWM.js +298 -0
- package/dist/client/chunks/chart-tree-map-C5C2iaWM.js.map +1 -0
- package/dist/client/chunks/{chart-waterfall-BCdUx4DC.js → chart-waterfall-BGdPrJ5Y.js} +80 -80
- package/dist/client/chunks/chart-waterfall-BGdPrJ5Y.js.map +1 -0
- package/dist/client/chunks/{charts-core-C5Yokk-x.js → charts-core-BXOqaYFn.js} +92 -92
- package/dist/client/chunks/charts-core-BXOqaYFn.js.map +1 -0
- package/dist/client/chunks/en-US-5xPTdCXg.js +35 -0
- package/dist/client/chunks/en-US-5xPTdCXg.js.map +1 -0
- package/dist/client/chunks/nl-NL-vCifBijs.js +1491 -0
- package/dist/client/chunks/nl-NL-vCifBijs.js.map +1 -0
- package/dist/client/chunks/{schema-visualization-t1KiOORo.js → schema-visualization-Xp60Ff2W.js} +352 -364
- package/dist/client/chunks/schema-visualization-Xp60Ff2W.js.map +1 -0
- package/dist/client/chunks/{useDebounce-CKqkM42n.js → useDebounce-CfmUMFau.js} +85 -85
- package/dist/client/chunks/useDebounce-CfmUMFau.js.map +1 -0
- package/dist/client/chunks/{useExplainAI-DBIfYwz-.js → useExplainAI-BKGmejIj.js} +4 -4
- package/dist/client/chunks/{useExplainAI-DBIfYwz-.js.map → useExplainAI-BKGmejIj.js.map} +1 -1
- package/dist/client/chunks/{utils--qCr8Yn5.js → utils-BldkcRHv.js} +2 -2
- package/dist/client/chunks/{utils--qCr8Yn5.js.map → utils-BldkcRHv.js.map} +1 -1
- package/dist/client/chunks/{vendor-BRlsCGnK.js → vendor-ClXpIiea.js} +2 -2
- package/dist/client/chunks/{vendor-BRlsCGnK.js.map → vendor-ClXpIiea.js.map} +1 -1
- package/dist/client/components/AnalysisBuilder/types.d.ts +6 -6
- package/dist/client/components.js +3 -3
- package/dist/client/hooks/useTranslation.d.ts +21 -0
- package/dist/client/hooks.js +3 -3
- package/dist/client/icons.js +1 -1
- package/dist/client/index.js +493 -488
- package/dist/client/index.js.map +1 -1
- package/dist/client/providers/CubeApiProvider.d.ts +2 -1
- package/dist/client/providers/CubeProvider.d.ts +7 -1
- package/dist/client/providers/I18nProvider.d.ts +18 -0
- package/dist/client/providers.js +1 -1
- package/dist/client/schema.js +1 -1
- package/dist/client/shared/types.d.ts +5 -20
- package/dist/client/styles.css +1 -1
- package/dist/client/utils.js +5 -5
- package/dist/client-bundle-stats.html +1 -1
- package/dist/mcp-app/mcp-app.html +26 -24
- package/dist/server/index.cjs +42 -40
- package/dist/server/index.js +3311 -1672
- package/package.json +5 -2
- package/dist/adapters/compiler-CRgLzmSn.cjs +0 -198
- package/dist/adapters/handler-DumFgnNM.cjs +0 -25
- package/dist/adapters/mcp-transport-C6bsIOSV.js +0 -545
- package/dist/adapters/mcp-transport-DMhuYmFp.cjs +0 -39
- package/dist/adapters/utils-CyBt-as9.cjs +0 -15
- package/dist/client/chunks/DashboardEditModal-BTdV528l.js.map +0 -1
- package/dist/client/chunks/FieldSearchModal-D75vy4Wb.js.map +0 -1
- package/dist/client/chunks/KpiDelta-Bk8bzKYM.js +0 -2
- package/dist/client/chunks/KpiNumber-CKF-8e_T.js +0 -2
- package/dist/client/chunks/KpiText-Iz1vIvu_.js +0 -2
- package/dist/client/chunks/RetentionCombinedChart-DIhK5pD8.js.map +0 -1
- package/dist/client/chunks/RetentionHeatmap-CyREolyP.js.map +0 -1
- package/dist/client/chunks/SchemaVisualization-B1GUT-FM.js +0 -2
- package/dist/client/chunks/SchemaVisualizationLazy-DymwT34e.js +0 -2
- package/dist/client/chunks/analysis-builder-C1CJ0c7L.js.map +0 -1
- package/dist/client/chunks/analysis-builder-shared-rkjJfWLT.js.map +0 -1
- package/dist/client/chunks/chart-activity-grid-DLktOINm.js +0 -806
- package/dist/client/chunks/chart-activity-grid-DLktOINm.js.map +0 -1
- package/dist/client/chunks/chart-area-BwYaflNk.js.map +0 -1
- package/dist/client/chunks/chart-bar-BiENfFgE.js.map +0 -1
- package/dist/client/chunks/chart-box-plot-BJF1tBXC.js.map +0 -1
- package/dist/client/chunks/chart-bubble-DQQhGVDJ.js.map +0 -1
- package/dist/client/chunks/chart-candlestick-C2UuXbLe.js +0 -306
- package/dist/client/chunks/chart-candlestick-C2UuXbLe.js.map +0 -1
- package/dist/client/chunks/chart-config-activity-grid-DJOU3TEz.js +0 -51
- package/dist/client/chunks/chart-config-activity-grid-DJOU3TEz.js.map +0 -1
- package/dist/client/chunks/chart-config-area-CWnWVT6a.js +0 -93
- package/dist/client/chunks/chart-config-area-CWnWVT6a.js.map +0 -1
- package/dist/client/chunks/chart-config-bar-C-7Dr1Ho.js +0 -87
- package/dist/client/chunks/chart-config-bar-C-7Dr1Ho.js.map +0 -1
- package/dist/client/chunks/chart-config-box-plot-mVOwmLdu.js +0 -35
- package/dist/client/chunks/chart-config-box-plot-mVOwmLdu.js.map +0 -1
- package/dist/client/chunks/chart-config-bubble-BPE2CeiD.js +0 -82
- package/dist/client/chunks/chart-config-bubble-BPE2CeiD.js.map +0 -1
- package/dist/client/chunks/chart-config-candlestick-BSB9DRy2.js +0 -72
- package/dist/client/chunks/chart-config-candlestick-BSB9DRy2.js.map +0 -1
- package/dist/client/chunks/chart-config-data-table-Bhdx5Hem.js.map +0 -1
- package/dist/client/chunks/chart-config-funnel-Cl-v-bm1.js +0 -93
- package/dist/client/chunks/chart-config-funnel-Cl-v-bm1.js.map +0 -1
- package/dist/client/chunks/chart-config-gauge-CdrUTJMJ.js +0 -64
- package/dist/client/chunks/chart-config-gauge-CdrUTJMJ.js.map +0 -1
- package/dist/client/chunks/chart-config-heat-map-DGE3NzoF.js +0 -91
- package/dist/client/chunks/chart-config-heat-map-DGE3NzoF.js.map +0 -1
- package/dist/client/chunks/chart-config-kpi-delta-DMrQerUW.js +0 -94
- package/dist/client/chunks/chart-config-kpi-delta-DMrQerUW.js.map +0 -1
- package/dist/client/chunks/chart-config-kpi-number-DCytCytn.js +0 -75
- package/dist/client/chunks/chart-config-kpi-number-DCytCytn.js.map +0 -1
- package/dist/client/chunks/chart-config-kpi-text-KdKQUvHo.js +0 -47
- package/dist/client/chunks/chart-config-kpi-text-KdKQUvHo.js.map +0 -1
- package/dist/client/chunks/chart-config-line-Bl9VDAdz.js +0 -104
- package/dist/client/chunks/chart-config-line-Bl9VDAdz.js.map +0 -1
- package/dist/client/chunks/chart-config-markdown-BX26b94i.js +0 -117
- package/dist/client/chunks/chart-config-markdown-BX26b94i.js.map +0 -1
- package/dist/client/chunks/chart-config-measure-profile-DwtRhEFh.js +0 -82
- package/dist/client/chunks/chart-config-measure-profile-DwtRhEFh.js.map +0 -1
- package/dist/client/chunks/chart-config-pie-BzBcqPMJ.js +0 -68
- package/dist/client/chunks/chart-config-pie-BzBcqPMJ.js.map +0 -1
- package/dist/client/chunks/chart-config-radar-6ZOgt__z.js +0 -49
- package/dist/client/chunks/chart-config-radar-6ZOgt__z.js.map +0 -1
- package/dist/client/chunks/chart-config-radial-bar-Df6Eta7N.js +0 -38
- package/dist/client/chunks/chart-config-radial-bar-Df6Eta7N.js.map +0 -1
- package/dist/client/chunks/chart-config-sankey-DgqKBFvN.js +0 -66
- package/dist/client/chunks/chart-config-sankey-DgqKBFvN.js.map +0 -1
- package/dist/client/chunks/chart-config-scatter-D5nVLDvi.js +0 -61
- package/dist/client/chunks/chart-config-scatter-D5nVLDvi.js.map +0 -1
- package/dist/client/chunks/chart-config-sunburst-Ca3FX9nW.js +0 -45
- package/dist/client/chunks/chart-config-sunburst-Ca3FX9nW.js.map +0 -1
- package/dist/client/chunks/chart-config-tree-map-Bjy4QNa3.js +0 -51
- package/dist/client/chunks/chart-config-tree-map-Bjy4QNa3.js.map +0 -1
- package/dist/client/chunks/chart-config-waterfall-C5K2eqR7.js +0 -59
- package/dist/client/chunks/chart-config-waterfall-C5K2eqR7.js.map +0 -1
- package/dist/client/chunks/chart-data-table-2iCsn0CF.js.map +0 -1
- package/dist/client/chunks/chart-funnel-poyOf7-e.js.map +0 -1
- package/dist/client/chunks/chart-gauge-D5J4gRky.js.map +0 -1
- package/dist/client/chunks/chart-heat-map-BAMVhLGG.js.map +0 -1
- package/dist/client/chunks/chart-kpi-delta-KQjUIeal.js.map +0 -1
- package/dist/client/chunks/chart-kpi-number-CsQgV_x3.js +0 -325
- package/dist/client/chunks/chart-kpi-number-CsQgV_x3.js.map +0 -1
- package/dist/client/chunks/chart-kpi-text-BR0IyeUU.js +0 -148
- package/dist/client/chunks/chart-kpi-text-BR0IyeUU.js.map +0 -1
- package/dist/client/chunks/chart-line-B5_WntY5.js.map +0 -1
- package/dist/client/chunks/chart-markdown-B6bENbel.js +0 -3473
- package/dist/client/chunks/chart-markdown-B6bENbel.js.map +0 -1
- package/dist/client/chunks/chart-measure-profile-yWk-obNb.js +0 -179
- package/dist/client/chunks/chart-measure-profile-yWk-obNb.js.map +0 -1
- package/dist/client/chunks/chart-pie-BodrUoHv.js +0 -172
- package/dist/client/chunks/chart-pie-BodrUoHv.js.map +0 -1
- package/dist/client/chunks/chart-radar-gG3zfLud.js +0 -154
- package/dist/client/chunks/chart-radar-gG3zfLud.js.map +0 -1
- package/dist/client/chunks/chart-radial-bar-C2IPCV8c.js +0 -148
- package/dist/client/chunks/chart-radial-bar-C2IPCV8c.js.map +0 -1
- package/dist/client/chunks/chart-sankey-BOyxfG1Q.js.map +0 -1
- package/dist/client/chunks/chart-scatter-B8OwlsAX.js +0 -255
- package/dist/client/chunks/chart-scatter-B8OwlsAX.js.map +0 -1
- package/dist/client/chunks/chart-sunburst-D9lGEOCc.js.map +0 -1
- package/dist/client/chunks/chart-tree-map-DZaKy9he.js +0 -298
- package/dist/client/chunks/chart-tree-map-DZaKy9he.js.map +0 -1
- package/dist/client/chunks/chart-waterfall-BCdUx4DC.js.map +0 -1
- package/dist/client/chunks/charts-core-C5Yokk-x.js.map +0 -1
- package/dist/client/chunks/schema-visualization-t1KiOORo.js.map +0 -1
- package/dist/client/chunks/useDebounce-CKqkM42n.js.map +0 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { n as e } from "./rolldown-runtime-CCl2IeXn.js";
|
|
2
|
-
import { S as t, T as n, _ as r, g as i, i as a,
|
|
3
|
-
import
|
|
4
|
-
import { jsx as
|
|
5
|
-
import { axisBottom as
|
|
2
|
+
import { S as t, T as n, _ as r, g as i, i as a, k as o, m as s, n as c, r as l, u, w as d, x as f, y as p } from "./chart-activity-grid-CWT0gLv4.js";
|
|
3
|
+
import m, { useCallback as h, useEffect as g, useLayoutEffect as _, useMemo as v, useRef as y, useState as b, useSyncExternalStore as x } from "react";
|
|
4
|
+
import { jsx as S, jsxs as C } from "react/jsx-runtime";
|
|
5
|
+
import { axisBottom as w, axisLeft as T, extent as E, max as D, scaleLinear as O, scaleOrdinal as k, scaleQuantize as ee, scaleSqrt as te, select as A } from "d3";
|
|
6
6
|
//#region src/client/hooks/useTheme.ts
|
|
7
|
-
var
|
|
7
|
+
var j = {
|
|
8
8
|
listeners: /* @__PURE__ */ new Set(),
|
|
9
9
|
subscribe(e) {
|
|
10
10
|
return this.listeners.add(e), () => this.listeners.delete(e);
|
|
@@ -14,49 +14,49 @@ var A = {
|
|
|
14
14
|
}
|
|
15
15
|
};
|
|
16
16
|
i(() => {
|
|
17
|
-
|
|
17
|
+
j.notify();
|
|
18
18
|
});
|
|
19
|
-
function
|
|
19
|
+
function M() {
|
|
20
20
|
return {
|
|
21
|
-
theme:
|
|
22
|
-
setTheme:
|
|
23
|
-
|
|
21
|
+
theme: x(j.subscribe.bind(j), u, u),
|
|
22
|
+
setTheme: h((e) => {
|
|
23
|
+
s(e), j.notify();
|
|
24
24
|
}, [])
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
27
|
//#endregion
|
|
28
28
|
//#region src/client/components/charts/BubbleChart.tsx
|
|
29
|
-
var
|
|
30
|
-
let
|
|
29
|
+
var N = /* @__PURE__ */ e({ default: () => P }), P = m.memo(function({ data: e, chartConfig: i, displayConfig: s = {}, queryObject: u, height: m = "100%", colorPalette: h }) {
|
|
30
|
+
let { t: x } = o(), j = y(null), N = y(null), [P, F] = b({
|
|
31
31
|
width: 0,
|
|
32
32
|
height: 0
|
|
33
|
-
}), [
|
|
34
|
-
showLegend:
|
|
35
|
-
showGrid:
|
|
36
|
-
showTooltip:
|
|
37
|
-
minBubbleSize:
|
|
38
|
-
maxBubbleSize:
|
|
39
|
-
bubbleOpacity:
|
|
40
|
-
xAxisFormat:
|
|
41
|
-
leftYAxisFormat:
|
|
33
|
+
}), [I, L] = b(!1), { theme: R } = M(), z = r(), B = v(() => ({
|
|
34
|
+
showLegend: s?.showLegend ?? !0,
|
|
35
|
+
showGrid: s?.showGrid ?? !0,
|
|
36
|
+
showTooltip: s?.showTooltip ?? !0,
|
|
37
|
+
minBubbleSize: s?.minBubbleSize ?? 5,
|
|
38
|
+
maxBubbleSize: s?.maxBubbleSize ?? 50,
|
|
39
|
+
bubbleOpacity: s?.bubbleOpacity ?? .7,
|
|
40
|
+
xAxisFormat: s?.xAxisFormat,
|
|
41
|
+
leftYAxisFormat: s?.leftYAxisFormat
|
|
42
42
|
}), [
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
43
|
+
s?.showLegend,
|
|
44
|
+
s?.showGrid,
|
|
45
|
+
s?.showTooltip,
|
|
46
|
+
s?.minBubbleSize,
|
|
47
|
+
s?.maxBubbleSize,
|
|
48
|
+
s?.bubbleOpacity,
|
|
49
|
+
s?.xAxisFormat,
|
|
50
|
+
s?.leftYAxisFormat
|
|
51
51
|
]);
|
|
52
|
-
return
|
|
52
|
+
return _(() => {
|
|
53
53
|
let e = 0, t, n, r = () => {
|
|
54
|
-
if (
|
|
55
|
-
let { width: e, height: t } =
|
|
56
|
-
if (e > 0 && t > 0) return
|
|
54
|
+
if (N.current) {
|
|
55
|
+
let { width: e, height: t } = N.current.getBoundingClientRect();
|
|
56
|
+
if (e > 0 && t > 0) return F({
|
|
57
57
|
width: e,
|
|
58
58
|
height: t
|
|
59
|
-
}),
|
|
59
|
+
}), L(!0), !0;
|
|
60
60
|
}
|
|
61
61
|
return !1;
|
|
62
62
|
};
|
|
@@ -71,32 +71,32 @@ var M = /* @__PURE__ */ e({ default: () => N }), N = p.memo(function({ data: e,
|
|
|
71
71
|
return () => {
|
|
72
72
|
t && cancelAnimationFrame(t), n && clearTimeout(n);
|
|
73
73
|
};
|
|
74
|
-
}, []),
|
|
74
|
+
}, []), g(() => {
|
|
75
75
|
let e = null, t = () => {
|
|
76
|
-
if (
|
|
77
|
-
let { width: e, height: t } =
|
|
78
|
-
e > 0 && t > 0 && (
|
|
76
|
+
if (N.current) {
|
|
77
|
+
let { width: e, height: t } = N.current.getBoundingClientRect();
|
|
78
|
+
e > 0 && t > 0 && (F({
|
|
79
79
|
width: e,
|
|
80
80
|
height: t
|
|
81
|
-
}),
|
|
81
|
+
}), I || L(!0));
|
|
82
82
|
}
|
|
83
83
|
};
|
|
84
|
-
return
|
|
84
|
+
return N.current && (e = new ResizeObserver((e) => {
|
|
85
85
|
for (let t of e) {
|
|
86
86
|
let { width: e, height: n } = t.contentRect;
|
|
87
|
-
e > 0 && n > 0 && (
|
|
87
|
+
e > 0 && n > 0 && (F({
|
|
88
88
|
width: e,
|
|
89
89
|
height: n
|
|
90
|
-
}),
|
|
90
|
+
}), I || L(!0));
|
|
91
91
|
}
|
|
92
|
-
}), e.observe(
|
|
92
|
+
}), e.observe(N.current), t()), window.addEventListener("resize", t), () => {
|
|
93
93
|
e && e.disconnect(), window.removeEventListener("resize", t);
|
|
94
94
|
};
|
|
95
|
-
}, [
|
|
96
|
-
if (!e || e.length === 0 || !
|
|
97
|
-
let r = Array.isArray(i.xAxis) ? i.xAxis[0] : i.xAxis, o = Array.isArray(i.yAxis) ? i.yAxis[0] : i.yAxis,
|
|
98
|
-
if (!r || !o || !
|
|
99
|
-
let _ = t(
|
|
95
|
+
}, [I]), g(() => {
|
|
96
|
+
if (!e || e.length === 0 || !j.current || !I || P.width === 0 || (A(j.current).selectAll("*").remove(), !i?.xAxis || !i?.yAxis || !i?.series)) return;
|
|
97
|
+
let r = Array.isArray(i.xAxis) ? i.xAxis[0] : i.xAxis, o = Array.isArray(i.yAxis) ? i.yAxis[0] : i.yAxis, s = Array.isArray(i.series) ? i.series[0] : i.series, m = Array.isArray(i.sizeField) ? i.sizeField[0] : i.sizeField || o, g = Array.isArray(i.colorField) ? i.colorField[0] : i.colorField;
|
|
98
|
+
if (!r || !o || !s || !m) return;
|
|
99
|
+
let _ = t(u, r), v = u?.timeDimensions?.some((e) => e.dimension === r) || !1, y = e.map((e) => {
|
|
100
100
|
let t = e[r], i, a;
|
|
101
101
|
if (v && t) {
|
|
102
102
|
let e = String(t), n;
|
|
@@ -104,29 +104,29 @@ var M = /* @__PURE__ */ e({ default: () => N }), N = p.memo(function({ data: e,
|
|
|
104
104
|
let t = e;
|
|
105
105
|
e.includes(" ") && (t = e.replace(" ", "T").replace("+00", "Z").replace(/\+\d{2}:\d{2}$/, "Z")), !t.endsWith("Z") && !t.includes("+") && (t += "Z"), n = new Date(t);
|
|
106
106
|
} else n = new Date(e);
|
|
107
|
-
i = isNaN(n.getTime()) ? parseFloat(e) : n.getTime(), a =
|
|
107
|
+
i = isNaN(n.getTime()) ? parseFloat(e) : n.getTime(), a = f(t, _);
|
|
108
108
|
} else {
|
|
109
|
-
let e =
|
|
109
|
+
let e = f(t, _) || t;
|
|
110
110
|
i = typeof e == "string" ? parseFloat(e) : e, a = String(e);
|
|
111
111
|
}
|
|
112
|
-
let
|
|
112
|
+
let c = n(e[o]), l = n(e[m]), u = e[s];
|
|
113
113
|
return {
|
|
114
114
|
x: i,
|
|
115
115
|
xLabel: a,
|
|
116
|
-
y:
|
|
117
|
-
size:
|
|
118
|
-
color: g ? e[g] :
|
|
119
|
-
series:
|
|
120
|
-
label: `${
|
|
121
|
-
isValid:
|
|
116
|
+
y: c,
|
|
117
|
+
size: l === null ? 0 : Math.abs(l),
|
|
118
|
+
color: g ? e[g] : u,
|
|
119
|
+
series: u,
|
|
120
|
+
label: `${u || "Unknown"}`,
|
|
121
|
+
isValid: d(i) && c !== null && l !== null && l > 0
|
|
122
122
|
};
|
|
123
123
|
}).filter((e) => e.isValid && e.size > 0);
|
|
124
124
|
if (y.length === 0) return;
|
|
125
|
-
let
|
|
125
|
+
let b = {
|
|
126
126
|
...a,
|
|
127
127
|
left: a.left + 30,
|
|
128
|
-
bottom:
|
|
129
|
-
},
|
|
128
|
+
bottom: B.showLegend && g ? 100 : 40
|
|
129
|
+
}, x = P.width - b.left - b.right, S = P.height - b.top - b.bottom, C = A(j.current).attr("width", P.width).attr("height", P.height), M = C.append("g").attr("transform", `translate(${b.left},${b.top})`), N = O().domain(E(y, (e) => e.x)).range([0, x]).nice(), F = O().domain(E(y, (e) => e.y)).range([S, 0]).nice(), L = te().domain([0, D(y, (e) => e.size)]).range([B.minBubbleSize, B.maxBubbleSize]), V, H = !1, U = [];
|
|
130
130
|
if (g && y.length > 0) {
|
|
131
131
|
let e = y.map((e) => {
|
|
132
132
|
let t = e.color;
|
|
@@ -134,17 +134,17 @@ var M = /* @__PURE__ */ e({ default: () => N }), N = p.memo(function({ data: e,
|
|
|
134
134
|
}).filter((e) => !isNaN(e));
|
|
135
135
|
if (H = e.length === y.length && e.every((e) => typeof e == "number"), H) {
|
|
136
136
|
let t = Math.min(...e), n = Math.max(...e);
|
|
137
|
-
V =
|
|
138
|
-
} else U = [...new Set(y.map((e) => String(e.color)))], V =
|
|
139
|
-
} else V =
|
|
140
|
-
let W = (e, t) => getComputedStyle(document.documentElement).getPropertyValue(e).trim() || t, G =
|
|
141
|
-
if (
|
|
142
|
-
let e =
|
|
137
|
+
V = ee().domain([t, n]).range(h?.gradient || l);
|
|
138
|
+
} else U = [...new Set(y.map((e) => String(e.color)))], V = k().domain(U).range(h?.colors || c);
|
|
139
|
+
} else V = k().domain(["default"]).range([c[0]]);
|
|
140
|
+
let W = (e, t) => getComputedStyle(document.documentElement).getPropertyValue(e).trim() || t, G = R !== "light", K = G ? W("--dc-text-muted", "#cbd5e1") : W("--dc-text-secondary", "#374151"), q = G ? W("--dc-border", "#475569") : "#9ca3af";
|
|
141
|
+
if (B.showGrid) {
|
|
142
|
+
let e = M.append("g").attr("class", "grid").attr("transform", `translate(0,${S})`).call(w(N).tickSize(-S).tickFormat(() => ""));
|
|
143
143
|
e.selectAll("line").style("stroke", q).style("stroke-dasharray", "3,3").style("opacity", .3), e.select(".domain").style("stroke", "none");
|
|
144
|
-
let t =
|
|
144
|
+
let t = M.append("g").attr("class", "grid").call(T(F).tickSize(-x).tickFormat(() => ""));
|
|
145
145
|
t.selectAll("line").style("stroke", q).style("stroke-dasharray", "3,3").style("opacity", .3), t.select(".domain").style("stroke", "none");
|
|
146
146
|
}
|
|
147
|
-
let J =
|
|
147
|
+
let J = w(N);
|
|
148
148
|
v ? J.tickFormat((e) => {
|
|
149
149
|
let t = new Date(e);
|
|
150
150
|
if (isNaN(t.getTime())) return String(e);
|
|
@@ -160,41 +160,41 @@ var M = /* @__PURE__ */ e({ default: () => N }), N = p.memo(function({ data: e,
|
|
|
160
160
|
case "hour": return `${String(t.getUTCMonth() + 1).padStart(2, "0")}-${String(t.getUTCDate()).padStart(2, "0")} ${String(t.getUTCHours()).padStart(2, "0")}:00`;
|
|
161
161
|
default: return `${t.getUTCFullYear()}-${String(t.getUTCMonth() + 1).padStart(2, "0")}`;
|
|
162
162
|
}
|
|
163
|
-
}) :
|
|
164
|
-
let Y =
|
|
165
|
-
Y.selectAll("text").style("fill", K), Y.selectAll("line, path").style("stroke", q), Y.append("text").attr("x",
|
|
166
|
-
let X =
|
|
167
|
-
|
|
168
|
-
let Z =
|
|
169
|
-
Z.selectAll("text").style("fill", K), Z.selectAll("line, path").style("stroke", q), Z.append("text").attr("transform", "rotate(-90)").attr("y", -35).attr("x", -
|
|
170
|
-
let Q =
|
|
171
|
-
if (
|
|
172
|
-
|
|
163
|
+
}) : B.xAxisFormat && J.tickFormat((e) => p(e, B.xAxisFormat));
|
|
164
|
+
let Y = M.append("g").attr("transform", `translate(0,${S})`).call(J);
|
|
165
|
+
Y.selectAll("text").style("fill", K), Y.selectAll("line, path").style("stroke", q), Y.append("text").attr("x", x / 2).attr("y", 35).attr("fill", K).style("text-anchor", "middle").style("font-size", "12px").text(B.xAxisFormat?.label || z(r));
|
|
166
|
+
let X = T(F);
|
|
167
|
+
B.leftYAxisFormat && X.tickFormat((e) => p(e, B.leftYAxisFormat));
|
|
168
|
+
let Z = M.append("g").call(X);
|
|
169
|
+
Z.selectAll("text").style("fill", K), Z.selectAll("line, path").style("stroke", q), Z.append("text").attr("transform", "rotate(-90)").attr("y", -35).attr("x", -S / 2).attr("fill", K).style("text-anchor", "middle").style("font-size", "12px").text(B.leftYAxisFormat?.label || z(o));
|
|
170
|
+
let Q = A("body").append("div").attr("class", "bubble-chart-tooltip").style("position", "absolute").style("padding", "8px").style("background", "rgba(0, 0, 0, 0.8)").style("color", "white").style("border-radius", "4px").style("font-size", "12px").style("pointer-events", "none").style("opacity", 0).style("z-index", 1e3), $ = M.selectAll(".bubble").data(y).enter().append("circle").attr("class", "bubble").attr("cx", (e) => N(e.x)).attr("cy", (e) => F(e.y)).attr("r", (e) => L(e.size)).style("fill", (e) => g && e.color !== void 0 ? V(H ? e.color : String(e.color)) : c[0]).style("opacity", B.bubbleOpacity).style("stroke", "#fff").style("stroke-width", 1).style("cursor", "pointer");
|
|
171
|
+
if (B.showTooltip && $.on("mouseover", function(e, t) {
|
|
172
|
+
A(this).transition().duration(200).style("opacity", 1).attr("r", L(t.size) * 1.1);
|
|
173
173
|
let n = [
|
|
174
174
|
`<strong>${t.series || "Unknown"}</strong>`,
|
|
175
|
-
`${
|
|
176
|
-
`${
|
|
177
|
-
`${
|
|
178
|
-
g && t.color ? `${
|
|
175
|
+
`${z(r)}: ${t.xLabel || (B.xAxisFormat ? p(t.x, B.xAxisFormat) : t.x)}`,
|
|
176
|
+
`${z(o)}: ${B.leftYAxisFormat ? p(t.y, B.leftYAxisFormat) : t.y}`,
|
|
177
|
+
`${z(m)}: ${B.leftYAxisFormat ? p(t.size, B.leftYAxisFormat) : t.size}`,
|
|
178
|
+
g && t.color ? `${z(g)}: ${t.color}` : ""
|
|
179
179
|
].filter(Boolean).join("<br>");
|
|
180
180
|
Q.html(n).style("left", e.pageX + 10 + "px").style("top", e.pageY - 10 + "px").transition().duration(200).style("opacity", 1);
|
|
181
181
|
}).on("mousemove", function(e) {
|
|
182
182
|
Q.style("left", e.pageX + 10 + "px").style("top", e.pageY - 10 + "px");
|
|
183
183
|
}).on("mouseout", function(e, t) {
|
|
184
|
-
|
|
185
|
-
}),
|
|
186
|
-
let e = Math.min(...y.map((e) => e.color)), t = Math.max(...y.map((e) => e.color)), n =
|
|
184
|
+
A(this).transition().duration(200).style("opacity", B.bubbleOpacity).attr("r", L(t.size)), Q.transition().duration(200).style("opacity", 0);
|
|
185
|
+
}), B.showLegend && g) if (H) {
|
|
186
|
+
let e = Math.min(...y.map((e) => e.color)), t = Math.max(...y.map((e) => e.color)), n = M.append("g").attr("class", "color-legend").attr("transform", `translate(${x / 2 - 200 / 2}, ${S + 60})`), r = C.append("defs").append("linearGradient").attr("id", "color-scale-gradient").attr("x1", "0%").attr("y1", "0%").attr("x2", "100%").attr("y2", "0%"), i = h?.gradient || l;
|
|
187
187
|
i.forEach((e, t) => {
|
|
188
188
|
r.append("stop").attr("offset", `${t / (i.length - 1) * 100}%`).attr("stop-color", e);
|
|
189
|
-
}), n.append("rect").attr("width", 200).attr("height", 20).style("fill", "url(#color-scale-gradient)").style("stroke", "#ccc").style("stroke-width", 1), n.append("text").attr("x", 0).attr("y", 35).attr("text-anchor", "start").style("font-size", "11px").style("fill", K).text(
|
|
189
|
+
}), n.append("rect").attr("width", 200).attr("height", 20).style("fill", "url(#color-scale-gradient)").style("stroke", "#ccc").style("stroke-width", 1), n.append("text").attr("x", 0).attr("y", 35).attr("text-anchor", "start").style("font-size", "11px").style("fill", K).text(B.leftYAxisFormat ? p(e, B.leftYAxisFormat) : e.toFixed(2)), n.append("text").attr("x", 200).attr("y", 35).attr("text-anchor", "end").style("font-size", "11px").style("fill", K).text(B.leftYAxisFormat ? p(t, B.leftYAxisFormat) : t.toFixed(2)), n.append("text").attr("x", 200 / 2).attr("y", -5).attr("text-anchor", "middle").style("font-size", "12px").style("font-weight", "bold").style("fill", K).text(z(g));
|
|
190
190
|
} else {
|
|
191
191
|
let e = U;
|
|
192
192
|
if (e.length > 0) {
|
|
193
|
-
let t =
|
|
194
|
-
t.append("circle").attr("cx", 5).attr("cy", 5).attr("r", 5).style("fill", (e) => V(e)).style("opacity",
|
|
193
|
+
let t = M.append("g").attr("class", "legend").attr("transform", `translate(${x / 2 - e.length * 80 / 2}, ${S + 60})`).selectAll(".legend-item").data(e).enter().append("g").attr("class", "legend-item").attr("transform", (e, t) => `translate(${t * 80}, 0)`).style("cursor", "pointer");
|
|
194
|
+
t.append("circle").attr("cx", 5).attr("cy", 5).attr("r", 5).style("fill", (e) => V(e)).style("opacity", B.bubbleOpacity), t.append("text").attr("x", 15).attr("y", 5).attr("dy", ".35em").style("font-size", "11px").style("fill", K).text((e) => String(e)), t.on("mouseover", function(e, t) {
|
|
195
195
|
$.transition().duration(200).style("opacity", (e) => g && String(e.color) === t ? 1 : .2);
|
|
196
196
|
}).on("mouseout", function() {
|
|
197
|
-
$.transition().duration(200).style("opacity",
|
|
197
|
+
$.transition().duration(200).style("opacity", B.bubbleOpacity);
|
|
198
198
|
});
|
|
199
199
|
}
|
|
200
200
|
}
|
|
@@ -204,70 +204,70 @@ var M = /* @__PURE__ */ e({ default: () => N }), N = p.memo(function({ data: e,
|
|
|
204
204
|
}, [
|
|
205
205
|
e,
|
|
206
206
|
i,
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
M,
|
|
207
|
+
B,
|
|
208
|
+
u,
|
|
210
209
|
P,
|
|
211
|
-
m,
|
|
212
210
|
I,
|
|
213
|
-
|
|
214
|
-
|
|
211
|
+
h,
|
|
212
|
+
R,
|
|
213
|
+
z
|
|
214
|
+
]), !e || e.length === 0 ? /* @__PURE__ */ S("div", {
|
|
215
215
|
className: "dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted",
|
|
216
|
-
style: { height:
|
|
217
|
-
children: /* @__PURE__ */
|
|
216
|
+
style: { height: m },
|
|
217
|
+
children: /* @__PURE__ */ C("div", {
|
|
218
218
|
className: "dc:text-center",
|
|
219
|
-
children: [/* @__PURE__ */
|
|
219
|
+
children: [/* @__PURE__ */ S("div", {
|
|
220
220
|
className: "dc:text-sm dc:font-semibold dc:mb-1",
|
|
221
|
-
children: "
|
|
222
|
-
}), /* @__PURE__ */
|
|
221
|
+
children: x("chart.runtime.noData")
|
|
222
|
+
}), /* @__PURE__ */ S("div", {
|
|
223
223
|
className: "dc:text-xs text-dc-text-secondary",
|
|
224
|
-
children: "
|
|
224
|
+
children: x("chart.runtime.noDataHint.bubble")
|
|
225
225
|
})]
|
|
226
226
|
})
|
|
227
|
-
}) : i?.xAxis && i?.yAxis && i?.series ? /* @__PURE__ */
|
|
227
|
+
}) : i?.xAxis && i?.yAxis && i?.series ? /* @__PURE__ */ S("div", {
|
|
228
228
|
className: "dc:w-full dc:flex-1 dc:flex dc:flex-col dc:relative",
|
|
229
229
|
style: {
|
|
230
|
-
height:
|
|
230
|
+
height: m,
|
|
231
231
|
minHeight: "250px",
|
|
232
232
|
overflow: "hidden"
|
|
233
233
|
},
|
|
234
|
-
children: /* @__PURE__ */
|
|
235
|
-
ref:
|
|
234
|
+
children: /* @__PURE__ */ C("div", {
|
|
235
|
+
ref: N,
|
|
236
236
|
className: "dc:w-full dc:h-full dc:relative",
|
|
237
|
-
children: [/* @__PURE__ */
|
|
238
|
-
ref:
|
|
237
|
+
children: [/* @__PURE__ */ S("svg", {
|
|
238
|
+
ref: j,
|
|
239
239
|
className: "dc:w-full dc:h-full"
|
|
240
|
-
}), !
|
|
240
|
+
}), !I && /* @__PURE__ */ S("div", {
|
|
241
241
|
className: "dc:absolute dc:inset-0 dc:flex dc:items-center dc:justify-center",
|
|
242
|
-
children: /* @__PURE__ */
|
|
242
|
+
children: /* @__PURE__ */ S("div", {
|
|
243
243
|
className: "text-dc-text-muted dc:text-sm",
|
|
244
|
-
children: "
|
|
244
|
+
children: x("chart.runtime.measuringDimensions")
|
|
245
245
|
})
|
|
246
246
|
})]
|
|
247
247
|
})
|
|
248
|
-
}) : /* @__PURE__ */
|
|
248
|
+
}) : /* @__PURE__ */ S("div", {
|
|
249
249
|
className: "dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning",
|
|
250
|
-
style: { height:
|
|
251
|
-
children: /* @__PURE__ */
|
|
250
|
+
style: { height: m },
|
|
251
|
+
children: /* @__PURE__ */ C("div", {
|
|
252
252
|
className: "dc:text-center",
|
|
253
253
|
children: [
|
|
254
|
-
/* @__PURE__ */
|
|
254
|
+
/* @__PURE__ */ S("div", {
|
|
255
255
|
className: "dc:text-sm dc:font-semibold dc:mb-1",
|
|
256
|
-
children: "
|
|
256
|
+
children: x("chart.runtime.activityGridConfigRequired")
|
|
257
257
|
}),
|
|
258
|
-
/* @__PURE__ */
|
|
258
|
+
/* @__PURE__ */ S("div", {
|
|
259
259
|
className: "dc:text-xs",
|
|
260
|
-
children: "
|
|
260
|
+
children: x("chart.runtime.configErrorHint.bubbleRequired")
|
|
261
261
|
}),
|
|
262
|
-
/* @__PURE__ */
|
|
262
|
+
/* @__PURE__ */ S("div", {
|
|
263
263
|
className: "dc:text-xs dc:mt-1",
|
|
264
|
-
children: "
|
|
264
|
+
children: x("chart.runtime.configErrorHint.bubbleOptional")
|
|
265
265
|
})
|
|
266
266
|
]
|
|
267
267
|
})
|
|
268
268
|
});
|
|
269
269
|
});
|
|
270
270
|
//#endregion
|
|
271
|
-
export {
|
|
271
|
+
export { M as n, N as t };
|
|
272
272
|
|
|
273
|
-
//# sourceMappingURL=chart-bubble-
|
|
273
|
+
//# sourceMappingURL=chart-bubble-CMDp4Pfm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-bubble-CMDp4Pfm.js","names":[],"sources":["../../../src/client/hooks/useTheme.ts","../../../src/client/components/charts/BubbleChart.tsx"],"sourcesContent":["/**\n * useTheme - External Theme State Hook\n *\n * Uses React 18's useSyncExternalStore to prevent parent component re-renders.\n * The theme state is stored externally and changes are propagated through\n * a subscribe/notify pattern.\n *\n * This prevents the ThemeToggle component from causing Layout re-renders.\n */\n\nimport { useSyncExternalStore, useCallback } from 'react'\nimport { getTheme, setTheme as setThemeUtil, watchThemeChanges, type Theme } from '../theme'\n\n// External store for theme state\nconst themeStore = {\n listeners: new Set<() => void>(),\n\n subscribe(listener: () => void) {\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n },\n\n notify() {\n this.listeners.forEach(listener => listener())\n }\n}\n\n// Watch theme changes from DOM/system and notify subscribers\nwatchThemeChanges(() => {\n themeStore.notify()\n})\n\n/**\n * Hook to access and update theme\n *\n * Returns current theme and a setter function.\n * Only components using this hook will re-render on theme changes.\n */\nexport function useTheme() {\n // Subscribe to external theme store\n const theme = useSyncExternalStore(\n themeStore.subscribe.bind(themeStore),\n getTheme, // Client-side snapshot\n getTheme // Server-side snapshot (SSR)\n )\n\n // Stable setter function\n const setTheme = useCallback((newTheme: Theme) => {\n setThemeUtil(newTheme)\n themeStore.notify()\n }, [])\n\n return { theme, setTheme }\n}\n","import React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { select, scaleLinear, scaleSqrt, scaleOrdinal, scaleQuantize, extent, max, axisBottom, axisLeft, transition as _transition, type ScaleOrdinal, type ScaleQuantize } from 'd3'\n// _transition import is for side effects only - it extends Selection.prototype with .transition() method\nimport { CHART_COLORS, CHART_COLORS_GRADIENT, CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity, parseNumericValue, isValidNumericValue, formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport { useTheme } from '../../hooks/useTheme'\nimport type { ChartProps } from '../../types'\n\ninterface BubbleData {\n x: number\n xLabel?: string // Formatted label for time dimensions\n y: number\n size: number\n color?: string | number\n label: string\n series?: string\n}\n\nconst BubbleChart = React.memo(function BubbleChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const { t } = useTranslation()\n const svgRef = useRef<SVGSVGElement | null>(null)\n const containerRef = useRef<HTMLDivElement | null>(null)\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n const [dimensionsReady, setDimensionsReady] = useState(false)\n const { theme } = useTheme()\n const getFieldLabel = useCubeFieldLabel()\n\n // Memoize safeDisplayConfig to prevent unnecessary re-renders\n const safeDisplayConfig = useMemo(() => ({\n showLegend: displayConfig?.showLegend ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n minBubbleSize: displayConfig?.minBubbleSize ?? 5,\n maxBubbleSize: displayConfig?.maxBubbleSize ?? 50,\n bubbleOpacity: displayConfig?.bubbleOpacity ?? 0.7,\n xAxisFormat: displayConfig?.xAxisFormat,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }), [\n displayConfig?.showLegend,\n displayConfig?.showGrid,\n displayConfig?.showTooltip,\n displayConfig?.minBubbleSize,\n displayConfig?.maxBubbleSize,\n displayConfig?.bubbleOpacity,\n displayConfig?.xAxisFormat,\n displayConfig?.leftYAxisFormat\n ])\n\n // Enhanced dimension measurement with retry mechanism\n useLayoutEffect(() => {\n let retryCount = 0\n const maxRetries = 10\n let rafId: number\n let timeoutId: ReturnType<typeof setTimeout>\n \n const updateDimensions = () => {\n if (containerRef.current) {\n const { width, height } = containerRef.current.getBoundingClientRect()\n \n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n setDimensionsReady(true)\n return true\n }\n }\n return false\n }\n \n // Immediate measurement\n const success = updateDimensions()\n \n if (!success && retryCount < maxRetries) {\n // Retry with requestAnimationFrame\n const retryWithRaf = () => {\n const rafSuccess = updateDimensions()\n \n if (!rafSuccess && retryCount < maxRetries) {\n retryCount++\n // Use setTimeout for additional retries with increasing delays\n timeoutId = setTimeout(() => {\n rafId = requestAnimationFrame(retryWithRaf)\n }, 50 * retryCount) // Increasing delay: 50ms, 100ms, 150ms, etc.\n }\n }\n \n rafId = requestAnimationFrame(retryWithRaf)\n }\n \n return () => {\n if (rafId) cancelAnimationFrame(rafId)\n if (timeoutId) clearTimeout(timeoutId)\n }\n }, [])\n\n // Enhanced ResizeObserver for dynamic resizing with immediate initialization\n useEffect(() => {\n let resizeObserver: ResizeObserver | null = null\n \n const updateDimensions = () => {\n if (containerRef.current) {\n const { width, height } = containerRef.current.getBoundingClientRect()\n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n if (!dimensionsReady) {\n setDimensionsReady(true)\n }\n }\n }\n }\n \n // Initialize ResizeObserver immediately\n if (containerRef.current) {\n resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect\n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n if (!dimensionsReady) {\n setDimensionsReady(true)\n }\n }\n }\n })\n \n resizeObserver.observe(containerRef.current)\n \n // Also try immediate measurement as fallback\n updateDimensions()\n }\n\n // Window resize as additional fallback\n window.addEventListener('resize', updateDimensions)\n \n return () => {\n if (resizeObserver) {\n resizeObserver.disconnect()\n }\n window.removeEventListener('resize', updateDimensions)\n }\n }, [dimensionsReady])\n\n useEffect(() => {\n if (!data || data.length === 0 || !svgRef.current || !dimensionsReady || dimensions.width === 0) {\n return\n }\n\n // Clear previous chart\n select(svgRef.current).selectAll('*').remove()\n\n\n // Validate chartConfig - only new format supported\n if (!chartConfig?.xAxis || !chartConfig?.yAxis || !chartConfig?.series) {\n return\n }\n\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n const yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis\n const seriesField = Array.isArray(chartConfig.series) ? chartConfig.series[0] : chartConfig.series\n const sizeFieldName = Array.isArray(chartConfig.sizeField) ? chartConfig.sizeField[0] : chartConfig.sizeField || yAxisField\n const colorFieldName = Array.isArray(chartConfig.colorField) ? chartConfig.colorField[0] : chartConfig.colorField\n\n\n if (!xAxisField || !yAxisField || !seriesField || !sizeFieldName) {\n return\n }\n\n // Transform data for bubble chart\n // Null handling: Filter out bubbles where x, y, or size are null\n const xGranularity = getFieldGranularity(queryObject, xAxisField)\n\n // Check if x-axis field is a time dimension\n const isTimeDimension = queryObject?.timeDimensions?.some(\n (td: { dimension: string }) => td.dimension === xAxisField\n ) || false\n\n const bubbleData: BubbleData[] = data\n .map(item => {\n const rawXValue = item[xAxisField]\n let xNum: number\n let xLabel: string\n\n if (isTimeDimension && rawXValue) {\n // For time dimensions, convert to timestamp for proper numeric positioning\n const dateStr = String(rawXValue)\n // Try to parse as date - handle ISO format and PostgreSQL format\n let date: Date\n if (dateStr.match(/^\\d{4}-\\d{2}-\\d{2}[T ]/)) {\n // Full timestamp format\n let isoStr = dateStr\n if (dateStr.includes(' ')) {\n isoStr = dateStr.replace(' ', 'T').replace('+00', 'Z').replace(/\\+\\d{2}:\\d{2}$/, 'Z')\n }\n if (!isoStr.endsWith('Z') && !isoStr.includes('+')) {\n isoStr = isoStr + 'Z'\n }\n date = new Date(isoStr)\n } else {\n date = new Date(dateStr)\n }\n\n xNum = isNaN(date.getTime()) ? parseFloat(dateStr) : date.getTime()\n xLabel = formatTimeValue(rawXValue, xGranularity)\n } else {\n // Non-time value - use as-is\n const formattedValue = formatTimeValue(rawXValue, xGranularity) || rawXValue\n xNum = typeof formattedValue === 'string' ? parseFloat(formattedValue) : formattedValue\n xLabel = String(formattedValue)\n }\n\n const yValue = parseNumericValue(item[yAxisField])\n const sizeValue = parseNumericValue(item[sizeFieldName])\n const seriesValue = item[seriesField]\n\n return {\n x: xNum,\n xLabel, // Store formatted label for tooltip display\n y: yValue as number, // Type assertion: filter below ensures this is never null\n size: sizeValue !== null ? Math.abs(sizeValue) : 0, // Ensure positive size\n color: colorFieldName ? item[colorFieldName] : seriesValue,\n series: seriesValue,\n label: `${seriesValue || 'Unknown'}`,\n isValid: isValidNumericValue(xNum) && yValue !== null && sizeValue !== null && sizeValue > 0\n }\n })\n .filter(d => d.isValid && d.size > 0) // Filter out bubbles with invalid coordinates or no size\n\n if (bubbleData.length === 0) return\n\n const margin = { \n ...CHART_MARGINS, \n left: CHART_MARGINS.left + 30, // Add extra 30px left margin for Y-axis label\n bottom: (safeDisplayConfig.showLegend && colorFieldName) ? 100 : 40 // Add extra space for legend\n }\n const width = dimensions.width - margin.left - margin.right\n const chartHeight = dimensions.height - margin.top - margin.bottom\n\n const svg = select(svgRef.current)\n .attr('width', dimensions.width)\n .attr('height', dimensions.height)\n\n const g = svg.append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`)\n\n // Set up scales\n const xScale = scaleLinear()\n .domain(extent(bubbleData, d => d.x) as [number, number])\n .range([0, width])\n .nice()\n\n const yScale = scaleLinear()\n .domain(extent(bubbleData, d => d.y) as [number, number])\n .range([chartHeight, 0])\n .nice()\n\n const sizeScale = scaleSqrt()\n .domain([0, max(bubbleData, d => d.size) as number])\n .range([safeDisplayConfig.minBubbleSize, safeDisplayConfig.maxBubbleSize])\n\n // Set up color scale\n let colorScale: ScaleOrdinal<string, string> | ScaleQuantize<string>\n let isNumericColorField = false\n let uniqueColors: string[] = []\n \n if (colorFieldName && bubbleData.length > 0) {\n // Check if color field is numeric for color scaling (same logic as TreeMapChart)\n const colorValues = bubbleData.map(item => {\n const value = item.color\n return typeof value === 'string' ? parseFloat(value) : value\n }).filter((val): val is number => !isNaN(val as number))\n \n isNumericColorField = colorValues.length === bubbleData.length && colorValues.every(val => typeof val === 'number')\n \n if (isNumericColorField) {\n // Use D3 quantize scale for better color distribution with small ranges\n const minValue = Math.min(...colorValues)\n const maxValue = Math.max(...colorValues)\n \n // Create D3 quantize color scale - maps continuous data to discrete color bands\n colorScale = scaleQuantize<string>()\n .domain([minValue, maxValue])\n .range(colorPalette?.gradient || CHART_COLORS_GRADIENT)\n } else {\n // Categorical color field - use series colors\n uniqueColors = [...new Set(bubbleData.map(d => String(d.color)))]\n colorScale = scaleOrdinal<string>()\n .domain(uniqueColors)\n .range(colorPalette?.colors || CHART_COLORS)\n }\n } else {\n // Single color for all bubbles\n colorScale = scaleOrdinal<string>()\n .domain(['default'])\n .range([CHART_COLORS[0]])\n }\n\n // Get theme colors from CSS variables\n const getThemeColor = (varName: string, fallback: string) => {\n const value = getComputedStyle(document.documentElement).getPropertyValue(varName).trim()\n return value || fallback\n }\n\n const isDark = theme !== 'light'\n const textColor = isDark\n ? getThemeColor('--dc-text-muted', '#cbd5e1') // Lighter text for dark mode\n : getThemeColor('--dc-text-secondary', '#374151') // Darker text for light mode\n const gridColor = isDark\n ? getThemeColor('--dc-border', '#475569') // Lighter grid for dark mode\n : '#9ca3af' // Much darker gray for light mode visibility\n\n // Add grid\n if (safeDisplayConfig.showGrid) {\n // X-axis grid\n const xGrid = g.append('g')\n .attr('class', 'grid')\n .attr('transform', `translate(0,${chartHeight})`)\n .call(axisBottom(xScale)\n .tickSize(-chartHeight)\n .tickFormat(() => '')\n )\n\n xGrid.selectAll('line')\n .style('stroke', gridColor)\n .style('stroke-dasharray', '3,3')\n .style('opacity', 0.3)\n\n xGrid.select('.domain')\n .style('stroke', 'none')\n\n // Y-axis grid\n const yGrid = g.append('g')\n .attr('class', 'grid')\n .call(axisLeft(yScale)\n .tickSize(-width)\n .tickFormat(() => '')\n )\n\n yGrid.selectAll('line')\n .style('stroke', gridColor)\n .style('stroke-dasharray', '3,3')\n .style('opacity', 0.3)\n\n yGrid.select('.domain')\n .style('stroke', 'none')\n }\n\n // Add X axis with proper time formatting if needed\n const xAxisGenerator = axisBottom(xScale)\n\n // If it's a time dimension, format the tick labels\n if (isTimeDimension) {\n xAxisGenerator.tickFormat((d) => {\n const date = new Date(d as number)\n if (isNaN(date.getTime())) return String(d)\n\n // Format based on granularity\n switch (xGranularity?.toLowerCase()) {\n case 'year':\n return String(date.getUTCFullYear())\n case 'quarter': {\n const q = Math.floor(date.getUTCMonth() / 3) + 1\n return `${date.getUTCFullYear()}-Q${q}`\n }\n case 'month':\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}`\n case 'week':\n case 'day':\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}-${String(date.getUTCDate()).padStart(2, '0')}`\n case 'hour':\n return `${String(date.getUTCMonth() + 1).padStart(2, '0')}-${String(date.getUTCDate()).padStart(2, '0')} ${String(date.getUTCHours()).padStart(2, '0')}:00`\n default:\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}`\n }\n })\n } else if (safeDisplayConfig.xAxisFormat) {\n // Apply custom formatting for non-time X-axis\n xAxisGenerator.tickFormat((d) => formatAxisValue(d as number, safeDisplayConfig.xAxisFormat))\n }\n\n const xAxis = g.append('g')\n .attr('transform', `translate(0,${chartHeight})`)\n .call(xAxisGenerator)\n\n xAxis.selectAll('text')\n .style('fill', textColor)\n\n xAxis.selectAll('line, path')\n .style('stroke', gridColor)\n\n xAxis.append('text')\n .attr('x', width / 2)\n .attr('y', 35)\n .attr('fill', textColor)\n .style('text-anchor', 'middle')\n .style('font-size', '12px')\n .text(safeDisplayConfig.xAxisFormat?.label || getFieldLabel(xAxisField))\n\n // Add Y axis with optional formatting\n const yAxisGenerator = axisLeft(yScale)\n if (safeDisplayConfig.leftYAxisFormat) {\n yAxisGenerator.tickFormat((d) => formatAxisValue(d as number, safeDisplayConfig.leftYAxisFormat))\n }\n const yAxis = g.append('g')\n .call(yAxisGenerator)\n\n yAxis.selectAll('text')\n .style('fill', textColor)\n\n yAxis.selectAll('line, path')\n .style('stroke', gridColor)\n\n yAxis.append('text')\n .attr('transform', 'rotate(-90)')\n .attr('y', -35)\n .attr('x', -chartHeight / 2)\n .attr('fill', textColor)\n .style('text-anchor', 'middle')\n .style('font-size', '12px')\n .text(safeDisplayConfig.leftYAxisFormat?.label || getFieldLabel(yAxisField))\n\n // Create tooltip\n const tooltip = select('body').append('div')\n .attr('class', 'bubble-chart-tooltip')\n .style('position', 'absolute')\n .style('padding', '8px')\n .style('background', 'rgba(0, 0, 0, 0.8)')\n .style('color', 'white')\n .style('border-radius', '4px')\n .style('font-size', '12px')\n .style('pointer-events', 'none')\n .style('opacity', 0)\n .style('z-index', 1000)\n\n // Add bubbles\n const bubbles = g.selectAll('.bubble')\n .data(bubbleData)\n .enter().append('circle')\n .attr('class', 'bubble')\n .attr('cx', d => xScale(d.x))\n .attr('cy', d => yScale(d.y))\n .attr('r', d => sizeScale(d.size))\n .style('fill', d => {\n if (colorFieldName && d.color !== undefined) {\n return isNumericColorField\n ? (colorScale as ScaleQuantize<string>)(d.color as number)\n : (colorScale as ScaleOrdinal<string, string>)(String(d.color))\n }\n return CHART_COLORS[0]\n })\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n .style('stroke', '#fff')\n .style('stroke-width', 1)\n .style('cursor', 'pointer')\n\n // Add hover effects\n if (safeDisplayConfig.showTooltip) {\n bubbles\n .on('mouseover', function(event, d) {\n select(this)\n .transition()\n .duration(200)\n .style('opacity', 1)\n .attr('r', sizeScale(d.size) * 1.1)\n\n const tooltipContent = [\n `<strong>${d.series || 'Unknown'}</strong>`,\n `${getFieldLabel(xAxisField)}: ${d.xLabel || (safeDisplayConfig.xAxisFormat ? formatAxisValue(d.x, safeDisplayConfig.xAxisFormat) : d.x)}`,\n `${getFieldLabel(yAxisField)}: ${safeDisplayConfig.leftYAxisFormat ? formatAxisValue(d.y, safeDisplayConfig.leftYAxisFormat) : d.y}`,\n `${getFieldLabel(sizeFieldName)}: ${safeDisplayConfig.leftYAxisFormat ? formatAxisValue(d.size, safeDisplayConfig.leftYAxisFormat) : d.size}`,\n colorFieldName && d.color ? `${getFieldLabel(colorFieldName)}: ${d.color}` : ''\n ].filter(Boolean).join('<br>')\n\n tooltip\n .html(tooltipContent)\n .style('left', (event.pageX + 10) + 'px')\n .style('top', (event.pageY - 10) + 'px')\n .transition()\n .duration(200)\n .style('opacity', 1)\n })\n .on('mousemove', function(event) {\n tooltip\n .style('left', (event.pageX + 10) + 'px')\n .style('top', (event.pageY - 10) + 'px')\n })\n .on('mouseout', function(_event, d) {\n select(this)\n .transition()\n .duration(200)\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n .attr('r', sizeScale(d.size))\n\n tooltip\n .transition()\n .duration(200)\n .style('opacity', 0)\n })\n }\n\n // Add legend if needed\n if (safeDisplayConfig.showLegend && colorFieldName) {\n if (isNumericColorField) {\n // Create gradient legend for numeric color field\n const legendWidth = 200\n const legendHeight = 20\n const minValue = Math.min(...bubbleData.map(d => d.color as number))\n const maxValue = Math.max(...bubbleData.map(d => d.color as number))\n \n const legend = g.append('g')\n .attr('class', 'color-legend')\n .attr('transform', `translate(${width / 2 - legendWidth / 2}, ${chartHeight + 60})`)\n\n // Create gradient definition\n const defs = svg.append('defs')\n const gradient = defs.append('linearGradient')\n .attr('id', 'color-scale-gradient')\n .attr('x1', '0%')\n .attr('y1', '0%')\n .attr('x2', '100%')\n .attr('y2', '0%')\n\n // Add color stops for the gradient\n const gradientColors = colorPalette?.gradient || CHART_COLORS_GRADIENT\n gradientColors.forEach((color, i) => {\n gradient.append('stop')\n .attr('offset', `${(i / (gradientColors.length - 1)) * 100}%`)\n .attr('stop-color', color)\n })\n\n // Add the gradient rectangle\n legend.append('rect')\n .attr('width', legendWidth)\n .attr('height', legendHeight)\n .style('fill', 'url(#color-scale-gradient)')\n .style('stroke', '#ccc')\n .style('stroke-width', 1)\n\n // Add min value label\n legend.append('text')\n .attr('x', 0)\n .attr('y', legendHeight + 15)\n .attr('text-anchor', 'start')\n .style('font-size', '11px')\n .style('fill', textColor)\n .text(safeDisplayConfig.leftYAxisFormat ? formatAxisValue(minValue, safeDisplayConfig.leftYAxisFormat) : minValue.toFixed(2))\n\n // Add max value label\n legend.append('text')\n .attr('x', legendWidth)\n .attr('y', legendHeight + 15)\n .attr('text-anchor', 'end')\n .style('font-size', '11px')\n .style('fill', textColor)\n .text(safeDisplayConfig.leftYAxisFormat ? formatAxisValue(maxValue, safeDisplayConfig.leftYAxisFormat) : maxValue.toFixed(2))\n\n // Add field name label\n legend.append('text')\n .attr('x', legendWidth / 2)\n .attr('y', -5)\n .attr('text-anchor', 'middle')\n .style('font-size', '12px')\n .style('font-weight', 'bold')\n .style('fill', textColor)\n .text(getFieldLabel(colorFieldName))\n\n } else {\n // Original categorical legend\n const legendItems = uniqueColors\n\n if (legendItems.length > 0) {\n const legend = g.append('g')\n .attr('class', 'legend')\n .attr('transform', `translate(${width / 2 - (legendItems.length * 80) / 2}, ${chartHeight + 60})`)\n\n const legendItem = legend.selectAll('.legend-item')\n .data(legendItems)\n .enter().append('g')\n .attr('class', 'legend-item')\n .attr('transform', (_d, i) => `translate(${i * 80}, 0)`)\n .style('cursor', 'pointer')\n\n legendItem.append('circle')\n .attr('cx', 5)\n .attr('cy', 5)\n .attr('r', 5)\n .style('fill', d => (colorScale as ScaleOrdinal<string, string>)(d as string))\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n\n legendItem.append('text')\n .attr('x', 15)\n .attr('y', 5)\n .attr('dy', '.35em')\n .style('font-size', '11px')\n .style('fill', textColor)\n .text(d => String(d))\n\n // Legend hover effects\n legendItem\n .on('mouseover', function(_event, legendKey) {\n // Highlight matching bubbles\n bubbles\n .transition()\n .duration(200)\n .style('opacity', d => {\n const matches = colorFieldName && String(d.color) === legendKey\n return matches ? 1 : 0.2\n })\n })\n .on('mouseout', function() {\n // Reset all bubbles\n bubbles\n .transition()\n .duration(200)\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n })\n }\n }\n }\n\n // Cleanup function\n return () => {\n tooltip.remove()\n }\n }, [data, chartConfig, safeDisplayConfig, queryObject, dimensions, dimensionsReady, colorPalette, theme, getFieldLabel])\n\n if (!data || data.length === 0) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.noData')}</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.noDataHint.bubble')}</div>\n </div>\n </div>\n )\n }\n\n // Validate that we have required fields\n const hasValidConfig = chartConfig?.xAxis && chartConfig?.yAxis && chartConfig?.series\n if (!hasValidConfig) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.activityGridConfigRequired')}</div>\n <div className=\"dc:text-xs\">{t('chart.runtime.configErrorHint.bubbleRequired')}</div>\n <div className=\"dc:text-xs dc:mt-1\">{t('chart.runtime.configErrorHint.bubbleOptional')}</div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"dc:w-full dc:flex-1 dc:flex dc:flex-col dc:relative\" style={{ height, minHeight: '250px', overflow: 'hidden' }}>\n <div ref={containerRef} className=\"dc:w-full dc:h-full dc:relative\">\n <svg ref={svgRef} className=\"dc:w-full dc:h-full\" />\n {!dimensionsReady && (\n <div className=\"dc:absolute dc:inset-0 dc:flex dc:items-center dc:justify-center\">\n <div className=\"text-dc-text-muted dc:text-sm\">{t('chart.runtime.measuringDimensions')}</div>\n </div>\n )}\n </div>\n </div>\n )\n})\n\nexport default BubbleChart"],"mappings":";;;;;;AAcA,IAAM,IAAa;CACjB,2BAAW,IAAI,KAAiB;CAEhC,UAAU,GAAsB;AAE9B,SADA,KAAK,UAAU,IAAI,EAAS,QACf,KAAK,UAAU,OAAO,EAAS;;CAG9C,SAAS;AACP,OAAK,UAAU,SAAQ,MAAY,GAAU,CAAC;;CAEjD;AAGD,QAAwB;AACtB,GAAW,QAAQ;EACnB;AAQF,SAAgB,IAAW;AAczB,QAAO;EAAE,OAZK,EACZ,EAAW,UAAU,KAAK,EAAW,EACrC,GACA,EACD;EAQe,UALC,GAAa,MAAoB;AAEhD,GADA,EAAa,EAAS,EACtB,EAAW,QAAQ;KAClB,EAAE,CAAC;EAEoB;;;;iDChCtB,IAAc,EAAM,KAAK,SAAqB,EAClD,SACA,gBACA,mBAAgB,EAAE,EAClB,gBACA,YAAS,QACT,mBACa;CACb,IAAM,EAAE,SAAM,GAAgB,EACxB,IAAS,EAA6B,KAAK,EAC3C,IAAe,EAA8B,KAAK,EAClD,CAAC,GAAY,KAAiB,EAAS;EAAE,OAAO;EAAG,QAAQ;EAAG,CAAC,EAC/D,CAAC,GAAiB,KAAsB,EAAS,GAAM,EACvD,EAAE,aAAU,GAAU,EACtB,IAAgB,GAAmB,EAGnC,IAAoB,SAAe;EACvC,YAAY,GAAe,cAAc;EACzC,UAAU,GAAe,YAAY;EACrC,aAAa,GAAe,eAAe;EAC3C,eAAe,GAAe,iBAAiB;EAC/C,eAAe,GAAe,iBAAiB;EAC/C,eAAe,GAAe,iBAAiB;EAC/C,aAAa,GAAe;EAC5B,iBAAiB,GAAe;EACjC,GAAG;EACF,GAAe;EACf,GAAe;EACf,GAAe;EACf,GAAe;EACf,GAAe;EACf,GAAe;EACf,GAAe;EACf,GAAe;EAChB,CAAC;AA2lBF,QAxlBA,QAAsB;EACpB,IAAI,IAAa,GAEb,GACA,GAEE,UAAyB;AAC7B,OAAI,EAAa,SAAS;IACxB,IAAM,EAAE,UAAO,cAAW,EAAa,QAAQ,uBAAuB;AAEtE,QAAI,IAAQ,KAAK,IAAS,EAGxB,QAFA,EAAc;KAAE;KAAO;KAAQ,CAAC,EAChC,EAAmB,GAAK,EACjB;;AAGX,UAAO;;AAMT,MAAI,CAFY,GAAkB,IAElB,IAAa,IAAY;GAEvC,IAAM,UAAqB;AAGzB,IAAI,CAFe,GAAkB,IAElB,IAAa,OAC9B,KAEA,IAAY,iBAAiB;AAC3B,SAAQ,sBAAsB,EAAa;OAC1C,KAAK,EAAW;;AAIvB,OAAQ,sBAAsB,EAAa;;AAG7C,eAAa;AAEX,GADI,KAAO,qBAAqB,EAAM,EAClC,KAAW,aAAa,EAAU;;IAEvC,EAAE,CAAC,EAGN,QAAgB;EACd,IAAI,IAAwC,MAEtC,UAAyB;AAC7B,OAAI,EAAa,SAAS;IACxB,IAAM,EAAE,UAAO,cAAW,EAAa,QAAQ,uBAAuB;AACtE,IAAI,IAAQ,KAAK,IAAS,MACxB,EAAc;KAAE;KAAO;KAAQ,CAAC,EAC3B,KACH,EAAmB,GAAK;;;AA6BhC,SAtBI,EAAa,YACf,IAAiB,IAAI,gBAAgB,MAAY;AAC/C,QAAK,IAAM,KAAS,GAAS;IAC3B,IAAM,EAAE,UAAO,cAAW,EAAM;AAChC,IAAI,IAAQ,KAAK,IAAS,MACxB,EAAc;KAAE;KAAO;KAAQ,CAAC,EAC3B,KACH,EAAmB,GAAK;;IAI9B,EAEF,EAAe,QAAQ,EAAa,QAAQ,EAG5C,GAAkB,GAIpB,OAAO,iBAAiB,UAAU,EAAiB,QAEtC;AAIX,GAHI,KACF,EAAe,YAAY,EAE7B,OAAO,oBAAoB,UAAU,EAAiB;;IAEvD,CAAC,EAAgB,CAAC,EAErB,QAAgB;AAUd,MATI,CAAC,KAAQ,EAAK,WAAW,KAAK,CAAC,EAAO,WAAW,CAAC,KAAmB,EAAW,UAAU,MAK9F,EAAO,EAAO,QAAQ,CAAC,UAAU,IAAI,CAAC,QAAQ,EAI1C,CAAC,GAAa,SAAS,CAAC,GAAa,SAAS,CAAC,GAAa,QAC9D;EAGF,IAAM,IAAa,MAAM,QAAQ,EAAY,MAAM,GAAG,EAAY,MAAM,KAAK,EAAY,OACnF,IAAa,MAAM,QAAQ,EAAY,MAAM,GAAG,EAAY,MAAM,KAAK,EAAY,OACnF,IAAc,MAAM,QAAQ,EAAY,OAAO,GAAG,EAAY,OAAO,KAAK,EAAY,QACtF,IAAgB,MAAM,QAAQ,EAAY,UAAU,GAAG,EAAY,UAAU,KAAK,EAAY,aAAa,GAC3G,IAAiB,MAAM,QAAQ,EAAY,WAAW,GAAG,EAAY,WAAW,KAAK,EAAY;AAGvG,MAAI,CAAC,KAAc,CAAC,KAAc,CAAC,KAAe,CAAC,EACjD;EAKF,IAAM,IAAe,EAAoB,GAAa,EAAW,EAG3D,IAAkB,GAAa,gBAAgB,MAClD,MAA8B,EAAG,cAAc,EACjD,IAAI,IAEC,IAA2B,EAC9B,KAAI,MAAQ;GACX,IAAM,IAAY,EAAK,IACnB,GACA;AAEJ,OAAI,KAAmB,GAAW;IAEhC,IAAM,IAAU,OAAO,EAAU,EAE7B;AACJ,QAAI,EAAQ,MAAM,yBAAyB,EAAE;KAE3C,IAAI,IAAS;AAOb,KANI,EAAQ,SAAS,IAAI,KACvB,IAAS,EAAQ,QAAQ,KAAK,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,kBAAkB,IAAI,GAEnF,CAAC,EAAO,SAAS,IAAI,IAAI,CAAC,EAAO,SAAS,IAAI,KAChD,KAAkB,MAEpB,IAAO,IAAI,KAAK,EAAO;UAEvB,KAAO,IAAI,KAAK,EAAQ;AAI1B,IADA,IAAO,MAAM,EAAK,SAAS,CAAC,GAAG,WAAW,EAAQ,GAAG,EAAK,SAAS,EACnE,IAAS,EAAgB,GAAW,EAAa;UAC5C;IAEL,IAAM,IAAiB,EAAgB,GAAW,EAAa,IAAI;AAEnE,IADA,IAAO,OAAO,KAAmB,WAAW,WAAW,EAAe,GAAG,GACzE,IAAS,OAAO,EAAe;;GAGjC,IAAM,IAAS,EAAkB,EAAK,GAAY,EAC5C,IAAY,EAAkB,EAAK,GAAe,EAClD,IAAc,EAAK;AAEzB,UAAO;IACL,GAAG;IACH;IACA,GAAG;IACH,MAAM,MAAc,OAA6B,IAAtB,KAAK,IAAI,EAAU;IAC9C,OAAO,IAAiB,EAAK,KAAkB;IAC/C,QAAQ;IACR,OAAO,GAAG,KAAe;IACzB,SAAS,EAAoB,EAAK,IAAI,MAAW,QAAQ,MAAc,QAAQ,IAAY;IAC5F;IACD,CACD,QAAO,MAAK,EAAE,WAAW,EAAE,OAAO,EAAE;AAEvC,MAAI,EAAW,WAAW,EAAG;EAE7B,IAAM,IAAS;GACb,GAAG;GACH,MAAM,EAAc,OAAO;GAC3B,QAAS,EAAkB,cAAc,IAAkB,MAAM;GAClE,EACK,IAAQ,EAAW,QAAQ,EAAO,OAAO,EAAO,OAChD,IAAc,EAAW,SAAS,EAAO,MAAM,EAAO,QAEtD,IAAM,EAAO,EAAO,QAAQ,CAC/B,KAAK,SAAS,EAAW,MAAM,CAC/B,KAAK,UAAU,EAAW,OAAO,EAE9B,IAAI,EAAI,OAAO,IAAI,CACtB,KAAK,aAAa,aAAa,EAAO,KAAK,GAAG,EAAO,IAAI,GAAG,EAGzD,IAAS,GAAa,CACzB,OAAO,EAAO,IAAY,MAAK,EAAE,EAAE,CAAqB,CACxD,MAAM,CAAC,GAAG,EAAM,CAAC,CACjB,MAAM,EAEH,IAAS,GAAa,CACzB,OAAO,EAAO,IAAY,MAAK,EAAE,EAAE,CAAqB,CACxD,MAAM,CAAC,GAAa,EAAE,CAAC,CACvB,MAAM,EAEH,IAAY,IAAW,CAC1B,OAAO,CAAC,GAAG,EAAI,IAAY,MAAK,EAAE,KAAK,CAAW,CAAC,CACnD,MAAM,CAAC,EAAkB,eAAe,EAAkB,cAAc,CAAC,EAGxE,GACA,IAAsB,IACtB,IAAyB,EAAE;AAE/B,MAAI,KAAkB,EAAW,SAAS,GAAG;GAE3C,IAAM,IAAc,EAAW,KAAI,MAAQ;IACzC,IAAM,IAAQ,EAAK;AACnB,WAAO,OAAO,KAAU,WAAW,WAAW,EAAM,GAAG;KACvD,CAAC,QAAQ,MAAuB,CAAC,MAAM,EAAc,CAAC;AAIxD,OAFA,IAAsB,EAAY,WAAW,EAAW,UAAU,EAAY,OAAM,MAAO,OAAO,KAAQ,SAAS,EAE/G,GAAqB;IAEvB,IAAM,IAAW,KAAK,IAAI,GAAG,EAAY,EACnC,IAAW,KAAK,IAAI,GAAG,EAAY;AAGzC,QAAa,IAAuB,CACjC,OAAO,CAAC,GAAU,EAAS,CAAC,CAC5B,MAAM,GAAc,YAAY,EAAsB;SAIzD,CADA,IAAe,CAAC,GAAG,IAAI,IAAI,EAAW,KAAI,MAAK,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EACjE,IAAa,GAAsB,CAChC,OAAO,EAAa,CACpB,MAAM,GAAc,UAAU,EAAa;QAIhD,KAAa,GAAsB,CAChC,OAAO,CAAC,UAAU,CAAC,CACnB,MAAM,CAAC,EAAa,GAAG,CAAC;EAI7B,IAAM,KAAiB,GAAiB,MACxB,iBAAiB,SAAS,gBAAgB,CAAC,iBAAiB,EAAQ,CAAC,MAAM,IACzE,GAGZ,IAAS,MAAU,SACnB,IAAY,IACd,EAAc,mBAAmB,UAAU,GAC3C,EAAc,uBAAuB,UAAU,EAC7C,IAAY,IACd,EAAc,eAAe,UAAU,GACvC;AAGJ,MAAI,EAAkB,UAAU;GAE9B,IAAM,IAAQ,EAAE,OAAO,IAAI,CACxB,KAAK,SAAS,OAAO,CACrB,KAAK,aAAa,eAAe,EAAY,GAAG,CAChD,KAAK,EAAW,EAAO,CACrB,SAAS,CAAC,EAAY,CACtB,iBAAiB,GAAG,CACtB;AAOH,GALA,EAAM,UAAU,OAAO,CACpB,MAAM,UAAU,EAAU,CAC1B,MAAM,oBAAoB,MAAM,CAChC,MAAM,WAAW,GAAI,EAExB,EAAM,OAAO,UAAU,CACpB,MAAM,UAAU,OAAO;GAG1B,IAAM,IAAQ,EAAE,OAAO,IAAI,CACxB,KAAK,SAAS,OAAO,CACrB,KAAK,EAAS,EAAO,CACnB,SAAS,CAAC,EAAM,CAChB,iBAAiB,GAAG,CACtB;AAOH,GALA,EAAM,UAAU,OAAO,CACpB,MAAM,UAAU,EAAU,CAC1B,MAAM,oBAAoB,MAAM,CAChC,MAAM,WAAW,GAAI,EAExB,EAAM,OAAO,UAAU,CACpB,MAAM,UAAU,OAAO;;EAI5B,IAAM,IAAiB,EAAW,EAAO;AAGzC,EAAI,IACF,EAAe,YAAY,MAAM;GAC/B,IAAM,IAAO,IAAI,KAAK,EAAY;AAClC,OAAI,MAAM,EAAK,SAAS,CAAC,CAAE,QAAO,OAAO,EAAE;AAG3C,WAAQ,GAAc,aAAa,EAAnC;IACE,KAAK,OACH,QAAO,OAAO,EAAK,gBAAgB,CAAC;IACtC,KAAK,WAAW;KACd,IAAM,IAAI,KAAK,MAAM,EAAK,aAAa,GAAG,EAAE,GAAG;AAC/C,YAAO,GAAG,EAAK,gBAAgB,CAAC,IAAI;;IAEtC,KAAK,QACH,QAAO,GAAG,EAAK,gBAAgB,CAAC,GAAG,OAAO,EAAK,aAAa,GAAG,EAAE,CAAC,SAAS,GAAG,IAAI;IACpF,KAAK;IACL,KAAK,MACH,QAAO,GAAG,EAAK,gBAAgB,CAAC,GAAG,OAAO,EAAK,aAAa,GAAG,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,OAAO,EAAK,YAAY,CAAC,CAAC,SAAS,GAAG,IAAI;IAClI,KAAK,OACH,QAAO,GAAG,OAAO,EAAK,aAAa,GAAG,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,OAAO,EAAK,YAAY,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,OAAO,EAAK,aAAa,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;IACzJ,QACE,QAAO,GAAG,EAAK,gBAAgB,CAAC,GAAG,OAAO,EAAK,aAAa,GAAG,EAAE,CAAC,SAAS,GAAG,IAAI;;IAEtF,GACO,EAAkB,eAE3B,EAAe,YAAY,MAAM,EAAgB,GAAa,EAAkB,YAAY,CAAC;EAG/F,IAAM,IAAQ,EAAE,OAAO,IAAI,CACxB,KAAK,aAAa,eAAe,EAAY,GAAG,CAChD,KAAK,EAAe;AAQvB,EANA,EAAM,UAAU,OAAO,CACpB,MAAM,QAAQ,EAAU,EAE3B,EAAM,UAAU,aAAa,CAC1B,MAAM,UAAU,EAAU,EAE7B,EAAM,OAAO,OAAO,CACjB,KAAK,KAAK,IAAQ,EAAE,CACpB,KAAK,KAAK,GAAG,CACb,KAAK,QAAQ,EAAU,CACvB,MAAM,eAAe,SAAS,CAC9B,MAAM,aAAa,OAAO,CAC1B,KAAK,EAAkB,aAAa,SAAS,EAAc,EAAW,CAAC;EAG1E,IAAM,IAAiB,EAAS,EAAO;AACvC,EAAI,EAAkB,mBACpB,EAAe,YAAY,MAAM,EAAgB,GAAa,EAAkB,gBAAgB,CAAC;EAEnG,IAAM,IAAQ,EAAE,OAAO,IAAI,CACxB,KAAK,EAAe;AAQvB,EANA,EAAM,UAAU,OAAO,CACpB,MAAM,QAAQ,EAAU,EAE3B,EAAM,UAAU,aAAa,CAC1B,MAAM,UAAU,EAAU,EAE7B,EAAM,OAAO,OAAO,CACjB,KAAK,aAAa,cAAc,CAChC,KAAK,KAAK,IAAI,CACd,KAAK,KAAK,CAAC,IAAc,EAAE,CAC3B,KAAK,QAAQ,EAAU,CACvB,MAAM,eAAe,SAAS,CAC9B,MAAM,aAAa,OAAO,CAC1B,KAAK,EAAkB,iBAAiB,SAAS,EAAc,EAAW,CAAC;EAG9E,IAAM,IAAU,EAAO,OAAO,CAAC,OAAO,MAAM,CACzC,KAAK,SAAS,uBAAuB,CACrC,MAAM,YAAY,WAAW,CAC7B,MAAM,WAAW,MAAM,CACvB,MAAM,cAAc,qBAAqB,CACzC,MAAM,SAAS,QAAQ,CACvB,MAAM,iBAAiB,MAAM,CAC7B,MAAM,aAAa,OAAO,CAC1B,MAAM,kBAAkB,OAAO,CAC/B,MAAM,WAAW,EAAE,CACnB,MAAM,WAAW,IAAK,EAGnB,IAAU,EAAE,UAAU,UAAU,CACnC,KAAK,EAAW,CAChB,OAAO,CAAC,OAAO,SAAS,CACxB,KAAK,SAAS,SAAS,CACvB,KAAK,OAAM,MAAK,EAAO,EAAE,EAAE,CAAC,CAC5B,KAAK,OAAM,MAAK,EAAO,EAAE,EAAE,CAAC,CAC5B,KAAK,MAAK,MAAK,EAAU,EAAE,KAAK,CAAC,CACjC,MAAM,SAAQ,MACT,KAAkB,EAAE,UAAU,KAAA,IAE3B,EADE,IACmC,EAAE,QACK,OAAO,EAAE,MAAM,CAAC,GAE5D,EAAa,GACpB,CACD,MAAM,WAAW,EAAkB,cAAc,CACjD,MAAM,UAAU,OAAO,CACvB,MAAM,gBAAgB,EAAE,CACxB,MAAM,UAAU,UAAU;AAgD7B,MA7CI,EAAkB,eACpB,EACG,GAAG,aAAa,SAAS,GAAO,GAAG;AAClC,KAAO,KAAK,CACT,YAAY,CACZ,SAAS,IAAI,CACb,MAAM,WAAW,EAAE,CACnB,KAAK,KAAK,EAAU,EAAE,KAAK,GAAG,IAAI;GAErC,IAAM,IAAiB;IACrB,WAAW,EAAE,UAAU,UAAU;IACjC,GAAG,EAAc,EAAW,CAAC,IAAI,EAAE,WAAW,EAAkB,cAAc,EAAgB,EAAE,GAAG,EAAkB,YAAY,GAAG,EAAE;IACtI,GAAG,EAAc,EAAW,CAAC,IAAI,EAAkB,kBAAkB,EAAgB,EAAE,GAAG,EAAkB,gBAAgB,GAAG,EAAE;IACjI,GAAG,EAAc,EAAc,CAAC,IAAI,EAAkB,kBAAkB,EAAgB,EAAE,MAAM,EAAkB,gBAAgB,GAAG,EAAE;IACvI,KAAkB,EAAE,QAAQ,GAAG,EAAc,EAAe,CAAC,IAAI,EAAE,UAAU;IAC9E,CAAC,OAAO,QAAQ,CAAC,KAAK,OAAO;AAE9B,KACG,KAAK,EAAe,CACpB,MAAM,QAAS,EAAM,QAAQ,KAAM,KAAK,CACxC,MAAM,OAAQ,EAAM,QAAQ,KAAM,KAAK,CACvC,YAAY,CACZ,SAAS,IAAI,CACb,MAAM,WAAW,EAAE;IACtB,CACD,GAAG,aAAa,SAAS,GAAO;AAC/B,KACG,MAAM,QAAS,EAAM,QAAQ,KAAM,KAAK,CACxC,MAAM,OAAQ,EAAM,QAAQ,KAAM,KAAK;IAC1C,CACD,GAAG,YAAY,SAAS,GAAQ,GAAG;AAOlC,GANA,EAAO,KAAK,CACT,YAAY,CACZ,SAAS,IAAI,CACb,MAAM,WAAW,EAAkB,cAAc,CACjD,KAAK,KAAK,EAAU,EAAE,KAAK,CAAC,EAE/B,EACG,YAAY,CACZ,SAAS,IAAI,CACb,MAAM,WAAW,EAAE;IACtB,EAIF,EAAkB,cAAc,EAClC,KAAI,GAAqB;GAEvB,IAEM,IAAW,KAAK,IAAI,GAAG,EAAW,KAAI,MAAK,EAAE,MAAgB,CAAC,EAC9D,IAAW,KAAK,IAAI,GAAG,EAAW,KAAI,MAAK,EAAE,MAAgB,CAAC,EAE9D,IAAS,EAAE,OAAO,IAAI,CACzB,KAAK,SAAS,eAAe,CAC7B,KAAK,aAAa,aAAa,IAAQ,IAAI,MAAc,EAAE,IAAI,IAAc,GAAG,GAAG,EAIhF,IADO,EAAI,OAAO,OAAO,CACT,OAAO,iBAAiB,CAC3C,KAAK,MAAM,uBAAuB,CAClC,KAAK,MAAM,KAAK,CAChB,KAAK,MAAM,KAAK,CAChB,KAAK,MAAM,OAAO,CAClB,KAAK,MAAM,KAAK,EAGb,IAAiB,GAAc,YAAY;AAkCjD,GAjCA,EAAe,SAAS,GAAO,MAAM;AACnC,MAAS,OAAO,OAAO,CACpB,KAAK,UAAU,GAAI,KAAK,EAAe,SAAS,KAAM,IAAI,GAAG,CAC7D,KAAK,cAAc,EAAM;KAC5B,EAGF,EAAO,OAAO,OAAO,CAClB,KAAK,SAAS,IAAY,CAC1B,KAAK,UAAU,GAAa,CAC5B,MAAM,QAAQ,6BAA6B,CAC3C,MAAM,UAAU,OAAO,CACvB,MAAM,gBAAgB,EAAE,EAG3B,EAAO,OAAO,OAAO,CAClB,KAAK,KAAK,EAAE,CACZ,KAAK,KAAK,GAAkB,CAC5B,KAAK,eAAe,QAAQ,CAC5B,MAAM,aAAa,OAAO,CAC1B,MAAM,QAAQ,EAAU,CACxB,KAAK,EAAkB,kBAAkB,EAAgB,GAAU,EAAkB,gBAAgB,GAAG,EAAS,QAAQ,EAAE,CAAC,EAG/H,EAAO,OAAO,OAAO,CAClB,KAAK,KAAK,IAAY,CACtB,KAAK,KAAK,GAAkB,CAC5B,KAAK,eAAe,MAAM,CAC1B,MAAM,aAAa,OAAO,CAC1B,MAAM,QAAQ,EAAU,CACxB,KAAK,EAAkB,kBAAkB,EAAgB,GAAU,EAAkB,gBAAgB,GAAG,EAAS,QAAQ,EAAE,CAAC,EAG/H,EAAO,OAAO,OAAO,CAClB,KAAK,KAAK,MAAc,EAAE,CAC1B,KAAK,KAAK,GAAG,CACb,KAAK,eAAe,SAAS,CAC7B,MAAM,aAAa,OAAO,CAC1B,MAAM,eAAe,OAAO,CAC5B,MAAM,QAAQ,EAAU,CACxB,KAAK,EAAc,EAAe,CAAC;SAEjC;GAEL,IAAM,IAAc;AAEpB,OAAI,EAAY,SAAS,GAAG;IAK1B,IAAM,IAJS,EAAE,OAAO,IAAI,CACzB,KAAK,SAAS,SAAS,CACvB,KAAK,aAAa,aAAa,IAAQ,IAAK,EAAY,SAAS,KAAM,EAAE,IAAI,IAAc,GAAG,GAAG,CAE1E,UAAU,eAAe,CAChD,KAAK,EAAY,CACjB,OAAO,CAAC,OAAO,IAAI,CACnB,KAAK,SAAS,cAAc,CAC5B,KAAK,cAAc,GAAI,MAAM,aAAa,IAAI,GAAG,MAAM,CACvD,MAAM,UAAU,UAAU;AAkB7B,IAhBA,EAAW,OAAO,SAAS,CACxB,KAAK,MAAM,EAAE,CACb,KAAK,MAAM,EAAE,CACb,KAAK,KAAK,EAAE,CACZ,MAAM,SAAQ,MAAM,EAA4C,EAAY,CAAC,CAC7E,MAAM,WAAW,EAAkB,cAAc,EAEpD,EAAW,OAAO,OAAO,CACtB,KAAK,KAAK,GAAG,CACb,KAAK,KAAK,EAAE,CACZ,KAAK,MAAM,QAAQ,CACnB,MAAM,aAAa,OAAO,CAC1B,MAAM,QAAQ,EAAU,CACxB,MAAK,MAAK,OAAO,EAAE,CAAC,EAGvB,EACG,GAAG,aAAa,SAAS,GAAQ,GAAW;AAE3C,OACG,YAAY,CACZ,SAAS,IAAI,CACb,MAAM,YAAW,MACA,KAAkB,OAAO,EAAE,MAAM,KAAK,IACrC,IAAI,GACrB;MACJ,CACD,GAAG,YAAY,WAAW;AAEzB,OACG,YAAY,CACZ,SAAS,IAAI,CACb,MAAM,WAAW,EAAkB,cAAc;MACpD;;;AAMV,eAAa;AACX,KAAQ,QAAQ;;IAEjB;EAAC;EAAM;EAAa;EAAmB;EAAa;EAAY;EAAiB;EAAc;EAAO;EAAc,CAAC,EAEpH,CAAC,KAAQ,EAAK,WAAW,IAEzB,kBAAC,OAAD;EAAK,WAAU;EAAyE,OAAO,EAAE,WAAQ;YACvG,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAuC,EAAE,uBAAuB;IAAO,CAAA,EACtF,kBAAC,OAAD;IAAK,WAAU;cAAqC,EAAE,kCAAkC;IAAO,CAAA,CAC3F;;EACF,CAAA,GAKa,GAAa,SAAS,GAAa,SAAS,GAAa,SAc9E,kBAAC,OAAD;EAAK,WAAU;EAAsD,OAAO;GAAE;GAAQ,WAAW;GAAS,UAAU;GAAU;YAC5H,kBAAC,OAAD;GAAK,KAAK;GAAc,WAAU;aAAlC,CACE,kBAAC,OAAD;IAAK,KAAK;IAAQ,WAAU;IAAwB,CAAA,EACnD,CAAC,KACA,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,OAAD;KAAK,WAAU;eAAiC,EAAE,oCAAoC;KAAO,CAAA;IACzF,CAAA,CAEJ;;EACF,CAAA,GApBJ,kBAAC,OAAD;EAAK,WAAU;EAAsE,OAAO,EAAE,WAAQ;YACpG,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,OAAD;KAAK,WAAU;eAAuC,EAAE,2CAA2C;KAAO,CAAA;IAC1G,kBAAC,OAAD;KAAK,WAAU;eAAc,EAAE,+CAA+C;KAAO,CAAA;IACrF,kBAAC,OAAD;KAAK,WAAU;eAAsB,EAAE,+CAA+C;KAAO,CAAA;IACzF;;EACF,CAAA;EAgBV"}
|