@webstudio-is/sdk-components-react 0.145.0 → 0.163.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.
package/lib/components.js CHANGED
@@ -32,6 +32,57 @@ import {
32
32
  } from "react";
33
33
  import { mergeRefs } from "@react-aria/utils";
34
34
  import { ReactSdkContext } from "@webstudio-is/react-sdk";
35
+
36
+ // src/html-embed-patchers.ts
37
+ var isDOMContentLoaded = () => {
38
+ return document.readyState === "complete" || document.readyState === "interactive";
39
+ };
40
+ var eventListenerTasks = [];
41
+ var domContentLoadedPatched = false;
42
+ var patchDomEvents = () => {
43
+ if (isDOMContentLoaded() === false) {
44
+ console.error("DOMContentLoaded event has not been fired yet");
45
+ return;
46
+ }
47
+ if (domContentLoadedPatched) {
48
+ return;
49
+ }
50
+ domContentLoadedPatched = true;
51
+ console.info("Patching DOMContentLoaded event listener");
52
+ const originalAddEventListener = document.addEventListener;
53
+ const originalWindowAddEventListener = window.addEventListener;
54
+ const domContentLoadedEvent = new Event("DOMContentLoaded");
55
+ const windowLoadEvent = new Event("load");
56
+ window.addEventListener = (type, listener, options) => {
57
+ if (type === "DOMContentLoaded") {
58
+ eventListenerTasks.push(
59
+ () => listener.call(window, domContentLoadedEvent)
60
+ );
61
+ } else if (type === "load") {
62
+ eventListenerTasks.push(() => listener.call(window, windowLoadEvent));
63
+ originalWindowAddEventListener.call(window, type, listener, options);
64
+ } else {
65
+ originalWindowAddEventListener.call(window, type, listener, options);
66
+ }
67
+ };
68
+ document.addEventListener = (type, listener, options) => {
69
+ if (type === "DOMContentLoaded") {
70
+ eventListenerTasks.push(
71
+ () => listener.call(document, domContentLoadedEvent)
72
+ );
73
+ } else {
74
+ originalAddEventListener.call(document, type, listener, options);
75
+ }
76
+ };
77
+ };
78
+ var executeDomEvents = () => {
79
+ for (const task of eventListenerTasks) {
80
+ task();
81
+ }
82
+ eventListenerTasks.length = 0;
83
+ };
84
+
85
+ // src/html-embed.tsx
35
86
  import { jsx as jsx3 } from "react/jsx-runtime";
36
87
  var __testing__ = {
37
88
  scriptTestIdPrefix: "client-"
@@ -48,7 +99,7 @@ var insertScript = (sourceScript) => {
48
99
  }
49
100
  if (hasSrc) {
50
101
  script.addEventListener("load", () => {
51
- resolve(script);
102
+ resolve();
52
103
  });
53
104
  script.addEventListener("error", reject);
54
105
  } else {
@@ -56,11 +107,30 @@ var insertScript = (sourceScript) => {
56
107
  }
57
108
  sourceScript.replaceWith(script);
58
109
  if (hasSrc === false) {
59
- resolve(script);
110
+ resolve();
60
111
  }
61
112
  });
62
113
  };
