@webstudio-is/react-sdk 0.75.0 → 0.77.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 (45) hide show
  1. package/lib/cjs/context.js +5 -1
  2. package/lib/cjs/css/normalize.js +51 -23
  3. package/lib/cjs/css/presets.js +111 -1
  4. package/lib/cjs/embed-template.js +68 -3
  5. package/lib/cjs/expression.js +213 -0
  6. package/lib/cjs/index.js +8 -1
  7. package/lib/cjs/props.js +28 -10
  8. package/lib/cjs/tree/create-elements-tree.js +14 -1
  9. package/lib/cjs/tree/root.js +38 -0
  10. package/lib/cjs/tree/webstudio-component.js +9 -2
  11. package/lib/context.js +5 -1
  12. package/lib/css/normalize.js +41 -23
  13. package/lib/css/presets.js +111 -1
  14. package/lib/embed-template.js +68 -3
  15. package/lib/expression.js +183 -0
  16. package/lib/index.js +15 -1
  17. package/lib/props.js +28 -10
  18. package/lib/tree/create-elements-tree.js +14 -1
  19. package/lib/tree/root.js +42 -1
  20. package/lib/tree/webstudio-component.js +9 -2
  21. package/lib/types/components/component-meta.d.ts +112 -0
  22. package/lib/types/context.d.ts +3 -0
  23. package/lib/types/css/normalize.d.ts +1836 -0
  24. package/lib/types/css/presets.d.ts +282 -0
  25. package/lib/types/embed-template.d.ts +512 -0
  26. package/lib/types/expression.d.ts +11 -0
  27. package/lib/types/expression.test.d.ts +1 -0
  28. package/lib/types/index.d.ts +2 -1
  29. package/lib/types/props.d.ts +8 -7
  30. package/lib/types/tree/create-elements-tree.d.ts +4 -2
  31. package/lib/types/tree/root.d.ts +6 -4
  32. package/lib/types/tree/webstudio-component.d.ts +1 -0
  33. package/package.json +10 -10
  34. package/src/context.tsx +11 -0
  35. package/src/css/normalize.ts +40 -23
  36. package/src/css/presets.ts +110 -0
  37. package/src/embed-template.test.ts +177 -1
  38. package/src/embed-template.ts +73 -2
  39. package/src/expression.test.ts +147 -0
  40. package/src/expression.ts +217 -0
  41. package/src/index.ts +8 -0
  42. package/src/props.ts +29 -10
  43. package/src/tree/create-elements-tree.tsx +20 -1
  44. package/src/tree/root.ts +61 -4
  45. package/src/tree/webstudio-component.tsx +7 -1
