@weaverse/react 0.6.9 → 0.6.14

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 (3) hide show
  1. package/dist/index.js +302 -25
  2. package/dist/index.mjs +297 -20
  3. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -62,7 +62,7 @@ module.exports = __toCommonJS(src_exports);
62
62
 
63
63
  // src/context.ts
64
64
  var import_core = require("@weaverse/core");
65
- var import_react5 = require("react");
65
+ var import_react9 = require("react");
66
66
 
67
67
  // src/elements/base.tsx
68
68
  var import_react = __toESM(require("react"));
@@ -78,6 +78,7 @@ BaseElement.defaultProps = {
78
78
  };
79
79
  var schema = {
80
80
  type: "base",
81
+ parentType: "container",
81
82
  title: "Base",
82
83
  settings: []
83
84
  };
@@ -100,11 +101,12 @@ var Button = React2.forwardRef((props, ref) => {
100
101
  }, rest), props.value);
101
102
  });
102
103
  Button.defaultProps = {
103
- value: "Click me"
104
+ value: "Shop now"
104
105
  };
105
106
  var schema2 = {
106
107
  title: "Button",
107
108
  type: "button",
109
+ parentType: "container",
108
110
  styles: [
109
111
  {
110
112
  type: "dimensions"
@@ -140,13 +142,19 @@ var schema2 = {
140
142
  data: {
141
143
  css: {
142
144
  "@desktop": {
143
- borderRadius: "9999px",
145
+ borderRadius: "72px",
146
+ border: "none",
147
+ backgroundColor: "#0F71FF",
148
+ color: "#fff",
144
149
  fontSize: "13px",
145
- padding: "10px 15px"
150
+ padding: "10px 20px"
146
151
  }
147
152
  },
148
153
  target: "",
149
154
  openInNewTab: false
155
+ },
156
+ flags: {
157
+ draggable: true
150
158
  }
151
159
  };
152
160
  var button_default = Button;
@@ -161,6 +169,7 @@ var Container = (0, import_react2.forwardRef)((props, ref) => {
161
169
  var schema3 = {
162
170
  title: "Container",
163
171
  type: "container",
172
+ parentType: "layout",
164
173
  data: {
165
174
  css: {
166
175
  "@desktop": {
@@ -171,13 +180,17 @@ var schema3 = {
171
180
  justifyContent: "flex-start",
172
181
  textAlign: "left",
173
182
  gridArea: "1 / 1 / 3 / 6",
174
- overflow: "hidden",
175
183
  width: "100%",
176
184
  height: "fit-content"
177
185
  }
178
186
  }
179
187
  },
180
- settings: []
188
+ settings: [],
189
+ flags: {
190
+ draggable: true,
191
+ resizable: true,
192
+ sortable: true
193
+ }
181
194
  };
182
195
  var container_default = Container;
183
196
 
@@ -202,6 +215,7 @@ var Layout = (0, import_react3.forwardRef)((props, ref) => {
202
215
  var schema4 = {
203
216
  title: "Layout",
204
217
  type: "layout",
218
+ parentType: "root",
205
219
  data: {
206
220
  css: {
207
221
  "@desktop": {
@@ -219,7 +233,7 @@ var schema4 = {
219
233
  }
220
234
  },
221
235
  "@mobile": {
222
- padding: "0",
236
+ padding: "0 16px",
223
237
  "> [data-layout-content]": {
224
238
  display: "flex !important",
225
239
  flexDirection: "column"
@@ -251,6 +265,7 @@ Text.defaultProps = {
251
265
  };
252
266
  var schema5 = {
253
267
  type: "text",
268
+ parentType: "container",
254
269
  title: "Text",
255
270
  settings: [],
256
271
  data: {
@@ -263,7 +278,7 @@ var schema5 = {
263
278
  outline: "none",
264
279
  wordBreak: "break-word",
265
280
  overflowWrap: "break-word",
266
- whitespace: "break-spaces"
281
+ whiteSpace: "break-spaces"
267
282
  }
268
283
  }
269
284
  }
@@ -282,12 +297,13 @@ var Image = import_react4.default.forwardRef(function Image2(props, ref) {
282
297
  }));
283
298
  });
284
299
  Image.defaultProps = {
285
- src: "https://ucarecdn.com/48d73272-3fe3-43f6-8b5b-22b68fc5a8c8/section.png",
300
+ src: "https://ucarecdn.com/1cdc9d39-ca62-492e-8ec7-f1a86b241a90/",
286
301
  alt: "weaverse image element"
287
302
  };
288
303
  var schema6 = {
289
304
  settings: [],
290
305
  type: "image",
306
+ parentType: "layout",
291
307
  title: "Image",
292
308
  data: {
293
309
  css: {
@@ -295,12 +311,261 @@ var schema6 = {
295
311
  width: "100%",
296
312
  height: "100%",
297
313
  objectFit: "cover"
314
+ },
315
+ "@mobile": {
316
+ display: "block"
298
317
  }
299
318
  }
319
+ },
320
+ flags: {
321
+ resizable: true,
322
+ draggable: true,
323
+ sortable: true
300
324
  }
301
325
  };
302
326
  var image_default = Image;
303
327
 
328
+ // src/elements/video.tsx
329
+ 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
+ }));
350
+ });
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"
375
+ },
376
+ {
377
+ type: "color"
378
+ }
379
+ ],
380
+ flags: {
381
+ resizable: true,
382
+ draggable: true,
383
+ sortable: true
384
+ }
385
+ };
386
+ var video_default = Video;
387
+
388
+ // src/elements/map.tsx
389
+ var import_react6 = __toESM(require("react"));
390
+ var Map = (0, import_react6.forwardRef)((props, ref) => {
391
+ const { place, zoom } = props;
392
+ console.info("9779 props", props);
393
+ return /* @__PURE__ */ import_react6.default.createElement("div", __spreadValues({
394
+ ref
395
+ }, props), /* @__PURE__ */ import_react6.default.createElement("iframe", {
396
+ loading: "lazy",
397
+ scrolling: "no",
398
+ width: "100%",
399
+ height: "100%",
400
+ title: "map",
401
+ src: `https://maps.google.com/maps?z=${zoom}&t=m&q=${place}&ie=UTF8&&output=embed`,
402
+ style: {
403
+ pointerEvents: "none"
404
+ }
405
+ }));
406
+ });
407
+ Map.defaultProps = {
408
+ place: "Hanoi",
409
+ zoom: 14
410
+ };
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
+ }
434
+ }
435
+ },
436
+ flags: {
437
+ resizable: true,
438
+ draggable: true,
439
+ sortable: true
440
+ }
441
+ };
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
+ }
458
+
459
+ // src/elements/countdown/timer-block.tsx
460
+ 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));
465
+ };
466
+ var timer_block_default = TimerBlock;
467
+
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 { type, startTime, endTime, periods, redirectUrl, openInNewTab, showColon, showLabel } = props;
472
+ const [remaining, setRemaining] = import_react8.default.useState(0);
473
+ if (typeof endTime !== "number") {
474
+ endTime = Number.parseInt(endTime);
475
+ }
476
+ (0, import_react8.useEffect)(() => {
477
+ const flag = setInterval(() => {
478
+ const remainingTime = Math.max((type === "specific" ? new Date(endTime).getTime() : new Date(startTime) + periods * 60 * 1e3) - Date.now(), 0);
479
+ if (!isDesignMode && redirectUrl && remainingTime > 0 && remainingTime < 1e3) {
480
+ window.open(redirectUrl, openInNewTab ? "_blank" : "_self");
481
+ }
482
+ setRemaining(remainingTime);
483
+ }, 1e3);
484
+ return () => {
485
+ clearInterval(flag);
486
+ };
487
+ }, [startTime, endTime, periods, type]);
488
+ const timer = getTime(remaining);
489
+ return /* @__PURE__ */ import_react8.default.createElement("div", __spreadValues({
490
+ ref
491
+ }, props), /* @__PURE__ */ import_react8.default.createElement(timer_block_default, {
492
+ value: timer.days,
493
+ label: showLabel && "days"
494
+ }), /* @__PURE__ */ import_react8.default.createElement("span", {
495
+ className: !showColon && "hidden"
496
+ }, ":"), /* @__PURE__ */ import_react8.default.createElement(timer_block_default, {
497
+ value: timer.hours,
498
+ label: showLabel && "hours"
499
+ }), /* @__PURE__ */ import_react8.default.createElement("span", {
500
+ className: !showColon && "hidden"
501
+ }, ":"), /* @__PURE__ */ import_react8.default.createElement(timer_block_default, {
502
+ value: timer.mins,
503
+ label: showLabel && "minutes"
504
+ }), /* @__PURE__ */ import_react8.default.createElement("span", {
505
+ className: !showColon && "hidden"
506
+ }, ":"), /* @__PURE__ */ import_react8.default.createElement(timer_block_default, {
507
+ value: timer.secs,
508
+ label: showLabel && "seconds"
509
+ }));
510
+ });
511
+ Countdown.defaultProps = {
512
+ type: "specific",
513
+ startTime: Date.now(),
514
+ endTime: 1661140528e3,
515
+ redirectUrl: "",
516
+ openInNewTab: false,
517
+ showLabel: true,
518
+ showColon: true
519
+ };
520
+ var schema9 = {
521
+ title: "Countdown",
522
+ type: "countdown",
523
+ parentType: "container",
524
+ toolbar: [
525
+ {
526
+ type: "delete"
527
+ },
528
+ {
529
+ type: "duplicate"
530
+ },
531
+ {
532
+ type: "link"
533
+ },
534
+ {
535
+ type: "color"
536
+ }
537
+ ],
538
+ data: {
539
+ css: {
540
+ "@desktop": {
541
+ fontFamily: "Inter",
542
+ fontSize: 36,
543
+ fontWeight: 500,
544
+ display: "grid",
545
+ gridAutoFlow: "column",
546
+ gap: 10,
547
+ "& > div": {
548
+ width: 48,
549
+ textAlign: "center"
550
+ },
551
+ "& .wv-countdown-label": {
552
+ fontSize: 10
553
+ },
554
+ "& > span": {
555
+ lineHeight: "100%"
556
+ },
557
+ "& .hidden": {
558
+ visibility: "hidden"
559
+ }
560
+ }
561
+ }
562
+ },
563
+ flags: {
564
+ draggable: true
565
+ }
566
+ };
567
+ var countdown_default = Countdown;
568
+
304
569
  // src/elements/index.ts