63
- var execute = async (container) => {
114
+ var syncTasksQueue = [];
115
+ var processing = false;
116
+ var processSyncTasks = async (syncTasks) => {
117
+ syncTasksQueue.push(...syncTasks);
118
+ await Promise.resolve();
119
+ if (processing) {
120
+ return;
121
+ }
122
+ patchDomEvents();
123
+ console.info("Start processing sync tasks");
124
+ processing = true;
125
+ while (syncTasksQueue.length > 0) {
126
+ const task = syncTasksQueue.shift();
127
+ await task();
128
+ }
129
+ executeDomEvents();
130
+ processing = false;
131
+ console.info("Stop processing sync tasks");
132
+ };
133
+ var execute = (container) => {
64
134
  const scripts = container.querySelectorAll("script");
65
135
  const syncTasks = [];
66
136
  const asyncTasks = [];
@@ -73,13 +143,11 @@ var execute = async (container) => {
73
143
  for (const task of asyncTasks) {
74
144
  task();
75
145
  }
76
- for (const task of syncTasks) {
77
- await task();
78
- }
146
+ processSyncTasks(syncTasks);
79
147
  };
80
148
  var Placeholder = (props) => {
81
149
  const { code, innerRef, ...rest } = props;
82
- return /* @__PURE__ */ jsx3("div", { ref: innerRef, ...rest, style: { padding: "20px" }, children: 'Open the "Settings" panel to insert HTML code' });
150
+ return /* @__PURE__ */ jsx3("div", { ref: innerRef, ...rest, style: { padding: 20 }, children: 'Open the "Settings" panel to insert HTML code.' });
83
151
  };
84
152
  var useIsServer = () => {
85
153
  const isServer = useSyncExternalStore(
@@ -133,7 +201,7 @@ var ServerEmbed = (props) => {
133
201
  var ClientEmbedWithNonExecutableScripts = ServerEmbed;
134
202
  var HtmlEmbed = forwardRef3(
135
203
  (props, ref) => {
136
- const { code, executeScriptOnCanvas, clientOnly, ...rest } = props;
204
+ const { code, executeScriptOnCanvas, clientOnly, children, ...rest } = props;
137
205
  const { renderer } = useContext(ReactSdkContext);
138
206
  const isServer = useIsServer();
139
207
  const [ssrRendered] = useState(isServer);
@@ -317,33 +385,34 @@ var imagePlaceholderSvg = `data:image/svg+xml;base64,${btoa(`<svg
317
385
  </svg>`)}`;
318
386
  var Image = forwardRef19(
319
387
  ({ loading = "lazy", ...props }, ref) => {
388
+ const src = String(props.src ?? "");
320
389
  const { imageLoader, renderer, assetBaseUrl } = useContext2(ReactSdkContext2);
321
390
  if (renderer === "canvas") {
322
391
  loading = "eager";
323
392
  }
324
- if (props.src === void 0 || props.src.startsWith(assetBaseUrl) === false) {
393
+ if (src.startsWith(assetBaseUrl) === false) {
325
394
  return /* @__PURE__ */ jsx18(
326
395
  "img",
327
396
  {
328
397
  loading,
329
398
  ...props,
330
- src: props.src || imagePlaceholderSvg,
399
+ src: src || imagePlaceholderSvg,
331
400
  ref
332
401
  },
333
- props.src
402
+ src
334
403
  );
335
404
  }
336
- const src = props.src.slice(assetBaseUrl.length);
405
+ const assetName = src.slice(assetBaseUrl.length);
337
406
  return /* @__PURE__ */ jsx18(
338
407
  WebstudioImage,
339
408
  {
340
409
  loading,
341
410
  ...props,
342
411
  loader: imageLoader,
343
- src,
412
+ src: assetName,
344
413
  ref
345
414
  },
346
- src
415
+ assetName
347
416
  );
348
417
  }
349
418
  );
@@ -396,10 +465,21 @@ var Separator = forwardRef23(
396
465
  Separator.displayName = "Separator";
397
466
 
398
467
  // src/code-text.tsx
399
- import { forwardRef as forwardRef24 } from "react";
468
+ import {
469
+ forwardRef as forwardRef24
470
+ } from "react";
400
471
  import { jsx as jsx21 } from "react/jsx-runtime";
401
- var CodeText = forwardRef24(({ children, ...props }, ref) => {
402
- return /* @__PURE__ */ jsx21("code", { ...props, ref, children: children ?? "Code you can edit" });
472
+ var Placeholder2 = ({
473
+ innerRef,
474
+ ...rest
475
+ }) => {
476
+ return /* @__PURE__ */ jsx21("code", { ...rest, style: { padding: 20 }, ref: innerRef, children: `Open the "Settings" panel to edit the code.` });
477
+ };
478
+ var CodeText = forwardRef24(({ code, children, ...props }, ref) => {
479
+ if (children === void 0 && code === void 0 || String(code).trim().length === 0) {
480
+ return /* @__PURE__ */ jsx21(Placeholder2, { innerRef: ref, ...props });
481
+ }
482
+ return /* @__PURE__ */ jsx21("code", { ...props, ref, children: code ?? children });
403
483
  });
404
484
  CodeText.displayName = "CodeText";
405
485
 
@@ -771,6 +851,382 @@ var VimeoSpinner = forwardRef32(
771
851
  }
772
852
  );
773
853
  VimeoSpinner.displayName = "VimeoSpinner";
854
+
855
+ // src/xml-node.tsx
856
+ import {
857
+ ReactSdkContext as ReactSdkContext4
858
+ } from "@webstudio-is/react-sdk";
859
+ import {
860
+ Children,
861
+ createElement as createElement4,
862
+ forwardRef as forwardRef33,
863
+ useContext as useContext7
864
+ } from "react";
865
+ import { jsx as jsx30, jsxs as jsxs2 } from "react/jsx-runtime";
866
+ var XmlNode = forwardRef33(
867
+ ({ tag = "", children, ...props }, ref) => {
868
+ const { renderer } = useContext7(ReactSdkContext4);
869
+ const attributeEntries = Object.entries(props).filter(
870
+ ([key]) => key.startsWith("data-") === false && key.startsWith("aria-") === false
871
+ ).filter(([key]) => key !== "tabIndex").filter(([, value]) => typeof value !== "function");
872
+ if (renderer === void 0) {
873
+ const attrProps = Object.fromEntries(attributeEntries);
874
+ return createElement4(tag, attrProps, children);
875
+ }
876
+ const isTextChild = Children.toArray(children).every(
877
+ (child) => typeof child === "string"
878
+ );
879
+ const elementName = tag.replace(/^[^\p{L}_]+/u, "").replaceAll(/[^\p{L}\p{N}\-._]+/gu, "");
880
+ const attributes = attributeEntries.map(
881
+ ([key, value]) => `${key}=${JSON.stringify(value)}`
882
+ );
883
+ return /* @__PURE__ */ jsxs2("div", { style: { display: isTextChild ? "flex" : "contents" }, ...props, children: [
884
+ /* @__PURE__ */ jsxs2("div", { style: { color: "rgb(16, 23, 233)" }, children: [
885
+ "<",
886
+ [elementName, ...attributes].join(" "),
887
+ ">"
888
+ ] }),
889
+ /* @__PURE__ */ jsx30("div", { ref, style: { marginLeft: isTextChild ? 0 : "1rem" }, children }),
890
+ /* @__PURE__ */ jsxs2("div", { style: { color: "rgb(16, 23, 233)" }, children: [
891
+ "</",
892
+ elementName,
893
+ ">"
894
+ ] })
895
+ ] });
896
+ }
897
+ );
898
+ XmlNode.displayName = "XmlNode";
899
+
900
+ // src/time.tsx
901
+ import * as React from "react";
902
+ import { jsx as jsx31 } from "react/jsx-runtime";
903
+ var languages = [
904
+ "af",
905
+ "am",
906
+ "ar",
907
+ "az",
908
+ "be",
909
+ "bg",
910
+ "bn",
911
+ "bs",
912
+ "ca",
913
+ "cs",
914
+ "cy",
915
+ "da",
916
+ "de",
917
+ "el",
918
+ "en",
919
+ "es",
920
+ "et",
921
+ "eu",
922
+ "fa",
923
+ "fi",
924
+ "fr",
925
+ "ga",
926
+ "gl",
927
+ "gu",
928
+ "he",
929
+ "hi",
930
+ "hr",
931
+ "hu",
932
+ "hy",
933
+ "id",
934
+ "is",
935
+ "it",
936
+ "ja",
937
+ "ka",
938
+ "kk",
939
+ "km",
940
+ "kn",
941
+ "ko",
942
+ "ky",
943
+ "lb",
944
+ "lt",
945
+ "lv",
946
+ "mk",
947
+ "ml",
948
+ "mn",
949
+ "mr",
950
+ "ms",
951
+ "mt",
952
+ "nb",
953
+ "nl",
954
+ "nn",
955
+ "pl",
956
+ "pt",
957
+ "ro",
958
+ "ru",
959
+ "si",
960
+ "sk",
961
+ "sl",
962
+ "sq",
963
+ "sr",
964
+ "sv",
965
+ "sw",
966
+ "ta",
967
+ "te",
968
+ "th",
969
+ "tr",
970
+ "uk",
971
+ "ur",
972
+ "uz",
973
+ "vi",
974
+ "zh"
975
+ ];
976
+ var countries = [
977
+ "AF",
978
+ "AL",
979
+ "DZ",
980
+ "AS",
981
+ "AD",
982
+ "AO",
983
+ "AI",
984
+ "AQ",
985
+ "AG",
986
+ "AR",
987
+ "AM",
988
+ "AW",
989
+ "AU",
990
+ "AT",
991
+ "AZ",
992
+ "BS",
993
+ "BH",
994
+ "BD",
995
+ "BB",
996
+ "BY",
997
+ "BE",
998
+ "BZ",
999
+ "BJ",
1000
+ "BM",
1001
+ "BT",
1002
+ "BO",
1003
+ "BA",
1004
+ "BW",
1005
+ "BR",
1006
+ "BN",
1007
+ "BG",
1008
+ "BF",
1009
+ "BI",
1010
+ "CV",
1011
+ "KH",
1012
+ "CM",
1013
+ "CA",
1014
+ "KY",
1015
+ "CF",
1016
+ "TD",
1017
+ "CL",
1018
+ "CN",
1019
+ "CO",
1020
+ "KM",
1021
+ "CG",
1022
+ "CD",
1023
+ "CR",
1024
+ "HR",
1025
+ "CU",
1026
+ "CY",
1027
+ "CZ",
1028
+ "DK",
1029
+ "DJ",
1030
+ "DM",
1031
+ "DO",
1032
+ "EC",
1033
+ "EG",
1034
+ "SV",
1035
+ "GQ",
1036
+ "ER",
1037
+ "EE",
1038
+ "SZ",
1039
+ "ET",
1040
+ "FJ",
1041
+ "FI",
1042
+ "FR",
1043
+ "GA",
1044
+ "GM",
1045
+ "GE",
1046
+ "DE",
1047
+ "GH",
1048
+ "GR",
1049
+ "GD",
1050
+ "GT",
1051
+ "GN",
1052
+ "GW",
1053
+ "GY",
1054
+ "HT",
1055
+ "HN",
1056
+ "HU",
1057
+ "IS",
1058
+ "IN",
1059
+ "ID",
1060
+ "IR",
1061
+ "IQ",
1062
+ "IE",
1063
+ "IL",
1064
+ "IT",
1065
+ "JM",
1066
+ "JP",
1067
+ "JO",
1068
+ "KZ",
1069
+ "KE",
1070
+ "KI",
1071
+ "KP",
1072
+ "KR",
1073
+ "KW",
1074
+ "KG",
1075
+ "LA",
1076
+ "LV",
1077
+ "LB",
1078
+ "LS",
1079
+ "LR",
1080
+ "LY",
1081
+ "LI",
1082
+ "LT",
1083
+ "LU",
1084
+ "MG",
1085
+ "MW",
1086
+ "MY",
1087
+ "MV",
1088
+ "ML",
1089
+ "MT",
1090
+ "MH",
1091
+ "MR",
1092
+ "MU",
1093
+ "MX",
1094
+ "FM",
1095
+ "MD",
1096
+ "MC",
1097
+ "MN",
1098
+ "ME",
1099
+ "MA",
1100
+ "MZ",
1101
+ "MM",
1102
+ "NA",
1103
+ "NR",
1104
+ "NP",
1105
+ "NL",
1106
+ "NZ",
1107
+ "NI",
1108
+ "NE",
1109
+ "NG",
1110
+ "NO",
1111
+ "OM",
1112
+ "PK",
1113
+ "PW",
1114
+ "PA",
1115
+ "PG",
1116
+ "PY",
1117
+ "PE",
1118
+ "PH",
1119
+ "PL",
1120
+ "PT",
1121
+ "QA",
1122
+ "RO",
1123
+ "RU",
1124
+ "RW",
1125
+ "KN",
1126
+ "LC",
1127
+ "VC",
1128
+ "WS",
1129
+ "SM",
1130
+ "ST",
1131
+ "SA",
1132
+ "SN",
1133
+ "RS",
1134
+ "SC",
1135
+ "SL",
1136
+ "SG",
1137
+ "SK",
1138
+ "SI",
1139
+ "SB",
1140
+ "SO",
1141
+ "ZA",
1142
+ "SS",
1143
+ "ES",
1144
+ "LK",
1145
+ "SD",
1146
+ "SR",
1147
+ "SE",
1148
+ "CH",
1149
+ "SY",
1150
+ "TW",
1151
+ "TJ",
1152
+ "TZ",
1153
+ "TH",
1154
+ "TL",
1155
+ "TG",
1156
+ "TO",
1157
+ "TT",
1158
+ "TN",
1159
+ "TR",
1160
+ "TM",
1161
+ "TV",
1162
+ "UG",
1163
+ "UA",
1164
+ "AE",
1165
+ "GB",
1166
+ "US",
1167
+ "UY",
1168
+ "UZ",
1169
+ "VU",
1170
+ "VA",
1171
+ "VE",
1172
+ "VN",
1173
+ "YE",
1174
+ "ZM",
1175
+ "ZW"
1176
+ ];
1177
+ var INITIAL_DATE_STRING = "dateTime attribute is not set";
1178
+ var INVALID_DATE_STRING = "";
1179
+ var DEFAULT_LANGUAGE = "en";
1180
+ var DEFAULT_COUNTRY = "GB";
1181
+ var DEFAULT_DATE_STYLE = "medium";
1182
+ var DEFAULT_TIME_STYLE = "none";
1183
+ var languageOrDefault = (language) => {
1184
+ return languages.includes(language) ? language : DEFAULT_LANGUAGE;
1185
+ };
1186
+ var countryOrDefault = (country) => {
1187
+ return countries.includes(country) ? country : DEFAULT_COUNTRY;
1188
+ };
1189
+ var dateStyleOrUndefined = (value) => {
1190
+ if (["full", "long", "medium", "short"].includes(value)) {
1191
+ return value;
1192
+ }
1193
+ return void 0;
1194
+ };
1195
+ var timeStyleOrUndefined = (value) => {
1196
+ if (["full", "long", "medium", "short"].includes(value)) {
1197
+ return value;
1198
+ }
1199
+ return void 0;
1200
+ };
1201
+ var Time = React.forwardRef(
1202
+ ({
1203
+ language = DEFAULT_LANGUAGE,
1204
+ country = DEFAULT_COUNTRY,
1205
+ dateStyle = DEFAULT_DATE_STYLE,
1206
+ timeStyle = DEFAULT_TIME_STYLE,
1207
+ datetime = INITIAL_DATE_STRING,
1208
+ ...props
1209
+ }, ref) => {
1210
+ const locale = `${languageOrDefault(language)}-${countryOrDefault(
1211
+ country
1212
+ )}`;
1213
+ const options = {
1214
+ dateStyle: dateStyleOrUndefined(dateStyle),
1215
+ timeStyle: timeStyleOrUndefined(timeStyle)
1216
+ };
1217
+ const datetimeString = datetime === null ? INVALID_DATE_STRING : datetime.toString();
1218
+ const date = new Date(datetimeString);
1219
+ const isValidDate = false === Number.isNaN(date.getTime());
1220
+ let formattedDate = datetimeString;
1221
+ if (isValidDate) {
1222
+ try {
1223
+ formattedDate = new Intl.DateTimeFormat(locale, options).format(date);
1224
+ } catch {
1225
+ }
1226
+ }
1227
+ return /* @__PURE__ */ jsx31("time", { ref, dateTime: datetimeString, ...props, children: formattedDate });
1228
+ }
1229
+ );
774
1230
  export {
775
1231
  Blockquote,
776
1232
  Body,
@@ -800,8 +1256,10 @@ export {
800
1256
  Superscript,
801
1257
  Text,
802
1258
  Textarea,
1259
+ Time,
803
1260
  Vimeo,
804
1261
  VimeoPlayButton,
805
1262
  VimeoPreviewImage,
806
- VimeoSpinner
1263
+ VimeoSpinner,
1264
+ XmlNode
807
1265
  };