@contractspec/example.analytics-dashboard 3.7.6 → 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 +105 -7
@@ -0,0 +1,94 @@
1
+ // src/ui/AnalyticsDashboard.widgets.tsx
2
+ import {
3
+ ComparisonView,
4
+ TimelineView,
5
+ VisualizationCard,
6
+ VisualizationGrid
7
+ } from "@contractspec/lib.design-system";
8
+ import { jsxDEV } from "react/jsx-dev-runtime";
9
+ "use client";
10
+ function AnalyticsWidgetBoard({
11
+ dashboardName,
12
+ widgets
13
+ }) {
14
+ if (!widgets.length) {
15
+ return /* @__PURE__ */ jsxDEV("div", {
16
+ className: "rounded-lg border border-dashed p-10 text-center text-muted-foreground",
17
+ children: [
18
+ 'No visualization widgets configured for "',
19
+ dashboardName,
20
+ '".'
21
+ ]
22
+ }, undefined, true, undefined, this);
23
+ }
24
+ return /* @__PURE__ */ jsxDEV("div", {
25
+ children: [
26
+ /* @__PURE__ */ jsxDEV("h3", {
27
+ className: "mb-4 font-semibold text-lg",
28
+ children: [
29
+ 'Widgets in "',
30
+ dashboardName,
31
+ '"'
32
+ ]
33
+ }, undefined, true, undefined, this),
34
+ /* @__PURE__ */ jsxDEV(VisualizationGrid, {
35
+ children: widgets.map((widget) => /* @__PURE__ */ jsxDEV("div", {
36
+ className: gridSpanClass(widget.gridWidth),
37
+ children: renderVisualizationWidget(widget)
38
+ }, widget.id, false, undefined, this))
39
+ }, undefined, false, undefined, this)
40
+ ]
41
+ }, undefined, true, undefined, this);
42
+ }
43
+ function renderVisualizationWidget(widget) {
44
+ const footer = /* @__PURE__ */ jsxDEV("span", {
45
+ className: "text-muted-foreground text-xs",
46
+ children: [
47
+ "Position: (",
48
+ widget.gridX,
49
+ ", ",
50
+ widget.gridY,
51
+ ") • ",
52
+ widget.gridWidth,
53
+ "x",
54
+ widget.gridHeight
55
+ ]
56
+ }, undefined, true, undefined, this);
57
+ if (widget.layout === "comparison") {
58
+ return /* @__PURE__ */ jsxDEV(ComparisonView, {
59
+ description: widget.description,
60
+ items: widget.bindings.map((binding2) => ({ ...binding2, footer })),
61
+ title: widget.name
62
+ }, undefined, false, undefined, this);
63
+ }
64
+ if (widget.layout === "timeline") {
65
+ return /* @__PURE__ */ jsxDEV(TimelineView, {
66
+ description: widget.description,
67
+ items: widget.bindings.map((binding2) => ({ ...binding2, footer })),
68
+ title: widget.name
69
+ }, undefined, false, undefined, this);
70
+ }
71
+ const binding = widget.bindings[0];
72
+ if (!binding)
73
+ return null;
74
+ return /* @__PURE__ */ jsxDEV(VisualizationCard, {
75
+ data: binding.data,
76
+ description: widget.description ?? binding.description,
77
+ footer,
78
+ height: binding.height,
79
+ spec: binding.spec,
80
+ title: widget.name
81
+ }, undefined, false, undefined, this);
82
+ }
83
+ function gridSpanClass(gridWidth) {
84
+ if (gridWidth >= 12)
85
+ return "md:col-span-2 xl:col-span-3";
86
+ if (gridWidth >= 8)
87
+ return "xl:col-span-2";
88
+ if (gridWidth >= 6)
89
+ return "md:col-span-2";
90
+ return "";
91
+ }
92
+ export {
93
+ AnalyticsWidgetBoard
94
+ };
@@ -0,0 +1,99 @@
1
+ // src/ui/AnalyticsQueriesTable.tsx
2
+ import { jsxDEV } from "react/jsx-dev-runtime";
3
+ "use client";
4
+ var QUERY_TYPE_COLORS = {
5
+ SQL: "bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400",
6
+ METRIC: "bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400",
7
+ AGGREGATION: "bg-indigo-100 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-400",
8
+ CUSTOM: "bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400"
9
+ };
10
+ function AnalyticsQueriesTable({ queries }) {
11
+ return /* @__PURE__ */ jsxDEV("div", {
12
+ className: "rounded-lg border border-border",
13
+ children: /* @__PURE__ */ jsxDEV("table", {
14
+ className: "w-full",
15
+ children: [
16
+ /* @__PURE__ */ jsxDEV("thead", {
17
+ className: "border-border border-b bg-muted/30",
18
+ children: /* @__PURE__ */ jsxDEV("tr", {
19
+ children: [
20
+ /* @__PURE__ */ jsxDEV("th", {
21
+ className: "px-4 py-3 text-left font-medium text-sm",
22
+ children: "Query"
23
+ }, undefined, false, undefined, this),
24
+ /* @__PURE__ */ jsxDEV("th", {
25
+ className: "px-4 py-3 text-left font-medium text-sm",
26
+ children: "Type"
27
+ }, undefined, false, undefined, this),
28
+ /* @__PURE__ */ jsxDEV("th", {
29
+ className: "px-4 py-3 text-left font-medium text-sm",
30
+ children: "Cache TTL"
31
+ }, undefined, false, undefined, this),
32
+ /* @__PURE__ */ jsxDEV("th", {
33
+ className: "px-4 py-3 text-left font-medium text-sm",
34
+ children: "Shared"
35
+ }, undefined, false, undefined, this)
36
+ ]
37
+ }, undefined, true, undefined, this)
38
+ }, undefined, false, undefined, this),
39
+ /* @__PURE__ */ jsxDEV("tbody", {
40
+ className: "divide-y divide-border",
41
+ children: [
42
+ queries.map((query) => /* @__PURE__ */ jsxDEV("tr", {
43
+ className: "hover:bg-muted/50",
44
+ children: [
45
+ /* @__PURE__ */ jsxDEV("td", {
46
+ className: "px-4 py-3",
47
+ children: [
48
+ /* @__PURE__ */ jsxDEV("div", {
49
+ className: "font-medium",
50
+ children: query.name
51
+ }, undefined, false, undefined, this),
52
+ /* @__PURE__ */ jsxDEV("div", {
53
+ className: "text-muted-foreground text-sm",
54
+ children: query.description
55
+ }, undefined, false, undefined, this)
56
+ ]
57
+ }, undefined, true, undefined, this),
58
+ /* @__PURE__ */ jsxDEV("td", {
59
+ className: "px-4 py-3",
60
+ children: /* @__PURE__ */ jsxDEV("span", {
61
+ className: `inline-flex rounded-full px-2 py-0.5 font-medium text-xs ${QUERY_TYPE_COLORS[query.type] ?? ""}`,
62
+ children: query.type
63
+ }, undefined, false, undefined, this)
64
+ }, undefined, false, undefined, this),
65
+ /* @__PURE__ */ jsxDEV("td", {
66
+ className: "px-4 py-3 text-muted-foreground text-sm",
67
+ children: [
68
+ query.cacheTtlSeconds,
69
+ "s"
70
+ ]
71
+ }, undefined, true, undefined, this),
72
+ /* @__PURE__ */ jsxDEV("td", {
73
+ className: "px-4 py-3",
74
+ children: query.isShared ? /* @__PURE__ */ jsxDEV("span", {
75
+ className: "text-green-600 dark:text-green-400",
76
+ children: "✓"
77
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV("span", {
78
+ className: "text-muted-foreground",
79
+ children: "—"
80
+ }, undefined, false, undefined, this)
81
+ }, undefined, false, undefined, this)
82
+ ]
83
+ }, query.id, true, undefined, this)),
84
+ queries.length === 0 && /* @__PURE__ */ jsxDEV("tr", {
85
+ children: /* @__PURE__ */ jsxDEV("td", {
86
+ colSpan: 4,
87
+ className: "px-4 py-8 text-center text-muted-foreground",
88
+ children: "No queries saved"
89
+ }, undefined, false, undefined, this)
90
+ }, undefined, false, undefined, this)
91
+ ]
92
+ }, undefined, true, undefined, this)
93
+ ]
94
+ }, undefined, true, undefined, this)
95
+ }, undefined, false, undefined, this);
96
+ }
97
+ export {
98
+ AnalyticsQueriesTable
99
+ };