@contractspec/example.analytics-dashboard 3.8.0 → 3.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,98 +1,187 @@
1
1
  // @bun
2
2
  // src/ui/AnalyticsQueriesTable.tsx
3
+ import { DataTable } from "@contractspec/lib.design-system";
4
+ import { useContractTable } from "@contractspec/lib.presentation-runtime-react";
5
+ import { Badge } from "@contractspec/lib.ui-kit-web/ui/badge";
6
+ import { HStack, VStack } from "@contractspec/lib.ui-kit-web/ui/stack";
7
+ import { Text } from "@contractspec/lib.ui-kit-web/ui/text";
3
8
  import { jsxDEV } from "react/jsx-dev-runtime";
4
9
  "use client";
5
10
  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"
11
+ SQL: "default",
12
+ METRIC: "secondary",
13
+ AGGREGATION: "secondary",
14
+ CUSTOM: "outline"
10
15
  };
16
+ function formatJson(value) {
17
+ return JSON.stringify(value, null, 2);
18
+ }
11
19
  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",
20
+ const controller = useContractTable({
21
+ data: queries,
22
+ columns: [
23
+ {
24
+ id: "query",
25
+ header: "Query",
26
+ label: "Query",
27
+ accessor: (query) => query.name,
28
+ cell: ({ item }) => /* @__PURE__ */ jsxDEV(VStack, {
29
+ gap: "xs",
42
30
  children: [
43
- queries.map((query) => /* @__PURE__ */ jsxDEV("tr", {
44
- className: "hover:bg-muted/50",
31
+ /* @__PURE__ */ jsxDEV(Text, {
32
+ className: "font-medium text-sm",
33
+ children: item.name
34
+ }, undefined, false, undefined, this),
35
+ /* @__PURE__ */ jsxDEV(Text, {
36
+ className: "text-muted-foreground text-xs",
45
37
  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)
38
+ "Updated ",
39
+ item.updatedAt.toLocaleDateString()
83
40
  ]
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)
41
+ }, undefined, true, undefined, this)
42
+ ]
43
+ }, undefined, true, undefined, this),
44
+ size: 240,
45
+ minSize: 180,
46
+ canSort: true,
47
+ canPin: true,
48
+ canResize: true
49
+ },
50
+ {
51
+ id: "description",
52
+ header: "Description",
53
+ label: "Description",
54
+ accessor: (query) => query.description ?? "",
55
+ cell: ({ value }) => /* @__PURE__ */ jsxDEV(Text, {
56
+ className: "line-clamp-2 text-muted-foreground text-sm",
57
+ children: String(value || "No description")
58
+ }, undefined, false, undefined, this),
59
+ size: 300,
60
+ minSize: 220,
61
+ canSort: false,
62
+ canHide: true,
63
+ canResize: true
64
+ },
65
+ {
66
+ id: "type",
67
+ header: "Type",
68
+ label: "Type",
69
+ accessorKey: "type",
70
+ cell: ({ value }) => /* @__PURE__ */ jsxDEV(Badge, {
71
+ variant: QUERY_TYPE_COLORS[String(value)],
72
+ children: String(value)
73
+ }, undefined, false, undefined, this),
74
+ size: 150,
75
+ canSort: true,
76
+ canHide: true,
77
+ canResize: true
78
+ },
79
+ {
80
+ id: "cacheTtlSeconds",
81
+ header: "Cache TTL",
82
+ label: "Cache TTL",
83
+ accessorKey: "cacheTtlSeconds",
84
+ cell: ({ value }) => `${String(value)}s`,
85
+ align: "right",
86
+ size: 140,
87
+ canSort: true,
88
+ canResize: true
89
+ },
90
+ {
91
+ id: "isShared",
92
+ header: "Shared",
93
+ label: "Shared",
94
+ accessorKey: "isShared",
95
+ cell: ({ value }) => /* @__PURE__ */ jsxDEV(Badge, {
96
+ variant: value ? "default" : "outline",
97
+ children: value ? "Shared" : "Private"
98
+ }, undefined, false, undefined, this),
99
+ size: 140,
100
+ canSort: true,
101
+ canHide: true,
102
+ canResize: true
103
+ }
104
+ ],
105
+ initialState: {
106
+ pagination: { pageIndex: 0, pageSize: 3 },
107
+ columnVisibility: { description: false },
108
+ columnPinning: { left: ["query"], right: [] }
109
+ },
110
+ renderExpandedContent: (query) => /* @__PURE__ */ jsxDEV(VStack, {
111
+ gap: "sm",
112
+ className: "py-2",
113
+ children: [
114
+ /* @__PURE__ */ jsxDEV(VStack, {
115
+ gap: "xs",
116
+ children: [
117
+ /* @__PURE__ */ jsxDEV(Text, {
118
+ className: "font-medium text-sm",
119
+ children: "Description"
120
+ }, undefined, false, undefined, this),
121
+ /* @__PURE__ */ jsxDEV(Text, {
122
+ className: "text-muted-foreground text-sm",
123
+ children: query.description ?? "No description"
124
+ }, undefined, false, undefined, this)
125
+ ]
126
+ }, undefined, true, undefined, this),
127
+ query.sql ? /* @__PURE__ */ jsxDEV(VStack, {
128
+ gap: "xs",
129
+ children: [
130
+ /* @__PURE__ */ jsxDEV(Text, {
131
+ className: "font-medium text-sm",
132
+ children: "SQL"
133
+ }, undefined, false, undefined, this),
134
+ /* @__PURE__ */ jsxDEV("pre", {
135
+ className: "overflow-auto rounded-md bg-muted/40 p-3 text-xs",
136
+ children: query.sql
137
+ }, undefined, false, undefined, this)
138
+ ]
139
+ }, undefined, true, undefined, this) : null,
140
+ /* @__PURE__ */ jsxDEV(VStack, {
141
+ gap: "xs",
142
+ children: [
143
+ /* @__PURE__ */ jsxDEV(Text, {
144
+ className: "font-medium text-sm",
145
+ children: "Definition"
146
+ }, undefined, false, undefined, this),
147
+ /* @__PURE__ */ jsxDEV("pre", {
148
+ className: "overflow-auto rounded-md bg-muted/40 p-3 text-xs",
149
+ children: formatJson(query.definition)
91
150
  }, undefined, false, undefined, this)
92
151
  ]
93
152
  }, undefined, true, undefined, this)
94
153
  ]
95
- }, undefined, true, undefined, this)
154
+ }, undefined, true, undefined, this),
155
+ getCanExpand: () => true
156
+ });
157
+ return /* @__PURE__ */ jsxDEV(DataTable, {
158
+ controller,
159
+ title: "Saved Queries",
160
+ description: "Client-mode table using the shared ContractSpec controller and renderer.",
161
+ toolbar: /* @__PURE__ */ jsxDEV(HStack, {
162
+ gap: "sm",
163
+ className: "flex-wrap",
164
+ children: [
165
+ /* @__PURE__ */ jsxDEV(Text, {
166
+ className: "text-muted-foreground text-sm",
167
+ children: [
168
+ queries.length,
169
+ " queries"
170
+ ]
171
+ }, undefined, true, undefined, this),
172
+ /* @__PURE__ */ jsxDEV(Text, {
173
+ className: "text-muted-foreground text-sm",
174
+ children: [
175
+ queries.filter((query) => query.isShared).length,
176
+ " shared"
177
+ ]
178
+ }, undefined, true, undefined, this)
179
+ ]
180
+ }, undefined, true, undefined, this),
181
+ emptyState: /* @__PURE__ */ jsxDEV("div", {
182
+ className: "rounded-md border border-dashed p-8 text-center text-muted-foreground text-sm",
183
+ children: "No queries saved"
184
+ }, undefined, false, undefined, this)
96
185
  }, undefined, false, undefined, this);