305
570
  var elements = {
306
571
  Button: {
@@ -326,6 +591,18 @@ var elements = {
326
591
  Image: {
327
592
  Component: image_default,
328
593
  schema: schema6
594
+ },
595
+ Video: {
596
+ Component: video_default,
597
+ schema: schema7
598
+ },
599
+ Map: {
600
+ Component: map_default,
601
+ schema: schema8
602
+ },
603
+ Countdown: {
604
+ Component: countdown_default,
605
+ schema: schema9
329
606
  }
330
607
  };
331
608
  var elements_default = elements;
@@ -338,13 +615,13 @@ var createRootContext = (configs) => {
338
615
  });
339
616
  return rootContext;
340
617
  };
341
- var WeaverseContext = (0, import_react5.createContext)({});
618
+ var WeaverseContext = (0, import_react9.createContext)({});
342
619
  var WeaverseContextProvider = WeaverseContext.Provider;
343
620
  var WeaverseContextConsumer = WeaverseContext.Consumer;
344
621
 
345
622
  // src/renderer.tsx
346
623
  var import_core2 = require("@weaverse/core");
347
- var import_react6 = __toESM(require("react"));
624
+ var import_react10 = __toESM(require("react"));
348
625
 
349
626
  // src/utils/index.ts
350
627
  var shortCssObject = (css) => {
@@ -371,9 +648,9 @@ function generateItemClass(instance, stitchesInstance) {
371
648
  // src/renderer.tsx
372
649
  var WeaverseRoot = ({ context }) => {
373
650
  var _a;
374
- let [, setData] = (0, import_react6.useState)(context.projectData);
375
- let rootRef = (0, import_react6.useRef)();
376
- (0, import_react6.useEffect)(() => {
651
+ let [, setData] = (0, import_react10.useState)(context.projectData);
652
+ let rootRef = (0, import_react10.useRef)();
653
+ (0, import_react10.useEffect)(() => {
377
654
  let update = () => setData({});
378
655
  context.subscribe(update);
379
656
  if (context.projectData) {
@@ -386,21 +663,21 @@ var WeaverseRoot = ({ context }) => {
386
663
  }, []);
387
664
  let eventHandlers = ((_a = context == null ? void 0 : context.studioBridge) == null ? void 0 : _a.eventHandlers) || {};
388
665
  let themeClass = context.stitchesInstance.theme.className;
389
- return /* @__PURE__ */ import_react6.default.createElement("div", __spreadProps(__spreadValues({
666
+ return /* @__PURE__ */ import_react10.default.createElement("div", __spreadProps(__spreadValues({
390
667
  className: `weaverse-content-root ${themeClass}`
391
668
  }, eventHandlers), {
392
669
  ref: rootRef
393
- }), /* @__PURE__ */ import_react6.default.createElement(WeaverseContextProvider, {
670
+ }), /* @__PURE__ */ import_react10.default.createElement(WeaverseContextProvider, {
394
671
  value: context
395
- }, /* @__PURE__ */ import_react6.default.createElement(ItemInstance, {
672
+ }, /* @__PURE__ */ import_react10.default.createElement(ItemInstance, {
396
673
  id: context.projectData.rootId || 0
397
674
  })));
398
675
  };
399
676
  var ItemComponent = ({ instance }) => {
400
- let { stitchesInstance, elementInstances } = (0, import_react6.useContext)(WeaverseContext);
401
- let [data, setData] = (0, import_react6.useState)(instance.data);
677
+ let { stitchesInstance, elementInstances } = (0, import_react10.useContext)(WeaverseContext);
678
+ let [data, setData] = (0, import_react10.useState)(instance.data);
402
679
  let _a = data, { id, type, childIds = [], css, className: cls = "" } = _a, rest = __objRest(_a, ["id", "type", "childIds", "css", "className"]);
403
- (0, import_react6.useEffect)(() => {
680
+ (0, import_react10.useEffect)(() => {
404
681
  let update = (data2) => setData(__spreadValues({}, data2));
405
682
  instance.subscribe(update);
406
683
  if (import_core2.isBrowser && !instance.ref.current) {
@@ -418,12 +695,12 @@ var ItemComponent = ({ instance }) => {
418
695
  if (Component.$$typeof === Symbol.for("react.forward_ref")) {
419
696
  rest.ref = instance.ref;
420
697
  }
421
- return /* @__PURE__ */ import_react6.default.createElement(Component, __spreadValues({
698
+ return /* @__PURE__ */ import_react10.default.createElement(Component, __spreadValues({
422
699
  key: id,
423
700
  "data-wv-type": type,
424
701
  "data-wv-id": id,
425
702
  className: generateItemClass(instance, stitchesInstance)
426
- }, rest), childIds.map((id2) => /* @__PURE__ */ import_react6.default.createElement(ItemInstance, {
703
+ }, rest), childIds.map((id2) => /* @__PURE__ */ import_react10.default.createElement(ItemInstance, {
427
704
  key: id2,
428
705
  id: id2
429
706
  })));
@@ -431,15 +708,15 @@ var ItemComponent = ({ instance }) => {
431
708
  return null;
432
709
  };
433
710
  var ItemInstance = ({ id }) => {
434
- let context = (0, import_react6.useContext)(WeaverseContext);
711
+ let context = (0, import_react10.useContext)(WeaverseContext);
435
712
  let { itemInstances } = context;
436
713
  let instance = itemInstances.get(id);
437
714
  if (!instance) {
438
- return /* @__PURE__ */ import_react6.default.createElement("div", {
715
+ return /* @__PURE__ */ import_react10.default.createElement("div", {
439
716
  style: { display: "none" }
440
717
  }, "Item instance ", id, " not found");
441
718
  }
442
- return /* @__PURE__ */ import_react6.default.createElement(ItemComponent, {
719
+ return /* @__PURE__ */ import_react10.default.createElement(ItemComponent, {
443
720
  instance
444
721
  });
445
722
  };
package/dist/index.mjs CHANGED
@@ -48,6 +48,7 @@ BaseElement.defaultProps = {
48
48
  };
49
49
  var schema = {
50
50
  type: "base",
51
+ parentType: "container",
51
52
  title: "Base",
52
53
  settings: []
53
54
  };
@@ -70,11 +71,12 @@ var Button = React2.forwardRef((props, ref) => {
70
71
  }, rest), props.value);
71
72
  });
72
73
  Button.defaultProps = {
73
- value: "Click me"
74
+ value: "Shop now"
74
75
  };
75
76
  var schema2 = {
76
77
  title: "Button",
77
78
  type: "button",
79
+ parentType: "container",
78
80
  styles: [
79
81
  {
80
82
  type: "dimensions"
@@ -110,13 +112,19 @@ var schema2 = {
110
112
  data: {
111
113
  css: {
112
114
  "@desktop": {
113
- borderRadius: "9999px",
115
+ borderRadius: "72px",
116
+ border: "none",
117
+ backgroundColor: "#0F71FF",
118
+ color: "#fff",
114
119
  fontSize: "13px",
115
- padding: "10px 15px"
120
+ padding: "10px 20px"
116
121
  }
117
122
  },
118
123
  target: "",
119
124
  openInNewTab: false
125
+ },
126
+ flags: {
127
+ draggable: true
120
128
  }
121
129
  };
122
130
  var button_default = Button;
@@ -131,6 +139,7 @@ var Container = forwardRef2((props, ref) => {
131
139
  var schema3 = {
132
140
  title: "Container",
133
141
  type: "container",
142
+ parentType: "layout",
134
143
  data: {
135
144
  css: {
136
145
  "@desktop": {
@@ -141,13 +150,17 @@ var schema3 = {
141
150
  justifyContent: "flex-start",
142
151
  textAlign: "left",
143
152
  gridArea: "1 / 1 / 3 / 6",
144
- overflow: "hidden",
145
153
  width: "100%",
146
154
  height: "fit-content"
147
155
  }
148
156
  }
149
157
  },
150
- settings: []
158
+ settings: [],
159
+ flags: {
160
+ draggable: true,
161
+ resizable: true,
162
+ sortable: true
163
+ }
151
164
  };
152
165
  var container_default = Container;
153
166
 
@@ -172,6 +185,7 @@ var Layout = forwardRef3((props, ref) => {
172
185
  var schema4 = {
173
186
  title: "Layout",
174
187
  type: "layout",
188
+ parentType: "root",
175
189
  data: {
176
190
  css: {
177
191
  "@desktop": {
@@ -189,7 +203,7 @@ var schema4 = {
189
203
  }
190
204
  },
191
205
  "@mobile": {
192
- padding: "0",
206
+ padding: "0 16px",
193
207
  "> [data-layout-content]": {
194
208
  display: "flex !important",
195
209
  flexDirection: "column"
@@ -221,6 +235,7 @@ Text.defaultProps = {
221
235
  };
222
236
  var schema5 = {
223
237
  type: "text",
238
+ parentType: "container",
224
239
  title: "Text",
225
240
  settings: [],
226
241
  data: {
@@ -233,7 +248,7 @@ var schema5 = {
233
248
  outline: "none",
234
249
  wordBreak: "break-word",
235
250
  overflowWrap: "break-word",
236
- whitespace: "break-spaces"
251
+ whiteSpace: "break-spaces"
237
252
  }
238
253
  }
239
254
  }
@@ -252,12 +267,13 @@ var Image = React6.forwardRef(function Image2(props, ref) {
252
267
  }));
253
268
  });
254
269
  Image.defaultProps = {
255
- src: "https://ucarecdn.com/48d73272-3fe3-43f6-8b5b-22b68fc5a8c8/section.png",
270
+ src: "https://ucarecdn.com/1cdc9d39-ca62-492e-8ec7-f1a86b241a90/",
256
271
  alt: "weaverse image element"
257
272
  };
258
273
  var schema6 = {
259
274
  settings: [],
260
275
  type: "image",
276
+ parentType: "layout",
261
277
  title: "Image",
262
278
  data: {
263
279
  css: {
@@ -265,12 +281,261 @@ var schema6 = {
265
281
  width: "100%",
266
282
  height: "100%",
267
283
  objectFit: "cover"
284
+ },
285
+ "@mobile": {
286
+ display: "block"
268
287
  }
269
288
  }
289
+ },
290
+ flags: {
291
+ resizable: true,
292
+ draggable: true,
293
+ sortable: true
270
294
  }
271
295
  };
272
296
  var image_default = Image;
273
297
 
298
+ // src/elements/video.tsx
299
+ import React7, { forwardRef as forwardRef5, useContext } from "react";
300
+ var Video = forwardRef5((props, ref) => {
301
+ const { isDesignMode } = useContext(WeaverseContext);
302
+ let _a = props, { src, type, controls, autoPlay, loop, muted } = _a, rest = __objRest(_a, ["src", "type", "controls", "autoPlay", "loop", "muted"]);
303
+ if (isDesignMode) {
304
+ controls = false;
305
+ autoPlay = false;
306
+ }
307
+ console.info("9779 props", props, isDesignMode);
308
+ return /* @__PURE__ */ React7.createElement("video", __spreadValues({
309
+ ref,
310
+ controls,
311
+ autoPlay,
312
+ loop,
313
+ muted: true
314
+ }, rest), /* @__PURE__ */ React7.createElement("source", {
315
+ src,
316
+ type: type || "video/mp4",
317
+ controlsList: "nodownload",
318
+ disablePictureInPicture: true
319
+ }));
320
+ });
321
+ Video.defaultProps = {
322
+ src: "https://ucarecdn.com/7cae0dab-8966-4484-9998-602728c360ca/IMG_0048.MOV",
323
+ poster: "https://ucarecdn.com/48d73272-3fe3-43f6-8b5b-22b68fc5a8c8/section.png",
324
+ loop: false,
325
+ type: "video/mp4",
326
+ controls: false,
327
+ autoPlay: true,
328
+ muted: true,
329
+ width: "100%",
330
+ height: "auto"
331
+ };
332
+ var schema7 = {
333
+ title: "Video",
334
+ type: "video",
335
+ parentType: "layout",
336
+ toolbar: [
337
+ {
338
+ type: "delete"
339
+ },
340
+ {
341
+ type: "duplicate"
342
+ },
343
+ {
344
+ type: "link"
345
+ },
346
+ {
347
+ type: "color"
348
+ }
349
+ ],
350
+ flags: {
351
+ resizable: true,
352
+ draggable: true,
353
+ sortable: true
354
+ }
355
+ };
356
+ var video_default = Video;
357
+
358
+ // src/elements/map.tsx
359
+ import React8, { forwardRef as forwardRef6 } from "react";
360
+ var Map = forwardRef6((props, ref) => {
361
+ const { place, zoom } = props;
362
+ console.info("9779 props", props);
363
+ return /* @__PURE__ */ React8.createElement("div", __spreadValues({
364
+ ref
365
+ }, props), /* @__PURE__ */ React8.createElement("iframe", {
366
+ loading: "lazy",
367
+ scrolling: "no",
368
+ width: "100%",
369
+ height: "100%",
370
+ title: "map",
371
+ src: `https://maps.google.com/maps?z=${zoom}&t=m&q=${place}&ie=UTF8&&output=embed`,
372
+ style: {
373
+ pointerEvents: "none"
374
+ }
375
+ }));
376
+ });
377
+ Map.defaultProps = {
378
+ place: "Hanoi",
379
+ zoom: 14
380
+ };
381
+ var schema8 = {
382
+ title: "Map",
383
+ type: "map",
384
+ parentType: "layout",
385
+ toolbar: [
386
+ {
387
+ type: "delete"
388
+ },
389
+ {
390
+ type: "duplicate"
391
+ },
392
+ {
393
+ type: "link"
394
+ },
395
+ {
396
+ type: "color"
397
+ }
398
+ ],
399
+ data: {
400
+ css: {
401
+ "@desktop": {
402
+ gridArea: "1 / 1 / 11 / 13"
403
+ }
404
+ }
405
+ },
406
+ flags: {
407
+ resizable: true,
408
+ draggable: true,
409
+ sortable: true
410
+ }
411
+ };
412
+ var map_default = Map;
413
+
414
+ // src/elements/countdown/index.tsx
415
+ import React10, { forwardRef as forwardRef7, useContext as useContext2, useEffect } from "react";
416
+
417
+ // src/elements/countdown/utils.ts
418
+ function getTime(seconds) {
419
+ const ONE_MINUTE = 60 * 1e3;
420
+ const ONE_HOUR = 60 * ONE_MINUTE;
421
+ const ONE_DAY = 24 * ONE_HOUR;
422
+ const days = Math.floor(seconds / ONE_DAY);
423
+ const hours = Math.floor((seconds - days * ONE_DAY) / ONE_HOUR);
424
+ const mins = Math.floor((seconds - days * ONE_DAY - hours * ONE_HOUR) / ONE_MINUTE);
425
+ const secs = Math.floor((seconds - days * ONE_DAY - hours * ONE_HOUR - mins * ONE_MINUTE) / 1e3);
426
+ return { days, hours, mins, secs };
427
+ }
428
+
429
+ // src/elements/countdown/timer-block.tsx
430
+ import React9 from "react";
431
+ var TimerBlock = (props) => {
432
+ return /* @__PURE__ */ React9.createElement("div", null, /* @__PURE__ */ React9.createElement("div", null, props.value.toString().padStart(2, "0")), props.label && /* @__PURE__ */ React9.createElement("div", {
433
+ className: "wv-countdown-label"
434
+ }, props.label));
435
+ };
436
+ var timer_block_default = TimerBlock;
437
+
438
+ // src/elements/countdown/index.tsx
439
+ var Countdown = forwardRef7((props, ref) => {
440
+ const { isDesignMode } = useContext2(WeaverseContext);
441
+ let { type, startTime, endTime, periods, redirectUrl, openInNewTab, showColon, showLabel } = props;
442
+ const [remaining, setRemaining] = React10.useState(0);
443
+ if (typeof endTime !== "number") {
444
+ endTime = Number.parseInt(endTime);
445
+ }
446
+ useEffect(() => {
447
+ const flag = setInterval(() => {
448
+ const remainingTime = Math.max((type === "specific" ? new Date(endTime).getTime() : new Date(startTime) + periods * 60 * 1e3) - Date.now(), 0);
449
+ if (!isDesignMode && redirectUrl && remainingTime > 0 && remainingTime < 1e3) {
450
+ window.open(redirectUrl, openInNewTab ? "_blank" : "_self");
451
+ }
452
+ setRemaining(remainingTime);
453
+ }, 1e3);
454
+ return () => {
455
+ clearInterval(flag);
456
+ };
457
+ }, [startTime, endTime, periods, type]);
458
+ const timer = getTime(remaining);
459
+ return /* @__PURE__ */ React10.createElement("div", __spreadValues({
460
+ ref
461
+ }, props), /* @__PURE__ */ React10.createElement(timer_block_default, {
462
+ value: timer.days,
463
+ label: showLabel && "days"
464
+ }), /* @__PURE__ */ React10.createElement("span", {
465
+ className: !showColon && "hidden"
466
+ }, ":"), /* @__PURE__ */ React10.createElement(timer_block_default, {
467
+ value: timer.hours,
468
+ label: showLabel && "hours"
469
+ }), /* @__PURE__ */ React10.createElement("span", {
470
+ className: !showColon && "hidden"
471
+ }, ":"), /* @__PURE__ */ React10.createElement(timer_block_default, {
472
+ value: timer.mins,
473
+ label: showLabel && "minutes"
474
+ }), /* @__PURE__ */ React10.createElement("span", {
475
+ className: !showColon && "hidden"
476
+ }, ":"), /* @__PURE__ */ React10.createElement(timer_block_default, {
477
+ value: timer.secs,
478
+ label: showLabel && "seconds"
479
+ }));
480
+ });
481
+ Countdown.defaultProps = {
482
+ type: "specific",
483
+ startTime: Date.now(),
484
+ endTime: 1661140528e3,
485
+ redirectUrl: "",
486
+ openInNewTab: false,
487
+ showLabel: true,
488
+ showColon: true
489
+ };
490
+ var schema9 = {
491
+ title: "Countdown",
492
+ type: "countdown",
493
+ parentType: "container",
494
+ toolbar: [
495
+ {
496
+ type: "delete"
497
+ },
498
+ {
499
+ type: "duplicate"
500
+ },
501
+ {
502
+ type: "link"
503
+ },
504
+ {
505
+ type: "color"
506
+ }
507
+ ],
508
+ data: {
509
+ css: {
510
+ "@desktop": {
511
+ fontFamily: "Inter",
512
+ fontSize: 36,
513
+ fontWeight: 500,
514
+ display: "grid",
515
+ gridAutoFlow: "column",
516
+ gap: 10,
517
+ "& > div": {
518
+ width: 48,
519
+ textAlign: "center"
520
+ },
521
+ "& .wv-countdown-label": {
522
+ fontSize: 10
523
+ },
524
+ "& > span": {
525
+ lineHeight: "100%"
526
+ },
527
+ "& .hidden": {
528
+ visibility: "hidden"
529
+ }
530
+ }
531
+ }
532
+ },
533
+ flags: {
534
+ draggable: true
535
+ }
536
+ };
537
+ var countdown_default = Countdown;
538
+
274
539
  // src/elements/index.ts
275
540
  var elements = {
276
541
  Button: {
@@ -296,6 +561,18 @@ var elements = {
296
561
  Image: {
297
562
  Component: image_default,
298
563
  schema: schema6
564
+ },
565
+ Video: {
566
+ Component: video_default,
567
+ schema: schema7
568
+ },
569
+ Map: {
570
+ Component: map_default,
571
+ schema: schema8
572
+ },
573
+ Countdown: {
574
+ Component: countdown_default,
575
+ schema: schema9
299
576
  }
300
577
  };
301
578
  var elements_default = elements;
@@ -314,7 +591,7 @@ var WeaverseContextConsumer = WeaverseContext.Consumer;
314
591
 
315
592
  // src/renderer.tsx
316
593
  import { isBrowser } from "@weaverse/core";
317
- import React7, { useContext, useEffect, useRef, useState } from "react";
594
+ import React11, { useContext as useContext3, useEffect as useEffect2, useRef, useState } from "react";
318
595
 
319
596
  // src/utils/index.ts
320
597
  var shortCssObject = (css) => {
@@ -343,7 +620,7 @@ var WeaverseRoot = ({ context }) => {
343
620
  var _a;
344
621
  let [, setData] = useState(context.projectData);
345
622
  let rootRef = useRef();
346
- useEffect(() => {
623
+ useEffect2(() => {
347
624
  let update = () => setData({});
348
625
  context.subscribe(update);
349
626
  if (context.projectData) {
@@ -356,21 +633,21 @@ var WeaverseRoot = ({ context }) => {
356
633
  }, []);
357
634
  let eventHandlers = ((_a = context == null ? void 0 : context.studioBridge) == null ? void 0 : _a.eventHandlers) || {};
358
635
  let themeClass = context.stitchesInstance.theme.className;
359
- return /* @__PURE__ */ React7.createElement("div", __spreadProps(__spreadValues({
636
+ return /* @__PURE__ */ React11.createElement("div", __spreadProps(__spreadValues({
360
637
  className: `weaverse-content-root ${themeClass}`
361
638
  }, eventHandlers), {
362
639
  ref: rootRef
363
- }), /* @__PURE__ */ React7.createElement(WeaverseContextProvider, {
640
+ }), /* @__PURE__ */ React11.createElement(WeaverseContextProvider, {
364
641
  value: context
365
- }, /* @__PURE__ */ React7.createElement(ItemInstance, {
642
+ }, /* @__PURE__ */ React11.createElement(ItemInstance, {
366
643
  id: context.projectData.rootId || 0
367
644
  })));
368
645
  };
369
646
  var ItemComponent = ({ instance }) => {
370
- let { stitchesInstance, elementInstances } = useContext(WeaverseContext);
647
+ let { stitchesInstance, elementInstances } = useContext3(WeaverseContext);
371
648
  let [data, setData] = useState(instance.data);
372
649
  let _a = data, { id, type, childIds = [], css, className: cls = "" } = _a, rest = __objRest(_a, ["id", "type", "childIds", "css", "className"]);
373
- useEffect(() => {
650
+ useEffect2(() => {
374
651
  let update = (data2) => setData(__spreadValues({}, data2));
375
652
  instance.subscribe(update);
376
653
  if (isBrowser && !instance.ref.current) {
@@ -388,12 +665,12 @@ var ItemComponent = ({ instance }) => {
388
665
  if (Component.$$typeof === Symbol.for("react.forward_ref")) {
389
666
  rest.ref = instance.ref;
390
667
  }
391
- return /* @__PURE__ */ React7.createElement(Component, __spreadValues({
668
+ return /* @__PURE__ */ React11.createElement(Component, __spreadValues({
392
669
  key: id,
393
670
  "data-wv-type": type,
394
671
  "data-wv-id": id,
395
672
  className: generateItemClass(instance, stitchesInstance)
396
- }, rest), childIds.map((id2) => /* @__PURE__ */ React7.createElement(ItemInstance, {
673
+ }, rest), childIds.map((id2) => /* @__PURE__ */ React11.createElement(ItemInstance, {
397
674
  key: id2,
398
675
  id: id2
399
676
  })));
@@ -401,15 +678,15 @@ var ItemComponent = ({ instance }) => {
401
678
  return null;
402
679
  };
403
680
  var ItemInstance = ({ id }) => {
404
- let context = useContext(WeaverseContext);
681
+ let context = useContext3(WeaverseContext);
405
682
  let { itemInstances } = context;
406
683
  let instance = itemInstances.get(id);
407
684
  if (!instance) {
408
- return /* @__PURE__ */ React7.createElement("div", {
685
+ return /* @__PURE__ */ React11.createElement("div", {
409
686
  style: { display: "none" }
410
687
  }, "Item instance ", id, " not found");
411
688
  }
412
- return /* @__PURE__ */ React7.createElement(ItemComponent, {
689
+ return /* @__PURE__ */ React11.createElement(ItemComponent, {
413
690
  instance
414
691
  });
415
692
  };
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.6.9",
2
+ "version": "0.6.14",
3
3
  "license": "MIT",
4
4
  "main": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",
@@ -31,6 +31,6 @@
31
31
  "name": "@weaverse/react",
32
32
  "author": "Weaverse Team",
33
33
  "dependencies": {
34
- "@weaverse/core": "0.6.9"
34
+ "@weaverse/core": "0.6.14"
35
35
  }
36
36
  }