drizzle-cube 0.4.53 → 0.5.1

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 (277) hide show
  1. package/dist/adapters/express/index.cjs +2 -2
  2. package/dist/adapters/express/index.js +109 -96
  3. package/dist/adapters/fastify/index.cjs +2 -2
  4. package/dist/adapters/fastify/index.js +148 -134
  5. package/dist/adapters/{handler-RItnSaEl.js → handler-3LGcjLtr.js} +617 -612
  6. package/dist/adapters/handler-BzzbVpcl.cjs +25 -0
  7. package/dist/adapters/hono/index.cjs +1 -1
  8. package/dist/adapters/hono/index.js +103 -99
  9. package/dist/adapters/{compiler-S6KHiOY6.js → locale-DTnJrxm1.js} +1700 -1563
  10. package/dist/adapters/locale-DueXjqMh.cjs +198 -0
  11. package/dist/adapters/locale.d.ts +8 -0
  12. package/dist/adapters/mcp-tools.cjs +1 -1
  13. package/dist/adapters/mcp-tools.d.ts +7 -3
  14. package/dist/adapters/mcp-tools.js +27 -27
  15. package/dist/adapters/mcp-transport-C7VLf4T5.js +579 -0
  16. package/dist/adapters/mcp-transport-poPHl_2j.cjs +39 -0
  17. package/dist/adapters/mcp-transport.d.ts +25 -2
  18. package/dist/adapters/nextjs/index.cjs +1 -1
  19. package/dist/adapters/nextjs/index.js +152 -132
  20. package/dist/adapters/utils-DNrj-ryp.cjs +17 -0
  21. package/dist/adapters/{utils-IH1ePsBd.js → utils-DOg9oGdt.js} +2341 -819
  22. package/dist/adapters/utils.cjs +1 -1
  23. package/dist/adapters/utils.d.ts +45 -2
  24. package/dist/adapters/utils.js +1 -1
  25. package/dist/client/charts.js +12 -12
  26. package/dist/client/chunks/{DashboardEditModal-BTdV528l.js → DashboardEditModal-cSSIAZGy.js} +1968 -1973
  27. package/dist/client/chunks/DashboardEditModal-cSSIAZGy.js.map +1 -0
  28. package/dist/client/chunks/{FieldSearchModal-D75vy4Wb.js → FieldSearchModal-CZNo4pNK.js} +550 -536
  29. package/dist/client/chunks/FieldSearchModal-CZNo4pNK.js.map +1 -0
  30. package/dist/client/chunks/KpiDelta-Dll_eCV1.js +2 -0
  31. package/dist/client/chunks/KpiNumber-BPlR92hI.js +2 -0
  32. package/dist/client/chunks/KpiText-BIxq7Jso.js +2 -0
  33. package/dist/client/chunks/{RetentionCombinedChart-DIhK5pD8.js → RetentionCombinedChart-BD8tGeM_.js} +96 -96
  34. package/dist/client/chunks/RetentionCombinedChart-BD8tGeM_.js.map +1 -0
  35. package/dist/client/chunks/{RetentionHeatmap-CyREolyP.js → RetentionHeatmap-B_5sewwi.js} +77 -77
  36. package/dist/client/chunks/RetentionHeatmap-B_5sewwi.js.map +1 -0
  37. package/dist/client/chunks/SchemaVisualization-CCICjhvv.js +2 -0
  38. package/dist/client/chunks/SchemaVisualizationLazy-DraGsMx6.js +2 -0
  39. package/dist/client/chunks/af-ZA-xDmO5F0s.js +1431 -0
  40. package/dist/client/chunks/af-ZA-xDmO5F0s.js.map +1 -0
  41. package/dist/client/chunks/{analysis-builder-C1CJ0c7L.js → analysis-builder-BeVZhiQ5.js} +1519 -1507
  42. package/dist/client/chunks/analysis-builder-BeVZhiQ5.js.map +1 -0
  43. package/dist/client/chunks/{analysis-builder-shared-rkjJfWLT.js → analysis-builder-shared-BWc7ZZnG.js} +925 -954
  44. package/dist/client/chunks/analysis-builder-shared-BWc7ZZnG.js.map +1 -0
  45. package/dist/client/chunks/chart-activity-grid-CWT0gLv4.js +2376 -0
  46. package/dist/client/chunks/chart-activity-grid-CWT0gLv4.js.map +1 -0
  47. package/dist/client/chunks/{chart-area-BwYaflNk.js → chart-area-D63kG8OT.js} +157 -157
  48. package/dist/client/chunks/chart-area-D63kG8OT.js.map +1 -0
  49. package/dist/client/chunks/{chart-bar-BiENfFgE.js → chart-bar-BEfsCLjl.js} +78 -78
  50. package/dist/client/chunks/chart-bar-BEfsCLjl.js.map +1 -0
  51. package/dist/client/chunks/{chart-box-plot-BJF1tBXC.js → chart-box-plot-o-h9MRX5.js} +111 -114
  52. package/dist/client/chunks/chart-box-plot-o-h9MRX5.js.map +1 -0
  53. package/dist/client/chunks/{chart-bubble-DQQhGVDJ.js → chart-bubble-CMDp4Pfm.js} +121 -121
  54. package/dist/client/chunks/chart-bubble-CMDp4Pfm.js.map +1 -0
  55. package/dist/client/chunks/chart-candlestick-WyANJ0Ky.js +303 -0
  56. package/dist/client/chunks/chart-candlestick-WyANJ0Ky.js.map +1 -0
  57. package/dist/client/chunks/chart-config-activity-grid-C-EkgYoa.js +51 -0
  58. package/dist/client/chunks/chart-config-activity-grid-C-EkgYoa.js.map +1 -0
  59. package/dist/client/chunks/chart-config-area-CMZpbIah.js +93 -0
  60. package/dist/client/chunks/chart-config-area-CMZpbIah.js.map +1 -0
  61. package/dist/client/chunks/chart-config-bar-B8_V4YLg.js +87 -0
  62. package/dist/client/chunks/chart-config-bar-B8_V4YLg.js.map +1 -0
  63. package/dist/client/chunks/chart-config-box-plot-Dwj7sEbU.js +35 -0
  64. package/dist/client/chunks/chart-config-box-plot-Dwj7sEbU.js.map +1 -0
  65. package/dist/client/chunks/chart-config-bubble-B0w0ZVp4.js +82 -0
  66. package/dist/client/chunks/chart-config-bubble-B0w0ZVp4.js.map +1 -0
  67. package/dist/client/chunks/chart-config-candlestick-Bvo3zeIn.js +72 -0
  68. package/dist/client/chunks/chart-config-candlestick-Bvo3zeIn.js.map +1 -0
  69. package/dist/client/chunks/{chart-config-data-table-Bhdx5Hem.js → chart-config-data-table-BQXSn4b_.js} +9 -9
  70. package/dist/client/chunks/chart-config-data-table-BQXSn4b_.js.map +1 -0
  71. package/dist/client/chunks/chart-config-funnel-BzEsHmjR.js +93 -0
  72. package/dist/client/chunks/chart-config-funnel-BzEsHmjR.js.map +1 -0
  73. package/dist/client/chunks/chart-config-gauge-C5ZiyZy7.js +64 -0
  74. package/dist/client/chunks/chart-config-gauge-C5ZiyZy7.js.map +1 -0
  75. package/dist/client/chunks/chart-config-heat-map-Cv8qNnVP.js +91 -0
  76. package/dist/client/chunks/chart-config-heat-map-Cv8qNnVP.js.map +1 -0
  77. package/dist/client/chunks/chart-config-kpi-delta-BraHQc2E.js +94 -0
  78. package/dist/client/chunks/chart-config-kpi-delta-BraHQc2E.js.map +1 -0
  79. package/dist/client/chunks/chart-config-kpi-number-CeCkx7mC.js +75 -0
  80. package/dist/client/chunks/chart-config-kpi-number-CeCkx7mC.js.map +1 -0
  81. package/dist/client/chunks/chart-config-kpi-text-CImM3SvH.js +47 -0
  82. package/dist/client/chunks/chart-config-kpi-text-CImM3SvH.js.map +1 -0
  83. package/dist/client/chunks/chart-config-line-BVKapAQK.js +104 -0
  84. package/dist/client/chunks/chart-config-line-BVKapAQK.js.map +1 -0
  85. package/dist/client/chunks/chart-config-markdown-C-_g_8te.js +117 -0
  86. package/dist/client/chunks/chart-config-markdown-C-_g_8te.js.map +1 -0
  87. package/dist/client/chunks/chart-config-measure-profile-KTVV1gO3.js +82 -0
  88. package/dist/client/chunks/chart-config-measure-profile-KTVV1gO3.js.map +1 -0
  89. package/dist/client/chunks/chart-config-pie-BZxVl25X.js +68 -0
  90. package/dist/client/chunks/chart-config-pie-BZxVl25X.js.map +1 -0
  91. package/dist/client/chunks/chart-config-radar-B7FByX3t.js +49 -0
  92. package/dist/client/chunks/chart-config-radar-B7FByX3t.js.map +1 -0
  93. package/dist/client/chunks/chart-config-radial-bar-UfW_3yyX.js +38 -0
  94. package/dist/client/chunks/chart-config-radial-bar-UfW_3yyX.js.map +1 -0
  95. package/dist/client/chunks/chart-config-sankey-DGAThN9i.js +66 -0
  96. package/dist/client/chunks/chart-config-sankey-DGAThN9i.js.map +1 -0
  97. package/dist/client/chunks/chart-config-scatter-BVVJuOnt.js +61 -0
  98. package/dist/client/chunks/chart-config-scatter-BVVJuOnt.js.map +1 -0
  99. package/dist/client/chunks/chart-config-sunburst-utejM2YS.js +45 -0
  100. package/dist/client/chunks/chart-config-sunburst-utejM2YS.js.map +1 -0
  101. package/dist/client/chunks/chart-config-tree-map-IHp97OyV.js +51 -0
  102. package/dist/client/chunks/chart-config-tree-map-IHp97OyV.js.map +1 -0
  103. package/dist/client/chunks/chart-config-waterfall-BdqG1V-x.js +59 -0
  104. package/dist/client/chunks/chart-config-waterfall-BdqG1V-x.js.map +1 -0
  105. package/dist/client/chunks/{chart-data-table-2iCsn0CF.js → chart-data-table-C3Xh9jwL.js} +1083 -1086
  106. package/dist/client/chunks/chart-data-table-C3Xh9jwL.js.map +1 -0
  107. package/dist/client/chunks/{chart-funnel-poyOf7-e.js → chart-funnel-C7pgktN5.js} +132 -132
  108. package/dist/client/chunks/chart-funnel-C7pgktN5.js.map +1 -0
  109. package/dist/client/chunks/{chart-gauge-D5J4gRky.js → chart-gauge-D2r2B_AR.js} +150 -150
  110. package/dist/client/chunks/chart-gauge-D2r2B_AR.js.map +1 -0
  111. package/dist/client/chunks/{chart-heat-map-BAMVhLGG.js → chart-heat-map-Dw2yjwfO.js} +75 -80
  112. package/dist/client/chunks/chart-heat-map-Dw2yjwfO.js.map +1 -0
  113. package/dist/client/chunks/{chart-kpi-delta-KQjUIeal.js → chart-kpi-delta-CYE0S1x_.js} +117 -117
  114. package/dist/client/chunks/chart-kpi-delta-CYE0S1x_.js.map +1 -0
  115. package/dist/client/chunks/chart-kpi-number-BlZ79xHW.js +321 -0
  116. package/dist/client/chunks/chart-kpi-number-BlZ79xHW.js.map +1 -0
  117. package/dist/client/chunks/chart-kpi-text-DY1BnxPe.js +148 -0
  118. package/dist/client/chunks/chart-kpi-text-DY1BnxPe.js.map +1 -0
  119. package/dist/client/chunks/{chart-line-B5_WntY5.js → chart-line-CBsTThTv.js} +123 -123
  120. package/dist/client/chunks/chart-line-CBsTThTv.js.map +1 -0
  121. package/dist/client/chunks/chart-markdown-BWaWVkuz.js +3474 -0
  122. package/dist/client/chunks/chart-markdown-BWaWVkuz.js.map +1 -0
  123. package/dist/client/chunks/chart-measure-profile-B41qCTBG.js +179 -0
  124. package/dist/client/chunks/chart-measure-profile-B41qCTBG.js.map +1 -0
  125. package/dist/client/chunks/chart-pie-Djbu8x2v.js +172 -0
  126. package/dist/client/chunks/chart-pie-Djbu8x2v.js.map +1 -0
  127. package/dist/client/chunks/chart-radar-BsTcKV0K.js +154 -0
  128. package/dist/client/chunks/chart-radar-BsTcKV0K.js.map +1 -0
  129. package/dist/client/chunks/chart-radial-bar-Du7XNnwE.js +148 -0
  130. package/dist/client/chunks/chart-radial-bar-Du7XNnwE.js.map +1 -0
  131. package/dist/client/chunks/{chart-sankey-BOyxfG1Q.js → chart-sankey-WwkZAhLy.js} +73 -73
  132. package/dist/client/chunks/chart-sankey-WwkZAhLy.js.map +1 -0
  133. package/dist/client/chunks/chart-scatter-D8krEYsA.js +255 -0
  134. package/dist/client/chunks/chart-scatter-D8krEYsA.js.map +1 -0
  135. package/dist/client/chunks/{chart-sunburst-D9lGEOCc.js → chart-sunburst-CIDB_pTl.js} +66 -66
  136. package/dist/client/chunks/chart-sunburst-CIDB_pTl.js.map +1 -0
  137. package/dist/client/chunks/chart-tree-map-C5C2iaWM.js +298 -0
  138. package/dist/client/chunks/chart-tree-map-C5C2iaWM.js.map +1 -0
  139. package/dist/client/chunks/{chart-waterfall-BCdUx4DC.js → chart-waterfall-BGdPrJ5Y.js} +80 -80
  140. package/dist/client/chunks/chart-waterfall-BGdPrJ5Y.js.map +1 -0
  141. package/dist/client/chunks/{charts-core-C5Yokk-x.js → charts-core-BXOqaYFn.js} +92 -92
  142. package/dist/client/chunks/charts-core-BXOqaYFn.js.map +1 -0
  143. package/dist/client/chunks/en-US-5xPTdCXg.js +35 -0
  144. package/dist/client/chunks/en-US-5xPTdCXg.js.map +1 -0
  145. package/dist/client/chunks/nl-NL-vCifBijs.js +1491 -0
  146. package/dist/client/chunks/nl-NL-vCifBijs.js.map +1 -0
  147. package/dist/client/chunks/{schema-visualization-t1KiOORo.js → schema-visualization-Xp60Ff2W.js} +352 -364
  148. package/dist/client/chunks/schema-visualization-Xp60Ff2W.js.map +1 -0
  149. package/dist/client/chunks/{useDebounce-CKqkM42n.js → useDebounce-CfmUMFau.js} +85 -85
  150. package/dist/client/chunks/useDebounce-CfmUMFau.js.map +1 -0
  151. package/dist/client/chunks/{useExplainAI-DBIfYwz-.js → useExplainAI-BKGmejIj.js} +4 -4
  152. package/dist/client/chunks/{useExplainAI-DBIfYwz-.js.map → useExplainAI-BKGmejIj.js.map} +1 -1
  153. package/dist/client/chunks/{utils--qCr8Yn5.js → utils-BldkcRHv.js} +2 -2
  154. package/dist/client/chunks/{utils--qCr8Yn5.js.map → utils-BldkcRHv.js.map} +1 -1
  155. package/dist/client/chunks/{vendor-BRlsCGnK.js → vendor-ClXpIiea.js} +2 -2
  156. package/dist/client/chunks/{vendor-BRlsCGnK.js.map → vendor-ClXpIiea.js.map} +1 -1
  157. package/dist/client/components/AnalysisBuilder/types.d.ts +6 -6
  158. package/dist/client/components.js +3 -3
  159. package/dist/client/hooks/useTranslation.d.ts +21 -0
  160. package/dist/client/hooks.js +3 -3
  161. package/dist/client/icons.js +1 -1
  162. package/dist/client/index.js +493 -488
  163. package/dist/client/index.js.map +1 -1
  164. package/dist/client/providers/CubeApiProvider.d.ts +2 -1
  165. package/dist/client/providers/CubeProvider.d.ts +7 -1
  166. package/dist/client/providers/I18nProvider.d.ts +18 -0
  167. package/dist/client/providers.js +1 -1
  168. package/dist/client/schema.js +1 -1
  169. package/dist/client/shared/types.d.ts +5 -20
  170. package/dist/client/styles.css +1 -1
  171. package/dist/client/utils.js +5 -5
  172. package/dist/client-bundle-stats.html +1 -1
  173. package/dist/mcp-app/mcp-app.html +40 -36
  174. package/dist/server/index.cjs +42 -40
  175. package/dist/server/index.js +3311 -1672
  176. package/package.json +5 -2
  177. package/dist/adapters/compiler-CRgLzmSn.cjs +0 -198
  178. package/dist/adapters/handler-DumFgnNM.cjs +0 -25
  179. package/dist/adapters/mcp-transport-C6bsIOSV.js +0 -545
  180. package/dist/adapters/mcp-transport-DMhuYmFp.cjs +0 -39
  181. package/dist/adapters/utils-CyBt-as9.cjs +0 -15
  182. package/dist/client/chunks/DashboardEditModal-BTdV528l.js.map +0 -1
  183. package/dist/client/chunks/FieldSearchModal-D75vy4Wb.js.map +0 -1
  184. package/dist/client/chunks/KpiDelta-Bk8bzKYM.js +0 -2
  185. package/dist/client/chunks/KpiNumber-CKF-8e_T.js +0 -2
  186. package/dist/client/chunks/KpiText-Iz1vIvu_.js +0 -2
  187. package/dist/client/chunks/RetentionCombinedChart-DIhK5pD8.js.map +0 -1
  188. package/dist/client/chunks/RetentionHeatmap-CyREolyP.js.map +0 -1
  189. package/dist/client/chunks/SchemaVisualization-B1GUT-FM.js +0 -2
  190. package/dist/client/chunks/SchemaVisualizationLazy-DymwT34e.js +0 -2
  191. package/dist/client/chunks/analysis-builder-C1CJ0c7L.js.map +0 -1
  192. package/dist/client/chunks/analysis-builder-shared-rkjJfWLT.js.map +0 -1
  193. package/dist/client/chunks/chart-activity-grid-DLktOINm.js +0 -806
  194. package/dist/client/chunks/chart-activity-grid-DLktOINm.js.map +0 -1
  195. package/dist/client/chunks/chart-area-BwYaflNk.js.map +0 -1
  196. package/dist/client/chunks/chart-bar-BiENfFgE.js.map +0 -1
  197. package/dist/client/chunks/chart-box-plot-BJF1tBXC.js.map +0 -1
  198. package/dist/client/chunks/chart-bubble-DQQhGVDJ.js.map +0 -1
  199. package/dist/client/chunks/chart-candlestick-C2UuXbLe.js +0 -306
  200. package/dist/client/chunks/chart-candlestick-C2UuXbLe.js.map +0 -1
  201. package/dist/client/chunks/chart-config-activity-grid-DJOU3TEz.js +0 -51
  202. package/dist/client/chunks/chart-config-activity-grid-DJOU3TEz.js.map +0 -1
  203. package/dist/client/chunks/chart-config-area-CWnWVT6a.js +0 -93
  204. package/dist/client/chunks/chart-config-area-CWnWVT6a.js.map +0 -1
  205. package/dist/client/chunks/chart-config-bar-C-7Dr1Ho.js +0 -87
  206. package/dist/client/chunks/chart-config-bar-C-7Dr1Ho.js.map +0 -1
  207. package/dist/client/chunks/chart-config-box-plot-mVOwmLdu.js +0 -35
  208. package/dist/client/chunks/chart-config-box-plot-mVOwmLdu.js.map +0 -1
  209. package/dist/client/chunks/chart-config-bubble-BPE2CeiD.js +0 -82
  210. package/dist/client/chunks/chart-config-bubble-BPE2CeiD.js.map +0 -1
  211. package/dist/client/chunks/chart-config-candlestick-BSB9DRy2.js +0 -72
  212. package/dist/client/chunks/chart-config-candlestick-BSB9DRy2.js.map +0 -1
  213. package/dist/client/chunks/chart-config-data-table-Bhdx5Hem.js.map +0 -1
  214. package/dist/client/chunks/chart-config-funnel-Cl-v-bm1.js +0 -93
  215. package/dist/client/chunks/chart-config-funnel-Cl-v-bm1.js.map +0 -1
  216. package/dist/client/chunks/chart-config-gauge-CdrUTJMJ.js +0 -64
  217. package/dist/client/chunks/chart-config-gauge-CdrUTJMJ.js.map +0 -1
  218. package/dist/client/chunks/chart-config-heat-map-DGE3NzoF.js +0 -91
  219. package/dist/client/chunks/chart-config-heat-map-DGE3NzoF.js.map +0 -1
  220. package/dist/client/chunks/chart-config-kpi-delta-DMrQerUW.js +0 -94
  221. package/dist/client/chunks/chart-config-kpi-delta-DMrQerUW.js.map +0 -1
  222. package/dist/client/chunks/chart-config-kpi-number-DCytCytn.js +0 -75
  223. package/dist/client/chunks/chart-config-kpi-number-DCytCytn.js.map +0 -1
  224. package/dist/client/chunks/chart-config-kpi-text-KdKQUvHo.js +0 -47
  225. package/dist/client/chunks/chart-config-kpi-text-KdKQUvHo.js.map +0 -1
  226. package/dist/client/chunks/chart-config-line-Bl9VDAdz.js +0 -104
  227. package/dist/client/chunks/chart-config-line-Bl9VDAdz.js.map +0 -1
  228. package/dist/client/chunks/chart-config-markdown-BX26b94i.js +0 -117
  229. package/dist/client/chunks/chart-config-markdown-BX26b94i.js.map +0 -1
  230. package/dist/client/chunks/chart-config-measure-profile-DwtRhEFh.js +0 -82
  231. package/dist/client/chunks/chart-config-measure-profile-DwtRhEFh.js.map +0 -1
  232. package/dist/client/chunks/chart-config-pie-BzBcqPMJ.js +0 -68
  233. package/dist/client/chunks/chart-config-pie-BzBcqPMJ.js.map +0 -1
  234. package/dist/client/chunks/chart-config-radar-6ZOgt__z.js +0 -49
  235. package/dist/client/chunks/chart-config-radar-6ZOgt__z.js.map +0 -1
  236. package/dist/client/chunks/chart-config-radial-bar-Df6Eta7N.js +0 -38
  237. package/dist/client/chunks/chart-config-radial-bar-Df6Eta7N.js.map +0 -1
  238. package/dist/client/chunks/chart-config-sankey-DgqKBFvN.js +0 -66
  239. package/dist/client/chunks/chart-config-sankey-DgqKBFvN.js.map +0 -1
  240. package/dist/client/chunks/chart-config-scatter-D5nVLDvi.js +0 -61
  241. package/dist/client/chunks/chart-config-scatter-D5nVLDvi.js.map +0 -1
  242. package/dist/client/chunks/chart-config-sunburst-Ca3FX9nW.js +0 -45
  243. package/dist/client/chunks/chart-config-sunburst-Ca3FX9nW.js.map +0 -1
  244. package/dist/client/chunks/chart-config-tree-map-Bjy4QNa3.js +0 -51
  245. package/dist/client/chunks/chart-config-tree-map-Bjy4QNa3.js.map +0 -1
  246. package/dist/client/chunks/chart-config-waterfall-C5K2eqR7.js +0 -59
  247. package/dist/client/chunks/chart-config-waterfall-C5K2eqR7.js.map +0 -1
  248. package/dist/client/chunks/chart-data-table-2iCsn0CF.js.map +0 -1
  249. package/dist/client/chunks/chart-funnel-poyOf7-e.js.map +0 -1
  250. package/dist/client/chunks/chart-gauge-D5J4gRky.js.map +0 -1
  251. package/dist/client/chunks/chart-heat-map-BAMVhLGG.js.map +0 -1
  252. package/dist/client/chunks/chart-kpi-delta-KQjUIeal.js.map +0 -1
  253. package/dist/client/chunks/chart-kpi-number-CsQgV_x3.js +0 -325
  254. package/dist/client/chunks/chart-kpi-number-CsQgV_x3.js.map +0 -1
  255. package/dist/client/chunks/chart-kpi-text-BR0IyeUU.js +0 -148
  256. package/dist/client/chunks/chart-kpi-text-BR0IyeUU.js.map +0 -1
  257. package/dist/client/chunks/chart-line-B5_WntY5.js.map +0 -1
  258. package/dist/client/chunks/chart-markdown-B6bENbel.js +0 -3473
  259. package/dist/client/chunks/chart-markdown-B6bENbel.js.map +0 -1
  260. package/dist/client/chunks/chart-measure-profile-yWk-obNb.js +0 -179
  261. package/dist/client/chunks/chart-measure-profile-yWk-obNb.js.map +0 -1
  262. package/dist/client/chunks/chart-pie-BodrUoHv.js +0 -172
  263. package/dist/client/chunks/chart-pie-BodrUoHv.js.map +0 -1
  264. package/dist/client/chunks/chart-radar-gG3zfLud.js +0 -154
  265. package/dist/client/chunks/chart-radar-gG3zfLud.js.map +0 -1
  266. package/dist/client/chunks/chart-radial-bar-C2IPCV8c.js +0 -148
  267. package/dist/client/chunks/chart-radial-bar-C2IPCV8c.js.map +0 -1
  268. package/dist/client/chunks/chart-sankey-BOyxfG1Q.js.map +0 -1
  269. package/dist/client/chunks/chart-scatter-B8OwlsAX.js +0 -255
  270. package/dist/client/chunks/chart-scatter-B8OwlsAX.js.map +0 -1
  271. package/dist/client/chunks/chart-sunburst-D9lGEOCc.js.map +0 -1
  272. package/dist/client/chunks/chart-tree-map-DZaKy9he.js +0 -298
  273. package/dist/client/chunks/chart-tree-map-DZaKy9he.js.map +0 -1
  274. package/dist/client/chunks/chart-waterfall-BCdUx4DC.js.map +0 -1
  275. package/dist/client/chunks/charts-core-C5Yokk-x.js.map +0 -1
  276. package/dist/client/chunks/schema-visualization-t1KiOORo.js.map +0 -1
  277. package/dist/client/chunks/useDebounce-CKqkM42n.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-visualization-Xp60Ff2W.js","names":[],"sources":["../../../src/client/components/SchemaVisualization/xyflowContext.tsx","../../../src/client/components/SchemaVisualization/SchemaVisualizationLazy.tsx","../../../src/client/components/SchemaVisualization/CubeNode.tsx","../../../src/client/components/SchemaVisualization/RelationshipEdge.tsx","../../../src/client/components/SchemaVisualization/FieldDetailPanel.tsx","../../../src/client/components/SchemaVisualization/useERDLayout.ts","../../../src/client/components/SchemaVisualization/index.tsx"],"sourcesContent":["/**\n * React context for @xyflow/react modules.\n *\n * All xyflow imports are dynamic (via SchemaVisualizationLazy) so that\n * the built schema-visualization chunk has NO static imports from\n * @xyflow/react. This prevents consuming projects from failing at\n * build time when @xyflow/react is not installed.\n */\n\nimport { createContext, useContext } from 'react'\n\nexport type XyflowModule = typeof import('@xyflow/react')\n\nconst XyflowContext = createContext<XyflowModule | null>(null)\n\nexport const XyflowProvider = XyflowContext.Provider\n\nexport function useXyflow(): XyflowModule {\n const ctx = useContext(XyflowContext)\n if (!ctx) throw new Error('useXyflow must be used within XyflowProvider')\n return ctx\n}\n","/**\n * Lazy-loaded SchemaVisualization with graceful fallback\n * when @xyflow/react is not installed.\n *\n * All @xyflow/react imports are dynamic here so the built chunk\n * has NO static imports from @xyflow/react. This prevents consuming\n * projects from failing at build time when xyflow is not installed.\n */\n\nimport { lazy, Suspense, useState, useEffect } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { SchemaVisualizationProps } from './index'\nimport { XyflowProvider } from './xyflowContext'\nimport type { XyflowModule } from './xyflowContext'\n\nlet loadFailed = false\n\nfunction MissingDependencyFallback(_props: SchemaVisualizationProps) {\n const { t } = useTranslation()\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:h-full dc:p-8\">\n <div className=\"dc:text-center dc:max-w-md\">\n <div className=\"dc:text-4xl dc:mb-4\">&#128269;</div>\n <h3 className=\"dc:text-lg dc:font-semibold text-dc-text dc:mb-2\">\n {t('schema.missingDeps.title')}\n </h3>\n <p className=\"dc:text-sm text-dc-text-secondary dc:mb-4\">\n {t('schema.missingDeps.description')}\n </p>\n <code className=\"dc:block dc:px-4 dc:py-2 dc:rounded bg-dc-surface-secondary dc:text-sm dc:font-mono text-dc-text dc:border border-dc-border\">\n npm install @xyflow/react elkjs\n </code>\n </div>\n </div>\n )\n}\n\nfunction LoadingFallback() {\n const { t } = useTranslation()\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:h-full\">\n <div className=\"dc:text-center\">\n <div className=\"dc:animate-spin dc:rounded-full dc:h-8 dc:w-8 dc:border-b-2 border-dc-accent dc:mx-auto dc:mb-2\" />\n <p className=\"dc:text-sm text-dc-text-muted\">{t('schema.loadingVisualization')}</p>\n </div>\n </div>\n )\n}\n\nconst LazySchemaVisualization = lazy(async () => {\n const mod = await import('./index')\n return { default: mod.SchemaVisualization }\n})\n\nexport function SchemaVisualizationLazy(props: SchemaVisualizationProps) {\n const [xyflow, setXyflow] = useState<XyflowModule | null>(null)\n const [failed, setFailed] = useState(loadFailed)\n\n useEffect(() => {\n if (loadFailed) return\n let cancelled = false\n\n import('@xyflow/react')\n .then((mod) => {\n if (!cancelled) setXyflow(mod as XyflowModule)\n })\n .catch(() => {\n loadFailed = true\n if (!cancelled) setFailed(true)\n })\n\n return () => { cancelled = true }\n }, [])\n\n if (failed) {\n return <MissingDependencyFallback {...props} />\n }\n\n if (!xyflow) {\n return <LoadingFallback />\n }\n\n return (\n <XyflowProvider value={xyflow}>\n <Suspense fallback={<LoadingFallback />}>\n <LazySchemaVisualization {...props} />\n </Suspense>\n </XyflowProvider>\n )\n}\n\nexport function isSchemaVisualizationAvailable(): boolean {\n return !loadFailed\n}\n","import type { MouseEvent } from 'react'\nimport type { CubeMetaCube } from '../../types'\nimport { getIcon } from '../../icons'\nimport { useXyflow } from './xyflowContext'\nimport { useTranslation } from '../../hooks/useTranslation'\n\ninterface CubeNodeData {\n cube: CubeMetaCube\n onFieldClick?: (cubeName: string, fieldName: string, fieldType: 'measure' | 'dimension', pos?: { x: number; y: number }) => void\n onCubeClick?: (cubeName: string, pos?: { x: number; y: number }) => void\n isHighlighted: boolean\n highlightedFields: string[]\n searchTerm?: string\n selectedField?: { cubeName: string; fieldName: string | null } | null\n [key: string]: unknown\n}\n\ninterface CubeNodeProps {\n data: CubeNodeData\n}\n\nexport function CubeNode({ data }: CubeNodeProps) {\n const { t } = useTranslation()\n const { Handle, Position } = useXyflow()\n const { cube, onFieldClick, onCubeClick, isHighlighted, highlightedFields, searchTerm, selectedField } = data\n\n const handleFieldClick = (e: MouseEvent, fieldName: string, fieldType: 'measure' | 'dimension') => {\n if (onFieldClick) {\n onFieldClick(cube.name, fieldName, fieldType, { x: e.clientX, y: e.clientY })\n }\n }\n\n const InfoIcon = getIcon('info')\n\n const handleCubeInfoClick = (e: MouseEvent) => {\n e.stopPropagation() // don't start drag\n if (onCubeClick) {\n onCubeClick(cube.name, { x: e.clientX, y: e.clientY })\n }\n }\n\n const isFieldSelected = (fieldName: string) => {\n if (!selectedField) return false\n return selectedField.cubeName === cube.name && selectedField.fieldName === fieldName\n }\n\n const isCubeSelected = selectedField?.cubeName === cube.name && selectedField?.fieldName === null\n\n const isFieldHighlighted = (fullFieldName: string) => {\n return highlightedFields.includes(fullFieldName)\n }\n\n const isFieldSearchMatch = (field: { name: string; title?: string }) => {\n if (!searchTerm?.trim()) return true\n const term = searchTerm.toLowerCase()\n return (\n field.name.toLowerCase().includes(term) ||\n (field.title && field.title.toLowerCase().includes(term))\n )\n }\n\n const cubeHasMatches = () => {\n if (!searchTerm?.trim()) return true\n return cube.measures.some(m => isFieldSearchMatch(m)) ||\n cube.dimensions.some(d => isFieldSearchMatch(d))\n }\n\n const hasCubeMatches = cubeHasMatches()\n\n const getFieldClasses = (\n field: { name: string; title?: string; type?: string },\n highlighted: boolean,\n _fieldType: 'measure' | 'dimension'\n ) => {\n const fieldName = field.name.split('.')[1] || field.name\n const selected = isFieldSelected(fieldName)\n const base = 'dc:px-4 dc:py-2 dc:text-xs dc:cursor-pointer dc:transition-all dc:border-b border-dc-border last:dc:border-b-0 nodrag nopan'\n\n if (selected) {\n return `${base} bg-dc-accent-bg text-dc-accent dc:font-semibold dc:ring-1 dc:ring-inset ring-dc-accent`\n }\n\n if (!hasCubeMatches && searchTerm?.trim()) {\n if (highlighted) return `${base} bg-dc-accent-bg text-dc-accent dc:font-semibold`\n return `${base} dc:hover:bg-dc-surface-hover text-dc-text-secondary`\n }\n\n if (searchTerm?.trim() && !isFieldSearchMatch(field)) {\n return `${base} dc:opacity-40 dc:hover:opacity-60 text-dc-text-muted`\n }\n\n if (searchTerm?.trim() && isFieldSearchMatch(field) && !highlighted) {\n return `${base} dc:font-bold dc:hover:bg-dc-accent-bg`\n }\n\n if (highlighted) {\n return `${base} bg-dc-accent-bg text-dc-accent dc:font-semibold`\n }\n\n return `${base} dc:hover:bg-dc-surface-hover text-dc-text-secondary`\n }\n\n const timeDimensions = cube.dimensions.filter(d => d.type === 'time')\n const regularDimensions = cube.dimensions.filter(d => d.type !== 'time')\n\n return (\n <div\n className={`\n dc:border-2 dc:rounded-lg dc:shadow-lg dc:min-w-[280px] dc:overflow-hidden dc:transition-all\n ${!hasCubeMatches && searchTerm?.trim() ? 'dc:opacity-30 dc:grayscale' : ''}\n ${isHighlighted ? 'border-dc-accent dc:ring-2 ring-dc-accent' : 'border-dc-border'}\n `}\n style={{ backgroundColor: 'var(--dc-surface)' }}\n >\n {/* Cube Header */}\n <div className={`dc:px-4 dc:py-3 dc:transition-colors ${\n isHighlighted ? 'bg-dc-accent-bg' : 'bg-dc-surface-secondary'\n }`}>\n <div className=\"dc:flex dc:items-center dc:justify-between\">\n <div>\n <h3 className=\"dc:font-semibold text-dc-text dc:text-sm\">\n {cube.title || cube.name}\n </h3>\n {cube.description && (\n <p className=\"dc:text-xs text-dc-text-muted dc:mt-1 dc:line-clamp-2\">{cube.description}</p>\n )}\n </div>\n {onCubeClick && (\n <button\n className={`dc:ml-2 dc:p-1 dc:rounded dc:transition-colors nodrag nopan ${\n isCubeSelected\n ? 'bg-dc-accent-bg text-dc-accent'\n : 'text-dc-text-muted dc:hover:text-dc-text dc:hover:bg-dc-surface-hover'\n }`}\n onClick={handleCubeInfoClick}\n title={t('schema.cubeInfo')}\n >\n <InfoIcon className=\"dc:w-5 dc:h-5\" />\n </button>\n )}\n {!onCubeClick && (\n <div className=\"dc:text-xs text-dc-text-muted dc:ml-2\">\n <div>{cube.measures.length}M</div>\n <div>{cube.dimensions.length}D</div>\n </div>\n )}\n </div>\n </div>\n\n {/* Measures */}\n {cube.measures.length > 0 && (\n <div className=\"dc:border-t border-dc-border\">\n <div className=\"dc:px-4 dc:py-1.5 dc:border-b border-dc-border\" style={{ backgroundColor: 'color-mix(in srgb, var(--dc-warning) 10%, var(--dc-surface))' }}>\n <h4 className=\"dc:text-xs dc:font-medium text-dc-text-secondary dc:flex dc:items-center\">\n <span className=\"dc:w-2 dc:h-2 bg-dc-warning dc:rounded-full dc:mr-2\" />\n {t('schema.measures', { count: cube.measures.length })}\n </h4>\n </div>\n <div className=\"dc:max-h-64 dc:overflow-y-auto nowheel\">\n {cube.measures.map((measure) => {\n const fieldName = measure.name.split('.')[1] || measure.name\n const highlighted = isFieldHighlighted(measure.name)\n return (\n <div\n key={measure.name}\n className={getFieldClasses(measure, highlighted, 'measure')}\n onClick={(e) => handleFieldClick(e, fieldName, 'measure')}\n title={measure.title}\n >\n <div className=\"dc:flex dc:items-center dc:justify-between\">\n <span className=\"dc:font-mono dc:truncate\">\n {measure.shortTitle || measure.title || fieldName}\n </span>\n <span className=\"text-dc-text-muted dc:ml-2 dc:text-[10px] dc:uppercase\">\n {measure.type}\n </span>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n )}\n\n {/* Time Dimensions */}\n {timeDimensions.length > 0 && (\n <div className=\"dc:border-t border-dc-border\">\n <div className=\"dc:px-4 dc:py-1.5 dc:border-b border-dc-border\" style={{ backgroundColor: 'color-mix(in srgb, var(--dc-accent) 10%, var(--dc-surface))' }}>\n <h4 className=\"dc:text-xs dc:font-medium text-dc-text-secondary dc:flex dc:items-center\">\n <span className=\"dc:w-2 dc:h-2 bg-dc-accent dc:rounded-full dc:mr-2\" />\n {t('schema.timeDimensions', { count: timeDimensions.length })}\n </h4>\n </div>\n <div className=\"dc:max-h-64 dc:overflow-y-auto nowheel\">\n {timeDimensions.map((dimension) => {\n const fieldName = dimension.name.split('.')[1] || dimension.name\n const highlighted = isFieldHighlighted(dimension.name)\n return (\n <div\n key={dimension.name}\n className={getFieldClasses(dimension, highlighted, 'dimension')}\n onClick={(e) => handleFieldClick(e, fieldName, 'dimension')}\n title={dimension.title}\n >\n <div className=\"dc:flex dc:items-center dc:justify-between\">\n <span className=\"dc:font-mono dc:truncate\">\n {dimension.shortTitle || dimension.title || fieldName}\n </span>\n <span className=\"text-dc-text-muted dc:ml-2 dc:text-[10px] dc:uppercase\">\n {dimension.type}\n </span>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n )}\n\n {/* Regular Dimensions */}\n {regularDimensions.length > 0 && (\n <div className=\"dc:border-t border-dc-border\">\n <div className=\"dc:px-4 dc:py-1.5 dc:border-b border-dc-border\" style={{ backgroundColor: 'color-mix(in srgb, var(--dc-success) 10%, var(--dc-surface))' }}>\n <h4 className=\"dc:text-xs dc:font-medium text-dc-text-secondary dc:flex dc:items-center\">\n <span className=\"dc:w-2 dc:h-2 bg-dc-success dc:rounded-full dc:mr-2\" />\n {t('schema.dimensions', { count: regularDimensions.length })}\n </h4>\n </div>\n <div className=\"dc:max-h-64 dc:overflow-y-auto nowheel\">\n {regularDimensions.map((dimension) => {\n const fieldName = dimension.name.split('.')[1] || dimension.name\n const highlighted = isFieldHighlighted(dimension.name)\n return (\n <div\n key={dimension.name}\n className={getFieldClasses(dimension, highlighted, 'dimension')}\n onClick={(e) => handleFieldClick(e, fieldName, 'dimension')}\n title={dimension.title}\n >\n <div className=\"dc:flex dc:items-center dc:justify-between\">\n <span className=\"dc:font-mono dc:truncate\">\n {dimension.shortTitle || dimension.title || fieldName}\n </span>\n <span className=\"text-dc-text-muted dc:ml-2 dc:text-[10px] dc:uppercase\">\n {dimension.type}\n </span>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n )}\n\n {/* Connection handles - hidden */}\n <Handle type=\"source\" position={Position.Right} id=\"right\" className=\"dc:opacity-0\" isConnectable={false} />\n <Handle type=\"target\" position={Position.Left} id=\"left\" className=\"dc:opacity-0\" isConnectable={false} />\n <Handle type=\"source\" position={Position.Bottom} id=\"bottom\" className=\"dc:opacity-0\" isConnectable={false} />\n <Handle type=\"target\" position={Position.Top} id=\"top\" className=\"dc:opacity-0\" isConnectable={false} />\n </div>\n )\n}\n","import type { Edge, EdgeProps } from '@xyflow/react'\nimport type { CubeMetaRelationship } from '../../types'\nimport { useXyflow } from './xyflowContext'\n\ninterface RelationshipEdgeData {\n relationship: CubeMetaRelationship\n joinFields: Array<{\n sourceField: string\n targetField: string\n }>\n [key: string]: unknown\n}\n\nexport type RelationshipEdgeType = Edge<RelationshipEdgeData, 'relationshipEdge'>\n\nexport function RelationshipEdge({\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n style = {},\n data,\n markerEnd,\n}: EdgeProps<RelationshipEdgeType>) {\n const { getBezierPath, BaseEdge, EdgeLabelRenderer } = useXyflow()\n const [edgePath, labelX, labelY] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n })\n\n if (!data) return null\n\n const { relationship, joinFields } = data\n\n const getSymbol = (rel: string) => {\n switch (rel) {\n case 'belongsTo': return '\\u2208' // belongs to\n case 'hasOne': return '1:1'\n case 'hasMany': return '1:M'\n case 'belongsToMany': return 'M:M'\n default: return '?'\n }\n }\n\n const getColor = (rel: string) => {\n switch (rel) {\n case 'belongsTo': return '#10b981'\n case 'hasOne': return '#3b82f6'\n case 'hasMany': return '#f59e0b'\n case 'belongsToMany': return '#8b5cf6'\n default: return '#6b7280'\n }\n }\n\n const color = getColor(relationship.relationship)\n const symbol = getSymbol(relationship.relationship)\n\n return (\n <>\n <BaseEdge path={edgePath} markerEnd={markerEnd} style={{ ...style, stroke: color }} />\n <EdgeLabelRenderer>\n <div\n style={{\n position: 'absolute',\n transform: `translate(-50%, -50%) translate(${labelX}px,${labelY}px)`,\n fontSize: 10,\n pointerEvents: 'all',\n }}\n className=\"nodrag nopan\"\n >\n <div\n className=\"dc:border-2 dc:rounded-md dc:px-2 dc:py-1 dc:shadow-xs\"\n style={{ backgroundColor: 'var(--dc-surface)', borderColor: color }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:font-bold dc:text-xs dc:mb-1\" style={{ color }}>\n {symbol}\n </div>\n <div className=\"dc:text-[9px] text-dc-text-muted dc:leading-tight\">\n {joinFields.map((field, index) => (\n <div key={index} className=\"dc:font-mono\">\n {field.sourceField} → {field.targetField}\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </EdgeLabelRenderer>\n </>\n )\n}\n","import type { ReactNode } from 'react'\nimport type { CubeMetaCube, CubeMetaMeasure, CubeMetaDimension } from '../../types'\nimport { getIcon } from '../../icons'\n\nexport interface FieldSelection {\n cubeName: string\n fieldName: string | null // null = cube-level selection\n fieldType: 'measure' | 'dimension' | 'cube'\n}\n\ninterface FieldDetailPanelProps {\n selection: FieldSelection\n meta: { cubes: CubeMetaCube[] }\n onClose: () => void\n}\n\nfunction DetailRow({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div className=\"dc:flex dc:items-start dc:gap-2 dc:text-xs\">\n <span className=\"text-dc-text-muted dc:w-20 dc:flex-shrink-0 dc:font-medium\">{label}</span>\n <span className=\"text-dc-text dc:flex-1 dc:min-w-0\">{children}</span>\n </div>\n )\n}\n\nfunction TypeBadge({ type, color }: { type: string; color: string }) {\n return (\n <span\n className=\"dc:inline-flex dc:items-center dc:px-1.5 dc:py-0.5 dc:rounded dc:text-[10px] dc:font-medium dc:uppercase\"\n style={{ backgroundColor: `color-mix(in srgb, ${color} 15%, var(--dc-surface))`, color }}\n >\n {type}\n </span>\n )\n}\n\nfunction MeasureDetail({ measure, cube }: { measure: CubeMetaMeasure; cube: CubeMetaCube }) {\n const typeColor = {\n count: '#f59e0b',\n countDistinct: '#f59e0b',\n countDistinctApprox: '#f59e0b',\n sum: '#10b981',\n avg: '#3b82f6',\n min: '#8b5cf6',\n max: '#ec4899',\n runningTotal: '#06b6d4',\n number: '#6b7280',\n }[measure.type] || '#6b7280'\n\n return (\n <div className=\"dc:flex dc:flex-col dc:gap-2\">\n <DetailRow label=\"Cube\">{cube.title || cube.name}</DetailRow>\n <DetailRow label=\"Type\"><TypeBadge type={measure.type} color={typeColor} /></DetailRow>\n {measure.title && measure.title !== measure.shortTitle && (\n <DetailRow label=\"Title\">{measure.title}</DetailRow>\n )}\n {measure.drillMembers && measure.drillMembers.length > 0 && (\n <DetailRow label=\"Drill into\">\n <div className=\"dc:flex dc:flex-wrap dc:gap-1\">\n {measure.drillMembers.map(dm => (\n <span key={dm} className=\"dc:font-mono dc:text-[10px] dc:px-1 dc:py-0.5 dc:rounded bg-dc-surface-secondary border-dc-border dc:border\">\n {dm.split('.')[1] || dm}\n </span>\n ))}\n </div>\n </DetailRow>\n )}\n </div>\n )\n}\n\nfunction DimensionDetail({ dimension, cube }: { dimension: CubeMetaDimension; cube: CubeMetaCube }) {\n const typeColor = dimension.type === 'time' ? '#3b82f6' : '#10b981'\n\n // Find hierarchies this dimension belongs to\n const hierarchies = cube.hierarchies?.filter(h =>\n h.levels.some(l => l === dimension.name || l === `${cube.name}.${dimension.name.split('.')[1]}`)\n ) || []\n\n return (\n <div className=\"dc:flex dc:flex-col dc:gap-2\">\n <DetailRow label=\"Cube\">{cube.title || cube.name}</DetailRow>\n <DetailRow label=\"Type\"><TypeBadge type={dimension.type} color={typeColor} /></DetailRow>\n {dimension.title && dimension.title !== dimension.shortTitle && (\n <DetailRow label=\"Title\">{dimension.title}</DetailRow>\n )}\n {dimension.type === 'time' && dimension.granularities && dimension.granularities.length > 0 && (\n <DetailRow label=\"Granularity\">\n <div className=\"dc:flex dc:flex-wrap dc:gap-1\">\n {dimension.granularities.map(g => (\n <span key={g} className=\"dc:font-mono dc:text-[10px] dc:px-1 dc:py-0.5 dc:rounded bg-dc-surface-secondary border-dc-border dc:border\">\n {g}\n </span>\n ))}\n </div>\n </DetailRow>\n )}\n {hierarchies.length > 0 && (\n <DetailRow label=\"Hierarchy\">\n {hierarchies.map(h => (\n <div key={h.name} className=\"dc:text-[10px]\">\n <span className=\"dc:font-medium\">{h.title}</span>\n <span className=\"text-dc-text-muted dc:ml-1\">\n ({h.levels.map(l => l.split('.')[1] || l).join(' > ')})\n </span>\n </div>\n ))}\n </DetailRow>\n )}\n </div>\n )\n}\n\nfunction CubeDetail({ cube }: { cube: CubeMetaCube }) {\n const relationshipColors: Record<string, string> = {\n belongsTo: '#10b981',\n hasOne: '#3b82f6',\n hasMany: '#f59e0b',\n belongsToMany: '#8b5cf6',\n }\n\n return (\n <div className=\"dc:flex dc:flex-col dc:gap-2\">\n {cube.description && (\n <DetailRow label=\"Description\">{cube.description}</DetailRow>\n )}\n <DetailRow label=\"Measures\">\n <span className=\"dc:font-mono\">{cube.measures.length}</span>\n {cube.measures.length > 0 && (\n <span className=\"text-dc-text-muted dc:ml-1\">\n ({[...new Set(cube.measures.map(m => m.type))].join(', ')})\n </span>\n )}\n </DetailRow>\n <DetailRow label=\"Dimensions\">\n <span className=\"dc:font-mono\">{cube.dimensions.length}</span>\n {cube.dimensions.some(d => d.type === 'time') && (\n <span className=\"text-dc-text-muted dc:ml-1\">\n ({cube.dimensions.filter(d => d.type === 'time').length} time)\n </span>\n )}\n </DetailRow>\n {cube.relationships && cube.relationships.length > 0 && (\n <DetailRow label=\"Joins\">\n <div className=\"dc:flex dc:flex-col dc:gap-1\">\n {cube.relationships.map((rel, i) => (\n <div key={i} className=\"dc:flex dc:items-center dc:gap-1.5 dc:text-[10px]\">\n <TypeBadge type={rel.relationship} color={relationshipColors[rel.relationship] || '#6b7280'} />\n <span className=\"dc:font-mono\">{rel.targetCube}</span>\n </div>\n ))}\n </div>\n </DetailRow>\n )}\n {cube.hierarchies && cube.hierarchies.length > 0 && (\n <DetailRow label=\"Hierarchies\">\n <div className=\"dc:flex dc:flex-col dc:gap-1\">\n {cube.hierarchies.map(h => (\n <div key={h.name} className=\"dc:text-[10px]\">\n <span className=\"dc:font-medium\">{h.title}</span>\n <span className=\"text-dc-text-muted dc:ml-1\">\n ({h.levels.map(l => l.split('.')[1] || l).join(' > ')})\n </span>\n </div>\n ))}\n </div>\n </DetailRow>\n )}\n {cube.meta?.eventStream && (\n <DetailRow label=\"Event Stream\">\n <div className=\"dc:text-[10px]\">\n <span className=\"text-dc-text-muted\">binding: </span>\n <span className=\"dc:font-mono\">{cube.meta.eventStream.bindingKey.split('.')[1] || cube.meta.eventStream.bindingKey}</span>\n <span className=\"text-dc-text-muted dc:ml-2\">time: </span>\n <span className=\"dc:font-mono\">{cube.meta.eventStream.timeDimension.split('.')[1] || cube.meta.eventStream.timeDimension}</span>\n </div>\n </DetailRow>\n )}\n </div>\n )\n}\n\nexport function FieldDetailPanel({ selection, meta, onClose }: FieldDetailPanelProps) {\n const CloseIcon = getIcon('close')\n\n const cube = meta.cubes.find(c => c.name === selection.cubeName)\n if (!cube) return null\n\n // Determine what to show\n let title: string\n let dotColor: string\n let sectionBgColor: string\n let content: ReactNode\n\n if (selection.fieldType === 'cube' || !selection.fieldName) {\n title = cube.title || cube.name\n dotColor = 'var(--dc-accent)'\n sectionBgColor = 'color-mix(in srgb, var(--dc-accent) 10%, var(--dc-surface))'\n content = <CubeDetail cube={cube} />\n } else if (selection.fieldType === 'measure') {\n const measure = cube.measures.find(m => {\n const mField = m.name.split('.')[1] || m.name\n return mField === selection.fieldName || m.name === selection.fieldName\n })\n if (!measure) return null\n title = measure.shortTitle || measure.title || selection.fieldName\n dotColor = 'var(--dc-warning)'\n sectionBgColor = 'color-mix(in srgb, var(--dc-warning) 10%, var(--dc-surface))'\n content = <MeasureDetail measure={measure} cube={cube} />\n } else {\n const dimension = cube.dimensions.find(d => {\n const dField = d.name.split('.')[1] || d.name\n return dField === selection.fieldName || d.name === selection.fieldName\n })\n if (!dimension) return null\n title = dimension.shortTitle || dimension.title || selection.fieldName\n dotColor = dimension.type === 'time' ? 'var(--dc-accent)' : 'var(--dc-success)'\n sectionBgColor = dimension.type === 'time'\n ? 'color-mix(in srgb, var(--dc-accent) 10%, var(--dc-surface))'\n : 'color-mix(in srgb, var(--dc-success) 10%, var(--dc-surface))'\n content = <DimensionDetail dimension={dimension} cube={cube} />\n }\n\n return (\n <div\n className=\"dc:border-2 dc:rounded-lg dc:shadow-lg dc:min-w-[260px] dc:max-w-[320px] dc:overflow-hidden dc:transition-all border-dc-border\"\n style={{ backgroundColor: 'var(--dc-surface)' }}\n >\n {/* Header - same style as CubeNode section headers */}\n <div\n className=\"dc:px-4 dc:py-2.5 dc:border-b border-dc-border dc:flex dc:items-center dc:justify-between\"\n style={{ backgroundColor: sectionBgColor }}\n >\n <div className=\"dc:flex dc:items-center dc:gap-2 dc:min-w-0\">\n <span\n className=\"dc:w-2 dc:h-2 dc:rounded-full dc:flex-shrink-0\"\n style={{ backgroundColor: dotColor }}\n />\n <h4 className=\"dc:text-sm dc:font-semibold text-dc-text dc:truncate\">{title}</h4>\n </div>\n <button\n onClick={onClose}\n className=\"dc:ml-2 dc:flex-shrink-0 text-dc-text-muted dc:hover:text-dc-text dc:transition-colors\"\n >\n <CloseIcon className=\"dc:w-3.5 dc:h-3.5\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"dc:px-4 dc:py-3\">\n {content}\n </div>\n </div>\n )\n}\n","import { useState, useEffect, useRef, useMemo } from 'react'\nimport type { Node, Edge, Position } from '@xyflow/react'\n\nexport interface LayoutOptions {\n direction: 'TB' | 'LR'\n nodeWidth: number\n nodeSep: number\n rankSep: number\n}\n\nexport const defaultLayoutOptions: LayoutOptions = {\n direction: 'LR',\n nodeWidth: 340,\n nodeSep: 150,\n rankSep: 350,\n}\n\n/**\n * Layout state machine phases:\n * waiting → ELK not loaded yet, nothing to show\n * computing → ELK loaded, running layout algorithm\n * ready → layout complete, node positions available\n */\nexport type LayoutPhase = 'waiting' | 'computing' | 'ready'\n\nfunction getTargetPosition(direction: string): Position {\n switch (direction) {\n case 'TB': return 'top' as Position\n case 'LR': return 'left' as Position\n default: return 'top' as Position\n }\n}\n\nfunction getSourcePosition(direction: string): Position {\n switch (direction) {\n case 'TB': return 'bottom' as Position\n case 'LR': return 'right' as Position\n default: return 'bottom' as Position\n }\n}\n\n/**\n * Estimate the rendered pixel height of a CubeNode.\n */\nfunction estimateNodeHeight(node: Node): number {\n const cube = node.data?.cube as {\n measures?: unknown[]\n dimensions?: { type?: string }[]\n description?: string\n } | undefined\n if (!cube) return 300\n\n const HEADER = cube.description ? 80 : 56\n const SECTION_HEADER = 36\n const ROW = 34\n const MAX_BODY = 256\n const PADDING = 30\n\n let h = HEADER\n const measures = cube.measures?.length ?? 0\n const timeDims = cube.dimensions?.filter((d) => d.type === 'time').length ?? 0\n const regularDims = cube.dimensions?.filter((d) => d.type !== 'time').length ?? 0\n\n if (measures > 0) h += SECTION_HEADER + Math.min(measures * ROW, MAX_BODY)\n if (timeDims > 0) h += SECTION_HEADER + Math.min(timeDims * ROW, MAX_BODY)\n if (regularDims > 0) h += SECTION_HEADER + Math.min(regularDims * ROW, MAX_BODY)\n\n return h + PADDING\n}\n\n// --- ELK singleton (module-level, loaded once) ---\n\ninterface ELKInstance {\n layout(graph: unknown): Promise<unknown>\n}\n\nlet elkInstance: ELKInstance | null = null\nlet elkLoadPromise: Promise<ELKInstance | null> | null = null\n\nfunction loadElk(): Promise<ELKInstance | null> {\n if (elkLoadPromise) return elkLoadPromise\n // elkjs is an optional peer dependency - if not installed, the catch() handles it.\n elkLoadPromise = import('elkjs/lib/elk.bundled.js')\n .then((mod) => {\n const ELK = (mod as unknown as { default?: new () => ELKInstance }).default || mod\n elkInstance = new (ELK as unknown as new () => ELKInstance)()\n return elkInstance\n })\n .catch(() => null)\n return elkLoadPromise\n}\n\n// Force-export to prevent tree shaking of the side-effectful import\nexport { loadElk as _elkLoadPromise }\n\n// --- ELK layout computation (pure async function, no hooks) ---\n\ninterface ElkPort {\n id: string\n layoutOptions: Record<string, string>\n}\n\ninterface ElkNode {\n id: string\n width: number\n height: number\n layoutOptions?: Record<string, string>\n ports?: ElkPort[]\n}\n\ninterface ElkEdge {\n id: string\n sources: string[]\n targets: string[]\n}\n\ninterface ElkResultNode { id: string; x: number; y: number }\n\ninterface ElkResult {\n children?: ElkResultNode[]\n}\n\nexport interface ElkLayoutResult {\n nodes: Node[]\n edges: Edge[]\n}\n\nasync function computeElkLayout(\n nodes: Node[],\n edges: Edge[],\n opts: LayoutOptions,\n): Promise<ElkLayoutResult> {\n // Ensure ELK is loaded (lazy, webpack-safe)\n await loadElk()\n if (!elkInstance) {\n // ELK failed to load — return grid fallback\n return { nodes: layoutWithGrid(nodes, opts), edges }\n }\n\n const sourceSide = opts.direction === 'LR' ? 'EAST' : 'SOUTH'\n const targetSide = opts.direction === 'LR' ? 'WEST' : 'NORTH'\n\n // Per-edge ports so ELK spreads connections along the node side\n const nodeSourceEdges = new Map<string, string[]>()\n const nodeTargetEdges = new Map<string, string[]>()\n edges.forEach(edge => {\n if (!nodeSourceEdges.has(edge.source)) nodeSourceEdges.set(edge.source, [])\n nodeSourceEdges.get(edge.source)!.push(edge.id)\n if (!nodeTargetEdges.has(edge.target)) nodeTargetEdges.set(edge.target, [])\n nodeTargetEdges.get(edge.target)!.push(edge.id)\n })\n\n const elkNodes: ElkNode[] = nodes.map((node) => {\n const w = opts.nodeWidth\n const h = estimateNodeHeight(node)\n\n const srcEdges = nodeSourceEdges.get(node.id) || []\n const tgtEdges = nodeTargetEdges.get(node.id) || []\n const ports: ElkPort[] = [\n ...srcEdges.map(edgeId => ({\n id: `${node.id}__src__${edgeId}`,\n layoutOptions: { 'elk.port.side': sourceSide },\n })),\n ...tgtEdges.map(edgeId => ({\n id: `${node.id}__tgt__${edgeId}`,\n layoutOptions: { 'elk.port.side': targetSide },\n })),\n ]\n\n return {\n id: node.id,\n width: w,\n height: h,\n layoutOptions: { 'elk.portConstraints': 'FIXED_SIDE' },\n ports,\n }\n })\n\n const elkEdges: ElkEdge[] = edges.map((edge) => ({\n id: edge.id,\n sources: [`${edge.source}__src__${edge.id}`],\n targets: [`${edge.target}__tgt__${edge.id}`],\n }))\n\n const elkDirection = opts.direction === 'LR' ? 'RIGHT' : 'DOWN'\n\n const graph = {\n id: 'root',\n layoutOptions: {\n 'elk.algorithm': 'layered',\n 'elk.direction': elkDirection,\n 'elk.edgeRouting': 'SPLINES',\n 'elk.layered.edgeRouting.splines.mode': 'CONSERVATIVE',\n 'elk.spacing.nodeNode': String(opts.nodeSep),\n 'elk.layered.spacing.nodeNodeBetweenLayers': String(opts.rankSep),\n 'elk.spacing.edgeNode': '60',\n 'elk.layered.spacing.edgeNodeBetweenLayers': '60',\n 'elk.spacing.edgeEdge': '25',\n 'elk.layered.nodePlacement.strategy': 'NETWORK_SIMPLEX',\n 'elk.layered.crossingMinimization.strategy': 'LAYER_SWEEP',\n },\n children: elkNodes,\n edges: elkEdges,\n }\n\n const result = await elkInstance.layout(graph) as ElkResult\n\n // Extract node positions (ELK returns top-left, same as React Flow)\n const positionMap = new Map<string, { x: number; y: number }>()\n if (result.children) {\n for (const child of result.children) {\n positionMap.set(child.id, { x: child.x, y: child.y })\n }\n }\n\n const layoutedNodes = nodes.map((node) => ({\n ...node,\n position: positionMap.get(node.id) || node.position,\n targetPosition: getTargetPosition(opts.direction),\n sourcePosition: getSourcePosition(opts.direction),\n }))\n\n // Return positioned nodes + original edges.\n // Edge rendering is handled by React Flow's getBezierPath() which knows\n // the actual handle positions — much more accurate than ELK's spline routes.\n return { nodes: layoutedNodes, edges }\n}\n\nfunction layoutWithGrid(nodes: Node[], opts: LayoutOptions): Node[] {\n const COL_HEIGHT_LIMIT = 1200\n let col = 0\n let colY = 0\n\n return nodes.map((node) => {\n const h = estimateNodeHeight(node)\n if (colY + h > COL_HEIGHT_LIMIT && colY > 0) {\n col++\n colY = 0\n }\n const position = { x: col * (opts.nodeWidth + opts.nodeSep), y: colY }\n colY += h + 40\n\n return {\n ...node,\n position,\n sourcePosition: getSourcePosition(opts.direction),\n targetPosition: getTargetPosition(opts.direction),\n }\n })\n}\n\n// --- Hook: single computation per structure key, no races ---\n\n/**\n * Layout hook with explicit state machine.\n *\n * - Waits for ELK to load (phase: 'waiting')\n * - Runs layout once per unique node/edge structure (phase: 'computing')\n * - Returns stable result (phase: 'ready')\n *\n * The effect only depends on a string structure key, NOT object references.\n * This prevents re-renders from cancelling in-flight computations.\n */\nexport function useERDLayout(\n nodes: Node[],\n edges: Edge[],\n options: Partial<LayoutOptions> = {}\n): { nodes: Node[]; edges: Edge[]; phase: LayoutPhase } {\n const opts = useMemo(\n () => ({ ...defaultLayoutOptions, ...options }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [options.direction, options.nodeWidth, options.nodeSep, options.rankSep]\n )\n\n // Stable structure key — only changes when node/edge IDs change\n const structureKey = useMemo(() => {\n if (nodes.length === 0) return ''\n return nodes.map(n => n.id).sort().join(',') + '|' + edges.map(e => e.id).sort().join(',')\n }, [nodes, edges])\n\n // Refs hold latest values so the effect closure always reads current data\n // without needing them as dependencies\n const nodesRef = useRef(nodes)\n const edgesRef = useRef(edges)\n const optsRef = useRef(opts)\n nodesRef.current = nodes\n edgesRef.current = edges\n optsRef.current = opts\n\n const [phase, setPhase] = useState<LayoutPhase>('waiting')\n const [result, setResult] = useState<ElkLayoutResult | null>(null)\n const [resultKey, setResultKey] = useState('')\n\n // Single computation per structure key\n const computeIdRef = useRef(0)\n\n useEffect(() => {\n if (!structureKey) {\n setPhase('ready')\n setResult(null)\n setResultKey('')\n return\n }\n\n const id = ++computeIdRef.current\n setPhase('computing')\n\n computeElkLayout(nodesRef.current, edgesRef.current, optsRef.current)\n .then(layoutResult => {\n // Only apply if this is still the latest computation\n if (id !== computeIdRef.current) return\n setResult(layoutResult)\n setResultKey(structureKey)\n setPhase('ready')\n })\n .catch(() => {\n if (id !== computeIdRef.current) return\n // On error, use grid fallback\n setResult({\n nodes: layoutWithGrid(nodesRef.current, optsRef.current),\n edges: edgesRef.current,\n })\n setResultKey(structureKey)\n setPhase('ready')\n })\n }, [structureKey]) // ONLY depends on structure key — no object refs\n\n // Output: only return layout when it matches current structure\n if (phase === 'ready' && result && resultKey === structureKey) {\n return { nodes: result.nodes, edges: result.edges, phase: 'ready' }\n }\n\n return { nodes: [], edges: [], phase }\n}\n","import { useCallback, useMemo, useEffect, useState, useRef } from 'react'\nimport type { MouseEvent as ReactMouseEvent } from 'react'\nimport type { Node, Edge, NodeChange, EdgeChange } from '@xyflow/react'\nimport '@xyflow/react/dist/style.css'\n\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport { CubeNode } from './CubeNode'\nimport { RelationshipEdge } from './RelationshipEdge'\nimport { FieldDetailPanel } from './FieldDetailPanel'\nimport type { FieldSelection } from './FieldDetailPanel'\nimport { useERDLayout } from './useERDLayout'\nimport { getIcon } from '../../icons'\nimport { useXyflow } from './xyflowContext'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nconst nodeTypes = { cubeNode: CubeNode }\nconst edgeTypes = { relationshipEdge: RelationshipEdge }\n\n/**\n * Inner component that uses useNodesInitialized() (must be inside <ReactFlow>).\n * Calls fitView exactly once per fitViewToken change, after all nodes are measured.\n */\nfunction FitViewOnReady({ token }: { token: number }) {\n const { useNodesInitialized, useReactFlow } = useXyflow()\n const nodesInitialized = useNodesInitialized()\n const { fitView } = useReactFlow()\n const appliedTokenRef = useRef(0)\n\n useEffect(() => {\n if (token === 0 || token === appliedTokenRef.current) return\n if (!nodesInitialized) return\n appliedTokenRef.current = token\n fitView({ padding: 0.1 })\n }, [token, nodesInitialized, fitView])\n\n return null\n}\n\n// Stable empty arrays (avoid new [] on every render)\nconst EMPTY_STRINGS: string[] = []\n\nexport interface SchemaVisualizationProps {\n className?: string\n onFieldClick?: (cubeName: string, fieldName: string, fieldType: 'measure' | 'dimension') => void\n highlightedCubes?: string[]\n highlightedFields?: string[]\n searchTerm?: string\n height?: string | number\n}\n\nfunction getRelationshipColor(relationship: string): string {\n switch (relationship) {\n case 'belongsTo': return '#10b981'\n case 'hasOne': return '#3b82f6'\n case 'hasMany': return '#f59e0b'\n case 'belongsToMany': return '#8b5cf6'\n default: return '#6b7280'\n }\n}\n\nexport function SchemaVisualization({\n className = '',\n onFieldClick,\n highlightedCubes,\n highlightedFields,\n searchTerm,\n height = '100%',\n}: SchemaVisualizationProps) {\n const { t } = useTranslation()\n const {\n ReactFlow: ReactFlowComponent,\n Controls,\n MiniMap,\n Background,\n applyNodeChanges,\n } = useXyflow()\n const { meta, metaLoading, metaError } = useCubeContext()\n\n // Stabilize array props to avoid re-creating references every render\n const stableHighlightedCubes = highlightedCubes || EMPTY_STRINGS\n const stableHighlightedFields = highlightedFields || EMPTY_STRINGS\n\n const [contextMenu, setContextMenu] = useState<{ x: number; y: number } | null>(null)\n const [searchInput, setSearchInput] = useState(searchTerm || '')\n const [autoLayoutCounter, setAutoLayoutCounter] = useState(0)\n const [selectedField, setSelectedField] = useState<FieldSelection | null>(null)\n const [detailPosition, setDetailPosition] = useState<{ x: number; y: number } | null>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // In standalone mode (no onFieldClick), clicking fields shows the detail panel\n const isStandaloneMode = !onFieldClick\n const [savedPositions, setSavedPositions] = useState<Record<string, { x: number; y: number }>>({})\n const [positionsLoaded, setPositionsLoaded] = useState(false)\n\n const SearchIcon = getIcon('search')\n const CloseIcon = getIcon('close')\n\n const effectiveSearchTerm = searchTerm !== undefined ? searchTerm : searchInput\n\n // Load saved positions from localStorage (once)\n useEffect(() => {\n try {\n const saved = localStorage.getItem('drizzle-cube-erd-node-positions')\n if (saved) setSavedPositions(JSON.parse(saved))\n } catch { /* ignore */ }\n setPositionsLoaded(true)\n }, [])\n\n // --- Structural data: only depends on meta (stable) ---\n // Separate structure (for layout) from presentation (highlights/search)\n\n const { structuralNodes, structuralEdges } = useMemo(() => {\n if (!meta) return { structuralNodes: [] as Node[], structuralEdges: [] as Edge[] }\n\n const nodes: Node[] = meta.cubes.map((cube, index) => ({\n id: cube.name,\n type: 'cubeNode',\n // Placeholder position — ELK will override for auto-layout\n position: { x: (index % 3) * 400, y: Math.floor(index / 3) * 300 },\n data: { cube },\n }))\n\n const edges: Edge[] = []\n meta.cubes.forEach(cube => {\n if (cube.relationships) {\n cube.relationships.forEach((rel, i) => {\n if (rel.relationship === 'belongsTo') return\n edges.push({\n id: `${cube.name}-${rel.targetCube}-${i}`,\n source: cube.name,\n target: rel.targetCube,\n type: 'relationshipEdge',\n data: { relationship: rel, joinFields: rel.joinFields || [] },\n animated: false,\n style: { stroke: getRelationshipColor(rel.relationship), strokeWidth: 2 },\n })\n })\n }\n })\n\n return { structuralNodes: nodes, structuralEdges: edges }\n }, [meta]) // Only meta — no highlights/search/callbacks\n\n // --- Layout decision ---\n const needsAutoLayout = autoLayoutCounter > 0 || (positionsLoaded && Object.keys(savedPositions).length === 0)\n\n // Run ELK layout (only when auto-layout needed, otherwise pass empty to skip)\n const { nodes: elkNodes, edges: elkEdges, phase: layoutPhase } = useERDLayout(\n needsAutoLayout ? structuralNodes : [],\n needsAutoLayout ? structuralEdges : [],\n { direction: 'LR', nodeWidth: 340, nodeSep: 150, rankSep: 350 }\n )\n\n // --- Build display data: merge layout positions + presentation data ---\n\n // Convert client coords to container-relative, clamped to keep panel in view\n const toContainerPos = useCallback((clientX: number, clientY: number) => {\n const rect = containerRef.current?.getBoundingClientRect()\n if (!rect) return { x: clientX, y: clientY }\n const panelW = 300, panelH = 200 // approximate panel size for clamping\n let x = clientX - rect.left + 12 // offset slightly right of cursor\n let y = clientY - rect.top + 12 // offset slightly below cursor\n // Clamp so panel doesn't overflow right/bottom\n if (x + panelW > rect.width) x = clientX - rect.left - panelW - 12\n if (y + panelH > rect.height) y = rect.height - panelH - 8\n if (x < 0) x = 8\n if (y < 0) y = 8\n return { x, y }\n }, [])\n\n // Internal field click handler for standalone mode\n const handleInternalFieldClick = useCallback((cubeName: string, fieldName: string, fieldType: 'measure' | 'dimension', pos?: { x: number; y: number }) => {\n setSelectedField(prev => {\n if (prev && prev.cubeName === cubeName && prev.fieldName === fieldName) {\n setDetailPosition(null)\n return null\n }\n if (pos) setDetailPosition(toContainerPos(pos.x, pos.y))\n return { cubeName, fieldName, fieldType }\n })\n }, [toContainerPos])\n\n const handleInternalCubeClick = useCallback((cubeName: string, pos?: { x: number; y: number }) => {\n setSelectedField(prev => {\n if (prev && prev.cubeName === cubeName && prev.fieldName === null) {\n setDetailPosition(null)\n return null\n }\n if (pos) setDetailPosition(toContainerPos(pos.x, pos.y))\n return { cubeName, fieldName: null, fieldType: 'cube' }\n })\n }, [toContainerPos])\n\n const effectiveFieldClick = isStandaloneMode ? handleInternalFieldClick : onFieldClick\n const effectiveCubeClick = isStandaloneMode ? handleInternalCubeClick : undefined\n\n const buildNodeData = useCallback((cube: unknown) => ({\n cube,\n onFieldClick: effectiveFieldClick,\n onCubeClick: effectiveCubeClick,\n isHighlighted: stableHighlightedCubes.includes((cube as { name: string }).name),\n highlightedFields: stableHighlightedFields,\n searchTerm: effectiveSearchTerm,\n selectedField: isStandaloneMode ? selectedField : null,\n }), [effectiveFieldClick, effectiveCubeClick, stableHighlightedCubes, stableHighlightedFields, effectiveSearchTerm, isStandaloneMode, selectedField])\n\n // Determine if layout is resolved (ready to render ReactFlow)\n const layoutReady = !needsAutoLayout || layoutPhase === 'ready'\n\n const displayNodes = useMemo(() => {\n if (!meta || !layoutReady || !positionsLoaded) return []\n\n if (needsAutoLayout && elkNodes.length > 0) {\n // Use ELK-positioned nodes, inject presentation data\n return elkNodes.map(node => ({\n ...node,\n data: buildNodeData(node.data?.cube || meta.cubes.find(c => c.name === node.id)),\n }))\n }\n\n // Use saved positions\n return structuralNodes.map(node => ({\n ...node,\n position: savedPositions[node.id] || node.position,\n data: buildNodeData(node.data?.cube),\n }))\n }, [meta, layoutReady, positionsLoaded, needsAutoLayout, elkNodes, structuralNodes, savedPositions, buildNodeData])\n\n const displayEdges = useMemo(() => {\n if (!meta || !layoutReady) return []\n if (needsAutoLayout && elkEdges.length > 0) return elkEdges\n return structuralEdges\n }, [meta, layoutReady, needsAutoLayout, elkEdges, structuralEdges])\n\n // --- Controlled ReactFlow state ---\n const [rfNodes, setRfNodes] = useState<Node[]>([])\n const [rfEdges, setRfEdges] = useState<Edge[]>([])\n const appliedLayoutKeyRef = useRef('')\n const [fitViewToken, setFitViewToken] = useState(0) // increment to request fitView\n\n // Push layout to ReactFlow — only when positions change (not on data-only changes)\n useEffect(() => {\n if (displayNodes.length === 0) return\n\n const key = displayNodes.map(n => `${n.id}:${Math.round(n.position.x)},${Math.round(n.position.y)}`).join('|')\n if (key === appliedLayoutKeyRef.current) return\n\n const isFirstLayout = appliedLayoutKeyRef.current === ''\n appliedLayoutKeyRef.current = key\n setRfNodes(displayNodes)\n setRfEdges(displayEdges)\n\n // Request fitView on first layout\n if (isFirstLayout) {\n setFitViewToken(prev => prev + 1)\n }\n }, [displayNodes, displayEdges])\n\n // Update presentation data (highlights, search) without resetting positions\n const prevPresentationRef = useRef('')\n useEffect(() => {\n const selectedKey = selectedField ? `${selectedField.cubeName}.${selectedField.fieldName}` : ''\n const presentationKey = `${stableHighlightedCubes.join(',')}|${stableHighlightedFields.join(',')}|${effectiveSearchTerm}|${String(onFieldClick)}|${selectedKey}`\n if (presentationKey === prevPresentationRef.current) return\n prevPresentationRef.current = presentationKey\n\n if (rfNodes.length === 0 || !meta) return\n setRfNodes(prev => prev.map(node => {\n const cube = meta.cubes.find(c => c.name === node.id)\n if (!cube) return node\n return { ...node, data: buildNodeData(cube) }\n }))\n }, [stableHighlightedCubes, stableHighlightedFields, effectiveSearchTerm, onFieldClick, selectedField, rfNodes.length, meta, buildNodeData])\n\n // Handle node changes (dragging)\n const handleNodesChange = useCallback((changes: NodeChange[]) => {\n setRfNodes(nds => applyNodeChanges(changes, nds))\n\n // Save positions on drag end\n const dragEnds = changes.filter(\n (c) => c.type === 'position' && 'dragging' in c && c.dragging === false\n )\n if (dragEnds.length > 0) {\n setRfNodes(currentNodes => {\n const positions: Record<string, { x: number; y: number }> = {}\n currentNodes.forEach(n => { if (n.position) positions[n.id] = n.position })\n try { localStorage.setItem('drizzle-cube-erd-node-positions', JSON.stringify(positions)) } catch { /* ignore */ }\n setSavedPositions(positions)\n return currentNodes\n })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const handleEdgesChange = useCallback((_changes: EdgeChange[]) => {}, [])\n\n const handleContextMenu = useCallback((event: ReactMouseEvent | MouseEvent) => {\n event.preventDefault()\n event.stopPropagation()\n setContextMenu({ x: event.clientX, y: event.clientY })\n }, [])\n\n const handleClick = useCallback(() => {\n if (contextMenu) setContextMenu(null)\n if (selectedField) { setSelectedField(null); setDetailPosition(null) }\n }, [contextMenu, selectedField])\n\n const handleAutoLayout = useCallback(() => {\n setSavedPositions({})\n appliedLayoutKeyRef.current = '' // force re-apply → layout effect will request fitView\n try { localStorage.removeItem('drizzle-cube-erd-node-positions') } catch { /* ignore */ }\n setAutoLayoutCounter(c => c + 1)\n setContextMenu(null)\n }, [])\n\n // --- Render ---\n\n if (metaLoading) {\n return (\n <div className={`dc:flex dc:items-center dc:justify-center dc:h-96 ${className}`}>\n <div className=\"dc:text-center\">\n <div className=\"dc:animate-spin dc:rounded-full dc:h-8 dc:w-8 dc:border-b-2 border-dc-accent dc:mx-auto dc:mb-2\" />\n <p className=\"text-dc-text-muted\">{t('schema.loading')}</p>\n </div>\n </div>\n )\n }\n\n if (metaError) {\n return (\n <div className={`dc:flex dc:items-center dc:justify-center dc:h-96 ${className}`}>\n <div className=\"dc:text-center text-dc-error\">\n <p className=\"dc:font-medium\">{t('schema.error')}</p>\n <p className=\"dc:text-sm dc:mt-1\">{metaError}</p>\n </div>\n </div>\n )\n }\n\n if (!meta || meta.cubes.length === 0) {\n return (\n <div className={`dc:flex dc:items-center dc:justify-center dc:h-96 ${className}`}>\n <div className=\"dc:text-center text-dc-text-muted\">\n <p className=\"dc:font-medium\">{t('schema.noCubes')}</p>\n <p className=\"dc:text-sm dc:mt-1\">{t('schema.noCubesHint')}</p>\n </div>\n </div>\n )\n }\n\n // Show loading while ELK computes layout (no grid flash)\n if (!layoutReady) {\n return (\n <div className={`dc:flex dc:items-center dc:justify-center dc:h-96 ${className}`}>\n <div className=\"dc:text-center\">\n <div className=\"dc:animate-spin dc:rounded-full dc:h-8 dc:w-8 dc:border-b-2 border-dc-accent dc:mx-auto dc:mb-2\" />\n <p className=\"text-dc-text-muted\">{t('schema.computingLayout')}</p>\n </div>\n </div>\n )\n }\n\n return (\n <div className={`dc:flex dc:flex-col ${className}`} style={{ height, minHeight: 400 }}>\n {searchTerm === undefined && (\n <div className=\"dc:px-3 dc:py-2 dc:border-b border-dc-border bg-dc-surface dc:flex dc:items-center dc:gap-2 dc:flex-shrink-0\">\n <SearchIcon className=\"dc:w-4 dc:h-4 text-dc-text-muted\" />\n <input\n type=\"text\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n placeholder={t('schema.searchPlaceholder')}\n className=\"dc:flex-1 dc:text-sm dc:bg-transparent dc:outline-none text-dc-text dc:placeholder:text-dc-text-muted\"\n />\n {searchInput && (\n <button onClick={() => setSearchInput('')} className=\"text-dc-text-muted dc:hover:text-dc-text\">\n <CloseIcon className=\"dc:w-3 dc:h-3\" />\n </button>\n )}\n </div>\n )}\n\n <div ref={containerRef} className=\"dc:relative dc:flex-1 dc:min-h-0\">\n <div style={{ position: 'absolute', inset: 0 }}>\n <ReactFlowComponent\n nodes={rfNodes}\n edges={rfEdges}\n onNodesChange={handleNodesChange}\n onEdgesChange={handleEdgesChange}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n connectionMode={'loose' as never}\n minZoom={0.1}\n maxZoom={2}\n proOptions={{ hideAttribution: true }}\n onPaneContextMenu={handleContextMenu}\n onPaneClick={handleClick}\n >\n <Controls />\n <MiniMap\n nodeColor={(node) => stableHighlightedCubes.includes(node.id) ? '#8b5cf6' : '#e5e7eb'}\n maskColor=\"rgb(240, 242, 246, 0.7)\"\n />\n <Background variant={'dots' as never} gap={12} size={1} />\n <FitViewOnReady token={fitViewToken} />\n </ReactFlowComponent>\n </div>\n\n {/* Field detail panel for standalone browse mode */}\n {isStandaloneMode && selectedField && detailPosition && meta && (\n <div\n className=\"dc:absolute dc:z-20\"\n style={{ left: detailPosition.x, top: detailPosition.y }}\n >\n <FieldDetailPanel\n selection={selectedField}\n meta={meta}\n onClose={() => { setSelectedField(null); setDetailPosition(null) }}\n />\n </div>\n )}\n </div>\n\n {contextMenu && (\n <div\n className=\"dc:fixed dc:z-50 bg-dc-surface dc:rounded-md dc:shadow-lg dc:border border-dc-border dc:py-1 dc:min-w-[120px]\"\n style={{ left: contextMenu.x, top: contextMenu.y }}\n >\n <button\n onClick={handleAutoLayout}\n className=\"dc:w-full dc:px-3 dc:py-2 dc:text-sm text-dc-text-secondary dc:hover:bg-dc-surface-hover dc:text-left\"\n >\n {t('schema.autoLayout')}\n </button>\n </div>\n )}\n </div>\n )\n}\n\nexport default SchemaVisualization\n"],"mappings":"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"}
