drizzle-cube 0.8.0 → 0.8.2
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/ActivityGridChart.config-Bc7mPqcf.cjs +1 -0
- package/dist/adapters/ActivityGridChart.config-Dd2YDeaM.js +2 -0
- package/dist/adapters/AreaChart.config-BqNusnpg.js +2 -0
- package/dist/adapters/AreaChart.config-dI84V34B.cjs +1 -0
- package/dist/adapters/BarChart.config-B9MQjgLJ.cjs +1 -0
- package/dist/adapters/BarChart.config-Cq_qcxBA.js +2 -0
- package/dist/adapters/BoxPlotChart.config-XmtRN2xq.cjs +1 -0
- package/dist/adapters/BoxPlotChart.config-Zc-JGV-W.js +2 -0
- package/dist/adapters/BubbleChart.config-CU_18uxb.js +2 -0
- package/dist/adapters/BubbleChart.config-CbhOzA6-.cjs +1 -0
- package/dist/adapters/CandlestickChart.config-Bwo3uaa-.js +2 -0
- package/dist/adapters/CandlestickChart.config-CmRBlWFv.cjs +1 -0
- package/dist/adapters/DataTable.config-7JNSj6qQ.js +2 -0
- package/dist/adapters/DataTable.config-DNxm1sYk.cjs +1 -0
- package/dist/adapters/DotStripChart.config-B7Dl-T1h.js +2 -0
- package/dist/adapters/DotStripChart.config-Co4g1fpZ.cjs +1 -0
- package/dist/adapters/FunnelChart.config-D1TpuGtL.cjs +1 -0
- package/dist/adapters/FunnelChart.config-vuZScOHQ.js +2 -0
- package/dist/adapters/GaugeChart.config-BMgUHKhC.cjs +1 -0
- package/dist/adapters/GaugeChart.config-zdpFydo6.js +2 -0
- package/dist/adapters/HeatMapChart.config-4XMab1zq.js +2 -0
- package/dist/adapters/HeatMapChart.config-C-Ns6QBq.cjs +1 -0
- package/dist/adapters/KpiDelta.config-BGdqsHcc.js +2 -0
- package/dist/adapters/KpiDelta.config-DuNxrGIi.cjs +1 -0
- package/dist/adapters/KpiNumber.config-CkPWpcSz.js +2 -0
- package/dist/adapters/KpiNumber.config-DMGmuA3i.cjs +1 -0
- package/dist/adapters/KpiText.config-Bvtuv8vE.js +2 -0
- package/dist/adapters/KpiText.config-DOMLO16U.cjs +1 -0
- package/dist/adapters/LineChart.config-CJmTSmZ1.js +2 -0
- package/dist/adapters/LineChart.config-CrkGu0aa.cjs +1 -0
- package/dist/adapters/MarkdownChart.config-BgY5Xc97.cjs +1 -0
- package/dist/adapters/MarkdownChart.config-Cm6G4Yuh.js +2 -0
- package/dist/adapters/MeasureProfileChart.config-BYwDo_ox.cjs +1 -0
- package/dist/adapters/MeasureProfileChart.config-Dt7npubZ.js +2 -0
- package/dist/adapters/PieChart.config-BRbPctBN.cjs +1 -0
- package/dist/adapters/PieChart.config-HZofeody.js +2 -0
- package/dist/adapters/ProportionBarChart.config-B_rTtGZr.cjs +1 -0
- package/dist/adapters/ProportionBarChart.config-ChCSoM0L.js +2 -0
- package/dist/adapters/RadarChart.config-B9OdMEib.js +2 -0
- package/dist/adapters/RadarChart.config-BOgPD2Kz.cjs +1 -0
- package/dist/adapters/RadialBarChart.config-CeP7jEbq.js +2 -0
- package/dist/adapters/RadialBarChart.config-sivA1Jmo.cjs +1 -0
- package/dist/adapters/RecordsTable.config-BInSgo-G.js +2 -0
- package/dist/adapters/RecordsTable.config-CVmxLdjz.cjs +1 -0
- package/dist/adapters/RetentionCombinedChart.config-8ry7gh6X.cjs +1 -0
- package/dist/adapters/RetentionCombinedChart.config-Bxtxnlcf.js +2 -0
- package/dist/adapters/RetentionHeatmap.config-DCtOD8dO.js +2 -0
- package/dist/adapters/RetentionHeatmap.config-i-LgmmIT.cjs +1 -0
- package/dist/adapters/SankeyChart.config-DfpeHfNT.cjs +1 -0
- package/dist/adapters/SankeyChart.config-hfM0ACm1.js +2 -0
- package/dist/adapters/ScatterChart.config-BD2vfOZ6.js +2 -0
- package/dist/adapters/ScatterChart.config-CdpvRueF.cjs +1 -0
- package/dist/adapters/SunburstChart.config-Boyt88L_.cjs +1 -0
- package/dist/adapters/SunburstChart.config-BvrofzMv.js +2 -0
- package/dist/adapters/TreeMapChart.config-DBrqwtqT.js +2 -0
- package/dist/adapters/TreeMapChart.config-KcRLlZAG.cjs +1 -0
- package/dist/adapters/WaterfallChart.config-CuCGaIl5.cjs +1 -0
- package/dist/adapters/WaterfallChart.config-DZ8H0V2L.js +2 -0
- package/dist/adapters/{compiler-CQJ5GOwF.js → compiler-BFLAXV7W.js} +1160 -1861
- package/dist/adapters/compiler-DG6dLFQU.cjs +166 -0
- package/dist/adapters/core/index.cjs +1 -1
- package/dist/adapters/core/index.js +1 -1
- package/dist/adapters/{core-DgTGXxDu.cjs → core-CrJu6vJY.cjs} +1 -1
- package/dist/adapters/{core-DXkuSUBg.js → core-l3KMTu9u.js} +3 -3
- package/dist/adapters/express/index.cjs +1 -1
- package/dist/adapters/express/index.js +5 -5
- package/dist/adapters/fastify/index.cjs +1 -1
- package/dist/adapters/fastify/index.js +23 -23
- package/dist/{server/google-eKAc20al.js → adapters/google-DRY7jnOh.js} +46 -28
- package/dist/adapters/{google-BhvizbFR.cjs → google-PsZzwedr.cjs} +2 -2
- package/dist/adapters/handler-CRGZ8gd2.cjs +25 -0
- package/dist/adapters/{handler-CphYSZRh.js → handler-DESp4wPg.js} +454 -237
- package/dist/adapters/hono/index.cjs +1 -1
- package/dist/adapters/hono/index.js +4 -4
- package/dist/adapters/mcp-tools.cjs +1 -1
- package/dist/adapters/mcp-tools.js +2 -2
- package/dist/adapters/mcp-transport-BqdBHmXL.js +730 -0
- package/dist/adapters/mcp-transport-D8xZJLPD.cjs +42 -0
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.js +5 -5
- package/dist/adapters/{openai-CBrN4nxl.js → openai-BJyU4kvE.js} +3 -3
- package/dist/adapters/{openai-CSzWluuv.cjs → openai-DH9MtcLA.cjs} +1 -1
- package/dist/adapters/{openai-D-VMcPao.js → openai-DK_KWiI7.js} +1 -1
- package/dist/adapters/{openai-CI9vGKSf.cjs → openai-GO3M7Hwi.cjs} +2 -2
- package/dist/adapters/{utils-DkmShl5f.js → utils-BhlkVCzZ.js} +1985 -1122
- package/dist/adapters/utils-C1JpSDOX.cjs +128 -0
- package/dist/adapters/utils.cjs +1 -1
- package/dist/adapters/utils.d.ts +17 -3
- package/dist/adapters/utils.js +1 -1
- package/dist/cjs/adapters/utils.d.ts +17 -3
- package/dist/cjs/client/charts/chartConfigRegistry.d.ts +7 -0
- package/dist/cjs/client/charts/chartConfigs.d.ts +17 -1
- package/dist/cjs/client/client/CubeClient.d.ts +11 -1
- package/dist/cjs/client/components/AnalysisBuilder/AnalysisDisplayConfigPanel.d.ts +4 -2
- package/dist/cjs/client/components/AnalysisBuilder/ColumnFormatsEditor.d.ts +10 -0
- package/dist/cjs/client/components/AnalysisBuilder/DisplayOptionControl.d.ts +3 -2
- package/dist/cjs/client/components/AnalysisBuilder/utils/queryUtils.d.ts +7 -1
- package/dist/cjs/client/components/analyticsPortlet/PortletChart.d.ts +2 -1
- package/dist/cjs/client/components/analyticsPortlet/PortletChartView.d.ts +4 -1
- package/dist/cjs/client/components/analyticsPortlet/usePortletDeadMembers.d.ts +24 -0
- package/dist/cjs/client/components/analyticsPortlet/usePortletPagination.d.ts +21 -0
- package/dist/cjs/client/components/charts/DotStripChart.config.d.ts +15 -0
- package/dist/cjs/client/components/charts/DotStripChart.d.ts +4 -0
- package/dist/cjs/client/components/charts/DotStripChart.helpers.d.ts +91 -0
- package/dist/cjs/client/components/charts/RecordsTable.config.d.ts +10 -0
- package/dist/cjs/client/components/charts/RecordsTable.d.ts +4 -0
- package/dist/cjs/client/components/charts/recordsTableHooks.d.ts +68 -0
- package/dist/cjs/client/icons/types.d.ts +2 -0
- package/dist/cjs/client/index.d.ts +2 -2
- package/dist/cjs/client/types.d.ts +97 -1
- package/dist/cjs/client/utils/recordsTableUtils.d.ts +71 -0
- package/dist/cjs/client/utils/rowLinkUtils.d.ts +35 -0
- package/dist/cjs/server/agent/chart-validation.d.ts +1 -1
- package/dist/cjs/server/ai/chart-schema.d.ts +117 -0
- package/dist/cjs/server/ai/discovery-helpers.d.ts +14 -0
- package/dist/cjs/server/ai/discovery.d.ts +6 -0
- package/dist/cjs/server/ai/query-schema.d.ts +1 -1
- package/dist/cjs/server/attribute-dimensions.d.ts +11 -8
- package/dist/cjs/server/builders/group-by-builder.d.ts +15 -0
- package/dist/cjs/server/compiler.d.ts +3 -4
- package/dist/cjs/server/executor.d.ts +15 -0
- package/dist/cjs/server/index.d.ts +2 -0
- package/dist/cjs/server/query-handlers.d.ts +1 -0
- package/dist/cjs/server/query-validator.d.ts +36 -4
- package/dist/cjs/server/types/core.d.ts +5 -0
- package/dist/cjs/server/types/cube.d.ts +12 -0
- package/dist/cjs/server/types/query.d.ts +8 -0
- package/dist/cli/index.cjs +134 -52
- package/dist/client/charts/chartConfigRegistry.d.ts +7 -0
- package/dist/client/charts/chartConfigs.d.ts +17 -1
- package/dist/client/charts.js +13 -13
- package/dist/client/chunks/{DashboardEditModal-9An5EDAz.js → DashboardEditModal-BliiIHcI.js} +1653 -1188
- package/dist/client/chunks/DashboardEditModal-BliiIHcI.js.map +1 -0
- package/dist/client/chunks/DotStripChart-ChwsVeRU.js +408 -0
- package/dist/client/chunks/DotStripChart-ChwsVeRU.js.map +1 -0
- package/dist/client/chunks/{ProportionBarChart-BVcbGY2C.js → ProportionBarChart-D-Qt9nkF.js} +3 -3
- package/dist/client/chunks/{ProportionBarChart-BVcbGY2C.js.map → ProportionBarChart-D-Qt9nkF.js.map} +1 -1
- package/dist/client/chunks/RecordsTable-aG-QYXOH.js +556 -0
- package/dist/client/chunks/RecordsTable-aG-QYXOH.js.map +1 -0
- package/dist/client/chunks/{RetentionCombinedChart-D68Rvdi-.js → RetentionCombinedChart-BRZ9w7ah.js} +3 -3
- package/dist/client/chunks/{RetentionCombinedChart-D68Rvdi-.js.map → RetentionCombinedChart-BRZ9w7ah.js.map} +1 -1
- package/dist/client/chunks/{RetentionHeatmap-CE7BAjrB.js → RetentionHeatmap-LkTt89pK.js} +2 -2
- package/dist/client/chunks/{RetentionHeatmap-CE7BAjrB.js.map → RetentionHeatmap-LkTt89pK.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-D1pYvvwc.js → analysis-builder-C0gJ3kDD.js} +169 -168
- package/dist/client/chunks/{analysis-builder-D1pYvvwc.js.map → analysis-builder-C0gJ3kDD.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-shared-BQvwUc6z.js → analysis-builder-shared-dqcpl_WL.js} +965 -954
- package/dist/client/chunks/analysis-builder-shared-dqcpl_WL.js.map +1 -0
- package/dist/client/chunks/{chart-activity-grid-DvD_4wJz.js → chart-activity-grid-CJzxC18G.js} +175 -84
- package/dist/client/chunks/chart-activity-grid-CJzxC18G.js.map +1 -0
- package/dist/client/chunks/{chart-area-DPp3hSOK.js → chart-area-C66dgy84.js} +21 -21
- package/dist/client/chunks/{chart-area-DPp3hSOK.js.map → chart-area-C66dgy84.js.map} +1 -1
- package/dist/client/chunks/{chart-bar-Od3pOyZ0.js → chart-bar-D9kiSOCT.js} +5 -5
- package/dist/client/chunks/{chart-bar-Od3pOyZ0.js.map → chart-bar-D9kiSOCT.js.map} +1 -1
- package/dist/client/chunks/{chart-box-plot-l0iFn2n2.js → chart-box-plot-FsLIMisc.js} +2 -2
- package/dist/client/chunks/{chart-box-plot-l0iFn2n2.js.map → chart-box-plot-FsLIMisc.js.map} +1 -1
- package/dist/client/chunks/{chart-bubble-Dl0RcP8N.js → chart-bubble-BzyvrqKs.js} +2 -2
- package/dist/client/chunks/{chart-bubble-Dl0RcP8N.js.map → chart-bubble-BzyvrqKs.js.map} +1 -1
- package/dist/client/chunks/{chart-candlestick-DZMqbscF.js → chart-candlestick-6lD35bLw.js} +2 -2
- package/dist/client/chunks/{chart-candlestick-DZMqbscF.js.map → chart-candlestick-6lD35bLw.js.map} +1 -1
- package/dist/client/chunks/{chart-data-table-DgiNBOWf.js → chart-data-table-Cou9qOab.js} +1222 -1029
- package/dist/client/chunks/chart-data-table-Cou9qOab.js.map +1 -0
- package/dist/client/chunks/{chart-funnel-YLZlyN1X.js → chart-funnel-B0775aaT.js} +2 -2
- package/dist/client/chunks/{chart-funnel-YLZlyN1X.js.map → chart-funnel-B0775aaT.js.map} +1 -1
- package/dist/client/chunks/{chart-gauge-BsqE2wwF.js → chart-gauge-pf-2E8w9.js} +3 -3
- package/dist/client/chunks/{chart-gauge-BsqE2wwF.js.map → chart-gauge-pf-2E8w9.js.map} +1 -1
- package/dist/client/chunks/{chart-heat-map-BsND8RM_.js → chart-heat-map-EzVGe6fl.js} +3 -3
- package/dist/client/chunks/{chart-heat-map-BsND8RM_.js.map → chart-heat-map-EzVGe6fl.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-delta-m0azuva-.js → chart-kpi-delta-lfskDdx4.js} +3 -3
- package/dist/client/chunks/{chart-kpi-delta-m0azuva-.js.map → chart-kpi-delta-lfskDdx4.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-number-6JS15SqF.js → chart-kpi-number-BnsofbTf.js} +5 -5
- package/dist/client/chunks/{chart-kpi-number-6JS15SqF.js.map → chart-kpi-number-BnsofbTf.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-text-BqX8p8Jn.js → chart-kpi-text-U5EdmdkV.js} +3 -3
- package/dist/client/chunks/{chart-kpi-text-BqX8p8Jn.js.map → chart-kpi-text-U5EdmdkV.js.map} +1 -1
- package/dist/client/chunks/{chart-line-NCmpxBfE.js → chart-line-IwXqPY80.js} +3 -3
- package/dist/client/chunks/{chart-line-NCmpxBfE.js.map → chart-line-IwXqPY80.js.map} +1 -1
- package/dist/client/chunks/{chart-markdown-ZOobqiiX.js → chart-markdown-yxN_xBP9.js} +2 -2
- package/dist/client/chunks/{chart-markdown-ZOobqiiX.js.map → chart-markdown-yxN_xBP9.js.map} +1 -1
- package/dist/client/chunks/{chart-measure-profile-CBAZaicJ.js → chart-measure-profile-Bs4vhBJQ.js} +3 -3
- package/dist/client/chunks/{chart-measure-profile-CBAZaicJ.js.map → chart-measure-profile-Bs4vhBJQ.js.map} +1 -1
- package/dist/client/chunks/{chart-pie-ChrasEI8.js → chart-pie-LDJfDXfX.js} +15 -15
- package/dist/client/chunks/{chart-pie-ChrasEI8.js.map → chart-pie-LDJfDXfX.js.map} +1 -1
- package/dist/client/chunks/{chart-radar-CxSVF7yL.js → chart-radar-BZY6TP9m.js} +13 -13
- package/dist/client/chunks/{chart-radar-CxSVF7yL.js.map → chart-radar-BZY6TP9m.js.map} +1 -1
- package/dist/client/chunks/{chart-radial-bar--SN0Wph0.js → chart-radial-bar-aga05X7h.js} +3 -3
- package/dist/client/chunks/{chart-radial-bar--SN0Wph0.js.map → chart-radial-bar-aga05X7h.js.map} +1 -1
- package/dist/client/chunks/{chart-sankey-CDOSGg9r.js → chart-sankey-MRCoWFd4.js} +2 -2
- package/dist/client/chunks/{chart-sankey-CDOSGg9r.js.map → chart-sankey-MRCoWFd4.js.map} +1 -1
- package/dist/client/chunks/{chart-scatter-DgcEF-kI.js → chart-scatter-DP-nn9hH.js} +3 -3
- package/dist/client/chunks/{chart-scatter-DgcEF-kI.js.map → chart-scatter-DP-nn9hH.js.map} +1 -1
- package/dist/client/chunks/{chart-sunburst-MB-jlGBm.js → chart-sunburst-DE4EX7zi.js} +3 -3
- package/dist/client/chunks/{chart-sunburst-MB-jlGBm.js.map → chart-sunburst-DE4EX7zi.js.map} +1 -1
- package/dist/client/chunks/{chart-tree-map-DeDXveVd.js → chart-tree-map-C3O6uQcP.js} +3 -3
- package/dist/client/chunks/{chart-tree-map-DeDXveVd.js.map → chart-tree-map-C3O6uQcP.js.map} +1 -1
- package/dist/client/chunks/{chart-waterfall-ur4vkO1j.js → chart-waterfall-DU2Fg_7P.js} +3 -3
- package/dist/client/chunks/{chart-waterfall-ur4vkO1j.js.map → chart-waterfall-DU2Fg_7P.js.map} +1 -1
- package/dist/client/chunks/charts-core-DnirPG1F.js +190 -0
- package/dist/client/chunks/charts-core-DnirPG1F.js.map +1 -0
- package/dist/client/chunks/charts-loader-tCSbqT7H.js +87 -0
- package/dist/client/chunks/charts-loader-tCSbqT7H.js.map +1 -0
- package/dist/client/chunks/{en-US-BE6VoG0o.js → en-US-HP6FHuNy.js} +3 -1
- package/dist/client/chunks/{en-US-BE6VoG0o.js.map → en-US-HP6FHuNy.js.map} +1 -1
- package/dist/client/chunks/{nl-NL-CMXHDBr0.js → nl-NL-B9VnaVAm.js} +89 -1
- package/dist/client/chunks/nl-NL-B9VnaVAm.js.map +1 -0
- package/dist/client/chunks/{schema-visualization-BEbFtUIL.js → schema-visualization-o1zzuMQy.js} +3 -3
- package/dist/client/chunks/{schema-visualization-BEbFtUIL.js.map → schema-visualization-o1zzuMQy.js.map} +1 -1
- package/dist/client/chunks/{useDirtyStateTracking-CSDg96Rw.js → useDirtyStateTracking-DTYbmRBn.js} +15 -15
- package/dist/client/chunks/{useDirtyStateTracking-CSDg96Rw.js.map → useDirtyStateTracking-DTYbmRBn.js.map} +1 -1
- package/dist/client/chunks/{useExplainAI-BnkoZ-zS.js → useExplainAI-MuC9jBn-.js} +16 -16
- package/dist/client/chunks/{useExplainAI-BnkoZ-zS.js.map → useExplainAI-MuC9jBn-.js.map} +1 -1
- package/dist/client/chunks/{vendor-BmJDaduD.js → vendor-XQT9APIq.js} +49 -49
- package/dist/client/chunks/{vendor-BmJDaduD.js.map → vendor-XQT9APIq.js.map} +1 -1
- package/dist/client/client/CubeClient.d.ts +11 -1
- package/dist/client/components/AnalysisBuilder/AnalysisDisplayConfigPanel.d.ts +4 -2
- package/dist/client/components/AnalysisBuilder/ColumnFormatsEditor.d.ts +10 -0
- package/dist/client/components/AnalysisBuilder/DisplayOptionControl.d.ts +3 -2
- package/dist/client/components/AnalysisBuilder/utils/queryUtils.d.ts +7 -1
- package/dist/client/components/analyticsPortlet/PortletChart.d.ts +2 -1
- package/dist/client/components/analyticsPortlet/PortletChartView.d.ts +4 -1
- package/dist/client/components/analyticsPortlet/usePortletDeadMembers.d.ts +24 -0
- package/dist/client/components/analyticsPortlet/usePortletPagination.d.ts +21 -0
- package/dist/client/components/charts/DotStripChart.config.d.ts +15 -0
- package/dist/client/components/charts/DotStripChart.d.ts +4 -0
- package/dist/client/components/charts/DotStripChart.helpers.d.ts +91 -0
- package/dist/client/components/charts/RecordsTable.config.d.ts +10 -0
- package/dist/client/components/charts/RecordsTable.d.ts +4 -0
- package/dist/client/components/charts/recordsTableHooks.d.ts +68 -0
- package/dist/client/components.js +1 -1
- package/dist/client/hooks.js +3 -3
- package/dist/client/icons/types.d.ts +2 -0
- package/dist/client/icons.js +2 -2
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.js +213 -213
- package/dist/client/providers.js +1 -1
- package/dist/client/schema.js +1 -1
- package/dist/client/styles.css +1 -1
- package/dist/client/types.d.ts +97 -1
- package/dist/client/utils/recordsTableUtils.d.ts +71 -0
- package/dist/client/utils/rowLinkUtils.d.ts +35 -0
- package/dist/client/utils.js +14 -14
- package/dist/client-bundle-stats.html +1 -1
- package/dist/mcp-app/mcp-app.html +101 -101
- package/dist/server/agent/chart-validation.d.ts +1 -1
- package/dist/server/ai/chart-schema.d.ts +117 -0
- package/dist/server/ai/discovery-helpers.d.ts +14 -0
- package/dist/server/ai/discovery.d.ts +6 -0
- package/dist/server/ai/query-schema.d.ts +1 -1
- package/dist/server/attribute-dimensions.d.ts +11 -8
- package/dist/server/builders/group-by-builder.d.ts +15 -0
- package/dist/server/compiler.d.ts +3 -4
- package/dist/server/executor.d.ts +15 -0
- package/dist/{adapters/google-eKAc20al.js → server/google-DRY7jnOh.js} +46 -28
- package/dist/server/{google-BhvizbFR.cjs → google-PsZzwedr.cjs} +2 -2
- package/dist/server/index.cjs +34 -34
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.js +1913 -1445
- package/dist/server/query-handlers.d.ts +1 -0
- package/dist/server/query-validator.d.ts +36 -4
- package/dist/server/types/core.d.ts +5 -0
- package/dist/server/types/cube.d.ts +12 -0
- package/dist/server/types/query.d.ts +8 -0
- package/package.json +1 -1
- package/dist/adapters/ActivityGridChart.config-BQhBE_Mr.js +0 -2
- package/dist/adapters/ActivityGridChart.config-C3tSuOGV.cjs +0 -1
- package/dist/adapters/AreaChart.config-3cme8HyQ.js +0 -2
- package/dist/adapters/AreaChart.config-BSxrT52Z.cjs +0 -1
- package/dist/adapters/BarChart.config-BKS8IecE.cjs +0 -1
- package/dist/adapters/BarChart.config-lt_7PdIi.js +0 -2
- package/dist/adapters/BoxPlotChart.config-B7qvRnrF.cjs +0 -1
- package/dist/adapters/BoxPlotChart.config-Dv6ECj2j.js +0 -2
- package/dist/adapters/BubbleChart.config-BrIH7OAy.cjs +0 -1
- package/dist/adapters/BubbleChart.config-Fhotb7Pg.js +0 -2
- package/dist/adapters/CandlestickChart.config-CWH41FmF.cjs +0 -1
- package/dist/adapters/CandlestickChart.config-RPtXuxsX.js +0 -2
- package/dist/adapters/DataTable.config-71L0GzlT.js +0 -2
- package/dist/adapters/DataTable.config-BsOMQq3J.cjs +0 -1
- package/dist/adapters/FunnelChart.config-Cqte9C04.cjs +0 -1
- package/dist/adapters/FunnelChart.config-DJtwWeNz.js +0 -2
- package/dist/adapters/GaugeChart.config-WkwZ9VdS.cjs +0 -1
- package/dist/adapters/GaugeChart.config-vpVQlP5B.js +0 -2
- package/dist/adapters/HeatMapChart.config-DcmkDl07.cjs +0 -1
- package/dist/adapters/HeatMapChart.config-DsmMgGxJ.js +0 -2
- package/dist/adapters/KpiDelta.config-DVy561BH.js +0 -2
- package/dist/adapters/KpiDelta.config-dpqwLHNE.cjs +0 -1
- package/dist/adapters/KpiNumber.config-927l8nq8.js +0 -2
- package/dist/adapters/KpiNumber.config-BqFBMfPf.cjs +0 -1
- package/dist/adapters/KpiText.config-C-fZXuHq.cjs +0 -1
- package/dist/adapters/KpiText.config-CWoXuhMA.js +0 -2
- package/dist/adapters/LineChart.config-DTp7pqOY.js +0 -2
- package/dist/adapters/LineChart.config-DUGvSjcH.cjs +0 -1
- package/dist/adapters/MarkdownChart.config-23Dmv2Ty.cjs +0 -1
- package/dist/adapters/MarkdownChart.config-Cb2TnS0I.js +0 -2
- package/dist/adapters/MeasureProfileChart.config-B2qbWdhy.cjs +0 -1
- package/dist/adapters/MeasureProfileChart.config-CvBCeI5b.js +0 -2
- package/dist/adapters/PieChart.config-BzJb13QA.js +0 -2
- package/dist/adapters/PieChart.config-plCn5Ehr.cjs +0 -1
- package/dist/adapters/ProportionBarChart.config-1r-_moBH.cjs +0 -1
- package/dist/adapters/ProportionBarChart.config-CN6TtHTp.js +0 -2
- package/dist/adapters/RadarChart.config-BYhdj9M7.js +0 -2
- package/dist/adapters/RadarChart.config-CeUMP-1g.cjs +0 -1
- package/dist/adapters/RadialBarChart.config-B88yXNsq.cjs +0 -1
- package/dist/adapters/RadialBarChart.config-ZMK9HMoh.js +0 -2
- package/dist/adapters/RetentionCombinedChart.config-B5yvgUHM.cjs +0 -1
- package/dist/adapters/RetentionCombinedChart.config-Dd-YMdK8.js +0 -2
- package/dist/adapters/RetentionHeatmap.config-BYzDleoV.cjs +0 -1
- package/dist/adapters/RetentionHeatmap.config-Dvj7yTB0.js +0 -2
- package/dist/adapters/SankeyChart.config-CPFRmgFb.cjs +0 -1
- package/dist/adapters/SankeyChart.config-ClgqXM1N.js +0 -2
- package/dist/adapters/ScatterChart.config-CvJiqPa5.cjs +0 -1
- package/dist/adapters/ScatterChart.config-DLZ3rYMq.js +0 -2
- package/dist/adapters/SunburstChart.config-C_1V5hoQ.cjs +0 -1
- package/dist/adapters/SunburstChart.config-FNU75NCg.js +0 -2
- package/dist/adapters/TreeMapChart.config-CprZk_YF.js +0 -2
- package/dist/adapters/TreeMapChart.config-DNwd0ge9.cjs +0 -1
- package/dist/adapters/WaterfallChart.config-BBhcN_Fh.cjs +0 -1
- package/dist/adapters/WaterfallChart.config-H7s6SSV3.js +0 -2
- package/dist/adapters/compiler-BaLO10VN.cjs +0 -166
- package/dist/adapters/handler-DrRT6c14.cjs +0 -25
- package/dist/adapters/mcp-transport-BGkSz-ZT.cjs +0 -40
- package/dist/adapters/mcp-transport-fJud19xz.js +0 -606
- package/dist/adapters/utils-BY0-KFyI.cjs +0 -128
- package/dist/client/chunks/DashboardEditModal-9An5EDAz.js.map +0 -1
- package/dist/client/chunks/analysis-builder-shared-BQvwUc6z.js.map +0 -1
- package/dist/client/chunks/chart-activity-grid-DvD_4wJz.js.map +0 -1
- package/dist/client/chunks/chart-data-table-DgiNBOWf.js.map +0 -1
- package/dist/client/chunks/charts-core-BAH5pkSB.js +0 -215
- package/dist/client/chunks/charts-core-BAH5pkSB.js.map +0 -1
- package/dist/client/chunks/charts-loader-eToV8je7.js +0 -85
- package/dist/client/chunks/charts-loader-eToV8je7.js.map +0 -1
- package/dist/client/chunks/nl-NL-CMXHDBr0.js.map +0 -1
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
import { i as e, y as t } from "./chart-data-table-Cou9qOab.js";
|
|
2
|
+
import { B as n, E as r, F as i, w as a } from "./chart-activity-grid-CJzxC18G.js";
|
|
3
|
+
import { O as o } from "./chart-area-C66dgy84.js";
|
|
4
|
+
import s, { useCallback as c, useEffect as l, useMemo as u, useRef as d, useState as f } from "react";
|
|
5
|
+
import { jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
6
|
+
//#region src/client/utils/rowLinkUtils.ts
|
|
7
|
+
var h = /\{([A-Za-z0-9_]+\.[A-Za-z0-9_]+)\}/g, g = /* @__PURE__ */ new Set(["http:", "https:"]);
|
|
8
|
+
function _(e, t, n = y()) {
|
|
9
|
+
if (!e) return null;
|
|
10
|
+
let r = !1, i = e.replace(h, (e, n) => {
|
|
11
|
+
let i = t[n];
|
|
12
|
+
return i == null ? (r = !0, "") : encodeURIComponent(String(i));
|
|
13
|
+
});
|
|
14
|
+
return r ? null : v(i, n) ? i : null;
|
|
15
|
+
}
|
|
16
|
+
function v(e, t = y()) {
|
|
17
|
+
let n = e.trim();
|
|
18
|
+
if (n === "" || /[\u0000-\u001F\u007F]/.test(n) || n.includes("\\") || n.startsWith("//")) return !1;
|
|
19
|
+
try {
|
|
20
|
+
let e = new URL(n, t);
|
|
21
|
+
return !(!g.has(e.protocol) || !/^[A-Za-z][A-Za-z0-9+.-]*:/.test(n) && e.origin !== new URL(t).origin);
|
|
22
|
+
} catch {
|
|
23
|
+
return !1;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function y() {
|
|
27
|
+
return typeof window < "u" && window.location?.origin ? window.location.origin : "http://localhost";
|
|
28
|
+
}
|
|
29
|
+
//#endregion
|
|
30
|
+
//#region src/client/utils/recordsTableUtils.ts
|
|
31
|
+
var b = "dc-records-table-column-widths", x = "dc-records-table-column-order";
|
|
32
|
+
function S(e) {
|
|
33
|
+
return [...e].sort().join("|");
|
|
34
|
+
}
|
|
35
|
+
function C(e) {
|
|
36
|
+
try {
|
|
37
|
+
let t = localStorage.getItem(b);
|
|
38
|
+
return t ? JSON.parse(t)[e] ?? {} : {};
|
|
39
|
+
} catch {
|
|
40
|
+
return {};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function w(e, t) {
|
|
44
|
+
try {
|
|
45
|
+
let n = localStorage.getItem(b), r = n ? JSON.parse(n) : {};
|
|
46
|
+
r[e] = t, localStorage.setItem(b, JSON.stringify(r));
|
|
47
|
+
} catch {}
|
|
48
|
+
}
|
|
49
|
+
function T(e) {
|
|
50
|
+
try {
|
|
51
|
+
let t = localStorage.getItem(x);
|
|
52
|
+
if (!t) return [];
|
|
53
|
+
let n = JSON.parse(t)[e];
|
|
54
|
+
return Array.isArray(n) ? n : [];
|
|
55
|
+
} catch {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function E(e, t) {
|
|
60
|
+
try {
|
|
61
|
+
let n = localStorage.getItem(x), r = n ? JSON.parse(n) : {};
|
|
62
|
+
r[e] = t, localStorage.setItem(x, JSON.stringify(r));
|
|
63
|
+
} catch {}
|
|
64
|
+
}
|
|
65
|
+
function D(e, t) {
|
|
66
|
+
if (t.length === 0) return e;
|
|
67
|
+
let n = new Set(e), r = t.filter((e) => n.has(e)), i = e.filter((e) => !r.includes(e));
|
|
68
|
+
return [...r, ...i];
|
|
69
|
+
}
|
|
70
|
+
function O(e, t, n) {
|
|
71
|
+
let r = e.indexOf(t), i = e.indexOf(n);
|
|
72
|
+
if (r === -1 || i === -1 || r === i) return e;
|
|
73
|
+
let a = [...e];
|
|
74
|
+
return a.splice(r, 1), a.splice(i, 0, t), a;
|
|
75
|
+
}
|
|
76
|
+
var k = {
|
|
77
|
+
kind: "text",
|
|
78
|
+
text: ""
|
|
79
|
+
};
|
|
80
|
+
function A(e, t) {
|
|
81
|
+
return W(e) ? k : (j[t?.kind ?? "text"] ?? M)(e, t);
|
|
82
|
+
}
|
|
83
|
+
var j = {
|
|
84
|
+
text: M,
|
|
85
|
+
number: N,
|
|
86
|
+
date: P,
|
|
87
|
+
badge: I,
|
|
88
|
+
progress: R
|
|
89
|
+
};
|
|
90
|
+
function M(e) {
|
|
91
|
+
return {
|
|
92
|
+
kind: "text",
|
|
93
|
+
text: B(e)
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function N(e, t) {
|
|
97
|
+
let n = V(e);
|
|
98
|
+
return n === null ? {
|
|
99
|
+
kind: "text",
|
|
100
|
+
text: String(e)
|
|
101
|
+
} : {
|
|
102
|
+
kind: "text",
|
|
103
|
+
text: a(n, t?.numberFormat ?? {})
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function P(e, t) {
|
|
107
|
+
return {
|
|
108
|
+
kind: "text",
|
|
109
|
+
text: r(e, t?.dateGranularity)
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function F(e) {
|
|
113
|
+
return Array.isArray(e?.badgeColors) ? e.badgeColors.filter((e) => e && typeof e.colorIndex == "number") : [];
|
|
114
|
+
}
|
|
115
|
+
function I(e, t) {
|
|
116
|
+
let n = B(e);
|
|
117
|
+
return {
|
|
118
|
+
kind: "badge",
|
|
119
|
+
text: n,
|
|
120
|
+
colorIndex: F(t)?.find((e) => e.value === n)?.colorIndex
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
var L = {
|
|
124
|
+
unit: "number",
|
|
125
|
+
abbreviate: !1,
|
|
126
|
+
decimals: 0
|
|
127
|
+
};
|
|
128
|
+
function R(e, t) {
|
|
129
|
+
let n = V(e);
|
|
130
|
+
return n === null ? {
|
|
131
|
+
kind: "text",
|
|
132
|
+
text: String(e)
|
|
133
|
+
} : {
|
|
134
|
+
kind: "progress",
|
|
135
|
+
fraction: z(n, t),
|
|
136
|
+
style: t?.progressStyle ?? "bar",
|
|
137
|
+
text: a(n, t?.numberFormat ?? L)
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function z(e, t) {
|
|
141
|
+
let n = t?.progressMin ?? 0, r = (t?.progressMax ?? 100) - n;
|
|
142
|
+
return r === 0 ? 1 : H((e - n) / r, 0, 1);
|
|
143
|
+
}
|
|
144
|
+
function B(e) {
|
|
145
|
+
return typeof e == "boolean" ? e ? "true" : "false" : typeof e == "number" ? e.toLocaleString() : e instanceof Date ? e.toISOString() : String(e);
|
|
146
|
+
}
|
|
147
|
+
function V(e) {
|
|
148
|
+
if (typeof e == "number") return Number.isFinite(e) ? e : null;
|
|
149
|
+
if (typeof e == "string" && e.trim() !== "") {
|
|
150
|
+
let t = Number(e);
|
|
151
|
+
return Number.isFinite(t) ? t : null;
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
function H(e, t, n) {
|
|
156
|
+
return Math.min(n, Math.max(t, e));
|
|
157
|
+
}
|
|
158
|
+
function U(e, t, n) {
|
|
159
|
+
let r = n === "asc" ? 1 : -1;
|
|
160
|
+
return [...e].sort((e, n) => {
|
|
161
|
+
let i = W(e[t]), a = W(n[t]);
|
|
162
|
+
return i || a ? i && a ? 0 : i ? 1 : -1 : r * G(e[t], n[t]);
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
function W(e) {
|
|
166
|
+
return e == null || e === "";
|
|
167
|
+
}
|
|
168
|
+
function G(e, t) {
|
|
169
|
+
let n = V(e), r = V(t);
|
|
170
|
+
return n !== null && r !== null ? n - r : String(e).localeCompare(String(t));
|
|
171
|
+
}
|
|
172
|
+
function ee(e) {
|
|
173
|
+
let { rows: t, chartConfig: n, queryObject: r } = e, i = u(() => K(t, n, r), [
|
|
174
|
+
t,
|
|
175
|
+
n,
|
|
176
|
+
r
|
|
177
|
+
]), a = u(() => S(i), [i]), [o, s] = f([]);
|
|
178
|
+
l(() => {
|
|
179
|
+
s(T(a));
|
|
180
|
+
}, [a]);
|
|
181
|
+
let p = u(() => D(i, o), [i, o]), [m, h] = f(null), g = d(!1), _ = c((e) => {
|
|
182
|
+
g.current = !0, h(e);
|
|
183
|
+
}, []), v = c(() => {
|
|
184
|
+
h(null), requestAnimationFrame(() => {
|
|
185
|
+
g.current = !1;
|
|
186
|
+
});
|
|
187
|
+
}, []);
|
|
188
|
+
return {
|
|
189
|
+
columns: p,
|
|
190
|
+
storageKey: a,
|
|
191
|
+
draggedColumn: m,
|
|
192
|
+
didDragRef: g,
|
|
193
|
+
startColumnDrag: _,
|
|
194
|
+
endColumnDrag: v,
|
|
195
|
+
dropColumn: c((e) => {
|
|
196
|
+
let t = m;
|
|
197
|
+
if (v(), !t || t === e) return;
|
|
198
|
+
let n = O(p, t, e);
|
|
199
|
+
s(n), E(a, n);
|
|
200
|
+
}, [
|
|
201
|
+
p,
|
|
202
|
+
m,
|
|
203
|
+
v,
|
|
204
|
+
a
|
|
205
|
+
])
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
function K(t, n, r) {
|
|
209
|
+
let i = Object.keys(t[0] ?? {}), a = new Set(n?.hiddenColumns ?? []), o = n?.columns?.filter((e) => i.includes(e));
|
|
210
|
+
if (o && o.length > 0) return o.filter((e) => !a.has(e));
|
|
211
|
+
let s = e(r).filter((e) => i.includes(e));
|
|
212
|
+
return (s.length > 0 ? [...s, ...i.filter((e) => !s.includes(e))] : i).filter((e) => !a.has(e));
|
|
213
|
+
}
|
|
214
|
+
function te(e) {
|
|
215
|
+
let { columns: t, storageKey: n, authored: r } = e, [i, a] = f({}), o = d(null), s = d(!1);
|
|
216
|
+
l(() => {
|
|
217
|
+
a({
|
|
218
|
+
...r ?? {},
|
|
219
|
+
...C(n)
|
|
220
|
+
});
|
|
221
|
+
}, [n, r]);
|
|
222
|
+
let u = c((e, r) => {
|
|
223
|
+
e.preventDefault(), e.stopPropagation();
|
|
224
|
+
let i = e.clientX;
|
|
225
|
+
s.current = !1;
|
|
226
|
+
let c = {};
|
|
227
|
+
o.current?.querySelectorAll("thead th").forEach((e, n) => {
|
|
228
|
+
let r = t[n];
|
|
229
|
+
r && (c[r] = e.getBoundingClientRect().width);
|
|
230
|
+
});
|
|
231
|
+
let l = c[r] ?? 160, u = c, d = (e) => {
|
|
232
|
+
let t = e.clientX - i;
|
|
233
|
+
Math.abs(t) > 2 && (s.current = !0), u = {
|
|
234
|
+
...u,
|
|
235
|
+
[r]: Math.max(60, l + t)
|
|
236
|
+
}, a(u);
|
|
237
|
+
}, f = () => {
|
|
238
|
+
document.removeEventListener("mousemove", d), document.removeEventListener("mouseup", f), document.body.style.cursor = "", document.body.style.userSelect = "", w(n, u), requestAnimationFrame(() => {
|
|
239
|
+
s.current = !1;
|
|
240
|
+
});
|
|
241
|
+
};
|
|
242
|
+
document.addEventListener("mousemove", d), document.addEventListener("mouseup", f), document.body.style.cursor = "col-resize", document.body.style.userSelect = "none";
|
|
243
|
+
}, [t, n]);
|
|
244
|
+
return {
|
|
245
|
+
columnWidths: i,
|
|
246
|
+
totalWidth: Object.keys(i).length > 0 ? t.reduce((e, t) => e + (i[t] ?? 160), 0) : void 0,
|
|
247
|
+
tableRef: o,
|
|
248
|
+
didResizeRef: s,
|
|
249
|
+
startResize: u
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
function ne(e) {
|
|
253
|
+
let { rows: t, pagination: n, authoredPageSize: r } = e, [i, a] = f(null), [o, s] = f(0), d = !!n, p = n ? n.sort ?? null : i, m = c((e) => {
|
|
254
|
+
if (n) {
|
|
255
|
+
n.toggleSort(e);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
a((t) => t?.column === e ? t.direction === "asc" ? {
|
|
259
|
+
column: e,
|
|
260
|
+
direction: "desc"
|
|
261
|
+
} : null : {
|
|
262
|
+
column: e,
|
|
263
|
+
direction: "asc"
|
|
264
|
+
});
|
|
265
|
+
}, [n]), h = u(() => !d && i ? U(t, i.column, i.direction) : t, [
|
|
266
|
+
t,
|
|
267
|
+
d,
|
|
268
|
+
i
|
|
269
|
+
]), g = n?.pageSize ?? r ?? 25, _ = n?.page ?? o, v = d ? n?.total ?? _ * g + h.length : h.length, y = Math.max(1, Math.ceil(v / g)), b = c((e) => {
|
|
270
|
+
n ? n.setPage(e) : s(e);
|
|
271
|
+
}, [n]);
|
|
272
|
+
return l(() => {
|
|
273
|
+
d || s((e) => Math.min(e, y - 1));
|
|
274
|
+
}, [y, d]), {
|
|
275
|
+
sort: p,
|
|
276
|
+
toggleSort: m,
|
|
277
|
+
visibleRows: u(() => d ? h : h.slice(_ * g, _ * g + g), [
|
|
278
|
+
h,
|
|
279
|
+
d,
|
|
280
|
+
_,
|
|
281
|
+
g
|
|
282
|
+
]),
|
|
283
|
+
page: _,
|
|
284
|
+
pageSize: g,
|
|
285
|
+
pageCount: y,
|
|
286
|
+
rowCount: v,
|
|
287
|
+
goToPage: b,
|
|
288
|
+
showPager: v > g
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
//#endregion
|
|
292
|
+
//#region src/client/components/charts/RecordsTable.tsx
|
|
293
|
+
var q = t("chevronUp"), re = t("chevronDown"), ie = s.memo(function({ data: e, chartConfig: t, displayConfig: r = {}, queryObject: a, colorPalette: s, height: l = 300, onDataPointClick: d, drillEnabled: f, pagination: h }) {
|
|
294
|
+
let { t: g } = i(), { getFieldLabel: v } = n(), y = u(() => Array.isArray(e) ? e : [], [e]), b = r.columnFormats ?? {}, { columns: x, storageKey: S, draggedColumn: C, didDragRef: w, startColumnDrag: T, endColumnDrag: E, dropColumn: D } = ee({
|
|
295
|
+
rows: y,
|
|
296
|
+
chartConfig: t,
|
|
297
|
+
queryObject: a
|
|
298
|
+
}), { columnWidths: O, totalWidth: k, tableRef: A, didResizeRef: j, startResize: M } = te({
|
|
299
|
+
columns: x,
|
|
300
|
+
storageKey: S,
|
|
301
|
+
authored: r.columnWidths
|
|
302
|
+
}), { sort: N, toggleSort: P, visibleRows: F, page: I, pageSize: L, pageCount: R, rowCount: z, goToPage: B, showPager: V } = ne({
|
|
303
|
+
rows: y,
|
|
304
|
+
pagination: h,
|
|
305
|
+
authoredPageSize: r.pageSize
|
|
306
|
+
}), H = c((e) => {
|
|
307
|
+
j.current || w.current || P(e);
|
|
308
|
+
}, [
|
|
309
|
+
w,
|
|
310
|
+
j,
|
|
311
|
+
P
|
|
312
|
+
]), U = r.rowLink, W = !!(!U && f && d), G = c((e, t, n) => {
|
|
313
|
+
W && d?.({
|
|
314
|
+
dataPoint: e,
|
|
315
|
+
clickedField: t,
|
|
316
|
+
xValue: e[t],
|
|
317
|
+
position: {
|
|
318
|
+
x: n.clientX,
|
|
319
|
+
y: n.clientY
|
|
320
|
+
},
|
|
321
|
+
nativeEvent: n
|
|
322
|
+
});
|
|
323
|
+
}, [d, W]);
|
|
324
|
+
if (y.length === 0) return /* @__PURE__ */ p(o, {
|
|
325
|
+
height: l,
|
|
326
|
+
hint: g("chart.runtime.noDataHint.table")
|
|
327
|
+
});
|
|
328
|
+
if (x.length === 0) return /* @__PURE__ */ p(o, {
|
|
329
|
+
height: l,
|
|
330
|
+
titleKey: "chart.runtime.recordsTable.noColumns",
|
|
331
|
+
hint: g("chart.runtime.table.invalidStructure")
|
|
332
|
+
});
|
|
333
|
+
let K = I * L + 1, q = Math.min(z, I * L + F.length);
|
|
334
|
+
return /* @__PURE__ */ m("div", {
|
|
335
|
+
className: "dc:flex dc:flex-col dc:w-full",
|
|
336
|
+
style: { height: l },
|
|
337
|
+
children: [/* @__PURE__ */ p("div", {
|
|
338
|
+
className: "dc:flex-1 dc:overflow-auto",
|
|
339
|
+
children: /* @__PURE__ */ m("table", {
|
|
340
|
+
ref: A,
|
|
341
|
+
className: "dc:border-collapse",
|
|
342
|
+
style: {
|
|
343
|
+
tableLayout: "fixed",
|
|
344
|
+
width: k,
|
|
345
|
+
minWidth: "100%"
|
|
346
|
+
},
|
|
347
|
+
children: [
|
|
348
|
+
/* @__PURE__ */ p("colgroup", { children: x.map((e) => /* @__PURE__ */ p("col", { style: { width: O[e] ?? 160 } }, e)) }),
|
|
349
|
+
/* @__PURE__ */ p("thead", {
|
|
350
|
+
className: "bg-dc-surface-secondary dc:sticky dc:top-0 dc:z-20",
|
|
351
|
+
children: /* @__PURE__ */ p("tr", { children: x.map((e) => /* @__PURE__ */ p(ae, {
|
|
352
|
+
column: e,
|
|
353
|
+
label: b[e]?.label || v(e),
|
|
354
|
+
align: b[e]?.align ?? J(b[e]),
|
|
355
|
+
sortDirection: N?.column === e ? N.direction : void 0,
|
|
356
|
+
isDropTarget: C !== null && C !== e,
|
|
357
|
+
onClick: H,
|
|
358
|
+
onResizeStart: M,
|
|
359
|
+
onDragStart: T,
|
|
360
|
+
onDragEnd: E,
|
|
361
|
+
onDrop: D
|
|
362
|
+
}, e)) })
|
|
363
|
+
}),
|
|
364
|
+
/* @__PURE__ */ p("tbody", {
|
|
365
|
+
className: "bg-dc-surface",
|
|
366
|
+
children: F.map((e, t) => /* @__PURE__ */ p(oe, {
|
|
367
|
+
row: e,
|
|
368
|
+
columns: x,
|
|
369
|
+
columnFormats: b,
|
|
370
|
+
colorPalette: s,
|
|
371
|
+
href: U ? _(U.urlTemplate, e) : null,
|
|
372
|
+
target: U?.target,
|
|
373
|
+
clickable: W,
|
|
374
|
+
onCellClick: G
|
|
375
|
+
}, t))
|
|
376
|
+
})
|
|
377
|
+
]
|
|
378
|
+
})
|
|
379
|
+
}), V && /* @__PURE__ */ m("div", {
|
|
380
|
+
className: "dc:flex dc:items-center dc:justify-between dc:gap-2 dc:px-3 dc:py-1.5 dc:border-t border-dc-border dc:text-xs text-dc-text-secondary",
|
|
381
|
+
children: [/* @__PURE__ */ p("span", { children: g("chart.runtime.recordsTable.rowRange", {
|
|
382
|
+
from: K,
|
|
383
|
+
to: q,
|
|
384
|
+
total: z
|
|
385
|
+
}) }), /* @__PURE__ */ m("div", {
|
|
386
|
+
className: "dc:flex dc:items-center dc:gap-1",
|
|
387
|
+
children: [
|
|
388
|
+
/* @__PURE__ */ p($, {
|
|
389
|
+
label: g("chart.runtime.recordsTable.previousPage"),
|
|
390
|
+
disabled: I === 0,
|
|
391
|
+
onClick: () => B(Math.max(0, I - 1)),
|
|
392
|
+
children: "‹"
|
|
393
|
+
}),
|
|
394
|
+
/* @__PURE__ */ p("span", { children: g("chart.runtime.recordsTable.pageOf", {
|
|
395
|
+
page: I + 1,
|
|
396
|
+
pages: R
|
|
397
|
+
}) }),
|
|
398
|
+
/* @__PURE__ */ p($, {
|
|
399
|
+
label: g("chart.runtime.recordsTable.nextPage"),
|
|
400
|
+
disabled: I >= R - 1,
|
|
401
|
+
onClick: () => B(Math.min(R - 1, I + 1)),
|
|
402
|
+
children: "›"
|
|
403
|
+
})
|
|
404
|
+
]
|
|
405
|
+
})]
|
|
406
|
+
})]
|
|
407
|
+
});
|
|
408
|
+
});
|
|
409
|
+
function J(e) {
|
|
410
|
+
return e?.kind === "number" ? "right" : "left";
|
|
411
|
+
}
|
|
412
|
+
function ae({ column: e, label: t, align: n, sortDirection: r, isDropTarget: i, onClick: a, onResizeStart: o, onDragStart: s, onDragEnd: c, onDrop: l }) {
|
|
413
|
+
return /* @__PURE__ */ m("th", {
|
|
414
|
+
draggable: !0,
|
|
415
|
+
onDragStart: (t) => {
|
|
416
|
+
t.dataTransfer.setData("text/plain", e), t.dataTransfer.effectAllowed = "move", s(e);
|
|
417
|
+
},
|
|
418
|
+
onDragOver: (e) => {
|
|
419
|
+
i && e.preventDefault();
|
|
420
|
+
},
|
|
421
|
+
onDrop: (t) => {
|
|
422
|
+
t.preventDefault(), l(e);
|
|
423
|
+
},
|
|
424
|
+
onDragEnd: c,
|
|
425
|
+
onClick: () => a(e),
|
|
426
|
+
className: `dc:relative dc:px-3 dc:py-2 dc:text-xs dc:font-medium text-dc-text-muted dc:uppercase dc:tracking-wider dc:cursor-pointer dc:select-none dc:border-b border-dc-border ${n === "right" ? "dc:text-right" : "dc:text-left"}${i ? " dc:border-l-2 border-dc-accent" : ""}`,
|
|
427
|
+
children: [/* @__PURE__ */ m("div", {
|
|
428
|
+
className: `dc:flex dc:items-center dc:gap-1.5 dc:overflow-hidden${n === "right" ? " dc:justify-end" : ""}`,
|
|
429
|
+
children: [
|
|
430
|
+
/* @__PURE__ */ p("span", {
|
|
431
|
+
className: "dc:truncate",
|
|
432
|
+
children: t
|
|
433
|
+
}),
|
|
434
|
+
r === "asc" && /* @__PURE__ */ p(q, { className: "dc:w-3 dc:h-3 text-dc-accent dc:shrink-0" }),
|
|
435
|
+
r === "desc" && /* @__PURE__ */ p(re, { className: "dc:w-3 dc:h-3 text-dc-accent dc:shrink-0" })
|
|
436
|
+
]
|
|
437
|
+
}), /* @__PURE__ */ p("div", {
|
|
438
|
+
onMouseDown: (t) => o(t, e),
|
|
439
|
+
className: "dc:absolute dc:top-0 dc:right-0 dc:w-1.5 dc:h-full dc:cursor-col-resize dc:hover:bg-dc-accent dc:opacity-0 dc:hover:opacity-100 dc:transition-opacity dc:z-30"
|
|
440
|
+
})]
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
function oe({ row: e, columns: t, columnFormats: n, colorPalette: r, href: i, target: a, clickable: o, onCellClick: s }) {
|
|
444
|
+
return /* @__PURE__ */ p("tr", {
|
|
445
|
+
className: `dc:border-b border-dc-border hover:bg-dc-surface-secondary${o ? " dc:cursor-pointer" : ""}`,
|
|
446
|
+
children: t.map((t) => {
|
|
447
|
+
let o = n[t], c = o?.align ?? J(o);
|
|
448
|
+
return /* @__PURE__ */ p("td", {
|
|
449
|
+
onClick: (n) => s(e, t, n),
|
|
450
|
+
className: `dc:px-3 dc:py-1.5 dc:text-sm text-dc-text dc:overflow-hidden${c === "right" ? " dc:text-right dc:tabular-nums" : ""}`,
|
|
451
|
+
children: /* @__PURE__ */ p(se, {
|
|
452
|
+
cell: A(e[t], o),
|
|
453
|
+
colorPalette: r,
|
|
454
|
+
href: i,
|
|
455
|
+
target: a
|
|
456
|
+
})
|
|
457
|
+
}, t);
|
|
458
|
+
})
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
function se({ cell: e, colorPalette: t, href: n, target: r }) {
|
|
462
|
+
let i = /* @__PURE__ */ p(ce, {
|
|
463
|
+
cell: e,
|
|
464
|
+
colorPalette: t
|
|
465
|
+
});
|
|
466
|
+
return n ? /* @__PURE__ */ p("a", {
|
|
467
|
+
href: n,
|
|
468
|
+
target: r === "blank" ? "_blank" : void 0,
|
|
469
|
+
rel: r === "blank" ? "noopener noreferrer" : void 0,
|
|
470
|
+
className: "dc:block dc:no-underline dc:text-inherit hover:dc:underline",
|
|
471
|
+
children: i
|
|
472
|
+
}) : i;
|
|
473
|
+
}
|
|
474
|
+
function ce({ cell: e, colorPalette: t }) {
|
|
475
|
+
if (e.kind === "badge") {
|
|
476
|
+
let n = e.colorIndex === void 0 ? void 0 : t?.colors[e.colorIndex];
|
|
477
|
+
return /* @__PURE__ */ p("span", {
|
|
478
|
+
className: "dc:inline-block dc:px-2 dc:py-0.5 dc:rounded-full dc:text-xs dc:font-medium dc:truncate dc:max-w-full",
|
|
479
|
+
style: n ? {
|
|
480
|
+
backgroundColor: `${n}22`,
|
|
481
|
+
color: n,
|
|
482
|
+
border: `1px solid ${n}55`
|
|
483
|
+
} : {
|
|
484
|
+
backgroundColor: "var(--dc-surface-secondary)",
|
|
485
|
+
color: "var(--dc-text-secondary)",
|
|
486
|
+
border: "1px solid var(--dc-border)"
|
|
487
|
+
},
|
|
488
|
+
children: e.text
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
return e.kind === "progress" ? /* @__PURE__ */ m("div", {
|
|
492
|
+
className: "dc:flex dc:items-center dc:gap-2",
|
|
493
|
+
children: [e.style === "circle" ? /* @__PURE__ */ p(le, {
|
|
494
|
+
fraction: e.fraction,
|
|
495
|
+
label: e.text
|
|
496
|
+
}) : /* @__PURE__ */ p("div", {
|
|
497
|
+
className: "dc:flex-1 dc:h-2 dc:rounded-full dc:overflow-hidden dc:border border-dc-border bg-dc-surface-secondary dc:min-w-[2rem]",
|
|
498
|
+
children: /* @__PURE__ */ p("div", {
|
|
499
|
+
className: "dc:h-full dc:rounded-full bg-dc-primary",
|
|
500
|
+
style: { width: `${e.fraction * 100}%` }
|
|
501
|
+
})
|
|
502
|
+
}), /* @__PURE__ */ p("span", {
|
|
503
|
+
className: "dc:w-16 dc:shrink-0 dc:text-right dc:text-xs dc:tabular-nums dc:truncate",
|
|
504
|
+
children: e.text
|
|
505
|
+
})]
|
|
506
|
+
}) : /* @__PURE__ */ p("span", {
|
|
507
|
+
className: "dc:truncate dc:block",
|
|
508
|
+
children: e.text
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
var Y = 18, X = 3, Z = Y / 2, Q = Z - X / 2;
|
|
512
|
+
function le({ fraction: e, label: t }) {
|
|
513
|
+
return /* @__PURE__ */ m("svg", {
|
|
514
|
+
role: "img",
|
|
515
|
+
"aria-label": t,
|
|
516
|
+
width: Y,
|
|
517
|
+
height: Y,
|
|
518
|
+
viewBox: `0 0 ${Y} ${Y}`,
|
|
519
|
+
className: "dc:shrink-0",
|
|
520
|
+
children: [/* @__PURE__ */ p("circle", {
|
|
521
|
+
cx: Z,
|
|
522
|
+
cy: Z,
|
|
523
|
+
r: Q,
|
|
524
|
+
fill: "none",
|
|
525
|
+
stroke: "var(--dc-surface-secondary)",
|
|
526
|
+
strokeWidth: X
|
|
527
|
+
}), e > 0 && /* @__PURE__ */ p("circle", {
|
|
528
|
+
cx: Z,
|
|
529
|
+
cy: Z,
|
|
530
|
+
r: Q,
|
|
531
|
+
fill: "none",
|
|
532
|
+
stroke: "var(--dc-primary)",
|
|
533
|
+
strokeWidth: X,
|
|
534
|
+
strokeLinecap: "round",
|
|
535
|
+
pathLength: 100,
|
|
536
|
+
strokeDasharray: 100,
|
|
537
|
+
strokeDashoffset: 100 - e * 100,
|
|
538
|
+
transform: `rotate(-90 ${Z} ${Z})`
|
|
539
|
+
})]
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
function $({ label: e, disabled: t, onClick: n, children: r }) {
|
|
543
|
+
return /* @__PURE__ */ p("button", {
|
|
544
|
+
type: "button",
|
|
545
|
+
"aria-label": e,
|
|
546
|
+
title: e,
|
|
547
|
+
disabled: t,
|
|
548
|
+
onClick: n,
|
|
549
|
+
className: "dc:px-2 dc:py-0.5 dc:border border-dc-border dc:rounded-sm bg-dc-surface text-dc-text hover:bg-dc-surface-secondary dc:disabled:opacity-40 dc:disabled:cursor-not-allowed",
|
|
550
|
+
children: r
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
//#endregion
|
|
554
|
+
export { ie as default };
|
|
555
|
+
|
|
556
|
+
//# sourceMappingURL=RecordsTable-aG-QYXOH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordsTable-aG-QYXOH.js","names":[],"sources":["../../../src/client/utils/rowLinkUtils.ts","../../../src/client/utils/recordsTableUtils.ts","../../../src/client/components/charts/recordsTableHooks.ts","../../../src/client/components/charts/RecordsTable.tsx"],"sourcesContent":["/**\n * Row click-through URLs for the records table.\n *\n * A dashboard author writes a template such as `/employees/{Employees.id}`,\n * and each row fills its own tokens. The template is author-controlled but the\n * *values* are data, so they are percent-encoded before substitution — an\n * encoded value cannot introduce a scheme, a path segment or a query separator.\n *\n * The resulting URL is then checked rather than trusted: only same-origin\n * relative paths and absolute http(s) URLs are allowed through.\n */\n\nconst TOKEN_PATTERN = /\\{([A-Za-z0-9_]+\\.[A-Za-z0-9_]+)\\}/g\n\n/** Schemes that must never survive validation, even spelled oddly. */\nconst ALLOWED_PROTOCOLS = new Set(['http:', 'https:'])\n\n/**\n * Resolve a row link template against one row.\n *\n * Returns `null` — meaning \"render no link\" — when the template references a\n * field the row does not carry, or when the result is not a URL we are willing\n * to navigate to. Never throws: a malformed template must not take the table\n * down with it.\n *\n * @param template - e.g. `/employees/{Employees.id}?tab=profile`\n * @param row - the row's values, including hidden columns\n * @param origin - the origin relative URLs are resolved against\n */\nexport function buildRowUrl(\n template: string | undefined,\n row: Record<string, unknown>,\n origin: string = defaultOrigin()\n): string | null {\n if (!template) return null\n\n let unresolved = false\n const substituted = template.replace(TOKEN_PATTERN, (_match, field: string) => {\n const value = row[field]\n if (value === null || value === undefined) {\n unresolved = true\n return ''\n }\n return encodeURIComponent(String(value))\n })\n\n if (unresolved) return null\n\n return isSafeUrl(substituted, origin) ? substituted : null\n}\n\n/**\n * Whether a URL is one we will navigate to: an absolute `http(s)` URL, or a\n * path that stays on this origin.\n *\n * Rejected, deliberately: `javascript:`, `data:`, `vbscript:` and every other\n * scheme; protocol-relative `//evil.example`, which inherits the current scheme\n * and silently leaves the origin; and backslash forms such as `\\\\evil.example`\n * or `/\\evil.example`, which several browsers normalise into that same\n * protocol-relative shape.\n */\nexport function isSafeUrl(url: string, origin: string = defaultOrigin()): boolean {\n const trimmed = url.trim()\n if (trimmed === '') return false\n\n // Control characters, including the tab/newline a browser strips out of a\n // scheme — which turns `java<TAB>script:` back into `javascript:`.\n // eslint-disable-next-line no-control-regex\n if (/[\\u0000-\\u001F\\u007F]/.test(trimmed)) return false\n\n if (trimmed.includes('\\\\')) return false\n if (trimmed.startsWith('//')) return false\n\n try {\n const parsed = new URL(trimmed, origin)\n if (!ALLOWED_PROTOCOLS.has(parsed.protocol)) return false\n\n // A relative path is only allowed while it stays here. An absolute http(s)\n // URL to another host is fine — that is the \"external link\" case — so the\n // origin check applies to inputs that did not declare a scheme.\n const declaresScheme = /^[A-Za-z][A-Za-z0-9+.-]*:/.test(trimmed)\n if (!declaresScheme && parsed.origin !== new URL(origin).origin) return false\n\n return true\n } catch {\n return false\n }\n}\n\n/**\n * The origin to resolve relative links against. Falls back to a placeholder\n * outside a browser (SSR, tests) so validation still runs rather than throwing.\n */\nfunction defaultOrigin(): string {\n return typeof window !== 'undefined' && window.location?.origin\n ? window.location.origin\n : 'http://localhost'\n}\n","/**\n * Cell formatting and column-width persistence for the records table.\n *\n * Kept out of the component so each piece is unit-testable without a DOM, and\n * so the format switch stays a pure value → display transform.\n */\n\nimport type { ColumnFormatConfig, ColumnFormatKind } from '../types.js'\nimport { formatAxisValue, formatTimeValue } from './chartUtils.js'\n\n/** Fallback when an author has not sized a column. */\nexport const DEFAULT_COLUMN_WIDTH = 160\n/** Narrower than this and the resize handle overlaps the header text. */\nexport const MIN_COLUMN_WIDTH = 60\n\nconst COLUMN_WIDTHS_STORAGE_KEY = 'dc-records-table-column-widths'\nconst COLUMN_ORDER_STORAGE_KEY = 'dc-records-table-column-order'\n\n/**\n * Identity under which a viewer's column widths are remembered.\n *\n * A chart component has no portlet id, so widths key on the columns themselves:\n * two records tables showing the same fields share widths, which is the\n * behaviour an author would expect from two views of the same records.\n */\nexport function columnWidthStorageKey(columns: string[]): string {\n return [...columns].sort().join('|')\n}\n\nexport function loadColumnWidths(key: string): Record<string, number> {\n try {\n const raw = localStorage.getItem(COLUMN_WIDTHS_STORAGE_KEY)\n if (!raw) return {}\n return JSON.parse(raw)[key] ?? {}\n } catch {\n return {}\n }\n}\n\nexport function saveColumnWidths(key: string, widths: Record<string, number>): void {\n try {\n const raw = localStorage.getItem(COLUMN_WIDTHS_STORAGE_KEY)\n const all = raw ? JSON.parse(raw) : {}\n all[key] = widths\n localStorage.setItem(COLUMN_WIDTHS_STORAGE_KEY, JSON.stringify(all))\n } catch {\n // localStorage unavailable (private mode, SSR) — widths stay session-local\n }\n}\n\n/**\n * A viewer's own column order, remembered under the same identity as widths.\n *\n * Stored as a list rather than a map so it survives the author adding or\n * removing a column: {@link applyColumnOrder} reconciles it against the\n * columns that actually exist.\n */\nexport function loadColumnOrder(key: string): string[] {\n try {\n const raw = localStorage.getItem(COLUMN_ORDER_STORAGE_KEY)\n if (!raw) return []\n const stored = JSON.parse(raw)[key]\n return Array.isArray(stored) ? stored : []\n } catch {\n return []\n }\n}\n\nexport function saveColumnOrder(key: string, order: string[]): void {\n try {\n const raw = localStorage.getItem(COLUMN_ORDER_STORAGE_KEY)\n const all = raw ? JSON.parse(raw) : {}\n all[key] = order\n localStorage.setItem(COLUMN_ORDER_STORAGE_KEY, JSON.stringify(all))\n } catch {\n // localStorage unavailable — the order stays session-local\n }\n}\n\n/**\n * Lay a remembered order over the columns the chart actually has.\n *\n * Columns the order does not mention keep their authored position relative to\n * the end, so an author adding a column still sees it rather than having it\n * silently swallowed by a stale local order.\n */\nexport function applyColumnOrder(columns: string[], order: string[]): string[] {\n if (order.length === 0) return columns\n const present = new Set(columns)\n const ordered = order.filter(column => present.has(column))\n const remaining = columns.filter(column => !ordered.includes(column))\n return [...ordered, ...remaining]\n}\n\n/** Move one column to another's position, returning a new order. */\nexport function moveColumn(columns: string[], from: string, to: string): string[] {\n const fromIndex = columns.indexOf(from)\n const toIndex = columns.indexOf(to)\n if (fromIndex === -1 || toIndex === -1 || fromIndex === toIndex) return columns\n\n const next = [...columns]\n next.splice(fromIndex, 1)\n next.splice(toIndex, 0, from)\n return next\n}\n\n/**\n * A cell resolved to something renderable. `progress` carries its own shape\n * because the component draws a bar or a ring rather than a string; every\n * other kind reduces to text plus, for badges, a colour.\n *\n * The component only ever sees a `RenderedCell`, so the progress `style` is\n * resolved here rather than being read back out of the column's config.\n */\nexport type RenderedCell =\n | { kind: 'text'; text: string }\n | { kind: 'badge'; text: string; colorIndex?: number }\n | { kind: 'progress'; text: string; fraction: number; style: 'bar' | 'circle' }\n\nconst EMPTY: RenderedCell = { kind: 'text', text: '' }\n\n/**\n * Turn a raw cell value into its display form under the column's format.\n *\n * Every kind degrades to text rather than erroring: a non-numeric value under\n * `number`/`progress` renders as-is (EAV columns legitimately contain 'n/a'),\n * and a badge value with no colour mapping renders neutral rather than being\n * given a guessed colour.\n */\nexport function renderCellValue(\n value: unknown,\n format: ColumnFormatConfig | undefined\n): RenderedCell {\n if (isEmpty(value)) return EMPTY\n const render = RENDERERS[format?.kind ?? 'text'] ?? renderText\n return render(value, format)\n}\n\ntype CellRenderer = (value: unknown, format: ColumnFormatConfig | undefined) => RenderedCell\n\nconst RENDERERS: Record<ColumnFormatKind, CellRenderer> = {\n text: renderText,\n number: renderNumber,\n date: renderDate,\n badge: renderBadge,\n progress: renderProgress\n}\n\nfunction renderText(value: unknown): RenderedCell {\n return { kind: 'text', text: stringify(value) }\n}\n\nfunction renderNumber(value: unknown, format: ColumnFormatConfig | undefined): RenderedCell {\n const num = toNumber(value)\n if (num === null) return { kind: 'text', text: String(value) }\n return { kind: 'text', text: formatAxisValue(num, format?.numberFormat ?? {}) }\n}\n\nfunction renderDate(value: unknown, format: ColumnFormatConfig | undefined): RenderedCell {\n return { kind: 'text', text: formatTimeValue(value, format?.dateGranularity) }\n}\n\n/**\n * Colour mappings that are actually usable.\n *\n * A `columnFormats` entry can arrive from an agent tool call or a hand-edited\n * portlet, where `badgeColors` may not be the array of `{ value, colorIndex }`\n * the type promises — an object map and colour names instead of palette indices\n * are the common shapes. Anything unusable is discarded so the badge renders\n * neutral, which is what an unmapped value does anyway.\n */\nfunction usableBadgeColors(format: ColumnFormatConfig | undefined): ColumnFormatConfig['badgeColors'] {\n if (!Array.isArray(format?.badgeColors)) return []\n return format.badgeColors.filter(entry => entry && typeof entry.colorIndex === 'number')\n}\n\nfunction renderBadge(value: unknown, format: ColumnFormatConfig | undefined): RenderedCell {\n const text = stringify(value)\n return { kind: 'badge', text, colorIndex: usableBadgeColors(format)?.find(e => e.value === text)?.colorIndex }\n}\n\nconst PROGRESS_NUMBER_FORMAT = { unit: 'number', abbreviate: false, decimals: 0 } as const\n\nfunction renderProgress(value: unknown, format: ColumnFormatConfig | undefined): RenderedCell {\n const num = toNumber(value)\n if (num === null) return { kind: 'text', text: String(value) }\n\n return {\n kind: 'progress',\n fraction: progressFraction(num, format),\n style: format?.progressStyle ?? 'bar',\n text: formatAxisValue(num, format?.numberFormat ?? PROGRESS_NUMBER_FORMAT)\n }\n}\n\n/** Where a value sits within the column's bounds, as 0-1. */\nfunction progressFraction(value: number, format: ColumnFormatConfig | undefined): number {\n const min = format?.progressMin ?? 0\n const max = format?.progressMax ?? 100\n const span = max - min\n // A zero-width range would divide by zero; treat it as \"full\".\n return span === 0 ? 1 : clamp((value - min) / span, 0, 1)\n}\n\nfunction stringify(value: unknown): string {\n if (typeof value === 'boolean') return value ? 'true' : 'false'\n if (typeof value === 'number') return value.toLocaleString()\n if (value instanceof Date) return value.toISOString()\n return String(value)\n}\n\nfunction toNumber(value: unknown): number | null {\n if (typeof value === 'number') return Number.isFinite(value) ? value : null\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value)\n return Number.isFinite(parsed) ? parsed : null\n }\n return null\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\n/**\n * Sort rows by one column, client-side.\n *\n * Only used when the host provides no server-side pagination — with paging on,\n * sorting the loaded page alone would put the wrong rows on page 1.\n */\nexport function sortRows(\n rows: Record<string, unknown>[],\n column: string,\n direction: 'asc' | 'desc'\n): Record<string, unknown>[] {\n const factor = direction === 'asc' ? 1 : -1\n return [...rows].sort((a, b) => {\n // Empty values sort last in *both* directions — reversing the sort should\n // not push a column's blanks to the top of the table.\n const aEmpty = isEmpty(a[column])\n const bEmpty = isEmpty(b[column])\n if (aEmpty || bEmpty) return aEmpty && bEmpty ? 0 : aEmpty ? 1 : -1\n return factor * compareValues(a[column], b[column])\n })\n}\n\nfunction isEmpty(value: unknown): boolean {\n return value === null || value === undefined || value === ''\n}\n\nfunction compareValues(a: unknown, b: unknown): number {\n const aNum = toNumber(a)\n const bNum = toNumber(b)\n if (aNum !== null && bNum !== null) return aNum - bNum\n\n return String(a).localeCompare(String(b))\n}\n","/**\n * State for the records table, split out of the component so each concern —\n * which columns and in what order, how wide they are, which page and sort —\n * reads on its own.\n *\n * All three are viewer-side. The *author's* choices (assigned columns, page\n * size, widths) arrive through `chartConfig`/`displayConfig`; these hooks layer\n * the viewer's own adjustments over them.\n */\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { getOrderedColumnsFromQuery } from '../../utils/pivotUtils.js'\nimport {\n DEFAULT_COLUMN_WIDTH,\n MIN_COLUMN_WIDTH,\n applyColumnOrder,\n columnWidthStorageKey,\n loadColumnOrder,\n loadColumnWidths,\n moveColumn,\n saveColumnOrder,\n saveColumnWidths,\n sortRows\n} from '../../utils/recordsTableUtils.js'\nimport type { ChartAxisConfig, ChartPagination, CubeQuery } from '../../types.js'\n\nexport const DEFAULT_PAGE_SIZE = 25\n\ntype SortState = { column: string; direction: 'asc' | 'desc' }\n\n/**\n * Which columns to render, in which order.\n *\n * The author's arrangement comes from the Columns drop zone; a viewer can drag\n * a header on top of it, and that order is remembered per column set. It is\n * *reconciled* rather than substituted, so a column the author adds later still\n * appears instead of being swallowed by a stale local order.\n */\nexport function useRecordsColumns(params: {\n rows: Record<string, unknown>[]\n chartConfig?: ChartAxisConfig\n queryObject?: CubeQuery\n}) {\n const { rows, chartConfig, queryObject } = params\n\n const baseColumns = useMemo(\n () => resolveColumns(rows, chartConfig, queryObject),\n [rows, chartConfig, queryObject]\n )\n\n const storageKey = useMemo(() => columnWidthStorageKey(baseColumns), [baseColumns])\n const [columnOrder, setColumnOrder] = useState<string[]>([])\n\n useEffect(() => {\n setColumnOrder(loadColumnOrder(storageKey))\n }, [storageKey])\n\n const columns = useMemo(\n () => applyColumnOrder(baseColumns, columnOrder),\n [baseColumns, columnOrder]\n )\n\n const [draggedColumn, setDraggedColumn] = useState<string | null>(null)\n // A drag ending on the header it started from can still produce a click;\n // without this, reordering would also toggle the sort.\n const didDragRef = useRef(false)\n\n const startColumnDrag = useCallback((column: string) => {\n didDragRef.current = true\n setDraggedColumn(column)\n }, [])\n\n const endColumnDrag = useCallback(() => {\n setDraggedColumn(null)\n requestAnimationFrame(() => { didDragRef.current = false })\n }, [])\n\n const dropColumn = useCallback((target: string) => {\n const source = draggedColumn\n endColumnDrag()\n if (!source || source === target) return\n const next = moveColumn(columns, source, target)\n setColumnOrder(next)\n saveColumnOrder(storageKey, next)\n }, [columns, draggedColumn, endColumnDrag, storageKey])\n\n return { columns, storageKey, draggedColumn, didDragRef, startColumnDrag, endColumnDrag, dropColumn }\n}\n\nfunction resolveColumns(\n rows: Record<string, unknown>[],\n chartConfig: ChartAxisConfig | undefined,\n queryObject: CubeQuery | undefined\n): string[] {\n const available = Object.keys(rows[0] ?? {})\n const hidden = new Set(chartConfig?.hiddenColumns ?? [])\n\n const configured = chartConfig?.columns?.filter(column => available.includes(column))\n if (configured && configured.length > 0) {\n return configured.filter(column => !hidden.has(column))\n }\n\n // Nothing assigned: follow the order the query asked for, then anything else\n // the rows happen to carry.\n const fromQuery = getOrderedColumnsFromQuery(queryObject).filter(column => available.includes(column))\n const ordered = fromQuery.length > 0\n ? [...fromQuery, ...available.filter(column => !fromQuery.includes(column))]\n : available\n\n return ordered.filter(column => !hidden.has(column))\n}\n\n/**\n * Drag-resizable column widths, remembered per column set.\n *\n * A chart has no portlet id and no write path back to `displayConfig`, so an\n * authored `columnWidths` acts as the default a viewer's own drags layer over —\n * the same arrangement the data browser uses.\n */\nexport function useColumnWidths(params: {\n columns: string[]\n storageKey: string\n authored?: Record<string, number>\n}) {\n const { columns, storageKey, authored } = params\n\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>({})\n const tableRef = useRef<HTMLTableElement>(null)\n const didResizeRef = useRef(false)\n\n useEffect(() => {\n setColumnWidths({ ...(authored ?? {}), ...loadColumnWidths(storageKey) })\n }, [storageKey, authored])\n\n const startResize = useCallback((event: React.MouseEvent, column: string) => {\n event.preventDefault()\n event.stopPropagation()\n\n const startX = event.clientX\n didResizeRef.current = false\n\n // Freeze every column at its rendered width first, so the ones either side\n // of the handle do not jump when this one changes.\n const snapshot: Record<string, number> = {}\n tableRef.current?.querySelectorAll('thead th').forEach((th, index) => {\n const name = columns[index]\n if (name) snapshot[name] = th.getBoundingClientRect().width\n })\n\n const startWidth = snapshot[column] ?? DEFAULT_COLUMN_WIDTH\n let latest = snapshot\n\n const onMove = (moveEvent: MouseEvent) => {\n const diff = moveEvent.clientX - startX\n if (Math.abs(diff) > 2) didResizeRef.current = true\n latest = { ...latest, [column]: Math.max(MIN_COLUMN_WIDTH, startWidth + diff) }\n setColumnWidths(latest)\n }\n\n const onUp = () => {\n document.removeEventListener('mousemove', onMove)\n document.removeEventListener('mouseup', onUp)\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n saveColumnWidths(storageKey, latest)\n // Held one frame so the header's click handler can see it and not sort.\n requestAnimationFrame(() => { didResizeRef.current = false })\n }\n\n document.addEventListener('mousemove', onMove)\n document.addEventListener('mouseup', onUp)\n document.body.style.cursor = 'col-resize'\n document.body.style.userSelect = 'none'\n }, [columns, storageKey])\n\n const totalWidth = Object.keys(columnWidths).length > 0\n ? columns.reduce((sum, column) => sum + (columnWidths[column] ?? DEFAULT_COLUMN_WIDTH), 0)\n : undefined\n\n return { columnWidths, totalWidth, tableRef, didResizeRef, startResize }\n}\n\n/**\n * Sorting and paging, server-side when the host offers it.\n *\n * With a `pagination` prop the host re-queries, so both must go through it:\n * sorting only the loaded page would put the wrong rows on page 1. Without one\n * — the AnalysisBuilder preview, the notebook, plugin hosts — the table sorts\n * and pages over the rows it already has.\n */\nexport function useRecordsPaging(params: {\n rows: Record<string, unknown>[]\n pagination?: ChartPagination\n authoredPageSize?: number\n}) {\n const { rows, pagination, authoredPageSize } = params\n\n const [localSort, setLocalSort] = useState<SortState | null>(null)\n const [localPage, setLocalPage] = useState(0)\n\n const isServerPaged = Boolean(pagination)\n const sort = pagination ? pagination.sort ?? null : localSort\n\n const toggleSort = useCallback((column: string) => {\n if (pagination) {\n pagination.toggleSort(column)\n return\n }\n setLocalSort(current => {\n if (current?.column !== column) return { column, direction: 'asc' }\n return current.direction === 'asc' ? { column, direction: 'desc' } : null\n })\n }, [pagination])\n\n const sortedRows = useMemo(\n () => (!isServerPaged && localSort ? sortRows(rows, localSort.column, localSort.direction) : rows),\n [rows, isServerPaged, localSort]\n )\n\n const pageSize = pagination?.pageSize ?? authoredPageSize ?? DEFAULT_PAGE_SIZE\n const page = pagination?.page ?? localPage\n // Server-side the count is whatever the server reported; falling back to the\n // loaded page keeps the pager honest before the first total arrives.\n const rowCount = isServerPaged\n ? pagination?.total ?? page * pageSize + sortedRows.length\n : sortedRows.length\n const pageCount = Math.max(1, Math.ceil(rowCount / pageSize))\n\n const goToPage = useCallback((next: number) => {\n if (pagination) pagination.setPage(next)\n else setLocalPage(next)\n }, [pagination])\n\n // A shrinking result set can leave the viewer past the last page.\n useEffect(() => {\n if (isServerPaged) return\n setLocalPage(current => Math.min(current, pageCount - 1))\n }, [pageCount, isServerPaged])\n\n const visibleRows = useMemo(\n () => (isServerPaged ? sortedRows : sortedRows.slice(page * pageSize, page * pageSize + pageSize)),\n [sortedRows, isServerPaged, page, pageSize]\n )\n\n return {\n sort,\n toggleSort,\n visibleRows,\n page,\n pageSize,\n pageCount,\n rowCount,\n goToPage,\n showPager: rowCount > pageSize\n }\n}\n","/**\n * Records Table\n *\n * A record-grain listing (as opposed to DataTable's aggregate view): ordered\n * columns with per-column formats, hidden columns fetched for row context,\n * click-to-sort headers, drag-resizable widths and pagination.\n *\n * Hand-rolled rather than built on a table library: the sort/resize/<colgroup>\n * patterns already exist in `DataBrowser/DataBrowserTable.tsx` (copied, not\n * imported — that component reads the data-browser store), and badge/progress\n * cells are bespoke either way.\n */\n\nimport React, { useCallback, useMemo } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { useCubeMeta } from '../../providers/CubeProvider.js'\nimport { ChartEmptyState } from './ChartStates.js'\nimport { getIcon } from '../../icons/index.js'\nimport { buildRowUrl } from '../../utils/rowLinkUtils.js'\nimport { DEFAULT_COLUMN_WIDTH, renderCellValue, type RenderedCell } from '../../utils/recordsTableUtils.js'\nimport { useColumnWidths, useRecordsColumns, useRecordsPaging } from './recordsTableHooks.js'\nimport type { ChartProps, ColumnFormatConfig } from '../../types.js'\n\nconst SortAscIcon = getIcon('chevronUp')\nconst SortDescIcon = getIcon('chevronDown')\n\nconst RecordsTable = React.memo(function RecordsTable({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n colorPalette,\n height = 300,\n onDataPointClick,\n drillEnabled,\n pagination\n}: ChartProps) {\n const { t } = useTranslation()\n const { getFieldLabel } = useCubeMeta()\n\n const rows = useMemo(() => (Array.isArray(data) ? (data as Record<string, unknown>[]) : []), [data])\n const columnFormats = displayConfig.columnFormats ?? {}\n\n const {\n columns,\n storageKey,\n draggedColumn,\n didDragRef,\n startColumnDrag,\n endColumnDrag,\n dropColumn\n } = useRecordsColumns({ rows, chartConfig, queryObject })\n\n const { columnWidths, totalWidth, tableRef, didResizeRef, startResize } = useColumnWidths({\n columns,\n storageKey,\n authored: displayConfig.columnWidths\n })\n\n const {\n sort,\n toggleSort,\n visibleRows,\n page,\n pageSize,\n pageCount,\n rowCount,\n goToPage,\n showPager\n } = useRecordsPaging({ rows, pagination, authoredPageSize: displayConfig.pageSize })\n\n const handleHeaderClick = useCallback((column: string) => {\n // Suppressed after a resize or reorder drag, which can still emit a click.\n if (didResizeRef.current || didDragRef.current) return\n toggleSort(column)\n }, [didDragRef, didResizeRef, toggleSort])\n\n // A configured row link wins over drill: the row becomes a real anchor, so\n // modifier-clicks and \"open in new tab\" behave as they do anywhere else.\n const rowLink = displayConfig.rowLink\n const rowClickable = Boolean(!rowLink && drillEnabled && onDataPointClick)\n\n const handleRowClick = useCallback((row: Record<string, unknown>, column: string, event: React.MouseEvent) => {\n if (!rowClickable) return\n onDataPointClick?.({\n dataPoint: row,\n clickedField: column,\n xValue: row[column],\n position: { x: event.clientX, y: event.clientY },\n nativeEvent: event\n })\n }, [onDataPointClick, rowClickable])\n\n if (rows.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.table')} />\n }\n\n if (columns.length === 0) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.recordsTable.noColumns\"\n hint={t('chart.runtime.table.invalidStructure')}\n />\n )\n }\n\n const firstRow = page * pageSize + 1\n const lastRow = Math.min(rowCount, page * pageSize + visibleRows.length)\n\n return (\n <div className=\"dc:flex dc:flex-col dc:w-full\" style={{ height }}>\n <div className=\"dc:flex-1 dc:overflow-auto\">\n <table\n ref={tableRef}\n className=\"dc:border-collapse\"\n style={{ tableLayout: 'fixed', width: totalWidth, minWidth: '100%' }}\n >\n <colgroup>\n {columns.map(column => (\n <col key={column} style={{ width: columnWidths[column] ?? DEFAULT_COLUMN_WIDTH }} />\n ))}\n </colgroup>\n <thead className=\"bg-dc-surface-secondary dc:sticky dc:top-0 dc:z-20\">\n <tr>\n {columns.map(column => (\n <HeaderCell\n key={column}\n column={column}\n label={columnFormats[column]?.label || getFieldLabel(column)}\n align={columnFormats[column]?.align ?? defaultAlign(columnFormats[column])}\n sortDirection={sort?.column === column ? sort.direction : undefined}\n isDropTarget={draggedColumn !== null && draggedColumn !== column}\n onClick={handleHeaderClick}\n onResizeStart={startResize}\n onDragStart={startColumnDrag}\n onDragEnd={endColumnDrag}\n onDrop={dropColumn}\n />\n ))}\n </tr>\n </thead>\n <tbody className=\"bg-dc-surface\">\n {visibleRows.map((row, index) => (\n <Row\n key={index}\n row={row}\n columns={columns}\n columnFormats={columnFormats}\n colorPalette={colorPalette}\n href={rowLink ? buildRowUrl(rowLink.urlTemplate, row) : null}\n target={rowLink?.target}\n clickable={rowClickable}\n onCellClick={handleRowClick}\n />\n ))}\n </tbody>\n </table>\n </div>\n\n {showPager && (\n <div className=\"dc:flex dc:items-center dc:justify-between dc:gap-2 dc:px-3 dc:py-1.5 dc:border-t border-dc-border dc:text-xs text-dc-text-secondary\">\n <span>{t('chart.runtime.recordsTable.rowRange', { from: firstRow, to: lastRow, total: rowCount })}</span>\n <div className=\"dc:flex dc:items-center dc:gap-1\">\n <PagerButton\n label={t('chart.runtime.recordsTable.previousPage')}\n disabled={page === 0}\n onClick={() => goToPage(Math.max(0, page - 1))}\n >\n ‹\n </PagerButton>\n <span>{t('chart.runtime.recordsTable.pageOf', { page: page + 1, pages: pageCount })}</span>\n <PagerButton\n label={t('chart.runtime.recordsTable.nextPage')}\n disabled={page >= pageCount - 1}\n onClick={() => goToPage(Math.min(pageCount - 1, page + 1))}\n >\n ›\n </PagerButton>\n </div>\n </div>\n )}\n </div>\n )\n})\n\nexport default RecordsTable\n\n/** Numeric-ish formats read better right-aligned unless the author says otherwise. */\nfunction defaultAlign(format: ColumnFormatConfig | undefined): 'left' | 'right' {\n return format?.kind === 'number' ? 'right' : 'left'\n}\n\ninterface HeaderCellProps {\n column: string\n label: string\n align: 'left' | 'right'\n sortDirection?: 'asc' | 'desc'\n isDropTarget: boolean\n onClick: (column: string) => void\n onResizeStart: (event: React.MouseEvent, column: string) => void\n onDragStart: (column: string) => void\n onDragEnd: () => void\n onDrop: (column: string) => void\n}\n\nfunction HeaderCell({\n column,\n label,\n align,\n sortDirection,\n isDropTarget,\n onClick,\n onResizeStart,\n onDragStart,\n onDragEnd,\n onDrop\n}: HeaderCellProps) {\n return (\n <th\n draggable\n onDragStart={(event) => {\n // Required for Firefox to start the drag at all.\n event.dataTransfer.setData('text/plain', column)\n event.dataTransfer.effectAllowed = 'move'\n onDragStart(column)\n }}\n onDragOver={(event) => { if (isDropTarget) event.preventDefault() }}\n onDrop={(event) => { event.preventDefault(); onDrop(column) }}\n onDragEnd={onDragEnd}\n onClick={() => onClick(column)}\n className={`dc:relative dc:px-3 dc:py-2 dc:text-xs dc:font-medium text-dc-text-muted dc:uppercase dc:tracking-wider dc:cursor-pointer dc:select-none dc:border-b border-dc-border ${\n align === 'right' ? 'dc:text-right' : 'dc:text-left'\n }${isDropTarget ? ' dc:border-l-2 border-dc-accent' : ''}`}\n >\n <div className={`dc:flex dc:items-center dc:gap-1.5 dc:overflow-hidden${align === 'right' ? ' dc:justify-end' : ''}`}>\n <span className=\"dc:truncate\">{label}</span>\n {sortDirection === 'asc' && <SortAscIcon className=\"dc:w-3 dc:h-3 text-dc-accent dc:shrink-0\" />}\n {sortDirection === 'desc' && <SortDescIcon className=\"dc:w-3 dc:h-3 text-dc-accent dc:shrink-0\" />}\n </div>\n <div\n onMouseDown={(event) => onResizeStart(event, column)}\n className=\"dc:absolute dc:top-0 dc:right-0 dc:w-1.5 dc:h-full dc:cursor-col-resize dc:hover:bg-dc-accent dc:opacity-0 dc:hover:opacity-100 dc:transition-opacity dc:z-30\"\n />\n </th>\n )\n}\n\ninterface RowProps {\n row: Record<string, unknown>\n columns: string[]\n columnFormats: Record<string, ColumnFormatConfig>\n colorPalette?: ChartProps['colorPalette']\n href: string | null\n target?: 'self' | 'blank'\n clickable: boolean\n onCellClick: (row: Record<string, unknown>, column: string, event: React.MouseEvent) => void\n}\n\nfunction Row({ row, columns, columnFormats, colorPalette, href, target, clickable, onCellClick }: RowProps) {\n return (\n <tr className={`dc:border-b border-dc-border hover:bg-dc-surface-secondary${clickable ? ' dc:cursor-pointer' : ''}`}>\n {columns.map(column => {\n const format = columnFormats[column]\n const align = format?.align ?? defaultAlign(format)\n return (\n <td\n key={column}\n onClick={(event) => onCellClick(row, column, event)}\n className={`dc:px-3 dc:py-1.5 dc:text-sm text-dc-text dc:overflow-hidden${\n align === 'right' ? ' dc:text-right dc:tabular-nums' : ''\n }`}\n >\n <CellContent\n cell={renderCellValue(row[column], format)}\n colorPalette={colorPalette}\n href={href}\n target={target}\n />\n </td>\n )\n })}\n </tr>\n )\n}\n\n/**\n * A cell, wrapped in the row's link when one resolves. An unresolvable or\n * unsafe template yields no anchor rather than a dead one.\n */\nfunction CellContent({\n cell,\n colorPalette,\n href,\n target\n}: {\n cell: RenderedCell\n colorPalette?: ChartProps['colorPalette']\n href: string | null\n target?: 'self' | 'blank'\n}) {\n const content = <Cell cell={cell} colorPalette={colorPalette} />\n if (!href) return content\n\n return (\n <a\n href={href}\n target={target === 'blank' ? '_blank' : undefined}\n rel={target === 'blank' ? 'noopener noreferrer' : undefined}\n className=\"dc:block dc:no-underline dc:text-inherit hover:dc:underline\"\n >\n {content}\n </a>\n )\n}\n\nfunction Cell({ cell, colorPalette }: { cell: RenderedCell; colorPalette?: ChartProps['colorPalette'] }) {\n if (cell.kind === 'badge') {\n const color = cell.colorIndex !== undefined ? colorPalette?.colors[cell.colorIndex] : undefined\n return (\n <span\n className=\"dc:inline-block dc:px-2 dc:py-0.5 dc:rounded-full dc:text-xs dc:font-medium dc:truncate dc:max-w-full\"\n style={color\n ? { backgroundColor: `${color}22`, color, border: `1px solid ${color}55` }\n : { backgroundColor: 'var(--dc-surface-secondary)', color: 'var(--dc-text-secondary)', border: '1px solid var(--dc-border)' }}\n >\n {cell.text}\n </span>\n )\n }\n\n if (cell.kind === 'progress') {\n return (\n <div className=\"dc:flex dc:items-center dc:gap-2\">\n {cell.style === 'circle'\n ? <ProgressRing fraction={cell.fraction} label={cell.text} />\n : (\n // Outlined track, so the full 0-100% extent is visible and a\n // near-complete bar is distinguishable from a complete one.\n <div className=\"dc:flex-1 dc:h-2 dc:rounded-full dc:overflow-hidden dc:border border-dc-border bg-dc-surface-secondary dc:min-w-[2rem]\">\n <div\n className=\"dc:h-full dc:rounded-full bg-dc-primary\"\n style={{ width: `${cell.fraction * 100}%` }}\n />\n </div>\n )}\n {/*\n Fixed width, not shrink-to-fit: the track is flexible, so a wider\n label (\"£117K\") would shorten its row's bar and two equal values\n would draw different lengths. Right-aligned and tabular so the\n numbers line up as a column.\n */}\n <span className=\"dc:w-16 dc:shrink-0 dc:text-right dc:text-xs dc:tabular-nums dc:truncate\">\n {cell.text}\n </span>\n </div>\n )\n }\n\n return <span className=\"dc:truncate dc:block\">{cell.text}</span>\n}\n\nconst RING_SIZE = 18\nconst RING_STROKE = 3\nconst RING_CENTRE = RING_SIZE / 2\nconst RING_RADIUS = RING_CENTRE - RING_STROKE / 2\n\n/**\n * The compact alternative to the progress bar: a ring that fills 0→100%, so a\n * progress column can be as narrow as its value label.\n *\n * `pathLength` normalises the circumference to 100, which lets the dash offset\n * be the percentage remaining without any 2πr arithmetic. The ring alone\n * carries the value, hence the `img` role and label.\n */\nfunction ProgressRing({ fraction, label }: { fraction: number; label: string }) {\n return (\n <svg\n role=\"img\"\n aria-label={label}\n width={RING_SIZE}\n height={RING_SIZE}\n viewBox={`0 0 ${RING_SIZE} ${RING_SIZE}`}\n className=\"dc:shrink-0\"\n >\n <circle\n cx={RING_CENTRE}\n cy={RING_CENTRE}\n r={RING_RADIUS}\n fill=\"none\"\n stroke=\"var(--dc-surface-secondary)\"\n strokeWidth={RING_STROKE}\n />\n {fraction > 0 && (\n <circle\n cx={RING_CENTRE}\n cy={RING_CENTRE}\n r={RING_RADIUS}\n fill=\"none\"\n stroke=\"var(--dc-primary)\"\n strokeWidth={RING_STROKE}\n strokeLinecap=\"round\"\n pathLength={100}\n strokeDasharray={100}\n strokeDashoffset={100 - fraction * 100}\n transform={`rotate(-90 ${RING_CENTRE} ${RING_CENTRE})`}\n />\n )}\n </svg>\n )\n}\n\nfunction PagerButton({\n label,\n disabled,\n onClick,\n children\n}: {\n label: string\n disabled: boolean\n onClick: () => void\n children: React.ReactNode\n}) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n disabled={disabled}\n onClick={onClick}\n className=\"dc:px-2 dc:py-0.5 dc:border border-dc-border dc:rounded-sm bg-dc-surface text-dc-text hover:bg-dc-surface-secondary dc:disabled:opacity-40 dc:disabled:cursor-not-allowed\"\n >\n {children}\n </button>\n )\n}\n"],"mappings":";;;;;;AAYA,IAAM,IAAgB,uCAGhB,oBAAoB,IAAI,IAAI,CAAC,SAAS,QAAQ,CAAC;AAcrD,SAAgB,EACd,GACA,GACA,IAAiB,EAAc,GAChB;CACf,IAAI,CAAC,GAAU,OAAO;CAEtB,IAAI,IAAa,IACX,IAAc,EAAS,QAAQ,IAAgB,GAAQ,MAAkB;EAC7E,IAAM,IAAQ,EAAI;EAKlB,OAJI,KAAU,QACZ,IAAa,IACN,MAEF,mBAAmB,OAAO,CAAK,CAAC;CACzC,CAAC;CAID,OAFI,IAAmB,OAEhB,EAAU,GAAa,CAAM,IAAI,IAAc;AACxD;AAYA,SAAgB,EAAU,GAAa,IAAiB,EAAc,GAAY;CAChF,IAAM,IAAU,EAAI,KAAK;CASzB,IARI,MAAY,MAKZ,wBAAwB,KAAK,CAAO,KAEpC,EAAQ,SAAS,IAAI,KACrB,EAAQ,WAAW,IAAI,GAAG,OAAO;CAErC,IAAI;EACF,IAAM,IAAS,IAAI,IAAI,GAAS,CAAM;EAStC,OAFA,EANI,CAAC,EAAkB,IAAI,EAAO,QAAQ,KAMtC,CADmB,4BAA4B,KAAK,CACnD,KAAkB,EAAO,WAAW,IAAI,IAAI,CAAM,CAAC,CAAC;CAG3D,QAAQ;EACN,OAAO;CACT;AACF;AAMA,SAAS,IAAwB;CAC/B,OAAO,OAAO,SAAW,OAAe,OAAO,UAAU,SACrD,OAAO,SAAS,SAChB;AACN;;;AClFA,IAAM,IAA4B,kCAC5B,IAA2B;AASjC,SAAgB,EAAsB,GAA2B;CAC/D,OAAO,CAAC,GAAG,CAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG;AACrC;AAEA,SAAgB,EAAiB,GAAqC;CACpE,IAAI;EACF,IAAM,IAAM,aAAa,QAAQ,CAAyB;EAE1D,OADK,IACE,KAAK,MAAM,CAAG,CAAC,CAAC,MAAQ,CAAC,IADf,CAAC;CAEpB,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,SAAgB,EAAiB,GAAa,GAAsC;CAClF,IAAI;EACF,IAAM,IAAM,aAAa,QAAQ,CAAyB,GACpD,IAAM,IAAM,KAAK,MAAM,CAAG,IAAI,CAAC;EAErC,AADA,EAAI,KAAO,GACX,aAAa,QAAQ,GAA2B,KAAK,UAAU,CAAG,CAAC;CACrE,QAAQ,CAER;AACF;AASA,SAAgB,EAAgB,GAAuB;CACrD,IAAI;EACF,IAAM,IAAM,aAAa,QAAQ,CAAwB;EACzD,IAAI,CAAC,GAAK,OAAO,CAAC;EAClB,IAAM,IAAS,KAAK,MAAM,CAAG,CAAC,CAAC;EAC/B,OAAO,MAAM,QAAQ,CAAM,IAAI,IAAS,CAAC;CAC3C,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,SAAgB,EAAgB,GAAa,GAAuB;CAClE,IAAI;EACF,IAAM,IAAM,aAAa,QAAQ,CAAwB,GACnD,IAAM,IAAM,KAAK,MAAM,CAAG,IAAI,CAAC;EAErC,AADA,EAAI,KAAO,GACX,aAAa,QAAQ,GAA0B,KAAK,UAAU,CAAG,CAAC;CACpE,QAAQ,CAER;AACF;AASA,SAAgB,EAAiB,GAAmB,GAA2B;CAC7E,IAAI,EAAM,WAAW,GAAG,OAAO;CAC/B,IAAM,IAAU,IAAI,IAAI,CAAO,GACzB,IAAU,EAAM,QAAO,MAAU,EAAQ,IAAI,CAAM,CAAC,GACpD,IAAY,EAAQ,QAAO,MAAU,CAAC,EAAQ,SAAS,CAAM,CAAC;CACpE,OAAO,CAAC,GAAG,GAAS,GAAG,CAAS;AAClC;AAGA,SAAgB,EAAW,GAAmB,GAAc,GAAsB;CAChF,IAAM,IAAY,EAAQ,QAAQ,CAAI,GAChC,IAAU,EAAQ,QAAQ,CAAE;CAClC,IAAI,MAAc,MAAM,MAAY,MAAM,MAAc,GAAS,OAAO;CAExE,IAAM,IAAO,CAAC,GAAG,CAAO;CAGxB,OAFA,EAAK,OAAO,GAAW,CAAC,GACxB,EAAK,OAAO,GAAS,GAAG,CAAI,GACrB;AACT;AAeA,IAAM,IAAsB;CAAE,MAAM;CAAQ,MAAM;AAAG;AAUrD,SAAgB,EACd,GACA,GACc;CAGd,OAFI,EAAQ,CAAK,IAAU,KACZ,EAAU,GAAQ,QAAQ,WAAW,EAAA,CACtC,GAAO,CAAM;AAC7B;AAIA,IAAM,IAAoD;CACxD,MAAM;CACN,QAAQ;CACR,MAAM;CACN,OAAO;CACP,UAAU;AACZ;AAEA,SAAS,EAAW,GAA8B;CAChD,OAAO;EAAE,MAAM;EAAQ,MAAM,EAAU,CAAK;CAAE;AAChD;AAEA,SAAS,EAAa,GAAgB,GAAsD;CAC1F,IAAM,IAAM,EAAS,CAAK;CAE1B,OADI,MAAQ,OAAa;EAAE,MAAM;EAAQ,MAAM,OAAO,CAAK;CAAE,IACtD;EAAE,MAAM;EAAQ,MAAM,EAAgB,GAAK,GAAQ,gBAAgB,CAAC,CAAC;CAAE;AAChF;AAEA,SAAS,EAAW,GAAgB,GAAsD;CACxF,OAAO;EAAE,MAAM;EAAQ,MAAM,EAAgB,GAAO,GAAQ,eAAe;CAAE;AAC/E;AAWA,SAAS,EAAkB,GAA2E;CAEpG,OADK,MAAM,QAAQ,GAAQ,WAAW,IAC/B,EAAO,YAAY,QAAO,MAAS,KAAS,OAAO,EAAM,cAAe,QAAQ,IADvC,CAAC;AAEnD;AAEA,SAAS,EAAY,GAAgB,GAAsD;CACzF,IAAM,IAAO,EAAU,CAAK;CAC5B,OAAO;EAAE,MAAM;EAAS;EAAM,YAAY,EAAkB,CAAM,CAAC,EAAE,MAAK,MAAK,EAAE,UAAU,CAAI,CAAC,EAAE;CAAW;AAC/G;AAEA,IAAM,IAAyB;CAAE,MAAM;CAAU,YAAY;CAAO,UAAU;AAAE;AAEhF,SAAS,EAAe,GAAgB,GAAsD;CAC5F,IAAM,IAAM,EAAS,CAAK;CAG1B,OAFI,MAAQ,OAAa;EAAE,MAAM;EAAQ,MAAM,OAAO,CAAK;CAAE,IAEtD;EACL,MAAM;EACN,UAAU,EAAiB,GAAK,CAAM;EACtC,OAAO,GAAQ,iBAAiB;EAChC,MAAM,EAAgB,GAAK,GAAQ,gBAAgB,CAAsB;CAC3E;AACF;AAGA,SAAS,EAAiB,GAAe,GAAgD;CACvF,IAAM,IAAM,GAAQ,eAAe,GAE7B,KADM,GAAQ,eAAe,OAChB;CAEnB,OAAO,MAAS,IAAI,IAAI,GAAO,IAAQ,KAAO,GAAM,GAAG,CAAC;AAC1D;AAEA,SAAS,EAAU,GAAwB;CAIzC,OAHI,OAAO,KAAU,YAAkB,IAAQ,SAAS,UACpD,OAAO,KAAU,WAAiB,EAAM,eAAe,IACvD,aAAiB,OAAa,EAAM,YAAY,IAC7C,OAAO,CAAK;AACrB;AAEA,SAAS,EAAS,GAA+B;CAC/C,IAAI,OAAO,KAAU,UAAU,OAAO,OAAO,SAAS,CAAK,IAAI,IAAQ;CACvE,IAAI,OAAO,KAAU,YAAY,EAAM,KAAK,MAAM,IAAI;EACpD,IAAM,IAAS,OAAO,CAAK;EAC3B,OAAO,OAAO,SAAS,CAAM,IAAI,IAAS;CAC5C;CACA,OAAO;AACT;AAEA,SAAS,EAAM,GAAe,GAAa,GAAqB;CAC9D,OAAO,KAAK,IAAI,GAAK,KAAK,IAAI,GAAK,CAAK,CAAC;AAC3C;AAQA,SAAgB,EACd,GACA,GACA,GAC2B;CAC3B,IAAM,IAAS,MAAc,QAAQ,IAAI;CACzC,OAAO,CAAC,GAAG,CAAI,CAAC,CAAC,MAAM,GAAG,MAAM;EAG9B,IAAM,IAAS,EAAQ,EAAE,EAAO,GAC1B,IAAS,EAAQ,EAAE,EAAO;EAEhC,OADI,KAAU,IAAe,KAAU,IAAS,IAAI,IAAS,IAAI,KAC1D,IAAS,EAAc,EAAE,IAAS,EAAE,EAAO;CACpD,CAAC;AACH;AAEA,SAAS,EAAQ,GAAyB;CACxC,OAAO,KAAU,QAA+B,MAAU;AAC5D;AAEA,SAAS,EAAc,GAAY,GAAoB;CACrD,IAAM,IAAO,EAAS,CAAC,GACjB,IAAO,EAAS,CAAC;CAGvB,OAFI,MAAS,QAAQ,MAAS,OAAa,IAAO,IAE3C,OAAO,CAAC,CAAC,CAAC,cAAc,OAAO,CAAC,CAAC;AAC1C;AC1NA,SAAgB,GAAkB,GAI/B;CACD,IAAM,EAAE,SAAM,gBAAa,mBAAgB,GAErC,IAAc,QACZ,EAAe,GAAM,GAAa,CAAW,GACnD;EAAC;EAAM;EAAa;CAAW,CACjC,GAEM,IAAa,QAAc,EAAsB,CAAW,GAAG,CAAC,CAAW,CAAC,GAC5E,CAAC,GAAa,KAAkB,EAAmB,CAAC,CAAC;CAE3D,QAAgB;EACd,EAAe,EAAgB,CAAU,CAAC;CAC5C,GAAG,CAAC,CAAU,CAAC;CAEf,IAAM,IAAU,QACR,EAAiB,GAAa,CAAW,GAC/C,CAAC,GAAa,CAAW,CAC3B,GAEM,CAAC,GAAe,KAAoB,EAAwB,IAAI,GAGhE,IAAa,EAAO,EAAK,GAEzB,IAAkB,GAAa,MAAmB;EAEtD,AADA,EAAW,UAAU,IACrB,EAAiB,CAAM;CACzB,GAAG,CAAC,CAAC,GAEC,IAAgB,QAAkB;EAEtC,AADA,EAAiB,IAAI,GACrB,4BAA4B;GAAE,EAAW,UAAU;EAAM,CAAC;CAC5D,GAAG,CAAC,CAAC;CAWL,OAAO;EAAE;EAAS;EAAY;EAAe;EAAY;EAAiB;EAAe,YATtE,GAAa,MAAmB;GACjD,IAAM,IAAS;GAEf,IADA,EAAc,GACV,CAAC,KAAU,MAAW,GAAQ;GAClC,IAAM,IAAO,EAAW,GAAS,GAAQ,CAAM;GAE/C,AADA,EAAe,CAAI,GACnB,EAAgB,GAAY,CAAI;EAClC,GAAG;GAAC;GAAS;GAAe;GAAe;EAAU,CAEoC;CAAW;AACtG;AAEA,SAAS,EACP,GACA,GACA,GACU;CACV,IAAM,IAAY,OAAO,KAAK,EAAK,MAAM,CAAC,CAAC,GACrC,IAAS,IAAI,IAAI,GAAa,iBAAiB,CAAC,CAAC,GAEjD,IAAa,GAAa,SAAS,QAAO,MAAU,EAAU,SAAS,CAAM,CAAC;CACpF,IAAI,KAAc,EAAW,SAAS,GACpC,OAAO,EAAW,QAAO,MAAU,CAAC,EAAO,IAAI,CAAM,CAAC;CAKxD,IAAM,IAAY,EAA2B,CAAW,CAAC,CAAC,QAAO,MAAU,EAAU,SAAS,CAAM,CAAC;CAKrG,QAJgB,EAAU,SAAS,IAC/B,CAAC,GAAG,GAAW,GAAG,EAAU,QAAO,MAAU,CAAC,EAAU,SAAS,CAAM,CAAC,CAAC,IACzE,EAAA,CAEW,QAAO,MAAU,CAAC,EAAO,IAAI,CAAM,CAAC;AACrD;AASA,SAAgB,GAAgB,GAI7B;CACD,IAAM,EAAE,YAAS,eAAY,gBAAa,GAEpC,CAAC,GAAc,KAAmB,EAAiC,CAAC,CAAC,GACrE,IAAW,EAAyB,IAAI,GACxC,IAAe,EAAO,EAAK;CAEjC,QAAgB;EACd,EAAgB;GAAE,GAAI,KAAY,CAAC;GAAI,GAAG,EAAiB,CAAU;EAAE,CAAC;CAC1E,GAAG,CAAC,GAAY,CAAQ,CAAC;CAEzB,IAAM,IAAc,GAAa,GAAyB,MAAmB;EAE3E,AADA,EAAM,eAAe,GACrB,EAAM,gBAAgB;EAEtB,IAAM,IAAS,EAAM;EACrB,EAAa,UAAU;EAIvB,IAAM,IAAmC,CAAC;EAC1C,EAAS,SAAS,iBAAiB,UAAU,CAAC,CAAC,SAAS,GAAI,MAAU;GACpE,IAAM,IAAO,EAAQ;GACrB,AAAI,MAAM,EAAS,KAAQ,EAAG,sBAAsB,CAAC,CAAC;EACxD,CAAC;EAED,IAAM,IAAa,EAAS,MAAA,KACxB,IAAS,GAEP,KAAU,MAA0B;GACxC,IAAM,IAAO,EAAU,UAAU;GAGjC,AAFI,KAAK,IAAI,CAAI,IAAI,MAAG,EAAa,UAAU,KAC/C,IAAS;IAAE,GAAG;KAAS,IAAS,KAAK,IAAA,IAAsB,IAAa,CAAI;GAAE,GAC9E,EAAgB,CAAM;EACxB,GAEM,UAAa;GAOjB,AANA,SAAS,oBAAoB,aAAa,CAAM,GAChD,SAAS,oBAAoB,WAAW,CAAI,GAC5C,SAAS,KAAK,MAAM,SAAS,IAC7B,SAAS,KAAK,MAAM,aAAa,IACjC,EAAiB,GAAY,CAAM,GAEnC,4BAA4B;IAAE,EAAa,UAAU;GAAM,CAAC;EAC9D;EAKA,AAHA,SAAS,iBAAiB,aAAa,CAAM,GAC7C,SAAS,iBAAiB,WAAW,CAAI,GACzC,SAAS,KAAK,MAAM,SAAS,cAC7B,SAAS,KAAK,MAAM,aAAa;CACnC,GAAG,CAAC,GAAS,CAAU,CAAC;CAMxB,OAAO;EAAE;EAAc,YAJJ,OAAO,KAAK,CAAY,CAAC,CAAC,SAAS,IAClD,EAAQ,QAAQ,GAAK,MAAW,KAAO,EAAa,MAAA,MAAkC,CAAC,IACvF,KAAA;EAE+B;EAAU;EAAc;CAAY;AACzE;AAUA,SAAgB,GAAiB,GAI9B;CACD,IAAM,EAAE,SAAM,eAAY,wBAAqB,GAEzC,CAAC,GAAW,KAAgB,EAA2B,IAAI,GAC3D,CAAC,GAAW,KAAgB,EAAS,CAAC,GAEtC,IAAgB,EAAQ,GACxB,IAAO,IAAa,EAAW,QAAQ,OAAO,GAE9C,IAAa,GAAa,MAAmB;EACjD,IAAI,GAAY;GACd,EAAW,WAAW,CAAM;GAC5B;EACF;EACA,GAAa,MACP,GAAS,WAAW,IACjB,EAAQ,cAAc,QAAQ;GAAE;GAAQ,WAAW;EAAO,IAAI,OAD9B;GAAE;GAAQ,WAAW;EAAM,CAEnE;CACH,GAAG,CAAC,CAAU,CAAC,GAET,IAAa,QACV,CAAC,KAAiB,IAAY,EAAS,GAAM,EAAU,QAAQ,EAAU,SAAS,IAAI,GAC7F;EAAC;EAAM;EAAe;CAAS,CACjC,GAEM,IAAW,GAAY,YAAY,KAAA,IACnC,IAAO,GAAY,QAAQ,GAG3B,IAAW,IACb,GAAY,SAAS,IAAO,IAAW,EAAW,SAClD,EAAW,QACT,IAAY,KAAK,IAAI,GAAG,KAAK,KAAK,IAAW,CAAQ,CAAC,GAEtD,IAAW,GAAa,MAAiB;EAC7C,AAAI,IAAY,EAAW,QAAQ,CAAI,IAClC,EAAa,CAAI;CACxB,GAAG,CAAC,CAAU,CAAC;CAaf,OAVA,QAAgB;EACV,KACJ,GAAa,MAAW,KAAK,IAAI,GAAS,IAAY,CAAC,CAAC;CAC1D,GAAG,CAAC,GAAW,CAAa,CAAC,GAOtB;EACL;EACA;EACA,aARkB,QACX,IAAgB,IAAa,EAAW,MAAM,IAAO,GAAU,IAAO,IAAW,CAAQ,GAChG;GAAC;GAAY;GAAe;GAAM;EAAQ,CAM1C;EACA;EACA;EACA;EACA;EACA;EACA,WAAW,IAAW;CACxB;AACF;;;ACxOA,IAAM,IAAc,EAAQ,WAAW,GACjC,KAAe,EAAQ,aAAa,GAEpC,KAAe,EAAM,KAAK,SAAsB,EACpD,SACA,gBACA,mBAAgB,CAAC,GACjB,gBACA,iBACA,YAAS,KACT,qBACA,iBACA,iBACa;CACb,IAAM,EAAE,SAAM,EAAe,GACvB,EAAE,qBAAkB,EAAY,GAEhC,IAAO,QAAe,MAAM,QAAQ,CAAI,IAAK,IAAqC,CAAC,GAAI,CAAC,CAAI,CAAC,GAC7F,IAAgB,EAAc,iBAAiB,CAAC,GAEhD,EACJ,YACA,eACA,kBACA,eACA,oBACA,kBACA,kBACE,GAAkB;EAAE;EAAM;EAAa;CAAY,CAAC,GAElD,EAAE,iBAAc,eAAY,aAAU,iBAAc,mBAAgB,GAAgB;EACxF;EACA;EACA,UAAU,EAAc;CAC1B,CAAC,GAEK,EACJ,SACA,eACA,gBACA,SACA,aACA,cACA,aACA,aACA,iBACE,GAAiB;EAAE;EAAM;EAAY,kBAAkB,EAAc;CAAS,CAAC,GAE7E,IAAoB,GAAa,MAAmB;EAEpD,EAAa,WAAW,EAAW,WACvC,EAAW,CAAM;CACnB,GAAG;EAAC;EAAY;EAAc;CAAU,CAAC,GAInC,IAAU,EAAc,SACxB,IAAe,GAAQ,CAAC,KAAW,KAAgB,IAEnD,IAAiB,GAAa,GAA8B,GAAgB,MAA4B;EACvG,KACL,IAAmB;GACjB,WAAW;GACX,cAAc;GACd,QAAQ,EAAI;GACZ,UAAU;IAAE,GAAG,EAAM;IAAS,GAAG,EAAM;GAAQ;GAC/C,aAAa;EACf,CAAC;CACH,GAAG,CAAC,GAAkB,CAAY,CAAC;CAEnC,IAAI,EAAK,WAAW,GAClB,OAAO,kBAAC,GAAD;EAAyB;EAAQ,MAAM,EAAE,gCAAgC;CAAI,CAAA;CAGtF,IAAI,EAAQ,WAAW,GACrB,OACE,kBAAC,GAAD;EACU;EACR,UAAS;EACT,MAAM,EAAE,sCAAsC;CAC/C,CAAA;CAIL,IAAM,IAAW,IAAO,IAAW,GAC7B,IAAU,KAAK,IAAI,GAAU,IAAO,IAAW,EAAY,MAAM;CAEvE,OACE,kBAAC,OAAD;EAAK,WAAU;EAAgC,OAAO,EAAE,UAAO;EAA/D,UAAA,CACE,kBAAC,OAAD;GAAK,WAAU;GACb,UAAA,kBAAC,SAAD;IACE,KAAK;IACL,WAAU;IACV,OAAO;KAAE,aAAa;KAAS,OAAO;KAAY,UAAU;IAAO;IAHrE,UAAA;KAKE,kBAAC,YAAD,EAAA,UACG,EAAQ,KAAI,MACX,kBAAC,OAAD,EAAkB,OAAO,EAAE,OAAO,EAAa,MAAA,IAAgC,EAAI,GAAzE,CAAyE,CACpF,EACO,CAAA;KACV,kBAAC,SAAD;MAAO,WAAU;MACf,UAAA,kBAAC,MAAD,EAAA,UACG,EAAQ,KAAI,MACX,kBAAC,IAAD;OAEU;OACR,OAAO,EAAc,EAAO,EAAE,SAAS,EAAc,CAAM;OAC3D,OAAO,EAAc,EAAO,EAAE,SAAS,EAAa,EAAc,EAAO;OACzE,eAAe,GAAM,WAAW,IAAS,EAAK,YAAY,KAAA;OAC1D,cAAc,MAAkB,QAAQ,MAAkB;OAC1D,SAAS;OACT,eAAe;OACf,aAAa;OACb,WAAW;OACX,QAAQ;MACT,GAXM,CAWN,CACF,EACC,CAAA;KACC,CAAA;KACP,kBAAC,SAAD;MAAO,WAAU;MACd,UAAA,EAAY,KAAK,GAAK,MACrB,kBAAC,IAAD;OAEO;OACI;OACM;OACD;OACd,MAAM,IAAU,EAAY,EAAQ,aAAa,CAAG,IAAI;OACxD,QAAQ,GAAS;OACjB,WAAW;OACX,aAAa;MACd,GATM,CASN,CACF;KACI,CAAA;IACF;;EACJ,CAAA,GAEJ,KACC,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,kBAAC,QAAD,EAAA,UAAO,EAAE,uCAAuC;IAAE,MAAM;IAAU,IAAI;IAAS,OAAO;GAAS,CAAC,EAAQ,CAAA,GACxG,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,kBAAC,GAAD;MACE,OAAO,EAAE,yCAAyC;MAClD,UAAU,MAAS;MACnB,eAAe,EAAS,KAAK,IAAI,GAAG,IAAO,CAAC,CAAC;MAC9C,UAAA;KAEY,CAAA;KACb,kBAAC,QAAD,EAAA,UAAO,EAAE,qCAAqC;MAAE,MAAM,IAAO;MAAG,OAAO;KAAU,CAAC,EAAQ,CAAA;KAC1F,kBAAC,GAAD;MACE,OAAO,EAAE,qCAAqC;MAC9C,UAAU,KAAQ,IAAY;MAC9B,eAAe,EAAS,KAAK,IAAI,IAAY,GAAG,IAAO,CAAC,CAAC;MAC1D,UAAA;KAEY,CAAA;IACV;GACF,CAAA,CAAA;EAEJ,CAAA,CAAA;;AAET,CAAC;AAKD,SAAS,EAAa,GAA0D;CAC9E,OAAO,GAAQ,SAAS,WAAW,UAAU;AAC/C;AAeA,SAAS,GAAW,EAClB,WACA,UACA,UACA,kBACA,iBACA,YACA,kBACA,gBACA,cACA,aACkB;CAClB,OACE,kBAAC,MAAD;EACE,WAAA;EACA,cAAc,MAAU;GAItB,AAFA,EAAM,aAAa,QAAQ,cAAc,CAAM,GAC/C,EAAM,aAAa,gBAAgB,QACnC,EAAY,CAAM;EACpB;EACA,aAAa,MAAU;GAAE,AAAI,KAAc,EAAM,eAAe;EAAE;EAClE,SAAS,MAAU;GAA0B,AAAxB,EAAM,eAAe,GAAG,EAAO,CAAM;EAAE;EACjD;EACX,eAAe,EAAQ,CAAM;EAC7B,WAAW,yKACT,MAAU,UAAU,kBAAkB,iBACrC,IAAe,oCAAoC;EAdxD,UAAA,CAgBE,kBAAC,OAAD;GAAK,WAAW,wDAAwD,MAAU,UAAU,oBAAoB;GAAhH,UAAA;IACE,kBAAC,QAAD;KAAM,WAAU;KAAe,UAAA;IAAY,CAAA;IAC1C,MAAkB,SAAS,kBAAC,GAAD,EAAa,WAAU,2CAA4C,CAAA;IAC9F,MAAkB,UAAU,kBAAC,IAAD,EAAc,WAAU,2CAA4C,CAAA;GAC9F;EACL,CAAA,GAAA,kBAAC,OAAD;GACE,cAAc,MAAU,EAAc,GAAO,CAAM;GACnD,WAAU;EACX,CAAA,CACC;;AAER;AAaA,SAAS,GAAI,EAAE,QAAK,YAAS,kBAAe,iBAAc,SAAM,WAAQ,cAAW,kBAAyB;CAC1G,OACE,kBAAC,MAAD;EAAI,WAAW,6DAA6D,IAAY,uBAAuB;EAC5G,UAAA,EAAQ,KAAI,MAAU;GACrB,IAAM,IAAS,EAAc,IACvB,IAAQ,GAAQ,SAAS,EAAa,CAAM;GAClD,OACE,kBAAC,MAAD;IAEE,UAAU,MAAU,EAAY,GAAK,GAAQ,CAAK;IAClD,WAAW,+DACT,MAAU,UAAU,mCAAmC;IAGzD,UAAA,kBAAC,IAAD;KACE,MAAM,EAAgB,EAAI,IAAS,CAAM;KAC3B;KACR;KACE;IACT,CAAA;GACC,GAZG,CAYH;EAER,CAAC;CACC,CAAA;AAER;AAMA,SAAS,GAAY,EACnB,SACA,iBACA,SACA,aAMC;CACD,IAAM,IAAU,kBAAC,IAAD;EAAY;EAAoB;CAAe,CAAA;CAG/D,OAFK,IAGH,kBAAC,KAAD;EACQ;EACN,QAAQ,MAAW,UAAU,WAAW,KAAA;EACxC,KAAK,MAAW,UAAU,wBAAwB,KAAA;EAClD,WAAU;EAET,UAAA;CACA,CAAA,IAVa;AAYpB;AAEA,SAAS,GAAK,EAAE,SAAM,mBAAmF;CACvG,IAAI,EAAK,SAAS,SAAS;EACzB,IAAM,IAAQ,EAAK,eAAe,KAAA,IAAoD,KAAA,IAAxC,GAAc,OAAO,EAAK;EACxE,OACE,kBAAC,QAAD;GACE,WAAU;GACV,OAAO,IACH;IAAE,iBAAiB,GAAG,EAAM;IAAK;IAAO,QAAQ,aAAa,EAAM;GAAI,IACvE;IAAE,iBAAiB;IAA+B,OAAO;IAA4B,QAAQ;GAA6B;GAE7H,UAAA,EAAK;EACF,CAAA;CAEV;CA8BA,OA5BI,EAAK,SAAS,aAEd,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACG,EAAK,UAAU,WACZ,kBAAC,IAAD;GAAc,UAAU,EAAK;GAAU,OAAO,EAAK;EAAO,CAAA,IAI1D,kBAAC,OAAD;GAAK,WAAU;GACb,UAAA,kBAAC,OAAD;IACE,WAAU;IACV,OAAO,EAAE,OAAO,GAAG,EAAK,WAAW,IAAI,GAAG;GAC3C,CAAA;EACE,CAAA,GAQT,kBAAC,QAAD;GAAM,WAAU;GACb,UAAA,EAAK;EACF,CAAA,CACH;MAIF,kBAAC,QAAD;EAAM,WAAU;EAAwB,UAAA,EAAK;CAAW,CAAA;AACjE;AAEA,IAAM,IAAY,IACZ,IAAc,GACd,IAAc,IAAY,GAC1B,IAAc,IAAc,IAAc;AAUhD,SAAS,GAAa,EAAE,aAAU,YAA8C;CAC9E,OACE,kBAAC,OAAD;EACE,MAAK;EACL,cAAY;EACZ,OAAO;EACP,QAAQ;EACR,SAAS,OAAO,EAAU,GAAG;EAC7B,WAAU;EANZ,UAAA,CAQE,kBAAC,UAAD;GACE,IAAI;GACJ,IAAI;GACJ,GAAG;GACH,MAAK;GACL,QAAO;GACP,aAAa;EACd,CAAA,GACA,IAAW,KACV,kBAAC,UAAD;GACE,IAAI;GACJ,IAAI;GACJ,GAAG;GACH,MAAK;GACL,QAAO;GACP,aAAa;GACb,eAAc;GACd,YAAY;GACZ,iBAAiB;GACjB,kBAAkB,MAAM,IAAW;GACnC,WAAW,cAAc,EAAY,GAAG,EAAY;EACrD,CAAA,CAEA;;AAET;AAEA,SAAS,EAAY,EACnB,UACA,aACA,YACA,eAMC;CACD,OACE,kBAAC,UAAD;EACE,MAAK;EACL,cAAY;EACZ,OAAO;EACG;EACD;EACT,WAAU;EAET;CACK,CAAA;AAEZ"}
|