drizzle-cube 0.4.29 → 0.4.30
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/anthropic-BIva8k1r.cjs +1 -0
- package/dist/adapters/anthropic-B_rg0BhK.js +140 -0
- package/dist/adapters/dist-Boc63-1q.cjs +2 -0
- package/dist/adapters/dist-De5fzUEM.js +581 -0
- package/dist/adapters/express/index.cjs +2 -10
- package/dist/adapters/express/index.js +232 -342
- package/dist/adapters/fastify/index.cjs +2 -10
- package/dist/adapters/fastify/index.js +275 -424
- package/dist/adapters/google-CT4kgmBf.js +154 -0
- package/dist/adapters/google-Dgo9-Kb5.cjs +2 -0
- package/dist/adapters/handler-B8vuFQYP.cjs +25 -0
- package/dist/adapters/handler-D-2-6uLM.js +2951 -0
- package/dist/adapters/hono/index.cjs +2 -10
- package/dist/adapters/hono/index.js +307 -402
- package/dist/adapters/mcp-prompts-BAutSQYA.js +344 -0
- package/dist/adapters/mcp-prompts-DsAkafVn.cjs +5 -0
- package/dist/adapters/mcp-transport-CuugoG8t.js +7821 -0
- package/dist/adapters/mcp-transport-Dpp6hdZe.cjs +253 -0
- package/dist/adapters/nextjs/index.cjs +1 -9
- package/dist/adapters/nextjs/index.js +377 -600
- package/dist/adapters/openai-CjBvA6mK.js +4114 -0
- package/dist/adapters/openai-DhLE0A9Z.cjs +1 -0
- package/dist/adapters/openai-Zjw4Zo4R.js +153 -0
- package/dist/adapters/openai-eJBw3LfQ.cjs +16 -0
- package/dist/adapters/types.cjs +0 -1
- package/dist/adapters/types.js +0 -1
- package/dist/adapters/utils-ChhNGUOF.js +5396 -0
- package/dist/adapters/utils-CwJplXR5.cjs +15 -0
- package/dist/adapters/utils.cjs +1 -19
- package/dist/adapters/utils.js +2 -21333
- package/dist/client/charts.js +15 -186
- package/dist/client/chunks/DashboardEditModal-C076pscL.js +6678 -0
- package/dist/client/chunks/DashboardEditModal-C076pscL.js.map +1 -0
- package/dist/client/chunks/FieldSearchModal-C0DjSWk3.js +2631 -0
- package/dist/client/chunks/FieldSearchModal-C0DjSWk3.js.map +1 -0
- package/dist/client/chunks/RetentionCombinedChart-DuGXc-AP.js +270 -0
- package/dist/client/chunks/RetentionCombinedChart-DuGXc-AP.js.map +1 -0
- package/dist/client/chunks/RetentionCombinedChart.config-DprbXd1N.js +56 -0
- package/dist/client/chunks/RetentionCombinedChart.config-DprbXd1N.js.map +1 -0
- package/dist/client/chunks/RetentionHeatmap-BoGY6mlZ.js +193 -0
- package/dist/client/chunks/RetentionHeatmap-BoGY6mlZ.js.map +1 -0
- package/dist/client/chunks/RetentionHeatmap.config-cbaNExVy.js +25 -0
- package/dist/client/chunks/RetentionHeatmap.config-cbaNExVy.js.map +1 -0
- package/dist/client/chunks/analysis-builder-DF0XntqC.js +6111 -0
- package/dist/client/chunks/analysis-builder-DF0XntqC.js.map +1 -0
- package/dist/client/chunks/analysis-builder-shared-2QhKYbs6.js +3114 -0
- package/dist/client/chunks/analysis-builder-shared-2QhKYbs6.js.map +1 -0
- package/dist/client/chunks/chart-activity-grid-CNES9VBk.js +803 -0
- package/dist/client/chunks/chart-activity-grid-CNES9VBk.js.map +1 -0
- package/dist/client/chunks/chart-area-CRJc3KOu.js +449 -0
- package/dist/client/chunks/chart-area-CRJc3KOu.js.map +1 -0
- package/dist/client/chunks/chart-bar-DD2PjJ5n.js +270 -0
- package/dist/client/chunks/chart-bar-DD2PjJ5n.js.map +1 -0
- package/dist/client/chunks/chart-box-plot-BcqleldJ.js +377 -0
- package/dist/client/chunks/chart-box-plot-BcqleldJ.js.map +1 -0
- package/dist/client/chunks/chart-bubble-BmQkVk4K.js +273 -0
- package/dist/client/chunks/chart-bubble-BmQkVk4K.js.map +1 -0
- package/dist/client/chunks/chart-candlestick-C3Rep469.js +306 -0
- package/dist/client/chunks/chart-candlestick-C3Rep469.js.map +1 -0
- package/dist/client/chunks/chart-config-activity-grid-USo7JrPh.js +51 -0
- package/dist/client/chunks/chart-config-activity-grid-USo7JrPh.js.map +1 -0
- package/dist/client/chunks/chart-config-area-D_ZufYzg.js +93 -0
- package/dist/client/chunks/chart-config-area-D_ZufYzg.js.map +1 -0
- package/dist/client/chunks/chart-config-bar-BCi2Wmd6.js +87 -0
- package/dist/client/chunks/chart-config-bar-BCi2Wmd6.js.map +1 -0
- package/dist/client/chunks/chart-config-box-plot-afKLzJSp.js +35 -0
- package/dist/client/chunks/chart-config-box-plot-afKLzJSp.js.map +1 -0
- package/dist/client/chunks/chart-config-bubble-CgbBjPv8.js +82 -0
- package/dist/client/chunks/chart-config-bubble-CgbBjPv8.js.map +1 -0
- package/dist/client/chunks/chart-config-candlestick-7boGjZ-A.js +72 -0
- package/dist/client/chunks/chart-config-candlestick-7boGjZ-A.js.map +1 -0
- package/dist/client/chunks/chart-config-data-table-Cl7sBasW.js +30 -0
- package/dist/client/chunks/chart-config-data-table-Cl7sBasW.js.map +1 -0
- package/dist/client/chunks/chart-config-funnel-CXPYQtTl.js +93 -0
- package/dist/client/chunks/chart-config-funnel-CXPYQtTl.js.map +1 -0
- package/dist/client/chunks/chart-config-gauge-DUNEUCvh.js +64 -0
- package/dist/client/chunks/chart-config-gauge-DUNEUCvh.js.map +1 -0
- package/dist/client/chunks/chart-config-heat-map-BFf1tO11.js +91 -0
- package/dist/client/chunks/chart-config-heat-map-BFf1tO11.js.map +1 -0
- package/dist/client/chunks/chart-config-kpi-delta-C5k2waIJ.js +94 -0
- package/dist/client/chunks/chart-config-kpi-delta-C5k2waIJ.js.map +1 -0
- package/dist/client/chunks/chart-config-kpi-number-DptOyhk0.js +75 -0
- package/dist/client/chunks/chart-config-kpi-number-DptOyhk0.js.map +1 -0
- package/dist/client/chunks/chart-config-kpi-text-D9DdVWqd.js +47 -0
- package/dist/client/chunks/chart-config-kpi-text-D9DdVWqd.js.map +1 -0
- package/dist/client/chunks/chart-config-line-B3NgLF7K.js +104 -0
- package/dist/client/chunks/chart-config-line-B3NgLF7K.js.map +1 -0
- package/dist/client/chunks/chart-config-markdown-tlfivQTt.js +117 -0
- package/dist/client/chunks/chart-config-markdown-tlfivQTt.js.map +1 -0
- package/dist/client/chunks/chart-config-measure-profile-D7XDwrU2.js +82 -0
- package/dist/client/chunks/chart-config-measure-profile-D7XDwrU2.js.map +1 -0
- package/dist/client/chunks/chart-config-pie-wY0B52PC.js +68 -0
- package/dist/client/chunks/chart-config-pie-wY0B52PC.js.map +1 -0
- package/dist/client/chunks/chart-config-radar-DRpJBy1M.js +49 -0
- package/dist/client/chunks/chart-config-radar-DRpJBy1M.js.map +1 -0
- package/dist/client/chunks/chart-config-radial-bar-DCUpXv9G.js +38 -0
- package/dist/client/chunks/chart-config-radial-bar-DCUpXv9G.js.map +1 -0
- package/dist/client/chunks/chart-config-sankey-CdOhlm4h.js +66 -0
- package/dist/client/chunks/chart-config-sankey-CdOhlm4h.js.map +1 -0
- package/dist/client/chunks/chart-config-scatter-B2su_x8f.js +61 -0
- package/dist/client/chunks/chart-config-scatter-B2su_x8f.js.map +1 -0
- package/dist/client/chunks/chart-config-sunburst-BPdjbk18.js +45 -0
- package/dist/client/chunks/chart-config-sunburst-BPdjbk18.js.map +1 -0
- package/dist/client/chunks/chart-config-tree-map-Cbsh2fe2.js +51 -0
- package/dist/client/chunks/chart-config-tree-map-Cbsh2fe2.js.map +1 -0
- package/dist/client/chunks/chart-config-waterfall-DGmuZfQF.js +59 -0
- package/dist/client/chunks/chart-config-waterfall-DGmuZfQF.js.map +1 -0
- package/dist/client/chunks/chart-data-table-DehW1C1G.js +4088 -0
- package/dist/client/chunks/chart-data-table-DehW1C1G.js.map +1 -0
- package/dist/client/chunks/chart-funnel-BjkpnG5g.js +447 -0
- package/dist/client/chunks/chart-funnel-BjkpnG5g.js.map +1 -0
- package/dist/client/chunks/chart-gauge-BWW_HEfg.js +424 -0
- package/dist/client/chunks/chart-gauge-BWW_HEfg.js.map +1 -0
- package/dist/client/chunks/chart-heat-map-BWuOuDcm.js +236 -0
- package/dist/client/chunks/chart-heat-map-BWuOuDcm.js.map +1 -0
- package/dist/client/chunks/chart-kpi-delta-D5OHtDJx.js +343 -0
- package/dist/client/chunks/chart-kpi-delta-D5OHtDJx.js.map +1 -0
- package/dist/client/chunks/chart-kpi-number-C9zH-aKC.js +326 -0
- package/dist/client/chunks/chart-kpi-number-C9zH-aKC.js.map +1 -0
- package/dist/client/chunks/chart-kpi-text-ChVn3S7j.js +149 -0
- package/dist/client/chunks/chart-kpi-text-ChVn3S7j.js.map +1 -0
- package/dist/client/chunks/chart-line-DOIMkP0b.js +431 -0
- package/dist/client/chunks/chart-line-DOIMkP0b.js.map +1 -0
- package/dist/client/chunks/chart-markdown-DXxc43w1.js +3457 -0
- package/dist/client/chunks/chart-markdown-DXxc43w1.js.map +1 -0
- package/dist/client/chunks/chart-measure-profile-C6wrr9il.js +179 -0
- package/dist/client/chunks/chart-measure-profile-C6wrr9il.js.map +1 -0
- package/dist/client/chunks/chart-pie-BU_FgwDc.js +172 -0
- package/dist/client/chunks/chart-pie-BU_FgwDc.js.map +1 -0
- package/dist/client/chunks/chart-radar-DlufwnAX.js +154 -0
- package/dist/client/chunks/chart-radar-DlufwnAX.js.map +1 -0
- package/dist/client/chunks/chart-radial-bar-B5vS_Aw5.js +148 -0
- package/dist/client/chunks/chart-radial-bar-B5vS_Aw5.js.map +1 -0
- package/dist/client/chunks/chart-sankey-FChb26UX.js +222 -0
- package/dist/client/chunks/chart-sankey-FChb26UX.js.map +1 -0
- package/dist/client/chunks/chart-scatter-DW0cAZ2H.js +255 -0
- package/dist/client/chunks/chart-scatter-DW0cAZ2H.js.map +1 -0
- package/dist/client/chunks/chart-sunburst-Clf-6WxW.js +221 -0
- package/dist/client/chunks/chart-sunburst-Clf-6WxW.js.map +1 -0
- package/dist/client/chunks/chart-tree-map-p_VwUJPF.js +298 -0
- package/dist/client/chunks/chart-tree-map-p_VwUJPF.js.map +1 -0
- package/dist/client/chunks/chart-waterfall-jt44IQ-w.js +237 -0
- package/dist/client/chunks/chart-waterfall-jt44IQ-w.js.map +1 -0
- package/dist/client/chunks/charts-core-CUVzf4cV.js +215 -0
- package/dist/client/chunks/charts-core-CUVzf4cV.js.map +1 -0
- package/dist/client/chunks/charts-loader-AGpph8_I.js +259 -0
- package/dist/client/chunks/charts-loader-AGpph8_I.js.map +1 -0
- package/dist/client/chunks/core-D1TOj17W.js +845 -0
- package/dist/client/chunks/core-D1TOj17W.js.map +1 -0
- package/dist/client/chunks/dist-DDBeV_JI.js +847 -0
- package/dist/client/chunks/dist-DDBeV_JI.js.map +1 -0
- package/dist/client/chunks/javascript-BBwTSo6e.js +438 -0
- package/dist/client/chunks/javascript-BBwTSo6e.js.map +1 -0
- package/dist/client/chunks/json-BpTrLZSh.js +38 -0
- package/dist/client/chunks/json-BpTrLZSh.js.map +1 -0
- package/dist/client/chunks/lazyChartConfigRegistry-BjhxDaSf.js +149 -0
- package/dist/client/chunks/lazyChartConfigRegistry-BjhxDaSf.js.map +1 -0
- package/dist/client/chunks/providers-DX3Vw5kc.js +7 -0
- package/dist/client/chunks/providers-DX3Vw5kc.js.map +1 -0
- package/dist/client/chunks/retention-UEXlSdZ-.js +132 -0
- package/dist/client/chunks/retention-UEXlSdZ-.js.map +1 -0
- package/dist/client/chunks/rolldown-runtime-lc2dmIiU.js +20 -0
- package/dist/client/chunks/schema-visualization-ZugB4Io9.js +1073 -0
- package/dist/client/chunks/schema-visualization-ZugB4Io9.js.map +1 -0
- package/dist/client/chunks/sql-B0chxcEK.js +120 -0
- package/dist/client/chunks/sql-B0chxcEK.js.map +1 -0
- package/dist/client/chunks/syntaxHighlighting-87bOwTxj.js +30 -0
- package/dist/client/chunks/syntaxHighlighting-87bOwTxj.js.map +1 -0
- package/dist/client/chunks/useDebounce-BQjNWndQ.js +1394 -0
- package/dist/client/chunks/useDebounce-BQjNWndQ.js.map +1 -0
- package/dist/client/chunks/useDirtyStateTracking-CgKZWkel.js +66 -0
- package/dist/client/chunks/useDirtyStateTracking-CgKZWkel.js.map +1 -0
- package/dist/client/chunks/useExplainAI-c_bHxZe5.js +203 -0
- package/dist/client/chunks/useExplainAI-c_bHxZe5.js.map +1 -0
- package/dist/client/chunks/useNotebookLayout-BFZ_33Kb.js +37 -0
- package/dist/client/chunks/useNotebookLayout-BFZ_33Kb.js.map +1 -0
- package/dist/client/chunks/utils-A54Ny29G.js +128 -0
- package/dist/client/chunks/utils-A54Ny29G.js.map +1 -0
- package/dist/client/chunks/vendor-CoPBRumI.js +828 -0
- package/dist/client/chunks/vendor-CoPBRumI.js.map +1 -0
- package/dist/client/components.js +4 -18
- package/dist/client/hooks.js +6 -58
- package/dist/client/icons.js +2 -15
- package/dist/client/index.js +1061 -1295
- package/dist/client/index.js.map +1 -1
- package/dist/client/providers.js +3 -9
- package/dist/client/styles.css +2 -1
- package/dist/client/types.d.ts +1 -0
- package/dist/client/utils.js +7 -74
- package/dist/client-bundle-stats.html +1 -1
- package/dist/server/anthropic-BsNspi1r.js +140 -0
- package/dist/server/anthropic-DsCEX6Fm.cjs +1 -0
- package/dist/server/dist-CMWZC51B.js +581 -0
- package/dist/server/dist-DxegvyZF.cjs +2 -0
- package/dist/server/google-BXwMolCu.js +154 -0
- package/dist/server/google-DzQWXFwF.cjs +2 -0
- package/dist/server/index.cjs +109 -129
- package/dist/server/index.js +15089 -34394
- package/dist/server/openai-BPhmb8mi.js +4114 -0
- package/dist/server/openai-CLsoLaue.cjs +1 -0
- package/dist/server/openai-D1kZ5sdM.js +153 -0
- package/dist/server/openai-DkOKbVLC.cjs +16 -0
- package/package.json +5 -5
- package/dist/adapters/anthropic-BTkjgFpT.cjs +0 -1
- package/dist/adapters/anthropic-CTu9E801.js +0 -126
- package/dist/adapters/google-BAK9pnQf.cjs +0 -2
- package/dist/adapters/google-DficVAsJ.js +0 -146
- package/dist/adapters/handler-BHguLZOY.js +0 -2713
- package/dist/adapters/handler-DOIyiFPg.cjs +0 -39
- package/dist/adapters/index-BgCeQBuN.cjs +0 -2
- package/dist/adapters/index-C3PskWTr.js +0 -5353
- package/dist/adapters/index-C45_meK_.js +0 -719
- package/dist/adapters/index-ht4NPca9.cjs +0 -23
- package/dist/adapters/mcp-transport-CWGqDQSI.cjs +0 -259
- package/dist/adapters/mcp-transport-CyeHMDPl.js +0 -11055
- package/dist/adapters/openai-BvA6eLs8.cjs +0 -1
- package/dist/adapters/openai-mcE24du8.js +0 -131
- package/dist/client/charts.js.map +0 -1
- package/dist/client/chunks/RetentionCombinedChart--SnU4Y_I.js +0 -256
- package/dist/client/chunks/RetentionCombinedChart--SnU4Y_I.js.map +0 -1
- package/dist/client/chunks/RetentionCombinedChart.config-Bbp2ghim.js +0 -48
- package/dist/client/chunks/RetentionCombinedChart.config-Bbp2ghim.js.map +0 -1
- package/dist/client/chunks/RetentionHeatmap-BHYU8MXY.js +0 -178
- package/dist/client/chunks/RetentionHeatmap-BHYU8MXY.js.map +0 -1
- package/dist/client/chunks/RetentionHeatmap.config-BWf_-vdj.js +0 -29
- package/dist/client/chunks/RetentionHeatmap.config-BWf_-vdj.js.map +0 -1
- package/dist/client/chunks/analysis-builder-DMFoAkjT.js +0 -6203
- package/dist/client/chunks/analysis-builder-DMFoAkjT.js.map +0 -1
- package/dist/client/chunks/analysis-builder-shared-CunrT3gi.js +0 -3140
- package/dist/client/chunks/analysis-builder-shared-CunrT3gi.js.map +0 -1
- package/dist/client/chunks/chart-activity-grid-DCznpK6N.js +0 -347
- package/dist/client/chunks/chart-activity-grid-DCznpK6N.js.map +0 -1
- package/dist/client/chunks/chart-area-CqKRIUpj.js +0 -234
- package/dist/client/chunks/chart-area-CqKRIUpj.js.map +0 -1
- package/dist/client/chunks/chart-bar-Bl5jvrU_.js +0 -267
- package/dist/client/chunks/chart-bar-Bl5jvrU_.js.map +0 -1
- package/dist/client/chunks/chart-box-plot-CzMb00z_.js +0 -322
- package/dist/client/chunks/chart-box-plot-CzMb00z_.js.map +0 -1
- package/dist/client/chunks/chart-bubble-BF8Z52eW.js +0 -249
- package/dist/client/chunks/chart-bubble-BF8Z52eW.js.map +0 -1
- package/dist/client/chunks/chart-candlestick-ByWS945g.js +0 -269
- package/dist/client/chunks/chart-candlestick-ByWS945g.js.map +0 -1
- package/dist/client/chunks/chart-config-activity-grid-CmOqDuOT.js +0 -50
- package/dist/client/chunks/chart-config-activity-grid-CmOqDuOT.js.map +0 -1
- package/dist/client/chunks/chart-config-area-CK_GVApT.js +0 -77
- package/dist/client/chunks/chart-config-area-CK_GVApT.js.map +0 -1
- package/dist/client/chunks/chart-config-bar-C8uzktxl.js +0 -71
- package/dist/client/chunks/chart-config-bar-C8uzktxl.js.map +0 -1
- package/dist/client/chunks/chart-config-box-plot-D_E_SSc2.js +0 -38
- package/dist/client/chunks/chart-config-box-plot-D_E_SSc2.js.map +0 -1
- package/dist/client/chunks/chart-config-bubble-q3DoQX5F.js +0 -71
- package/dist/client/chunks/chart-config-bubble-q3DoQX5F.js.map +0 -1
- package/dist/client/chunks/chart-config-candlestick-CRCpD43-.js +0 -70
- package/dist/client/chunks/chart-config-candlestick-CRCpD43-.js.map +0 -1
- package/dist/client/chunks/chart-config-data-table-B20Y5JCm.js +0 -28
- package/dist/client/chunks/chart-config-data-table-B20Y5JCm.js.map +0 -1
- package/dist/client/chunks/chart-config-funnel-3eYnGg8M.js +0 -92
- package/dist/client/chunks/chart-config-funnel-3eYnGg8M.js.map +0 -1
- package/dist/client/chunks/chart-config-gauge-CQx9w3d4.js +0 -64
- package/dist/client/chunks/chart-config-gauge-CQx9w3d4.js.map +0 -1
- package/dist/client/chunks/chart-config-heat-map-_wEnTnRA.js +0 -77
- package/dist/client/chunks/chart-config-heat-map-_wEnTnRA.js.map +0 -1
- package/dist/client/chunks/chart-config-kpi-delta-DLGZ2A3X.js +0 -97
- package/dist/client/chunks/chart-config-kpi-delta-DLGZ2A3X.js.map +0 -1
- package/dist/client/chunks/chart-config-kpi-number-K-wzviXF.js +0 -75
- package/dist/client/chunks/chart-config-kpi-number-K-wzviXF.js.map +0 -1
- package/dist/client/chunks/chart-config-kpi-text-BjYqwqaJ.js +0 -47
- package/dist/client/chunks/chart-config-kpi-text-BjYqwqaJ.js.map +0 -1
- package/dist/client/chunks/chart-config-line-JNagi9tf.js +0 -88
- package/dist/client/chunks/chart-config-line-JNagi9tf.js.map +0 -1
- package/dist/client/chunks/chart-config-markdown-BWQSjJpy.js +0 -97
- package/dist/client/chunks/chart-config-markdown-BWQSjJpy.js.map +0 -1
- package/dist/client/chunks/chart-config-measure-profile-ZYaMrtws.js +0 -70
- package/dist/client/chunks/chart-config-measure-profile-ZYaMrtws.js.map +0 -1
- package/dist/client/chunks/chart-config-pie-CNLXb-fr.js +0 -39
- package/dist/client/chunks/chart-config-pie-CNLXb-fr.js.map +0 -1
- package/dist/client/chunks/chart-config-radar-oxHfRAa3.js +0 -44
- package/dist/client/chunks/chart-config-radar-oxHfRAa3.js.map +0 -1
- package/dist/client/chunks/chart-config-radial-bar-_Aw3jAEm.js +0 -37
- package/dist/client/chunks/chart-config-radial-bar-_Aw3jAEm.js.map +0 -1
- package/dist/client/chunks/chart-config-sankey-C8FX9hGF.js +0 -61
- package/dist/client/chunks/chart-config-sankey-C8FX9hGF.js.map +0 -1
- package/dist/client/chunks/chart-config-scatter-DFKM80eO.js +0 -53
- package/dist/client/chunks/chart-config-scatter-DFKM80eO.js.map +0 -1
- package/dist/client/chunks/chart-config-sunburst-BmC0NLTU.js +0 -50
- package/dist/client/chunks/chart-config-sunburst-BmC0NLTU.js.map +0 -1
- package/dist/client/chunks/chart-config-tree-map-DGMbNTaa.js +0 -47
- package/dist/client/chunks/chart-config-tree-map-DGMbNTaa.js.map +0 -1
- package/dist/client/chunks/chart-config-waterfall-DTyXV_fo.js +0 -60
- package/dist/client/chunks/chart-config-waterfall-DTyXV_fo.js.map +0 -1
- package/dist/client/chunks/chart-data-table-HwfF-Ujv.js +0 -293
- package/dist/client/chunks/chart-data-table-HwfF-Ujv.js.map +0 -1
- package/dist/client/chunks/chart-funnel-WmuoWlCq.js +0 -259
- package/dist/client/chunks/chart-funnel-WmuoWlCq.js.map +0 -1
- package/dist/client/chunks/chart-gauge-Cot4By-w.js +0 -374
- package/dist/client/chunks/chart-gauge-Cot4By-w.js.map +0 -1
- package/dist/client/chunks/chart-heat-map-bGNtsZMr.js +0 -231
- package/dist/client/chunks/chart-heat-map-bGNtsZMr.js.map +0 -1
- package/dist/client/chunks/chart-kpi-delta-DeyKMxgq.js +0 -351
- package/dist/client/chunks/chart-kpi-delta-DeyKMxgq.js.map +0 -1
- package/dist/client/chunks/chart-kpi-number-D1z1gxXO.js +0 -476
- package/dist/client/chunks/chart-kpi-number-D1z1gxXO.js.map +0 -1
- package/dist/client/chunks/chart-kpi-text-b7q6KWc0.js +0 -165
- package/dist/client/chunks/chart-kpi-text-b7q6KWc0.js.map +0 -1
- package/dist/client/chunks/chart-line-3Nf-EPqJ.js +0 -450
- package/dist/client/chunks/chart-line-3Nf-EPqJ.js.map +0 -1
- package/dist/client/chunks/chart-markdown-BT_-MBq1.js +0 -2721
- package/dist/client/chunks/chart-markdown-BT_-MBq1.js.map +0 -1
- package/dist/client/chunks/chart-measure-profile-BVjUonqU.js +0 -114
- package/dist/client/chunks/chart-measure-profile-BVjUonqU.js.map +0 -1
- package/dist/client/chunks/chart-pie-DblG6w7g.js +0 -137
- package/dist/client/chunks/chart-pie-DblG6w7g.js.map +0 -1
- package/dist/client/chunks/chart-radar-BHZbeeTg.js +0 -129
- package/dist/client/chunks/chart-radar-BHZbeeTg.js.map +0 -1
- package/dist/client/chunks/chart-radial-bar-AlEJC1Jo.js +0 -119
- package/dist/client/chunks/chart-radial-bar-AlEJC1Jo.js.map +0 -1
- package/dist/client/chunks/chart-sankey-E8vYKjQF.js +0 -189
- package/dist/client/chunks/chart-sankey-E8vYKjQF.js.map +0 -1
- package/dist/client/chunks/chart-scatter-Bbxqi0iw.js +0 -202
- package/dist/client/chunks/chart-scatter-Bbxqi0iw.js.map +0 -1
- package/dist/client/chunks/chart-sunburst-BgnTKolT.js +0 -188
- package/dist/client/chunks/chart-sunburst-BgnTKolT.js.map +0 -1
- package/dist/client/chunks/chart-tree-map-i9LGCLwl.js +0 -284
- package/dist/client/chunks/chart-tree-map-i9LGCLwl.js.map +0 -1
- package/dist/client/chunks/chart-waterfall-BeIhCm83.js +0 -191
- package/dist/client/chunks/chart-waterfall-BeIhCm83.js.map +0 -1
- package/dist/client/chunks/charts-core-BUUO36OM.js +0 -692
- package/dist/client/chunks/charts-core-BUUO36OM.js.map +0 -1
- package/dist/client/chunks/charts-loader-goTYnavu.js +0 -258
- package/dist/client/chunks/charts-loader-goTYnavu.js.map +0 -1
- package/dist/client/chunks/components-BFgYvFq6.js +0 -10066
- package/dist/client/chunks/components-BFgYvFq6.js.map +0 -1
- package/dist/client/chunks/core-Y9e-sNfb.js +0 -1068
- package/dist/client/chunks/core-Y9e-sNfb.js.map +0 -1
- package/dist/client/chunks/flow-utils-CjQZG5qq.js +0 -16
- package/dist/client/chunks/flow-utils-CjQZG5qq.js.map +0 -1
- package/dist/client/chunks/funnel-utils-CyonoNeC.js +0 -135
- package/dist/client/chunks/funnel-utils-CyonoNeC.js.map +0 -1
- package/dist/client/chunks/icons-CwvgmdIP.js +0 -1636
- package/dist/client/chunks/icons-CwvgmdIP.js.map +0 -1
- package/dist/client/chunks/index-CApFCBF9.js +0 -81
- package/dist/client/chunks/index-CApFCBF9.js.map +0 -1
- package/dist/client/chunks/index-_2PSgbkC.js +0 -1046
- package/dist/client/chunks/index-_2PSgbkC.js.map +0 -1
- package/dist/client/chunks/javascript-DII1YQGr.js +0 -659
- package/dist/client/chunks/javascript-DII1YQGr.js.map +0 -1
- package/dist/client/chunks/json-C_6Prymp.js +0 -39
- package/dist/client/chunks/json-C_6Prymp.js.map +0 -1
- package/dist/client/chunks/providers-Ds7DRmnO.js +0 -554
- package/dist/client/chunks/providers-Ds7DRmnO.js.map +0 -1
- package/dist/client/chunks/retention-CzCo8262.js +0 -120
- package/dist/client/chunks/retention-CzCo8262.js.map +0 -1
- package/dist/client/chunks/schema-visualization-B97a1Ybu.js +0 -772
- package/dist/client/chunks/schema-visualization-B97a1Ybu.js.map +0 -1
- package/dist/client/chunks/sql-IeKX8fQ8.js +0 -616
- package/dist/client/chunks/sql-IeKX8fQ8.js.map +0 -1
- package/dist/client/chunks/syntaxHighlighting-DAMSW_A6.js +0 -34
- package/dist/client/chunks/syntaxHighlighting-DAMSW_A6.js.map +0 -1
- package/dist/client/chunks/theme-Dp3hFed1.js +0 -112
- package/dist/client/chunks/theme-Dp3hFed1.js.map +0 -1
- package/dist/client/chunks/useDirtyStateTracking-CyAXd07d.js +0 -1231
- package/dist/client/chunks/useDirtyStateTracking-CyAXd07d.js.map +0 -1
- package/dist/client/chunks/useExplainAI-CfQ_JmF1.js +0 -182
- package/dist/client/chunks/useExplainAI-CfQ_JmF1.js.map +0 -1
- package/dist/client/chunks/vendor-B2EH3V58.js +0 -2892
- package/dist/client/chunks/vendor-B2EH3V58.js.map +0 -1
- package/dist/client/components.js.map +0 -1
- package/dist/client/hooks.js.map +0 -1
- package/dist/client/icons.js.map +0 -1
- package/dist/client/providers.js.map +0 -1
- package/dist/client/utils.js.map +0 -1
- package/dist/server/anthropic-BTkjgFpT.cjs +0 -1
- package/dist/server/anthropic-CTu9E801.js +0 -126
- package/dist/server/google-BAK9pnQf.cjs +0 -2
- package/dist/server/google-DficVAsJ.js +0 -146
- package/dist/server/index-BgCeQBuN.cjs +0 -2
- package/dist/server/index-C3PskWTr.js +0 -5353
- package/dist/server/index-C45_meK_.js +0 -719
- package/dist/server/index-ht4NPca9.cjs +0 -23
- package/dist/server/openai-BvA6eLs8.cjs +0 -1
- package/dist/server/openai-mcE24du8.js +0 -131
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { n as e } from "./rolldown-runtime-lc2dmIiU.js";
|
|
2
|
+
import { S as t, T as n, _ as r, g as i, i as a, m as o, n as s, r as c, u as l, w as u, x as d, y as f } from "./chart-activity-grid-CNES9VBk.js";
|
|
3
|
+
import p, { useCallback as m, useEffect as h, useLayoutEffect as g, useMemo as _, useRef as v, useState as y, useSyncExternalStore as b } from "react";
|
|
4
|
+
import { jsx as x, jsxs as S } from "react/jsx-runtime";
|
|
5
|
+
import { axisBottom as C, axisLeft as w, extent as T, max as ee, scaleLinear as E, scaleOrdinal as D, scaleQuantize as te, scaleSqrt as O, select as k } from "d3";
|
|
6
|
+
//#region src/client/hooks/useTheme.ts
|
|
7
|
+
var A = {
|
|
8
|
+
listeners: /* @__PURE__ */ new Set(),
|
|
9
|
+
subscribe(e) {
|
|
10
|
+
return this.listeners.add(e), () => this.listeners.delete(e);
|
|
11
|
+
},
|
|
12
|
+
notify() {
|
|
13
|
+
this.listeners.forEach((e) => e());
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
i(() => {
|
|
17
|
+
A.notify();
|
|
18
|
+
});
|
|
19
|
+
function j() {
|
|
20
|
+
return {
|
|
21
|
+
theme: b(A.subscribe.bind(A), l, l),
|
|
22
|
+
setTheme: m((e) => {
|
|
23
|
+
o(e), A.notify();
|
|
24
|
+
}, [])
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
//#region src/client/components/charts/BubbleChart.tsx
|
|
29
|
+
var M = /* @__PURE__ */ e({ default: () => N }), N = p.memo(function({ data: e, chartConfig: i, displayConfig: o = {}, queryObject: l, height: p = "100%", colorPalette: m }) {
|
|
30
|
+
let b = v(null), A = v(null), [M, N] = y({
|
|
31
|
+
width: 0,
|
|
32
|
+
height: 0
|
|
33
|
+
}), [P, F] = y(!1), { theme: I } = j(), L = r(), R = _(() => ({
|
|
34
|
+
showLegend: o?.showLegend ?? !0,
|
|
35
|
+
showGrid: o?.showGrid ?? !0,
|
|
36
|
+
showTooltip: o?.showTooltip ?? !0,
|
|
37
|
+
minBubbleSize: o?.minBubbleSize ?? 5,
|
|
38
|
+
maxBubbleSize: o?.maxBubbleSize ?? 50,
|
|
39
|
+
bubbleOpacity: o?.bubbleOpacity ?? .7,
|
|
40
|
+
xAxisFormat: o?.xAxisFormat,
|
|
41
|
+
leftYAxisFormat: o?.leftYAxisFormat
|
|
42
|
+
}), [
|
|
43
|
+
o?.showLegend,
|
|
44
|
+
o?.showGrid,
|
|
45
|
+
o?.showTooltip,
|
|
46
|
+
o?.minBubbleSize,
|
|
47
|
+
o?.maxBubbleSize,
|
|
48
|
+
o?.bubbleOpacity,
|
|
49
|
+
o?.xAxisFormat,
|
|
50
|
+
o?.leftYAxisFormat
|
|
51
|
+
]);
|
|
52
|
+
return g(() => {
|
|
53
|
+
let e = 0, t, n, r = () => {
|
|
54
|
+
if (A.current) {
|
|
55
|
+
let { width: e, height: t } = A.current.getBoundingClientRect();
|
|
56
|
+
if (e > 0 && t > 0) return N({
|
|
57
|
+
width: e,
|
|
58
|
+
height: t
|
|
59
|
+
}), F(!0), !0;
|
|
60
|
+
}
|
|
61
|
+
return !1;
|
|
62
|
+
};
|
|
63
|
+
if (!r() && e < 10) {
|
|
64
|
+
let i = () => {
|
|
65
|
+
!r() && e < 10 && (e++, n = setTimeout(() => {
|
|
66
|
+
t = requestAnimationFrame(i);
|
|
67
|
+
}, 50 * e));
|
|
68
|
+
};
|
|
69
|
+
t = requestAnimationFrame(i);
|
|
70
|
+
}
|
|
71
|
+
return () => {
|
|
72
|
+
t && cancelAnimationFrame(t), n && clearTimeout(n);
|
|
73
|
+
};
|
|
74
|
+
}, []), h(() => {
|
|
75
|
+
let e = null, t = () => {
|
|
76
|
+
if (A.current) {
|
|
77
|
+
let { width: e, height: t } = A.current.getBoundingClientRect();
|
|
78
|
+
e > 0 && t > 0 && (N({
|
|
79
|
+
width: e,
|
|
80
|
+
height: t
|
|
81
|
+
}), P || F(!0));
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
return A.current && (e = new ResizeObserver((e) => {
|
|
85
|
+
for (let t of e) {
|
|
86
|
+
let { width: e, height: n } = t.contentRect;
|
|
87
|
+
e > 0 && n > 0 && (N({
|
|
88
|
+
width: e,
|
|
89
|
+
height: n
|
|
90
|
+
}), P || F(!0));
|
|
91
|
+
}
|
|
92
|
+
}), e.observe(A.current), t()), window.addEventListener("resize", t), () => {
|
|
93
|
+
e && e.disconnect(), window.removeEventListener("resize", t);
|
|
94
|
+
};
|
|
95
|
+
}, [P]), h(() => {
|
|
96
|
+
if (!e || e.length === 0 || !b.current || !P || M.width === 0 || (k(b.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, p = Array.isArray(i.series) ? i.series[0] : i.series, h = Array.isArray(i.sizeField) ? i.sizeField[0] : i.sizeField || o, g = Array.isArray(i.colorField) ? i.colorField[0] : i.colorField;
|
|
98
|
+
if (!r || !o || !p || !h) return;
|
|
99
|
+
let _ = t(l, r), v = l?.timeDimensions?.some((e) => e.dimension === r) || !1, y = e.map((e) => {
|
|
100
|
+
let t = e[r], i, a;
|
|
101
|
+
if (v && t) {
|
|
102
|
+
let e = String(t), n;
|
|
103
|
+
if (e.match(/^\d{4}-\d{2}-\d{2}[T ]/)) {
|
|
104
|
+
let t = e;
|
|
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
|
+
} else n = new Date(e);
|
|
107
|
+
i = isNaN(n.getTime()) ? parseFloat(e) : n.getTime(), a = d(t, _);
|
|
108
|
+
} else {
|
|
109
|
+
let e = d(t, _) || t;
|
|
110
|
+
i = typeof e == "string" ? parseFloat(e) : e, a = String(e);
|
|
111
|
+
}
|
|
112
|
+
let s = n(e[o]), c = n(e[h]), l = e[p];
|
|
113
|
+
return {
|
|
114
|
+
x: i,
|
|
115
|
+
xLabel: a,
|
|
116
|
+
y: s,
|
|
117
|
+
size: c === null ? 0 : Math.abs(c),
|
|
118
|
+
color: g ? e[g] : l,
|
|
119
|
+
series: l,
|
|
120
|
+
label: `${l || "Unknown"}`,
|
|
121
|
+
isValid: u(i) && s !== null && c !== null && c > 0
|
|
122
|
+
};
|
|
123
|
+
}).filter((e) => e.isValid && e.size > 0);
|
|
124
|
+
if (y.length === 0) return;
|
|
125
|
+
let x = {
|
|
126
|
+
...a,
|
|
127
|
+
left: a.left + 30,
|
|
128
|
+
bottom: R.showLegend && g ? 100 : 40
|
|
129
|
+
}, S = M.width - x.left - x.right, A = M.height - x.top - x.bottom, j = k(b.current).attr("width", M.width).attr("height", M.height), N = j.append("g").attr("transform", `translate(${x.left},${x.top})`), F = E().domain(T(y, (e) => e.x)).range([0, S]).nice(), z = E().domain(T(y, (e) => e.y)).range([A, 0]).nice(), B = O().domain([0, ee(y, (e) => e.size)]).range([R.minBubbleSize, R.maxBubbleSize]), V, H = !1, U = [];
|
|
130
|
+
if (g && y.length > 0) {
|
|
131
|
+
let e = y.map((e) => {
|
|
132
|
+
let t = e.color;
|
|
133
|
+
return typeof t == "string" ? parseFloat(t) : t;
|
|
134
|
+
}).filter((e) => !isNaN(e));
|
|
135
|
+
if (H = e.length === y.length && e.every((e) => typeof e == "number"), H) {
|
|
136
|
+
let t = Math.min(...e), n = Math.max(...e);
|
|
137
|
+
V = te().domain([t, n]).range(m?.gradient || c);
|
|
138
|
+
} else U = [...new Set(y.map((e) => String(e.color)))], V = D().domain(U).range(m?.colors || s);
|
|
139
|
+
} else V = D().domain(["default"]).range([s[0]]);
|
|
140
|
+
let W = (e, t) => getComputedStyle(document.documentElement).getPropertyValue(e).trim() || t, G = I !== "light", K = G ? W("--dc-text-muted", "#cbd5e1") : W("--dc-text-secondary", "#374151"), q = G ? W("--dc-border", "#475569") : "#9ca3af";
|
|
141
|
+
if (R.showGrid) {
|
|
142
|
+
let e = N.append("g").attr("class", "grid").attr("transform", `translate(0,${A})`).call(C(F).tickSize(-A).tickFormat(() => ""));
|
|
143
|
+
e.selectAll("line").style("stroke", q).style("stroke-dasharray", "3,3").style("opacity", .3), e.select(".domain").style("stroke", "none");
|
|
144
|
+
let t = N.append("g").attr("class", "grid").call(w(z).tickSize(-S).tickFormat(() => ""));
|
|
145
|
+
t.selectAll("line").style("stroke", q).style("stroke-dasharray", "3,3").style("opacity", .3), t.select(".domain").style("stroke", "none");
|
|
146
|
+
}
|
|
147
|
+
let J = C(F);
|
|
148
|
+
v ? J.tickFormat((e) => {
|
|
149
|
+
let t = new Date(e);
|
|
150
|
+
if (isNaN(t.getTime())) return String(e);
|
|
151
|
+
switch (_?.toLowerCase()) {
|
|
152
|
+
case "year": return String(t.getUTCFullYear());
|
|
153
|
+
case "quarter": {
|
|
154
|
+
let e = Math.floor(t.getUTCMonth() / 3) + 1;
|
|
155
|
+
return `${t.getUTCFullYear()}-Q${e}`;
|
|
156
|
+
}
|
|
157
|
+
case "month": return `${t.getUTCFullYear()}-${String(t.getUTCMonth() + 1).padStart(2, "0")}`;
|
|
158
|
+
case "week":
|
|
159
|
+
case "day": return `${t.getUTCFullYear()}-${String(t.getUTCMonth() + 1).padStart(2, "0")}-${String(t.getUTCDate()).padStart(2, "0")}`;
|
|
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
|
+
default: return `${t.getUTCFullYear()}-${String(t.getUTCMonth() + 1).padStart(2, "0")}`;
|
|
162
|
+
}
|
|
163
|
+
}) : R.xAxisFormat && J.tickFormat((e) => f(e, R.xAxisFormat));
|
|
164
|
+
let Y = N.append("g").attr("transform", `translate(0,${A})`).call(J);
|
|
165
|
+
Y.selectAll("text").style("fill", K), Y.selectAll("line, path").style("stroke", q), Y.append("text").attr("x", S / 2).attr("y", 35).attr("fill", K).style("text-anchor", "middle").style("font-size", "12px").text(R.xAxisFormat?.label || L(r));
|
|
166
|
+
let X = w(z);
|
|
167
|
+
R.leftYAxisFormat && X.tickFormat((e) => f(e, R.leftYAxisFormat));
|
|
168
|
+
let Z = N.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", -A / 2).attr("fill", K).style("text-anchor", "middle").style("font-size", "12px").text(R.leftYAxisFormat?.label || L(o));
|
|
170
|
+
let Q = k("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), $ = N.selectAll(".bubble").data(y).enter().append("circle").attr("class", "bubble").attr("cx", (e) => F(e.x)).attr("cy", (e) => z(e.y)).attr("r", (e) => B(e.size)).style("fill", (e) => g && e.color !== void 0 ? V(H ? e.color : String(e.color)) : s[0]).style("opacity", R.bubbleOpacity).style("stroke", "#fff").style("stroke-width", 1).style("cursor", "pointer");
|
|
171
|
+
if (R.showTooltip && $.on("mouseover", function(e, t) {
|
|
172
|
+
k(this).transition().duration(200).style("opacity", 1).attr("r", B(t.size) * 1.1);
|
|
173
|
+
let n = [
|
|
174
|
+
`<strong>${t.series || "Unknown"}</strong>`,
|
|
175
|
+
`${L(r)}: ${t.xLabel || (R.xAxisFormat ? f(t.x, R.xAxisFormat) : t.x)}`,
|
|
176
|
+
`${L(o)}: ${R.leftYAxisFormat ? f(t.y, R.leftYAxisFormat) : t.y}`,
|
|
177
|
+
`${L(h)}: ${R.leftYAxisFormat ? f(t.size, R.leftYAxisFormat) : t.size}`,
|
|
178
|
+
g && t.color ? `${L(g)}: ${t.color}` : ""
|
|
179
|
+
].filter(Boolean).join("<br>");
|
|
180
|
+
Q.html(n).style("left", e.pageX + 10 + "px").style("top", e.pageY - 10 + "px").transition().duration(200).style("opacity", 1);
|
|
181
|
+
}).on("mousemove", function(e) {
|
|
182
|
+
Q.style("left", e.pageX + 10 + "px").style("top", e.pageY - 10 + "px");
|
|
183
|
+
}).on("mouseout", function(e, t) {
|
|
184
|
+
k(this).transition().duration(200).style("opacity", R.bubbleOpacity).attr("r", B(t.size)), Q.transition().duration(200).style("opacity", 0);
|
|
185
|
+
}), R.showLegend && g) if (H) {
|
|
186
|
+
let e = Math.min(...y.map((e) => e.color)), t = Math.max(...y.map((e) => e.color)), n = N.append("g").attr("class", "color-legend").attr("transform", `translate(${S / 2 - 200 / 2}, ${A + 60})`), r = j.append("defs").append("linearGradient").attr("id", "color-scale-gradient").attr("x1", "0%").attr("y1", "0%").attr("x2", "100%").attr("y2", "0%"), i = m?.gradient || c;
|
|
187
|
+
i.forEach((e, t) => {
|
|
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(R.leftYAxisFormat ? f(e, R.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(R.leftYAxisFormat ? f(t, R.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(L(g));
|
|
190
|
+
} else {
|
|
191
|
+
let e = U;
|
|
192
|
+
if (e.length > 0) {
|
|
193
|
+
let t = N.append("g").attr("class", "legend").attr("transform", `translate(${S / 2 - e.length * 80 / 2}, ${A + 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", R.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
|
+
$.transition().duration(200).style("opacity", (e) => g && String(e.color) === t ? 1 : .2);
|
|
196
|
+
}).on("mouseout", function() {
|
|
197
|
+
$.transition().duration(200).style("opacity", R.bubbleOpacity);
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return () => {
|
|
202
|
+
Q.remove();
|
|
203
|
+
};
|
|
204
|
+
}, [
|
|
205
|
+
e,
|
|
206
|
+
i,
|
|
207
|
+
R,
|
|
208
|
+
l,
|
|
209
|
+
M,
|
|
210
|
+
P,
|
|
211
|
+
m,
|
|
212
|
+
I,
|
|
213
|
+
L
|
|
214
|
+
]), !e || e.length === 0 ? /* @__PURE__ */ x("div", {
|
|
215
|
+
className: "dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted",
|
|
216
|
+
style: { height: p },
|
|
217
|
+
children: /* @__PURE__ */ S("div", {
|
|
218
|
+
className: "dc:text-center",
|
|
219
|
+
children: [/* @__PURE__ */ x("div", {
|
|
220
|
+
className: "dc:text-sm dc:font-semibold dc:mb-1",
|
|
221
|
+
children: "No data available"
|
|
222
|
+
}), /* @__PURE__ */ x("div", {
|
|
223
|
+
className: "dc:text-xs text-dc-text-secondary",
|
|
224
|
+
children: "No data points to display in bubble chart"
|
|
225
|
+
})]
|
|
226
|
+
})
|
|
227
|
+
}) : i?.xAxis && i?.yAxis && i?.series ? /* @__PURE__ */ x("div", {
|
|
228
|
+
className: "dc:w-full dc:flex-1 dc:flex dc:flex-col dc:relative",
|
|
229
|
+
style: {
|
|
230
|
+
height: p,
|
|
231
|
+
minHeight: "250px",
|
|
232
|
+
overflow: "hidden"
|
|
233
|
+
},
|
|
234
|
+
children: /* @__PURE__ */ S("div", {
|
|
235
|
+
ref: A,
|
|
236
|
+
className: "dc:w-full dc:h-full dc:relative",
|
|
237
|
+
children: [/* @__PURE__ */ x("svg", {
|
|
238
|
+
ref: b,
|
|
239
|
+
className: "dc:w-full dc:h-full"
|
|
240
|
+
}), !P && /* @__PURE__ */ x("div", {
|
|
241
|
+
className: "dc:absolute dc:inset-0 dc:flex dc:items-center dc:justify-center",
|
|
242
|
+
children: /* @__PURE__ */ x("div", {
|
|
243
|
+
className: "text-dc-text-muted dc:text-sm",
|
|
244
|
+
children: "Measuring chart dimensions..."
|
|
245
|
+
})
|
|
246
|
+
})]
|
|
247
|
+
})
|
|
248
|
+
}) : /* @__PURE__ */ x("div", {
|
|
249
|
+
className: "dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning",
|
|
250
|
+
style: { height: p },
|
|
251
|
+
children: /* @__PURE__ */ S("div", {
|
|
252
|
+
className: "dc:text-center",
|
|
253
|
+
children: [
|
|
254
|
+
/* @__PURE__ */ x("div", {
|
|
255
|
+
className: "dc:text-sm dc:font-semibold dc:mb-1",
|
|
256
|
+
children: "Configuration Required"
|
|
257
|
+
}),
|
|
258
|
+
/* @__PURE__ */ x("div", {
|
|
259
|
+
className: "dc:text-xs",
|
|
260
|
+
children: "Bubble chart requires xAxis, yAxis, series, and sizeField dimensions"
|
|
261
|
+
}),
|
|
262
|
+
/* @__PURE__ */ x("div", {
|
|
263
|
+
className: "dc:text-xs dc:mt-1",
|
|
264
|
+
children: "Optional: colorField for bubble coloring"
|
|
265
|
+
})
|
|
266
|
+
]
|
|
267
|
+
})
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
//#endregion
|
|
271
|
+
export { j as n, M as t };
|
|
272
|
+
|
|
273
|
+
//# sourceMappingURL=chart-bubble-BmQkVk4K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-bubble-BmQkVk4K.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 { 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 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\">No data available</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">No data points to display in bubble chart</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\">Configuration Required</div>\n <div className=\"dc:text-xs\">Bubble chart requires xAxis, yAxis, series, and sizeField dimensions</div>\n <div className=\"dc:text-xs dc:mt-1\">Optional: colorField for bubble coloring</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\">Measuring chart dimensions...</div>\n </div>\n )}\n </div>\n </div>\n )\n})\n\nexport default BubbleChart"],"mappings":"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"}
|