@@ -0,0 +1,183 @@
1
+ import jsep from "jsep";
2
+ const generateCode = (node, failOnForbidden, transformIdentifier) => {
3
+ if (node.type === "Identifier") {
4
+ return transformIdentifier(node.name);
5
+ }
6
+ if (node.type === "MemberExpression") {
7
+ if (failOnForbidden) {
8
+ const object2 = generateCode(
9
+ node.object,
10
+ false,
11
+ transformIdentifier
12
+ );
13
+ const property2 = generateCode(
14
+ node.property,
15
+ false,
16
+ transformIdentifier
17
+ );
18
+ throw Error(`Cannot access "${property2}" of "${object2}"`);
19
+ }
20
+ const object = generateCode(
21
+ node.object,
22
+ failOnForbidden,
23
+ transformIdentifier
24
+ );
25
+ const property = generateCode(
26
+ node.property,
27
+ failOnForbidden,
28
+ transformIdentifier
29
+ );
30
+ return `${object}.${property}`;
31
+ }
32
+ if (node.type === "Literal") {
33
+ return node.raw;
34
+ }
35
+ if (node.type === "UnaryExpression") {
36
+ const arg = generateCode(
37
+ node.argument,
38
+ failOnForbidden,
39
+ transformIdentifier
40
+ );
41
+ return `${node.operator}${arg}`;
42
+ }
43
+ if (node.type === "BinaryExpression") {
44
+ const left = generateCode(
45
+ node.left,
46
+ failOnForbidden,
47
+ transformIdentifier
48
+ );
49
+ const right = generateCode(
50
+ node.right,
51
+ failOnForbidden,
52
+ transformIdentifier
53
+ );
54
+ return `${left} ${node.operator} ${right}`;
55
+ }
56
+ if (node.type === "ArrayExpression") {
57
+ const elements = node.elements.map(
58
+ (element) => generateCode(element, failOnForbidden, transformIdentifier)
59
+ );
60
+ return `[${elements.join(", ")}]`;
61
+ }
62
+ if (node.type === "CallExpression") {
63
+ if (failOnForbidden) {
64
+ const callee2 = generateCode(
65
+ node.callee,
66
+ false,
67
+ transformIdentifier
68
+ );
69
+ throw Error(`Cannot call "${callee2}"`);
70
+ }
71
+ const callee = generateCode(
72
+ node.callee,
73
+ failOnForbidden,
74
+ transformIdentifier
75
+ );
76
+ const args = node.arguments.map(
77
+ (arg) => generateCode(arg, failOnForbidden, transformIdentifier)
78
+ );
79
+ return `${callee}(${args.join(", ")})`;
80
+ }
81
+ if (node.type === "ThisExpression") {
82
+ if (failOnForbidden) {
83
+ throw Error(`"this" is not supported`);
84
+ }
85
+ return "this";
86
+ }
87
+ if (node.type === "ConditionalExpression") {
88
+ throw Error("Ternary operator is not supported");
89
+ }
90
+ if (node.type === "Compound") {
91
+ throw Error("Cannot use multiple expressions");
92
+ }
93
+ node;
94
+ return "";
95
+ };
96
+ const validateExpression = (code, transformIdentifier = (id) => id) => {
97
+ const expression = jsep(code);
98
+ return generateCode(expression, true, transformIdentifier);
99
+ };
100
+ const sortTopologically = (list, depsById, explored = /* @__PURE__ */ new Set(), sorted = []) => {
101
+ for (const id of list) {
102
+ if (explored.has(id)) {
103
+ continue;
104
+ }
105
+ explored.add(id);
106
+ const deps = depsById.get(id);
107
+ if (deps) {
108
+ sortTopologically(deps, depsById, explored, sorted);
109
+ }
110
+ sorted.push(id);
111
+ }
112
+ return sorted;
113
+ };
114
+ const generateExpressionsComputation = (variables, expressions) => {
115
+ const depsById = /* @__PURE__ */ new Map();
116
+ for (const [id, code] of expressions) {
117
+ const deps = /* @__PURE__ */ new Set();
118
+ validateExpression(code, (identifier) => {
119
+ if (variables.has(identifier)) {
120
+ return identifier;
121
+ }
122
+ if (expressions.has(identifier)) {
123
+ deps.add(identifier);
124
+ return identifier;
125
+ }
126
+ throw Error(`Unknown dependency "${identifier}"`);
127
+ });
128
+ depsById.set(id, deps);
129
+ }
130
+ const sortedExpressions = sortTopologically(
131
+ new Set(expressions.keys()),
132
+ depsById
133
+ );
134
+ let generatedCode = "";
135
+ for (const id of variables) {
136
+ generatedCode += `const ${id} = _variables.get('${id}');
137
+ `;
138
+ }
139
+ for (const id of sortedExpressions) {
140
+ const code = expressions.get(id);
141
+ if (code === void 0) {
142
+ continue;
143
+ }
144
+ generatedCode += `const ${id} = (${code});
145
+ `;
146
+ }
147
+ generatedCode += `return new Map([
148
+ `;
149
+ for (const id of sortedExpressions) {
150
+ generatedCode += ` ['${id}', ${id}],
151
+ `;
152
+ }
153
+ generatedCode += `]);`;
154
+ return generatedCode;
155
+ };
156
+ const executeExpressions = (variables, expressions) => {
157
+ const generatedCode = generateExpressionsComputation(
158
+ new Set(variables.keys()),
159
+ expressions
160
+ );
161
+ const executeFn = new Function("_variables", generatedCode);
162
+ const values = executeFn(variables);
163
+ return values;
164
+ };
165
+ const dataSourceVariablePrefix = "$ws$dataSource$";
166
+ const encodeDataSourceVariable = (id) => {
167
+ const encoded = id.replaceAll("-", "__DASH__");
168
+ return `${dataSourceVariablePrefix}${encoded}`;
169
+ };
170
+ const decodeDataSourceVariable = (name) => {
171
+ if (name.startsWith(dataSourceVariablePrefix)) {
172
+ const encoded = name.slice(dataSourceVariablePrefix.length);
173
+ return encoded.replaceAll("__DASH__", "-");
174
+ }
175
+ return;
176
+ };
177
+ export {
178
+ decodeDataSourceVariable,
179
+ encodeDataSourceVariable,
180
+ executeExpressions,
181
+ generateExpressionsComputation,
182
+ validateExpression
183
+ };
package/lib/index.js CHANGED
@@ -10,17 +10,31 @@ import {
10
10
  } from "./components/component-meta";
