@weaverse/react 0.6.16 → 0.6.19

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/dist/index.js CHANGED
@@ -62,556 +62,491 @@ module.exports = __toCommonJS(src_exports);
62
62
 
63
63
  // src/context.ts
64
64
  var import_core = require("@weaverse/core");
65
- var import_react9 = require("react");
66
-
67
- // src/elements/base.tsx
68
- var import_react = __toESM(require("react"));
69
- var BaseElement = import_react.default.forwardRef((_a, ref) => {
70
- var _b = _a, { tag, children } = _b, props = __objRest(_b, ["tag", "children"]);
71
- return import_react.default.createElement(tag, __spreadValues({
72
- ref
73
- }, props), children);
74
- });
75
- BaseElement.defaultProps = {
76
- tag: "div",
77
- style: {}
78
- };
79
- var schema = {
80
- type: "base",
81
- parentType: "container",
82
- title: "Base",
83
- settings: []
84
- };
85
- var base_default = BaseElement;
65
+ var import_react10 = require("react");
86
66
 
87
67
  // src/elements/button.tsx
88
- var React2 = __toESM(require("react"));
89
- var Button = React2.forwardRef((props, ref) => {
90
- const _a = props, { buttonType, css, openInNewTab = false, target = "" } = _a, rest = __objRest(_a, ["buttonType", "css", "openInNewTab", "target"]);
68
+ var React = __toESM(require("react"));
69
+ var Button = React.forwardRef((props, ref) => {
70
+ let _a = props, { openInNewTab, target, value } = _a, rest = __objRest(_a, ["openInNewTab", "target", "value"]);
91
71
  if (target) {
92
- return /* @__PURE__ */ React2.createElement("a", {
72
+ return /* @__PURE__ */ React.createElement("a", __spreadProps(__spreadValues({
93
73
  href: target,
94
- target: openInNewTab ? "_blank" : "_self"
95
- }, /* @__PURE__ */ React2.createElement("button", __spreadValues({
74
+ target: openInNewTab ? "_blank" : "_self",
75
+ rel: "noreferrer"
76
+ }, rest), {
96
77
  ref
97
- }, rest), props.value));
78
+ }), value);
98
79
  }
99
- return /* @__PURE__ */ React2.createElement("button", __spreadValues({
80
+ return /* @__PURE__ */ React.createElement("button", __spreadValues({
100
81
  ref
101
- }, rest), props.value);
82
+ }, rest), value);
102
83
  });
103
84
  Button.defaultProps = {
104
- value: "Shop now"
105
- };
106
- var schema2 = {
107
- title: "Button",
85
+ value: "Shop now",
86
+ openInNewTab: false,
87
+ target: "",
108
88
  type: "button",
109
- parentType: "container",
110
- styles: [
111
- {
112
- type: "dimensions"
113
- },
114
- {
115
- type: "alignment"
116
- },
117
- {
118
- type: "border"
119
- },
120
- {
121
- type: "background"
122
- },
123
- {
124
- type: "spacing"
125
- }
126
- ],
127
- settings: [],
128
- toolbar: [
129
- {
130
- type: "delete"
131
- },
132
- {
133
- type: "duplicate"
134
- },
135
- {
136
- type: "link"
137
- },
138
- {
139
- type: "color"
89
+ css: {
90
+ "@desktop": {
91
+ borderRadius: "72px",
92
+ border: "none",
93
+ backgroundColor: "#0F71FF",
94
+ color: "#fff",
95
+ fontSize: "13px",
96
+ padding: "10px 20px"
140
97
  }
141
- ],
142
- data: {
143
- css: {
144
- "@desktop": {
145
- borderRadius: "72px",
146
- border: "none",
147
- backgroundColor: "#0F71FF",
148
- color: "#fff",
149
- fontSize: "13px",
150
- padding: "10px 20px"
151
- }
152
- },
153
- target: "",
154
- openInNewTab: false
155
- },
156
- flags: {
157
- draggable: true
158
98
  }
159
99
  };
160
100
  var button_default = Button;
161
101
 
162
102
  // src/elements/container.tsx
163
- var import_react2 = __toESM(require("react"));
164
- var Container = (0, import_react2.forwardRef)((props, ref) => {
165
- return /* @__PURE__ */ import_react2.default.createElement("div", __spreadValues({
103
+ var import_react = __toESM(require("react"));
104
+ var Container = (0, import_react.forwardRef)((props, ref) => {
105
+ let _a = props, { children } = _a, rest = __objRest(_a, ["children"]);
106
+ return /* @__PURE__ */ import_react.default.createElement("div", __spreadValues({
166
107
  ref
167
- }, props));
108
+ }, rest), children);
168
109
  });
169
- var schema3 = {
170
- title: "Container",
171
- type: "container",
172
- parentType: "layout",
173
- data: {
174
- css: {
175
- "@desktop": {
176
- display: "flex",
177
- backgroundColor: "rgba(248,203,203,0.38)",
178
- flexDirection: "column",
179
- alignItems: "flex-start",
180
- justifyContent: "flex-start",
181
- textAlign: "left",
182
- gridArea: "1 / 1 / 3 / 6",
183
- width: "100%",
184
- height: "fit-content"
185
- }
110
+ Container.defaultProps = {
111
+ css: {
112
+ "@desktop": {
113
+ alignItems: "flex-start",
114
+ backgroundColor: "rgba(248,203,203,0.38)",
115
+ display: "flex",
116
+ flexDirection: "column",
117
+ gridArea: "1 / 1 / 3 / 6",
118
+ height: "fit-content",
119
+ justifyContent: "flex-start",
120
+ overflow: "hidden",
121
+ textAlign: "left",
122
+ width: "100%"
186
123
  }
187
- },
188
- settings: [],
189
- flags: {
190
- draggable: true,
191
- resizable: true,
192
- sortable: true
193
124
  }
194
125
  };
195
126
  var container_default = Container;
196
127
 
197
- // src/elements/layout.tsx
128
+ // src/elements/countdown/index.tsx
198
129
  var import_react3 = __toESM(require("react"));
199
- var Layout = (0, import_react3.forwardRef)((props, ref) => {
200
- const _a = props, { css, children, rows, gap, rowSize, columns, gridSize } = _a, rest = __objRest(_a, ["css", "children", "rows", "gap", "rowSize", "columns", "gridSize"]);
201
- return /* @__PURE__ */ import_react3.default.createElement("section", __spreadValues({
202
- ref,
203
- style: {
204
- "--grid-size": gridSize + "px",
205
- "--rows": rows,
206
- "--columns": columns,
207
- "--gap": gap + "px",
208
- "--row-size": rowSize + "px",
209
- "--col-size": "calc((var(--grid-size) - calc(var(--columns) - 1) * var(--gap)) / var(--columns))"
210
- }
211
- }, rest), /* @__PURE__ */ import_react3.default.createElement("div", {
212
- "data-layout-content": true
213
- }, children));
214
- });
215
- var schema4 = {
216
- title: "Layout",
217
- type: "layout",
218
- parentType: "root",
219
- data: {
220
- css: {
221
- "@desktop": {
222
- paddingTop: "16px",
223
- paddingBottom: "16px",
224
- paddingLeft: "var(--gap)",
225
- paddingRight: "var(--gap)",
226
- "> [data-layout-content]": {
227
- margin: "0 auto",
228
- display: "grid !important",
229
- gridTemplateRows: "repeat(var(--rows), var(--row-size))",
230
- gridTemplateColumns: "repeat(var(--columns), minmax(0, var(--col-size)))",
231
- gap: "var(--gap)",
232
- maxWidth: "var(--grid-size)"
233
- }
234
- },
235
- "@mobile": {
236
- padding: "0 16px",
237
- "> [data-layout-content]": {
238
- display: "flex !important",
239
- flexDirection: "column"
240
- }
241
- }
242
- },
243
- gridSize: 1224,
244
- rows: 12,
245
- columns: 12,
246
- gap: 16,
247
- rowSize: 48
248
- },
249
- settings: []
250
- };
251
- var layout_default = Layout;
252
130
 
253
- // src/elements/text.tsx
254
- var React5 = __toESM(require("react"));
255
- var Text = React5.forwardRef((props, ref) => {
256
- let _a = props, { children, value } = _a, rest = __objRest(_a, ["children", "value"]);
257
- return /* @__PURE__ */ React5.createElement("div", __spreadProps(__spreadValues({
131
+ // src/elements/countdown/timer-block.tsx
132
+ var import_react2 = __toESM(require("react"));
133
+ function TimerBlock({ value, label }) {
134
+ return /* @__PURE__ */ import_react2.default.createElement("div", null, /* @__PURE__ */ import_react2.default.createElement("div", {
135
+ className: "wv-countdown-number"
136
+ }, value.toString().padStart(2, "0")), label && /* @__PURE__ */ import_react2.default.createElement("div", {
137
+ className: "wv-countdown-label"
138
+ }, label));
139
+ }
140
+
141
+ // src/elements/countdown/utils.ts
142
+ var times = ["days", "hours", "minutes", "seconds"];
143
+ function getTime(_seconds) {
144
+ const ONE_MINUTE = 60 * 1e3;
145
+ const ONE_HOUR = 60 * ONE_MINUTE;
146
+ const ONE_DAY = 24 * ONE_HOUR;
147
+ const days = Math.floor(_seconds / ONE_DAY);
148
+ const hours = Math.floor((_seconds - days * ONE_DAY) / ONE_HOUR);
149
+ const minutes = Math.floor((_seconds - days * ONE_DAY - hours * ONE_HOUR) / ONE_MINUTE);
150
+ const seconds = Math.floor((_seconds - days * ONE_DAY - hours * ONE_HOUR - minutes * ONE_MINUTE) / 1e3);
151
+ return { days, hours, minutes, seconds };
152
+ }
153
+
154
+ // src/elements/countdown/index.tsx
155
+ var Countdown = (0, import_react3.forwardRef)((props, ref) => {
156
+ const { isDesignMode } = (0, import_react3.useContext)(WeaverseContext);
157
+ let _a = props, {
158
+ timerType,
159
+ startTime,
160
+ endTime,
161
+ periods,
162
+ redirectUrl,
163
+ openInNewTab,
164
+ showColon,
165
+ showLabel
166
+ } = _a, rest = __objRest(_a, [
167
+ "timerType",
168
+ "startTime",
169
+ "endTime",
170
+ "periods",
171
+ "redirectUrl",
172
+ "openInNewTab",
173
+ "showColon",
174
+ "showLabel"
175
+ ]);
176
+ const [remaining, setRemaining] = import_react3.default.useState(0);
177
+ if (typeof endTime !== "number") {
178
+ endTime = Number.parseInt(endTime);
179
+ }
180
+ (0, import_react3.useEffect)(() => {
181
+ const flag = setInterval(() => {
182
+ const remainingTime = Math.max((timerType === "fixed-time" ? new Date(endTime).getTime() : new Date(startTime).getTime() + periods * 60 * 1e3) - Date.now(), 0);
183
+ if (!isDesignMode && redirectUrl && remainingTime > 0 && remainingTime < 1e3) {
184
+ window.open(redirectUrl, openInNewTab ? "_blank" : "_self");
185
+ }
186
+ setRemaining(remainingTime);
187
+ }, 1e3);
188
+ return () => {
189
+ clearInterval(flag);
190
+ };
191
+ }, [startTime, endTime, periods, timerType]);
192
+ const timer = getTime(remaining);
193
+ return /* @__PURE__ */ import_react3.default.createElement("div", __spreadValues({
258
194
  ref
259
- }, rest), {
260
- dangerouslySetInnerHTML: { __html: value }
195
+ }, rest), times.map((time) => {
196
+ return /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, {
197
+ key: time
198
+ }, /* @__PURE__ */ import_react3.default.createElement(TimerBlock, {
199
+ label: showLabel ? time : "",
200
+ value: timer[time]
201
+ }), time !== "seconds" && /* @__PURE__ */ import_react3.default.createElement("span", {
202
+ className: `wv-countdown-number ${showColon ? "" : "hidden"}`
203
+ }, ":"));
261
204
  }));
262
205
  });
263
- Text.defaultProps = {
264
- value: "sample text"
265
- };
266
- var schema5 = {
267
- type: "text",
268
- parentType: "container",
269
- title: "Text",
270
- settings: [],
271
- data: {
272
- css: {
273
- "@desktop": {
274
- width: "100%",
275
- height: "fit-content",
276
- padding: 0,
277
- margin: 0,
278
- outline: "none",
279
- wordBreak: "break-word",
280
- overflowWrap: "break-word",
281
- whiteSpace: "break-spaces"
206
+ Countdown.defaultProps = {
207
+ timerType: "fixed-time",
208
+ startTime: Date.now(),
209
+ endTime: 1661140528e3,
210
+ periods: 90,
211
+ redirectUrl: "https://myshop.com",
212
+ openInNewTab: false,
213
+ showLabel: true,
214
+ showColon: true,
215
+ css: {
216
+ "@desktop": {
217
+ fontFamily: "Inter",
218
+ fontSize: 36,
219
+ fontWeight: 500,
220
+ display: "grid",
221
+ gridAutoFlow: "column",
222
+ gap: 10,
223
+ "& > div": {
224
+ width: 48,
225
+ textAlign: "center"
226
+ },
227
+ "& .wv-countdown-label": {
228
+ fontSize: 10
229
+ },
230
+ "& > span": {
231
+ lineHeight: "100%"
232
+ },
233
+ "& .hidden": {
234
+ visibility: "hidden"
282
235
  }
283
236
  }
284
237
  }
285
238
  };
286
- var text_default = Text;
239
+ var countdown_default = Countdown;
287
240
 
288
241
  // src/elements/image.tsx
289
242
  var import_react4 = __toESM(require("react"));
290
- var Image = import_react4.default.forwardRef(function Image2(props, ref) {
291
- let _a = props, { src, alt, children } = _a, rest = __objRest(_a, ["src", "alt", "children"]);
292
- return /* @__PURE__ */ import_react4.default.createElement("img", __spreadProps(__spreadValues({
243
+ var Image = import_react4.default.forwardRef((props, ref) => {
244
+ let _a = props, { src, alt } = _a, rest = __objRest(_a, ["src", "alt"]);
245
+ return /* @__PURE__ */ import_react4.default.createElement("div", __spreadValues({
293
246
  ref
294
- }, rest), {
247
+ }, rest), /* @__PURE__ */ import_react4.default.createElement("img", {
295
248
  alt,
296
249
  src
297
250
  }));
298
251
  });
299
252
  Image.defaultProps = {
300
253
  src: "https://ucarecdn.com/1cdc9d39-ca62-492e-8ec7-f1a86b241a90/",
301
- alt: "weaverse image element"
302
- };
303
- var schema6 = {
304
- settings: [],
305
- type: "image",
306
- parentType: "layout",
307
- title: "Image",
308
- data: {
309
- css: {
310
- "@desktop": {
254
+ alt: "weaverse image element",
255
+ css: {
256
+ "@desktop": {
257
+ img: {
311
258
  width: "100%",
312
259
  height: "100%",
313
260
  objectFit: "cover"
314
- },
315
- "@mobile": {
316
- display: "block"
317
261
  }
318
262
  }
319
- },
320
- flags: {
321
- resizable: true,
322
- draggable: true,
323
- sortable: true
324
263
  }
325
264
  };
326
265
  var image_default = Image;
327
266
 
328
- // src/elements/video.tsx
267
+ // src/elements/layout.tsx
329
268
  var import_react5 = __toESM(require("react"));
330
- var Video = (0, import_react5.forwardRef)((props, ref) => {
331
- const { isDesignMode } = (0, import_react5.useContext)(WeaverseContext);
332
- let _a = props, { src, type, controls, autoPlay, loop, muted } = _a, rest = __objRest(_a, ["src", "type", "controls", "autoPlay", "loop", "muted"]);
333
- if (isDesignMode) {
334
- controls = false;
335
- autoPlay = false;
336
- }
337
- console.info("9779 props", props, isDesignMode);
338
- return /* @__PURE__ */ import_react5.default.createElement("video", __spreadValues({
339
- ref,
340
- controls,
341
- autoPlay,
342
- loop,
343
- muted: true
344
- }, rest), /* @__PURE__ */ import_react5.default.createElement("source", {
345
- src,
346
- type: type || "video/mp4",
347
- controlsList: "nodownload",
348
- disablePictureInPicture: true
349
- }));
269
+ var Layout = (0, import_react5.forwardRef)((props, ref) => {
270
+ let _a = props, { children, rows, gap, rowSize, columns, gridSize } = _a, rest = __objRest(_a, ["children", "rows", "gap", "rowSize", "columns", "gridSize"]);
271
+ let style = {
272
+ "--grid-size": gridSize + "px",
273
+ "--rows": rows,
274
+ "--columns": columns,
275
+ "--gap": gap + "px",
276
+ "--row-size": rowSize + "px",
277
+ "--col-size": "calc((var(--grid-size) - calc(var(--columns) - 1) * var(--gap)) / var(--columns))"
278
+ };
279
+ return /* @__PURE__ */ import_react5.default.createElement("section", __spreadProps(__spreadValues({
280
+ ref
281
+ }, rest), {
282
+ style
283
+ }), /* @__PURE__ */ import_react5.default.createElement("div", {
284
+ "data-layout-content": true
285
+ }, children));
350
286
  });
351
- Video.defaultProps = {
352
- src: "https://ucarecdn.com/7cae0dab-8966-4484-9998-602728c360ca/IMG_0048.MOV",
353
- poster: "https://ucarecdn.com/48d73272-3fe3-43f6-8b5b-22b68fc5a8c8/section.png",
354
- loop: false,
355
- type: "video/mp4",
356
- controls: false,
357
- autoPlay: true,
358
- muted: true,
359
- width: "100%",
360
- height: "auto"
361
- };
362
- var schema7 = {
363
- title: "Video",
364
- type: "video",
365
- parentType: "layout",
366
- toolbar: [
367
- {
368
- type: "delete"
369
- },
370
- {
371
- type: "duplicate"
372
- },
373
- {
374
- type: "link"
287
+ Layout.defaultProps = {
288
+ gridSize: 1224,
289
+ rows: 12,
290
+ columns: 12,
291
+ gap: 16,
292
+ rowSize: 48,
293
+ css: {
294
+ "@desktop": {
295
+ paddingTop: "16px",
296
+ paddingBottom: "16px",
297
+ paddingLeft: "var(--gap)",
298
+ paddingRight: "var(--gap)",
299
+ "> [data-layout-content]": {
300
+ margin: "0 auto",
301
+ display: "grid !important",
302
+ gridTemplateRows: "repeat(var(--rows), var(--row-size))",
303
+ gridTemplateColumns: "repeat(var(--columns), minmax(0, var(--col-size)))",
304
+ gap: "var(--gap)",
305
+ maxWidth: "var(--grid-size)"
306
+ }
375
307
  },
376
- {
377
- type: "color"
308
+ "@mobile": {
309
+ padding: "0 16px",
310
+ "> [data-layout-content]": {
311
+ display: "flex !important",
312
+ flexDirection: "column"
313
+ }
378
314
  }
379
- ],
380
- flags: {
381
- resizable: true,
382
- draggable: true,
383
- sortable: true
384
315
  }
385
316
  };
386
- var video_default = Video;
317
+ var layout_default = Layout;
387
318
 
388
319
  // src/elements/map.tsx
389
320
  var import_react6 = __toESM(require("react"));
390
321
  var Map = (0, import_react6.forwardRef)((props, ref) => {
391
- const { place, zoom } = props;
392
- console.info("9779 props", props);
322
+ let _a = props, { place, zoom } = _a, rest = __objRest(_a, ["place", "zoom"]);
393
323
  return /* @__PURE__ */ import_react6.default.createElement("div", __spreadValues({
394
324
  ref
395
- }, props), /* @__PURE__ */ import_react6.default.createElement("iframe", {
325
+ }, rest), /* @__PURE__ */ import_react6.default.createElement("iframe", {
396
326
  loading: "lazy",
397
327
  scrolling: "no",
398
328
  width: "100%",
399
329
  height: "100%",
400
330
  title: "map",
401
331
  src: `https://maps.google.com/maps?z=${zoom}&t=m&q=${place}&ie=UTF8&&output=embed`,
402
- style: {
403
- pointerEvents: "none"
404
- }
332
+ style: { pointerEvents: "none" }
405
333
  }));
406
334
  });
407
335
  Map.defaultProps = {
408
336
  place: "Hanoi",
409
337
  zoom: 14
410
338
  };
411
- var schema8 = {
412
- title: "Map",
413
- type: "map",
414
- parentType: "layout",
415
- toolbar: [
416
- {
417
- type: "delete"
418
- },
419
- {
420
- type: "duplicate"
421
- },
422
- {
423
- type: "link"
424
- },
425
- {
426
- type: "color"
427
- }
428
- ],
429
- data: {
430
- css: {
431
- "@desktop": {
432
- gridArea: "1 / 1 / 11 / 13"
433
- }
339
+ var map_default = Map;
340
+
341
+ // src/elements/text.tsx
342
+ var React8 = __toESM(require("react"));
343
+ var Text = React8.forwardRef((props, ref) => {
344
+ let _a = props, { children, value } = _a, rest = __objRest(_a, ["children", "value"]);
345
+ return /* @__PURE__ */ React8.createElement("div", __spreadProps(__spreadValues({
346
+ ref
347
+ }, rest), {
348
+ dangerouslySetInnerHTML: { __html: value }
349
+ }));
350
+ });
351
+ Text.defaultProps = {
352
+ value: "The quick brown fox jumps over the lazy dog",
353
+ css: {
354
+ "@desktop": {
355
+ width: "100%",
356
+ height: "fit-content",
357
+ padding: "20px",
358
+ outline: "none",
359
+ wordBreak: "break-word",
360
+ overflowWrap: "break-word",
361
+ whiteSpace: "break-spaces"
434
362
  }
435
- },
436
- flags: {
437
- resizable: true,
438
- draggable: true,
439
- sortable: true
440
363
  }
441
364
  };
442
- var map_default = Map;
443
-
444
- // src/elements/countdown/index.tsx
445
- var import_react8 = __toESM(require("react"));
446
-
447
- // src/elements/countdown/utils.ts
448
- function getTime(seconds) {
449
- const ONE_MINUTE = 60 * 1e3;
450
- const ONE_HOUR = 60 * ONE_MINUTE;
451
- const ONE_DAY = 24 * ONE_HOUR;
452
- const days = Math.floor(seconds / ONE_DAY);
453
- const hours = Math.floor((seconds - days * ONE_DAY) / ONE_HOUR);
454
- const mins = Math.floor((seconds - days * ONE_DAY - hours * ONE_HOUR) / ONE_MINUTE);
455
- const secs = Math.floor((seconds - days * ONE_DAY - hours * ONE_HOUR - mins * ONE_MINUTE) / 1e3);
456
- return { days, hours, mins, secs };
457
- }
365
+ var text_default = Text;
458
366
 
459
- // src/elements/countdown/timer-block.tsx
367
+ // src/elements/video.tsx
460
368
  var import_react7 = __toESM(require("react"));
461
- var TimerBlock = (props) => {
462
- return /* @__PURE__ */ import_react7.default.createElement("div", null, /* @__PURE__ */ import_react7.default.createElement("div", null, props.value.toString().padStart(2, "0")), props.label && /* @__PURE__ */ import_react7.default.createElement("div", {
463
- className: "wv-countdown-label"
464
- }, props.label));
369
+ var Video = (0, import_react7.forwardRef)((props, ref) => {
370
+ let { isDesignMode } = (0, import_react7.useContext)(WeaverseContext);
371
+ let _a = props, { src, type, controls, poster, autoPlay, loop, muted } = _a, rest = __objRest(_a, ["src", "type", "controls", "poster", "autoPlay", "loop", "muted"]);
372
+ return /* @__PURE__ */ import_react7.default.createElement("div", __spreadValues({
373
+ ref
374
+ }, rest), /* @__PURE__ */ import_react7.default.createElement("video", {
375
+ controls: isDesignMode ? false : controls,
376
+ autoPlay: isDesignMode ? false : autoPlay,
377
+ loop,
378
+ muted: true,
379
+ controlsList: "nodownload",
380
+ disablePictureInPicture: true
381
+ }, /* @__PURE__ */ import_react7.default.createElement("source", {
382
+ src,
383
+ type: type || "video/mp4"
384
+ })));
385
+ });
386
+ Video.defaultProps = {
387
+ src: "https://ucarecdn.com/7cae0dab-8966-4484-9998-602728c360ca/IMG_0048.MOV",
388
+ poster: "https://ucarecdn.com/48d73272-3fe3-43f6-8b5b-22b68fc5a8c8/section.png",
389
+ loop: false,
390
+ type: "video/mp4",
391
+ controls: false,
392
+ autoPlay: true,
393
+ muted: true,
394
+ css: {
395
+ "@desktop": {
396
+ height: "fit-content",
397
+ margin: 0,
398
+ outline: "none",
399
+ overflowWrap: "break-word",
400
+ padding: 0,
401
+ whiteSpace: "break-spaces",
402
+ width: "100%",
403
+ wordBreak: "break-word"
404
+ }
405
+ }
465
406
  };
466
- var timer_block_default = TimerBlock;
407
+ var video_default = Video;
467
408
 
468
- // src/elements/countdown/index.tsx
469
- var Countdown = (0, import_react8.forwardRef)((props, ref) => {
470
- const { isDesignMode } = (0, import_react8.useContext)(WeaverseContext);
471
- let {
472
- type,
473
- startTime,
474
- endTime,
475
- periods,
476
- redirectUrl,
477
- openInNewTab,
478
- showColon,
479
- showLabel
480
- } = props;
481
- const [remaining, setRemaining] = import_react8.default.useState(0);
482
- if (typeof endTime !== "number") {
483
- endTime = Number.parseInt(endTime);
484
- }
485
- (0, import_react8.useEffect)(() => {
486
- const flag = setInterval(() => {
487
- const remainingTime = Math.max((type === "specific" ? new Date(endTime).getTime() : new Date(startTime) + periods * 60 * 1e3) - Date.now(), 0);
488
- if (!isDesignMode && redirectUrl && remainingTime > 0 && remainingTime < 1e3) {
489
- window.open(redirectUrl, openInNewTab ? "_blank" : "_self");
490
- }
491
- setRemaining(remainingTime);
492
- }, 1e3);
493
- return () => {
494
- clearInterval(flag);
495
- };
496
- }, [startTime, endTime, periods, type]);
497
- const timer = getTime(remaining);
409
+ // src/elements/instagram.tsx
410
+ var import_react9 = __toESM(require("react"));
411
+
412
+ // src/elements/shared/Placeholder.tsx
413
+ var import_react8 = __toESM(require("react"));
414
+ var Placeholder = (0, import_react8.forwardRef)((props, ref) => {
415
+ let _a = props, { element, children } = _a, rest = __objRest(_a, ["element", "children"]);
416
+ let style = {
417
+ height: "100%",
418
+ display: "flex",
419
+ flexDirection: "column",
420
+ alignItems: "center",
421
+ justifyContent: "center",
422
+ color: "#374151"
423
+ };
498
424
  return /* @__PURE__ */ import_react8.default.createElement("div", __spreadValues({
425
+ style,
499
426
  ref
500
- }, props), /* @__PURE__ */ import_react8.default.createElement(timer_block_default, {
501
- value: timer.days,
502
- label: showLabel && "days"
503
- }), /* @__PURE__ */ import_react8.default.createElement("span", {
504
- className: !showColon && "hidden"
505
- }, ":"), /* @__PURE__ */ import_react8.default.createElement(timer_block_default, {
506
- value: timer.hours,
507
- label: showLabel && "hours"
508
- }), /* @__PURE__ */ import_react8.default.createElement("span", {
509
- className: !showColon && "hidden"
510
- }, ":"), /* @__PURE__ */ import_react8.default.createElement(timer_block_default, {
511
- value: timer.mins,
512
- label: showLabel && "minutes"
513
- }), /* @__PURE__ */ import_react8.default.createElement("span", {
514
- className: !showColon && "hidden"
515
- }, ":"), /* @__PURE__ */ import_react8.default.createElement(timer_block_default, {
516
- value: timer.secs,
517
- label: showLabel && "seconds"
518
- }));
427
+ }, rest), /* @__PURE__ */ import_react8.default.createElement("div", {
428
+ style: { fontWeight: 600, marginBottom: "10px" }
429
+ }, element), /* @__PURE__ */ import_react8.default.createElement("div", null, children));
519
430
  });
520
- Countdown.defaultProps = {
521
- type: "specific",
522
- startTime: Date.now(),
523
- endTime: 1661140528e3,
524
- redirectUrl: "",
525
- openInNewTab: false,
526
- showLabel: true,
527
- showColon: true
528
- };
529
- var schema9 = {
530
- title: "Countdown",
531
- type: "countdown",
532
- parentType: "container",
533
- toolbar: [
534
- {
535
- type: "delete"
536
- },
537
- {
538
- type: "duplicate"
539
- },
540
- {
541
- type: "link"
542
- },
543
- {
544
- type: "color"
431
+ var Placeholder_default = Placeholder;
432
+
433
+ // src/elements/instagram.tsx
434
+ var INSTAGRAM_API = "https://graph.instagram.com";
435
+ var Instagram = (0, import_react9.forwardRef)((props, ref) => {
436
+ const _a = props, { token, username, numberOfImages, imagesPerRow, gap } = _a, rest = __objRest(_a, ["token", "username", "numberOfImages", "imagesPerRow", "gap"]);
437
+ const [media, setMedia] = (0, import_react9.useState)([]);
438
+ const [error, setError] = (0, import_react9.useState)(null);
439
+ let { isDesignMode } = (0, import_react9.useContext)(WeaverseContext);
440
+ (0, import_react9.useEffect)(() => {
441
+ if (token) {
442
+ let params = new URLSearchParams({
443
+ access_token: token,
444
+ fields: "id,media_type,caption,media_url,permalink"
445
+ });
446
+ fetch(`${INSTAGRAM_API}/me/media?${params.toString()}`).then((res) => res.json()).then((res) => {
447
+ if (res.error) {
448
+ setError(res);
449
+ } else {
450
+ setError(null);
451
+ setMedia([...res.data]);
452
+ }
453
+ }).catch(setError);
545
454
  }
546
- ],
547
- data: {
548
- css: {
549
- "@desktop": {
550
- fontFamily: "Inter",
551
- fontSize: 36,
552
- fontWeight: 500,
455
+ }, [token]);
456
+ if (!token || error) {
457
+ return /* @__PURE__ */ import_react9.default.createElement("div", __spreadValues({
458
+ ref
459
+ }, rest), /* @__PURE__ */ import_react9.default.createElement(Placeholder_default, {
460
+ element: "Instagram"
461
+ }, !token ? "Connect your Instagram account to display photos on your site." : "Invalid or expired token!"));
462
+ }
463
+ let style = {
464
+ "--wv-ig-images-per-row": imagesPerRow,
465
+ "--wv-ig-images-gap": gap
466
+ };
467
+ return /* @__PURE__ */ import_react9.default.createElement("div", __spreadProps(__spreadValues({
468
+ ref
469
+ }, rest), {
470
+ style
471
+ }), /* @__PURE__ */ import_react9.default.createElement("div", {
472
+ className: "wv-ig-medias"
473
+ }, media.slice(0, numberOfImages).map((item) => {
474
+ let linkProps;
475
+ if (!isDesignMode) {
476
+ linkProps = { href: item.permalink, target: "_blank" };
477
+ }
478
+ return /* @__PURE__ */ import_react9.default.createElement("a", __spreadValues({
479
+ key: item.id
480
+ }, linkProps), /* @__PURE__ */ import_react9.default.createElement("img", {
481
+ alt: item.caption,
482
+ src: item.media_url
483
+ }));
484
+ })));
485
+ });
486
+ Instagram.defaultProps = {
487
+ token: "",
488
+ username: "",
489
+ numberOfImages: 8,
490
+ imagesPerRow: 4,
491
+ gap: 0,
492
+ css: {
493
+ "@desktop": {
494
+ ".wv-ig-medias": {
495
+ overflow: "hidden",
496
+ maxWidth: "100%",
497
+ maxHeight: "100%",
553
498
  display: "grid",
554
- gridAutoFlow: "column",
555
- gap: 10,
556
- "& > div": {
557
- width: 48,
558
- textAlign: "center"
559
- },
560
- "& .wv-countdown-label": {
561
- fontSize: 10
562
- },
563
- "& > span": {
564
- lineHeight: "100%"
565
- },
566
- "& .hidden": {
567
- visibility: "hidden"
499
+ gridTemplateColumns: "repeat(var(--wv-ig-images-per-row, 4), 1fr)",
500
+ gap: "var(--wv-ig-images-gap, 0px)",
501
+ img: {
502
+ aspectRatio: "1 / 1",
503
+ width: "100%",
504
+ height: "100%",
505
+ objectFit: "cover"
568
506
  }
569
507
  }
570
508
  }
571
- },
572
- flags: {
573
- draggable: true
574
509
  }
575
510
  };
576
- var countdown_default = Countdown;
511
+ var instagram_default = Instagram;
577
512
 
578
513
  // src/elements/index.ts
579
514
  var elements = {
515
+ Countdown: {
516
+ Component: countdown_default,
517
+ type: "countdown"
518
+ },
580
519
  Button: {
581
520
  Component: button_default,
582
- schema: schema2
583
- },
584
- BaseElement: {
585
- Component: base_default,
586
- schema
587
- },
588
- Text: {
589
- Component: text_default,
590
- schema: schema5
591
- },
592
- Layout: {
593
- Component: layout_default,
594
- schema: schema4
521
+ type: "button"
595
522
  },
596
523
  Container: {
597
524
  Component: container_default,
598
- schema: schema3
525
+ type: "container"
599
526
  },
600
527
  Image: {
601
528
  Component: image_default,
602
- schema: schema6
529
+ type: "image"
603
530
  },
604
- Video: {
605
- Component: video_default,
606
- schema: schema7
531
+ Instagram: {
532
+ Component: instagram_default,
533
+ type: "instagram"
534
+ },
535
+ Layout: {
536
+ Component: layout_default,
537
+ type: "layout"
607
538
  },
608
539
  Map: {
609
540
  Component: map_default,
610
- schema: schema8
541
+ type: "map"
611
542
  },
612
- Countdown: {
613
- Component: countdown_default,
614
- schema: schema9
543
+ Text: {
544
+ Component: text_default,
545
+ type: "text"
546
+ },
547
+ Video: {
548
+ Component: video_default,
549
+ type: "video"
615
550
  }
616
551
  };
617
552
  var elements_default = elements;
@@ -624,30 +559,31 @@ var createRootContext = (configs) => {
624
559
  });
625
560
  return rootContext;
626
561
  };
627
- var WeaverseContext = (0, import_react9.createContext)({});
562
+ var WeaverseContext = (0, import_react10.createContext)({});
628
563
  var WeaverseContextProvider = WeaverseContext.Provider;
629
564
  var WeaverseContextConsumer = WeaverseContext.Consumer;
630
565
 
631
566
  // src/renderer.tsx
632
567
  var import_core2 = require("@weaverse/core");
633
- var import_react10 = __toESM(require("react"));
568
+ var import_react11 = __toESM(require("react"));
634
569
 
635
570
  // src/utils/index.ts
636
571
  var shortCssObject = (css) => {
637
572
  return {
638
- "@desktop": css[`@desktop`],
639
- "@mobile": css[`@mobile`]
573
+ "@desktop": css["@desktop"],
574
+ "@mobile": css["@mobile"]
640
575
  };
641
576
  };
642
577
  function generateItemClass(instance, stitchesInstance) {
643
- var _a;
578
+ var _a, _b, _c, _d;
644
579
  let { css, className: cls = "" } = instance.data;
580
+ let defaultCss = ((_c = (_b = (_a = instance.Element) == null ? void 0 : _a.Component) == null ? void 0 : _b.defaultProps) == null ? void 0 : _c.css) || {};
645
581
  let className = "";
646
- if (css) {
647
- let formattedCss = shortCssObject(css);
582
+ if (css || defaultCss) {
583
+ let formattedCss = shortCssObject(css || defaultCss);
648
584
  let { className: newClass = "" } = stitchesInstance.css(formattedCss)();
649
585
  let { stitchesClass } = instance;
650
- let otherClass = (((_a = instance.ref.current) == null ? void 0 : _a.className) || "").replace(stitchesClass, "").replace(cls, "").trim();
586
+ let otherClass = (((_d = instance.ref.current) == null ? void 0 : _d.className) || "").replace(stitchesClass, "").replace(cls, "").trim();
651
587
  className = `${cls} ${newClass} ${otherClass}`.trim();
652
588
  instance.stitchesClass = newClass;
653
589
  }
@@ -657,9 +593,9 @@ function generateItemClass(instance, stitchesInstance) {
657
593
  // src/renderer.tsx
658
594
  var WeaverseRoot = ({ context }) => {
659
595
  var _a;
660
- let [, setData] = (0, import_react10.useState)(context.projectData);
661
- let rootRef = (0, import_react10.useRef)();
662
- (0, import_react10.useEffect)(() => {
596
+ let [, setData] = (0, import_react11.useState)(context.projectData);
597
+ let rootRef = (0, import_react11.useRef)();
598
+ (0, import_react11.useEffect)(() => {
663
599
  let update = () => setData({});
664
600
  context.subscribe(update);
665
601
  if (context.projectData) {
@@ -672,21 +608,22 @@ var WeaverseRoot = ({ context }) => {
672
608
  }, []);
673
609
  let eventHandlers = ((_a = context == null ? void 0 : context.studioBridge) == null ? void 0 : _a.eventHandlers) || {};
674
610
  let themeClass = context.stitchesInstance.theme.className;
675
- return /* @__PURE__ */ import_react10.default.createElement("div", __spreadProps(__spreadValues({
611
+ return /* @__PURE__ */ import_react11.default.createElement("div", __spreadProps(__spreadValues({
676
612
  className: `weaverse-content-root ${themeClass}`
677
613
  }, eventHandlers), {
678
614
  ref: rootRef
679
- }), /* @__PURE__ */ import_react10.default.createElement(WeaverseContextProvider, {
615
+ }), /* @__PURE__ */ import_react11.default.createElement(WeaverseContextProvider, {
680
616
  value: context
681
- }, /* @__PURE__ */ import_react10.default.createElement(ItemInstance, {
617
+ }, /* @__PURE__ */ import_react11.default.createElement(ItemInstance, {
682
618
  id: context.projectData.rootId || 0
683
619
  })));
684
620
  };
685
621
  var ItemComponent = ({ instance }) => {
686
- let { stitchesInstance, elementInstances } = (0, import_react10.useContext)(WeaverseContext);
687
- let [data, setData] = (0, import_react10.useState)(instance.data);
688
- let _a = data, { id, type, childIds = [], css, className: cls = "" } = _a, rest = __objRest(_a, ["id", "type", "childIds", "css", "className"]);
689
- (0, import_react10.useEffect)(() => {
622
+ let { stitchesInstance, elementInstances } = (0, import_react11.useContext)(WeaverseContext);
623
+ let [data, setData] = (0, import_react11.useState)(instance.data);
624
+ let _a = data, { id, type, childIds = [], css, className } = _a, rest = __objRest(_a, ["id", "type", "childIds", "css", "className"]);
625
+ (0, import_react11.useEffect)(() => {
626
+ var _a2;
690
627
  let update = (data2) => setData(__spreadValues({}, data2));
691
628
  instance.subscribe(update);
692
629
  if (import_core2.isBrowser && !instance.ref.current) {
@@ -694,22 +631,23 @@ var ItemComponent = ({ instance }) => {
694
631
  current: document.querySelector(`[data-wv-id="${id}"]`)
695
632
  });
696
633
  }
634
+ (_a2 = instance.ref.current) == null ? void 0 : _a2.removeAttribute("css");
697
635
  return () => {
698
636
  instance.unsubscribe(update);
699
637
  };
700
638
  }, []);
701
- let Element = elementInstances.get(type || "base");
639
+ let Element = elementInstances.get(type);
702
640
  if (Element == null ? void 0 : Element.Component) {
703
641
  let Component = Element.Component;
704
642
  if (Component.$$typeof === Symbol.for("react.forward_ref")) {
705
643
  rest.ref = instance.ref;
706
644
  }
707
- return /* @__PURE__ */ import_react10.default.createElement(Component, __spreadValues({
645
+ return /* @__PURE__ */ import_react11.default.createElement(Component, __spreadValues({
708
646
  key: id,
709
647
  "data-wv-type": type,
710
648
  "data-wv-id": id,
711
649
  className: generateItemClass(instance, stitchesInstance)
712
- }, rest), childIds.map((id2) => /* @__PURE__ */ import_react10.default.createElement(ItemInstance, {
650
+ }, rest), childIds.map((id2) => /* @__PURE__ */ import_react11.default.createElement(ItemInstance, {
713
651
  key: id2,
714
652
  id: id2
715
653
  })));
@@ -717,15 +655,15 @@ var ItemComponent = ({ instance }) => {
717
655
  return null;
718
656
  };
719
657
  var ItemInstance = ({ id }) => {
720
- let context = (0, import_react10.useContext)(WeaverseContext);
658
+ let context = (0, import_react11.useContext)(WeaverseContext);
721
659
  let { itemInstances } = context;
722
660
  let instance = itemInstances.get(id);
723
661
  if (!instance) {
724
- return /* @__PURE__ */ import_react10.default.createElement("div", {
662
+ return /* @__PURE__ */ import_react11.default.createElement("div", {
725
663
  style: { display: "none" }
726
664
  }, "Item instance ", id, " not found");
727
665
  }
728
- return /* @__PURE__ */ import_react10.default.createElement(ItemComponent, {
666
+ return /* @__PURE__ */ import_react11.default.createElement(ItemComponent, {
729
667
  instance
730
668
  });
731
669
  };