97
186
  }
98
187
  export {
@@ -0,0 +1 @@
1
+ export {};
package/dist/ui/index.js CHANGED
@@ -683,99 +683,188 @@ function gridSpanClass(gridWidth) {
683
683
  }
684
684
 
685
685
  // src/ui/AnalyticsQueriesTable.tsx
686
+ import { DataTable } from "@contractspec/lib.design-system";
687
+ import { useContractTable } from "@contractspec/lib.presentation-runtime-react";
688
+ import { Badge } from "@contractspec/lib.ui-kit-web/ui/badge";
689
+ import { HStack, VStack } from "@contractspec/lib.ui-kit-web/ui/stack";
690
+ import { Text } from "@contractspec/lib.ui-kit-web/ui/text";
686
691
  import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
687
692
  "use client";
688
693
  var QUERY_TYPE_COLORS = {
689
- SQL: "bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400",
690
- METRIC: "bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400",
691
- AGGREGATION: "bg-indigo-100 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-400",
692
- CUSTOM: "bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400"
694
+ SQL: "default",
695
+ METRIC: "secondary",
696
+ AGGREGATION: "secondary",
697
+ CUSTOM: "outline"
693
698
  };
699
+ function formatJson(value) {
700
+ return JSON.stringify(value, null, 2);
701
+ }
694
702
  function AnalyticsQueriesTable({ queries }) {
695
- return /* @__PURE__ */ jsxDEV2("div", {
696
- className: "rounded-lg border border-border",
697
- children: /* @__PURE__ */ jsxDEV2("table", {
698
- className: "w-full",
699
- children: [
700
- /* @__PURE__ */ jsxDEV2("thead", {
701
- className: "border-border border-b bg-muted/30",
702
- children: /* @__PURE__ */ jsxDEV2("tr", {
703
- children: [
704
- /* @__PURE__ */ jsxDEV2("th", {
705
- className: "px-4 py-3 text-left font-medium text-sm",
706
- children: "Query"
707
- }, undefined, false, undefined, this),
708
- /* @__PURE__ */ jsxDEV2("th", {
709
- className: "px-4 py-3 text-left font-medium text-sm",
710
- children: "Type"
711
- }, undefined, false, undefined, this),
712
- /* @__PURE__ */ jsxDEV2("th", {
713
- className: "px-4 py-3 text-left font-medium text-sm",
714
- children: "Cache TTL"
715
- }, undefined, false, undefined, this),
716
- /* @__PURE__ */ jsxDEV2("th", {
717
- className: "px-4 py-3 text-left font-medium text-sm",
718
- children: "Shared"
719
- }, undefined, false, undefined, this)
720
- ]
721
- }, undefined, true, undefined, this)
722
- }, undefined, false, undefined, this),
723
- /* @__PURE__ */ jsxDEV2("tbody", {
724
- className: "divide-y divide-border",
703
+ const controller = useContractTable({
704
+ data: queries,
705
+ columns: [
706
+ {
707
+ id: "query",
708
+ header: "Query",
709
+ label: "Query",
710
+ accessor: (query) => query.name,
711
+ cell: ({ item }) => /* @__PURE__ */ jsxDEV2(VStack, {
712
+ gap: "xs",
725
713
  children: [
726
- queries.map((query) => /* @__PURE__ */ jsxDEV2("tr", {
727
- className: "hover:bg-muted/50",
714
+ /* @__PURE__ */ jsxDEV2(Text, {
715
+ className: "font-medium text-sm",
716
+ children: item.name
717
+ }, undefined, false, undefined, this),
718
+ /* @__PURE__ */ jsxDEV2(Text, {
719
+ className: "text-muted-foreground text-xs",
728
720
  children: [
729
- /* @__PURE__ */ jsxDEV2("td", {
730
- className: "px-4 py-3",
731
- children: [
732
- /* @__PURE__ */ jsxDEV2("div", {
733
- className: "font-medium",
734
- children: query.name
735
- }, undefined, false, undefined, this),
736
- /* @__PURE__ */ jsxDEV2("div", {
737
- className: "text-muted-foreground text-sm",
738
- children: query.description
739
- }, undefined, false, undefined, this)
740
- ]
741
- }, undefined, true, undefined, this),
742
- /* @__PURE__ */ jsxDEV2("td", {
743
- className: "px-4 py-3",
744
- children: /* @__PURE__ */ jsxDEV2("span", {
745
- className: `inline-flex rounded-full px-2 py-0.5 font-medium text-xs ${QUERY_TYPE_COLORS[query.type] ?? ""}`,
746
- children: query.type
747
- }, undefined, false, undefined, this)
748
- }, undefined, false, undefined, this),
749
- /* @__PURE__ */ jsxDEV2("td", {
750
- className: "px-4 py-3 text-muted-foreground text-sm",
751
- children: [
752
- query.cacheTtlSeconds,
753
- "s"
754
- ]
755
- }, undefined, true, undefined, this),
756
- /* @__PURE__ */ jsxDEV2("td", {
757
- className: "px-4 py-3",
758
- children: query.isShared ? /* @__PURE__ */ jsxDEV2("span", {
759
- className: "text-green-600 dark:text-green-400",
760
- children: "\u2713"
761
- }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV2("span", {
762
- className: "text-muted-foreground",
763
- children: "\u2014"
764
- }, undefined, false, undefined, this)
765
- }, undefined, false, undefined, this)
721
+ "Updated ",
722
+ item.updatedAt.toLocaleDateString()
766
723
  ]
767
- }, query.id, true, undefined, this)),
768
- queries.length === 0 && /* @__PURE__ */ jsxDEV2("tr", {
769
- children: /* @__PURE__ */ jsxDEV2("td", {
770
- colSpan: 4,
771
- className: "px-4 py-8 text-center text-muted-foreground",
772
- children: "No queries saved"
773
- }, undefined, false, undefined, this)
724
+ }, undefined, true, undefined, this)
725
+ ]
726
+ }, undefined, true, undefined, this),
727
+ size: 240,
728
+ minSize: 180,
729
+ canSort: true,
730
+ canPin: true,
731
+ canResize: true
732
+ },
733
+ {
734
+ id: "description",
735
+ header: "Description",
736
+ label: "Description",
737
+ accessor: (query) => query.description ?? "",
738
+ cell: ({ value }) => /* @__PURE__ */ jsxDEV2(Text, {
739
+ className: "line-clamp-2 text-muted-foreground text-sm",
740
+ children: String(value || "No description")
741
+ }, undefined, false, undefined, this),
742
+ size: 300,
743
+ minSize: 220,
744
+ canSort: false,
745
+ canHide: true,
746
+ canResize: true
747
+ },
748
+ {
749
+ id: "type",
750
+ header: "Type",
751
+ label: "Type",
752
+ accessorKey: "type",
753
+ cell: ({ value }) => /* @__PURE__ */ jsxDEV2(Badge, {
754
+ variant: QUERY_TYPE_COLORS[String(value)],
755
+ children: String(value)
756
+ }, undefined, false, undefined, this),
757
+ size: 150,
758
+ canSort: true,
759
+ canHide: true,
760
+ canResize: true
761
+ },
762
+ {
763
+ id: "cacheTtlSeconds",
764
+ header: "Cache TTL",
765
+ label: "Cache TTL",
766
+ accessorKey: "cacheTtlSeconds",
767
+ cell: ({ value }) => `${String(value)}s`,
768
+ align: "right",
769
+ size: 140,
770
+ canSort: true,
771
+ canResize: true
772
+ },
773
+ {
774
+ id: "isShared",
775
+ header: "Shared",
776
+ label: "Shared",
777
+ accessorKey: "isShared",
778
+ cell: ({ value }) => /* @__PURE__ */ jsxDEV2(Badge, {
779
+ variant: value ? "default" : "outline",
780
+ children: value ? "Shared" : "Private"
781
+ }, undefined, false, undefined, this),
782
+ size: 140,
783
+ canSort: true,
784
+ canHide: true,
785
+ canResize: true
786
+ }
787
+ ],
788
+ initialState: {
789
+ pagination: { pageIndex: 0, pageSize: 3 },
790
+ columnVisibility: { description: false },
791
+ columnPinning: { left: ["query"], right: [] }
792
+ },
793
+ renderExpandedContent: (query) => /* @__PURE__ */ jsxDEV2(VStack, {
794
+ gap: "sm",
795
+ className: "py-2",
796
+ children: [
797
+ /* @__PURE__ */ jsxDEV2(VStack, {
798
+ gap: "xs",
799
+ children: [
800
+ /* @__PURE__ */ jsxDEV2(Text, {
801
+ className: "font-medium text-sm",
802
+ children: "Description"
803
+ }, undefined, false, undefined, this),
804
+ /* @__PURE__ */ jsxDEV2(Text, {
805
+ className: "text-muted-foreground text-sm",
806
+ children: query.description ?? "No description"
807
+ }, undefined, false, undefined, this)
808
+ ]
809
+ }, undefined, true, undefined, this),
810
+ query.sql ? /* @__PURE__ */ jsxDEV2(VStack, {
811
+ gap: "xs",
812
+ children: [
813
+ /* @__PURE__ */ jsxDEV2(Text, {
814
+ className: "font-medium text-sm",
815
+ children: "SQL"
816
+ }, undefined, false, undefined, this),
817
+ /* @__PURE__ */ jsxDEV2("pre", {
818
+ className: "overflow-auto rounded-md bg-muted/40 p-3 text-xs",
819
+ children: query.sql
774
820
  }, undefined, false, undefined, this)
775
821
  ]
822
+ }, undefined, true, undefined, this) : null,
823
+ /* @__PURE__ */ jsxDEV2(VStack, {
824
+ gap: "xs",
825
+ children: [
826
+ /* @__PURE__ */ jsxDEV2(Text, {
827
+ className: "font-medium text-sm",
828
+ children: "Definition"
829
+ }, undefined, false, undefined, this),
830
+ /* @__PURE__ */ jsxDEV2("pre", {
831
+ className: "overflow-auto rounded-md bg-muted/40 p-3 text-xs",
832
+ children: formatJson(query.definition)
833
+ }, undefined, false, undefined, this)
834
+ ]
835
+ }, undefined, true, undefined, this)
836
+ ]
837
+ }, undefined, true, undefined, this),
838
+ getCanExpand: () => true
839
+ });
840
+ return /* @__PURE__ */ jsxDEV2(DataTable, {
841
+ controller,
842
+ title: "Saved Queries",
843
+ description: "Client-mode table using the shared ContractSpec controller and renderer.",
844
+ toolbar: /* @__PURE__ */ jsxDEV2(HStack, {
845
+ gap: "sm",
846
+ className: "flex-wrap",
847
+ children: [
848
+ /* @__PURE__ */ jsxDEV2(Text, {
849
+ className: "text-muted-foreground text-sm",
850
+ children: [
851
+ queries.length,
852
+ " queries"
853
+ ]
854
+ }, undefined, true, undefined, this),
855
+ /* @__PURE__ */ jsxDEV2(Text, {
856
+ className: "text-muted-foreground text-sm",
857
+ children: [
858
+ queries.filter((query) => query.isShared).length,
859
+ " shared"
860
+ ]
776
861
  }, undefined, true, undefined, this)
777
862
  ]
778
- }, undefined, true, undefined, this)
863
+ }, undefined, true, undefined, this),
864
+ emptyState: /* @__PURE__ */ jsxDEV2("div", {
865
+ className: "rounded-md border border-dashed p-8 text-center text-muted-foreground text-sm",
866
+ children: "No queries saved"
867
+ }, undefined, false, undefined, this)
779
868
  }, undefined, false, undefined, this);
780
869
  }
781
870
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contractspec/example.analytics-dashboard",
3
- "version": "3.8.0",
3
+ "version": "3.9.2",
4
4
  "description": "Analytics Dashboard example with widgets and query engine for ContractSpec",
5
5
  "types": "./dist/index.d.ts",
6
6
  "type": "module",
@@ -15,25 +15,27 @@
15
15
  "lint": "bun lint:fix",
16
16
  "lint:fix": "biome check --write --unsafe --only=nursery/useSortedClasses . && biome check --write .",
17
17
  "lint:check": "biome check .",
18
+ "test": "bun test",
18
19
  "prebuild": "contractspec-bun-build prebuild",
19
20
  "typecheck": "tsc --noEmit"
20
21
  },
21
22
  "dependencies": {
22
- "@contractspec/lib.schema": "3.7.6",
23
- "@contractspec/lib.contracts-spec": "4.0.0",
24
- "@contractspec/lib.contracts-integrations": "3.7.7",
25
- "@contractspec/lib.example-shared-ui": "6.0.7",
26
- "@contractspec/lib.design-system": "3.8.0",
27
- "@contractspec/lib.runtime-sandbox": "2.7.6",
23
+ "@contractspec/lib.schema": "3.7.8",
24
+ "@contractspec/lib.contracts-spec": "4.1.2",
25
+ "@contractspec/lib.contracts-integrations": "3.8.2",
26
+ "@contractspec/lib.example-shared-ui": "6.0.10",
27
+ "@contractspec/lib.design-system": "3.8.3",
28
+ "@contractspec/lib.runtime-sandbox": "2.7.9",
28
29
  "react": "19.2.0",
29
30
  "react-dom": "19.2.0"
30
31
  },
31
32
  "devDependencies": {
32
- "@contractspec/tool.typescript": "3.7.6",
33
+ "@contractspec/tool.typescript": "3.7.8",
33
34
  "typescript": "^5.9.3",
34
35
  "@types/react": "^19.2.14",
35
36
  "@types/react-dom": "^19.2.2",
36
- "@contractspec/tool.bun": "3.7.6"
37
+ "@contractspec/tool.bun": "3.7.8",
38
+ "happy-dom": "^20.8.4"
37
39
  },
38
40
  "exports": {
39
41
  ".": {