11
11
  export * from "./embed-template";
12
12
  import {
13
+ useInstanceProps,
13
14
  usePropUrl,
14
15
  usePropAsset,
15
16
  getInstanceIdFromComponentProps
16
17
  } from "./props";
17
18
  import { ReactSdkContext } from "./context";
19
+ import {
20
+ validateExpression,
21
+ generateExpressionsComputation,
22
+ executeExpressions,
23
+ encodeDataSourceVariable,
24
+ decodeDataSourceVariable
25
+ } from "./expression";
18
26
  export {
19
27
  ReactSdkContext,
20
28
  componentCategories,
29
+ decodeDataSourceVariable,
21
30
  defaultStates,
31
+ encodeDataSourceVariable,
32
+ executeExpressions,
33
+ generateExpressionsComputation,
22
34
  getInstanceIdFromComponentProps,
23
35
  stateCategories,
36
+ useInstanceProps,
24
37
  usePropAsset,
25
- usePropUrl
38
+ usePropUrl,
39
+ validateExpression
26
40
  };
package/lib/props.js CHANGED
@@ -16,17 +16,35 @@ const getPropsByInstanceId = (props) => {
16
16
  return propsByInstanceId;
17
17
  };
18
18
  const useInstanceProps = (instanceId) => {
19
- const { propsByInstanceIdStore } = useContext(ReactSdkContext);
20
- const propsByInstanceId = useStore(propsByInstanceIdStore);
21
- const instanceProps = propsByInstanceId.get(instanceId);
22
- const instancePropsObject = {};
23
- if (instanceProps) {
24
- for (const prop of instanceProps) {
25
- if (prop.type !== "asset" && prop.type !== "page") {
26
- instancePropsObject[prop.name] = prop.value;
19
+ const { propsByInstanceIdStore, dataSourceValuesStore } = useContext(ReactSdkContext);
20
+ const instancePropsObjectStore = useMemo(() => {
21
+ return computed(
22
+ [propsByInstanceIdStore, dataSourceValuesStore],
23
+ (propsByInstanceId, dataSourceValues) => {
24
+ const instancePropsObject2 = {};
25
+ const instanceProps = propsByInstanceId.get(instanceId);
26
+ if (instanceProps === void 0) {
27
+ return instancePropsObject2;
28
+ }
29
+ for (const prop of instanceProps) {
30
+ if (prop.type === "asset" || prop.type === "page") {
31
+ continue;
32
+ }
33
+ if (prop.type === "dataSource") {
34
+ const dataSourceId = prop.value;
35
+ const value = dataSourceValues.get(dataSourceId);
36
+ if (value !== void 0) {
37
+ instancePropsObject2[prop.name] = value;
38
+ }
39
+ continue;
40
+ }
41
+ instancePropsObject2[prop.name] = prop.value;
42
+ }
43
+ return instancePropsObject2;
27
44
  }
28
- }
29
- }
45
+ );
46
+ }, [propsByInstanceIdStore, dataSourceValuesStore, instanceId]);
47
+ const instancePropsObject = useStore(instancePropsObjectStore);
30
48
  return instancePropsObject;
31
49
  };
32
50
  const usePropAsset = (instanceId, name) => {
@@ -11,6 +11,8 @@ const createElementsTree = ({
11
11
  propsByInstanceIdStore,
12
12
  assetsStore,
13
13
  pagesStore,
14
+ dataSourceValuesStore,
15
+ onDataSourceUpdate,
14
16
  Component,
15
17
  components
16
18
  }) => {
@@ -46,9 +48,20 @@ const createElementsTree = ({
46
48
  propsByInstanceIdStore,
47
49
  assetsStore,
48
50
  pagesStore,
51
+ dataSourceValuesStore,
49
52
  renderer,
50
53
  imageBaseUrl,
51
- assetBaseUrl
54
+ assetBaseUrl,
55
+ setDataSourceValue: (instanceId, propName, value) => {
56
+ const propsByInstanceId = propsByInstanceIdStore.get();
57
+ const props = propsByInstanceId.get(instanceId);
58
+ const prop = props?.find((prop2) => prop2.name === propName);
59
+ if (prop?.type !== "dataSource") {
60
+ throw Error(`${propName} is not data source`);
61
+ }
62
+ const dataSourceId = prop.value;
63
+ onDataSourceUpdate(dataSourceId, value);
64
+ }
52
65
  },
53
66
  children: root
54
67
  }
package/lib/tree/root.js CHANGED
@@ -1,12 +1,47 @@
1
- import { atom } from "nanostores";
1
+ import { useRef } from "react";
2
+ import {
3
+ atom,
4
+ computed
5
+ } from "nanostores";
2
6
  import { createElementsTree } from "./create-elements-tree";
3
7
  import { WebstudioComponent } from "./webstudio-component";
4
8
  import { getPropsByInstanceId } from "../props";
5
9
  const InstanceRoot = ({
6
10
  data,
11
+ computeExpressions,
7
12
  Component,
8
13
  components
9
14
  }) => {
15
+ const dataSourceVariablesStoreRef = useRef(void 0);
16
+ if (dataSourceVariablesStoreRef.current === void 0) {
17
+ dataSourceVariablesStoreRef.current = atom(/* @__PURE__ */ new Map());
18
+ }
19
+ const dataSourceVariablesStore = dataSourceVariablesStoreRef.current;
20
+ const dataSourceValuesStoreRef = useRef(void 0);
21
+ if (dataSourceValuesStoreRef.current === void 0) {
22
+ dataSourceValuesStoreRef.current = computed(
23
+ dataSourceVariablesStore,
24
+ (dataSourceVariables) => {
25
+ const dataSourceValues = /* @__PURE__ */ new Map();
26
+ for (const [dataSourceId, dataSource] of data.build.dataSources) {
27
+ if (dataSource.type === "variable") {
28
+ const value = dataSourceVariables.get(dataSourceId) ?? dataSource.value.value;
29
+ dataSourceValues.set(dataSourceId, value);
30
+ }
31
+ }
32
+ try {
33
+ const result = computeExpressions(dataSourceValues);
34
+ for (const [id, value] of result) {
35
+ dataSourceValues.set(id, value);
36
+ }
37
+ } catch (error) {
38
+ console.error(error);
39
+ }
40
+ return dataSourceValues;
41
+ }
42
+ );
43
+ }
44
+ const dataSourceValuesStore = dataSourceValuesStoreRef.current;
10
45
  return createElementsTree({
11
46
  imageBaseUrl: data.params?.imageBaseUrl ?? "/",
12
47
  assetBaseUrl: data.params?.assetBaseUrl ?? "/",
@@ -17,6 +52,12 @@ const InstanceRoot = ({
17
52
  ),
18
53
  assetsStore: atom(new Map(data.assets.map((asset) => [asset.id, asset]))),
19
54
  pagesStore: atom(new Map(data.pages.map((page) => [page.id, page]))),
55
+ dataSourceValuesStore,
56
+ onDataSourceUpdate: (dataSourceId, value) => {
57
+ const dataSourceVariables = new Map(dataSourceVariablesStore.get());
58
+ dataSourceVariables.set(dataSourceId, value);
59
+ dataSourceVariablesStore.set(dataSourceVariables);
60
+ },
20
61
  Component: Component ?? WebstudioComponent,
21
62
  components
22
63
  });
@@ -23,13 +23,18 @@ const WebstudioComponent = ({
23
23
  components,
24
24
  ...rest
25
25
  }) => {
26
- const instanceProps = useInstanceProps(instance.id);
26
+ const { [showAttribute]: show = true, ...instanceProps } = useInstanceProps(
27
+ instance.id
28
+ );
27
29
  const props = {
28
30
  ...instanceProps,
29
31
  ...rest,
30
32
  [idAttribute]: instance.id,
31
33
  [componentAttribute]: instance.component
32
34
  };
35
+ if (show === false) {
36
+ return /* @__PURE__ */ jsx(Fragment, {});
37
+ }
33
38
  const Component = components.get(instance.component);
34
39
  if (Component === void 0) {
35
40
  return /* @__PURE__ */ jsx(Fragment, {});
@@ -38,11 +43,13 @@ const WebstudioComponent = ({
38
43
  };
39
44
  const idAttribute = "data-ws-id";
40
45
  const componentAttribute = "data-ws-component";
46
+ const showAttribute = "data-ws-show";
41
47
  const collapsedAttribute = "data-ws-collapsed";
42
48
  export {
43
49
  WebstudioComponent,
44
50
  collapsedAttribute,
45
51
  componentAttribute,
46
52
  idAttribute,
47
- renderWebstudioComponentChildren
53
+ renderWebstudioComponentChildren,
54
+ showAttribute
48
55
  };
@@ -694,7 +694,14 @@ declare const WsComponentMeta: z.ZodObject<{
694
694
  type: "unparsed";
695
695
  value: string;
696
696
  hidden?: boolean | undefined;
697
+ } | {
698
+ type: "rgb";
699
+ alpha: number;
700
+ r: number;
701
+ g: number;
702
+ b: number;
697
703
  })[];
704
+ hidden?: boolean | undefined;
698
705
  } | {
699
706
  type: "layers";
700
707
  value: ({
@@ -734,7 +741,14 @@ declare const WsComponentMeta: z.ZodObject<{
734
741
  type: "unparsed";
735
742
  value: string;
736
743
  hidden?: boolean | undefined;
744
+ } | {
745
+ type: "rgb";
746
+ alpha: number;
747
+ r: number;
748
+ g: number;
749
+ b: number;
737
750
  })[];
751
+ hidden?: boolean | undefined;
738
752
  })[];
739
753
  } | {
740
754
  type: "var";
@@ -782,7 +796,14 @@ declare const WsComponentMeta: z.ZodObject<{
782
796
  type: "unparsed";
783
797
  value: string;
784
798
  hidden?: boolean | undefined;
799
+ } | {
800
+ type: "rgb";
801
+ alpha: number;
802
+ r: number;
803
+ g: number;
804
+ b: number;
785
805
  })[];
806
+ hidden?: boolean | undefined;
786
807
  } | {
787
808
  type: "layers";
788
809
  value: ({
@@ -822,7 +843,14 @@ declare const WsComponentMeta: z.ZodObject<{
822
843
  type: "unparsed";
823
844
  value: string;
824
845
  hidden?: boolean | undefined;
846
+ } | {
847
+ type: "rgb";
848
+ alpha: number;
849
+ r: number;
850
+ g: number;
851
+ b: number;
825
852
  })[];
853
+ hidden?: boolean | undefined;
826
854
  })[];
827
855
  })[];
828
856
  };
@@ -878,7 +906,14 @@ declare const WsComponentMeta: z.ZodObject<{
878
906
  type: "unparsed";
879
907
  value: string;
880
908
  hidden?: boolean | undefined;
909
+ } | {
910
+ type: "rgb";
911
+ alpha: number;
912
+ r: number;
913
+ g: number;
914
+ b: number;
881
915
  })[];
