@contractspec/example.analytics-dashboard 3.7.5 → 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +64 -271
  2. package/dist/browser/dashboard.feature.js +592 -0
  3. package/dist/browser/events.js +1 -1
  4. package/dist/browser/index.js +1171 -627
  5. package/dist/browser/ui/AnalyticsDashboard.js +826 -194
  6. package/dist/browser/ui/AnalyticsDashboard.widgets.js +94 -0
  7. package/dist/browser/ui/AnalyticsQueriesTable.js +99 -0
  8. package/dist/browser/ui/hooks/index.js +594 -3
  9. package/dist/browser/ui/hooks/useAnalyticsData.js +594 -3
  10. package/dist/browser/ui/index.js +964 -440
  11. package/dist/browser/ui/renderers/analytics.markdown.js +620 -138
  12. package/dist/browser/ui/renderers/index.js +620 -138
  13. package/dist/browser/visualizations/catalog.js +457 -0
  14. package/dist/browser/visualizations/index.js +611 -0
  15. package/dist/browser/visualizations/specs.breakdown.js +140 -0
  16. package/dist/browser/visualizations/specs.performance.js +198 -0
  17. package/dist/browser/visualizations/widgets.js +595 -0
  18. package/dist/dashboard/index.d.ts +3 -3
  19. package/dist/dashboard.feature.js +592 -0
  20. package/dist/events.js +1 -1
  21. package/dist/index.d.ts +4 -3
  22. package/dist/index.js +1171 -627
  23. package/dist/node/dashboard.feature.js +592 -0
  24. package/dist/node/events.js +1 -1
  25. package/dist/node/index.js +1171 -627
  26. package/dist/node/ui/AnalyticsDashboard.js +826 -194
  27. package/dist/node/ui/AnalyticsDashboard.widgets.js +94 -0
  28. package/dist/node/ui/AnalyticsQueriesTable.js +99 -0
  29. package/dist/node/ui/hooks/index.js +594 -3
  30. package/dist/node/ui/hooks/useAnalyticsData.js +594 -3
  31. package/dist/node/ui/index.js +964 -440
  32. package/dist/node/ui/renderers/analytics.markdown.js +620 -138
  33. package/dist/node/ui/renderers/index.js +620 -138
  34. package/dist/node/visualizations/catalog.js +457 -0
  35. package/dist/node/visualizations/index.js +611 -0
  36. package/dist/node/visualizations/specs.breakdown.js +140 -0
  37. package/dist/node/visualizations/specs.performance.js +198 -0
  38. package/dist/node/visualizations/widgets.js +595 -0
  39. package/dist/query/index.d.ts +1 -1
  40. package/dist/query-engine/index.d.ts +1 -1
  41. package/dist/ui/AnalyticsDashboard.js +826 -194
  42. package/dist/ui/AnalyticsDashboard.widgets.d.ts +5 -0
  43. package/dist/ui/AnalyticsDashboard.widgets.js +95 -0
  44. package/dist/ui/AnalyticsQueriesTable.d.ts +4 -0
  45. package/dist/ui/AnalyticsQueriesTable.js +100 -0
  46. package/dist/ui/hooks/index.d.ts +1 -1
  47. package/dist/ui/hooks/index.js +594 -3
  48. package/dist/ui/hooks/useAnalyticsData.js +594 -3
  49. package/dist/ui/index.d.ts +1 -1
  50. package/dist/ui/index.js +964 -440
  51. package/dist/ui/renderers/analytics.markdown.d.ts +0 -9
  52. package/dist/ui/renderers/analytics.markdown.js +620 -138
  53. package/dist/ui/renderers/index.js +620 -138
  54. package/dist/visualizations/catalog.d.ts +9 -0
  55. package/dist/visualizations/catalog.js +458 -0
  56. package/dist/visualizations/index.d.ts +4 -0
  57. package/dist/visualizations/index.js +612 -0
  58. package/dist/visualizations/specs.breakdown.d.ts +4 -0
  59. package/dist/visualizations/specs.breakdown.js +141 -0
  60. package/dist/visualizations/specs.performance.d.ts +5 -0
  61. package/dist/visualizations/specs.performance.js +199 -0
  62. package/dist/visualizations/widgets.d.ts +24 -0
  63. package/dist/visualizations/widgets.js +596 -0
  64. package/dist/visualizations/widgets.test.d.ts +1 -0
  65. package/package.json +109 -11
