drizzle-cube 0.5.4 → 0.5.6

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.
Files changed (217) hide show
  1. package/dist/adapters/express/index.cjs +1 -1
  2. package/dist/adapters/express/index.js +4 -4
  3. package/dist/adapters/fastify/index.cjs +1 -1
  4. package/dist/adapters/fastify/index.js +4 -4
  5. package/dist/adapters/{handler-CNn3q29F.cjs → handler-C0nUppAK.cjs} +3 -3
  6. package/dist/adapters/{handler-_TKfigrZ.js → handler-Odsi9_Rd.js} +125 -1
  7. package/dist/adapters/hono/index.cjs +1 -1
  8. package/dist/adapters/hono/index.js +4 -4
  9. package/dist/adapters/{locale-Dl_3R6hP.cjs → locale-Dv6bl_eU.cjs} +2 -2
  10. package/dist/adapters/{locale-BQQrZYhz.js → locale-Dy3LcTwN.js} +4 -2
  11. package/dist/adapters/mcp-tools.cjs +1 -1
  12. package/dist/adapters/mcp-tools.js +8 -3
  13. package/dist/adapters/mcp-transport-BCtjU0lC.cjs +40 -0
  14. package/dist/adapters/mcp-transport-DW_Uks-O.js +579 -0
  15. package/dist/adapters/nextjs/index.cjs +1 -1
  16. package/dist/adapters/nextjs/index.js +4 -4
  17. package/dist/adapters/{utils-DG8ti3FT.js → utils-Bd5mzZfk.js} +44 -18
  18. package/dist/adapters/utils-DklqMBHn.cjs +128 -0
  19. package/dist/adapters/utils.cjs +1 -1
  20. package/dist/adapters/utils.d.ts +6 -1
  21. package/dist/adapters/utils.js +1 -1
  22. package/dist/client/charts/chartConfigs.d.ts +34 -0
  23. package/dist/client/charts.js +12 -12
  24. package/dist/client/chunks/{DashboardEditModal-BBcB0E2g.js → DashboardEditModal-BiJwVv0b.js} +11 -11
  25. package/dist/client/chunks/DashboardEditModal-BiJwVv0b.js.map +1 -0
  26. package/dist/client/chunks/{FieldSearchModal-CisOov-_.js → FieldSearchModal-DdcbCwAi.js} +21 -5
  27. package/dist/client/chunks/{FieldSearchModal-CisOov-_.js.map → FieldSearchModal-DdcbCwAi.js.map} +1 -1
  28. package/dist/client/chunks/{RetentionCombinedChart-DiyZwiPv.js → RetentionCombinedChart-CivIny9P.js} +3 -3
  29. package/dist/client/chunks/{RetentionCombinedChart-DiyZwiPv.js.map → RetentionCombinedChart-CivIny9P.js.map} +1 -1
  30. package/dist/client/chunks/{RetentionHeatmap-usGF7BCo.js → RetentionHeatmap-BHCgwZmB.js} +2 -2
  31. package/dist/client/chunks/{RetentionHeatmap-usGF7BCo.js.map → RetentionHeatmap-BHCgwZmB.js.map} +1 -1
  32. package/dist/client/chunks/{af-ZA-xDmO5F0s.js → af-ZA-BdL6DOWy.js} +10 -3
  33. package/dist/client/chunks/af-ZA-BdL6DOWy.js.map +1 -0
  34. package/dist/client/chunks/{analysis-builder-0o1W-k3K.js → analysis-builder-MoGvbMRe.js} +245 -255
  35. package/dist/client/chunks/analysis-builder-MoGvbMRe.js.map +1 -0
  36. package/dist/client/chunks/{analysis-builder-shared-Cz4KAlIC.js → analysis-builder-shared-DmyRh2O3.js} +391 -459
  37. package/dist/client/chunks/analysis-builder-shared-DmyRh2O3.js.map +1 -0
  38. package/dist/client/chunks/{chart-activity-grid-VFFm85hC.js → chart-activity-grid-Bdb8U_NC.js} +14 -7
  39. package/dist/client/chunks/chart-activity-grid-Bdb8U_NC.js.map +1 -0
  40. package/dist/client/chunks/{chart-area-CwwIHTmK.js → chart-area-BZEnT-tf.js} +39 -38
  41. package/dist/client/chunks/chart-area-BZEnT-tf.js.map +1 -0
  42. package/dist/client/chunks/{chart-bar-Bmny922L.js → chart-bar-CTmdv_v0.js} +53 -52
  43. package/dist/client/chunks/chart-bar-CTmdv_v0.js.map +1 -0
  44. package/dist/client/chunks/{chart-box-plot-DM7GwtCV.js → chart-box-plot-CYObdFtp.js} +3 -3
  45. package/dist/client/chunks/{chart-box-plot-DM7GwtCV.js.map → chart-box-plot-CYObdFtp.js.map} +1 -1
  46. package/dist/client/chunks/{chart-bubble-DJOq4IpT.js → chart-bubble-CjFprySz.js} +3 -3
  47. package/dist/client/chunks/{chart-bubble-DJOq4IpT.js.map → chart-bubble-CjFprySz.js.map} +1 -1
  48. package/dist/client/chunks/{chart-candlestick-C2nzVCv1.js → chart-candlestick-D2HoM3B5.js} +3 -3
  49. package/dist/client/chunks/{chart-candlestick-C2nzVCv1.js.map → chart-candlestick-D2HoM3B5.js.map} +1 -1
  50. package/dist/client/chunks/{chart-config-activity-grid-C-EkgYoa.js → chart-config-activity-grid-Bom99j9m.js} +9 -2
  51. package/dist/client/chunks/chart-config-activity-grid-Bom99j9m.js.map +1 -0
  52. package/dist/client/chunks/{chart-config-area-CMZpbIah.js → chart-config-area-DtYTKZxS.js} +10 -2
  53. package/dist/client/chunks/chart-config-area-DtYTKZxS.js.map +1 -0
  54. package/dist/client/chunks/{chart-config-bar-B8_V4YLg.js → chart-config-bar-7v5JVY2y.js} +10 -2
  55. package/dist/client/chunks/chart-config-bar-7v5JVY2y.js.map +1 -0
  56. package/dist/client/chunks/{chart-config-box-plot-Dwj7sEbU.js → chart-config-box-plot-BHGv-wqu.js} +9 -2
  57. package/dist/client/chunks/chart-config-box-plot-BHGv-wqu.js.map +1 -0
  58. package/dist/client/chunks/{chart-config-bubble-B0w0ZVp4.js → chart-config-bubble-BkHm-mfu.js} +9 -2
  59. package/dist/client/chunks/chart-config-bubble-BkHm-mfu.js.map +1 -0
  60. package/dist/client/chunks/{chart-config-candlestick-Bvo3zeIn.js → chart-config-candlestick-D1aaHvTe.js} +9 -2
  61. package/dist/client/chunks/chart-config-candlestick-D1aaHvTe.js.map +1 -0
  62. package/dist/client/chunks/{chart-config-data-table-BQXSn4b_.js → chart-config-data-table-B_Hw8w2J.js} +2 -2
  63. package/dist/client/chunks/{chart-config-data-table-BQXSn4b_.js.map → chart-config-data-table-B_Hw8w2J.js.map} +1 -1
  64. package/dist/client/chunks/{chart-config-funnel-BzEsHmjR.js → chart-config-funnel-DL8PSGuL.js} +2 -2
  65. package/dist/client/chunks/{chart-config-funnel-BzEsHmjR.js.map → chart-config-funnel-DL8PSGuL.js.map} +1 -1
  66. package/dist/client/chunks/{chart-config-gauge-C5ZiyZy7.js → chart-config-gauge-BVLxuA3f.js} +6 -2
  67. package/dist/client/chunks/chart-config-gauge-BVLxuA3f.js.map +1 -0
  68. package/dist/client/chunks/{chart-config-heat-map-Cv8qNnVP.js → chart-config-heat-map-CjudGdui.js} +9 -2
  69. package/dist/client/chunks/chart-config-heat-map-CjudGdui.js.map +1 -0
  70. package/dist/client/chunks/{chart-config-kpi-delta-BraHQc2E.js → chart-config-kpi-delta-Bf47hGqD.js} +9 -2
  71. package/dist/client/chunks/chart-config-kpi-delta-Bf47hGqD.js.map +1 -0
  72. package/dist/client/chunks/{chart-config-kpi-number-CeCkx7mC.js → chart-config-kpi-number-QTQRNgOi.js} +6 -2
  73. package/dist/client/chunks/chart-config-kpi-number-QTQRNgOi.js.map +1 -0
  74. package/dist/client/chunks/{chart-config-kpi-text-CImM3SvH.js → chart-config-kpi-text-BRze2eyh.js} +6 -2
  75. package/dist/client/chunks/chart-config-kpi-text-BRze2eyh.js.map +1 -0
  76. package/dist/client/chunks/{chart-config-line-BVKapAQK.js → chart-config-line-BFeCqmKH.js} +10 -2
  77. package/dist/client/chunks/chart-config-line-BFeCqmKH.js.map +1 -0
  78. package/dist/client/chunks/{chart-config-markdown-C-_g_8te.js → chart-config-markdown-EWYckwXv.js} +2 -2
  79. package/dist/client/chunks/{chart-config-markdown-C-_g_8te.js.map → chart-config-markdown-EWYckwXv.js.map} +1 -1
  80. package/dist/client/chunks/{chart-config-measure-profile-KTVV1gO3.js → chart-config-measure-profile-B9nIhqKR.js} +6 -2
  81. package/dist/client/chunks/chart-config-measure-profile-B9nIhqKR.js.map +1 -0
  82. package/dist/client/chunks/{chart-config-pie-BZxVl25X.js → chart-config-pie-6LHtEyMM.js} +9 -2
  83. package/dist/client/chunks/chart-config-pie-6LHtEyMM.js.map +1 -0
  84. package/dist/client/chunks/{chart-config-radar-B7FByX3t.js → chart-config-radar-BuLS6Inn.js} +9 -2
  85. package/dist/client/chunks/chart-config-radar-BuLS6Inn.js.map +1 -0
  86. package/dist/client/chunks/{chart-config-radial-bar-UfW_3yyX.js → chart-config-radial-bar-BP0eMohx.js} +9 -2
  87. package/dist/client/chunks/chart-config-radial-bar-BP0eMohx.js.map +1 -0
  88. package/dist/client/chunks/{chart-config-sankey-DGAThN9i.js → chart-config-sankey-CT8oGIGP.js} +2 -2
  89. package/dist/client/chunks/{chart-config-sankey-DGAThN9i.js.map → chart-config-sankey-CT8oGIGP.js.map} +1 -1
  90. package/dist/client/chunks/{chart-config-scatter-BVVJuOnt.js → chart-config-scatter-DOSpN07Z.js} +9 -2
  91. package/dist/client/chunks/chart-config-scatter-DOSpN07Z.js.map +1 -0
  92. package/dist/client/chunks/{chart-config-sunburst-utejM2YS.js → chart-config-sunburst-BSUX_YoB.js} +2 -2
  93. package/dist/client/chunks/{chart-config-sunburst-utejM2YS.js.map → chart-config-sunburst-BSUX_YoB.js.map} +1 -1
  94. package/dist/client/chunks/{chart-config-tree-map-IHp97OyV.js → chart-config-tree-map-D8GuAgVB.js} +9 -2
  95. package/dist/client/chunks/chart-config-tree-map-D8GuAgVB.js.map +1 -0
  96. package/dist/client/chunks/{chart-config-waterfall-BdqG1V-x.js → chart-config-waterfall-BDi7BoJP.js} +9 -2
  97. package/dist/client/chunks/chart-config-waterfall-BDi7BoJP.js.map +1 -0
  98. package/dist/client/chunks/{chart-data-table-zZtwLf55.js → chart-data-table-DT4uBZaq.js} +92 -90
  99. package/dist/client/chunks/{chart-data-table-zZtwLf55.js.map → chart-data-table-DT4uBZaq.js.map} +1 -1
  100. package/dist/client/chunks/{chart-funnel-COTJy8BP.js → chart-funnel-B9crR3b3.js} +3 -3
  101. package/dist/client/chunks/{chart-funnel-COTJy8BP.js.map → chart-funnel-B9crR3b3.js.map} +1 -1
  102. package/dist/client/chunks/{chart-gauge-C8lIneI0.js → chart-gauge-DAMFsicz.js} +3 -3
  103. package/dist/client/chunks/{chart-gauge-C8lIneI0.js.map → chart-gauge-DAMFsicz.js.map} +1 -1
  104. package/dist/client/chunks/{chart-heat-map-BJXt3RMt.js → chart-heat-map-BxgM_X1G.js} +3 -3
  105. package/dist/client/chunks/{chart-heat-map-BJXt3RMt.js.map → chart-heat-map-BxgM_X1G.js.map} +1 -1
  106. package/dist/client/chunks/{chart-kpi-delta-DHkNqufb.js → chart-kpi-delta-DJKL02Ut.js} +75 -73
  107. package/dist/client/chunks/{chart-kpi-delta-DHkNqufb.js.map → chart-kpi-delta-DJKL02Ut.js.map} +1 -1
  108. package/dist/client/chunks/{chart-kpi-number-BrXw7m-S.js → chart-kpi-number-CuNEYbRx.js} +66 -65
  109. package/dist/client/chunks/{chart-kpi-number-BrXw7m-S.js.map → chart-kpi-number-CuNEYbRx.js.map} +1 -1
  110. package/dist/client/chunks/{chart-kpi-text-D0plngLV.js → chart-kpi-text-u8FJaZDQ.js} +27 -26
  111. package/dist/client/chunks/{chart-kpi-text-D0plngLV.js.map → chart-kpi-text-u8FJaZDQ.js.map} +1 -1
  112. package/dist/client/chunks/{chart-line-DKvW32U-.js → chart-line-BZhzOjRl.js} +119 -118
  113. package/dist/client/chunks/chart-line-BZhzOjRl.js.map +1 -0
  114. package/dist/client/chunks/{chart-markdown-CJU2hUq3.js → chart-markdown-DEtjn8gx.js} +70 -69
  115. package/dist/client/chunks/chart-markdown-DEtjn8gx.js.map +1 -0
  116. package/dist/client/chunks/{chart-measure-profile-DNT_tbh4.js → chart-measure-profile-BnpIOS4Q.js} +4 -4
  117. package/dist/client/chunks/{chart-measure-profile-DNT_tbh4.js.map → chart-measure-profile-BnpIOS4Q.js.map} +1 -1
  118. package/dist/client/chunks/{chart-pie-CzYnncO-.js → chart-pie-CsdzxmSK.js} +4 -4
  119. package/dist/client/chunks/{chart-pie-CzYnncO-.js.map → chart-pie-CsdzxmSK.js.map} +1 -1
  120. package/dist/client/chunks/{chart-radar-8iAt3QZl.js → chart-radar-C_9RwMKw.js} +4 -4
  121. package/dist/client/chunks/{chart-radar-8iAt3QZl.js.map → chart-radar-C_9RwMKw.js.map} +1 -1
  122. package/dist/client/chunks/{chart-radial-bar-CJbG7RIe.js → chart-radial-bar-CewRelyQ.js} +4 -4
  123. package/dist/client/chunks/{chart-radial-bar-CJbG7RIe.js.map → chart-radial-bar-CewRelyQ.js.map} +1 -1
  124. package/dist/client/chunks/{chart-sankey-C-wLBUmb.js → chart-sankey-ItraHWH1.js} +3 -3
  125. package/dist/client/chunks/{chart-sankey-C-wLBUmb.js.map → chart-sankey-ItraHWH1.js.map} +1 -1
  126. package/dist/client/chunks/{chart-scatter-NMjD1lbW.js → chart-scatter-k2IJbO2Y.js} +4 -4
  127. package/dist/client/chunks/{chart-scatter-NMjD1lbW.js.map → chart-scatter-k2IJbO2Y.js.map} +1 -1
  128. package/dist/client/chunks/{chart-sunburst-HtJ-LJ7n.js → chart-sunburst-NsFRuqi9.js} +4 -4
  129. package/dist/client/chunks/{chart-sunburst-HtJ-LJ7n.js.map → chart-sunburst-NsFRuqi9.js.map} +1 -1
  130. package/dist/client/chunks/{chart-tree-map-CetaLMt8.js → chart-tree-map-Cj_ewpwJ.js} +4 -4
  131. package/dist/client/chunks/{chart-tree-map-CetaLMt8.js.map → chart-tree-map-Cj_ewpwJ.js.map} +1 -1
  132. package/dist/client/chunks/{chart-waterfall-ontNp1Sd.js → chart-waterfall-C-MTFcOz.js} +4 -4
  133. package/dist/client/chunks/{chart-waterfall-ontNp1Sd.js.map → chart-waterfall-C-MTFcOz.js.map} +1 -1
  134. package/dist/client/chunks/{charts-core-B5UXUg6_.js → charts-core-vZA3zPKb.js} +2 -2
  135. package/dist/client/chunks/{charts-core-B5UXUg6_.js.map → charts-core-vZA3zPKb.js.map} +1 -1
  136. package/dist/client/chunks/{core-Dk6z6kC0.js → core-Su6tIYhp.js} +5 -3
  137. package/dist/client/chunks/{core-Dk6z6kC0.js.map → core-Su6tIYhp.js.map} +1 -1
  138. package/dist/client/chunks/{dist-eZurnOde.js → dist-BTq3NoG3.js} +38 -32
  139. package/dist/client/chunks/dist-BTq3NoG3.js.map +1 -0
  140. package/dist/client/chunks/{en-US-5xPTdCXg.js → en-US-D-1JPTPv.js} +1 -1
  141. package/dist/client/chunks/{en-US-5xPTdCXg.js.map → en-US-D-1JPTPv.js.map} +1 -1
  142. package/dist/client/chunks/{exceljs.min-DaJsLlWM.js → exceljs.min-Dc1cBQ5l.js} +71 -45
  143. package/dist/client/chunks/{exceljs.min-DaJsLlWM.js.map → exceljs.min-Dc1cBQ5l.js.map} +1 -1
  144. package/dist/client/chunks/{javascript-DFvvCuoP.js → javascript-YXkoOgWa.js} +1 -1
  145. package/dist/client/chunks/{javascript-DFvvCuoP.js.map → javascript-YXkoOgWa.js.map} +1 -1
  146. package/dist/client/chunks/{json-BBm9TlrA.js → json-O7MKB_4V.js} +1 -1
  147. package/dist/client/chunks/{json-BBm9TlrA.js.map → json-O7MKB_4V.js.map} +1 -1
  148. package/dist/client/chunks/{nl-NL-DDf0OdfW.js → nl-NL-BErZMygi.js} +10 -3
  149. package/dist/client/chunks/nl-NL-BErZMygi.js.map +1 -0
  150. package/dist/client/chunks/{rolldown-runtime-CCl2IeXn.js → rolldown-runtime-CKnJJeip.js} +1 -1
  151. package/dist/client/chunks/{schema-visualization-cnB2xZxn.js → schema-visualization-BY9L2nBQ.js} +294 -290
  152. package/dist/client/chunks/{schema-visualization-cnB2xZxn.js.map → schema-visualization-BY9L2nBQ.js.map} +1 -1
  153. package/dist/client/chunks/{sql-k0GA6oZ_.js → sql-r2a-9CCK.js} +1 -1
  154. package/dist/client/chunks/{sql-k0GA6oZ_.js.map → sql-r2a-9CCK.js.map} +1 -1
  155. package/dist/client/chunks/{syntaxHighlighting-D8J6Yt9j.js → syntaxHighlighting-5zHcjn27.js} +2 -2
  156. package/dist/client/chunks/{syntaxHighlighting-D8J6Yt9j.js.map → syntaxHighlighting-5zHcjn27.js.map} +1 -1
  157. package/dist/client/chunks/{useDebounce-BOBSvhHy.js → useDebounce-DGfYXtkm.js} +4 -4
  158. package/dist/client/chunks/{useDebounce-BOBSvhHy.js.map → useDebounce-DGfYXtkm.js.map} +1 -1
  159. package/dist/client/chunks/{useExplainAI-B_Pi4eXW.js → useExplainAI-CD0KuKwY.js} +4 -4
  160. package/dist/client/chunks/{useExplainAI-B_Pi4eXW.js.map → useExplainAI-CD0KuKwY.js.map} +1 -1
  161. package/dist/client/chunks/{utils-BIuqPQuJ.js → utils-D2SCtAkZ.js} +2 -2
  162. package/dist/client/chunks/{utils-BIuqPQuJ.js.map → utils-D2SCtAkZ.js.map} +1 -1
  163. package/dist/client/chunks/{vendor-BxLCTfvm.js → vendor-CfR5hJGc.js} +3 -3
  164. package/dist/client/chunks/{vendor-BxLCTfvm.js.map → vendor-CfR5hJGc.js.map} +1 -1
  165. package/dist/client/components/AnalysisBuilder/types.d.ts +2 -2
  166. package/dist/client/components.js +3 -3
  167. package/dist/client/hooks.js +3 -3
  168. package/dist/client/icons.js +1 -1
  169. package/dist/client/index.js +15 -15
  170. package/dist/client/providers.js +1 -1
  171. package/dist/client/schema.js +1 -1
  172. package/dist/client/shared/chartDefaults.d.ts +5 -10
  173. package/dist/client/types.d.ts +1 -0
  174. package/dist/client/utils.js +6 -6
  175. package/dist/client-bundle-stats.html +1 -1
  176. package/dist/mcp-app/mcp-app.html +48 -48
  177. package/dist/server/index.cjs +7 -7
  178. package/dist/server/index.js +159 -16
  179. package/package.json +2 -2
  180. package/dist/adapters/mcp-transport-CkyawtUT.cjs +0 -40
  181. package/dist/adapters/mcp-transport-DSbd6M_u.js +0 -586
  182. package/dist/adapters/utils-DrWvXf0G.cjs +0 -128
  183. package/dist/client/chunks/DashboardEditModal-BBcB0E2g.js.map +0 -1
  184. package/dist/client/chunks/KpiDelta-D09hA_UJ.js +0 -2
  185. package/dist/client/chunks/KpiNumber-B7F9F9fC.js +0 -2
  186. package/dist/client/chunks/KpiText-C3ZXOF8b.js +0 -2
  187. package/dist/client/chunks/SchemaVisualization-DP4k1fPp.js +0 -2
  188. package/dist/client/chunks/SchemaVisualizationLazy-Brqv_PY9.js +0 -2
  189. package/dist/client/chunks/af-ZA-xDmO5F0s.js.map +0 -1
  190. package/dist/client/chunks/analysis-builder-0o1W-k3K.js.map +0 -1
  191. package/dist/client/chunks/analysis-builder-shared-Cz4KAlIC.js.map +0 -1
  192. package/dist/client/chunks/chart-activity-grid-VFFm85hC.js.map +0 -1
  193. package/dist/client/chunks/chart-area-CwwIHTmK.js.map +0 -1
  194. package/dist/client/chunks/chart-bar-Bmny922L.js.map +0 -1
  195. package/dist/client/chunks/chart-config-activity-grid-C-EkgYoa.js.map +0 -1
  196. package/dist/client/chunks/chart-config-area-CMZpbIah.js.map +0 -1
  197. package/dist/client/chunks/chart-config-bar-B8_V4YLg.js.map +0 -1
  198. package/dist/client/chunks/chart-config-box-plot-Dwj7sEbU.js.map +0 -1
  199. package/dist/client/chunks/chart-config-bubble-B0w0ZVp4.js.map +0 -1
  200. package/dist/client/chunks/chart-config-candlestick-Bvo3zeIn.js.map +0 -1
  201. package/dist/client/chunks/chart-config-gauge-C5ZiyZy7.js.map +0 -1
  202. package/dist/client/chunks/chart-config-heat-map-Cv8qNnVP.js.map +0 -1
  203. package/dist/client/chunks/chart-config-kpi-delta-BraHQc2E.js.map +0 -1
  204. package/dist/client/chunks/chart-config-kpi-number-CeCkx7mC.js.map +0 -1
  205. package/dist/client/chunks/chart-config-kpi-text-CImM3SvH.js.map +0 -1
  206. package/dist/client/chunks/chart-config-line-BVKapAQK.js.map +0 -1
  207. package/dist/client/chunks/chart-config-measure-profile-KTVV1gO3.js.map +0 -1
  208. package/dist/client/chunks/chart-config-pie-BZxVl25X.js.map +0 -1
  209. package/dist/client/chunks/chart-config-radar-B7FByX3t.js.map +0 -1
  210. package/dist/client/chunks/chart-config-radial-bar-UfW_3yyX.js.map +0 -1
  211. package/dist/client/chunks/chart-config-scatter-BVVJuOnt.js.map +0 -1
  212. package/dist/client/chunks/chart-config-tree-map-IHp97OyV.js.map +0 -1
  213. package/dist/client/chunks/chart-config-waterfall-BdqG1V-x.js.map +0 -1
  214. package/dist/client/chunks/chart-line-DKvW32U-.js.map +0 -1
  215. package/dist/client/chunks/chart-markdown-CJU2hUq3.js.map +0 -1
  216. package/dist/client/chunks/dist-eZurnOde.js.map +0 -1
  217. package/dist/client/chunks/nl-NL-DDf0OdfW.js.map +0 -1