916
+ hidden?: boolean | undefined;
882
917
  } | {
883
918
  type: "layers";
884
919
  value: ({
@@ -918,7 +953,14 @@ declare const WsComponentMeta: z.ZodObject<{
918
953
  type: "unparsed";
919
954
  value: string;
920
955
  hidden?: boolean | undefined;
956
+ } | {
957
+ type: "rgb";
958
+ alpha: number;
959
+ r: number;
960
+ g: number;
961
+ b: number;
921
962
  })[];
963
+ hidden?: boolean | undefined;
922
964
  })[];
923
965
  } | {
924
966
  type: "var";
@@ -966,7 +1008,14 @@ declare const WsComponentMeta: z.ZodObject<{
966
1008
  type: "unparsed";
967
1009
  value: string;
968
1010
  hidden?: boolean | undefined;
1011
+ } | {
1012
+ type: "rgb";
1013
+ alpha: number;
1014
+ r: number;
1015
+ g: number;
1016
+ b: number;
969
1017
  })[];
1018
+ hidden?: boolean | undefined;
970
1019
  } | {
971
1020
  type: "layers";
972
1021
  value: ({
@@ -1006,7 +1055,14 @@ declare const WsComponentMeta: z.ZodObject<{
1006
1055
  type: "unparsed";
1007
1056
  value: string;
1008
1057
  hidden?: boolean | undefined;
1058
+ } | {
1059
+ type: "rgb";
1060
+ alpha: number;
1061
+ r: number;
1062
+ g: number;
1063
+ b: number;
1009
1064
  })[];
1065
+ hidden?: boolean | undefined;
1010
1066
  })[];