@@ -0,0 +1,5 @@
1
+ import type { ResolvedAnalyticsWidget } from '../visualizations';
2
+ export declare function AnalyticsWidgetBoard({ dashboardName, widgets, }: {
3
+ dashboardName: string;
4
+ widgets: ResolvedAnalyticsWidget[];
5
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,95 @@
1
+ // @bun
2
+ // src/ui/AnalyticsDashboard.widgets.tsx
3
+ import {
4
+ ComparisonView,
5
+ TimelineView,
6
+ VisualizationCard,
7
+ VisualizationGrid
8
+ } from "@contractspec/lib.design-system";
9
+ import { jsxDEV } from "react/jsx-dev-runtime";
10
+ "use client";
11
+ function AnalyticsWidgetBoard({
12
+ dashboardName,
13
+ widgets
14
+ }) {
15
+ if (!widgets.length) {
16
+ return /* @__PURE__ */ jsxDEV("div", {
17
+ className: "rounded-lg border border-dashed p-10 text-center text-muted-foreground",
18
+ children: [
19
+ 'No visualization widgets configured for "',
20
+ dashboardName,
21
+ '".'
22
+ ]
23
+ }, undefined, true, undefined, this);
24
+ }
25
+ return /* @__PURE__ */ jsxDEV("div", {
26
+ children: [
27
+ /* @__PURE__ */ jsxDEV("h3", {
28
+ className: "mb-4 font-semibold text-lg",
29
+ children: [
30
+ 'Widgets in "',
31
+ dashboardName,
32
+ '"'
33
+ ]
34
+ }, undefined, true, undefined, this),
35
+ /* @__PURE__ */ jsxDEV(VisualizationGrid, {
36
+ children: widgets.map((widget) => /* @__PURE__ */ jsxDEV("div", {
37
+ className: gridSpanClass(widget.gridWidth),
38
+ children: renderVisualizationWidget(widget)
39
+ }, widget.id, false, undefined, this))
40
+ }, undefined, false, undefined, this)
41
+ ]
42
+ }, undefined, true, undefined, this);
43
+ }
44
+ function renderVisualizationWidget(widget) {
45
+ const footer = /* @__PURE__ */ jsxDEV("span", {
46
+ className: "text-muted-foreground text-xs",
47
+ children: [
48
+ "Position: (",
49
+ widget.gridX,
50
+ ", ",
51
+ widget.gridY,
52
+ ") \u2022 ",
53
+ widget.gridWidth,
54
+ "x",
55
+ widget.gridHeight
56
+ ]
57
+ }, undefined, true, undefined, this);
58
+ if (widget.layout === "comparison") {
59
+ return /* @__PURE__ */ jsxDEV(ComparisonView, {
60
+ description: widget.description,
61
+ items: widget.bindings.map((binding2) => ({ ...binding2, footer })),
62
+ title: widget.name
63
+ }, undefined, false, undefined, this);
64
+ }
65
+ if (widget.layout === "timeline") {
66
+ return /* @__PURE__ */ jsxDEV(TimelineView, {
67
+ description: widget.description,
68
+ items: widget.bindings.map((binding2) => ({ ...binding2, footer })),
69
+ title: widget.name
70
+ }, undefined, false, undefined, this);
71
+ }
72
+ const binding = widget.bindings[0];
73
+ if (!binding)
74
+ return null;
75
+ return /* @__PURE__ */ jsxDEV(VisualizationCard, {
76
+ data: binding.data,
77
+ description: widget.description ?? binding.description,
78
+ footer,
79
+ height: binding.height,
80
+ spec: binding.spec,
81
+ title: widget.name
82
+ }, undefined, false, undefined, this);
83
+ }
84
+ function gridSpanClass(gridWidth) {
85
+ if (gridWidth >= 12)
86
+ return "md:col-span-2 xl:col-span-3";
87
+ if (gridWidth >= 8)
88
+ return "xl:col-span-2";
89
+ if (gridWidth >= 6)
90
+ return "md:col-span-2";
91
+ return "";
92
+ }
93
+ export {
94
+ AnalyticsWidgetBoard
95
+ };
@@ -0,0 +1,4 @@
1
+ import type { Query } from '../handlers/analytics.handlers';
2
+ export declare function AnalyticsQueriesTable({ queries }: {
3
+ queries: Query[];
4
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,100 @@
1
+ // @bun
2
+ // src/ui/AnalyticsQueriesTable.tsx
3
+ import { jsxDEV } from "react/jsx-dev-runtime";
4
+ "use client";
5
+ var QUERY_TYPE_COLORS = {
6
+ SQL: "bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400",
7
+ METRIC: "bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400",
8
+ AGGREGATION: "bg-indigo-100 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-400",
9
+ CUSTOM: "bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400"
10
+ };
11
+ function AnalyticsQueriesTable({ queries }) {
12
+ return /* @__PURE__ */ jsxDEV("div", {
13
+ className: "rounded-lg border border-border",
14
+ children: /* @__PURE__ */ jsxDEV("table", {
15
+ className: "w-full",
16
+ children: [
17
+ /* @__PURE__ */ jsxDEV("thead", {
18
+ className: "border-border border-b bg-muted/30",
19
+ children: /* @__PURE__ */ jsxDEV("tr", {
20
+ children: [
21
+ /* @__PURE__ */ jsxDEV("th", {
22
+ className: "px-4 py-3 text-left font-medium text-sm",
23
+ children: "Query"
24
+ }, undefined, false, undefined, this),
25
+ /* @__PURE__ */ jsxDEV("th", {
26
+ className: "px-4 py-3 text-left font-medium text-sm",
27
+ children: "Type"
28
+ }, undefined, false, undefined, this),
29
+ /* @__PURE__ */ jsxDEV("th", {
30
+ className: "px-4 py-3 text-left font-medium text-sm",
31
+ children: "Cache TTL"
32
+ }, undefined, false, undefined, this),
33
+ /* @__PURE__ */ jsxDEV("th", {
34
+ className: "px-4 py-3 text-left font-medium text-sm",
35
+ children: "Shared"
36
+ }, undefined, false, undefined, this)
37
+ ]
38
+ }, undefined, true, undefined, this)
39
+ }, undefined, false, undefined, this),
40
+ /* @__PURE__ */ jsxDEV("tbody", {
41
+ className: "divide-y divide-border",
42
+ children: [
43
+ queries.map((query) => /* @__PURE__ */ jsxDEV("tr", {
44
+ className: "hover:bg-muted/50",
45
+ children: [
46
+ /* @__PURE__ */ jsxDEV("td", {
47
+ className: "px-4 py-3",
48
+ children: [
49
+ /* @__PURE__ */ jsxDEV("div", {
50
+ className: "font-medium",
51
+ children: query.name
52
+ }, undefined, false, undefined, this),
53
+ /* @__PURE__ */ jsxDEV("div", {
54
+ className: "text-muted-foreground text-sm",
55
+ children: query.description
56
+ }, undefined, false, undefined, this)
57
+ ]
58
+ }, undefined, true, undefined, this),
59
+ /* @__PURE__ */ jsxDEV("td", {
60
+ className: "px-4 py-3",
61
+ children: /* @__PURE__ */ jsxDEV("span", {
62
+ className: `inline-flex rounded-full px-2 py-0.5 font-medium text-xs ${QUERY_TYPE_COLORS[query.type] ?? ""}`,
63
+ children: query.type
64
+ }, undefined, false, undefined, this)
65
+ }, undefined, false, undefined, this),
66
+ /* @__PURE__ */ jsxDEV("td", {
67
+ className: "px-4 py-3 text-muted-foreground text-sm",
68
+ children: [
69
+ query.cacheTtlSeconds,
70
+ "s"
71
+ ]
72
+ }, undefined, true, undefined, this),
73
+ /* @__PURE__ */ jsxDEV("td", {
74
+ className: "px-4 py-3",
75
+ children: query.isShared ? /* @__PURE__ */ jsxDEV("span", {
76
+ className: "text-green-600 dark:text-green-400",
77
+ children: "\u2713"
78
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV("span", {
79
+ className: "text-muted-foreground",
80
+ children: "\u2014"
81
+ }, undefined, false, undefined, this)
82
+ }, undefined, false, undefined, this)
83
+ ]
84
+ }, query.id, true, undefined, this)),
85
+ queries.length === 0 && /* @__PURE__ */ jsxDEV("tr", {
86
+ children: /* @__PURE__ */ jsxDEV("td", {
87
+ colSpan: 4,
88
+ className: "px-4 py-8 text-center text-muted-foreground",
89
+ children: "No queries saved"
90
+ }, undefined, false, undefined, this)
91
+ }, undefined, false, undefined, this)
92
+ ]
93
+ }, undefined, true, undefined, this)
94
+ ]
95
+ }, undefined, true, undefined, this)
96
+ }, undefined, false, undefined, this);
97
+ }
98
+ export {
99
+ AnalyticsQueriesTable
100
+ };
@@ -1 +1 @@
1
- export { useAnalyticsData, type AnalyticsStats } from './useAnalyticsData';
1
+ export { type AnalyticsStats, useAnalyticsData } from './useAnalyticsData';