@@ -1,12 +1,13 @@
1
- import { B as e, z as t } from "./chart-data-table-zZtwLf55.js";
2
- import { _ as n, k as r } from "./chart-activity-grid-VFFm85hC.js";
3
- import { a as i, i as a, r as o } from "./chart-area-CwwIHTmK.js";
4
- import { n as s } from "./chart-kpi-delta-DHkNqufb.js";
5
- import c, { useCallback as l, useEffect as u, useMemo as d, useRef as f, useState as p } from "react";
6
- import { jsx as m, jsxs as h } from "react/jsx-runtime";
1
+ import { n as e } from "./rolldown-runtime-CKnJJeip.js";
2
+ import { B as t, z as n } from "./chart-data-table-DT4uBZaq.js";
3
+ import { _ as r, k as i } from "./chart-activity-grid-Bdb8U_NC.js";
4
+ import { a, i as o, r as s } from "./chart-area-BZEnT-tf.js";
5
+ import { n as c } from "./chart-kpi-delta-DJKL02Ut.js";
6
+ import l, { useCallback as u, useEffect as d, useMemo as f, useRef as p, useState as m } from "react";
7
+ import { jsx as h, jsxs as g } from "react/jsx-runtime";
7
8
  //#region src/client/components/DataHistogram.tsx