1011
1067
  })[];
1012
1068
  };
@@ -1096,7 +1152,14 @@ declare const WsComponentMeta: z.ZodObject<{
1096
1152
  type: "unparsed";
1097
1153
  value: string;
1098
1154
  hidden?: boolean | undefined;
1155
+ } | {
1156
+ type: "rgb";
1157
+ alpha: number;
1158
+ r: number;
1159
+ g: number;
1160
+ b: number;
1099
1161
  })[];
1162
+ hidden?: boolean | undefined;
1100
1163
  } | {
1101
1164
  type: "layers";
1102
1165
  value: ({
@@ -1136,7 +1199,14 @@ declare const WsComponentMeta: z.ZodObject<{
1136
1199
  type: "unparsed";
1137
1200
  value: string;
1138
1201
  hidden?: boolean | undefined;
1202
+ } | {
1203
+ type: "rgb";
1204
+ alpha: number;
1205
+ r: number;
1206
+ g: number;
1207
+ b: number;
1139
1208
  })[];
1209
+ hidden?: boolean | undefined;
1140
1210
  })[];
1141
1211
  } | {
1142
1212
  type: "var";
@@ -1184,7 +1254,14 @@ declare const WsComponentMeta: z.ZodObject<{
1184
1254
  type: "unparsed";
1185
1255
  value: string;
1186
1256
  hidden?: boolean | undefined;
1257
+ } | {
1258
+ type: "rgb";
1259
+ alpha: number;
1260
+ r: number;
1261
+ g: number;
1262
+ b: number;
1187
1263
  })[];