@@ -1,12 +1,12 @@
1
- import { V as e, Z as t, et as n, lt as r } from "./chart-data-table-2iCsn0CF.js";
2
- import { i, l as a } from "./chart-funnel-poyOf7-e.js";
3
- import { n as o } from "./chart-sankey-BOyxfG1Q.js";
1
+ import { V as e, Z as t, et as n, lt as r } from "./chart-data-table-C3Xh9jwL.js";
2
+ import { i, l as a } from "./chart-funnel-C7pgktN5.js";
3
+ import { n as o } from "./chart-sankey-WwkZAhLy.js";
4
4
  import { useCallback as s, useEffect as c, useMemo as l, useRef as u, useState as d } from "react";
5
5
  //#region src/client/shared/types.ts
6
6
  var f = {
7
7
  equals: {
8
- label: "equals",
9
- description: "Exact match",
8
+ label: "filter.operator.equals.label",
9
+ description: "filter.operator.equals.description",
10
10
  requiresValues: !0,
11
11
  supportsMultipleValues: !0,
12
12
  valueType: "any",
@@ -18,8 +18,8 @@ var f = {
18
18
  ]
19
19
  },
20
20
  notEquals: {
21
- label: "not equals",
22
- description: "Does not match",
21
+ label: "filter.operator.notEquals.label",
22
+ description: "filter.operator.notEquals.description",
23
23
  requiresValues: !0,
24
24
  supportsMultipleValues: !0,
25
25
  valueType: "any",
@@ -31,80 +31,80 @@ var f = {
31
31
  ]
32
32
  },
33
33
  contains: {
34
- label: "contains",
35
- description: "Contains text (case insensitive)",
34
+ label: "filter.operator.contains.label",
35
+ description: "filter.operator.contains.description",
36
36
  requiresValues: !0,
37
37
  supportsMultipleValues: !1,
38
38
  valueType: "string",
39
39
  fieldTypes: ["string"]
40
40
  },
41
41
  notContains: {
42
- label: "not contains",
43
- description: "Does not contain text",
42
+ label: "filter.operator.notContains.label",
43
+ description: "filter.operator.notContains.description",
44
44
  requiresValues: !0,
45
45
  supportsMultipleValues: !1,
46
46
  valueType: "string",
47
47
  fieldTypes: ["string"]
48
48
  },
49
49
  startsWith: {
50
- label: "starts with",
51
- description: "Starts with text",
50
+ label: "filter.operator.startsWith.label",
51
+ description: "filter.operator.startsWith.description",
52
52
  requiresValues: !0,
53
53
  supportsMultipleValues: !1,
54
54
  valueType: "string",
55
55
  fieldTypes: ["string"]
56
56
  },
57
57
  notStartsWith: {
58
- label: "not starts with",
59
- description: "Does not start with text",
58
+ label: "filter.operator.notStartsWith.label",
59
+ description: "filter.operator.notStartsWith.description",
60
60
  requiresValues: !0,
61
61
  supportsMultipleValues: !1,
62
62
  valueType: "string",
63
63
  fieldTypes: ["string"]
64
64
  },
65
65
  endsWith: {
66
- label: "ends with",
67
- description: "Ends with text",
66
+ label: "filter.operator.endsWith.label",
67
+ description: "filter.operator.endsWith.description",
68
68
  requiresValues: !0,
69
69
  supportsMultipleValues: !1,
70
70
  valueType: "string",
71
71
  fieldTypes: ["string"]
72
72
  },
73
73
  notEndsWith: {
74
- label: "not ends with",
75
- description: "Does not end with text",
74
+ label: "filter.operator.notEndsWith.label",
75
+ description: "filter.operator.notEndsWith.description",
76
76
  requiresValues: !0,
77
77
  supportsMultipleValues: !1,
78
78
  valueType: "string",
79
79
  fieldTypes: ["string"]
80
80
  },
81
81
  like: {
82
- label: "like",
83
- description: "SQL LIKE pattern matching (case sensitive)",
82
+ label: "filter.operator.like.label",
83
+ description: "filter.operator.like.description",
84
84
  requiresValues: !0,
85
85
  supportsMultipleValues: !1,
86
86
  valueType: "string",
87
87
  fieldTypes: ["string"]
88
88
  },
89
89
  notLike: {
90
- label: "not like",
91
- description: "SQL NOT LIKE pattern matching (case sensitive)",
90
+ label: "filter.operator.notLike.label",
91
+ description: "filter.operator.notLike.description",
92
92
  requiresValues: !0,
93
93
  supportsMultipleValues: !1,
94
94
  valueType: "string",
95
95
  fieldTypes: ["string"]
96
96
  },
97
97
  ilike: {
98
- label: "ilike",
99
- description: "SQL ILIKE pattern matching (case insensitive)",
98
+ label: "filter.operator.ilike.label",
99
+ description: "filter.operator.ilike.description",
100
100
  requiresValues: !0,
101
101
  supportsMultipleValues: !1,
102
102
  valueType: "string",
103
103
  fieldTypes: ["string"]
104
104
  },
105
105
  gt: {
106
- label: "greater than",
107
- description: "Greater than value",
106
+ label: "filter.operator.gt.label",
107
+ description: "filter.operator.gt.description",
108
108
  requiresValues: !0,
109
109
  supportsMultipleValues: !1,
110
110
  valueType: "number",
@@ -118,8 +118,8 @@ var f = {
118
118
  ]
119
119
  },
120
120
  gte: {
121
- label: "greater than or equal",
122
- description: "Greater than or equal to value",
121
+ label: "filter.operator.gte.label",
122
+ description: "filter.operator.gte.description",
123
123
  requiresValues: !0,
124
124
  supportsMultipleValues: !1,
125
125
  valueType: "number",
@@ -133,8 +133,8 @@ var f = {
133
133
  ]
134
134
  },
135
135
  lt: {
136
- label: "less than",
137
- description: "Less than value",
136
+ label: "filter.operator.lt.label",
137
+ description: "filter.operator.lt.description",
138
138
  requiresValues: !0,
139
139
  supportsMultipleValues: !1,
140
140
  valueType: "number",
@@ -148,8 +148,8 @@ var f = {
148
148
  ]
149
149
  },
150
150
  lte: {
151
- label: "less than or equal",
152
- description: "Less than or equal to value",
151
+ label: "filter.operator.lte.label",
152
+ description: "filter.operator.lte.description",
153
153
  requiresValues: !0,
154
154
  supportsMultipleValues: !1,
155
155
  valueType: "number",
@@ -163,8 +163,8 @@ var f = {
163
163
  ]
164
164
  },
165
165
  between: {
166
- label: "between",
167
- description: "Between two values (inclusive)",
166
+ label: "filter.operator.between.label",
167
+ description: "filter.operator.between.description",
168
168
  requiresValues: !0,
169
169
  supportsMultipleValues: !1,
170
170
  valueType: "number",
@@ -178,8 +178,8 @@ var f = {
178
178
  ]
179
179
  },
180
180
  notBetween: {
181
- label: "not between",
182
- description: "Not between two values",
181
+ label: "filter.operator.notBetween.label",
182
+ description: "filter.operator.notBetween.description",
183
183
  requiresValues: !0,
184
184
  supportsMultipleValues: !1,
185
185
  valueType: "number",
@@ -193,8 +193,8 @@ var f = {
193
193
  ]
194
194
  },
195
195
  in: {
196
- label: "in",
197
- description: "Matches any of the provided values",
196
+ label: "filter.operator.in.label",
197
+ description: "filter.operator.in.description",
198
198
  requiresValues: !0,
199
199
  supportsMultipleValues: !0,
200
200
  valueType: "any",
@@ -205,8 +205,8 @@ var f = {
205
205
  ]
206
206
  },
207
207
  notIn: {
208
- label: "not in",
209
- description: "Does not match any of the provided values",
208
+ label: "filter.operator.notIn.label",
209
+ description: "filter.operator.notIn.description",
210
210
  requiresValues: !0,
211
211
  supportsMultipleValues: !0,
212
212
  valueType: "any",
@@ -217,8 +217,8 @@ var f = {
217
217
  ]
218
218
  },
219
219
  set: {
220
- label: "is set",
221
- description: "Is not null/empty",
220
+ label: "filter.operator.set.label",
221
+ description: "filter.operator.set.description",
222
222
  requiresValues: !1,
223
223
  supportsMultipleValues: !1,
224
224
  valueType: "any",
@@ -230,8 +230,8 @@ var f = {
230
230
  ]
231
231
  },
232
232
  notSet: {
233
- label: "is not set",
234
- description: "Is null/empty",
233
+ label: "filter.operator.notSet.label",
234
+ description: "filter.operator.notSet.description",
235
235
  requiresValues: !1,
236
236
  supportsMultipleValues: !1,
237
237
  valueType: "any",
@@ -243,80 +243,80 @@ var f = {
243
243
  ]
244
244
  },
245
245
  isEmpty: {
246
- label: "is empty",
247
- description: "Is empty string or null",
246
+ label: "filter.operator.isEmpty.label",
247
+ description: "filter.operator.isEmpty.description",
248
248
  requiresValues: !1,
249
249
  supportsMultipleValues: !1,
250
250
  valueType: "string",
251
251
  fieldTypes: ["string"]
252
252
  },
253
253
  isNotEmpty: {
254
- label: "is not empty",
255
- description: "Is not empty string and not null",
254
+ label: "filter.operator.isNotEmpty.label",
255
+ description: "filter.operator.isNotEmpty.description",
256
256
  requiresValues: !1,
257
257
  supportsMultipleValues: !1,
258
258
  valueType: "string",
259
259
  fieldTypes: ["string"]
260
260
  },
261
261
  inDateRange: {
262
- label: "in date range",
263
- description: "Between two dates",
262
+ label: "filter.operator.inDateRange.label",
263
+ description: "filter.operator.inDateRange.description",
264
264
  requiresValues: !0,
265
265
  supportsMultipleValues: !1,
266
266
  valueType: "date",
267
267
  fieldTypes: ["time"]
268
268
  },
269
269
  beforeDate: {
270
- label: "before date",
271
- description: "Before specified date",
270
+ label: "filter.operator.beforeDate.label",
271
+ description: "filter.operator.beforeDate.description",
272
272
  requiresValues: !0,
273
273
  supportsMultipleValues: !1,
274
274
  valueType: "date",
275
275
  fieldTypes: ["time"]
276
276
  },
277
277
  afterDate: {
278
- label: "after date",
279
- description: "After specified date",
278
+ label: "filter.operator.afterDate.label",
279
+ description: "filter.operator.afterDate.description",
280
280
  requiresValues: !0,
281
281
  supportsMultipleValues: !1,
282
282
  valueType: "date",
283
283
  fieldTypes: ["time"]
284
284
  },
285
285
  regex: {
286
- label: "matches regex",
287
- description: "Matches regular expression pattern",
286
+ label: "filter.operator.regex.label",
287
+ description: "filter.operator.regex.description",
288
288
  requiresValues: !0,
289
289
  supportsMultipleValues: !1,
290
290
  valueType: "string",
291
291
  fieldTypes: ["string"]
292
292
  },
293
293
  notRegex: {
294
- label: "not matches regex",
295
- description: "Does not match regular expression pattern",
294
+ label: "filter.operator.notRegex.label",
295
+ description: "filter.operator.notRegex.description",
296
296
  requiresValues: !0,
297
297
  supportsMultipleValues: !1,
298
298
  valueType: "string",
299
299
  fieldTypes: ["string"]
300
300
  },
301
301
  arrayContains: {
302
- label: "array contains all",
303
- description: "Array field contains all specified values (PostgreSQL only)",
302
+ label: "filter.operator.arrayContains.label",
303
+ description: "filter.operator.arrayContains.description",
304
304
  requiresValues: !0,
305
305
  supportsMultipleValues: !0,
306
306
  valueType: "string",
307
307
  fieldTypes: ["string"]
308
308
  },
309
309
  arrayOverlaps: {
310
- label: "array contains any",
311
- description: "Array field contains any of the specified values (PostgreSQL only)",
310
+ label: "filter.operator.arrayOverlaps.label",
311
+ description: "filter.operator.arrayOverlaps.description",
312
312
  requiresValues: !0,
313
313
  supportsMultipleValues: !0,
314
314
  valueType: "string",
315
315
  fieldTypes: ["string"]
316
316
  },
317
317
  arrayContained: {
318
- label: "array values in",
319
- description: "All array field values are within specified values (PostgreSQL only)",
318
+ label: "filter.operator.arrayContained.label",
319
+ description: "filter.operator.arrayContained.description",
320
320
  requiresValues: !0,
321
321
  supportsMultipleValues: !0,
322
322
  valueType: "string",
@@ -325,79 +325,79 @@ var f = {
325
325
  }, p = [
326
326
  {
327
327
  value: "custom",
328
- label: "Custom"
328
+ label: "dateRange.custom"
329
329
  },
330
330
  {
331
331
  value: "today",
332
- label: "Today"
332
+ label: "dateRange.today"
333
333
  },
334
334
  {
335
335
  value: "yesterday",
336
- label: "Yesterday"
336
+ label: "dateRange.yesterday"
337
337
  },
338
338
  {
339
339
  value: "this_week",
340
- label: "This week"
340
+ label: "dateRange.thisWeek"
341
341
  },
342
342
  {
343
343
  value: "this_month",
344
- label: "This month"
344
+ label: "dateRange.thisMonth"
345
345
  },
346
346
  {
347
347
  value: "this_quarter",
348
- label: "This quarter"
348
+ label: "dateRange.thisQuarter"
349
349
  },
350
350
  {
351
351
  value: "this_year",
352
- label: "This year"
352
+ label: "dateRange.thisYear"
353
353
  },
354
354
  {
355
355
  value: "last_7_days",
356
- label: "Last 7 days"
356
+ label: "dateRange.last7Days"
357
357
  },
358
358
  {
359
359
  value: "last_30_days",
360
- label: "Last 30 days"
360
+ label: "dateRange.last30Days"
361
361
  },
362
362
  {
363
363
  value: "last_n_days",
364
- label: "Last N days"
364
+ label: "dateRange.lastNDays"
365
365
  },
366
366
  {
367
367
  value: "last_week",
368
- label: "Last week"
368
+ label: "dateRange.lastWeek"
369
369
  },
370
370
  {
371
371
  value: "last_n_weeks",
372
- label: "Last N weeks"
372
+ label: "dateRange.lastNWeeks"
373
373
  },
374
374
  {
375
375
  value: "last_month",
376
- label: "Last month"
376
+ label: "dateRange.lastMonth"
377
377
  },
378
378
  {
379
379
  value: "last_12_months",
380
- label: "Last 12 months"
380
+ label: "dateRange.last12Months"
381
381
  },
382
382
  {
383
383
  value: "last_n_months",
384
- label: "Last N months"
384
+ label: "dateRange.lastNMonths"
385
385
  },
386
386
  {
387
387
  value: "last_quarter",
388
- label: "Last quarter"
388
+ label: "dateRange.lastQuarter"
389
389
  },
390
390
  {
391
391
  value: "last_n_quarters",
392
- label: "Last N quarters"
392
+ label: "dateRange.lastNQuarters"
393
393
  },
394
394
  {
395
395
  value: "last_year",
396
- label: "Last year"
396
+ label: "dateRange.lastYear"
397
397
  },
398
398
  {
399
399
  value: "last_n_years",
400
- label: "Last N years"
400
+ label: "dateRange.lastNYears"
401
401
  }
402
402
  ];
403
403
  //#endregion
@@ -1388,4 +1388,4 @@ function ae(e, t) {
1388
1388
  //#endregion
1389
1389
  export { b as C, p as D, x as E, f as O, v as S, y as T, M as _, Y as a, O as b, z as c, F as d, j as f, N as g, P as h, X as i, V as l, k as m, ie as n, G as o, A as p, re as r, W as s, ae as t, I as u, L as v, S as w, C as x, E as y };
1390
1390
 
1391
- //# sourceMappingURL=useDebounce-CKqkM42n.js.map
1391
+ //# sourceMappingURL=useDebounce-CfmUMFau.js.map