8
- function g({ values: e, min: t, max: n, color: i = "#1f2937", bucketCount: a = 12, height: o = 32, formatValue: s = (e) => e.toString(), width: c, showAverageIndicator: l = !0, targetValue: u }) {
9
- let { t: d } = r(), f = Array(a).fill(0), p = n - t;
9
+ function _({ values: e, min: t, max: n, color: r = "#1f2937", bucketCount: a = 12, height: o = 32, formatValue: s = (e) => e.toString(), width: c, showAverageIndicator: l = !0, targetValue: u }) {
10
+ let { t: d } = i(), f = Array(a).fill(0), p = n - t;
10
11
  e.forEach((e) => {
11
12
  if (p === 0) f[Math.floor(a / 2)]++;
12
13
  else {
@@ -14,11 +15,11 @@ function g({ values: e, min: t, max: n, color: i = "#1f2937", bucketCount: a = 1
14
15
  n = Math.max(0, Math.min(a - 1, n)), f[n]++;
15
16
  }
16
17
  });
17
- let g = Math.max(...f), _ = e.reduce((e, t) => e + t, 0) / e.length, v = p === 0 ? 50 : (_ - t) / p * 100, y = u !== void 0 && p > 0 ? (u - t) / p * 100 : null;
18
- return /* @__PURE__ */ h("div", {
18
+ let m = Math.max(...f), _ = e.reduce((e, t) => e + t, 0) / e.length, v = p === 0 ? 50 : (_ - t) / p * 100, y = u !== void 0 && p > 0 ? (u - t) / p * 100 : null;
19
+ return /* @__PURE__ */ g("div", {
19
20
  className: "dc:flex dc:flex-col dc:items-center",
20
21
  children: [
21
- /* @__PURE__ */ h("div", {
22
+ /* @__PURE__ */ g("div", {
22
23
  className: "dc:relative dc:flex dc:items-end dc:justify-center dc:space-x-0.5",
23
24
  style: {
24
25
  height: `${o}px`,
@@ -27,18 +28,18 @@ function g({ values: e, min: t, max: n, color: i = "#1f2937", bucketCount: a = 1
27
28
  },
28
29
  children: [
29
30
  f.map((e, t) => {
30
- let n = g > 0 ? e / g : 0, r = .1;
31
- return /* @__PURE__ */ m("div", {
31
+ let n = m > 0 ? e / m : 0, i = .1;
32
+ return /* @__PURE__ */ h("div", {
32
33
  className: "dc:flex-1 dc:rounded-t-sm dc:transition-all dc:duration-300 dc:ease-out",
33
34
  style: {
34
- height: `${(e > 0 ? Math.max(r, n) : r) * o}px`,
35
- backgroundColor: i,
35
+ height: `${(e > 0 ? Math.max(i, n) : i) * o}px`,
36
+ backgroundColor: r,
36
37
  opacity: e > 0 ? .7 + n * .3 : .2
37
38
  },
38
39
  title: `${e} values in this range`
39
40
  }, t);
40
41
  }),
41
- l && /* @__PURE__ */ m("div", {
42
+ l && /* @__PURE__ */ h("div", {
42
43
  className: "dc:absolute dc:top-0 dc:bottom-0 dc:pointer-events-none",
43
44
  style: {
44
45
  left: `${v}%`,
@@ -49,7 +50,7 @@ function g({ values: e, min: t, max: n, color: i = "#1f2937", bucketCount: a = 1
49
50
  zIndex: 10
50
51
  },
51
52
  title: `Average: ${s(_)}`,
52
- children: /* @__PURE__ */ m("div", {
53
+ children: /* @__PURE__ */ h("div", {
53
54
  className: "dc:absolute dc:-top-1",
54
55
  style: {
55
56
  left: "50%",
@@ -62,7 +63,7 @@ function g({ values: e, min: t, max: n, color: i = "#1f2937", bucketCount: a = 1
62
63
  }
63
64
  })
64
65
  }),
65
- y !== null && u !== void 0 && /* @__PURE__ */ m("div", {
66
+ y !== null && u !== void 0 && /* @__PURE__ */ h("div", {
66
67
  className: "dc:absolute dc:top-0 dc:bottom-0 dc:pointer-events-none",
67
68
  style: {
68
69
  left: `${Math.max(0, Math.min(100, y))}%`,
@@ -73,7 +74,7 @@ function g({ values: e, min: t, max: n, color: i = "#1f2937", bucketCount: a = 1
73
74
  zIndex: 11
74
75
  },
75
76
  title: `Target: ${s(u)}`,
76
- children: /* @__PURE__ */ m("div", {
77
+ children: /* @__PURE__ */ h("div", {
77
78
  className: "dc:absolute dc:-top-1",
78
79
  style: {
79
80
  left: "50%",
@@ -88,15 +89,15 @@ function g({ values: e, min: t, max: n, color: i = "#1f2937", bucketCount: a = 1
88
89
  })
89
90
  ]
90
91
  }),
91
- /* @__PURE__ */ h("div", {
92
+ /* @__PURE__ */ g("div", {
92
93
  className: "dc:flex dc:justify-between dc:mt-2 dc:text-xs text-dc-text-muted",
93
94
  style: {
94
95
  width: c ? `${c}px` : "200px",
95
96
  minWidth: "200px"
96
97
  },
97
- children: [/* @__PURE__ */ m("span", { children: s(t) }), /* @__PURE__ */ m("span", { children: s(n) })]
98
+ children: [/* @__PURE__ */ h("span", { children: s(t) }), /* @__PURE__ */ h("span", { children: s(n) })]
98
99
  }),
99
- /* @__PURE__ */ m("div", {
100
+ /* @__PURE__ */ h("div", {
100
101
  className: "dc:text-center dc:mt-1 dc:text-xs text-dc-text-muted",
101
102
  children: d("dataHistogram.average", { count: e.length })
102
103
  })
@@ -105,30 +106,30 @@ function g({ values: e, min: t, max: n, color: i = "#1f2937", bucketCount: a = 1
105
106
  }
106
107
  //#endregion
107
108
  //#region src/client/components/charts/KpiNumber.tsx
108
- var _ = c.memo(function({ data: c, chartConfig: _, displayConfig: v = {}, queryObject: y, height: b = "100%", colorPalette: x }) {
109
- let { t: S } = r(), [C, w] = p(32), [T, E] = p(250), D = f(null), O = f(null), k = n(), A = d(() => _?.yAxis ? typeof _.yAxis == "string" ? [_.yAxis] : Array.isArray(_.yAxis) ? _.yAxis : [] : [], [_?.yAxis]), j = A[0] || "", M = y?.timeDimensions?.[0]?.dimension || void 0, N = d(() => {
110
- if (!c || c.length === 0) return [];
111
- let e = [...c];
112
- return M && (e = e.sort((e, t) => {
109
+ var v = /* @__PURE__ */ e({ default: () => y }), y = l.memo(function({ data: e, chartConfig: l, displayConfig: v = {}, queryObject: y, height: b = "100%", colorPalette: x }) {
110
+ let { t: S } = i(), [C, w] = m(32), [T, E] = m(250), D = p(null), O = p(null), k = r(), A = f(() => l?.yAxis ? typeof l.yAxis == "string" ? [l.yAxis] : Array.isArray(l.yAxis) ? l.yAxis : [] : [], [l?.yAxis]), j = A[0] || "", M = y?.timeDimensions?.[0]?.dimension || void 0, N = f(() => {
111
+ if (!e || e.length === 0) return [];
112
+ let t = [...e];
113
+ return M && (t = t.sort((e, t) => {
113
114
  let n = e[M], r = t[M];
114
115
  return n < r ? -1 : +(n > r);
115
- })), e;
116
- }, [c, M]), { useLastCompletePeriod: P = !0, skipLastPeriod: F = !1 } = v, { filteredData: I, excludedIncompletePeriod: L, skippedLastPeriod: R, granularity: z } = d(() => N.length === 0 ? {
116
+ })), t;
117
+ }, [e, M]), { useLastCompletePeriod: P = !0, skipLastPeriod: F = !1 } = v, { filteredData: I, excludedIncompletePeriod: L, skippedLastPeriod: R, granularity: z } = f(() => N.length === 0 ? {
117
118
  filteredData: [],
118
119
  excludedIncompletePeriod: !1,
119
120
  skippedLastPeriod: !1,
120
121
  granularity: void 0
121
- } : s(N, M, y, P, F), [
122
+ } : c(N, M, y, P, F), [
122
123
  N,
123
124
  M,
124
125
  y,
125
126
  P,
126
127
  F
127
- ]), B = I, V = d(() => !j || B.length === 0 ? [] : B.map((e) => {
128
+ ]), B = I, V = f(() => !j || B.length === 0 ? [] : B.map((e) => {
128
129
  if (e[j] !== void 0) return e[j];
129
130
  let t = Object.keys(e).filter((t) => typeof e[t] == "number" && !isNaN(e[t]));
130
131
  if (t.length > 0) return e[t[0]];
131
- }).filter((e) => e != null && !isNaN(Number(e))).map((e) => Number(e)), [B, j]), { avg: H, min: U, max: W } = d(() => V.length === 0 ? {
132
+ }).filter((e) => e != null && !isNaN(Number(e))).map((e) => Number(e)), [B, j]), { avg: H, min: U, max: W } = f(() => V.length === 0 ? {
132
133
  avg: 0,
133
134
  min: 0,
134
135
  max: 0
@@ -136,24 +137,24 @@ var _ = c.memo(function({ data: c, chartConfig: _, displayConfig: v = {}, queryO
136
137
  avg: V.reduce((e, t) => e + t, 0) / V.length,
137
138
  min: Math.min(...V),
138
139
  max: Math.max(...V)
139
- }, [V]), G = l((e) => {
140
+ }, [V]), G = u((e) => {
140
141
  if (v.formatValue) return v.formatValue(e);
141
142
  if (e == null) return "—";
142
143
  let t = v.decimals ?? 0, n = v.prefix ?? "", r;
143
144
  return r = Math.abs(e) >= 1e9 ? (e / 1e9).toFixed(t) + "B" : Math.abs(e) >= 1e6 ? (e / 1e6).toFixed(t) + "M" : Math.abs(e) >= 1e3 ? (e / 1e3).toFixed(t) + "K" : e.toFixed(t), n + r;
144
- }, [v]), K = V.length === 1 ? V[0] : H, q = V.length > 1, J = d(() => {
145
+ }, [v]), K = V.length === 1 ? V[0] : H, q = V.length > 1, J = f(() => {
145
146
  if (v.valueColorIndex !== void 0 && x?.colors) {
146
147
  let e = v.valueColorIndex;
147
148
  if (e >= 0 && e < x.colors.length) return x.colors[e];
148
149
  }
149
150
  return x?.colors?.[0] || "#1f2937";
150
- }, [v.valueColorIndex, x?.colors]), Y = d(() => i(v?.target || ""), [v?.target]), X = Y.length > 0 ? Y[0] : null, Z = X !== null && V.length > 0 ? o(K, X) : null, Q = d(() => Z === null ? "#6B7280" : Z >= 0 ? x?.colors?.[v.positiveColorIndex ?? 1] || "#10B981" : x?.colors?.[v.negativeColorIndex ?? 7] || "#EF4444", [
151
+ }, [v.valueColorIndex, x?.colors]), Y = f(() => a(v?.target || ""), [v?.target]), X = Y.length > 0 ? Y[0] : null, Z = X !== null && V.length > 0 ? s(K, X) : null, Q = f(() => Z === null ? "#6B7280" : Z >= 0 ? x?.colors?.[v.positiveColorIndex ?? 1] || "#10B981" : x?.colors?.[v.negativeColorIndex ?? 7] || "#EF4444", [
151
152
  Z,
152
153
  v.positiveColorIndex,
153
154
  v.negativeColorIndex,
154
155
  x?.colors
155
156
  ]);
156
- return u(() => {
157
+ return d(() => {
157
158
  let e = () => {
158
159
  if (D.current) {
159
160
  let e = D.current.getBoundingClientRect(), t = e.width, n = e.height;
@@ -173,23 +174,23 @@ var _ = c.memo(function({ data: c, chartConfig: _, displayConfig: v = {}, queryO
173
174
  return D.current && n.observe(D.current), () => {
174
175
  clearTimeout(t), n.disconnect();
175
176
  };
176
- }, [c, _]), !c || c.length === 0 ? /* @__PURE__ */ m("div", {
177
+ }, [e, l]), !e || e.length === 0 ? /* @__PURE__ */ h("div", {
177
178
  className: "dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full",
178
179
  style: {
179
180
  height: b === "100%" ? "100%" : b,
180
181
  minHeight: b === "100%" ? "200px" : void 0
181
182
  },
182
- children: /* @__PURE__ */ h("div", {
183
+ children: /* @__PURE__ */ g("div", {
183
184
  className: "dc:text-center text-dc-text-muted",
184
- children: [/* @__PURE__ */ m("div", {
185
+ children: [/* @__PURE__ */ h("div", {
185
186
  className: "dc:text-sm dc:font-semibold dc:mb-1",
186
187
  children: S("chart.runtime.noData")
187
- }), /* @__PURE__ */ m("div", {
188
+ }), /* @__PURE__ */ h("div", {
188
189
  className: "dc:text-xs text-dc-text-secondary",
189
190
  children: S("chart.runtime.noDataHint.kpi")
190
191
  })]
191
192
  })
192
- }) : A.length === 0 ? /* @__PURE__ */ m("div", {
193
+ }) : A.length === 0 ? /* @__PURE__ */ h("div", {
193
194
  className: "dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full",
194
195
  style: {
195
196
  height: b === "100%" ? "100%" : b,
@@ -198,17 +199,17 @@ var _ = c.memo(function({ data: c, chartConfig: _, displayConfig: v = {}, queryO
198
199
  color: "var(--dc-danger)",
199
200
  borderColor: "var(--dc-danger-border)"
200
201
  },
201
- children: /* @__PURE__ */ h("div", {
202
+ children: /* @__PURE__ */ g("div", {
202
203
  className: "dc:text-center",
203
- children: [/* @__PURE__ */ m("div", {
204
+ children: [/* @__PURE__ */ h("div", {
204
205
  className: "dc:text-sm dc:font-semibold dc:mb-1",
205
206
  children: S("chart.runtime.configError")
206
- }), /* @__PURE__ */ m("div", {
207
+ }), /* @__PURE__ */ h("div", {
207
208
  className: "dc:text-xs",
208
209
  children: S("chart.runtime.configErrorHint.noMeasures")
209
210
  })]
210
211
  })
211
- }) : V.length === 0 ? /* @__PURE__ */ h("div", {
212
+ }) : V.length === 0 ? /* @__PURE__ */ g("div", {
212
213
  ref: D,
213
214
  className: "dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full dc:h-full dc:p-4",
214
215
  style: {
@@ -216,7 +217,7 @@ var _ = c.memo(function({ data: c, chartConfig: _, displayConfig: v = {}, queryO
216
217
  minHeight: b === "100%" ? "200px" : void 0
217
218
  },
218
219
  children: [
219
- /* @__PURE__ */ m("div", {
220
+ /* @__PURE__ */ h("div", {
220
221
  className: "text-dc-text-secondary dc:font-bold dc:text-center dc:mb-3",
221
222
  style: {
222
223
  fontSize: "14px",
@@ -224,17 +225,17 @@ var _ = c.memo(function({ data: c, chartConfig: _, displayConfig: v = {}, queryO
224
225
  },
225
226
  children: k(j)
226
227
  }),
227
- /* @__PURE__ */ m("div", {
228
+ /* @__PURE__ */ h("div", {
228
229
  className: "dc:font-bold dc:leading-none text-dc-text-muted",
229
230
  style: { fontSize: `${C}px` },
230
231
  children: "—"
231
232
  }),
232
- /* @__PURE__ */ m("div", {
233
+ /* @__PURE__ */ h("div", {
233
234
  className: "dc:text-xs text-dc-text-muted dc:mt-2",
234
235
  children: "No data"
235
236
  })
236
237
  ]
237
- }) : /* @__PURE__ */ h("div", {
238
+ }) : /* @__PURE__ */ g("div", {
238
239
  ref: D,
239
240
  className: "dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full dc:h-full dc:p-4",
240
241
  style: {
@@ -242,27 +243,27 @@ var _ = c.memo(function({ data: c, chartConfig: _, displayConfig: v = {}, queryO
242
243
  minHeight: b === "100%" ? "200px" : void 0
243
244
  },
244
245
  children: [
245
- /* @__PURE__ */ h("div", {
246
+ /* @__PURE__ */ g("div", {
246
247
  className: "text-dc-text-secondary dc:font-bold dc:text-center dc:mb-3 dc:flex dc:items-center dc:justify-center dc:gap-1",
247
248
  style: {
248
249
  fontSize: "14px",
249
250
  lineHeight: "1.2"
250
251
  },
251
- children: [/* @__PURE__ */ m("span", { children: (() => {
252
+ children: [/* @__PURE__ */ h("span", { children: (() => {
252
253
  let e = k(j);
253
254
  return e && e.length > 1 ? e : j;
254
- })() }), (L || R) && /* @__PURE__ */ m("span", {
255
+ })() }), (L || R) && /* @__PURE__ */ h("span", {
255
256
  title: R ? `Excludes last ${z || "period"}` : `Excludes current incomplete ${z}`,
256
257
  className: "dc:cursor-help",
257
- children: /* @__PURE__ */ m(e, {
258
- icon: t,
258
+ children: /* @__PURE__ */ h(t, {
259
+ icon: n,
259
260
  className: "dc:w-4 dc:h-4 text-dc-text-muted dc:opacity-70"
260
261
  })
261
262
  })]
262
263
  }),
263
- /* @__PURE__ */ h("div", {
264
+ /* @__PURE__ */ g("div", {
264
265
  className: "dc:flex dc:items-center dc:justify-center dc:gap-4 dc:mb-3",
265
- children: [/* @__PURE__ */ m("div", {
266
+ children: [/* @__PURE__ */ h("div", {
266
267
  ref: O,
267
268
  className: "dc:font-bold dc:leading-none",
268
269
  style: {
@@ -270,17 +271,17 @@ var _ = c.memo(function({ data: c, chartConfig: _, displayConfig: v = {}, queryO
270
271
  color: J
271
272
  },
272
273
  children: G(K)
273
- }), X !== null && Z !== null && /* @__PURE__ */ h("div", {
274
+ }), X !== null && Z !== null && /* @__PURE__ */ g("div", {
274
275
  className: "dc:flex dc:flex-col dc:items-start",
275
- children: [/* @__PURE__ */ m("div", {
276
+ children: [/* @__PURE__ */ h("div", {
276
277
  className: "dc:font-semibold",
277
278
  style: {
278
279
  fontSize: `${Math.max(12, C * .3)}px`,
279
280
  color: Q,
280
281
  lineHeight: "1.2"
281
282
  },
282
- children: a(Z, 1)
283
- }), /* @__PURE__ */ h("div", {
283
+ children: o(Z, 1)
284
+ }), /* @__PURE__ */ g("div", {
284
285
  className: "text-dc-text-muted dc:text-xs",
285
286
  style: {
286
287
  opacity: .7,
@@ -290,7 +291,7 @@ var _ = c.memo(function({ data: c, chartConfig: _, displayConfig: v = {}, queryO
290
291
  })]
291
292
  })]
292
293
  }),
293
- v.suffix && !v.formatValue && /* @__PURE__ */ m("div", {
294
+ v.suffix && !v.formatValue && /* @__PURE__ */ h("div", {
294
295
  className: "text-dc-text-muted dc:text-center",
295
296
  style: {
296
297
  fontSize: "14px",
@@ -299,9 +300,9 @@ var _ = c.memo(function({ data: c, chartConfig: _, displayConfig: v = {}, queryO
299
300
  },
300
301
  children: v.suffix
301
302
  }),
302
- q && /* @__PURE__ */ m("div", {
303
+ q && /* @__PURE__ */ h("div", {
303
304
  className: "dc:mt-4",
304
- children: /* @__PURE__ */ m(g, {
305
+ children: /* @__PURE__ */ h(_, {
305
306
  values: V,
306
307
  min: U,
307
308
  max: W,
@@ -316,6 +317,6 @@ var _ = c.memo(function({ data: c, chartConfig: _, displayConfig: v = {}, queryO
316
317
  });
317
318
  });
318
319
  //#endregion
319
- export { g as n, _ as t };
320
+ export { _ as n, v as t };
320
321
 
321
- //# sourceMappingURL=chart-kpi-number-BrXw7m-S.js.map
322
+ //# sourceMappingURL=chart-kpi-number-CuNEYbRx.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-kpi-number-BrXw7m-S.js","names":[],"sources":["../../../src/client/components/DataHistogram.tsx","../../../src/client/components/charts/KpiNumber.tsx"],"sourcesContent":["\nimport { useTranslation } from '../hooks/useTranslation'\n\ninterface DataHistogramProps {\n /** Array of numeric values to create histogram from */\n values: number[]\n /** Minimum value in the dataset */\n min: number\n /** Maximum value in the dataset */\n max: number\n /** Color for the histogram bars */\n color?: string\n /** Number of buckets/bars to create (default: 12) */\n bucketCount?: number\n /** Height of the histogram in pixels (default: 32) */\n height?: number\n /** Format function for min/max labels */\n formatValue?: (value: number) => string\n /** Width of the histogram to match text above */\n width?: number\n /** Whether to show average indicator line (default: true) */\n showAverageIndicator?: boolean\n /** Target value to show as green line */\n targetValue?: number\n}\n\n/**\n * Reusable histogram component that shows the distribution of actual data values\n */\nexport default function DataHistogram({\n values,\n min,\n max,\n color = '#1f2937',\n bucketCount = 12,\n height = 32,\n formatValue = (val) => val.toString(),\n width,\n showAverageIndicator = true,\n targetValue\n}: DataHistogramProps) {\n const { t } = useTranslation()\n // Create histogram buckets from actual data\n const buckets = new Array(bucketCount).fill(0)\n const range = max - min\n \n // Distribute actual values into buckets\n values.forEach(value => {\n if (range === 0) {\n // All values are the same, put everything in middle bucket\n buckets[Math.floor(bucketCount / 2)]++\n } else {\n // Calculate which bucket this value belongs to\n let bucketIndex = Math.floor(((value - min) / range) * (bucketCount - 1))\n // Clamp to valid bucket range\n bucketIndex = Math.max(0, Math.min(bucketCount - 1, bucketIndex))\n buckets[bucketIndex]++\n }\n })\n \n // Find max bucket count for normalization\n const maxBucketCount = Math.max(...buckets)\n \n // Calculate average for indicator positioning\n const average = values.reduce((sum, val) => sum + val, 0) / values.length\n \n // Calculate average position as percentage of histogram width\n const averagePosition = range === 0 ? 50 : ((average - min) / range) * 100\n \n // Calculate target position if target value is provided\n const targetPosition = targetValue !== undefined && range > 0 \n ? ((targetValue - min) / range) * 100 \n : null\n\n return (\n <div className=\"dc:flex dc:flex-col dc:items-center\">\n {/* Horizontal bars representing actual data distribution */}\n <div \n className=\"dc:relative dc:flex dc:items-end dc:justify-center dc:space-x-0.5\" \n style={{ \n height: `${height}px`,\n width: width ? `${width}px` : '200px',\n minWidth: '200px'\n }}\n >\n {buckets.map((count, i) => {\n // Normalize height based on actual data frequency\n const normalizedHeight = maxBucketCount > 0 ? count / maxBucketCount : 0\n const minHeight = 0.1 // minimum height for empty buckets\n const displayHeight = count > 0 ? Math.max(minHeight, normalizedHeight) : minHeight\n \n return (\n <div\n key={i}\n className=\"dc:flex-1 dc:rounded-t-sm dc:transition-all dc:duration-300 dc:ease-out\"\n style={{\n height: `${displayHeight * height}px`,\n backgroundColor: color,\n opacity: count > 0 ? 0.7 + (normalizedHeight * 0.3) : 0.2 // higher opacity for buckets with data\n }}\n title={`${count} values in this range`} // tooltip showing actual count\n />\n )\n })}\n \n {/* Average indicator line */}\n {showAverageIndicator && (\n <div\n className=\"dc:absolute dc:top-0 dc:bottom-0 dc:pointer-events-none\"\n style={{\n left: `${averagePosition}%`,\n transform: 'translateX(-50%)',\n width: '2px',\n backgroundColor: '#ef4444',\n opacity: 0.8,\n zIndex: 10\n }}\n title={`Average: ${formatValue(average)}`}\n >\n {/* Small triangle at top to indicate average */}\n <div\n className=\"dc:absolute dc:-top-1\"\n style={{\n left: '50%',\n transform: 'translateX(-50%)',\n width: '0',\n height: '0',\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderTop: '6px solid #ef4444'\n }}\n />\n </div>\n )}\n \n {/* Target indicator line */}\n {targetPosition !== null && targetValue !== undefined && (\n <div\n className=\"dc:absolute dc:top-0 dc:bottom-0 dc:pointer-events-none\"\n style={{\n left: `${Math.max(0, Math.min(100, targetPosition))}%`,\n transform: 'translateX(-50%)',\n width: '2px',\n backgroundColor: '#10b981',\n opacity: 0.8,\n zIndex: 11\n }}\n title={`Target: ${formatValue(targetValue)}`}\n >\n {/* Small triangle at top to indicate target */}\n <div\n className=\"dc:absolute dc:-top-1\"\n style={{\n left: '50%',\n transform: 'translateX(-50%)',\n width: '0',\n height: '0',\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderTop: '6px solid #10b981'\n }}\n />\n </div>\n )}\n </div>\n \n {/* Min/Max values aligned with histogram width */}\n <div\n className=\"dc:flex dc:justify-between dc:mt-2 dc:text-xs text-dc-text-muted\"\n style={{\n width: width ? `${width}px` : '200px',\n minWidth: '200px'\n }}\n >\n <span>{formatValue(min)}</span>\n <span>{formatValue(max)}</span>\n </div>\n\n {/* Average indicator */}\n <div className=\"dc:text-center dc:mt-1 dc:text-xs text-dc-text-muted\">\n {t('dataHistogram.average', { count: values.length })}\n </div>\n </div>\n )\n}\n","import React, { useState, useRef, useEffect, useMemo, useCallback } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { Icon } from '@iconify/react'\nimport infoCircleIcon from '@iconify-icons/tabler/info-circle'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport DataHistogram from '../DataHistogram'\nimport { parseTargetValues, calculateVariance, formatVariance } from '../../utils/targetUtils'\nimport { filterIncompletePeriod } from '../../utils/periodUtils'\nimport type { ChartProps } from '../../types'\n\nconst KpiNumber = React.memo(function KpiNumber({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const { t } = useTranslation()\n const [fontSize, setFontSize] = useState(32)\n const [textWidth, setTextWidth] = useState(250)\n const containerRef = useRef<HTMLDivElement>(null)\n const valueRef = useRef<HTMLDivElement>(null)\n\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n\n // Extract value field from chart config - handle both string and array formats\n const valueFields = useMemo(() => {\n if (!chartConfig?.yAxis) return []\n if (typeof chartConfig.yAxis === 'string') return [chartConfig.yAxis]\n if (Array.isArray(chartConfig.yAxis)) return chartConfig.yAxis\n return []\n }, [chartConfig?.yAxis])\n\n const valueField = valueFields[0] || '' // Use first measure field\n\n // Get time dimension field if present (for incomplete period filtering)\n const timeDimensionField = queryObject?.timeDimensions?.[0]?.dimension || undefined\n\n // Memoize sorted data to prevent recalculation on every render\n const sortedData = useMemo(() => {\n if (!data || data.length === 0) return []\n let sorted = [...data]\n if (timeDimensionField) {\n sorted = sorted.sort((a, b) => {\n const aVal = a[timeDimensionField]\n const bVal = b[timeDimensionField]\n if (aVal < bVal) return -1\n if (aVal > bVal) return 1\n return 0\n })\n }\n return sorted\n }, [data, timeDimensionField])\n\n // Filter out incomplete or last period if enabled\n const { useLastCompletePeriod = true, skipLastPeriod = false } = displayConfig\n\n // Memoize filtered data\n const {\n filteredData,\n excludedIncompletePeriod,\n skippedLastPeriod,\n granularity\n } = useMemo(() => {\n if (sortedData.length === 0) {\n return { filteredData: [], excludedIncompletePeriod: false, skippedLastPeriod: false, granularity: undefined }\n }\n return filterIncompletePeriod(sortedData, timeDimensionField, queryObject, useLastCompletePeriod, skipLastPeriod)\n }, [sortedData, timeDimensionField, queryObject, useLastCompletePeriod, skipLastPeriod])\n\n // Use filtered data for calculations\n const dataToUse = filteredData\n\n // Memoize value extraction to prevent recalculation\n const values = useMemo(() => {\n if (!valueField || dataToUse.length === 0) return []\n\n const rawValues = dataToUse.map(row => {\n // Try direct field access first\n if (row[valueField] !== undefined) {\n return row[valueField]\n }\n\n // If not found, try finding the first numeric field as fallback\n const numericFields = Object.keys(row).filter(key =>\n typeof row[key] === 'number' && !isNaN(row[key])\n )\n\n if (numericFields.length > 0) {\n return row[numericFields[0]]\n }\n\n return undefined\n })\n\n return rawValues\n .filter(val => val !== null && val !== undefined && !isNaN(Number(val)))\n .map(val => Number(val))\n }, [dataToUse, valueField])\n\n // Memoize statistics calculations\n const { avg, min, max } = useMemo(() => {\n if (values.length === 0) return { avg: 0, min: 0, max: 0 }\n const sum = values.reduce((acc, val) => acc + val, 0)\n const avg = sum / values.length\n const min = Math.min(...values)\n const max = Math.max(...values)\n return { avg, min, max }\n }, [values])\n\n // Memoize format function to prevent re-creating on every render\n const formatNumber = useCallback((value: number | null | undefined): string => {\n // If custom formatValue is provided, use it exclusively\n if (displayConfig.formatValue) {\n return displayConfig.formatValue(value)\n }\n\n // Null handling: Show placeholder for missing data\n if (value === null || value === undefined) {\n return '—'\n }\n\n const decimals = displayConfig.decimals ?? 0\n const prefix = displayConfig.prefix ?? ''\n\n let formattedValue: string\n\n if (Math.abs(value) >= 1e9) {\n formattedValue = (value / 1e9).toFixed(decimals) + 'B'\n } else if (Math.abs(value) >= 1e6) {\n formattedValue = (value / 1e6).toFixed(decimals) + 'M'\n } else if (Math.abs(value) >= 1e3) {\n formattedValue = (value / 1e3).toFixed(decimals) + 'K'\n } else {\n formattedValue = value.toFixed(decimals)\n }\n\n return prefix + formattedValue\n }, [displayConfig])\n\n const mainValue = values.length === 1 ? values[0] : avg\n const showStats = values.length > 1\n\n // Memoize color calculation to prevent re-creating function on every render\n const valueColor = useMemo((): string => {\n if (displayConfig.valueColorIndex !== undefined && colorPalette?.colors) {\n const colorIndex = displayConfig.valueColorIndex\n if (colorIndex >= 0 && colorIndex < colorPalette.colors.length) {\n return colorPalette.colors[colorIndex]\n }\n }\n // Default to first color in palette if available, otherwise fallback to dark gray\n return colorPalette?.colors?.[0] || '#1f2937'\n }, [displayConfig.valueColorIndex, colorPalette?.colors])\n\n // Process target values for variance calculation\n const targetValues = useMemo(() => parseTargetValues(displayConfig?.target || ''), [displayConfig?.target])\n const targetValue = targetValues.length > 0 ? targetValues[0] : null // Use first target value\n const variance = targetValue !== null && values.length > 0 ? calculateVariance(mainValue, targetValue) : null\n\n // Memoize variance color calculation\n const varianceColor = useMemo((): string => {\n if (variance === null) return '#6B7280' // Gray for no target\n\n if (variance >= 0) {\n // Positive variance - use positive color from palette\n const positiveIndex = displayConfig.positiveColorIndex ?? 1\n return colorPalette?.colors?.[positiveIndex] || '#10B981' // Green fallback\n } else {\n // Negative variance - use negative color from palette\n const negativeIndex = displayConfig.negativeColorIndex ?? 7\n return colorPalette?.colors?.[negativeIndex] || '#EF4444' // Red fallback\n }\n }, [variance, displayConfig.positiveColorIndex, displayConfig.negativeColorIndex, colorPalette?.colors])\n\n // Calculate font size and text width based on container dimensions\n useEffect(() => {\n const updateDimensions = () => {\n if (containerRef.current) {\n const container = containerRef.current\n const rect = container.getBoundingClientRect()\n const containerWidth = rect.width\n const containerHeight = rect.height\n\n if (containerWidth > 0 && containerHeight > 0) {\n // Calculate font size based on container dimensions\n // For KPI displays, we want the text to be large and prominent\n // Reserve space for the label by using more conservative sizing\n const widthBasedSize = containerWidth / 5\n const heightBasedSize = containerHeight / 4 // More conservative to leave room for label\n const baseFontSize = Math.min(widthBasedSize, heightBasedSize)\n const clampedFontSize = Math.max(24, Math.min(baseFontSize, 120)) // Lower max to ensure label fits\n setFontSize(clampedFontSize)\n\n // Use a timeout to measure text width after font size is applied\n setTimeout(() => {\n if (valueRef.current) {\n const textRect = valueRef.current.getBoundingClientRect()\n const measuredWidth = textRect.width\n // Ensure we have a minimum width and use container width as fallback\n const effectiveWidth = Math.max(measuredWidth, Math.min(containerWidth * 0.6, 300))\n setTextWidth(effectiveWidth)\n }\n }, 10)\n }\n }\n }\n\n // Initial calculation - reduce delay for faster initial render\n const timer = setTimeout(updateDimensions, 50)\n\n const resizeObserver = new ResizeObserver(() => {\n // Debounce the resize updates\n setTimeout(updateDimensions, 10)\n })\n\n if (containerRef.current) {\n resizeObserver.observe(containerRef.current)\n }\n\n return () => {\n clearTimeout(timer)\n resizeObserver.disconnect()\n }\n }, [data, chartConfig])\n\n // Early returns AFTER all hooks\n if (!data || data.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n <div className=\"dc:text-center text-dc-text-muted\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.noData')}</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.noDataHint.kpi')}</div>\n </div>\n </div>\n )\n }\n\n if (valueFields.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined,\n backgroundColor: 'var(--dc-danger-bg)',\n color: 'var(--dc-danger)',\n borderColor: 'var(--dc-danger-border)'\n }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.configError')}</div>\n <div className=\"dc:text-xs\">{t('chart.runtime.configErrorHint.noMeasures')}</div>\n </div>\n </div>\n )\n }\n\n // Null handling: If all values are null, show placeholder instead of error\n if (values.length === 0) {\n return (\n <div\n ref={containerRef}\n className=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full dc:h-full dc:p-4\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {/* Field Label */}\n <div\n className=\"text-dc-text-secondary dc:font-bold dc:text-center dc:mb-3\"\n style={{\n fontSize: '14px',\n lineHeight: '1.2'\n }}\n >\n {getFieldLabel(valueField)}\n </div>\n\n {/* No Data Placeholder */}\n <div\n className=\"dc:font-bold dc:leading-none text-dc-text-muted\"\n style={{\n fontSize: `${fontSize}px`\n }}\n >\n —\n </div>\n\n <div className=\"dc:text-xs text-dc-text-muted dc:mt-2\">No data</div>\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n className=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full dc:h-full dc:p-4\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {/* Field Label - Bolder and bigger */}\n <div\n className=\"text-dc-text-secondary dc:font-bold dc:text-center dc:mb-3 dc:flex dc:items-center dc:justify-center dc:gap-1\"\n style={{\n fontSize: '14px',\n lineHeight: '1.2'\n }}\n >\n <span>\n {(() => {\n const label = getFieldLabel(valueField)\n // Temporary fix: if label seems wrong, use the field name directly\n const displayLabel = (label && label.length > 1) ? label : valueField\n return displayLabel\n })()}\n </span>\n {(excludedIncompletePeriod || skippedLastPeriod) && (\n <span\n title={skippedLastPeriod\n ? `Excludes last ${granularity || 'period'}`\n : `Excludes current incomplete ${granularity}`}\n className=\"dc:cursor-help\"\n >\n <Icon icon={infoCircleIcon} className=\"dc:w-4 dc:h-4 text-dc-text-muted dc:opacity-70\" />\n </span>\n )}\n </div>\n\n {/* Main KPI Value and Variance - Horizontal layout */}\n <div className=\"dc:flex dc:items-center dc:justify-center dc:gap-4 dc:mb-3\">\n <div\n ref={valueRef}\n className=\"dc:font-bold dc:leading-none\"\n style={{\n fontSize: `${fontSize}px`,\n color: valueColor\n }}\n >\n {formatNumber(mainValue)}\n </div>\n\n {/* Target Variance Display - To the right of main value */}\n {targetValue !== null && variance !== null && (\n <div className=\"dc:flex dc:flex-col dc:items-start\">\n <div\n className=\"dc:font-semibold\"\n style={{\n fontSize: `${Math.max(12, fontSize * 0.3)}px`,\n color: varianceColor,\n lineHeight: '1.2'\n }}\n >\n {formatVariance(variance, 1)}\n </div>\n <div\n className=\"text-dc-text-muted dc:text-xs\"\n style={{\n opacity: 0.7,\n fontSize: `${Math.max(10, fontSize * 0.2)}px`\n }}\n >\n vs {formatNumber(targetValue)}\n </div>\n </div>\n )}\n </div>\n\n {/* Unit/Suffix - Larger, not bold (hidden when formatValue is provided) */}\n {displayConfig.suffix && !displayConfig.formatValue && (\n <div\n className=\"text-dc-text-muted dc:text-center\"\n style={{\n fontSize: '14px',\n lineHeight: '1.2',\n opacity: 0.8\n }}\n >\n {displayConfig.suffix}\n </div>\n )}\n\n {/* Data Histogram for multiple values */}\n {showStats && (\n <div className=\"dc:mt-4\">\n <DataHistogram\n values={values}\n min={min}\n max={max}\n color={valueColor}\n formatValue={formatNumber}\n height={24}\n width={textWidth}\n targetValue={targetValue || undefined}\n />\n </div>\n )}\n </div>\n )\n})\n\nexport default KpiNumber\n"],"mappings":"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"}
1
+ {"version":3,"file":"chart-kpi-number-CuNEYbRx.js","names":[],"sources":["../../../src/client/components/DataHistogram.tsx","../../../src/client/components/charts/KpiNumber.tsx"],"sourcesContent":["\nimport { useTranslation } from '../hooks/useTranslation'\n\ninterface DataHistogramProps {\n /** Array of numeric values to create histogram from */\n values: number[]\n /** Minimum value in the dataset */\n min: number\n /** Maximum value in the dataset */\n max: number\n /** Color for the histogram bars */\n color?: string\n /** Number of buckets/bars to create (default: 12) */\n bucketCount?: number\n /** Height of the histogram in pixels (default: 32) */\n height?: number\n /** Format function for min/max labels */\n formatValue?: (value: number) => string\n /** Width of the histogram to match text above */\n width?: number\n /** Whether to show average indicator line (default: true) */\n showAverageIndicator?: boolean\n /** Target value to show as green line */\n targetValue?: number\n}\n\n/**\n * Reusable histogram component that shows the distribution of actual data values\n */\nexport default function DataHistogram({\n values,\n min,\n max,\n color = '#1f2937',\n bucketCount = 12,\n height = 32,\n formatValue = (val) => val.toString(),\n width,\n showAverageIndicator = true,\n targetValue\n}: DataHistogramProps) {\n const { t } = useTranslation()\n // Create histogram buckets from actual data\n const buckets = new Array(bucketCount).fill(0)\n const range = max - min\n \n // Distribute actual values into buckets\n values.forEach(value => {\n if (range === 0) {\n // All values are the same, put everything in middle bucket\n buckets[Math.floor(bucketCount / 2)]++\n } else {\n // Calculate which bucket this value belongs to\n let bucketIndex = Math.floor(((value - min) / range) * (bucketCount - 1))\n // Clamp to valid bucket range\n bucketIndex = Math.max(0, Math.min(bucketCount - 1, bucketIndex))\n buckets[bucketIndex]++\n }\n })\n \n // Find max bucket count for normalization\n const maxBucketCount = Math.max(...buckets)\n \n // Calculate average for indicator positioning\n const average = values.reduce((sum, val) => sum + val, 0) / values.length\n \n // Calculate average position as percentage of histogram width\n const averagePosition = range === 0 ? 50 : ((average - min) / range) * 100\n \n // Calculate target position if target value is provided\n const targetPosition = targetValue !== undefined && range > 0 \n ? ((targetValue - min) / range) * 100 \n : null\n\n return (\n <div className=\"dc:flex dc:flex-col dc:items-center\">\n {/* Horizontal bars representing actual data distribution */}\n <div \n className=\"dc:relative dc:flex dc:items-end dc:justify-center dc:space-x-0.5\" \n style={{ \n height: `${height}px`,\n width: width ? `${width}px` : '200px',\n minWidth: '200px'\n }}\n >\n {buckets.map((count, i) => {\n // Normalize height based on actual data frequency\n const normalizedHeight = maxBucketCount > 0 ? count / maxBucketCount : 0\n const minHeight = 0.1 // minimum height for empty buckets\n const displayHeight = count > 0 ? Math.max(minHeight, normalizedHeight) : minHeight\n \n return (\n <div\n key={i}\n className=\"dc:flex-1 dc:rounded-t-sm dc:transition-all dc:duration-300 dc:ease-out\"\n style={{\n height: `${displayHeight * height}px`,\n backgroundColor: color,\n opacity: count > 0 ? 0.7 + (normalizedHeight * 0.3) : 0.2 // higher opacity for buckets with data\n }}\n title={`${count} values in this range`} // tooltip showing actual count\n />\n )\n })}\n \n {/* Average indicator line */}\n {showAverageIndicator && (\n <div\n className=\"dc:absolute dc:top-0 dc:bottom-0 dc:pointer-events-none\"\n style={{\n left: `${averagePosition}%`,\n transform: 'translateX(-50%)',\n width: '2px',\n backgroundColor: '#ef4444',\n opacity: 0.8,\n zIndex: 10\n }}\n title={`Average: ${formatValue(average)}`}\n >\n {/* Small triangle at top to indicate average */}\n <div\n className=\"dc:absolute dc:-top-1\"\n style={{\n left: '50%',\n transform: 'translateX(-50%)',\n width: '0',\n height: '0',\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderTop: '6px solid #ef4444'\n }}\n />\n </div>\n )}\n \n {/* Target indicator line */}\n {targetPosition !== null && targetValue !== undefined && (\n <div\n className=\"dc:absolute dc:top-0 dc:bottom-0 dc:pointer-events-none\"\n style={{\n left: `${Math.max(0, Math.min(100, targetPosition))}%`,\n transform: 'translateX(-50%)',\n width: '2px',\n backgroundColor: '#10b981',\n opacity: 0.8,\n zIndex: 11\n }}\n title={`Target: ${formatValue(targetValue)}`}\n >\n {/* Small triangle at top to indicate target */}\n <div\n className=\"dc:absolute dc:-top-1\"\n style={{\n left: '50%',\n transform: 'translateX(-50%)',\n width: '0',\n height: '0',\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderTop: '6px solid #10b981'\n }}\n />\n </div>\n )}\n </div>\n \n {/* Min/Max values aligned with histogram width */}\n <div\n className=\"dc:flex dc:justify-between dc:mt-2 dc:text-xs text-dc-text-muted\"\n style={{\n width: width ? `${width}px` : '200px',\n minWidth: '200px'\n }}\n >\n <span>{formatValue(min)}</span>\n <span>{formatValue(max)}</span>\n </div>\n\n {/* Average indicator */}\n <div className=\"dc:text-center dc:mt-1 dc:text-xs text-dc-text-muted\">\n {t('dataHistogram.average', { count: values.length })}\n </div>\n </div>\n )\n}\n","import React, { useState, useRef, useEffect, useMemo, useCallback } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { Icon } from '@iconify/react'\nimport infoCircleIcon from '@iconify-icons/tabler/info-circle'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport DataHistogram from '../DataHistogram'\nimport { parseTargetValues, calculateVariance, formatVariance } from '../../utils/targetUtils'\nimport { filterIncompletePeriod } from '../../utils/periodUtils'\nimport type { ChartProps } from '../../types'\n\nconst KpiNumber = React.memo(function KpiNumber({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const { t } = useTranslation()\n const [fontSize, setFontSize] = useState(32)\n const [textWidth, setTextWidth] = useState(250)\n const containerRef = useRef<HTMLDivElement>(null)\n const valueRef = useRef<HTMLDivElement>(null)\n\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n\n // Extract value field from chart config - handle both string and array formats\n const valueFields = useMemo(() => {\n if (!chartConfig?.yAxis) return []\n if (typeof chartConfig.yAxis === 'string') return [chartConfig.yAxis]\n if (Array.isArray(chartConfig.yAxis)) return chartConfig.yAxis\n return []\n }, [chartConfig?.yAxis])\n\n const valueField = valueFields[0] || '' // Use first measure field\n\n // Get time dimension field if present (for incomplete period filtering)\n const timeDimensionField = queryObject?.timeDimensions?.[0]?.dimension || undefined\n\n // Memoize sorted data to prevent recalculation on every render\n const sortedData = useMemo(() => {\n if (!data || data.length === 0) return []\n let sorted = [...data]\n if (timeDimensionField) {\n sorted = sorted.sort((a, b) => {\n const aVal = a[timeDimensionField]\n const bVal = b[timeDimensionField]\n if (aVal < bVal) return -1\n if (aVal > bVal) return 1\n return 0\n })\n }\n return sorted\n }, [data, timeDimensionField])\n\n // Filter out incomplete or last period if enabled\n const { useLastCompletePeriod = true, skipLastPeriod = false } = displayConfig\n\n // Memoize filtered data\n const {\n filteredData,\n excludedIncompletePeriod,\n skippedLastPeriod,\n granularity\n } = useMemo(() => {\n if (sortedData.length === 0) {\n return { filteredData: [], excludedIncompletePeriod: false, skippedLastPeriod: false, granularity: undefined }\n }\n return filterIncompletePeriod(sortedData, timeDimensionField, queryObject, useLastCompletePeriod, skipLastPeriod)\n }, [sortedData, timeDimensionField, queryObject, useLastCompletePeriod, skipLastPeriod])\n\n // Use filtered data for calculations\n const dataToUse = filteredData\n\n // Memoize value extraction to prevent recalculation\n const values = useMemo(() => {\n if (!valueField || dataToUse.length === 0) return []\n\n const rawValues = dataToUse.map(row => {\n // Try direct field access first\n if (row[valueField] !== undefined) {\n return row[valueField]\n }\n\n // If not found, try finding the first numeric field as fallback\n const numericFields = Object.keys(row).filter(key =>\n typeof row[key] === 'number' && !isNaN(row[key])\n )\n\n if (numericFields.length > 0) {\n return row[numericFields[0]]\n }\n\n return undefined\n })\n\n return rawValues\n .filter(val => val !== null && val !== undefined && !isNaN(Number(val)))\n .map(val => Number(val))\n }, [dataToUse, valueField])\n\n // Memoize statistics calculations\n const { avg, min, max } = useMemo(() => {\n if (values.length === 0) return { avg: 0, min: 0, max: 0 }\n const sum = values.reduce((acc, val) => acc + val, 0)\n const avg = sum / values.length\n const min = Math.min(...values)\n const max = Math.max(...values)\n return { avg, min, max }\n }, [values])\n\n // Memoize format function to prevent re-creating on every render\n const formatNumber = useCallback((value: number | null | undefined): string => {\n // If custom formatValue is provided, use it exclusively\n if (displayConfig.formatValue) {\n return displayConfig.formatValue(value)\n }\n\n // Null handling: Show placeholder for missing data\n if (value === null || value === undefined) {\n return '—'\n }\n\n const decimals = displayConfig.decimals ?? 0\n const prefix = displayConfig.prefix ?? ''\n\n let formattedValue: string\n\n if (Math.abs(value) >= 1e9) {\n formattedValue = (value / 1e9).toFixed(decimals) + 'B'\n } else if (Math.abs(value) >= 1e6) {\n formattedValue = (value / 1e6).toFixed(decimals) + 'M'\n } else if (Math.abs(value) >= 1e3) {\n formattedValue = (value / 1e3).toFixed(decimals) + 'K'\n } else {\n formattedValue = value.toFixed(decimals)\n }\n\n return prefix + formattedValue\n }, [displayConfig])\n\n const mainValue = values.length === 1 ? values[0] : avg\n const showStats = values.length > 1\n\n // Memoize color calculation to prevent re-creating function on every render\n const valueColor = useMemo((): string => {\n if (displayConfig.valueColorIndex !== undefined && colorPalette?.colors) {\n const colorIndex = displayConfig.valueColorIndex\n if (colorIndex >= 0 && colorIndex < colorPalette.colors.length) {\n return colorPalette.colors[colorIndex]\n }\n }\n // Default to first color in palette if available, otherwise fallback to dark gray\n return colorPalette?.colors?.[0] || '#1f2937'\n }, [displayConfig.valueColorIndex, colorPalette?.colors])\n\n // Process target values for variance calculation\n const targetValues = useMemo(() => parseTargetValues(displayConfig?.target || ''), [displayConfig?.target])\n const targetValue = targetValues.length > 0 ? targetValues[0] : null // Use first target value\n const variance = targetValue !== null && values.length > 0 ? calculateVariance(mainValue, targetValue) : null\n\n // Memoize variance color calculation\n const varianceColor = useMemo((): string => {\n if (variance === null) return '#6B7280' // Gray for no target\n\n if (variance >= 0) {\n // Positive variance - use positive color from palette\n const positiveIndex = displayConfig.positiveColorIndex ?? 1\n return colorPalette?.colors?.[positiveIndex] || '#10B981' // Green fallback\n } else {\n // Negative variance - use negative color from palette\n const negativeIndex = displayConfig.negativeColorIndex ?? 7\n return colorPalette?.colors?.[negativeIndex] || '#EF4444' // Red fallback\n }\n }, [variance, displayConfig.positiveColorIndex, displayConfig.negativeColorIndex, colorPalette?.colors])\n\n // Calculate font size and text width based on container dimensions\n useEffect(() => {\n const updateDimensions = () => {\n if (containerRef.current) {\n const container = containerRef.current\n const rect = container.getBoundingClientRect()\n const containerWidth = rect.width\n const containerHeight = rect.height\n\n if (containerWidth > 0 && containerHeight > 0) {\n // Calculate font size based on container dimensions\n // For KPI displays, we want the text to be large and prominent\n // Reserve space for the label by using more conservative sizing\n const widthBasedSize = containerWidth / 5\n const heightBasedSize = containerHeight / 4 // More conservative to leave room for label\n const baseFontSize = Math.min(widthBasedSize, heightBasedSize)\n const clampedFontSize = Math.max(24, Math.min(baseFontSize, 120)) // Lower max to ensure label fits\n setFontSize(clampedFontSize)\n\n // Use a timeout to measure text width after font size is applied\n setTimeout(() => {\n if (valueRef.current) {\n const textRect = valueRef.current.getBoundingClientRect()\n const measuredWidth = textRect.width\n // Ensure we have a minimum width and use container width as fallback\n const effectiveWidth = Math.max(measuredWidth, Math.min(containerWidth * 0.6, 300))\n setTextWidth(effectiveWidth)\n }\n }, 10)\n }\n }\n }\n\n // Initial calculation - reduce delay for faster initial render\n const timer = setTimeout(updateDimensions, 50)\n\n const resizeObserver = new ResizeObserver(() => {\n // Debounce the resize updates\n setTimeout(updateDimensions, 10)\n })\n\n if (containerRef.current) {\n resizeObserver.observe(containerRef.current)\n }\n\n return () => {\n clearTimeout(timer)\n resizeObserver.disconnect()\n }\n }, [data, chartConfig])\n\n // Early returns AFTER all hooks\n if (!data || data.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n <div className=\"dc:text-center text-dc-text-muted\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.noData')}</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.noDataHint.kpi')}</div>\n </div>\n </div>\n )\n }\n\n if (valueFields.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined,\n backgroundColor: 'var(--dc-danger-bg)',\n color: 'var(--dc-danger)',\n borderColor: 'var(--dc-danger-border)'\n }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.configError')}</div>\n <div className=\"dc:text-xs\">{t('chart.runtime.configErrorHint.noMeasures')}</div>\n </div>\n </div>\n )\n }\n\n // Null handling: If all values are null, show placeholder instead of error\n if (values.length === 0) {\n return (\n <div\n ref={containerRef}\n className=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full dc:h-full dc:p-4\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {/* Field Label */}\n <div\n className=\"text-dc-text-secondary dc:font-bold dc:text-center dc:mb-3\"\n style={{\n fontSize: '14px',\n lineHeight: '1.2'\n }}\n >\n {getFieldLabel(valueField)}\n </div>\n\n {/* No Data Placeholder */}\n <div\n className=\"dc:font-bold dc:leading-none text-dc-text-muted\"\n style={{\n fontSize: `${fontSize}px`\n }}\n >\n —\n </div>\n\n <div className=\"dc:text-xs text-dc-text-muted dc:mt-2\">No data</div>\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n className=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full dc:h-full dc:p-4\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {/* Field Label - Bolder and bigger */}\n <div\n className=\"text-dc-text-secondary dc:font-bold dc:text-center dc:mb-3 dc:flex dc:items-center dc:justify-center dc:gap-1\"\n style={{\n fontSize: '14px',\n lineHeight: '1.2'\n }}\n >\n <span>\n {(() => {\n const label = getFieldLabel(valueField)\n // Temporary fix: if label seems wrong, use the field name directly\n const displayLabel = (label && label.length > 1) ? label : valueField\n return displayLabel\n })()}\n </span>\n {(excludedIncompletePeriod || skippedLastPeriod) && (\n <span\n title={skippedLastPeriod\n ? `Excludes last ${granularity || 'period'}`\n : `Excludes current incomplete ${granularity}`}\n className=\"dc:cursor-help\"\n >\n <Icon icon={infoCircleIcon} className=\"dc:w-4 dc:h-4 text-dc-text-muted dc:opacity-70\" />\n </span>\n )}\n </div>\n\n {/* Main KPI Value and Variance - Horizontal layout */}\n <div className=\"dc:flex dc:items-center dc:justify-center dc:gap-4 dc:mb-3\">\n <div\n ref={valueRef}\n className=\"dc:font-bold dc:leading-none\"\n style={{\n fontSize: `${fontSize}px`,\n color: valueColor\n }}\n >\n {formatNumber(mainValue)}\n </div>\n\n {/* Target Variance Display - To the right of main value */}\n {targetValue !== null && variance !== null && (\n <div className=\"dc:flex dc:flex-col dc:items-start\">\n <div\n className=\"dc:font-semibold\"\n style={{\n fontSize: `${Math.max(12, fontSize * 0.3)}px`,\n color: varianceColor,\n lineHeight: '1.2'\n }}\n >\n {formatVariance(variance, 1)}\n </div>\n <div\n className=\"text-dc-text-muted dc:text-xs\"\n style={{\n opacity: 0.7,\n fontSize: `${Math.max(10, fontSize * 0.2)}px`\n }}\n >\n vs {formatNumber(targetValue)}\n </div>\n </div>\n )}\n </div>\n\n {/* Unit/Suffix - Larger, not bold (hidden when formatValue is provided) */}\n {displayConfig.suffix && !displayConfig.formatValue && (\n <div\n className=\"text-dc-text-muted dc:text-center\"\n style={{\n fontSize: '14px',\n lineHeight: '1.2',\n opacity: 0.8\n }}\n >\n {displayConfig.suffix}\n </div>\n )}\n\n {/* Data Histogram for multiple values */}\n {showStats && (\n <div className=\"dc:mt-4\">\n <DataHistogram\n values={values}\n min={min}\n max={max}\n color={valueColor}\n formatValue={formatNumber}\n height={24}\n width={textWidth}\n targetValue={targetValue || undefined}\n />\n </div>\n )}\n </div>\n )\n})\n\nexport default KpiNumber\n"],"mappings":"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"}
@@ -1,11 +1,12 @@
1
- import { _ as e, k as t } from "./chart-activity-grid-VFFm85hC.js";
2
- import { n } from "./chart-kpi-number-BrXw7m-S.js";
3
- import r, { useEffect as i, useRef as a, useState as o } from "react";
4
- import { jsx as s, jsxs as c } from "react/jsx-runtime";
1
+ import { n as e } from "./rolldown-runtime-CKnJJeip.js";
2
+ import { _ as t, k as n } from "./chart-activity-grid-Bdb8U_NC.js";
3
+ import { n as r } from "./chart-kpi-number-CuNEYbRx.js";
4
+ import i, { useEffect as a, useRef as o, useState as s } from "react";
5
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
5
6
  //#region src/client/components/charts/KpiText.tsx
6
- var l = r.memo(function({ data: r, chartConfig: l, displayConfig: u = {}, height: d = "100%", colorPalette: f }) {
7
- let { t: p } = t(), [m, h] = o(28), [g, _] = o(0), v = a(null), y = a(null), b = e();
8
- if (i(() => {
7
+ var u = /* @__PURE__ */ e({ default: () => d }), d = i.memo(function({ data: e, chartConfig: i, displayConfig: u = {}, height: d = "100%", colorPalette: f }) {
8
+ let { t: p } = n(), [m, h] = s(28), [g, _] = s(0), v = o(null), y = o(null), b = t();
9
+ if (a(() => {
9
10
  let e = () => {
10
11
  if (v.current) {
11
12
  let e = v.current.getBoundingClientRect(), t = e.width, n = e.height;
@@ -21,25 +22,25 @@ var l = r.memo(function({ data: r, chartConfig: l, displayConfig: u = {}, height
21
22
  return v.current && n.observe(v.current), () => {
22
23
  clearTimeout(t), n.disconnect();
23
24
  };
24
- }, [r, l]), !r || r.length === 0) return /* @__PURE__ */ s("div", {
25
+ }, [e, i]), !e || e.length === 0) return /* @__PURE__ */ c("div", {
25
26
  className: "dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full",
26
27
  style: {
27
28
  height: d === "100%" ? "100%" : d,
28
29
  minHeight: d === "100%" ? "200px" : void 0
29
30
  },
30
- children: /* @__PURE__ */ c("div", {
31
+ children: /* @__PURE__ */ l("div", {
31
32
  className: "dc:text-center text-dc-text-muted",
32
- children: [/* @__PURE__ */ s("div", {
33
+ children: [/* @__PURE__ */ c("div", {
33
34
  className: "dc:text-sm dc:font-semibold dc:mb-1",
34
35
  children: p("chart.runtime.noData")
35
- }), /* @__PURE__ */ s("div", {
36
+ }), /* @__PURE__ */ c("div", {
36
37
  className: "dc:text-xs text-dc-text-secondary",
37
38
  children: p("chart.runtime.noDataHint.kpi")
38
39
  })]
39
40
  })
40
41
  });
41
42
  let x = [];
42
- if (l?.yAxis && (typeof l.yAxis == "string" ? x = [l.yAxis] : Array.isArray(l.yAxis) && (x = l.yAxis)), x.length === 0) return /* @__PURE__ */ s("div", {
43
+ if (i?.yAxis && (typeof i.yAxis == "string" ? x = [i.yAxis] : Array.isArray(i.yAxis) && (x = i.yAxis)), x.length === 0) return /* @__PURE__ */ c("div", {
43
44
  className: "dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full",
44
45
  style: {
45
46
  height: d === "100%" ? "100%" : d,
@@ -48,23 +49,23 @@ var l = r.memo(function({ data: r, chartConfig: l, displayConfig: u = {}, height
48
49
  color: "var(--dc-danger)",
49
50
  borderColor: "var(--dc-danger-border)"
50
51
  },
51
- children: /* @__PURE__ */ c("div", {
52
+ children: /* @__PURE__ */ l("div", {
52
53
  className: "dc:text-center",
53
- children: [/* @__PURE__ */ s("div", {
54
+ children: [/* @__PURE__ */ c("div", {
54
55
  className: "dc:text-sm dc:font-semibold dc:mb-1",
55
56
  children: p("chart.runtime.configError")
56
- }), /* @__PURE__ */ s("div", {
57
+ }), /* @__PURE__ */ c("div", {
57
58
  className: "dc:text-xs",
58
59
  children: p("chart.runtime.configErrorHint.noMeasures")
59
60
  })]
60
61
  })
61
62
  });
62
- let S = x[0], C = r.map((e) => {
63
+ let S = x[0], C = e.map((e) => {
63
64
  if (e[S] !== void 0) return e[S];
64
65
  let t = Object.keys(e);
65
66
  if (t.length > 0) return e[t[0]];
66
67
  }).filter((e) => e != null);
67
- if (C.length === 0) return /* @__PURE__ */ s("div", {
68
+ if (C.length === 0) return /* @__PURE__ */ c("div", {
68
69
  className: "dc:flex dc:items-center dc:justify-center dc:w-full dc:h-full",
69
70
  style: {
70
71
  height: d === "100%" ? "100%" : d,
@@ -73,12 +74,12 @@ var l = r.memo(function({ data: r, chartConfig: l, displayConfig: u = {}, height
73
74
  color: "var(--dc-warning)",
74
75
  borderColor: "var(--dc-warning-border)"
75
76
  },
76
- children: /* @__PURE__ */ c("div", {
77
+ children: /* @__PURE__ */ l("div", {
77
78
  className: "dc:text-center",
78
- children: [/* @__PURE__ */ s("div", {
79
+ children: [/* @__PURE__ */ c("div", {
79
80
  className: "dc:text-sm dc:font-semibold dc:mb-1",
80
81
  children: p("chart.runtime.noValidData")
81
- }), /* @__PURE__ */ s("div", {
82
+ }), /* @__PURE__ */ c("div", {
82
83
  className: "dc:text-xs",
83
84
  children: p("chart.runtime.noValidDataHint.kpiText")
84
85
  })]
@@ -113,14 +114,14 @@ var l = r.memo(function({ data: r, chartConfig: l, displayConfig: u = {}, height
113
114
  }
114
115
  return f?.colors?.[0] || "#1f2937";
115
116
  })();
116
- return /* @__PURE__ */ c("div", {
117
+ return /* @__PURE__ */ l("div", {
117
118
  ref: v,
118
119
  className: "dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full dc:h-full dc:p-4",
119
120
  style: {
120
121
  height: d === "100%" ? "100%" : d,
121
122
  minHeight: d === "100%" ? "200px" : void 0
122
123
  },
123
- children: [/* @__PURE__ */ s("div", {
124
+ children: [/* @__PURE__ */ c("div", {
124
125
  ref: y,
125
126
  className: "dc:font-bold dc:leading-tight dc:text-center",
126
127
  style: {
@@ -128,9 +129,9 @@ var l = r.memo(function({ data: r, chartConfig: l, displayConfig: u = {}, height
128
129
  color: j
129
130
  },
130
131
  children: A
131
- }), O && E !== null && D !== null && /* @__PURE__ */ s("div", {
132
+ }), O && E !== null && D !== null && /* @__PURE__ */ c("div", {
132
133
  className: "dc:mt-4",
133
- children: /* @__PURE__ */ s(n, {
134
+ children: /* @__PURE__ */ c(r, {
134
135
  values: C,
135
136
  min: E,
136
137
  max: D,
@@ -143,6 +144,6 @@ var l = r.memo(function({ data: r, chartConfig: l, displayConfig: u = {}, height
143
144
  });
144
145
  });
145
146
  //#endregion
146
- export { l as t };
147
+ export { u as t };
147
148
 
148
- //# sourceMappingURL=chart-kpi-text-D0plngLV.js.map
149
+ //# sourceMappingURL=chart-kpi-text-u8FJaZDQ.js.map