1264
+ hidden?: boolean | undefined;
1188
1265
  } | {
1189
1266
  type: "layers";
1190
1267
  value: ({
@@ -1224,7 +1301,14 @@ declare const WsComponentMeta: z.ZodObject<{
1224
1301
  type: "unparsed";
1225
1302
  value: string;
1226
1303
  hidden?: boolean | undefined;
1304
+ } | {
1305
+ type: "rgb";
1306
+ alpha: number;
1307
+ r: number;
1308
+ g: number;
1309
+ b: number;
1227
1310
  })[];
1311
+ hidden?: boolean | undefined;
1228
1312
  })[];
1229
1313
  })[];
1230
1314
  };
@@ -1300,7 +1384,14 @@ declare const WsComponentMeta: z.ZodObject<{
1300
1384
  type: "unparsed";
1301
1385
  value: string;
1302
1386
  hidden?: boolean | undefined;
1387
+ } | {
1388
+ type: "rgb";
1389
+ alpha: number;
1390
+ r: number;
1391
+ g: number;
1392
+ b: number;
1303
1393
  })[];
1394
+ hidden?: boolean | undefined;
1304
1395
  } | {
1305
1396
  type: "layers";
1306
1397
  value: ({
@@ -1340,7 +1431,14 @@ declare const WsComponentMeta: z.ZodObject<{
1340
1431
  type: "unparsed";
1341
1432
  value: string;
1342
1433
  hidden?: boolean | undefined;
1434
+ } | {
1435
+ type: "rgb";
1436
+ alpha: number;
1437
+ r: number;
1438
+ g: number;
1439
+ b: number;
1343
1440
  })[];
1441
+ hidden?: boolean | undefined;
1344
1442
  })[];
1345
1443
  } | {
1346
1444
  type: "var";
@@ -1388,7 +1486,14 @@ declare const WsComponentMeta: z.ZodObject<{
1388
1486
  type: "unparsed";
1389
1487
  value: string;
1390
1488
  hidden?: boolean | undefined;
1489
+ } | {
1490
+ type: "rgb";
1491
+ alpha: number;
1492
+ r: number;
1493
+ g: number;
1494
+ b: number;
1391
1495
  })[];
1496
+ hidden?: boolean | undefined;
1392
1497
  } | {
1393
1498
  type: "layers";
1394
1499
  value: ({
@@ -1428,7 +1533,14 @@ declare const WsComponentMeta: z.ZodObject<{
1428
1533
  type: "unparsed";
1429
1534
  value: string;
1430
1535
  hidden?: boolean | undefined;
1536
+ } | {
1537
+ type: "rgb";
1538
+ alpha: number;
1539
+ r: number;
1540
+ g: number;
1541
+ b: number;
1431
1542
  })[];
1543
+ hidden?: boolean | undefined;
1432
1544
  })[];
1433
1545
  })[];
1434
1546
  };
@@ -1,6 +1,7 @@
1
1
  /// <reference types="react" />
2
2
  import { type ReadableAtom } from "nanostores";
3
3
  import type { Assets } from "@webstudio-is/asset-uploader";
4
+ import type { DataSource, Instance, Prop } from "@webstudio-is/project-build";
4
5
  import type { Pages, PropsByInstanceId } from "./props";
5
6
  export type Params = {
6
7
  renderer?: "canvas" | "preview";
@@ -32,4 +33,6 @@ export declare const ReactSdkContext: import("react").Context<Params & {
32
33
  propsByInstanceIdStore: ReadableAtom<PropsByInstanceId>;
33
34
  assetsStore: ReadableAtom<Assets>;
34
35
  pagesStore: ReadableAtom<Pages>;
36
+ dataSourceValuesStore: ReadableAtom<Map<DataSource["id"], unknown>>;
37
+ setDataSourceValue: (instanceId: Instance["id"], prop: Prop["name"], value: unknown) => void;
35
38
  }>;